Welcome! This guide offers several examples to help you effectively utilize this package.
Files needed:
- :download:`Ni-xray.gr <examples/Ni-xray.gr>` - experimental X-ray PDF data
- :download:`Ni.stru <examples/Ni.stru>` - Ni f.c.c. structure in PDFfit format
The first example shows how to calculates the PDF for FCC nickel and saves the resulting data to a file and plot it using matplotlib.
Imports the PdfFit class from the diffpy.pdffit2 module:
from diffpy.pdffit2 import PdfFit
Create a PDF calculator object and assigned to the variable
P
. Make sure theNi.stru
file is in the same directory as the script and you've cd to the directory, load structure file. Then allocate and configure PDF calculation and run the calculation:# create new PDF calculator object P = PdfFit() # load structure file in PDFFIT or DISCUS format P.read_struct("Ni.stru") radiation_type = "X" # x-rays qmax = 30.0 # Q-cutoff used in PDF calculation in 1/A qdamp = 0.01 # instrument Q-resolution factor, responsible for PDF decay rmin = 0.01 # minimum r-value rmax = 30.0 # maximum r-value npts = 3000 # number of points in the r-grid # allocate and configure PDF calculation P.alloc(radiation_type, qmax, qdamp, rmin, rmax, npts) P.calc()
Save the refined result:
P.save_pdf(1, "Ni_calculation.cgr")
We can also plot it using matplotlib:
import matplotlib.pyplot as plt # obtain list of r-points and corresponding G values r = P.getR() G = P.getpdf_fit() plt.plot(r, G) plt.xlabel("r (Å)") plt.ylabel("G (Å$^{-2}$)") plt.title("x-ray PDF of nickel simulated at Qmax = %g" % qmax) # display plot window, this must be the last command in the script plt.show()
The scripts can be downloaded :download:`here <examples/Ni_calculation.py>`.
The second example shows how to perform simple refinement of Ni structure to the experimental x-ray PDF. The example uses the same data files as the first example.
Imports the PdfFit class from the diffpy.pdffit2 module:
from diffpy.pdffit2 import PdfFit
Create a PDF calculator object and assigned to the variable
pf
. Load experimental x-ray PDF data and nickel structure file:# Create new PDF calculator object. pf = PdfFit() # Load experimental x-ray PDF data qmax = 30.0 # Q-cutoff used in PDF calculation in 1/A qdamp = 0.01 # instrument Q-resolution factor, responsible for PDF decay pf.read_data("Ni-xray.gr", "X", qmax, qdamp) # Load nickel structure, must be in PDFFIT or DISCUS format pf.read_struct("Ni.stru")
Configure refinement and refine:
# Refine lattice parameters a, b, c. # Make them all equal to parameter @1. pf.constrain(pf.lat(1), "@1") pf.constrain(pf.lat(2), "@1") pf.constrain(pf.lat(3), "@1") # set initial value of parameter @1 pf.setpar(1, pf.lat(1)) # Refine phase scale factor. Right side can have formulas. pf.constrain("pscale", "@20 * 2") pf.setpar(20, pf.getvar(pf.pscale) / 2.0) # Refine PDF damping due to instrument Q-resolution. # Left side can be also passed as a reference to PdfFit object pf.constrain(pf.qdamp, "@21") pf.setpar(21, 0.03) # Refine sharpening factor for correlated motion of close atoms. pf.constrain(pf.delta2, 22) pf.setpar(22, 0.0003) # Set all temperature factors isotropic and equal to @4 for idx in range(1, 5): pf.constrain(pf.u11(idx), "@4") pf.constrain(pf.u22(idx), "@4") pf.constrain(pf.u33(idx), "@4") pf.setpar(4, pf.u11(1)) # Refine all parameters pf.pdfrange(1, 1.5, 19.99) pf.refine()
Save the refined result:
pf.save_pdf(1, "Ni_refinement.fgr") pf.save_struct(1, "Ni_refinement.rstr") pf.save_res("Ni_refinement.res")
We can also plot it using matplotlib:
import matplotlib.pyplot as plt import numpy # obtain data from PdfFit calculator object r = pf.getR() Gobs = pf.getpdf_obs() Gfit = pf.getpdf_fit() # calculate difference curve Gdiff = numpy.array(Gobs) - numpy.array(Gfit) Gdiff_baseline = -10 plt.plot(r, Gobs, "ko") plt.plot(r, Gfit, "b-") plt.plot(r, Gdiff + Gdiff_baseline, "r-") plt.xlabel("r (Å)") plt.ylabel("G (Å$^{-2}$)") plt.title("Fit of nickel to x-ray experimental PDF") # display plot window, this must be the last command in the script plt.show()
The scripts can be downloaded :download:`here <examples/Ni_refinement.py>`.