Structure Refinement: HS, HRPT¶
This example demonstrates a Rietveld refinement of HS crystal structure using constant wavelength neutron powder diffraction data from HRPT at PSI.
🛠️ Import Library¶
In [2]:
Copied!
from easydiffraction import ExperimentFactory
from easydiffraction import Project
from easydiffraction import StructureFactory
from easydiffraction import download_data
from easydiffraction import ExperimentFactory
from easydiffraction import Project
from easydiffraction import StructureFactory
from easydiffraction import download_data
In [3]:
Copied!
structure = StructureFactory.from_scratch(name='hs')
structure = StructureFactory.from_scratch(name='hs')
Set Space Group¶
In [4]:
Copied!
structure.space_group.name_h_m = 'R -3 m'
structure.space_group.coord_system_code = 'h'
structure.space_group.name_h_m = 'R -3 m'
structure.space_group.coord_system_code = 'h'
Set Unit Cell¶
In [5]:
Copied!
structure.cell.length_a = 6.85
structure.cell.length_c = 14.1
structure.cell.length_a = 6.85
structure.cell.length_c = 14.1
Set Atom Sites¶
In [6]:
Copied!
structure.atom_sites.create(
id='Zn',
type_symbol='Zn',
fract_x=0,
fract_y=0,
fract_z=0.5,
adp_iso=0.5,
)
structure.atom_sites.create(
id='Cu',
type_symbol='Cu',
fract_x=0.5,
fract_y=0,
fract_z=0,
adp_iso=0.5,
)
structure.atom_sites.create(
id='O',
type_symbol='O',
fract_x=0.21,
fract_y=-0.21,
fract_z=0.06,
adp_iso=0.5,
)
structure.atom_sites.create(
id='Cl',
type_symbol='Cl',
fract_x=0,
fract_y=0,
fract_z=0.197,
adp_iso=0.5,
)
structure.atom_sites.create(
id='H',
type_symbol='2H',
fract_x=0.13,
fract_y=-0.13,
fract_z=0.08,
adp_iso=0.5,
)
structure.atom_sites.create(
id='Zn',
type_symbol='Zn',
fract_x=0,
fract_y=0,
fract_z=0.5,
adp_iso=0.5,
)
structure.atom_sites.create(
id='Cu',
type_symbol='Cu',
fract_x=0.5,
fract_y=0,
fract_z=0,
adp_iso=0.5,
)
structure.atom_sites.create(
id='O',
type_symbol='O',
fract_x=0.21,
fract_y=-0.21,
fract_z=0.06,
adp_iso=0.5,
)
structure.atom_sites.create(
id='Cl',
type_symbol='Cl',
fract_x=0,
fract_y=0,
fract_z=0.197,
adp_iso=0.5,
)
structure.atom_sites.create(
id='H',
type_symbol='2H',
fract_x=0.13,
fract_y=-0.13,
fract_z=0.08,
adp_iso=0.5,
)
In [7]:
Copied!
data_path = download_data('meas-hs-hrpt', destination='data')
data_path = download_data('meas-hs-hrpt', destination='data')
Getting data...
Data 'meas-hs-hrpt': HS, HRPT (PSI)
✅ Data 'meas-hs-hrpt' downloaded to '../../../data/meas-hs-hrpt.xye'
Create Experiment¶
In [8]:
Copied!
expt = ExperimentFactory.from_data_path(name='hrpt', data_path=data_path)
expt = ExperimentFactory.from_data_path(name='hrpt', data_path=data_path)
Set Instrument¶
In [9]:
Copied!
expt.instrument.setup_wavelength = 1.89
expt.instrument.calib_twotheta_offset = 0.0
expt.instrument.setup_wavelength = 1.89
expt.instrument.calib_twotheta_offset = 0.0
Set Peak Profile¶
In [10]:
Copied!
expt.peak.show_supported()
expt.peak.show_supported()
Peak types
| Type | Description | ||
|---|---|---|---|
| 1 | * | pseudo-voigt | CWL pseudo-Voigt profile |
| 2 | pseudo-voigt + berar-baldinozzi asymmetry | CWL pseudo-Voigt profile with Berar-Baldinozzi asymmetry correction. |
In [11]:
Copied!
expt.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry'
expt.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry'
⚠️ Switching peak profile type adds these settings with defaults: • asym_beba_a0=0.0 • asym_beba_a1=0.0 • asym_beba_b0=0.0 • asym_beba_b1=0.0
Peak profile type for experiment 'hrpt' changed to
pseudo-voigt + berar-baldinozzi asymmetry
In [12]:
Copied!
expt.peak.broad_gauss_u = 0.1
expt.peak.broad_gauss_v = -0.2
expt.peak.broad_gauss_w = 0.2
expt.peak.broad_lorentz_y = 0
expt.peak.broad_gauss_u = 0.1
expt.peak.broad_gauss_v = -0.2
expt.peak.broad_gauss_w = 0.2
expt.peak.broad_lorentz_y = 0
In [13]:
Copied!
expt.peak.cutoff_fwhm = 8
expt.peak.cutoff_fwhm = 8
Set Background¶
In [14]:
Copied!
expt.background.auto_estimate()
expt.background.auto_estimate()
Set Linked Structures¶
In [15]:
Copied!
expt.linked_structures.create(structure_id='hs', scale=0.5)
expt.linked_structures.create(structure_id='hs', scale=0.5)
In [16]:
Copied!
project = Project(name='hs_hrpt')
project = Project(name='hs_hrpt')
Add Structure¶
In [17]:
Copied!
project.structures.add(structure)
project.structures.add(structure)
Add Experiment¶
In [18]:
Copied!
project.experiments.add(expt)
project.experiments.add(expt)
In [19]:
Copied!
project.display.structure(struct_name='hs')
project.display.structure(struct_name='hs')
Structure 🧩 'hs' (Atom view type: 'covalent')
Loading plot…
drag = rotate
wheel = zoom
right-drag = pan
wheel = zoom
right-drag = pan
Display Pattern¶
In [20]:
Copied!
project.display.pattern(expt_name='hrpt')
project.display.pattern(expt_name='hrpt')
Loading plot…
In [21]:
Copied!
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
Loading plot…
Perform Fit 1/4¶
Set parameters to be refined.
In [22]:
Copied!
structure.cell.length_a.free = True
structure.cell.length_c.free = True
expt.linked_structures['hs'].scale.free = True
expt.instrument.calib_twotheta_offset.free = True
structure.cell.length_a.free = True
structure.cell.length_c.free = True
expt.linked_structures['hs'].scale.free = True
expt.instrument.calib_twotheta_offset.free = True
Show free parameters after selection.
In [23]:
Copied!
project.display.parameters.free()
project.display.parameters.free()
Free parameters for both structures (🧩 data blocks) and experiments (🔬 data blocks)
| datablock | category | entry | parameter | value | uncertainty | min | max | units | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | hs | cell | length_a | 6.85000 | -inf | inf | Å | ||
| 2 | hs | cell | length_c | 14.10000 | -inf | inf | Å | ||
| 3 | hrpt | linked_structure | hs | scale | 0.50000 | -inf | inf | ||
| 4 | hrpt | instrument | twotheta_offset | 0.00000 | -inf | inf | deg |
Run Fitting¶
In [24]:
Copied!
project.analysis.minimizer.chi_square_change_tolerance = 1e-2
project.analysis.minimizer.chi_square_change_tolerance = 1e-2
In [25]:
Copied!
project.analysis.fit()
project.analysis.fit()
Standard fitting
📋 Using experiment 🔬 'hrpt' for 'single' fitting
🚀 Starting fit process with 'lmfit (leastsq)'...
📈 Goodness-of-fit progress:
| iteration | time (s) | χ² | change / status | |
|---|---|---|---|---|
| 1 | 1 | 0.05 | 210.23 | |
| 2 | 8 | 0.40 | 60.12 | 71.4% ↓ |
| 3 | 13 | 0.87 | 55.45 | 7.8% ↓ |
| 4 | 18 | 1.09 | 51.96 | 6.3% ↓ |
| 5 | 23 | 1.32 | 49.78 | 4.2% ↓ |
| 6 | 28 | 1.54 | 48.53 | 2.5% ↓ |
| 7 | 33 | 2.04 | 47.85 | 1.4% ↓ |
| 8 | 39 | 2.32 | 47.49 |
🏆 Best goodness-of-fit (reduced χ²) is 47.49 at iteration 38
✅ Fitting complete.
In [26]:
Copied!
project.display.fit.results()
project.display.fit.results()
⚙️ Settings used:
| Name | Value | Description | |
|---|---|---|---|
| 1 | max_iterations | 1000 | Maximum solver iterations. |
| 2 | chi_square_change_tolerance | 0.01 | Relative change in the objective (chi-square) used to stop fitting. |
| 3 | parameter_change_tolerance | 1e-08 | Relative change in fitted parameters used to stop fitting. |
| 4 | gradient_tolerance | 0.0 | Gradient orthogonality used to stop fitting; zero disables it. |
📋 Least-squares fit results:
| Metric | Value | |
|---|---|---|
| 1 | 🧪 Minimizer | lmfit (leastsq) |
| 2 | ✅ Overall status | success |
| 3 | ⏱️ Fitting time (seconds) | 2.32 |
| 4 | 🔁 Iterations | 36 |
| 5 | 📏 Goodness-of-fit (reduced χ²) | 47.49 |
| 6 | 📏 R-factor (Rf, %) | 17.81 |
| 7 | 📏 R-factor squared (Rf², %) | 30.41 |
| 8 | 📏 Weighted R-factor (wR, %) | 25.01 |
📈 Refined parameters:
| datablock | category | entry | parameter | units | start | value | s.u. | change | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | hs | cell | length_a | Å | 6.8500 | 6.8604 | 0.0003 | 0.15 % ↑ | |
| 2 | hs | cell | length_c | Å | 14.1000 | 14.1312 | 0.0008 | 0.22 % ↑ | |
| 3 | hrpt | linked_structure | hs | scale | 0.5000 | 0.2432 | 0.0029 | 51.36 % ↓ | |
| 4 | hrpt | instrument | twotheta_offset | deg | 0.0000 | 0.1092 | 0.0052 | N/A |
• start = parameter value before refinement
• value = refined value from least-squares minimization
• s.u. = standard uncertainty (one sigma), from the covariance matrix
• change = relative change from start, in %; ↑ = increase, ↓ = decrease
• value = refined value from least-squares minimization
• s.u. = standard uncertainty (one sigma), from the covariance matrix
• change = relative change from start, in %; ↑ = increase, ↓ = decrease
Display Pattern¶
In [27]:
Copied!
project.display.pattern(expt_name='hrpt')
project.display.pattern(expt_name='hrpt')
Loading plot…
In [28]:
Copied!
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
Loading plot…
Perform Fit 2/4¶
Set more parameters to be refined.
In [29]:
Copied!
expt.peak.broad_gauss_u.free = True
expt.peak.broad_gauss_v.free = True
expt.peak.broad_gauss_w.free = True
expt.peak.broad_lorentz_y.free = True
for point in expt.background:
point.intensity.free = True
expt.peak.broad_gauss_u.free = True
expt.peak.broad_gauss_v.free = True
expt.peak.broad_gauss_w.free = True
expt.peak.broad_lorentz_y.free = True
for point in expt.background:
point.intensity.free = True
Show free parameters after selection.
In [30]:
Copied!
project.display.parameters.free()
project.display.parameters.free()
Free parameters for both structures (🧩 data blocks) and experiments (🔬 data blocks)
| datablock | category | entry | parameter | value | uncertainty | min | max | units | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | hs | cell | length_a | 6.86041 | 0.00030 | -inf | inf | Å | |
| 2 | hs | cell | length_c | 14.13115 | 0.00085 | -inf | inf | Å | |
| 3 | hrpt | linked_structure | hs | scale | 0.24321 | 0.00292 | -inf | inf | |
| 4 | hrpt | peak | broad_gauss_u | 0.10000 | -inf | inf | deg² | ||
| 5 | hrpt | peak | broad_gauss_v | -0.20000 | -inf | inf | deg² | ||
| 6 | hrpt | peak | broad_gauss_w | 0.20000 | -inf | inf | deg² | ||
| 7 | hrpt | peak | broad_lorentz_y | 0.00000 | -inf | inf | deg | ||
| 8 | hrpt | instrument | twotheta_offset | 0.10920 | 0.00519 | -inf | inf | deg | |
| 9 | hrpt | background | 1 | intensity | 645.00000 | -inf | inf | ||
| 10 | hrpt | background | 2 | intensity | 460.00000 | -inf | inf | ||
| 11 | hrpt | background | 3 | intensity | 451.00000 | -inf | inf | ||
| 12 | hrpt | background | 4 | intensity | 616.75182 | -inf | inf | ||
| 13 | hrpt | background | 5 | intensity | 451.00000 | -inf | inf | ||
| 14 | hrpt | background | 6 | intensity | 522.48916 | -inf | inf | ||
| 15 | hrpt | background | 7 | intensity | 497.01720 | -inf | inf | ||
| 16 | hrpt | background | 8 | intensity | 613.15327 | -inf | inf | ||
| 17 | hrpt | background | 9 | intensity | 657.13723 | -inf | inf | ||
| 18 | hrpt | background | 10 | intensity | 573.00000 | -inf | inf | ||
| 19 | hrpt | background | 11 | intensity | 514.00000 | -inf | inf | ||
| 20 | hrpt | background | 12 | intensity | 538.17307 | -inf | inf |
Run Fitting¶
In [31]:
Copied!
project.analysis.fit()
project.analysis.fit()
Standard fitting
📋 Using experiment 🔬 'hrpt' for 'single' fitting
🚀 Starting fit process with 'lmfit (leastsq)'...
📈 Goodness-of-fit progress:
| iteration | time (s) | χ² | change / status | |
|---|---|---|---|---|
| 1 | 1 | 0.07 | 47.73 | |
| 2 | 24 | 1.43 | 16.34 | 65.8% ↓ |
| 3 | 45 | 2.72 | 15.68 | 4.0% ↓ |
| 4 | 66 | 4.02 | 13.04 | 16.8% ↓ |
| 5 | 88 | 5.46 | 12.92 |
🏆 Best goodness-of-fit (reduced χ²) is 12.92 at iteration 87
✅ Fitting complete.
In [32]:
Copied!
project.display.fit.results()
project.display.fit.results()
⚙️ Settings used:
| Name | Value | Description | |
|---|---|---|---|
| 1 | max_iterations | 1000 | Maximum solver iterations. |
| 2 | chi_square_change_tolerance | 0.01 | Relative change in the objective (chi-square) used to stop fitting. |
| 3 | parameter_change_tolerance | 1e-08 | Relative change in fitted parameters used to stop fitting. |
| 4 | gradient_tolerance | 0.0 | Gradient orthogonality used to stop fitting; zero disables it. |
📋 Least-squares fit results:
| Metric | Value | |
|---|---|---|
| 1 | 🧪 Minimizer | lmfit (leastsq) |
| 2 | ✅ Overall status | success |
| 3 | ⏱️ Fitting time (seconds) | 5.46 |
| 4 | 🔁 Iterations | 85 |
| 5 | 📏 Goodness-of-fit (reduced χ²) | 12.92 |
| 6 | 📏 R-factor (Rf, %) | 9.89 |
| 7 | 📏 R-factor squared (Rf², %) | 13.84 |
| 8 | 📏 Weighted R-factor (wR, %) | 13.01 |
📈 Refined parameters:
| datablock | category | entry | parameter | units | start | value | s.u. | change | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | hs | cell | length_a | Å | 6.8604 | 6.8626 | 0.0003 | 0.03 % ↑ | |
| 2 | hs | cell | length_c | Å | 14.1312 | 14.1392 | 0.0009 | 0.06 % ↑ | |
| 3 | hrpt | linked_structure | hs | scale | 0.2432 | 0.4173 | 0.0039 | 71.58 % ↑ | |
| 4 | hrpt | peak | broad_gauss_u | deg² | 0.1000 | 0.3637 | 0.0271 | 263.67 % ↑ | |
| 5 | hrpt | peak | broad_gauss_v | deg² | -0.2000 | -0.2912 | 0.0483 | 45.62 % ↑ | |
| 6 | hrpt | peak | broad_gauss_w | deg² | 0.2000 | 0.2240 | 0.0204 | 11.98 % ↑ | |
| 7 | hrpt | peak | broad_lorentz_y | deg | 0.0000 | 0.1621 | 0.0099 | N/A | |
| 8 | hrpt | instrument | twotheta_offset | deg | 0.1092 | 0.1282 | 0.0039 | 17.40 % ↑ | |
| 9 | hrpt | background | 1 | intensity | 645.0000 | 673.1456 | 20.0373 | 4.36 % ↑ | |
| 10 | hrpt | background | 2 | intensity | 460.0000 | 454.8721 | 6.2706 | 1.11 % ↓ | |
| 11 | hrpt | background | 3 | intensity | 451.0000 | 436.5026 | 6.1284 | 3.21 % ↓ | |
| 12 | hrpt | background | 4 | intensity | 616.7518 | 559.5748 | 13.5653 | 9.27 % ↓ | |
| 13 | hrpt | background | 5 | intensity | 451.0000 | 472.3101 | 7.6401 | 4.73 % ↑ | |
| 14 | hrpt | background | 6 | intensity | 522.4892 | 495.7019 | 5.4444 | 5.13 % ↓ | |
| 15 | hrpt | background | 7 | intensity | 497.0172 | 404.0516 | 5.2688 | 18.70 % ↓ | |
| 16 | hrpt | background | 8 | intensity | 613.1533 | 439.4066 | 10.4649 | 28.34 % ↓ | |
| 17 | hrpt | background | 9 | intensity | 657.1372 | 393.7549 | 11.4582 | 40.08 % ↓ | |
| 18 | hrpt | background | 10 | intensity | 573.0000 | 537.5813 | 8.9592 | 6.18 % ↓ | |
| 19 | hrpt | background | 11 | intensity | 514.0000 | 454.6474 | 8.3857 | 11.55 % ↓ | |
| 20 | hrpt | background | 12 | intensity | 538.1731 | 551.7281 | 14.7072 | 2.52 % ↑ |
• start = parameter value before refinement
• value = refined value from least-squares minimization
• s.u. = standard uncertainty (one sigma), from the covariance matrix
• change = relative change from start, in %; ↑ = increase, ↓ = decrease
• value = refined value from least-squares minimization
• s.u. = standard uncertainty (one sigma), from the covariance matrix
• change = relative change from start, in %; ↑ = increase, ↓ = decrease
Display Pattern¶
In [33]:
Copied!
project.display.pattern(expt_name='hrpt')
project.display.pattern(expt_name='hrpt')
Loading plot…
In [34]:
Copied!
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
Loading plot…
Perform Fit 3/4¶
Set more parameters to be refined.
In [35]:
Copied!
structure.atom_sites['O'].fract_x.free = True
structure.atom_sites['O'].fract_z.free = True
structure.atom_sites['Cl'].fract_z.free = True
structure.atom_sites['H'].fract_x.free = True
structure.atom_sites['H'].fract_z.free = True
structure.atom_sites['O'].fract_x.free = True
structure.atom_sites['O'].fract_z.free = True
structure.atom_sites['Cl'].fract_z.free = True
structure.atom_sites['H'].fract_x.free = True
structure.atom_sites['H'].fract_z.free = True
Show free parameters after selection.
In [36]:
Copied!
project.display.parameters.free()
project.display.parameters.free()
Free parameters for both structures (🧩 data blocks) and experiments (🔬 data blocks)
| datablock | category | entry | parameter | value | uncertainty | min | max | units | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | hs | cell | length_a | 6.86265 | 0.00034 | -inf | inf | Å | |
| 2 | hs | cell | length_c | 14.13920 | 0.00092 | -inf | inf | Å | |
| 3 | hs | atom_site | O | fract_x | 0.21000 | -inf | inf | ||
| 4 | hs | atom_site | O | fract_z | 0.06000 | -inf | inf | ||
| 5 | hs | atom_site | Cl | fract_z | 0.19700 | -inf | inf | ||
| 6 | hs | atom_site | H | fract_x | 0.13000 | -inf | inf | ||
| 7 | hs | atom_site | H | fract_z | 0.08000 | -inf | inf | ||
| 8 | hrpt | linked_structure | hs | scale | 0.41730 | 0.00391 | -inf | inf | |
| 9 | hrpt | peak | broad_gauss_u | 0.36367 | 0.02709 | -inf | inf | deg² | |
| 10 | hrpt | peak | broad_gauss_v | -0.29125 | 0.04827 | -inf | inf | deg² | |
| 11 | hrpt | peak | broad_gauss_w | 0.22397 | 0.02035 | -inf | inf | deg² | |
| 12 | hrpt | peak | broad_lorentz_y | 0.16208 | 0.00989 | -inf | inf | deg | |
| 13 | hrpt | instrument | twotheta_offset | 0.12820 | 0.00391 | -inf | inf | deg | |
| 14 | hrpt | background | 1 | intensity | 673.14564 | 20.03728 | -inf | inf | |
| 15 | hrpt | background | 2 | intensity | 454.87212 | 6.27064 | -inf | inf | |
| 16 | hrpt | background | 3 | intensity | 436.50257 | 6.12836 | -inf | inf | |
| 17 | hrpt | background | 4 | intensity | 559.57484 | 13.56527 | -inf | inf | |
| 18 | hrpt | background | 5 | intensity | 472.31015 | 7.64012 | -inf | inf | |
| 19 | hrpt | background | 6 | intensity | 495.70195 | 5.44440 | -inf | inf | |
| 20 | hrpt | background | 7 | intensity | 404.05160 | 5.26882 | -inf | inf | |
| 21 | hrpt | background | 8 | intensity | 439.40658 | 10.46488 | -inf | inf | |
| 22 | hrpt | background | 9 | intensity | 393.75491 | 11.45819 | -inf | inf | |
| 23 | hrpt | background | 10 | intensity | 537.58135 | 8.95915 | -inf | inf | |
| 24 | hrpt | background | 11 | intensity | 454.64740 | 8.38570 | -inf | inf | |
| 25 | hrpt | background | 12 | intensity | 551.72808 | 14.70719 | -inf | inf |
Run Fitting¶
In [37]:
Copied!
project.analysis.fit()
project.analysis.fit()
Standard fitting
📋 Using experiment 🔬 'hrpt' for 'single' fitting
🚀 Starting fit process with 'lmfit (leastsq)'...
📈 Goodness-of-fit progress:
| iteration | time (s) | χ² | change / status | |
|---|---|---|---|---|
| 1 | 1 | 0.06 | 12.94 | |
| 2 | 29 | 1.74 | 5.19 | 59.9% ↓ |
| 3 | 55 | 3.34 | 4.95 | 4.6% ↓ |
| 4 | 82 | 5.57 | 4.95 |
🏆 Best goodness-of-fit (reduced χ²) is 4.95 at iteration 81
✅ Fitting complete.
In [38]:
Copied!
project.display.fit.results()
project.display.fit.results()
⚙️ Settings used:
| Name | Value | Description | |
|---|---|---|---|
| 1 | max_iterations | 1000 | Maximum solver iterations. |
| 2 | chi_square_change_tolerance | 0.01 | Relative change in the objective (chi-square) used to stop fitting. |
| 3 | parameter_change_tolerance | 1e-08 | Relative change in fitted parameters used to stop fitting. |
| 4 | gradient_tolerance | 0.0 | Gradient orthogonality used to stop fitting; zero disables it. |
📋 Least-squares fit results:
| Metric | Value | |
|---|---|---|
| 1 | 🧪 Minimizer | lmfit (leastsq) |
| 2 | ✅ Overall status | success |
| 3 | ⏱️ Fitting time (seconds) | 5.57 |
| 4 | 🔁 Iterations | 79 |
| 5 | 📏 Goodness-of-fit (reduced χ²) | 4.95 |
| 6 | 📏 R-factor (Rf, %) | 6.42 |
| 7 | 📏 R-factor squared (Rf², %) | 8.75 |
| 8 | 📏 Weighted R-factor (wR, %) | 8.05 |
📈 Refined parameters:
| datablock | category | entry | parameter | units | start | value | s.u. | change | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | hs | cell | length_a | Å | 6.8626 | 6.8620 | 0.0002 | 0.01 % ↓ | |
| 2 | hs | cell | length_c | Å | 14.1392 | 14.1349 | 0.0005 | 0.03 % ↓ | |
| 3 | hs | atom_site | O | fract_x | 0.2100 | 0.2059 | 0.0002 | 1.95 % ↓ | |
| 4 | hs | atom_site | O | fract_z | 0.0600 | 0.0629 | 0.0002 | 4.80 % ↑ | |
| 5 | hs | atom_site | Cl | fract_z | 0.1970 | 0.1974 | 0.0002 | 0.20 % ↑ | |
| 6 | hs | atom_site | H | fract_x | 0.1300 | 0.1339 | 0.0002 | 2.99 % ↑ | |
| 7 | hs | atom_site | H | fract_z | 0.0800 | 0.0871 | 0.0001 | 8.86 % ↑ | |
| 8 | hrpt | linked_structure | hs | scale | 0.4173 | 0.3950 | 0.0023 | 5.34 % ↓ | |
| 9 | hrpt | peak | broad_gauss_u | deg² | 0.3637 | 0.3600 | 0.0143 | 1.01 % ↓ | |
| 10 | hrpt | peak | broad_gauss_v | deg² | -0.2912 | -0.3846 | 0.0271 | 32.06 % ↑ | |
| 11 | hrpt | peak | broad_gauss_w | deg² | 0.2240 | 0.2837 | 0.0126 | 26.68 % ↑ | |
| 12 | hrpt | peak | broad_lorentz_y | deg | 0.1621 | 0.1385 | 0.0062 | 14.55 % ↓ | |
| 13 | hrpt | instrument | twotheta_offset | deg | 0.1282 | 0.1150 | 0.0024 | 10.33 % ↓ | |
| 14 | hrpt | background | 1 | intensity | 673.1456 | 672.1280 | 12.3975 | 0.15 % ↓ | |
| 15 | hrpt | background | 2 | intensity | 454.8721 | 456.2864 | 3.8837 | 0.31 % ↑ | |
| 16 | hrpt | background | 3 | intensity | 436.5026 | 448.0908 | 3.7966 | 2.65 % ↑ | |
| 17 | hrpt | background | 4 | intensity | 559.5748 | 564.5114 | 8.4315 | 0.88 % ↑ | |
| 18 | hrpt | background | 5 | intensity | 472.3101 | 464.7541 | 4.7981 | 1.60 % ↓ | |
| 19 | hrpt | background | 6 | intensity | 495.7019 | 517.9317 | 3.3706 | 4.48 % ↑ | |
| 20 | hrpt | background | 7 | intensity | 404.0516 | 449.7735 | 3.2345 | 11.32 % ↑ | |
| 21 | hrpt | background | 8 | intensity | 439.4066 | 473.4162 | 6.7673 | 7.74 % ↑ | |
| 22 | hrpt | background | 9 | intensity | 393.7549 | 476.4911 | 8.0702 | 21.01 % ↑ | |
| 23 | hrpt | background | 10 | intensity | 537.5813 | 455.3346 | 6.0913 | 15.30 % ↓ | |
| 24 | hrpt | background | 11 | intensity | 454.6474 | 405.2356 | 5.6053 | 10.87 % ↓ | |
| 25 | hrpt | background | 12 | intensity | 551.7281 | 589.7602 | 9.2067 | 6.89 % ↑ |
• start = parameter value before refinement
• value = refined value from least-squares minimization
• s.u. = standard uncertainty (one sigma), from the covariance matrix
• change = relative change from start, in %; ↑ = increase, ↓ = decrease
• value = refined value from least-squares minimization
• s.u. = standard uncertainty (one sigma), from the covariance matrix
• change = relative change from start, in %; ↑ = increase, ↓ = decrease
Display Pattern¶
In [39]:
Copied!
project.display.pattern(expt_name='hrpt')
project.display.pattern(expt_name='hrpt')
Loading plot…
In [40]:
Copied!
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
Loading plot…
Perform Fit 4/4¶
Set more parameters to be refined.
In [41]:
Copied!
structure.atom_sites['Zn'].adp_iso.free = True
structure.atom_sites['Cu'].adp_iso.free = True
structure.atom_sites['O'].adp_iso.free = True
structure.atom_sites['Cl'].adp_iso.free = True
structure.atom_sites['H'].adp_iso.free = True
expt.peak.asym_beba_a0.free = True
expt.peak.asym_beba_b0.free = True
expt.peak.asym_beba_a1.free = True
expt.peak.asym_beba_b1.free = True
structure.atom_sites['Zn'].adp_iso.free = True
structure.atom_sites['Cu'].adp_iso.free = True
structure.atom_sites['O'].adp_iso.free = True
structure.atom_sites['Cl'].adp_iso.free = True
structure.atom_sites['H'].adp_iso.free = True
expt.peak.asym_beba_a0.free = True
expt.peak.asym_beba_b0.free = True
expt.peak.asym_beba_a1.free = True
expt.peak.asym_beba_b1.free = True
Show free parameters after selection.
In [42]:
Copied!
project.display.parameters.free()
project.display.parameters.free()
Free parameters for both structures (🧩 data blocks) and experiments (🔬 data blocks)
| datablock | category | entry | parameter | value | uncertainty | min | max | units | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | hs | cell | length_a | 6.86205 | 0.00022 | -inf | inf | Å | |
| 2 | hs | cell | length_c | 14.13486 | 0.00053 | -inf | inf | Å | |
| 3 | hs | atom_site | Zn | adp_iso | 0.50000 | -inf | inf | Ų | |
| 4 | hs | atom_site | Cu | adp_iso | 0.50000 | -inf | inf | Ų | |
| 5 | hs | atom_site | O | fract_x | 0.20591 | 0.00024 | -inf | inf | |
| 6 | hs | atom_site | O | fract_z | 0.06288 | 0.00018 | -inf | inf | |
| 7 | hs | atom_site | O | adp_iso | 0.50000 | -inf | inf | Ų | |
| 8 | hs | atom_site | Cl | fract_z | 0.19740 | 0.00018 | -inf | inf | |
| 9 | hs | atom_site | Cl | adp_iso | 0.50000 | -inf | inf | Ų | |
| 10 | hs | atom_site | H | fract_x | 0.13389 | 0.00018 | -inf | inf | |
| 11 | hs | atom_site | H | fract_z | 0.08709 | 0.00013 | -inf | inf | |
| 12 | hs | atom_site | H | adp_iso | 0.50000 | -inf | inf | Ų | |
| 13 | hrpt | linked_structure | hs | scale | 0.39500 | 0.00234 | -inf | inf | |
| 14 | hrpt | peak | asym_beba_a0 | 0.00000 | -inf | inf | |||
| 15 | hrpt | peak | asym_beba_b0 | 0.00000 | -inf | inf | |||
| 16 | hrpt | peak | asym_beba_a1 | 0.00000 | -inf | inf | |||
| 17 | hrpt | peak | asym_beba_b1 | 0.00000 | -inf | inf | |||
| 18 | hrpt | peak | broad_gauss_u | 0.36000 | 0.01431 | -inf | inf | deg² | |
| 19 | hrpt | peak | broad_gauss_v | -0.38461 | 0.02713 | -inf | inf | deg² | |
| 20 | hrpt | peak | broad_gauss_w | 0.28371 | 0.01259 | -inf | inf | deg² | |
| 21 | hrpt | peak | broad_lorentz_y | 0.13850 | 0.00618 | -inf | inf | deg | |
| 22 | hrpt | instrument | twotheta_offset | 0.11496 | 0.00239 | -inf | inf | deg | |
| 23 | hrpt | background | 1 | intensity | 672.12803 | 12.39752 | -inf | inf | |
| 24 | hrpt | background | 2 | intensity | 456.28643 | 3.88365 | -inf | inf | |
| 25 | hrpt | background | 3 | intensity | 448.09079 | 3.79655 | -inf | inf | |
| 26 | hrpt | background | 4 | intensity | 564.51138 | 8.43152 | -inf | inf | |
| 27 | hrpt | background | 5 | intensity | 464.75410 | 4.79810 | -inf | inf | |
| 28 | hrpt | background | 6 | intensity | 517.93168 | 3.37063 | -inf | inf | |
| 29 | hrpt | background | 7 | intensity | 449.77350 | 3.23455 | -inf | inf | |
| 30 | hrpt | background | 8 | intensity | 473.41616 | 6.76726 | -inf | inf | |
| 31 | hrpt | background | 9 | intensity | 476.49106 | 8.07021 | -inf | inf | |
| 32 | hrpt | background | 10 | intensity | 455.33458 | 6.09127 | -inf | inf | |
| 33 | hrpt | background | 11 | intensity | 405.23560 | 5.60530 | -inf | inf | |
| 34 | hrpt | background | 12 | intensity | 589.76017 | 9.20666 | -inf | inf |
Run Fitting¶
In [43]:
Copied!
project.analysis.fit()
project.analysis.fit()
Standard fitting
📋 Using experiment 🔬 'hrpt' for 'single' fitting
🚀 Starting fit process with 'lmfit (leastsq)'...
📈 Goodness-of-fit progress:
| iteration | time (s) | χ² | change / status | |
|---|---|---|---|---|
| 1 | 1 | 0.05 | 4.96 | |
| 2 | 38 | 2.18 | 2.15 | 56.6% ↓ |
| 3 | 73 | 4.48 | 1.95 | 9.2% ↓ |
| 4 | 109 | 7.41 | 1.95 |
🏆 Best goodness-of-fit (reduced χ²) is 1.95 at iteration 108
✅ Fitting complete.
In [44]:
Copied!
project.display.fit.results()
project.display.fit.results()
⚙️ Settings used:
| Name | Value | Description | |
|---|---|---|---|
| 1 | max_iterations | 1000 | Maximum solver iterations. |
| 2 | chi_square_change_tolerance | 0.01 | Relative change in the objective (chi-square) used to stop fitting. |
| 3 | parameter_change_tolerance | 1e-08 | Relative change in fitted parameters used to stop fitting. |
| 4 | gradient_tolerance | 0.0 | Gradient orthogonality used to stop fitting; zero disables it. |
📋 Least-squares fit results:
| Metric | Value | |
|---|---|---|
| 1 | 🧪 Minimizer | lmfit (leastsq) |
| 2 | ✅ Overall status | success |
| 3 | ⏱️ Fitting time (seconds) | 7.41 |
| 4 | 🔁 Iterations | 106 |
| 5 | 📏 Goodness-of-fit (reduced χ²) | 1.95 |
| 6 | 📏 R-factor (Rf, %) | 3.99 |
| 7 | 📏 R-factor squared (Rf², %) | 4.64 |
| 8 | 📏 Weighted R-factor (wR, %) | 5.05 |
📈 Refined parameters:
| datablock | category | entry | parameter | units | start | value | s.u. | change | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | hs | cell | length_a | Å | 6.8620 | 6.8639 | 0.0004 | 0.03 % ↑ | |
| 2 | hs | cell | length_c | Å | 14.1349 | 14.1417 | 0.0009 | 0.05 % ↑ | |
| 3 | hs | atom_site | Zn | adp_iso | Ų | 0.5000 | 0.1678 | 0.0604 | 66.43 % ↓ |
| 4 | hs | atom_site | Cu | adp_iso | Ų | 0.5000 | 1.4870 | 0.0380 | 197.40 % ↑ |
| 5 | hs | atom_site | O | fract_x | 0.2059 | 0.2062 | 0.0002 | 0.17 % ↑ | |
| 6 | hs | atom_site | O | fract_z | 0.0629 | 0.0611 | 0.0001 | 2.91 % ↓ | |
| 7 | hs | atom_site | O | adp_iso | Ų | 0.5000 | 1.0805 | 0.0374 | 116.10 % ↑ |
| 8 | hs | atom_site | Cl | fract_z | 0.1974 | 0.1967 | 0.0001 | 0.35 % ↓ | |
| 9 | hs | atom_site | Cl | adp_iso | Ų | 0.5000 | 1.4335 | 0.0380 | 186.69 % ↑ |
| 10 | hs | atom_site | H | fract_x | 0.1339 | 0.1324 | 0.0002 | 1.14 % ↓ | |
| 11 | hs | atom_site | H | fract_z | 0.0871 | 0.0898 | 0.0001 | 3.15 % ↑ | |
| 12 | hs | atom_site | H | adp_iso | Ų | 0.5000 | 2.4461 | 0.0429 | 389.23 % ↑ |
| 13 | hrpt | linked_structure | hs | scale | 0.3950 | 0.5110 | 0.0027 | 29.37 % ↑ | |
| 14 | hrpt | peak | asym_beba_a0 | 0.0000 | -0.1918 | 0.0257 | N/A | ||
| 15 | hrpt | peak | asym_beba_b0 | 0.0000 | -0.0462 | 0.0040 | N/A | ||
| 16 | hrpt | peak | asym_beba_a1 | 0.0000 | 0.1049 | 0.0591 | N/A | ||
| 17 | hrpt | peak | asym_beba_b1 | 0.0000 | 0.0521 | 0.0092 | N/A | ||
| 18 | hrpt | peak | broad_gauss_u | deg² | 0.3600 | 0.2243 | 0.0048 | 37.69 % ↓ | |
| 19 | hrpt | peak | broad_gauss_v | deg² | -0.3846 | -0.2763 | 0.0056 | 28.15 % ↓ | |
| 20 | hrpt | peak | broad_gauss_w | deg² | 0.2837 | 0.2681 | 0.0055 | 5.52 % ↓ | |
| 21 | hrpt | peak | broad_lorentz_y | deg | 0.1385 | 0.1524 | 0.0036 | 10.05 % ↑ | |
| 22 | hrpt | instrument | twotheta_offset | deg | 0.1150 | 0.1455 | 0.0064 | 26.59 % ↑ | |
| 23 | hrpt | background | 1 | intensity | 672.1280 | 672.1924 | 7.7893 | 0.01 % ↑ | |
| 24 | hrpt | background | 2 | intensity | 456.2864 | 456.1969 | 2.4429 | 0.02 % ↓ | |
| 25 | hrpt | background | 3 | intensity | 448.0908 | 444.7640 | 2.3902 | 0.74 % ↓ | |
| 26 | hrpt | background | 4 | intensity | 564.5114 | 473.0814 | 5.6505 | 16.20 % ↓ | |
| 27 | hrpt | background | 5 | intensity | 464.7541 | 461.0107 | 3.0287 | 0.81 % ↓ | |
| 28 | hrpt | background | 6 | intensity | 517.9317 | 494.4534 | 2.1895 | 4.53 % ↓ | |
| 29 | hrpt | background | 7 | intensity | 449.7735 | 492.4306 | 2.0943 | 9.48 % ↑ | |
| 30 | hrpt | background | 8 | intensity | 473.4162 | 533.3785 | 4.4364 | 12.67 % ↑ | |
| 31 | hrpt | background | 9 | intensity | 476.4911 | 525.6834 | 5.1820 | 10.32 % ↑ | |
| 32 | hrpt | background | 10 | intensity | 455.3346 | 527.1397 | 3.9558 | 15.77 % ↑ | |
| 33 | hrpt | background | 11 | intensity | 405.2356 | 492.6152 | 3.6286 | 21.56 % ↑ | |
| 34 | hrpt | background | 12 | intensity | 589.7602 | 507.1019 | 6.6529 | 14.02 % ↓ |
• start = parameter value before refinement
• value = refined value from least-squares minimization
• s.u. = standard uncertainty (one sigma), from the covariance matrix
• change = relative change from start, in %; ↑ = increase, ↓ = decrease
• value = refined value from least-squares minimization
• s.u. = standard uncertainty (one sigma), from the covariance matrix
• change = relative change from start, in %; ↑ = increase, ↓ = decrease
In [45]:
Copied!
project.display.fit.correlations()
project.display.fit.correlations()
Loading plot…
Display Pattern¶
In [46]:
Copied!
project.display.pattern(expt_name='hrpt')
project.display.pattern(expt_name='hrpt')
Loading plot…
In [47]:
Copied!
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
project.display.pattern(expt_name='hrpt', x_min=48, x_max=51)
Loading plot…
📊 Report¶
The HTML report is written automatically when the project is saved;
enable project.report.pdf as well for a PDF version.
💾 Save Project¶
In [48]:
Copied!
project.save_as(dir_path='projects/refine-hs-hrpt')
project.save_as(dir_path='projects/refine-hs-hrpt')
Saving project 📦 'hs_hrpt' to '../../../projects/refine-hs-hrpt'
├── 📄 project.edi
├── 📁 structures/
│ └── 📄 hs.edi
├── 📁 experiments/
│ └── 📄 hrpt.edi
├── 📁 analysis/
│ └── 📄 analysis.edi
└── 📁 reports/
└── 📄 hs_hrpt.html