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 calculate the PDF for FCC nickel and save the resulting data to a file and plot it using matplotlib.
- Import the
PdfFit
class from thediffpy.pdffit2
module
from diffpy.pdffit2 import PdfFit
2. Create a PDF calculator object and assign it to the variable P
.
Make sure the Ni.stru
file is in the same directory as the script (or specify
the relative path to where it resides)
and you are currently in this directory. Then use read_struct
to read the structure
file, alloc
to configure the PDF
calculation, and then use calc
to carry out the 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 calculated PDF.
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 used in this example can be downloaded :download:`here <examples/Ni_calculation.py>`.
The second example shows how to perform a simple refinement of the Ni structure to the experimental x-ray PDF. The example uses the same data files as the first example.
- Import the PdfFit class from the diffpy.pdffit2 module
from diffpy.pdffit2 import PdfFit
2. Create a PDF calculator object and assign it to the variable pf
.
Load the experimental x-ray PDF data using read_data
and also load
the 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")
3. Configure the refinement, assigning structural parameters to variables. For more
information on how to do this correctly, please read the PDFgui documentation.
Set initial values for the variables using setpar
.
Finally, you can configure the range over which to refine (pdfrange
) and
run the refinement (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()
4. Save the refined result. save_struct
saves the new, refined, structure to a
.stru
format file. save_res
saves the outputs in a structured text file.
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 from :download:`here <examples/Ni_refinement.py>`.