Pair Distribution Function: Ni, NPD¶
This example demonstrates a pair distribution function (PDF) analysis of Ni, based on data collected from a constant wavelength neutron powder diffraction experiment.
The dataset is taken from: https://github.com/diffpy/cmi_exchange/tree/main/cmi_scripts/fitNiPDF
Import Library¶
In [2]:
Copied!
import easydiffraction as ed
import easydiffraction as ed
Create Project¶
In [3]:
Copied!
project = ed.Project()
project = ed.Project()
Add Sample Model¶
In [4]:
Copied!
project.sample_models.add(name='ni')
project.sample_models.add(name='ni')
In [5]:
Copied!
project.sample_models['ni'].space_group.name_h_m = 'F m -3 m'
project.sample_models['ni'].space_group.it_coordinate_system_code = '1'
project.sample_models['ni'].cell.length_a = 3.52387
project.sample_models['ni'].atom_sites.add(
label='Ni',
type_symbol='Ni',
fract_x=0.0,
fract_y=0.0,
fract_z=0.0,
wyckoff_letter='a',
b_iso=0.5,
)
project.sample_models['ni'].space_group.name_h_m = 'F m -3 m'
project.sample_models['ni'].space_group.it_coordinate_system_code = '1'
project.sample_models['ni'].cell.length_a = 3.52387
project.sample_models['ni'].atom_sites.add(
label='Ni',
type_symbol='Ni',
fract_x=0.0,
fract_y=0.0,
fract_z=0.0,
wyckoff_letter='a',
b_iso=0.5,
)
Add Experiment¶
In [6]:
Copied!
data_path = ed.download_data(id=6, destination='data')
data_path = ed.download_data(id=6, destination='data')
Getting data...
Data #6: ni-q27r100-neutron_from-2.gr
✅ Data #6 downloaded to 'data/ed-6.gr'
In [7]:
Copied!
project.experiments.add(
name='pdf',
data_path=data_path,
sample_form='powder',
beam_mode='constant wavelength',
radiation_probe='neutron',
scattering_type='total',
)
project.experiments.add(
name='pdf',
data_path=data_path,
sample_form='powder',
beam_mode='constant wavelength',
radiation_probe='neutron',
scattering_type='total',
)
Warning: No uncertainty (sy) column provided. Defaulting to 0.03.
Data loaded successfully
Experiment 🔬 'pdf'. Number of data points: 9801
In [8]:
Copied!
project.experiments['pdf'].linked_phases.add(id='ni', scale=1.0)
project.experiments['pdf'].peak.damp_q = 0
project.experiments['pdf'].peak.broad_q = 0.03
project.experiments['pdf'].peak.cutoff_q = 27.0
project.experiments['pdf'].peak.sharp_delta_1 = 0.0
project.experiments['pdf'].peak.sharp_delta_2 = 2.0
project.experiments['pdf'].peak.damp_particle_diameter = 0
project.experiments['pdf'].linked_phases.add(id='ni', scale=1.0)
project.experiments['pdf'].peak.damp_q = 0
project.experiments['pdf'].peak.broad_q = 0.03
project.experiments['pdf'].peak.cutoff_q = 27.0
project.experiments['pdf'].peak.sharp_delta_1 = 0.0
project.experiments['pdf'].peak.sharp_delta_2 = 2.0
project.experiments['pdf'].peak.damp_particle_diameter = 0
Select Fitting Parameters¶
In [9]:
Copied!
project.sample_models['ni'].cell.length_a.free = True
project.sample_models['ni'].atom_sites['Ni'].b_iso.free = True
project.sample_models['ni'].cell.length_a.free = True
project.sample_models['ni'].atom_sites['Ni'].b_iso.free = True
In [10]:
Copied!
project.experiments['pdf'].linked_phases['ni'].scale.free = True
project.experiments['pdf'].peak.broad_q.free = True
project.experiments['pdf'].peak.sharp_delta_2.free = True
project.experiments['pdf'].linked_phases['ni'].scale.free = True
project.experiments['pdf'].peak.broad_q.free = True
project.experiments['pdf'].peak.sharp_delta_2.free = True
Run Fitting¶
In [11]:
Copied!
project.analysis.current_calculator = 'pdffit'
project.analysis.fit()
project.analysis.current_calculator = 'pdffit'
project.analysis.fit()
Current calculator changed to
pdffit
Using experiment 🔬 'pdf' for 'single' fitting
🚀 Starting fit process with 'lmfit (leastsq)'...
📈 Goodness-of-fit (reduced χ²) change:
| iteration | χ² | improvement [%] | |
|---|---|---|---|
| 1 | 1 | 2324.45 | |
| 2 | 9 | 921.68 | 60.3% ↓ |
| 3 | 15 | 887.03 | 3.8% ↓ |
| 4 | 56 | 886.39 |
🏆 Best goodness-of-fit (reduced χ²) is 886.39 at iteration 55
✅ Fitting complete.
Fit results
✅ Success: True
⏱️ Fitting time: 70.05 seconds
📏 Goodness-of-fit (reduced χ²): 886.39
📏 R-factor (Rf): 20.00%
📏 R-factor squared (Rf²): 19.61%
📏 Weighted R-factor (wR): 19.61%
📈 Fitted parameters:
| datablock | category | entry | parameter | start | fitted | uncertainty | units | change | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | ni | cell | length_a | 3.5239 | 3.5239 | N/A | Å | 0.00 % ↓ | |
| 2 | ni | atom_site | Ni | b_iso | 0.5000 | 0.5000 | N/A | Ų | 0.00 % ↓ |
| 3 | linked_phases | ni | scale | 1.0000 | 1.0088 | N/A | 0.88 % ↑ | ||
| 4 | peak | broad_q | 0.0300 | 0.0204 | N/A | Å⁻² | 31.99 % ↓ | ||
| 5 | peak | sharp_delta_2 | 2.0000 | 3.1153 | N/A | Ų | 55.76 % ↑ |
Plot Measured vs Calculated¶
In [12]:
Copied!
project.plot_meas_vs_calc(expt_name='pdf', show_residual=True)
project.plot_meas_vs_calc(expt_name='pdf', show_residual=True)