Skip to content

Commit aad785f

Browse files
committed
Adds diffraction analysis for Na2Ca3Al2F14 sample
1 parent 4aceedc commit aad785f

File tree

2 files changed

+357
-1
lines changed

2 files changed

+357
-1
lines changed

docs/mkdocs.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ nav:
5858
- Basic Usage:
5959
- SingleFit pd-neut-cwl: tutorials/basic_single-fit_pd-neut-cwl_LBCO-HRPT.ipynb
6060
- Advanced Usage:
61-
- SingleFit pd-neut-tof: tutorials/advanced_single-fit_pd-neut-tof_Si-SEPD.ipynb
61+
- SingleFit pd-neut-tof 1: tutorials/advanced_single-fit_pd-neut-tof_Si-SEPD.ipynb
62+
- SingleFit pd-neut-tof 2: tutorials/advanced_single-fit_pd-neut-tof_NCAF-WISH.ipynb
6263
- SingleFit pd-neut-cwl: tutorials/advanced_single-fit_pd-neut-cwl_HS-HRPT.ipynb
6364
- JointFit pd-neut-xray-cwl: tutorials/advanced_joint-fit_pd-neut-xray-cwl_PbSO4.ipynb
6465
- Pair Distribution Function:
Lines changed: 355 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,355 @@
1+
# %% [markdown]
2+
# # Standard diffraction: Na2Ca3Al2F14
3+
#
4+
# Standard diffraction analysis of Na2Ca3Al2F14 after the powder neutron
5+
# time-of-flight diffraction measurement from WISH at ISIS.
6+
#
7+
# Only a single dataset from detector banks 5 & 6 is used here.
8+
9+
# %% [markdown]
10+
# ## Import EasyDiffraction
11+
12+
# %%
13+
from easydiffraction import (
14+
Project,
15+
SampleModel,
16+
Experiment,
17+
download_from_repository
18+
)
19+
20+
# %% [markdown]
21+
# ## Define Sample Model
22+
#
23+
# This section covers how to add sample models and modify their parameters.
24+
#
25+
# ### Create sample model object
26+
27+
# %%
28+
model = SampleModel('ncaf')
29+
30+
# %% [markdown]
31+
# ### Define space group
32+
33+
# %%
34+
model.space_group.name_h_m = 'I 21 3'
35+
model.space_group.it_coordinate_system_code = '1'
36+
37+
# %% [markdown]
38+
# ### Define unit cell
39+
40+
# %%
41+
model.cell.length_a = 10.250256
42+
43+
# %% [markdown]
44+
# ### Define atom sites
45+
46+
# %%
47+
model.atom_sites.add('Ca', 'Ca', 0.4661, 0.0, 0.25, wyckoff_letter="b", b_iso=0.9)
48+
model.atom_sites.add('Al', 'Al', 0.25171, 0.25171, 0.25171, wyckoff_letter="a", b_iso=0.66)
49+
model.atom_sites.add('Na', 'Na', 0.08481, 0.08481, 0.08481, wyckoff_letter="a", b_iso=1.9)
50+
model.atom_sites.add('F1', 'F', 0.1375, 0.3053, 0.1195, wyckoff_letter="c", b_iso=0.9)
51+
model.atom_sites.add('F2', 'F', 0.3626, 0.3634, 0.1867, wyckoff_letter="c", b_iso=1.28)
52+
model.atom_sites.add('F3', 'F', 0.4612, 0.4612, 0.4612, wyckoff_letter="a", b_iso=0.79)
53+
54+
# %% [markdown]
55+
# ## Define Experiment
56+
#
57+
# This section teaches how to add experiments, configure their parameters, and
58+
# link to them the sample models defined in the previous step.
59+
#
60+
# ### Download measured data
61+
62+
# %%
63+
download_from_repository('wish_ncaf.xye',
64+
branch='docs',
65+
destination='data')
66+
67+
# %% [markdown]
68+
# ### Create experiment object
69+
70+
# %%
71+
expt = Experiment('wish',
72+
beam_mode='time-of-flight',
73+
data_path='data/wish_ncaf.xye')
74+
75+
# %% [markdown]
76+
# ### Define instrument
77+
78+
# %%
79+
expt.instrument.setup_twotheta_bank = 152.827
80+
expt.instrument.calib_d_to_tof_offset = 0.0
81+
expt.instrument.calib_d_to_tof_linear = 20770
82+
expt.instrument.calib_d_to_tof_quad = -1.08308
83+
84+
# %% [markdown]
85+
# ### Define peak profile
86+
87+
# %%
88+
expt.peak_profile_type = 'pseudo-voigt * ikeda-carpenter'
89+
expt.peak.broad_gauss_sigma_0 = 0.0
90+
expt.peak.broad_gauss_sigma_1 = 0.0
91+
expt.peak.broad_gauss_sigma_2 = 5.0
92+
expt.peak.broad_mix_beta_0 = 0.01
93+
expt.peak.broad_mix_beta_1 = 0.01
94+
95+
# %% [markdown]
96+
# ### Define peak asymmetry
97+
98+
# %%
99+
expt.peak.asym_alpha_0 = 0.0
100+
expt.peak.asym_alpha_1 = 0.1
101+
102+
# %% [markdown]
103+
# ### Define background
104+
105+
# %%
106+
expt.background_type = 'line-segment'
107+
for x, y in [
108+
(9162, 465),
109+
(11136, 593),
110+
(13313, 497),
111+
(14906, 546),
112+
(16454, 533),
113+
(17352, 496),
114+
(18743, 428),
115+
(20179, 452),
116+
(21368, 397),
117+
(22176, 468),
118+
(22827, 477),
119+
(24644, 380),
120+
(26439, 381),
121+
(28257, 378),
122+
(31196, 343),
123+
(34034, 328),
124+
(37265, 310),
125+
(41214, 323),
126+
(44827, 283),
127+
(49830, 273),
128+
(52905, 257),
129+
(58204, 260),
130+
(62916, 261),
131+
(70186, 262),
132+
(74204, 262),
133+
(82103, 268),
134+
(91958, 268),
135+
(102712, 262)
136+
]:
137+
expt.background.add(x, y)
138+
139+
# %% [markdown]
140+
# ### Select linked phase
141+
142+
# %%
143+
expt.linked_phases.add('ncaf', scale=0.5)
144+
145+
# %% [markdown]
146+
# ## Define Project
147+
#
148+
# The project object is used to manage the sample model, experiments, and
149+
# analysis
150+
#
151+
# ### Create project object
152+
153+
# %%
154+
project = Project()
155+
156+
# %% [markdown]
157+
# ### Configure Plotting Engine
158+
159+
# %%
160+
project.plotter.engine = 'plotly'
161+
162+
# %% [markdown]
163+
# ### Add sample model
164+
165+
# %%
166+
project.sample_models.add(model)
167+
168+
# %% [markdown]
169+
# ### Add experiment
170+
171+
# %%
172+
project.experiments.add(expt)
173+
174+
# %% [markdown]
175+
# ## Analysis
176+
#
177+
# This section will guide you through the analysis process, including setting
178+
# up calculators and fitting models.
179+
#
180+
# ### Set calculation engine
181+
182+
# %%
183+
project.analysis.current_calculator = 'cryspy'
184+
185+
# %% [markdown]
186+
# ### Set fitting engine
187+
188+
# %%
189+
project.analysis.current_minimizer = 'lmfit (leastsq)'
190+
191+
# %% [markdown]
192+
# ### Show measured vs calculated
193+
194+
# %%
195+
project.plot_meas_vs_calc(expt_name='wish',
196+
show_residual=True)
197+
project.plot_meas_vs_calc(expt_name='wish',
198+
x_min=37000, x_max=40000,
199+
show_residual=True)
200+
201+
# %% [markdown]
202+
# ### Perform Fit 1/5
203+
#
204+
# Set parameters to be fitted
205+
206+
# %%
207+
model.cell.length_a.free = True
208+
209+
expt.instrument.calib_d_to_tof_offset.free = True
210+
expt.linked_phases['ncaf'].scale.free = True
211+
212+
# %% [markdown]
213+
# Show free parameters after selection
214+
215+
# %%
216+
project.analysis.show_free_params()
217+
218+
# %% [markdown]
219+
# #### Start fitting
220+
221+
# %%
222+
project.analysis.fit()
223+
224+
# %% [markdown]
225+
# #### Show fitting results
226+
227+
# %%
228+
project.plot_meas_vs_calc(expt_name='wish',
229+
show_residual=True)
230+
project.plot_meas_vs_calc(expt_name='wish',
231+
x_min=37000, x_max=40000,
232+
show_residual=True)
233+
234+
# %% [markdown]
235+
# ### Perform Fit 2/5
236+
#
237+
# Set parameters to be fitted
238+
239+
# %%
240+
expt.peak.broad_gauss_sigma_2.free = True
241+
expt.peak.broad_mix_beta_0.free = True
242+
expt.peak.broad_mix_beta_1.free = True
243+
expt.peak.asym_alpha_0.free = True
244+
expt.peak.asym_alpha_1.free = True
245+
246+
# %% [markdown]
247+
# Show free parameters after selection
248+
249+
# %%
250+
project.analysis.show_free_params()
251+
252+
# %% [markdown]
253+
# #### Start fitting
254+
255+
# %%
256+
project.analysis.fit()
257+
258+
# %% [markdown]
259+
# #### Show fitting results
260+
261+
# %%
262+
project.plot_meas_vs_calc(expt_name='wish',
263+
show_residual=True)
264+
project.plot_meas_vs_calc(expt_name='wish',
265+
x_min=37000, x_max=40000,
266+
show_residual=True)
267+
268+
269+
# %% [markdown]
270+
# ### Perform Fit 3/5
271+
#
272+
# Set parameters to be fitted
273+
274+
# %%
275+
model.atom_sites['Ca'].fract_x.free = True
276+
model.atom_sites['Al'].fract_x.free = True
277+
model.atom_sites['Na'].fract_x.free = True
278+
model.atom_sites['F1'].fract_x.free = True
279+
model.atom_sites['F1'].fract_y.free = True
280+
model.atom_sites['F1'].fract_z.free = True
281+
model.atom_sites['F2'].fract_x.free = True
282+
model.atom_sites['F2'].fract_y.free = True
283+
model.atom_sites['F2'].fract_z.free = True
284+
model.atom_sites['F3'].fract_x.free = True
285+
286+
# %% [markdown]
287+
# Show free parameters after selection
288+
289+
# %%
290+
project.analysis.show_free_params()
291+
292+
# %% [markdown]
293+
# #### Start fitting
294+
295+
# %%
296+
project.analysis.fit()
297+
298+
# %% [markdown]
299+
# #### Show fitting results
300+
301+
# %%
302+
project.plot_meas_vs_calc(expt_name='wish',
303+
show_residual=True)
304+
project.plot_meas_vs_calc(expt_name='wish',
305+
x_min=37000, x_max=40000,
306+
show_residual=True)
307+
308+
# %% [markdown]
309+
# ### Perform Fit 4/5
310+
#
311+
# Set parameters to be fitted
312+
313+
# %%
314+
expt.instrument.calib_d_to_tof_linear.free = True
315+
316+
model.atom_sites['Ca'].b_iso.free = True
317+
model.atom_sites['Al'].b_iso.free = True
318+
model.atom_sites['Na'].b_iso.free = True
319+
model.atom_sites['F1'].b_iso.free = True
320+
model.atom_sites['F2'].b_iso.free = True
321+
model.atom_sites['F3'].b_iso.free = True
322+
323+
# %% [markdown]
324+
# Show free parameters after selection
325+
326+
# %%
327+
project.analysis.show_free_params()
328+
329+
# %% [markdown]
330+
# #### Start fitting
331+
332+
# %%
333+
project.analysis.fit()
334+
335+
# %% [markdown]
336+
# #### Show fitting results
337+
338+
# %%
339+
project.plot_meas_vs_calc(expt_name='wish',
340+
show_residual=True)
341+
project.plot_meas_vs_calc(expt_name='wish',
342+
x_min=37000, x_max=40000,
343+
show_residual=True)
344+
345+
# %% [markdown]
346+
# ## Summary
347+
#
348+
# In this final section, you will learn how to review the results of the
349+
# analysis
350+
351+
# %% [markdown]
352+
# ### Show project summary report
353+
354+
# %%
355+
project.summary.show_report()

0 commit comments

Comments
 (0)