From d6f6b0422f4bec9b649ab9142bd6dfcdc7dc7d9b Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 10 Jul 2025 17:12:00 +0200 Subject: [PATCH 01/41] Adds d-spacing parameter to project.py --- src/easydiffraction/project.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/easydiffraction/project.py b/src/easydiffraction/project.py index 1cc6d38b..86238462 100644 --- a/src/easydiffraction/project.py +++ b/src/easydiffraction/project.py @@ -273,7 +273,8 @@ def plot_meas_vs_calc(self, expt_name, x_min=None, x_max=None, - show_residual=False): + show_residual=False, + d_spacing=False): self.analysis.calculate_pattern(expt_name) # Recalculate pattern experiment = self.experiments[expt_name] pattern = experiment.datastore.pattern @@ -283,4 +284,5 @@ def plot_meas_vs_calc(self, expt_type, x_min=x_min, x_max=x_max, - show_residual=show_residual) \ No newline at end of file + show_residual=show_residual, + d_spacing=d_spacing) From e678656b0e55695ebd12cfcb68a04a776f1e3c0b Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 10 Jul 2025 17:22:28 +0200 Subject: [PATCH 02/41] Adds d parameter to plotting.py --- src/easydiffraction/plotting/plotting.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/easydiffraction/plotting/plotting.py b/src/easydiffraction/plotting/plotting.py index 44d21589..a929d6a8 100644 --- a/src/easydiffraction/plotting/plotting.py +++ b/src/easydiffraction/plotting/plotting.py @@ -196,7 +196,8 @@ def plot_meas_vs_calc(self, expt_type, x_min=None, x_max=None, - show_residual=False): + show_residual=False, + d_spacing=False): if pattern.x is None: error(f"No data available for experiment {expt_name}") return @@ -207,16 +208,20 @@ def plot_meas_vs_calc(self, print(f"No calculated data available for experiment {expt_name}") return - x = self._filtered_y_array(y_array=pattern.x, - x_array=pattern.x, + if d_spacing: + x_array = pattern.d + else: + x_array = pattern.x + x = self._filtered_y_array(y_array=x_array, + x_array=x_array, x_min=x_min, x_max=x_max) y_meas = self._filtered_y_array(y_array=pattern.meas, - x_array=pattern.x, + x_array=x_array, x_min=x_min, x_max=x_max) y_calc = self._filtered_y_array(y_array=pattern.calc, - x_array=pattern.x, + x_array=x_array, x_min=x_min, x_max=x_max) From 5bd67a206eed4968fdf5d4aac0f6a70d5439bfe3 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 10 Jul 2025 23:42:22 +0200 Subject: [PATCH 03/41] Enhances notebook conversion with Jupytext --- .github/workflows/building-deploying-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/building-deploying-docs.yml b/.github/workflows/building-deploying-docs.yml index f7ad4422..778514ca 100644 --- a/.github/workflows/building-deploying-docs.yml +++ b/.github/workflows/building-deploying-docs.yml @@ -101,7 +101,7 @@ jobs: - name: Convert ${{ env.NOTEBOOKS_DIR }}/*.py to docs/${{env.NOTEBOOKS_DIR }}/*.ipynb run: | cp -R ${{ env.NOTEBOOKS_DIR }}/data docs/${{ env.NOTEBOOKS_DIR }}/ - jupytext ${{ env.NOTEBOOKS_DIR }}/*.py --to ipynb + jupytext ${{ env.NOTEBOOKS_DIR }}/*.py --from py:percent --to ipynb mv ${{ env.NOTEBOOKS_DIR }}/*.ipynb docs/${{ env.NOTEBOOKS_DIR }}/ # The following step is needed to avoid the following message during the build: From 0480940b6ab49fb1e085c1985690ca8f5655ab79 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 10 Jul 2025 23:42:42 +0200 Subject: [PATCH 04/41] Adds 2025 DMSC workshop tutorial to documentation --- docs/mkdocs.yml | 2 ++ docs/tutorials/index.md | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 43e723da..9b849bc0 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -77,6 +77,8 @@ nav: - Ni pd-neut-cwl: tutorials/pdf_pd-neut-cwl_Ni.ipynb - Si pd-neut-tof: tutorials/pdf_pd-neut-tof_Si-NOMAD.ipynb - NaCl pd-xray: tutorials/pdf_pd-xray_NaCl.ipynb + - Workshops & Schools: + - 2025 DMSC: tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb - API Reference: - API Reference: api-reference/index.md - core: api-reference/core.md diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md index a78d7607..09e1f58c 100644 --- a/docs/tutorials/index.md +++ b/docs/tutorials/index.md @@ -66,3 +66,11 @@ The tutorials are organized into the following categories. - [NaCl `pd-xray`](pdf_pd-xray_NaCl.ipynb) – Demonstrates a PDF analysis of NaCl using data collected from an X-ray powder diffraction experiment. + +## Workshops & Schools + +- [2025 DMSC](dmsc-summer-school-2025_analysis-powder-diffraction.ipynb) – + A workshop tutorial that demonstrates a Rietveld refinement of the + La0.5Ba0.5CoO3 crystal structure using time-of-flight neutron powder + diffraction data simulated with McStas. This tutorial is designed for + the ESS DMSC Summer School 2025. From e7478d79ab6db4d7a5a88a4c6264025f73a3e5f8 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 10 Jul 2025 23:44:10 +0200 Subject: [PATCH 05/41] Adds quick and dirty d-spacing plotting functionality --- src/easydiffraction/core/constants.py | 1 + .../experiments/collections/datastore.py | 1 + src/easydiffraction/plotting/plotting.py | 41 ++++++++++---- src/easydiffraction/project.py | 54 +++++++++++++++++-- src/easydiffraction/utils/utils.py | 27 ++++++++++ 5 files changed, 109 insertions(+), 15 deletions(-) diff --git a/src/easydiffraction/core/constants.py b/src/easydiffraction/core/constants.py index dda1b8cd..b999affa 100644 --- a/src/easydiffraction/core/constants.py +++ b/src/easydiffraction/core/constants.py @@ -18,6 +18,7 @@ 'bragg': { 'constant wavelength' : ['2θ (degree)', 'Intensity (arb. units)'], 'time-of-flight': ['TOF (µs)', 'Intensity (arb. units)'], + 'd-spacing': ['d (Å)', 'Intensity (arb. units)'], }, 'total': { 'constant wavelength' : ['r (Å)', 'G(r) (Å)'], diff --git a/src/easydiffraction/experiments/collections/datastore.py b/src/easydiffraction/experiments/collections/datastore.py index b74a4f42..eb10656c 100644 --- a/src/easydiffraction/experiments/collections/datastore.py +++ b/src/easydiffraction/experiments/collections/datastore.py @@ -13,6 +13,7 @@ def __init__(self, experiment: Experiment) -> None: # Data arrays self.x: Optional[np.ndarray] = None + self.d: Optional[np.ndarray] = None self.meas: Optional[np.ndarray] = None self.meas_su: Optional[np.ndarray] = None self.bkg: Optional[np.ndarray] = None diff --git a/src/easydiffraction/plotting/plotting.py b/src/easydiffraction/plotting/plotting.py index a929d6a8..16cb4aa6 100644 --- a/src/easydiffraction/plotting/plotting.py +++ b/src/easydiffraction/plotting/plotting.py @@ -123,7 +123,8 @@ def plot_meas(self, expt_name, expt_type, x_min=None, - x_max=None): + x_max=None, + d_spacing=False): if pattern.x is None: error(f"No data available for experiment {expt_name}") return @@ -131,19 +132,26 @@ def plot_meas(self, error(f"No measured data available for experiment {expt_name}") return - x = self._filtered_y_array(y_array=pattern.x, - x_array=pattern.x, + if d_spacing: + x_array = pattern.d + else: + x_array = pattern.x + x = self._filtered_y_array(y_array=x_array, + x_array=x_array, x_min=x_min, x_max=x_max) y_meas = self._filtered_y_array(y_array=pattern.meas, - x_array=pattern.x, + x_array=x_array, x_min=x_min, x_max=x_max) y_series = [y_meas] y_labels = ['meas'] - axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value][expt_type.beam_mode.value] + if d_spacing: + axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value]['d-spacing'] + else: + axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value][expt_type.beam_mode.value] self._plotter.plot( x=x, @@ -159,7 +167,8 @@ def plot_calc(self, expt_name, expt_type, x_min=None, - x_max=None): + x_max=None, + d_spacing=False): if pattern.x is None: error(f"No data available for experiment {expt_name}") return @@ -167,19 +176,26 @@ def plot_calc(self, print(f"No calculated data available for experiment {expt_name}") return - x = self._filtered_y_array(y_array=pattern.x, - x_array=pattern.x, + if d_spacing: + x_array = pattern.d + else: + x_array = pattern.x + x = self._filtered_y_array(y_array=x_array, + x_array=x_array, x_min=x_min, x_max=x_max) y_calc = self._filtered_y_array(y_array=pattern.calc, - x_array=pattern.x, + x_array=x_array, x_min=x_min, x_max=x_max) y_series = [y_calc] y_labels = ['calc'] - axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value][expt_type.beam_mode.value] + if d_spacing: + axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value]['d-spacing'] + else: + axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value][expt_type.beam_mode.value] self._plotter.plot( x=x, @@ -228,7 +244,10 @@ def plot_meas_vs_calc(self, y_series = [y_meas, y_calc] y_labels = ['meas', 'calc'] - axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value][expt_type.beam_mode.value] + if d_spacing: + axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value]['d-spacing'] + else: + axes_labels = DEFAULT_AXES_LABELS[expt_type.scattering_type.value][expt_type.beam_mode.value] if show_residual: y_resid = y_meas - y_calc diff --git a/src/easydiffraction/project.py b/src/easydiffraction/project.py index 86238462..64b4c143 100644 --- a/src/easydiffraction/project.py +++ b/src/easydiffraction/project.py @@ -6,6 +6,7 @@ from varname import varname from typing import List +from easydiffraction.utils.utils import tof_to_d from easydiffraction.utils.formatting import ( paragraph, error @@ -245,29 +246,49 @@ def set_experiments(self, experiments: Experiments) -> None: def plot_meas(self, expt_name, x_min=None, - x_max=None): + x_max=None, + d_spacing=False): experiment = self.experiments[expt_name] pattern = experiment.datastore.pattern expt_type = experiment.type + + beam_mode = expt_type.beam_mode.value + if d_spacing: # TODO: move this logic to somewhere else + if beam_mode == 'time-of-flight': + self.update_pattern_d_spacing(expt_name) + else: + d_spacing = False + self.plotter.plot_meas(pattern, expt_name, expt_type, x_min=x_min, - x_max=x_max) + x_max=x_max, + d_spacing=d_spacing) def plot_calc(self, expt_name, x_min=None, - x_max=None): + x_max=None, + d_spacing=False): self.analysis.calculate_pattern(expt_name) # Recalculate pattern experiment = self.experiments[expt_name] pattern = experiment.datastore.pattern expt_type = experiment.type + + beam_mode = expt_type.beam_mode.value + if d_spacing: # TODO: move this logic to somewhere else + if beam_mode == 'time-of-flight': + self.update_pattern_d_spacing(expt_name) + else: + d_spacing = False + self.plotter.plot_calc(pattern, expt_name, expt_type, x_min=x_min, - x_max=x_max) + x_max=x_max, + d_spacing=d_spacing) def plot_meas_vs_calc(self, expt_name, @@ -279,6 +300,14 @@ def plot_meas_vs_calc(self, experiment = self.experiments[expt_name] pattern = experiment.datastore.pattern expt_type = experiment.type + + beam_mode = expt_type.beam_mode.value + if d_spacing: # TODO: move this logic to somewhere else + if beam_mode == 'time-of-flight': + self.update_pattern_d_spacing(expt_name) + else: + d_spacing = False + self.plotter.plot_meas_vs_calc(pattern, expt_name, expt_type, @@ -286,3 +315,20 @@ def plot_meas_vs_calc(self, x_max=x_max, show_residual=show_residual, d_spacing=d_spacing) + + def update_pattern_d_spacing(self, expt_name: str) -> None: + """ + Update the pattern's d-spacing based on the experiment's beam mode. + """ + experiment = self.experiments[expt_name] + pattern = experiment.datastore.pattern + expt_type = experiment.type + beam_mode = expt_type.beam_mode.value + + if beam_mode == 'time-of-flight': + pattern.d = tof_to_d(pattern.x, + experiment.instrument.calib_d_to_tof_offset.value, + experiment.instrument.calib_d_to_tof_linear.value, + experiment.instrument.calib_d_to_tof_quad.value) + else: + print(error(f"Unsupported beam mode: {beam_mode} for d-spacing update.")) diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index e6328eff..5d3feb21 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -2,6 +2,7 @@ General utilities and helpers for easydiffraction. """ +import numpy as np import pandas as pd import pooch from tabulate import tabulate @@ -137,3 +138,29 @@ def make_formatter(align): ) print(table) + + +def tof_to_d(tof, offset, linear, quad): + """ + Convert TOF to d-spacing using quadratic calibration. + + Parameters: + tof (float or np.ndarray): Time-of-flight in microseconds. + offset (float): Time offset. + linear (float): Linear coefficient. + quad (float): Quadratic coefficient. + + Returns: + d (float or np.ndarray): d-spacing in Å. + """ + A = quad + B = linear + C = offset - tof + + discriminant = B**2 - 4*A*C + if np.any(discriminant < 0): + raise ValueError("Negative discriminant: invalid calibration or TOF range") + + sqrt_discriminant = np.sqrt(discriminant) + d = (-B + sqrt_discriminant) / (2*A) + return d \ No newline at end of file From d28a413d4164868c37060433e42e36a75db08d40 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Thu, 10 Jul 2025 23:49:14 +0200 Subject: [PATCH 06/41] Adds 1st draft of the dmsc summer school 2025 tutorial --- .../data/powder_reduced_Si_2large_bank.xye | 1002 ++++++++++ ...powder_reduced_lbco_0_05si_2large_bank.xye | 1002 ++++++++++ ...ool-2025_analysis-powder-diffraction.ipynb | 1619 +++++++++++++++++ ...school-2025_analysis-powder-diffraction.py | 931 ++++++++++ 4 files changed, 4554 insertions(+) create mode 100644 tutorials/data/powder_reduced_Si_2large_bank.xye create mode 100644 tutorials/data/powder_reduced_lbco_0_05si_2large_bank.xye create mode 100644 tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb create mode 100644 tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py diff --git a/tutorials/data/powder_reduced_Si_2large_bank.xye b/tutorials/data/powder_reduced_Si_2large_bank.xye new file mode 100644 index 00000000..0405d0f8 --- /dev/null +++ b/tutorials/data/powder_reduced_Si_2large_bank.xye @@ -0,0 +1,1002 @@ +# DIFC = 61710.6408749326 [µ/Å] L = 157.66518803451007 [m] two_theta = 101.46547009972369 [deg] +# tof [µs] Y [counts] E [counts] +4.324681712515276740e+04 3.156069582779482546e-02 1.281676034277614423e-02 +4.334555415055265621e+04 3.140293622280913022e-01 8.076054002092056261e-02 +4.344429117595254502e+04 9.069843757868617518e-01 1.344347230540465232e-01 +4.354302820135244110e+04 1.089071965596993818e+00 1.272974218591994000e-01 +4.364176522675232991e+04 1.113899160623086804e+00 1.099585635561626390e-01 +4.374050225215222599e+04 5.176603717635882562e-01 6.376124213745815172e-02 +4.383923927755211480e+04 3.049272626289636356e-01 4.249700148257185006e-02 +4.393797630295201088e+04 1.108212123815144057e-01 3.092007349923053816e-02 +4.403671332835190697e+04 2.796544219598396872e-02 9.054688839219974736e-03 +4.413545035375179577e+04 2.961339119604477696e-03 2.277843670635437689e-03 +4.423418737915167731e+04 1.776419822428283724e-02 1.115040718253660149e-02 +4.433292440455157339e+04 8.165343345877568160e-02 5.522874035385907932e-02 +4.443166142995146947e+04 3.637641247119879906e-01 1.447709172264560473e-01 +4.453039845535136556e+04 1.266504534021000605e+00 3.089229635198502133e-01 +4.462913548075125436e+04 1.648223403937848053e+00 2.806330903380824804e-01 +4.472787250615114317e+04 2.066795043189222358e+00 2.750297644652802687e-01 +4.482660953155103925e+04 1.503474963051006474e+00 2.005881035225342279e-01 +4.492534655695092806e+04 5.745375124532989819e-01 9.288458574466311457e-02 +4.502408358235082414e+04 3.572426748544896835e-01 5.848994509358305255e-02 +4.512282060775071295e+04 1.129455036555140207e-01 3.165154406474092463e-02 +4.522155763315060176e+04 1.790773341277467762e-02 1.164266723720644957e-02 +4.532029465855049784e+04 5.467646639527113175e-03 3.833840801579768091e-03 +4.541903168395039393e+04 2.191228213326353730e-02 2.174392396944743386e-02 +4.551776870935028273e+04 9.868788351198850711e-20 9.868788349823568212e-20 +4.561650573475017882e+04 6.784237038688594032e-04 6.784237031130813675e-04 +4.571524276015006762e+04 6.483040250096503415e-12 6.483040250096502607e-12 +4.581397978554995643e+04 1.887960891134180379e-25 1.887951509600089537e-25 +4.591271681094985252e+04 7.847319703981895517e-03 7.767985917637457161e-03 +4.601145383634974132e+04 4.285811100542081327e-06 4.285811100538860908e-06 +4.611019086174963741e+04 5.114523564738341274e-20 4.791871206634568232e-20 +4.620892788714952621e+04 2.518641787296248903e-06 1.876422029118756049e-06 +4.630766491254942230e+04 1.193933463367486140e-04 8.525611003033564390e-05 +4.640640193794931838e+04 2.619903497955587690e-02 1.758483021087248882e-02 +4.650513896334919991e+04 1.100811984622802053e-01 3.723208108405230005e-02 +4.660387598874909600e+04 4.560748492305141677e-01 8.347410001317263906e-02 +4.670261301414898480e+04 1.154179865647022352e+00 1.260627858568434956e-01 +4.680135003954888089e+04 1.290743710953081491e+00 1.167171796513912924e-01 +4.690008706494877697e+04 1.124394329411396276e+00 9.214131643018778905e-02 +4.699882409034866578e+04 7.890788371857461181e-01 6.441380556380858768e-02 +4.709756111574856186e+04 4.463773258796808197e-01 4.389950671473832888e-02 +4.719629814114845067e+04 1.692954985272891733e-01 2.079065475570711016e-02 +4.729503516654833948e+04 3.880062908483178363e-02 8.353095747253895531e-03 +4.739377219194823556e+04 5.347846446208613658e-02 4.211892867847180644e-02 +4.749250921734812437e+04 4.768208143331754793e-03 3.122083660459655605e-03 +4.759124624274801317e+04 3.789786578454373660e-03 2.893324769169210598e-03 +4.768998326814790926e+04 3.674790903092091631e-05 3.231044244887256388e-05 +4.778872029354780534e+04 5.297635706354987713e-03 3.397895095912691586e-03 +4.788745731894769415e+04 8.309547615164558643e-03 4.056861854425213888e-03 +4.798619434434759023e+04 3.346258728890327133e-02 1.102338452643462398e-02 +4.808493136974747176e+04 2.061948302149107792e-01 3.997588747154007943e-02 +4.818366839514736785e+04 4.185733457312491579e-01 5.298775280938682053e-02 +4.828240542054726393e+04 4.407257078163547281e-01 4.749031111390054211e-02 +4.838114244594715274e+04 4.820566828252449976e-01 4.794114431595958986e-02 +4.847987947134704882e+04 3.357725134572053793e-01 3.507966247224638540e-02 +4.857861649674693763e+04 1.306900891788747021e-01 1.658527549687540889e-02 +4.867735352214683371e+04 5.258232164748823795e-02 1.080458183467830971e-02 +4.877609054754672979e+04 4.082852417822320501e-02 2.605030331815340328e-02 +4.887482757294661133e+04 4.582626257337183914e-03 1.743643394913906497e-03 +4.897356459834650741e+04 1.839531964968694686e-02 1.053258735114823846e-02 +4.907230162374639622e+04 1.996986815450408660e-03 1.996917633652768673e-03 +4.917103864914629230e+04 2.680302010314410522e-09 2.631349937744336950e-09 +4.926977567454618838e+04 9.650751267749283629e-03 8.594382335073348644e-03 +4.936851269994607719e+04 1.373684487017962953e-02 8.440466040153983204e-03 +4.946724972534597327e+04 2.602102817222929840e-02 1.499695910834346682e-02 +4.956598675074586208e+04 1.240519662818638860e-02 6.589271101247681957e-03 +4.966472377614575089e+04 1.782893360287703921e-10 1.782392732575150865e-10 +4.976346080154564697e+04 2.863306115436366553e-02 2.397569035107240815e-02 +4.986219782694553578e+04 7.082907034664875402e-03 5.837648000536798873e-03 +4.996093485234542459e+04 3.976215319097742285e-02 2.764255525303102590e-02 +5.005967187774532067e+04 1.926507253827558497e-02 1.372343388931021244e-02 +5.015840890314521675e+04 3.933695584656272254e-03 3.931869857434680711e-03 +5.025714592854511284e+04 1.947130537984243567e-03 1.793134089163926940e-03 +5.035588295394500165e+04 2.791342958932544263e-02 1.879802073527336165e-02 +5.045461997934488318e+04 7.094624216537496163e-03 4.355565350412788674e-03 +5.055335700474477926e+04 3.516129883020304575e-02 1.939596206779119203e-02 +5.065209403014467534e+04 6.018527355985923977e-02 3.624855817093063093e-02 +5.075083105554456415e+04 1.726695840774864210e-01 3.609894659274699713e-02 +5.084956808094446023e+04 3.345552769028725670e-01 4.664126825764762507e-02 +5.094830510634434904e+04 6.372049442784988305e-01 7.020010351556120465e-02 +5.104704213174424513e+04 1.042407666206541794e+00 8.983939345760010020e-02 +5.114577915714414121e+04 8.968424029676367315e-01 6.834634743214483554e-02 +5.124451618254402274e+04 6.044973931943001810e-01 5.672406059183502519e-02 +5.134325320794391882e+04 2.422464576849805984e-01 2.751556242639784100e-02 +5.144199023334380763e+04 9.049446371649362553e-02 1.782501714826338277e-02 +5.154072725874370371e+04 1.586933908090212841e-02 4.454704296563123320e-03 +5.163946428414359980e+04 1.074374348975794952e-02 3.498794114480577745e-03 +5.173820130954348861e+04 7.661965580596564497e-04 6.853506476543362374e-04 +5.183693833494338469e+04 4.824396593986118864e-03 4.392693327923996582e-03 +5.193567536034327350e+04 1.731596811634679087e-02 1.078994682668084001e-02 +5.203441238574316230e+04 7.556709608403618279e-03 4.967539818107618091e-03 +5.213314941114305839e+04 1.895445909036172884e-03 1.442181343829516569e-03 +5.223188643654294719e+04 3.399128145777715465e-02 1.945526493424447681e-02 +5.233062346194284328e+04 2.239169929543385895e-02 1.553147552847735854e-02 +5.242936048734273209e+04 5.698294552193542556e-02 3.447633887985517009e-02 +5.252809751274262817e+04 1.367419375684860994e-01 5.231144009970667419e-02 +5.262683453814252425e+04 2.557897956212362711e-01 5.385377716983930085e-02 +5.272557156354241306e+04 1.015849716194416663e+00 1.063923310725386623e-01 +5.282430858894230187e+04 1.627236027695228682e+00 1.341069178046311872e-01 +5.292304561434219067e+04 2.179921797602545563e+00 1.579694864224764628e-01 +5.302178263974208676e+04 2.217593095619758703e+00 1.479221831822342126e-01 +5.312051966514197557e+04 1.599444781882030320e+00 1.199493246520820511e-01 +5.321925669054187165e+04 6.947625255523861565e-01 6.768307086417703344e-02 +5.331799371594176046e+04 2.728695714514948745e-01 4.875832140475057364e-02 +5.341673074134165654e+04 8.382167025363040924e-02 1.809183231865344951e-02 +5.351546776674155262e+04 1.894836383711543185e-02 5.700111656888878255e-03 +5.361420479214143415e+04 3.264019985613225705e-02 1.627796861026056807e-02 +5.371294181754133024e+04 2.159717319839687608e-02 2.097095144517884674e-02 +5.381167884294121905e+04 5.755044941501361207e-03 4.296769603343542424e-03 +5.391041586834111513e+04 1.927855129335864304e-03 1.845976804878792562e-03 +5.400915289374101121e+04 1.377398003067858631e-03 1.264426633202369796e-03 +5.410788991914090002e+04 3.137501118948234774e-02 1.307007532957529111e-02 +5.420662694454079610e+04 2.046155775987576475e-02 9.966332147283214760e-03 +5.430536396994068491e+04 4.784585819708628979e-02 2.069446451030557133e-02 +5.440410099534057372e+04 1.146691965625543964e-02 9.009942442203567117e-03 +5.450283802074046980e+04 6.508201721474350665e-02 4.143672623730085963e-02 +5.460157504614035861e+04 1.122447508210974373e-02 1.029561575297748173e-02 +5.470031207154025469e+04 1.755592737214111548e-02 8.864649332680810470e-03 +5.479904909694014350e+04 1.681140320275804553e-02 9.174473445346430570e-03 +5.489778612234003958e+04 2.415144883356433111e-02 1.470523446498323006e-02 +5.499652314773993567e+04 1.822354976641010760e-02 9.068531647210290036e-03 +5.509526017313982447e+04 5.221043662950735839e-03 3.049400270324493980e-03 +5.519399719853971328e+04 5.119300395988300029e-02 2.797673502251295241e-02 +5.529273422393960209e+04 1.934072664229860225e-02 1.108202307740004111e-02 +5.539147124933949817e+04 9.287652608844839536e-03 5.419788928143078055e-03 +5.549020827473939426e+04 1.245135899195386892e-02 5.588841989387167454e-03 +5.558894530013928306e+04 9.751735386651659565e-03 6.581987134172063297e-03 +5.568768232553917915e+04 5.835162552107413247e-03 3.823000951715674594e-03 +5.578641935093906795e+04 3.747351947131127153e-02 2.188511420309796965e-02 +5.588515637633895676e+04 3.269501311991898640e-02 1.655035359771953041e-02 +5.598389340173884557e+04 5.463270251716811909e-02 2.706664220469336482e-02 +5.608263042713874165e+04 3.488880493458246940e-02 1.586346016878057569e-02 +5.618136745253863046e+04 1.259948609367472216e-01 3.112235528066849277e-02 +5.628010447793852654e+04 4.248587251053809188e-01 6.457161324420354620e-02 +5.637884150333842263e+04 1.020066077392166592e+00 9.614820986200331432e-02 +5.647757852873831143e+04 1.636837565122655214e+00 1.150247467416066066e-01 +5.657631555413820752e+04 2.330176799516184616e+00 1.398997585227800822e-01 +5.667505257953809632e+04 2.598094407543442674e+00 1.450168370841496412e-01 +5.677378960493798513e+04 2.166619122902091465e+00 1.266005776977965624e-01 +5.687252663033788122e+04 1.434139020554807464e+00 1.021108653982994580e-01 +5.697126365573777002e+04 5.818532171043162560e-01 5.881941964382884913e-02 +5.707000068113766611e+04 1.477379195982981841e-01 2.634606767554712597e-02 +5.716873770653755491e+04 6.267107800077013902e-02 1.606836957022046708e-02 +5.726747473193745100e+04 4.146621573587011556e-02 2.267059504620240820e-02 +5.736621175733734708e+04 6.700828677467796091e-03 4.339881645315286744e-03 +5.746494878273722861e+04 2.069801706996226773e-02 1.022647611865956305e-02 +5.756368580813712470e+04 1.411942058017014515e-02 7.414733103074608485e-03 +5.766242283353701350e+04 2.653849305444499454e-04 2.650093545275887335e-04 +5.776115985893690959e+04 2.826747264514857180e-03 2.295895339650751155e-03 +5.785989688433680567e+04 5.179265503006971966e-04 3.851296417368790825e-04 +5.795863390973669448e+04 7.193942766835310573e-03 7.020823690797297657e-03 +5.805737093513659056e+04 2.316628654274086041e-02 1.854983460341351129e-02 +5.815610796053647937e+04 7.454686791392182771e-04 6.225164663513344356e-04 +5.825484498593636818e+04 1.976221482081981853e-02 1.180454674559109664e-02 +5.835358201133626426e+04 1.020908057663684303e-02 4.707214477474647857e-03 +5.845231903673615307e+04 1.677352632231503271e-02 9.567745899532850012e-03 +5.855105606213604915e+04 2.908167439349671618e-02 1.190655354121939249e-02 +5.864979308753593796e+04 4.391595036971583654e-02 1.386982699914952530e-02 +5.874853011293583404e+04 1.405639065240177066e-01 2.627790290852575344e-02 +5.884726713833572285e+04 2.277557007535643274e-01 3.079877320995556833e-02 +5.894600416373561893e+04 4.739148196187575324e-01 4.424006768233416931e-02 +5.904474118913550774e+04 1.021500687429193421e+00 6.254149477990597616e-02 +5.914347821453539655e+04 1.528949396734543775e+00 7.462231702779899278e-02 +5.924221523993529263e+04 1.536548105525394448e+00 7.570864166901597470e-02 +5.934095226533518144e+04 1.243322093087571911e+00 6.507287823214878697e-02 +5.943968929073507752e+04 9.717782655291073990e-01 5.771175840953533115e-02 +5.953842631613497360e+04 4.814026007911412774e-01 3.906110011467400778e-02 +5.963716334153486241e+04 2.134385627956274789e-01 2.444830040006309643e-02 +5.973590036693475849e+04 6.761381444389896744e-02 1.342108770014713987e-02 +5.983463739233464003e+04 2.055911441584461902e-02 5.428968801716012316e-03 +5.993337441773453611e+04 6.989943349032395198e-03 3.106010409698094655e-03 +6.003211144313442492e+04 4.705876881464667039e-02 2.421217822291396593e-02 +6.013084846853432100e+04 1.153587609912934756e-02 7.197617058580618558e-03 +6.022958549393421708e+04 7.589139094547042892e-03 5.376268574957988357e-03 +6.032832251933410589e+04 3.318133977168608723e-02 1.341108671852847198e-02 +6.042705954473400197e+04 5.356215935402931436e-03 3.260732561612472800e-03 +6.052579657013389078e+04 2.896836380648518811e-02 1.645073807789969311e-02 +6.062453359553377959e+04 1.180386628090717522e-03 7.518350780855152272e-04 +6.072327062093366840e+04 2.363458783041476330e-02 1.253176607875863303e-02 +6.082200764633356448e+04 2.170988346756397291e-02 8.923505560459924976e-03 +6.092074467173346056e+04 4.795927700383895154e-03 3.462600361514708066e-03 +6.101948169713334937e+04 1.822114868887392963e-02 9.582672100997934386e-03 +6.111821872253324545e+04 1.143980408139550625e-02 9.382122290504339018e-03 +6.121695574793313426e+04 6.284491597385686613e-03 3.634297702725091100e-03 +6.131569277333303035e+04 2.877176546881496030e-02 1.453296332617189969e-02 +6.141442979873291915e+04 5.810405885667486656e-03 3.768241938992845583e-03 +6.151316682413280796e+04 6.040525058103280581e-03 4.420564705539459412e-03 +6.161190384953270404e+04 8.504798195453076512e-03 7.033609683624562903e-03 +6.171064087493259285e+04 1.520819917656585606e-02 1.311966917438348208e-02 +6.180937790033248166e+04 4.453518697166926679e-03 2.709483909481730755e-03 +6.190811492573239229e+04 3.717279168195555556e-03 2.062904427406497734e-03 +6.200685195113227383e+04 1.361873171983303890e-02 7.277037379264745566e-03 +6.210558897653215536e+04 5.825995298289712854e-03 3.619070626075355027e-03 +6.220432600193205872e+04 1.391507661913972231e-02 7.455072735017837481e-03 +6.230306302733194025e+04 2.731186372248157329e-02 1.120780650335533556e-02 +6.240180005273185088e+04 1.483741174747107115e-02 8.979212387115418151e-03 +6.250053707813173241e+04 2.732335428883027328e-02 1.123783560099039097e-02 +6.259927410353161395e+04 1.741501352991600693e-02 8.596213571644679627e-03 +6.269801112893152458e+04 3.006593420011337975e-02 1.595440519556573511e-02 +6.279674815433140611e+04 4.337637354712394616e-02 1.990738856640062587e-02 +6.289548517973130947e+04 7.410842585889666594e-03 4.947540437173618758e-03 +6.299422220513119100e+04 1.680444619722943483e-02 8.540931023031385697e-03 +6.309295923053107254e+04 1.284105654081784363e-02 5.993075767667605316e-03 +6.319169625593098317e+04 5.263070131063911361e-03 2.369250930699835604e-03 +6.329043328133086470e+04 1.155078503942032729e-02 8.712052225252829921e-03 +6.338917030673077534e+04 4.403071309513151982e-02 1.789406941453962688e-02 +6.348790733213065687e+04 2.762577593273099139e-02 1.104276376325204201e-02 +6.358664435753053840e+04 1.354222696477118404e-02 5.424680932397077382e-03 +6.368538138293044176e+04 3.869297119475575281e-02 1.115204653088915261e-02 +6.378411840833032329e+04 5.013039995072577498e-02 1.329033399561278632e-02 +6.388285543373023393e+04 8.712319834363799198e-02 1.492588264956866764e-02 +6.398159245913011546e+04 1.671080703226045516e-01 2.053703903636652089e-02 +6.408032948452999699e+04 4.474572806378308010e-01 3.517889344032720106e-02 +6.417906650992990762e+04 8.444162191445500065e-01 4.872498866451636240e-02 +6.427780353532978916e+04 1.652598923112409635e+00 6.315178584862150835e-02 +6.437654056072969979e+04 2.579084284529606030e+00 7.837100784988908220e-02 +6.447527758612957405e+04 2.973140346011134749e+00 8.110499459318940008e-02 +6.457401461152945558e+04 2.852444515694879446e+00 7.905308203242999987e-02 +6.467275163692936621e+04 2.198688305064203430e+00 6.804533525312951581e-02 +6.477148866232924775e+04 1.258223432403541064e+00 5.056884522809032556e-02 +6.487022568772915838e+04 5.935600018033597713e-01 3.471089866927570822e-02 +6.496896271312903991e+04 3.335589882559422681e-01 2.625388824022662632e-02 +6.506769973852892144e+04 1.252638170362480319e-01 1.579017033508446285e-02 +6.516643676392883208e+04 5.184569018185858358e-02 1.051186318956044696e-02 +6.526517378932871361e+04 2.121742860916074266e-02 6.109828573297918126e-03 +6.536391081472860242e+04 2.504025919595082028e-02 1.043924386086643452e-02 +6.546264784012849850e+04 2.798502686467851247e-02 1.050335712292372291e-02 +6.556138486552838003e+04 2.128585069000409231e-03 8.489098629270340956e-04 +6.566012189092829067e+04 2.125164522731964878e-02 9.208016908816072169e-03 +6.575885891632817220e+04 2.078385273227080846e-02 8.722207697595513523e-03 +6.585759594172806828e+04 1.400599790522850593e-02 5.860709055641145741e-03 +6.595633296712796437e+04 1.796579058320966343e-02 8.985889964136704877e-03 +6.605506999252784590e+04 6.075013643804935345e-03 3.377136582653973013e-03 +6.615380701792775653e+04 1.116640778309102577e-02 4.890944559508182340e-03 +6.625254404332763806e+04 9.095350157401319718e-03 3.931191350960644773e-03 +6.635128106872751960e+04 1.494916719454702711e-02 8.538242957530564961e-03 +6.645001809412741568e+04 1.686812418472991015e-02 6.573211702558988227e-03 +6.654875511952729721e+04 5.693213004514204902e-03 2.623887970435577043e-03 +6.664749214492720785e+04 2.218398054070062214e-02 9.965745276224241209e-03 +6.674622917032708938e+04 1.836265806129743286e-02 7.671554809844623353e-03 +6.684496619572697091e+04 1.214068569365163094e-02 5.378330149923511716e-03 +6.694370322112688154e+04 6.570524528551961209e-03 2.615178555401616312e-03 +6.704244024652676308e+04 1.254873293586310570e-02 6.353009879800273173e-03 +6.714117727192667371e+04 1.524939947060548542e-02 5.887818765917810469e-03 +6.723991429732655524e+04 1.796773109935802942e-02 6.326755178377759491e-03 +6.733865132272643677e+04 1.477371892815255300e-02 6.213886479947779498e-03 +6.743738834812634741e+04 4.262041786369678148e-02 1.757538803702311109e-02 +6.753612537352622894e+04 3.641601899548685406e-02 1.070967418202546650e-02 +6.763486239892613958e+04 6.270710192278719508e-02 1.818040286589844498e-02 +6.773359942432602111e+04 1.279679673436490694e-01 2.456204464647887553e-02 +6.783233644972590264e+04 2.350919381472591219e-01 3.159350673039534180e-02 +6.793107347512581327e+04 6.177927696336539265e-01 5.435205644284034354e-02 +6.802981050052569481e+04 1.106770219723735238e+00 7.183587912774003215e-02 +6.812854752592559089e+04 2.222633872158759516e+00 9.673648531765226266e-02 +6.822728455132547242e+04 3.953407158268667398e+00 1.293765373773646532e-01 +6.832602157672535395e+04 5.342966480125904027e+00 1.470520169223791529e-01 +6.842475860212526459e+04 5.797230288862419201e+00 1.511018102765542825e-01 +6.852349562752514612e+04 5.199836995933031503e+00 1.413149753069841141e-01 +6.862223265292505675e+04 3.410737435116288019e+00 1.109514523916945300e-01 +6.872096967832493829e+04 1.898493642112106805e+00 8.207487462558638036e-02 +6.881970670372481982e+04 8.196496854874970595e-01 5.317304644096083888e-02 +6.891844372912473045e+04 4.904291127804921158e-01 4.306346141513130860e-02 +6.901718075452461198e+04 2.080993570150668215e-01 2.710384957396686639e-02 +6.911591777992452262e+04 9.757998268907186468e-02 1.774978458442671991e-02 +6.921465480532440415e+04 3.844036688333977991e-02 8.993975458096459610e-03 +6.931339183072428568e+04 1.727950235561289891e-02 6.555851695515917989e-03 +6.941212885612419632e+04 2.539650381895402695e-02 8.515987585663582771e-03 +6.951086588152407785e+04 1.284808507496461999e-02 4.615345630648777855e-03 +6.960960290692397393e+04 8.710702579721322017e-03 3.867416247276550187e-03 +6.970833993232385546e+04 1.083304655641152518e-02 5.485152324529131949e-03 +6.980707695772373700e+04 1.102711265274458792e-02 4.719889483418451652e-03 +6.990581398312364763e+04 2.347417257668192939e-02 9.120980492377387880e-03 +7.000455100852352916e+04 1.240081847430973654e-02 4.879908720457798096e-03 +7.010328803392343980e+04 1.969280364015857376e-02 7.116682342453520445e-03 +7.020202505932332133e+04 1.006885729498885676e-02 4.127013356881149321e-03 +7.030076208472320286e+04 2.474566973850646570e-02 1.074122905374115186e-02 +7.039949911012311350e+04 2.638626334631741233e-02 1.118547120548321269e-02 +7.049823613552299503e+04 1.340341884654251518e-02 4.597527211495666156e-03 +7.059697316092290566e+04 8.092095697534593124e-03 3.048135129554107453e-03 +7.069571018632278719e+04 1.301712221397138824e-02 4.888988961198170898e-03 +7.079444721172266873e+04 1.529125062943144896e-02 7.318368468767954584e-03 +7.089318423712257936e+04 1.230890186188666330e-02 6.797749583166316951e-03 +7.099192126252246089e+04 1.693957083869538152e-02 6.668533301409255987e-03 +7.109065828792235698e+04 1.636167940969444901e-02 5.192851741792706317e-03 +7.118939531332223851e+04 1.639604868171978119e-02 4.962568841863847398e-03 +7.128813233872212004e+04 1.210026956269389525e-02 4.514152683455315354e-03 +7.138686936412203067e+04 1.125204660659043752e-02 4.199978920446487303e-03 +7.148560638952191221e+04 9.871859395583260782e-03 3.432824617215782075e-03 +7.158434341492180829e+04 1.603111462225209269e-02 7.309538168972696051e-03 +7.168308044032170437e+04 1.012609035154983170e-02 3.517798647198679129e-03 +7.178181746572158590e+04 2.287067423040718001e-02 6.676985021504689387e-03 +7.188055449112149654e+04 3.993023382466047433e-02 1.284161199494192503e-02 +7.197929151652137807e+04 2.330798228684523993e-02 6.350912527254549272e-03 +7.207802854192125960e+04 1.571090390123226072e-02 7.717312453069416663e-03 +7.217676556732117024e+04 1.052385564327236282e-02 4.332042239620918951e-03 +7.227550259272105177e+04 1.649901870203039980e-02 4.979581674646777097e-03 +7.237423961812096240e+04 7.019179077072711451e-03 2.450875260381360932e-03 +7.247297664352084394e+04 3.680119619671724795e-02 1.155443945851213940e-02 +7.257171366892072547e+04 2.354025931798834834e-02 7.712256154315321605e-03 +7.267045069432062155e+04 2.149225231655025464e-02 7.187600044778876505e-03 +7.276918771972050308e+04 1.484322192293343994e-02 4.550653181117215833e-03 +7.286792474512041372e+04 3.357154786397436447e-02 1.051747199605715909e-02 +7.296666177052029525e+04 1.718507504214672466e-02 5.527384001129841649e-03 +7.306539879592017678e+04 1.824787150910771316e-02 5.605350443904396143e-03 +7.316413582132008742e+04 3.964599870341227114e-03 1.637772943024676372e-03 +7.326287284671996895e+04 1.255521812621984180e-02 4.480009864069541686e-03 +7.336160987211987958e+04 1.283633057907204028e-02 5.012118953777239781e-03 +7.346034689751976111e+04 9.835522245104876687e-03 3.884538099609104265e-03 +7.355908392291964265e+04 8.362077570318836306e-03 2.971403001892694400e-03 +7.365782094831955328e+04 1.754769227552553310e-02 7.225105284000486218e-03 +7.375655797371943481e+04 1.303209767831267109e-02 3.769704635655962786e-03 +7.385529499911934545e+04 1.401959309510660001e-02 6.039319825226934120e-03 +7.395403202451922698e+04 1.067906549629703446e-02 3.480906637958810102e-03 +7.405276904991910851e+04 1.233101291199252200e-02 4.998656328586223961e-03 +7.415150607531901915e+04 1.999151303436767779e-02 5.792407679990280514e-03 +7.425024310071890068e+04 2.257045374107598951e-02 7.762949323274434890e-03 +7.434898012611879676e+04 2.523341791719031432e-02 8.771590734126095967e-03 +7.444771715151867829e+04 3.231343249967349313e-02 1.156182274479718858e-02 +7.454645417691855982e+04 1.904015547612526379e-02 5.119174175438773525e-03 +7.464519120231847046e+04 8.365337805071038080e-03 2.313810859048539680e-03 +7.474392822771835199e+04 1.998912509906659862e-02 6.163229891680288737e-03 +7.484266525311826263e+04 1.291841753924076290e-02 4.681482905593036155e-03 +7.494140227851814416e+04 2.354618328394246854e-02 7.045852094358791631e-03 +7.504013930391802569e+04 1.834464323683401149e-02 5.492893537278850311e-03 +7.513887632931793632e+04 2.040303414659123266e-02 7.080451947783768761e-03 +7.523761335471781786e+04 1.604048070719746658e-02 4.546152692154112156e-03 +7.533635038011771394e+04 2.063470201965447379e-02 7.444115231976127824e-03 +7.543508740551761002e+04 1.065920169149984185e-02 3.832226273415492279e-03 +7.553382443091749155e+04 1.555113409683109987e-02 4.807715210484084754e-03 +7.563256145631740219e+04 1.584974068004851855e-02 6.470358564082843641e-03 +7.573129848171728372e+04 2.476315104346040949e-02 7.900014806076103777e-03 +7.583003550711716525e+04 2.063319010770280071e-02 5.265361163772339093e-03 +7.592877253251706134e+04 4.410846012451772463e-02 1.096151940360090039e-02 +7.602750955791694287e+04 4.277393686433178521e-02 1.002071947506441053e-02 +7.612624658331685350e+04 7.890421755156028227e-02 1.076674306990801043e-02 +7.622498360871673503e+04 1.804498898855126376e-01 1.609155345796688813e-02 +7.632372063411663112e+04 2.660727209274787453e-01 1.905411200243093545e-02 +7.642245765951652720e+04 6.035208813003150041e-01 2.919133922453754845e-02 +7.652119468491640873e+04 1.280713168145693137e+00 4.611244762295949734e-02 +7.661993171031631937e+04 2.372162463955740819e+00 6.477777189110371647e-02 +7.671866873571620090e+04 3.750057927692217241e+00 8.205342073093946365e-02 +7.681740576111609698e+04 4.776043318094154166e+00 9.213786777625984636e-02 +7.691614278651599307e+04 4.814788794626664092e+00 9.195783200063238627e-02 +7.701487981191587460e+04 4.025068943030094992e+00 8.245788243419654995e-02 +7.711361683731578523e+04 2.681608785831841590e+00 6.420857297280227471e-02 +7.721235386271566676e+04 1.423057791534949601e+00 4.270192887818282518e-02 +7.731109088811556285e+04 7.177894946661340647e-01 2.926826771795905044e-02 +7.740982791351544438e+04 3.944063982700704019e-01 2.135163040721476876e-02 +7.750856493891532591e+04 2.150570114164524205e-01 1.533149447367750454e-02 +7.760730196431523655e+04 1.333184499790571464e-01 1.343678097643825203e-02 +7.770603898971511808e+04 5.144433334198395685e-02 7.113419345030554640e-03 +7.780477601511501416e+04 5.931753117638190187e-02 1.398835749653116155e-02 +7.790351304051491024e+04 2.261448286769286026e-02 5.262215238582600499e-03 +7.800225006591479178e+04 3.241975195984738572e-02 8.629035601259410493e-03 +7.810098709131470241e+04 1.800701610660246366e-02 5.842715987040210043e-03 +7.819972411671458394e+04 2.613567279299103263e-02 8.489608893616268706e-03 +7.829846114211448003e+04 1.782058238872286440e-02 5.089643509102585207e-03 +7.839719816751437611e+04 2.809471606181437875e-02 8.943348801923786326e-03 +7.849593519291425764e+04 1.350862639652721138e-02 6.059042562726320129e-03 +7.859467221831416828e+04 2.718547485258600294e-02 8.393942573657272449e-03 +7.869340924371404981e+04 1.918566420658900790e-02 7.200324330118202006e-03 +7.879214626911394589e+04 1.961095053768941235e-02 6.577641275598672746e-03 +7.889088329451384197e+04 1.044172956320922781e-02 3.784635478597252276e-03 +7.898962031991370895e+04 2.091048266597806890e-02 7.082983625335922961e-03 +7.908835734531361959e+04 2.464510450719945012e-02 7.682981145079952577e-03 +7.918709437071350112e+04 1.440825259495429229e-02 4.478509086008430722e-03 +7.928583139611338265e+04 1.327886786551254160e-02 4.155907716649860466e-03 +7.938456842151329329e+04 2.192759790330769953e-02 7.437765416776921830e-03 +7.948330544691317482e+04 2.059133884577685550e-02 7.741280490132652035e-03 +7.958204247231308545e+04 1.324942189308039864e-02 4.941440937554397901e-03 +7.968077949771296699e+04 2.721771274176564698e-02 7.790257641800467023e-03 +7.977951652311284852e+04 1.756015939037220558e-02 6.179779770399221675e-03 +7.987825354851275915e+04 1.929238139495809135e-02 7.369493937388280243e-03 +7.997699057391264068e+04 3.075557005047972400e-02 9.107160659227722319e-03 +8.007572759931255132e+04 2.254811398331361613e-02 6.531577947055363167e-03 +8.017446462471243285e+04 8.981928105869008139e-03 2.556214413866271778e-03 +8.027320165011231438e+04 2.110966313626668270e-02 8.499647393460698849e-03 +8.037193867551222502e+04 2.153613527452239579e-02 7.016680482904220049e-03 +8.047067570091210655e+04 2.565282053188230535e-02 8.062931759900408835e-03 +8.056941272631198808e+04 1.399067413680941084e-02 5.632754265830055250e-03 +8.066814975171188416e+04 2.524436155020963468e-02 7.902496627398806692e-03 +8.076688677711176570e+04 3.993359311742828571e-02 1.122193053875067577e-02 +8.086562380251167633e+04 2.215722572915755292e-02 6.146559229717819643e-03 +8.096436082791155786e+04 1.106254604316442465e-02 3.931830463242530146e-03 +8.106309785331145395e+04 2.125288115027991476e-02 6.968966850862547135e-03 +8.116183487871135003e+04 1.558982582333470063e-02 5.552898676870718017e-03 +8.126057190411123156e+04 3.627502468630566107e-02 8.765237614275597777e-03 +8.135930892951114220e+04 1.540332860660220682e-02 5.439197780575865011e-03 +8.145804595491102373e+04 1.975976540219236133e-02 6.243312163916820215e-03 +8.155678298031091981e+04 1.618737272838396968e-02 5.945058357153324737e-03 +8.165552000571081589e+04 1.267232120727873439e-02 3.543183267207637190e-03 +8.175425703111069743e+04 2.398112020899129809e-02 7.727138278620301025e-03 +8.185299405651060806e+04 1.537234445743676341e-02 5.276824485259326049e-03 +8.195173108191048959e+04 1.904455019914844463e-02 6.574249236612482103e-03 +8.205046810731038568e+04 1.714200331893996065e-02 5.495202382395588531e-03 +8.214920513271026721e+04 2.475932111974030181e-02 8.474416774887784387e-03 +8.224794215811014874e+04 3.508832720613136447e-02 9.112606905796584097e-03 +8.234667918351005937e+04 3.751561017389858782e-02 8.957701962356311165e-03 +8.244541620890994091e+04 1.494240391764991259e-02 4.273327583545385999e-03 +8.254415323430983699e+04 4.084302083327678162e-02 9.139670443931201607e-03 +8.264289025970973307e+04 2.582489050356067892e-02 6.393203360381604847e-03 +8.274162728510961460e+04 3.629958085067010176e-02 6.672463516011923300e-03 +8.284036431050952524e+04 4.216209981420901420e-02 7.172174660191860292e-03 +8.293910133590940677e+04 6.658404605041109980e-02 8.130440079271415016e-03 +8.303783836130930285e+04 1.008914642434451114e-01 8.541150750604801362e-03 +8.313657538670919894e+04 1.757967606316701015e-01 9.974351315741706442e-03 +8.323531241210908047e+04 3.203342469480253141e-01 1.425562439930362808e-02 +8.333404943750899110e+04 6.420826932988090707e-01 2.127279106608200021e-02 +8.343278646290887264e+04 1.148233095004000726e+00 2.868701182332939956e-02 +8.353152348830876872e+04 1.869054262056829341e+00 3.725416331986380197e-02 +8.363026051370865025e+04 2.869234878907897190e+00 4.682553249808787260e-02 +8.372899753910853178e+04 3.391826206734371851e+00 5.074890895511888211e-02 +8.382773456450844242e+04 3.234870066177687242e+00 4.881309844480135468e-02 +8.392647158990832395e+04 2.715900507994458923e+00 4.428417467714635541e-02 +8.402520861530822003e+04 1.829003313799779873e+00 3.502379808550442480e-02 +8.412394564070811612e+04 1.086033003241590800e+00 2.630476328447101456e-02 +8.422268266610799765e+04 6.320756920725320027e-01 1.947346189863696092e-02 +8.432141969150790828e+04 3.456193421137829791e-01 1.377164585086839560e-02 +8.442015671690778981e+04 2.036300821570877773e-01 1.156327466844248725e-02 +8.451889374230768590e+04 1.337969604401227919e-01 9.474020925042195285e-03 +8.461763076770758198e+04 6.824223319602258642e-02 7.504233751693346367e-03 +8.471636779310746351e+04 3.329480289518185060e-02 3.838061519429399483e-03 +8.481510481850737415e+04 3.279505352745215596e-02 6.489808339834032130e-03 +8.491384184390725568e+04 2.471961240783777589e-02 5.601329049166781267e-03 +8.501257886930713721e+04 1.839195068699904512e-02 5.176065949271803183e-03 +8.511131589470704785e+04 2.050837641138364073e-02 5.281726251141191653e-03 +8.521005292010692938e+04 1.655998291064306183e-02 4.798155789223098461e-03 +8.530878994550682546e+04 1.776164046305733768e-02 4.963199418141491653e-03 +8.540752697090670699e+04 2.560871739703381167e-02 6.872035830964583897e-03 +8.550626399630658852e+04 2.325364863385066816e-02 5.562367256768827907e-03 +8.560500102170649916e+04 3.213456943591332798e-02 7.705885335597760510e-03 +8.570373804710638069e+04 3.399239020533214445e-02 8.940310415612554712e-03 +8.580247507250629133e+04 2.678036299317203273e-02 6.478965331190682242e-03 +8.590121209790617286e+04 1.228757385887305036e-02 3.419004030006092022e-03 +8.599994912330605439e+04 2.117185064258663568e-02 5.933639434239430972e-03 +8.609868614870596502e+04 1.216452554955756681e-02 4.490791018834749786e-03 +8.619742317410584656e+04 1.933933957886460261e-02 4.986212661246235134e-03 +8.629616019950574264e+04 1.620495904678079593e-02 4.656953306052116943e-03 +8.639489722490563872e+04 1.965792964738020607e-02 5.832086321658020746e-03 +8.649363425030552025e+04 2.934105598582327848e-02 6.792884505703012353e-03 +8.659237127570543089e+04 2.677040149230645871e-02 7.397897233973819119e-03 +8.669110830110531242e+04 2.523898724472543528e-02 6.193933541860863028e-03 +8.678984532650519395e+04 1.541468847792518831e-02 4.086412264249230340e-03 +8.688858235190509004e+04 1.705457345683433767e-02 4.628620453807890528e-03 +8.698731937730497157e+04 2.224558446074833759e-02 5.858373416313535781e-03 +8.708605640270488220e+04 2.434556462966885187e-02 7.145457777498636677e-03 +8.718479342810476373e+04 1.497795411268773753e-02 3.948514894436488606e-03 +8.728353045350465982e+04 1.151397806308196957e-02 3.193328156209764793e-03 +8.738226747890455590e+04 1.813934994503608664e-02 4.796153664665792939e-03 +8.748100450430443743e+04 1.955861878994388098e-02 5.474281729807397787e-03 +8.757974152970434807e+04 1.529550246360854987e-02 4.328950670766543683e-03 +8.767847855510422960e+04 2.494991429475045680e-02 6.703513196146839576e-03 +8.777721558050412568e+04 2.233449057072427191e-02 5.364635390701074334e-03 +8.787595260590402177e+04 1.312082030636955131e-02 4.161324439009071383e-03 +8.797468963130390330e+04 2.964572331158243923e-02 6.776465524460550255e-03 +8.807342665670381393e+04 3.442731836233856729e-02 7.724580313728548336e-03 +8.817216368210369546e+04 1.442262064171900490e-02 4.550234479394263225e-03 +8.827090070750359155e+04 2.883317409757105501e-02 7.424240644414302655e-03 +8.836963773290347308e+04 2.333215346572568155e-02 5.427661675752763065e-03 +8.846837475830335461e+04 1.607317146112512488e-02 4.385827769227149120e-03 +8.856711178370326525e+04 1.260312837401929807e-02 3.059935616111015676e-03 +8.866584880910314678e+04 2.515612987922470623e-02 5.921551043153081527e-03 +8.876458583450304286e+04 1.984785043070172450e-02 4.673692516615906428e-03 +8.886332285990293894e+04 1.974448481071469641e-02 4.823022397044936585e-03 +8.896205988530282048e+04 1.650455819721990611e-02 5.040415310860761090e-03 +8.906079691070273111e+04 1.700432233796388831e-02 4.559424074724146431e-03 +8.915953393610261264e+04 1.136974275313906886e-02 3.233788256783915772e-03 +8.925827096150250873e+04 2.450293329747424767e-02 6.746757082413809212e-03 +8.935700798690240481e+04 1.870374812907321313e-02 4.930792346757423804e-03 +8.945574501230228634e+04 2.943697432925171387e-02 6.628336138202282381e-03 +8.955448203770219698e+04 1.771584265705800770e-02 4.454293716747099834e-03 +8.965321906310207851e+04 1.892379721400290135e-02 4.217272037551098723e-03 +8.975195608850197459e+04 1.911574369385349303e-02 4.862169864060908279e-03 +8.985069311390185612e+04 3.012582268310826442e-02 6.301654417963337834e-03 +8.994943013930173765e+04 1.818623775590015937e-02 5.285940328088620764e-03 +9.004816716470164829e+04 1.472351906200837675e-02 4.372840550129739740e-03 +9.014690419010152982e+04 2.166399804963678455e-02 5.510099569521398864e-03 +9.024564121550141135e+04 2.622883493490298784e-02 5.846783552795122539e-03 +9.034437824090132199e+04 2.771343745331032032e-02 6.364201625436374452e-03 +9.044311526630120352e+04 2.065899868481141030e-02 4.689975063480472488e-03 +9.054185229170111415e+04 1.983152041247815064e-02 4.558838429001141855e-03 +9.064058931710099569e+04 1.571561031308577050e-02 3.579266819742729644e-03 +9.073932634250087722e+04 1.867557531322048409e-02 4.849408123692854934e-03 +9.083806336790078785e+04 1.764737007319051865e-02 4.535068527070341103e-03 +9.093680039330066938e+04 2.232089751425914148e-02 4.824978449611674880e-03 +9.103553741870058002e+04 2.098735971399114109e-02 4.856030378000828450e-03 +9.113427444410046155e+04 1.167323515283696586e-02 3.295395132152771807e-03 +9.123301146950034308e+04 1.752268640311514802e-02 3.990333558226877471e-03 +9.133174849490025372e+04 2.047272975374735127e-02 4.461322958655706238e-03 +9.143048552030013525e+04 2.385686581489750505e-02 5.332121168635048196e-03 +9.152922254570003133e+04 1.330359944611267387e-02 3.338502534850914128e-03 +9.162795957109991286e+04 2.059309180568524855e-02 4.706131361939224801e-03 +9.172669659649979440e+04 1.851126239599548695e-02 4.294239340336463047e-03 +9.182543362189970503e+04 2.187382679517753392e-02 4.804374688088537682e-03 +9.192417064729958656e+04 2.359959192792550342e-02 6.178884270935181347e-03 +9.202290767269948265e+04 2.395035859249212973e-02 6.179409975013787013e-03 +9.212164469809937873e+04 2.329225787838760248e-02 5.244577302418434311e-03 +9.222038172349926026e+04 2.312139793746390351e-02 5.079540954090468532e-03 +9.231911874889917090e+04 1.903281053858614166e-02 4.417797455221374701e-03 +9.241785577429905243e+04 1.661395341643055398e-02 3.630658689701469263e-03 +9.251659279969894851e+04 2.447996982429767945e-02 5.092610579068283794e-03 +9.261532982509884459e+04 1.478765424525689716e-02 3.594138055360240891e-03 +9.271406685049872613e+04 2.102860337227272294e-02 5.263754682826954530e-03 +9.281280387589863676e+04 1.827497952720784358e-02 4.251426971617038551e-03 +9.291154090129851829e+04 1.464682960244488574e-02 3.417343926157982974e-03 +9.301027792669839982e+04 1.229953000799847464e-02 3.445491459146127113e-03 +9.310901495209829591e+04 1.769043813759408473e-02 4.530820419385007264e-03 +9.320775197749817744e+04 2.128180901144216541e-02 5.672076524243142674e-03 +9.330648900289808807e+04 2.177045147429016239e-02 5.386204211246251733e-03 +9.340522602829796961e+04 2.510333963278838995e-02 6.489892122452521790e-03 +9.350396305369786569e+04 3.263383066680536349e-02 6.917165100373715708e-03 +9.360270007909776177e+04 2.116146915712062426e-02 5.168680040420091035e-03 +9.370143710449764330e+04 2.453862885871153920e-02 5.665344554822335753e-03 +9.380017412989755394e+04 2.291098388765138924e-02 5.065819701071624416e-03 +9.389891115529743547e+04 1.970193430399270682e-02 4.177456373092611891e-03 +9.399764818069733155e+04 2.437644082891466529e-02 5.034148262713149420e-03 +9.409638520609722764e+04 2.162841878670171067e-02 5.015296966110442331e-03 +9.419512223149710917e+04 2.550969850120585886e-02 5.550797778755018480e-03 +9.429385925689701980e+04 2.491803214852337384e-02 5.644315586010122815e-03 +9.439259628229690134e+04 4.052297097406381415e-02 7.233754509190202381e-03 +9.449133330769679742e+04 2.340785123635099468e-02 5.563148367516987727e-03 +9.459007033309667895e+04 2.432098681109357008e-02 5.060429967309945654e-03 +9.468880735849656048e+04 1.384066664651311535e-02 3.498876477083670469e-03 +9.478754438389647112e+04 1.388679287398145688e-02 3.437829558989043740e-03 +9.488628140929635265e+04 2.010266591462729624e-02 4.401184225355330576e-03 +9.498501843469624873e+04 1.886986155415380090e-02 4.383477782407390819e-03 +9.508375546009614482e+04 2.033292519237124216e-02 4.188321506238504299e-03 +9.518249248549602635e+04 2.959744647979398527e-02 6.339093134779170968e-03 +9.528122951089593698e+04 2.484954262187372143e-02 4.538584680872532855e-03 +9.537996653629581851e+04 2.160247792190938751e-02 4.378691335379135581e-03 +9.547870356169571460e+04 2.549942474247527541e-02 4.894169140899519779e-03 +9.557744058709561068e+04 1.826106888968672542e-02 4.368169834014331426e-03 +9.567617761249549221e+04 2.236895009067975046e-02 5.427812632631134719e-03 +9.577491463789540285e+04 1.784475931575882704e-02 3.850163823420155607e-03 +9.587365166329528438e+04 2.865198195199696041e-02 5.816787331608778110e-03 +9.597238868869516591e+04 2.268916446925091715e-02 4.821465481375048802e-03 +9.607112571409507655e+04 2.235022816578071184e-02 5.072681524094733649e-03 +9.616986273949494353e+04 3.162371694556070922e-02 6.937969114558542767e-03 +9.626859976489485416e+04 2.854584787187630646e-02 4.932706476641150403e-03 +9.636733679029473569e+04 1.512581803922605737e-02 3.851388506140901186e-03 +9.646607381569461722e+04 1.848458428788147395e-02 4.568171133128746952e-03 +9.656481084109452786e+04 1.459911674929508831e-02 3.716047635102861894e-03 +9.666354786649440939e+04 2.461054842859572434e-02 4.781191717447277542e-03 +9.676228489189432003e+04 1.863843320454933866e-02 3.757545069107624293e-03 +9.686102191729420156e+04 2.204939715468687972e-02 4.591691695362954892e-03 +9.695975894269408309e+04 2.278439817214427190e-02 4.722476803781711953e-03 +9.705849596809399372e+04 1.849492029411362037e-02 3.596450485334326715e-03 +9.715723299349387526e+04 2.530855867028467335e-02 6.325764441161568427e-03 +9.725597001889378589e+04 1.817889984923794916e-02 4.600355004272546275e-03 +9.735470704429366742e+04 1.562339426090144333e-02 3.400477996194053304e-03 +9.745344406969354895e+04 1.522747115617369661e-02 4.092325952368732443e-03 +9.755218109509345959e+04 1.336220869739880406e-02 3.643018622600999006e-03 +9.765091812049334112e+04 2.357995199799756830e-02 5.978246687903073474e-03 +9.774965514589322265e+04 2.860341246318475264e-02 5.309100144119956177e-03 +9.784839217129311874e+04 1.549844523908884032e-02 4.433424878942806603e-03 +9.794712919669300027e+04 3.267040706620168850e-02 7.594837027404838931e-03 +9.804586622209291090e+04 1.739907992499277814e-02 3.727049646327889286e-03 +9.814460324749279243e+04 1.739624859615881633e-02 4.591803254205001003e-03 +9.824334027289268852e+04 1.133742891483655729e-02 2.542973242364577648e-03 +9.834207729829258460e+04 2.149257570468228462e-02 5.259001133604756725e-03 +9.844081432369246613e+04 2.840399827889513590e-02 5.766208396923046611e-03 +9.853955134909237677e+04 1.759325339735537050e-02 4.079548468128080252e-03 +9.863828837449225830e+04 2.501363572746748490e-02 4.875769927966482585e-03 +9.873702539989215438e+04 2.128267577200889174e-02 4.595177353824860672e-03 +9.883576242529205047e+04 2.364411475952828828e-02 4.803548059064501920e-03 +9.893449945069193200e+04 1.992708679463881319e-02 4.110521608211165252e-03 +9.903323647609184263e+04 1.415693433809347979e-02 3.223351130159866559e-03 +9.913197350149172416e+04 2.575405939262676025e-02 5.514154650076565772e-03 +9.923071052689162025e+04 2.682321656397181758e-02 5.547036703416990434e-03 +9.932944755229150178e+04 4.464864986659217855e-02 8.027076528181232434e-03 +9.942818457769138331e+04 4.352089216837209951e-02 7.124825185643641513e-03 +9.952692160309129395e+04 5.468669805212322821e-02 7.796153049324081388e-03 +9.962565862849117548e+04 6.403375054722477977e-02 7.933322022894706560e-03 +9.972439565389107156e+04 9.901949288651716585e-02 1.020748084864639936e-02 +9.982313267929096764e+04 1.815370255746878436e-01 1.436567124912594036e-02 +9.992186970469084918e+04 3.236940091364343131e-01 2.083011558763743498e-02 +1.000206067300907598e+05 4.897206879004802893e-01 2.533467882054455181e-02 +1.001193437554906413e+05 7.932358656753725201e-01 3.424097796604308463e-02 +1.002180807808905374e+05 1.296907221639937768e+00 4.377257917897141304e-02 +1.003168178062904335e+05 1.830477168265426835e+00 5.170239067100924901e-02 +1.004155548316903150e+05 2.585731842421487237e+00 6.090865491882162253e-02 +1.005142918570902257e+05 3.513656679381454762e+00 7.139594411789283723e-02 +1.006130288824901072e+05 4.556396347369004118e+00 7.954580632456971501e-02 +1.007117659078900033e+05 5.679250584600906926e+00 8.709432813579422172e-02 +1.008105029332898848e+05 6.991834556075867901e+00 9.482274781398289387e-02 +1.009092399586897664e+05 8.334426209796797380e+00 1.004539146306840658e-01 +1.010079769840896770e+05 9.646633822715950046e+00 1.072197806494228495e-01 +1.011067140094895585e+05 9.833909025850763541e+00 1.088302272921111979e-01 +1.012054510348894546e+05 9.108737821393853906e+00 1.060366277375074662e-01 +1.013041880602893507e+05 7.798002099167939960e+00 1.003937157193326296e-01 +1.014029250856892322e+05 5.999327207431287334e+00 8.904500886243855995e-02 +1.015016621110891429e+05 4.669654667573546192e+00 8.098963167730106882e-02 +1.016003991364890244e+05 3.421455550489516551e+00 6.984290843980668628e-02 +1.016991361618889059e+05 2.421081242763490238e+00 5.874582795904192967e-02 +1.017978731872888166e+05 1.717762994132079335e+00 4.901242238793990930e-02 +1.018966102126886981e+05 1.213823766855935293e+00 4.143377196681238134e-02 +1.019953472380886087e+05 8.306896087473117918e-01 3.399650074328669502e-02 +1.020940842634884903e+05 5.442945920211252897e-01 2.703966072715289354e-02 +1.021928212888883718e+05 3.656011262105029469e-01 2.102758568774553902e-02 +1.022915583142882824e+05 2.318822130057800190e-01 1.677136459353634895e-02 +1.023902953396881639e+05 1.426995629867179594e-01 1.259419973893754173e-02 +1.024890323650880600e+05 9.236847032145288627e-02 1.054761774320981879e-02 +1.025877693904879416e+05 7.344264680782344734e-02 8.400508589925909445e-03 +1.026865064158878231e+05 4.015124913264288276e-02 6.594849089189991180e-03 +1.027852434412877337e+05 3.993056724402928304e-02 6.940575779991558364e-03 +1.028839804666876153e+05 2.561213902115024033e-02 5.126690515788494967e-03 +1.029827174920875113e+05 2.566874919157779641e-02 5.663149063594455357e-03 +1.030814545174874074e+05 2.108054731951908636e-02 4.300620720208321590e-03 +1.031801915428872890e+05 2.414236404460382013e-02 5.895733464253359070e-03 +1.032789285682871996e+05 2.450272036000404607e-02 7.448564287092914078e-03 +1.033776655936870811e+05 2.756213299169020178e-02 6.986059489086068712e-03 +1.034764026190869772e+05 1.604538723477634890e-02 3.745743416218668635e-03 +1.035751396444868733e+05 1.675614208521912160e-02 4.363321503935809614e-03 +1.036738766698867548e+05 2.637383521507356138e-02 5.800405551828011035e-03 +1.037726136952866655e+05 2.443233789981840570e-02 5.145723040320761971e-03 +1.038713507206865470e+05 1.987469916366351244e-02 5.556273291698529508e-03 +1.039700877460864285e+05 2.280903996202265221e-02 4.876067204728976381e-03 +1.040688247714863246e+05 1.834268113883791643e-02 5.915988854735240547e-03 +1.041675617968862061e+05 1.130080527945630763e-02 3.324230735271971413e-03 +1.042662988222861168e+05 3.061147689726928869e-02 7.106805901902658353e-03 +1.043650358476859983e+05 1.651895770867624347e-02 5.695719852154832938e-03 +1.044637728730858944e+05 1.973270473233798214e-02 4.648586177801299416e-03 +1.045625098984857905e+05 2.301256936155016836e-02 5.080504082015169405e-03 +1.046612469238856720e+05 1.272306995168138305e-02 3.320861384797323384e-03 +1.047599839492855826e+05 2.380207285071896800e-02 5.386932777748970787e-03 +1.048587209746854642e+05 1.353537515799270972e-02 3.419664365114221186e-03 +1.049574580000853457e+05 1.912862223371587789e-02 4.485525685258544976e-03 +1.050561950254852563e+05 2.430549923410614196e-02 6.018299973614591250e-03 +1.051549320508851379e+05 2.916806570113658972e-02 6.708926648985674701e-03 +1.052536690762850485e+05 2.000750970956305039e-02 5.174474563524321911e-03 +1.053524061016849300e+05 1.316412678322943092e-02 3.438715556446716570e-03 +1.054511431270848261e+05 2.603000830596418139e-02 6.109260834205206686e-03 +1.055498801524847077e+05 2.725166808832868437e-02 6.923731063650794514e-03 +1.056486171778845892e+05 1.508221182334300303e-02 5.442208267124824458e-03 +1.057473542032844998e+05 1.209206388184898111e-02 3.727049020434560801e-03 +1.058460912286843813e+05 2.773063421930348216e-02 6.392003601190499561e-03 +1.059448282540842774e+05 2.401059466075041240e-02 6.163650389475873112e-03 +1.060435652794841735e+05 1.346357322096484316e-02 3.585050608072514865e-03 +1.061423023048840550e+05 2.673249795478381888e-02 6.974837523980168506e-03 +1.062410393302839657e+05 1.133196302489014595e-02 3.947016835321197001e-03 +1.063397763556838472e+05 2.125613943085215632e-02 6.589799445109895473e-03 +1.064385133810837433e+05 2.476247273237256255e-02 5.819007949161443191e-03 +1.065372504064836394e+05 1.761796724162086047e-02 4.500385851199924757e-03 +1.066359874318835209e+05 1.463108399596725964e-02 5.113662798905589842e-03 +1.067347244572834315e+05 1.621399986382556641e-02 4.944329558910476839e-03 +1.068334614826833131e+05 1.719087102387332339e-02 4.668946981327633076e-03 +1.069321985080831946e+05 2.341090382913885506e-02 5.565263576507545676e-03 +1.070309355334831052e+05 1.660727562371568447e-02 4.587244502035722760e-03 +1.071296725588829722e+05 2.693907904038734744e-02 7.184992769566681502e-03 +1.072284095842828829e+05 1.550868687608713756e-02 4.377458015930369740e-03 +1.073271466096827644e+05 3.751080602070491071e-02 8.718381533055768670e-03 +1.074258836350826459e+05 1.571929425323914664e-02 4.424651869760848344e-03 +1.075246206604825566e+05 2.478592214472689209e-02 6.676602051471499169e-03 +1.076233576858824381e+05 2.895659421682326984e-02 6.555683319204719597e-03 +1.077220947112823487e+05 1.340378003956229150e-02 3.886798016111501792e-03 +1.078208317366822303e+05 1.764821876935140227e-02 5.543428106102535162e-03 +1.079195687620821118e+05 3.741327506091325639e-02 8.651612598916289323e-03 +1.080183057874820224e+05 1.999551038990740950e-02 5.804085421995875370e-03 +1.081170428128819040e+05 1.507372970899223050e-02 4.129814346450840987e-03 +1.082157798382818146e+05 2.538349922834590849e-02 8.044513884747014898e-03 +1.083145168636816961e+05 1.432773843696355694e-02 4.110008953428221853e-03 +1.084132538890815777e+05 1.321750193709976713e-02 4.354206836056467335e-03 +1.085119909144814883e+05 1.386142851963325338e-02 4.789742919470442971e-03 +1.086107279398813698e+05 2.616916311090092262e-02 6.705154925704377364e-03 +1.087094649652812659e+05 2.518278109254624975e-02 7.409093441334019085e-03 +1.088082019906811474e+05 2.222697865098150621e-02 5.805524255908760603e-03 +1.089069390160810290e+05 1.829696121744175952e-02 4.634112793036429187e-03 +1.090056760414809396e+05 3.465576028800138042e-02 9.328592037307886081e-03 +1.091044130668808211e+05 2.153142610950229546e-02 6.737050810402859906e-03 +1.092031500922807172e+05 1.031844609571793726e-02 3.188076583299964076e-03 +1.093018871176806133e+05 2.923071650886324702e-02 7.346987811812133277e-03 +1.094006241430804948e+05 1.583719102954574132e-02 4.489495399860080407e-03 +1.094993611684804055e+05 1.264405471323441776e-02 4.039707070370854129e-03 +1.095980981938802870e+05 1.872743018036947607e-02 4.927811688222700874e-03 +1.096968352192801831e+05 3.425026789131456473e-02 9.131916045570641349e-03 +1.097955722446800792e+05 8.875326331196945959e-03 2.677528469823349262e-03 +1.098943092700799607e+05 2.303464548621320454e-02 6.240166148751852965e-03 +1.099930462954798713e+05 1.545445208549334551e-02 4.690286690582219122e-03 +1.100917833208797529e+05 2.326064516773188040e-02 6.506719977604547012e-03 +1.101905203462796489e+05 2.012628253126299421e-02 5.680341535630749165e-03 +1.102892573716795305e+05 1.776665232060779809e-02 6.409505556696401887e-03 +1.103879943970794120e+05 4.506242707114415345e-03 1.541262948186655768e-03 +1.104867314224793226e+05 1.197758582957165856e-02 2.981841815359606920e-03 +1.105854684478792042e+05 2.501414559733364240e-02 6.725077342616063436e-03 +1.106842054732791003e+05 1.803571487236551793e-02 4.527820174969602283e-03 +1.107829424986789963e+05 3.385868175789535917e-02 9.220837722295757016e-03 +1.108816795240788779e+05 1.791647660440676484e-02 4.846933255794848294e-03 +1.109804165494787885e+05 3.267745580390099547e-02 7.975207126758422985e-03 +1.110791535748786700e+05 2.116276477428976135e-02 6.693026513934783109e-03 +1.111778906002785661e+05 1.933085474656070710e-02 4.759116350183074245e-03 +1.112766276256784622e+05 2.064136960242785035e-02 4.967956658837321439e-03 +1.113753646510783437e+05 2.163084152427280360e-02 7.779569584922649446e-03 +1.114741016764782544e+05 2.419772101032167250e-02 7.072148952983277684e-03 +1.115728387018781359e+05 2.581013964727395249e-02 7.391304593326167294e-03 +1.116715757272780320e+05 1.864961383996344493e-02 5.660078822938430752e-03 +1.117703127526779135e+05 2.026954429755800646e-02 5.028614537175324015e-03 +1.118690497780777951e+05 1.662351082607557012e-02 5.300909655796320376e-03 +1.119677868034777057e+05 1.163348253929231448e-02 3.630826875347867733e-03 +1.120665238288775872e+05 1.452724344481419634e-02 4.472765259623209290e-03 +1.121652608542774688e+05 1.065266690027151866e-02 3.218491217259060108e-03 +1.122639978796773794e+05 2.079830856463968022e-02 5.817080900456332408e-03 +1.123627349050772609e+05 1.328676080694710625e-02 4.670812425749571763e-03 +1.124614719304771716e+05 2.534114226173413489e-02 7.237053535547136388e-03 +1.125602089558770531e+05 2.238578027014826582e-02 5.097082383996327966e-03 +1.126589459812769346e+05 1.756949604621916780e-02 4.848379989019993390e-03 +1.127576830066768453e+05 1.409963690417062598e-02 4.505298521259541202e-03 +1.128564200320767268e+05 1.184720961049476502e-02 5.143355758739524830e-03 +1.129551570574766374e+05 2.008438366655575236e-02 5.912795278608244318e-03 +1.130538940828765190e+05 2.032248824556148747e-02 5.106316726068971940e-03 +1.131526311082764005e+05 1.653605306855356408e-02 5.657588950508676828e-03 +1.132513681336763111e+05 3.893970041156720463e-02 1.303934372144322819e-02 +1.133501051590761926e+05 2.787010644114598992e-02 7.511080662399522226e-03 +1.134488421844760887e+05 2.348843609545440275e-02 9.189094260235229281e-03 +1.135475792098759703e+05 2.192127273020970032e-02 7.008869676827534159e-03 +1.136463162352758518e+05 2.021575126676000006e-02 5.971486240107690482e-03 +1.137450532606757624e+05 6.786803063821262617e-03 1.980578276494926546e-03 +1.138437902860756440e+05 1.652149941909390046e-02 5.099049576800986777e-03 +1.139425273114755546e+05 1.775717853506424831e-02 5.751063033884748141e-03 +1.140412643368754361e+05 1.566195998901605269e-02 4.638481161464098890e-03 +1.141400013622753177e+05 1.164846516646406149e-02 4.194879359552630173e-03 +1.142387383876752283e+05 3.052129615321980127e-02 8.242023811885284060e-03 +1.143374754130751098e+05 3.130142586165023805e-02 8.958471526368774057e-03 +1.144362124384750205e+05 2.147427257197044581e-02 6.008285993827354107e-03 +1.145349494638749020e+05 1.943393908888925783e-02 5.687293783582525637e-03 +1.146336864892747835e+05 1.658086753605924474e-02 4.794930190598546693e-03 +1.147324235146746942e+05 2.003352082965780337e-02 5.364111616153029172e-03 +1.148311605400745757e+05 3.397286179740290762e-02 1.036277805029238615e-02 +1.149298975654744572e+05 1.752933331103036924e-02 5.136821605307317039e-03 +1.150286345908743533e+05 2.642482779311043639e-02 9.637488445742343687e-03 +1.151273716162742348e+05 3.360852848104244756e-02 7.414264638180256307e-03 +1.152261086416741455e+05 3.348912389610198687e-02 8.726999406756568572e-03 +1.153248456670740270e+05 2.116673448765021143e-02 6.472792284850361830e-03 +1.154235826924739231e+05 1.030203484590822699e-02 3.407439008503487798e-03 +1.155223197178738192e+05 2.307231538398844123e-02 7.013788310219620792e-03 +1.156210567432737007e+05 1.739856310675810119e-02 5.212836522331326834e-03 +1.157197937686736113e+05 3.218022095701338764e-02 8.669315806389419135e-03 +1.158185307940734929e+05 4.097245908701863809e-02 1.026927662868779706e-02 +1.159172678194733890e+05 3.543143055759045978e-02 9.971635393352608692e-03 +1.160160048448732850e+05 2.780903841348350558e-02 7.523459724823680812e-03 +1.161147418702731666e+05 4.525087896590204023e-02 9.683823441536027615e-03 +1.162134788956730772e+05 5.199113477492134372e-02 1.284663069364674719e-02 +1.163122159210729587e+05 7.389564593987225927e-02 1.247093208201198282e-02 +1.164109529464728548e+05 1.239431761356169781e-01 1.631919944633591218e-02 +1.165096899718727364e+05 1.362710755762812087e-01 1.777517893808469931e-02 +1.166084269972726179e+05 2.451180721970623033e-01 2.558518851208438707e-02 +1.167071640226725285e+05 3.873835282511161604e-01 3.388122223380357623e-02 +1.168059010480724100e+05 6.143400329984114450e-01 4.266713471668567847e-02 +1.169046380734723061e+05 8.255272186230330211e-01 5.002090222004525188e-02 +1.170033750988722022e+05 1.196110112863080222e+00 6.049719768627471322e-02 +1.171021121242720837e+05 1.688206852785049339e+00 7.405722497851170705e-02 +1.172008491496719944e+05 2.354042370462928968e+00 8.840291474501134339e-02 +1.172995861750718759e+05 3.046787729049880600e+00 1.004677447809296797e-01 +1.173983232004717720e+05 3.629215790394658914e+00 1.063959060666350293e-01 +1.174970602258716681e+05 4.690384732421764902e+00 1.232574956075654787e-01 +1.175957972512715496e+05 5.668293856282099696e+00 1.335657486933750360e-01 +1.176945342766714602e+05 6.403709473312691358e+00 1.418931934246560334e-01 +1.177932713020713418e+05 7.101258350249201712e+00 1.493941122310649960e-01 +1.178920083274712233e+05 7.621248034841308083e+00 1.520299758375837917e-01 +1.179907453528711194e+05 7.724049027182685379e+00 1.530121372714307038e-01 +1.180894823782710009e+05 8.166230042888532381e+00 1.586564800371597361e-01 +1.181882194036709116e+05 8.231939595952210809e+00 1.567899680979219779e-01 +1.182869564290707931e+05 8.213298286510422486e+00 1.591951094952412382e-01 +1.183856934544706746e+05 8.340087428445078999e+00 1.591223254811277854e-01 +1.184844304798705853e+05 8.376144418978091366e+00 1.596713328448813585e-01 +1.185831675052704668e+05 8.117333383532640667e+00 1.571319689391378338e-01 +1.186819045306703774e+05 8.269977523623840199e+00 1.606622691157466032e-01 +1.187806415560702590e+05 8.608964526763207559e+00 1.630376356348146871e-01 +1.188793785814701405e+05 8.305188180013308497e+00 1.613385003844593490e-01 +1.189781156068700511e+05 7.857980971296381512e+00 1.554265414873003404e-01 +1.190768526322699327e+05 7.651952041091695911e+00 1.543068376392634500e-01 +1.191755896576698433e+05 7.216043634946776919e+00 1.481607992164834242e-01 +1.192743266830697248e+05 6.732278555971365819e+00 1.410788384312121335e-01 +1.193730637084696064e+05 5.955718812490622405e+00 1.355942746860416270e-01 +1.194718007338695170e+05 4.938651469703369656e+00 1.234647014455904773e-01 +1.195705377592693985e+05 4.519328615411629002e+00 1.193802073047006973e-01 +1.196692747846692946e+05 3.569456511267207866e+00 1.062891146578946316e-01 +1.197680118100691761e+05 2.914995213239052418e+00 9.842469682325487301e-02 +1.198667488354690577e+05 2.208292395611398895e+00 8.458320849671956132e-02 +1.199654858608689683e+05 1.597746066175234514e+00 7.078833126540408360e-02 +1.200642228862688498e+05 1.186884645515750014e+00 5.964882558589854750e-02 +1.201629599116687605e+05 8.783894491758047485e-01 5.367935996320149367e-02 +1.202616969370686420e+05 6.054663790177610139e-01 4.197162325412205630e-02 +1.203604339624685235e+05 4.174499331479658015e-01 3.520265781330182697e-02 +1.204591709878684342e+05 2.502049890576453217e-01 2.439760394066305127e-02 +1.205579080132683157e+05 1.852830884923032384e-01 2.057943054835675856e-02 +1.206566450386682118e+05 1.490119223420801331e-01 1.959726602162741027e-02 +1.207553820640681079e+05 1.039973714846262332e-01 1.528356091890396493e-02 +1.208541190894679894e+05 7.056949787698292564e-02 1.329145368828747731e-02 +1.209528561148679000e+05 6.051763329333257474e-02 1.486458368330756917e-02 +1.210515931402677816e+05 4.443193251511422942e-02 9.048161332370383697e-03 +1.211503301656676631e+05 5.650955952499901735e-02 1.294593195548042995e-02 +1.212490671910675592e+05 1.992430683533234770e-02 5.287019482772077963e-03 +1.213478042164674407e+05 1.152353837261425873e-02 3.540432798702293580e-03 +1.214465412418673513e+05 2.071946907612226552e-02 8.280765777421334600e-03 +1.215452782672672329e+05 1.789482581065259675e-02 5.539033354409734697e-03 +1.216440152926671290e+05 1.482443754609657528e-02 6.371735353985263743e-03 +1.217427523180670250e+05 2.711048198678039922e-02 1.208618452520750057e-02 +1.218414893434669066e+05 3.312143109964146154e-02 8.686531631610542453e-03 +1.219402263688668172e+05 2.787274415756978152e-02 9.841564701834242326e-03 +1.220389633942666987e+05 2.428242724058187613e-02 8.377519470538156987e-03 +1.221377004196665948e+05 3.312210189283336381e-02 9.942005168425714634e-03 +1.222364374450664909e+05 1.936753778939168114e-02 5.459934274913683452e-03 +1.223351744704663724e+05 2.990363190001773391e-02 1.047922334139424726e-02 +1.224339114958662831e+05 1.794843551268030316e-02 6.816116742488851320e-03 +1.225326485212661646e+05 1.454921517491952580e-02 4.912181788117280477e-03 +1.226313855466660607e+05 3.473616225250664852e-02 1.133142572243218786e-02 +1.227301225720659422e+05 1.424148513907356507e-02 5.688496354976595344e-03 +1.228288595974658238e+05 3.056452748292866339e-02 1.065253320560815252e-02 +1.229275966228657344e+05 1.247765758946554546e-02 5.476661728473564313e-03 +1.230263336482656159e+05 2.144628031268552837e-02 7.896057899519120377e-03 +1.231250706736655120e+05 8.358378970081037709e-03 3.522885123082877563e-03 +1.232238076990654081e+05 1.398069937212467057e-02 4.641648470699285926e-03 +1.233225447244652896e+05 1.127271022048475721e-02 4.801155534276469079e-03 +1.234212817498652003e+05 2.427830808828555786e-02 8.746020377055827716e-03 +1.235200187752650818e+05 2.877301947617325398e-02 8.565782538924442482e-03 +1.236187558006649633e+05 1.413544535145932861e-02 4.841953953700952815e-03 +1.237174928260648448e+05 1.932071159797702636e-02 5.640594834990177338e-03 +1.238162298514647846e+05 2.226275710607542729e-02 7.446272005467179968e-03 +1.239149668768646661e+05 1.298896936437769593e-02 4.279937882092982142e-03 +1.240137039022645477e+05 2.734551898411012941e-02 1.251407569518513466e-02 +1.241124409276644292e+05 2.110353069529598974e-02 6.322756040342330727e-03 +1.242111779530643107e+05 1.240433425956957367e-02 4.203181580955166197e-03 +1.243099149784642359e+05 2.390739665301259281e-02 7.658531281679871808e-03 +1.244086520038641174e+05 2.689342912278553516e-02 9.974744026768822200e-03 +1.245073890292639990e+05 2.376408410686378994e-02 8.501697445848962684e-03 +1.246061260546638805e+05 1.434022365962792436e-02 5.896721168895240409e-03 +1.247048630800637620e+05 1.753676460236187895e-02 5.682045490943123979e-03 +1.248036001054637018e+05 3.049303494060353822e-02 9.210166101697923186e-03 +1.249023371308635833e+05 2.253463355893529224e-02 7.676621046819511601e-03 +1.250010741562634648e+05 1.661280886444144525e-02 6.613663336789166527e-03 +1.250998111816633464e+05 1.698965072663830359e-02 6.873622824670540428e-03 +1.251985482070632279e+05 2.489229983259204707e-02 7.424907142736051832e-03 +1.252972852324631676e+05 2.933832804791326396e-02 1.091745855143649857e-02 +1.253960222578630492e+05 2.413899412777374340e-02 7.071198782239536927e-03 +1.254947592832629307e+05 2.992907822579264632e-02 8.673320803755796282e-03 +1.255934963086628122e+05 1.876404777968788615e-02 7.126574425590274930e-03 +1.256922333340626938e+05 1.388936473452720595e-02 6.274731778775161951e-03 +1.257909703594626189e+05 1.864852913914307950e-02 7.281635414664980148e-03 +1.258897073848625005e+05 2.899568467657573367e-02 8.114275057873930261e-03 +1.259884444102623820e+05 1.834545732401490770e-02 6.973774641410913390e-03 +1.260871814356622635e+05 1.758563653452176884e-02 6.884411705948313698e-03 +1.261859184610621451e+05 3.303518553908643685e-02 1.144297982889034074e-02 +1.262846554864620848e+05 1.065658204966844075e-02 3.958744253138334231e-03 +1.263833925118619663e+05 1.205265869662373868e-02 5.035515478887027212e-03 +1.264821295372618479e+05 1.422685258344266908e-02 4.834661468551798569e-03 +1.265808665626617294e+05 1.610811575854276950e-02 4.758180781504593553e-03 +1.266796035880616109e+05 6.378131850568903929e-03 3.399774379395065649e-03 +1.267783406134615507e+05 1.702680679280550377e-02 6.784388682492165784e-03 +1.268770776388614322e+05 1.411265307491758707e-02 6.625881859891241676e-03 +1.269758146642613137e+05 1.617063725296432469e-02 6.888484145585149244e-03 +1.270745516896611953e+05 2.663427121492063440e-02 8.998309824315334216e-03 +1.271732887150610768e+05 3.271816605391476840e-02 9.636769965887480999e-03 +1.272720257404610020e+05 3.345163232372051071e-02 1.063495872001083906e-02 +1.273707627658608835e+05 2.209140837059294510e-02 8.044874701549535947e-03 +1.274694997912607651e+05 2.169896179118651486e-02 6.800630589412629164e-03 +1.275682368166606466e+05 1.667854841312271449e-02 5.305474001670940423e-03 +1.276669738420605281e+05 2.706854450701123502e-02 8.965939182380169153e-03 +1.277657108674604679e+05 2.072009034695191862e-02 1.088542274694358387e-02 +1.278644478928603494e+05 2.076928418384549335e-02 8.424894618150794920e-03 +1.279631849182602309e+05 3.459559450688280691e-02 1.157843525756793897e-02 +1.280619219436601124e+05 1.281285525071097428e-02 4.864167760411091702e-03 +1.281606589690599940e+05 2.472093937302096214e-02 7.230283511960238635e-03 +1.282593959944599337e+05 6.531294776924546387e-03 3.240174362646698007e-03 +1.283581330198598152e+05 1.961952373908923408e-02 6.800064801561427237e-03 +1.284568700452596968e+05 4.727259977424632525e-02 1.393861974771200274e-02 +1.285556070706595783e+05 3.281983278108049906e-02 1.024643800253662723e-02 +1.286543440960594598e+05 1.767501330421099651e-02 7.323402745601985224e-03 +1.287530811214593996e+05 2.867850561293007472e-02 9.675911519456927706e-03 +1.288518181468592811e+05 2.025236050791475589e-02 6.844874264640622707e-03 +1.289505551722591481e+05 1.813320670197834245e-02 7.684997066349882021e-03 +1.290492921976590296e+05 2.448951472777595451e-02 8.701288338258167734e-03 +1.291480292230589112e+05 1.025254027537441694e-02 4.144969884701951539e-03 +1.292467662484588218e+05 2.841455048377863890e-02 7.934742186729716595e-03 +1.293455032738587324e+05 1.837278913155906274e-02 7.548689733017394966e-03 +1.294442402992586140e+05 1.698092952755501234e-02 6.278396524461324520e-03 +1.295429773246584955e+05 1.312685740232083162e-02 5.087991381624389249e-03 +1.296417143500583770e+05 2.327940725681694120e-02 7.194502348304859102e-03 +1.297404513754582877e+05 2.149205275069374782e-02 7.721386295795207126e-03 +1.298391884008581983e+05 2.765232785918195560e-02 8.901196894836814130e-03 +1.299379254262580798e+05 2.072326130391554180e-02 6.467941663143300310e-03 +1.300366624516579614e+05 2.026986902189320885e-02 6.929610038354214879e-03 +1.301353994770578429e+05 1.669926365631217366e-02 6.008818124716498385e-03 +1.302341365024577535e+05 8.303822544182213813e-03 2.697636393662959219e-03 +1.303328735278576642e+05 2.413334181323498889e-02 7.679528939383290474e-03 +1.304316105532575457e+05 1.376900265521954249e-02 5.789398214764129511e-03 +1.305303475786574272e+05 2.996342371764893625e-02 1.057018136315499013e-02 +1.306290846040572942e+05 9.374364710231328224e-03 3.552162125731673538e-03 +1.307278216294572048e+05 2.195064943993195114e-02 8.803301274338128091e-03 +1.308265586548571155e+05 1.217467280276772305e-02 4.055781798429246819e-03 +1.309252956802569970e+05 1.913633288671676841e-02 8.923317465726256226e-03 +1.310240327056568785e+05 1.064751724679605799e-02 4.534026206589360231e-03 +1.311227697310567601e+05 1.356175597251258955e-02 5.227646406556448085e-03 +1.312215067564566853e+05 1.915188423513712254e-02 6.037780473794039128e-03 +1.313202437818565813e+05 1.335496679506877234e-02 4.847363050831788797e-03 +1.314189808072564483e+05 3.796917124063257931e-02 1.097751195304401232e-02 +1.315177178326563444e+05 2.348694564618709554e-02 7.463839884224614425e-03 +1.316164548580562114e+05 2.245584608793852952e-02 8.502463973531737898e-03 +1.317151918834561075e+05 1.302328325224802463e-02 5.084417091748863644e-03 +1.318139289088560326e+05 1.049359943373831192e-02 5.665682398533596759e-03 +1.319126659342559287e+05 1.989684772124300505e-02 6.988449568481163929e-03 +1.320114029596557957e+05 1.292777514368648357e-02 4.349635680334145924e-03 +1.321101399850556918e+05 7.614584703465402012e-03 3.539921065672451978e-03 +1.322088770104555588e+05 1.269445069770885892e-02 4.516006268515576454e-03 +1.323076140358555131e+05 1.575734434840424247e-02 6.031205830133453717e-03 +1.324063510612553800e+05 3.382818504650949611e-03 1.709819467663300889e-03 +1.325050880866552761e+05 2.235917518520802449e-02 6.698798290675212798e-03 +1.326038251120551431e+05 1.692098255234875115e-02 6.463026692775201108e-03 +1.327025621374550392e+05 1.867703200806875019e-02 7.195184408931341348e-03 +1.328012991628549644e+05 2.697899270847926856e-02 1.042643621045172449e-02 +1.329000361882548314e+05 9.252552249430893300e-03 3.277414518440440079e-03 +1.329987732136547274e+05 1.613416071118681586e-02 7.179775220830338610e-03 +1.330975102390545944e+05 6.136075859153094537e-03 3.083355135809279484e-03 +1.331962472644544905e+05 1.832882164150268292e-02 1.046617480427712230e-02 +1.332949842898544157e+05 1.945049168258654662e-02 7.963024332544633294e-03 +1.333937213152543118e+05 1.244898493094542639e-02 7.348265196774299637e-03 +1.334924583406541788e+05 2.544511857892632276e-02 8.294721356240574925e-03 +1.335911953660540748e+05 2.185425408316944706e-02 8.031939641319115961e-03 +1.336899323914539418e+05 2.910979156913250446e-02 9.856659577488132221e-03 +1.337886694168538961e+05 2.305979644502454545e-02 8.783290977855885695e-03 +1.338874064422537631e+05 2.254439761010028007e-02 8.685574116735539363e-03 +1.339861434676536592e+05 3.213569304974342455e-02 1.274342387335533101e-02 +1.340848804930535262e+05 2.902619561665173431e-02 1.154588595663332690e-02 +1.341836175184534222e+05 2.731417898171874248e-02 1.120395813922559283e-02 +1.342823545438533474e+05 1.892376444156077323e-02 9.474910868246665119e-03 +1.343810915692532144e+05 1.084518287941520741e-02 4.668270235948262202e-03 +1.344798285946531105e+05 2.631429939685598490e-02 8.598792137164072702e-03 +1.345785656200529775e+05 3.495173967502563511e-02 1.295066568129879699e-02 +1.346773026454528735e+05 1.096110819021843194e-02 4.535459270054865120e-03 +1.347760396708527987e+05 2.613931043955641798e-02 8.591516636370579926e-03 +1.348747766962526948e+05 1.027368792259508896e-02 4.646876569749418956e-03 +1.349735137216525618e+05 4.654462589240790545e-03 2.106084981848394943e-03 +1.350722507470524579e+05 7.525757774593764236e-03 3.550818381168419167e-03 +1.351709877724523249e+05 1.189529558039476194e-02 4.318332912858402831e-03 +1.352697247978522792e+05 2.831279578500136423e-02 9.700612746606454562e-03 +1.353684618232521461e+05 9.037869352066001810e-03 4.437457100742247564e-03 +1.354671988486520422e+05 1.771058658997120769e-02 7.143604791119546188e-03 +1.355659358740519092e+05 3.742916573008397974e-02 1.128206587088121868e-02 +1.356646728994518053e+05 1.464615231542892859e-02 7.523366994793783888e-03 +1.357634099248517305e+05 9.400377181596326209e-03 4.350935602686677693e-03 +1.358621469502516265e+05 1.635466723513115048e-02 6.451719855257732547e-03 +1.359608839756514935e+05 1.815420220183716973e-02 7.327514224648393887e-03 +1.360596210010513896e+05 8.817764134608725712e-03 5.320337907422139669e-03 +1.361583580264512566e+05 1.213370031278119751e-02 5.489770839434478245e-03 +1.362570950518511818e+05 7.592594216864693990e-03 3.221472669562350406e-03 +1.363558320772510779e+05 1.744975181571050207e-02 6.740110460616802190e-03 +1.364545691026509448e+05 1.411385876648809171e-02 5.364870900885699255e-03 +1.365533061280508409e+05 1.956186139403022495e-02 7.019248453556805462e-03 +1.366520431534507079e+05 2.161507416743155968e-02 9.006325644616619552e-03 +1.367507801788506622e+05 1.402757460085648014e-02 5.065941382774933298e-03 +1.368495172042505292e+05 3.904209882820179871e-03 1.419991776756068325e-03 +1.369482542296504253e+05 1.732595752711209650e-02 6.625326750291060142e-03 +1.370469912550502922e+05 1.944735447607799650e-02 6.766304800864502214e-03 +1.371457282804501883e+05 2.418482346387304180e-02 8.902637570680011631e-03 +1.372444653058501135e+05 3.541885820247085009e-02 1.133251302137296482e-02 +1.373432023312500096e+05 2.739656134289501777e-02 1.008985316712455484e-02 +1.374419393566498766e+05 3.518604590240516361e-02 1.413084112934646051e-02 +1.375406763820497727e+05 2.448077637031040657e-02 1.256746466767676325e-02 +1.376394134074496396e+05 3.599294503848070315e-02 1.331693730694029007e-02 +1.377381504328495648e+05 3.698069832436436111e-02 1.352638721692638567e-02 +1.378368874582494609e+05 3.201767477156278879e-02 9.556646819886291042e-03 +1.379356244836493279e+05 1.055650245614894733e-02 4.811346199307220232e-03 +1.380343615090492240e+05 2.015819926755268651e-02 8.634327501056459145e-03 +1.381330985344490909e+05 2.122232124808428808e-02 1.028797267212790828e-02 +1.382318355598490452e+05 2.934062915207637928e-02 1.058389782836889788e-02 +1.383305725852489122e+05 2.783903515545267313e-02 1.112768037201210258e-02 +1.384293096106488083e+05 2.085032228491987341e-02 7.824635810242792922e-03 +1.385280466360486753e+05 1.329040099723068427e-02 7.237061491005144023e-03 +1.386267836614485714e+05 4.907507839687952345e-02 1.399424944216279623e-02 +1.387255206868484966e+05 2.067371673134620752e-02 9.202727529694271907e-03 +1.388242577122483926e+05 1.404933692931042109e-02 6.063812421223631517e-03 +1.389229947376482596e+05 3.152461549672084390e-02 1.199882482010442182e-02 +1.390217317630481557e+05 2.067248809710773433e-02 7.747226843075049295e-03 +1.391204687884480227e+05 1.802605331179284870e-02 7.233370906993016533e-03 +1.392192058138479479e+05 1.862155301188444731e-02 8.709507414281957710e-03 +1.393179428392478439e+05 2.267230348660304734e-02 7.984409937386201250e-03 +1.394166798646477109e+05 2.463543355672188212e-02 1.013996343052312940e-02 +1.395154168900476070e+05 1.415058401257351592e-02 4.503154322048964417e-03 +1.396141539154474740e+05 2.533445910788705013e-02 8.837984631386840498e-03 +1.397128909408474283e+05 2.544522098204599764e-02 1.134248789393096056e-02 +1.398116279662472953e+05 1.453238995218895241e-02 6.524340728991179922e-03 +1.399103649916471913e+05 1.970295098667432243e-02 7.928934315691580845e-03 +1.400091020170470583e+05 3.159563657217416555e-02 1.294377600903214021e-02 +1.401078390424469544e+05 3.158541657268000569e-02 1.336119055290358251e-02 +1.402065760678468505e+05 2.786453522164061836e-02 1.096404494464582602e-02 +1.403053130932467757e+05 1.965258487824801323e-02 9.607018492520966874e-03 +1.404040501186466427e+05 2.694562376408878024e-02 9.253753326432362022e-03 +1.405027871440465387e+05 4.023220661416886113e-02 1.695924303575842979e-02 +1.406015241694464057e+05 3.458889144460912390e-02 1.046841048854329700e-02 +1.407002611948463018e+05 2.206634760456731986e-02 9.767625910961977992e-03 +1.407989982202462270e+05 2.547173353848321622e-02 8.108113083052927508e-03 +1.408977352456460940e+05 2.756686531762665010e-02 9.834722888362266296e-03 +1.409964722710459901e+05 2.393925654879835649e-02 9.973958143579080698e-03 +1.410952092964458570e+05 1.932207042430795010e-02 7.727353720748516598e-03 +1.411939463218457822e+05 1.798462032904898922e-02 6.113213723140904082e-03 +1.412926833472456783e+05 2.351597797138120158e-02 1.095244132381503754e-02 +1.413914203726455744e+05 6.502471924780706992e-03 2.781420016833130102e-03 +1.414901573980454414e+05 5.432609587983196556e-03 4.349532846975355006e-03 +1.415888944234453375e+05 2.680813910781897069e-02 9.801730720412593981e-03 +1.416876314488452335e+05 2.646718418707953019e-02 1.087818313664215032e-02 +1.417863684742451587e+05 2.884848719167538642e-02 1.020129908773177892e-02 +1.418851054996450257e+05 2.803890161366894701e-02 1.266181658115162791e-02 diff --git a/tutorials/data/powder_reduced_lbco_0_05si_2large_bank.xye b/tutorials/data/powder_reduced_lbco_0_05si_2large_bank.xye new file mode 100644 index 00000000..dfbdffe8 --- /dev/null +++ b/tutorials/data/powder_reduced_lbco_0_05si_2large_bank.xye @@ -0,0 +1,1002 @@ +# DIFC = 58736.09443990583 [µ/Å] L = 157.66511528266744 [m] two_theta = 94.93340423102556 [deg] +# tof [µs] Y [counts] E [counts] +4.116812859292999201e+04 2.153710746931005171e-01 2.485114069864158629e-02 +4.127385356292182405e+04 2.608731253560512831e-01 3.329888041963863926e-02 +4.137957853291364881e+04 3.043368615904640806e-01 3.547087591788450345e-02 +4.148530350290548085e+04 4.736670804811050073e-01 4.206283617542717901e-02 +4.159102847289731289e+04 6.002651986502521853e-01 4.196647994561224920e-02 +4.169675344288914494e+04 6.017448324066868581e-01 3.965186271654011496e-02 +4.180247841288097698e+04 5.011825843970607597e-01 3.810348675822586295e-02 +4.190820338287280174e+04 3.770226414883808830e-01 3.458905645764303455e-02 +4.201392835286463378e+04 2.753318277463203678e-01 3.190950665975840483e-02 +4.211965332285646582e+04 2.618231130009330276e-01 2.830042526454298185e-02 +4.222537829284829786e+04 2.928088563756663376e-01 3.145301661570625018e-02 +4.233110326284012262e+04 3.578142823373394177e-01 4.155932289601068502e-02 +4.243682823283195467e+04 3.769179959521566370e-01 3.849597975143188855e-02 +4.254255320282378671e+04 4.158391911279324393e-01 4.449771134056958177e-02 +4.264827817281561875e+04 3.779803744828383327e-01 4.193951997252232111e-02 +4.275400314280745079e+04 3.198893594846607957e-01 3.309901263703583785e-02 +4.285972811279928283e+04 2.658741522251843459e-01 2.855729616760260825e-02 +4.296545308279110759e+04 2.573176035624888947e-01 3.093264002198454002e-02 +4.307117805278293963e+04 2.577564704480500013e-01 2.793004132928919581e-02 +4.317690302277477167e+04 2.436818233779233789e-01 2.633848204890042871e-02 +4.328262799276660371e+04 2.292366928663013004e-01 2.670909544346710199e-02 +4.338835296275842848e+04 2.509718661544597107e-01 2.812685157678675857e-02 +4.349407793275026052e+04 2.520164318371221901e-01 2.840260670459381076e-02 +4.359980290274209256e+04 2.966280574563536221e-01 2.933221528558389857e-02 +4.370552787273392460e+04 5.917885671986631291e-01 4.715812670168278986e-02 +4.381125284272575664e+04 1.128510510097429753e+00 6.592621547237847990e-02 +4.391697781271758140e+04 1.134676835970059416e+00 5.575804856372774260e-02 +4.402270278270941344e+04 8.777986080928671386e-01 4.135430851512232608e-02 +4.412842775270124548e+04 5.660575761924040439e-01 3.186612578727112538e-02 +4.423415272269307752e+04 3.978815799809931053e-01 2.999555575290682383e-02 +4.433987769268490229e+04 2.767054054920717876e-01 2.831555763835678571e-02 +4.444560266267673433e+04 3.725751083717299128e-01 3.306140498413820406e-02 +4.455132763266856637e+04 5.620474590198114573e-01 3.747912960742691424e-02 +4.465705260266039841e+04 8.794032862318595933e-01 4.339597485143953381e-02 +4.476277757265223045e+04 1.049733673425403024e+00 4.470369284474142585e-02 +4.486850254264405521e+04 8.065912472297915858e-01 3.562084390842406439e-02 +4.497422751263588725e+04 5.838432924396242951e-01 3.171070339140553973e-02 +4.507995248262771929e+04 3.754946792436575920e-01 2.585913508481106626e-02 +4.518567745261955133e+04 3.223595345777620635e-01 2.872205216524737273e-02 +4.529140242261137610e+04 2.586153666396504569e-01 2.514014802920313055e-02 +4.539712739260320814e+04 2.653946194115984203e-01 2.506320120119176834e-02 +4.550285236259504018e+04 3.204047378434953242e-01 3.374661251894776198e-02 +4.560857733258687222e+04 2.951144619245948397e-01 2.703262344951972915e-02 +4.571430230257870426e+04 3.108126736372315291e-01 2.683275683619879698e-02 +4.582002727257052902e+04 2.586610723515629373e-01 2.363213831492192926e-02 +4.592575224256236106e+04 2.953395370430179634e-01 2.502299927193591539e-02 +4.603147721255419310e+04 3.026068399569262768e-01 2.666410003952783894e-02 +4.613720218254602514e+04 3.903729423138836974e-01 4.433754393616119727e-02 +4.624292715253785718e+04 3.378836691835625516e-01 3.236157093051930667e-02 +4.634865212252968195e+04 7.252934849637189263e-01 6.077502775372350952e-02 +4.645437709252151399e+04 1.444078091575856426e+00 8.695420663068247069e-02 +4.656010206251334603e+04 2.160799078436518972e+00 1.058313665320170238e-01 +4.666582703250517807e+04 2.048563565799041530e+00 9.242447066920182752e-02 +4.677155200249701011e+04 1.282381284886184858e+00 5.868380667032114389e-02 +4.687727697248883487e+04 5.866001925346094881e-01 3.394969722869588952e-02 +4.698300194248066691e+04 3.739496315689567196e-01 2.685663276171922423e-02 +4.708872691247249895e+04 3.121051489047478866e-01 2.469331623046316232e-02 +4.719445188246433099e+04 2.630577114198744404e-01 2.288312367098122024e-02 +4.730017685245615576e+04 2.723258006960146971e-01 2.341727581514723919e-02 +4.740590182244798780e+04 2.412913354834822499e-01 2.147243362812975218e-02 +4.751162679243981984e+04 2.523896954981822982e-01 2.318341377024033326e-02 +4.761735176243165188e+04 2.184825433916667559e-01 1.920620904244086172e-02 +4.772307673242348392e+04 2.718324481106246804e-01 2.709558555661976953e-02 +4.782880170241530868e+04 2.628702244172894109e-01 2.161559381449554978e-02 +4.793452667240714072e+04 2.915223352375253540e-01 2.580408739341092175e-02 +4.804025164239897276e+04 2.530127940493845928e-01 2.138592736343572151e-02 +4.814597661239080480e+04 2.296839766414642825e-01 2.172373342743272664e-02 +4.825170158238262957e+04 2.630428626295486794e-01 2.133630588335756403e-02 +4.835742655237446161e+04 3.301884295987274065e-01 2.417924467260626833e-02 +4.846315152236629365e+04 3.695739281579626945e-01 2.295722673016692764e-02 +4.856887649235812569e+04 4.968789872605733904e-01 2.344131668866666560e-02 +4.867460146234995773e+04 5.483382902045680352e-01 2.325019238751704909e-02 +4.878032643234178249e+04 5.327191627479830327e-01 2.385465602729653842e-02 +4.888605140233361453e+04 4.183505548474412139e-01 2.212000839498857660e-02 +4.899177637232544657e+04 2.822691967721844830e-01 1.967979342239069285e-02 +4.909750134231727861e+04 2.866173486109942492e-01 2.136233932695521393e-02 +4.920322631230911065e+04 2.522132411861770507e-01 2.034966938360983219e-02 +4.930895128230093542e+04 2.488703826341970571e-01 1.955887366173672537e-02 +4.941467625229276746e+04 2.448078436988982698e-01 1.959869374087079216e-02 +4.952040122228459950e+04 2.601371397266339369e-01 2.587688364710211478e-02 +4.962612619227643154e+04 2.604647821395448815e-01 1.890954890145047154e-02 +4.973185116226825630e+04 3.113392816636900151e-01 2.192317175306443197e-02 +4.983757613226008834e+04 2.829567596015400421e-01 1.827207039423774798e-02 +4.994330110225192038e+04 3.214703596991227985e-01 2.233293022269595973e-02 +5.004902607224375242e+04 2.967639647355652666e-01 2.135032154107910710e-02 +5.015475104223558446e+04 2.680889839522346274e-01 1.925716582985162809e-02 +5.026047601222740923e+04 2.937093175842762638e-01 2.234167454325169944e-02 +5.036620098221924127e+04 3.079523703996563944e-01 2.216200674252769703e-02 +5.047192595221107331e+04 3.427802563886976350e-01 2.430553829132631530e-02 +5.057765092220290535e+04 3.619795633444084504e-01 2.631117900596903827e-02 +5.068337589219473739e+04 4.524771598823785768e-01 3.236845016249723789e-02 +5.078910086218656215e+04 8.838686127494939093e-01 5.260557836590706166e-02 +5.089482583217839419e+04 1.824757955809221066e+00 8.032464359556136524e-02 +5.100055080217022623e+04 2.913515320430418054e+00 1.026145629233496531e-01 +5.110627577216205827e+04 3.143102761371809883e+00 1.038394170389491944e-01 +5.121200074215389031e+04 2.403252941381652796e+00 8.542323864103675002e-02 +5.131772571214571508e+04 1.209045360096914434e+00 5.227567522888452306e-02 +5.142345068213754712e+04 5.860551625034998713e-01 2.959684125270913707e-02 +5.152917565212937916e+04 3.459746775442253397e-01 2.165689371791541112e-02 +5.163490062212121120e+04 2.720163149432728300e-01 1.844464326506729812e-02 +5.174062559211303596e+04 2.290974918298087082e-01 1.591446668835031983e-02 +5.184635056210486800e+04 2.936624044874694972e-01 2.045654517157154823e-02 +5.195207553209670004e+04 2.967278931397528963e-01 2.058125270356776781e-02 +5.205780050208853208e+04 4.798908863347365328e-01 2.798479666580701297e-02 +5.216352547208036412e+04 8.143691279984882625e-01 3.854817201873923099e-02 +5.226925044207218889e+04 1.535671873748238880e+00 5.355963405776297676e-02 +5.237497541206402093e+04 2.084068314161176438e+00 6.357017087954838774e-02 +5.248070038205585297e+04 1.928725550712737435e+00 5.888010583522335084e-02 +5.258642535204768501e+04 1.390773407300172071e+00 4.801671833159894959e-02 +5.269215032203950977e+04 7.037742698705139466e-01 3.020862573463304820e-02 +5.279787529203134181e+04 3.889558208910198212e-01 2.095658690632551738e-02 +5.290360026202317385e+04 3.064782716432409848e-01 1.957311781682838023e-02 +5.300932523201500589e+04 2.245358708337966969e-01 1.519657172746591810e-02 +5.311505020200683794e+04 2.350024874859830970e-01 1.676991307429799224e-02 +5.322077517199866270e+04 2.576466474746033630e-01 1.685674029532719526e-02 +5.332650014199049474e+04 2.459277008889770855e-01 1.635902888906161368e-02 +5.343222511198232678e+04 2.949416902369990656e-01 1.729796712387578206e-02 +5.353795008197415882e+04 3.578213142742978636e-01 1.831058572382073327e-02 +5.364367505196599086e+04 5.162626826748403230e-01 1.889672459609052085e-02 +5.374940002195781562e+04 8.043354875969166429e-01 2.271373300691972505e-02 +5.385512499194964767e+04 8.955710385483885982e-01 2.348465205034437620e-02 +5.396084996194147971e+04 8.454331381685515900e-01 2.430894807919327383e-02 +5.406657493193331175e+04 6.697227051116388941e-01 2.474791602679036334e-02 +5.417229990192513651e+04 4.149354144200905203e-01 1.918281222484124332e-02 +5.427802487191696855e+04 2.703659713579263379e-01 1.562156544953471372e-02 +5.438374984190880059e+04 2.699116166663160787e-01 1.721182920731275171e-02 +5.448947481190063263e+04 2.696290563527132811e-01 1.602469359478985583e-02 +5.459519978189246467e+04 2.332701288268579365e-01 1.548438118047886468e-02 +5.470092475188428944e+04 2.992378239825526642e-01 1.756047172264648543e-02 +5.480664972187612148e+04 2.544819126921636920e-01 1.650531420760956505e-02 +5.491237469186795352e+04 2.621729555779466203e-01 1.641350017030758154e-02 +5.501809966185978556e+04 2.922209274619719799e-01 1.781668389560021187e-02 +5.512382463185161760e+04 2.875155866064892374e-01 1.703243274437635929e-02 +5.522954960184344236e+04 2.768548631633431234e-01 1.718310947320735374e-02 +5.533527457183527440e+04 2.913825800245142816e-01 1.515185428982697251e-02 +5.544099954182710644e+04 3.033791032872547033e-01 1.622110984771307773e-02 +5.554672451181893848e+04 3.072023726799349985e-01 1.606921451438052262e-02 +5.565244948181076325e+04 2.672811653082456940e-01 1.476849635667062087e-02 +5.575817445180259529e+04 2.671051207358477453e-01 1.500842336169567852e-02 +5.586389942179442733e+04 2.761008854012295677e-01 1.602590646782442799e-02 +5.596962439178625937e+04 2.626905252209964514e-01 1.538533442335943482e-02 +5.607534936177809141e+04 2.425106423311819692e-01 1.426233132145164444e-02 +5.618107433176992345e+04 2.719298002174761475e-01 1.523041883139009817e-02 +5.628679930176174821e+04 3.089762544910952258e-01 1.595256094263953345e-02 +5.639252427175358025e+04 3.117078510728122365e-01 1.562528073052104130e-02 +5.649824924174541229e+04 3.110546473878670337e-01 1.580158735611719018e-02 +5.660397421173723706e+04 3.136732800561387591e-01 1.687084690249390090e-02 +5.670969918172906910e+04 3.612622000982856907e-01 1.738288861614042599e-02 +5.681542415172090114e+04 5.692034181151193195e-01 2.127425188175019119e-02 +5.692114912171273318e+04 9.024145041887405849e-01 2.566462776860295447e-02 +5.702687409170456522e+04 1.310078961033423584e+00 3.087994035170033014e-02 +5.713259906169639726e+04 1.388124754610512213e+00 3.087577938558860521e-02 +5.723832403168822202e+04 1.253053340898884649e+00 2.890379268629977849e-02 +5.734404900168005406e+04 8.852727257861658927e-01 2.452559237091598079e-02 +5.744977397167188610e+04 5.531365275394289904e-01 1.956794748268836370e-02 +5.755549894166371087e+04 3.578118600987075792e-01 1.619093592433212131e-02 +5.766122391165554291e+04 2.764076578807457274e-01 1.417519266443980838e-02 +5.776694888164737495e+04 2.545598108117405056e-01 1.381721192821199276e-02 +5.787267385163920699e+04 2.620681669408651548e-01 1.430973519241612868e-02 +5.797839882163103903e+04 2.679810480432835429e-01 1.467260100318671344e-02 +5.808412379162287107e+04 2.785179905420335777e-01 1.499952315973867960e-02 +5.818984876161469583e+04 2.579693973616148384e-01 1.479400054306367375e-02 +5.829557373160652787e+04 2.606695108822812412e-01 1.517154610225861927e-02 +5.840129870159835991e+04 2.568557081521639085e-01 1.346900104251730172e-02 +5.850702367159019195e+04 2.442328104920105936e-01 1.327551160505504452e-02 +5.861274864158201672e+04 2.511302172265642563e-01 1.386914178717005633e-02 +5.871847361157384876e+04 2.504224214898718714e-01 1.314973340354531374e-02 +5.882419858156568807e+04 2.637752400484691950e-01 1.345927793910209162e-02 +5.892992355155750556e+04 2.644583043066947026e-01 1.388159803911763121e-02 +5.903564852154935215e+04 2.708333079152489553e-01 1.461421395838648565e-02 +5.914137349154116964e+04 2.576523065118234701e-01 1.427843958927238650e-02 +5.924709846153300168e+04 2.531378969060431028e-01 1.346411626729160371e-02 +5.935282343152483372e+04 2.681484402168856085e-01 1.348853301241573731e-02 +5.945854840151666576e+04 2.423213524438379840e-01 1.246387940864682707e-02 +5.956427337150849780e+04 2.496728747172669571e-01 1.257850672301267549e-02 +5.966999834150032257e+04 2.664614794005397691e-01 1.347951018164133749e-02 +5.977572331149216188e+04 2.678898972704827353e-01 1.311899624502996242e-02 +5.988144828148397937e+04 2.531867839976721934e-01 1.316204732504211786e-02 +5.998717325147582596e+04 2.579200490850795391e-01 1.313214149795720147e-02 +6.009289822146764345e+04 2.639651402910249689e-01 1.303961904430984975e-02 +6.019862319145947549e+04 2.571376644940963074e-01 1.297659233397437627e-02 +6.030434816145130753e+04 2.556765127148905026e-01 1.262842355223556950e-02 +6.041007313144313957e+04 2.936488898076692888e-01 1.368859656883815966e-02 +6.051579810143497161e+04 2.970412290164322067e-01 1.337787648927450841e-02 +6.062152307142679638e+04 3.315704229500917033e-01 1.423302151199909438e-02 +6.072724804141863569e+04 4.197496154411256009e-01 1.459406654176504878e-02 +6.083297301141046046e+04 6.729761175543871321e-01 1.796416666630230516e-02 +6.093869798140229977e+04 1.028495515222632273e+00 2.072357941245445839e-02 +6.104442295139411726e+04 1.187586131094396036e+00 2.127191519707625350e-02 +6.115014792138594930e+04 1.215208935269679325e+00 2.117806085653267320e-02 +6.125587289137778134e+04 9.139143974243897350e-01 1.851300834854351443e-02 +6.136159786136961338e+04 7.009141961914646668e-01 1.714113789437486310e-02 +6.146732283136144542e+04 5.011843854293078770e-01 1.518404991039024737e-02 +6.157304780135327019e+04 3.635027078620511887e-01 1.350470376178352500e-02 +6.167877277134510950e+04 2.972464839269961523e-01 1.242195529105087452e-02 +6.178449774133693427e+04 2.975371579147865764e-01 1.315649875716912165e-02 +6.189022271132877358e+04 2.628639507769817141e-01 1.286334853265197822e-02 +6.199594768132059107e+04 2.577393307409369672e-01 1.151776679846635253e-02 +6.210167265131242311e+04 2.612924704731126035e-01 1.161047992394215189e-02 +6.220739762130425515e+04 2.500632480852333916e-01 1.186528818843076739e-02 +6.231312259129608719e+04 2.494934704492355881e-01 1.146276574448418760e-02 +6.241884756128791923e+04 2.579458980236530863e-01 1.147293749550409858e-02 +6.252457253127974400e+04 2.359353714853535122e-01 1.091559803082713456e-02 +6.263029750127158331e+04 2.334517780734865211e-01 1.114364302364331295e-02 +6.273602247126340808e+04 2.615893593554464713e-01 1.195191554433323693e-02 +6.284174744125524740e+04 2.397369088869018283e-01 1.092678523811795206e-02 +6.294747241124707216e+04 2.651839273661140139e-01 1.147332783271173655e-02 +6.305319738123891148e+04 2.641508894461597756e-01 1.164223507976873580e-02 +6.315892235123072896e+04 2.560209361608498102e-01 1.116485038947329089e-02 +6.326464732122256100e+04 2.440130008341020729e-01 1.064393008778644935e-02 +6.337037229121439304e+04 2.695559550600108434e-01 1.153352244735585640e-02 +6.347609726120621781e+04 2.567677856634049682e-01 1.080212465949361225e-02 +6.358182223119805712e+04 2.414534503458179715e-01 1.045330584302135886e-02 +6.368754720118988189e+04 2.572680395077308613e-01 1.081561687751143343e-02 +6.379327217118172121e+04 2.494193814230429018e-01 1.108117151280665034e-02 +6.389899714117354597e+04 2.470315591965163426e-01 1.044353255378311675e-02 +6.400472211116538529e+04 2.467783934782481758e-01 1.046139215304635849e-02 +6.411044708115720277e+04 2.584042999053819956e-01 1.101495842120117120e-02 +6.421617205114903481e+04 2.387704999207234113e-01 1.028189337747785134e-02 +6.432189702114086685e+04 2.364082051586776645e-01 1.013720083030077504e-02 +6.442762199113269162e+04 2.612216413150915684e-01 1.047671201111289967e-02 +6.453334696112453094e+04 2.489941024443725892e-01 1.052787647627317219e-02 +6.463907193111635570e+04 2.516159720823578638e-01 1.050846743139435303e-02 +6.474479690110819502e+04 2.996276552388459358e-01 1.185888661380172376e-02 +6.485052187110001978e+04 3.303528700645373406e-01 1.235835806377064139e-02 +6.495624684109185910e+04 4.052694143559218420e-01 1.469967694468926264e-02 +6.506197181108368386e+04 4.287356658506749629e-01 1.518769225567730662e-02 +6.516769678107550862e+04 4.413954434921170122e-01 1.508120432091632733e-02 +6.527342175106734067e+04 4.010946641743854957e-01 1.416615440215991499e-02 +6.537914672105917271e+04 3.964790586456777843e-01 1.410616683912667944e-02 +6.548487169105100475e+04 5.085401144141257213e-01 1.672683091770560057e-02 +6.559059666104282951e+04 7.781373062475197555e-01 2.066414428122907015e-02 +6.569632163103467610e+04 1.445874052339014115e+00 2.807218000299617836e-02 +6.580204660102649359e+04 2.465790736504362979e+00 3.679287239274418864e-02 +6.590777157101834018e+04 3.126713081552214835e+00 4.063395719279198903e-02 +6.601349654101015767e+04 3.179229423995032278e+00 4.018240811389910128e-02 +6.611922151100198971e+04 2.422360518529352191e+00 3.408929248968482761e-02 +6.622494648099382175e+04 1.454961682297714942e+00 2.576790342717837773e-02 +6.633067145098565379e+04 8.143249923787676536e-01 1.932655671966656760e-02 +6.643639642097748583e+04 4.756062517999517514e-01 1.422750433122568769e-02 +6.654212139096930332e+04 3.538000459582563706e-01 1.230305108027457753e-02 +6.664784636096114991e+04 2.895889914605696003e-01 1.041707665163589015e-02 +6.675357133095296740e+04 2.537068093532732216e-01 9.616790970996987736e-03 +6.685929630094481399e+04 2.393703226533146489e-01 9.055459208632763921e-03 +6.696502127093663148e+04 2.532881289680958270e-01 9.645000827537183671e-03 +6.707074624092846352e+04 2.425682443817209211e-01 9.418700960545235701e-03 +6.717647121092029556e+04 2.537897440863364773e-01 9.578805403922009687e-03 +6.728219618091212760e+04 2.475104034903072014e-01 9.548110846646844924e-03 +6.738792115090395964e+04 2.310229745077113650e-01 8.900379132648471997e-03 +6.749364612089577713e+04 2.550900940063549616e-01 9.344681116369140533e-03 +6.759937109088762372e+04 2.350973858595828692e-01 8.972575103113951400e-03 +6.770509606087944121e+04 2.648949299910587363e-01 9.841488989181312180e-03 +6.781082103087128780e+04 2.480215165956837220e-01 9.427458944646430195e-03 +6.791654600086310529e+04 2.582706368585657164e-01 1.034583997077205032e-02 +6.802227097085493733e+04 2.815924509115133589e-01 1.071764859215887898e-02 +6.812799594084676937e+04 2.893011300969298705e-01 1.121109327466562194e-02 +6.823372091083860141e+04 3.965450002733932888e-01 1.575935472657262124e-02 +6.833944588083043345e+04 4.938733356990868684e-01 1.828959554383506603e-02 +6.844517085082225094e+04 8.844633790820334296e-01 2.611033936532454122e-02 +6.855089582081409753e+04 1.776663354043423126e+00 3.848824025750206129e-02 +6.865662079080591502e+04 3.462905178048456989e+00 5.543707052559553039e-02 +6.876234576079776161e+04 5.629349777464291549e+00 7.080615141533266876e-02 +6.886807073078957910e+04 6.728341650025493337e+00 7.575581337866610365e-02 +6.897379570078142569e+04 6.198594237923834349e+00 7.102105172067600669e-02 +6.907952067077324318e+04 4.342802902548902111e+00 5.725092716982064373e-02 +6.918524564076507522e+04 2.446689264886297011e+00 4.080947422291159726e-02 +6.929097061075690726e+04 1.288074729783375671e+00 2.841976986317077541e-02 +6.939669558074872475e+04 7.044727348357692209e-01 1.980897752036525281e-02 +6.950242055074057134e+04 4.647080730124361070e-01 1.547568711673538364e-02 +6.960814552073238883e+04 3.110685500106273316e-01 1.132748842948613430e-02 +6.971387049072423542e+04 2.737746294835372574e-01 9.718019370143030425e-03 +6.981959546071605291e+04 2.634456929244144985e-01 9.245392653095572261e-03 +6.992532043070789950e+04 2.567098672003880200e-01 8.823941405229499338e-03 +7.003104540069971699e+04 2.367304650589087400e-01 8.330833070053529979e-03 +7.013677037069154903e+04 2.374833995291177335e-01 8.145452762357580784e-03 +7.024249534068338107e+04 2.317402452134979252e-01 8.065123129290016624e-03 +7.034822031067519856e+04 2.378455804479022995e-01 8.388505337370616780e-03 +7.045394528066704515e+04 2.455079442071830542e-01 8.573869706868811336e-03 +7.055967025065886264e+04 2.433087339654111392e-01 8.367032664891286067e-03 +7.066539522065070923e+04 2.400370258365473741e-01 8.393852956526202252e-03 +7.077112019064252672e+04 2.420808160193218261e-01 8.217927654646895591e-03 +7.087684516063435876e+04 2.306251559263440276e-01 8.014181030620869117e-03 +7.098257013062619080e+04 2.497575217984906171e-01 8.402484315836582576e-03 +7.108829510061802284e+04 2.583726877652068321e-01 8.700472684506554630e-03 +7.119402007060985488e+04 2.382137985584143747e-01 8.086423583625157452e-03 +7.129974504060168692e+04 2.554300905788884357e-01 8.489978954411487796e-03 +7.140547001059351896e+04 2.493553377540576876e-01 8.280111606897235313e-03 +7.151119498058533645e+04 2.500039703310768524e-01 8.281309169979480730e-03 +7.161691995057718304e+04 2.509552523224448106e-01 8.072103809935112645e-03 +7.172264492056900053e+04 2.869485163586003029e-01 8.562909077433593016e-03 +7.182836989056083257e+04 3.261786587479619803e-01 8.216832329056619061e-03 +7.193409486055266461e+04 4.638657152686291862e-01 9.216991226892744943e-03 +7.203981983054449665e+04 6.522895648654145617e-01 9.733703170241895034e-03 +7.214554480053632869e+04 8.642982148063441672e-01 1.050190251747794637e-02 +7.225126977052816073e+04 9.850478153371600154e-01 1.105430779895480095e-02 +7.235699474051999277e+04 8.691397390360924291e-01 1.027746388370191777e-02 +7.246271971051181026e+04 6.381204349157917344e-01 9.442309412733123145e-03 +7.256844468050365685e+04 4.477264473908512676e-01 8.642065290159416449e-03 +7.267416965049547434e+04 3.491532268472096745e-01 8.476578548868914098e-03 +7.277989462048732094e+04 3.247074905688613899e-01 8.597290857401554756e-03 +7.288561959047913842e+04 3.181507011557557218e-01 8.702229120605304083e-03 +7.299134456047097046e+04 3.370053960398645132e-01 9.167774213283255702e-03 +7.309706953046280250e+04 3.661278382403361231e-01 9.595873861250251227e-03 +7.320279450045463454e+04 3.767498574843116121e-01 9.723096675549052978e-03 +7.330851947044646658e+04 3.562424081559920075e-01 9.513077255154647402e-03 +7.341424444043828407e+04 3.046810274015752107e-01 8.676590608036405597e-03 +7.351996941043013067e+04 2.650027695871237099e-01 7.897949809329785076e-03 +7.362569438042194815e+04 2.642180508286832707e-01 8.032809101377377109e-03 +7.373141935041379475e+04 2.347523277806704833e-01 7.529239269088603900e-03 +7.383714432040561223e+04 2.566873090184088047e-01 8.049699776532758672e-03 +7.394286929039744427e+04 2.438382117367899893e-01 7.722917821256130959e-03 +7.404859426038927631e+04 2.566795079729149998e-01 8.080934017260279698e-03 +7.415431923038110835e+04 2.313146245233833886e-01 7.439103563679216012e-03 +7.426004420037294040e+04 2.391278327265358439e-01 7.480397066950293140e-03 +7.436576917036477244e+04 2.534450459823232027e-01 7.873369340064136426e-03 +7.447149414035660448e+04 2.408397888129752973e-01 7.711516695366636524e-03 +7.457721911034842196e+04 2.363149906505465914e-01 7.395430386340105453e-03 +7.468294408034026856e+04 2.408521084421503533e-01 7.539296017698683683e-03 +7.478866905033208604e+04 2.413250397413475024e-01 7.531403037034299121e-03 +7.489439402032391808e+04 2.323314138514395721e-01 7.263109152028564448e-03 +7.500011899031575012e+04 2.361717400037610382e-01 7.399474428122357512e-03 +7.510584396030758217e+04 2.456942484514550440e-01 7.571780232460714050e-03 +7.521156893029941421e+04 2.305472730755449284e-01 7.191782391744863841e-03 +7.531729390029124625e+04 2.371502880297157168e-01 7.339356648455888817e-03 +7.542301887028307829e+04 2.458202222408842341e-01 7.361139870154743449e-03 +7.552874384027489577e+04 2.439157874626672051e-01 7.519381726847823577e-03 +7.563446881026674237e+04 2.375947534507191761e-01 7.333747934590359799e-03 +7.574019378025855985e+04 2.410420323571544343e-01 7.377413878608280080e-03 +7.584591875025039189e+04 2.359958582113838299e-01 7.186734855529825980e-03 +7.595164372024222394e+04 2.525585482654302272e-01 7.537125429777985323e-03 +7.605736869023405598e+04 2.361332724946209882e-01 7.162542383321248048e-03 +7.616309366022588802e+04 2.472639757012290718e-01 7.460733586878003434e-03 +7.626881863021772006e+04 2.374670319181043654e-01 7.230911259685389100e-03 +7.637454360020955210e+04 2.377133334120040964e-01 7.279105957753793932e-03 +7.648026857020136958e+04 2.463204439721720651e-01 7.276349545600669343e-03 +7.658599354019321618e+04 2.340552904772802978e-01 7.197671174938777977e-03 +7.669171851018503367e+04 2.427718478383286971e-01 7.315756348957971542e-03 +7.679744348017686571e+04 2.410396799839986670e-01 7.221883361682949337e-03 +7.690316845016869775e+04 2.430290710315454461e-01 7.278542147309856845e-03 +7.700889342016052979e+04 2.453782500432619418e-01 7.145651332514320157e-03 +7.711461839015236183e+04 2.460795004707207467e-01 7.312836373750168477e-03 +7.722034336014419387e+04 2.506322126461691391e-01 7.329341156010697050e-03 +7.732606833013602591e+04 2.326000375473203097e-01 6.924857692967861453e-03 +7.743179330012784339e+04 2.371863799534748296e-01 7.092686648087046658e-03 +7.753751827011968999e+04 2.350962686126348011e-01 6.858618913559076831e-03 +7.764324324011150748e+04 2.398885737843565735e-01 6.966255265637526922e-03 +7.774896821010333952e+04 2.451457415476965829e-01 7.079026950485624650e-03 +7.785469318009517156e+04 2.357465139735842874e-01 6.935491302873229326e-03 +7.796041815008700360e+04 2.482955512568460199e-01 7.165272563042425491e-03 +7.806614312007883564e+04 2.579952659919894642e-01 7.331858080216594777e-03 +7.817186809007066768e+04 2.357580877260021246e-01 6.955944573799979248e-03 +7.827759306006249972e+04 2.387326096950205534e-01 6.827963616041488049e-03 +7.838331803005431721e+04 2.377390297012521025e-01 6.894557424468043989e-03 +7.848904300004616380e+04 2.325978663694625859e-01 6.758637538622979182e-03 +7.859476797003798129e+04 2.510156945547549756e-01 7.050742079022054992e-03 +7.870049294002982788e+04 2.410020185648097668e-01 6.896972932855464228e-03 +7.880621791002164537e+04 2.437184784725141828e-01 6.948121126756296242e-03 +7.891194288001347741e+04 2.403822860701247122e-01 6.823950602041774574e-03 +7.901766785000530945e+04 2.411202828647301954e-01 6.896484420120215127e-03 +7.912339281999714149e+04 2.432196882574894636e-01 6.882198898675168097e-03 +7.922911778998897353e+04 2.525134198600595958e-01 6.932477344209614194e-03 +7.933484275998079102e+04 2.572305075459423440e-01 7.083047646463017100e-03 +7.944056772997263761e+04 3.059962959215863920e-01 7.823218228023074219e-03 +7.954629269996445510e+04 3.109220276059253552e-01 7.454215216420702686e-03 +7.965201766995630169e+04 3.423045124001402595e-01 8.133094109193298935e-03 +7.975774263994811918e+04 3.721317965819235796e-01 9.095499060880786468e-03 +7.986346760993995122e+04 3.796342766459379070e-01 9.286809394706991086e-03 +7.996919257993178326e+04 4.153995538714082003e-01 1.036711177112782482e-02 +8.007491754992361530e+04 5.578591545498596815e-01 1.324127717263347270e-02 +8.018064251991544734e+04 8.313654796565629335e-01 1.804357946005009927e-02 +8.028636748990727938e+04 1.473474871116151386e+00 2.588674768837821022e-02 +8.039209245989911142e+04 2.741207969815802947e+00 3.680166545196267985e-02 +8.049781742989092891e+04 5.043104836458268458e+00 5.087321139772594397e-02 +8.060354239988277550e+04 8.042368423873497818e+00 6.487018290229588924e-02 +8.070926736987459299e+04 1.025321180349329886e+01 7.287831844081565924e-02 +8.081499233986642503e+04 1.035809483312996271e+01 7.298035572703166773e-02 +8.092071730985825707e+04 8.233308248026094844e+00 6.418759541986544803e-02 +8.102644227985008911e+04 5.530655212605462445e+00 5.163476777821233293e-02 +8.113216724984192115e+04 3.209213480801980989e+00 3.772268470864296314e-02 +8.123789221983375319e+04 1.793660633867060428e+00 2.687197661669621374e-02 +8.134361718982558523e+04 1.039296058302184411e+00 1.901241857062095988e-02 +8.144934215981740272e+04 6.861129352329876641e-01 1.474880629416975598e-02 +8.155506712980924931e+04 4.665652502393312084e-01 1.091846999475652551e-02 +8.166079209980106680e+04 3.523558397407150489e-01 8.839994713502882101e-03 +8.176651706979289884e+04 3.025964446750451509e-01 7.880788467111349282e-03 +8.187224203978473088e+04 2.852017976241553177e-01 7.376697747931950516e-03 +8.197796700977656292e+04 2.464878967511951180e-01 6.487593549472378887e-03 +8.208369197976839496e+04 2.339536070006690838e-01 6.273562726078799404e-03 +8.218941694976022700e+04 2.455048754222482199e-01 6.405690913477673186e-03 +8.229514191975205904e+04 2.356356136406724533e-01 6.189799034224382178e-03 +8.240086688974387653e+04 2.278378584490330927e-01 6.045152587006440668e-03 +8.250659185973572312e+04 2.396966444209003566e-01 6.307047046645785845e-03 +8.261231682972754061e+04 2.471601384548685887e-01 6.505903551660472024e-03 +8.271804179971937265e+04 2.496323325432682483e-01 6.424836453509869157e-03 +8.282376676971120469e+04 2.336682783531549845e-01 6.211629022914649974e-03 +8.292949173970303673e+04 2.444946786618269752e-01 6.262373656545724802e-03 +8.303521670969486877e+04 2.352366266334421641e-01 6.061564226842916167e-03 +8.314094167968670081e+04 2.382641299942638846e-01 6.164429834038020854e-03 +8.324666664967853285e+04 2.320877234714173454e-01 5.980895443700848593e-03 +8.335239161967035034e+04 2.389925257136767123e-01 6.147827151061066239e-03 +8.345811658966219693e+04 2.345558979525924903e-01 6.057484289229989050e-03 +8.356384155965401442e+04 2.348252868332300625e-01 6.014377451267960070e-03 +8.366956652964584646e+04 2.461399257472669244e-01 6.249745663865336094e-03 +8.377529149963767850e+04 2.406096363105013625e-01 6.095866387810814843e-03 +8.388101646962951054e+04 2.399423364132702297e-01 6.030899964468539910e-03 +8.398674143962134258e+04 2.288260142818417664e-01 5.859504195759533338e-03 +8.409246640961317462e+04 2.451044203682479217e-01 6.143105955085933351e-03 +8.419819137960500666e+04 2.370084423993918943e-01 6.054222165161319245e-03 +8.430391634959682415e+04 2.408003240347480201e-01 6.029206526396762612e-03 +8.440964131958867074e+04 2.368322962859423786e-01 5.966048983799226817e-03 +8.451536628958048823e+04 2.435400138652197566e-01 6.096117748840398400e-03 +8.462109125957232027e+04 2.436676850911776715e-01 6.061398050280372707e-03 +8.472681622956415231e+04 2.367936022215952896e-01 5.977744504789799483e-03 +8.483254119955598435e+04 2.501110501592926916e-01 6.196366527209784536e-03 +8.493826616954781639e+04 2.457007801028756599e-01 6.078512582683289096e-03 +8.504399113953964843e+04 2.487889772978331970e-01 6.125255147190282988e-03 +8.514971610953148047e+04 2.472449675321437557e-01 6.083771338994754981e-03 +8.525544107952329796e+04 2.400697231009010224e-01 5.976058777498295151e-03 +8.536116604951514455e+04 2.392628507425957340e-01 5.931779670537819585e-03 +8.546689101950696204e+04 2.391931674535404673e-01 5.937629317052667798e-03 +8.557261598949880863e+04 2.497557835233683299e-01 6.127316394102431084e-03 +8.567834095949062612e+04 2.375431297316757118e-01 5.867843963806084612e-03 +8.578406592948245816e+04 2.306427204332220648e-01 5.655990968933048008e-03 +8.588979089947429020e+04 2.206904839704564303e-01 5.537666411924068756e-03 +8.599551586946612224e+04 2.294210620793566968e-01 5.697881282542336875e-03 +8.610124083945795428e+04 2.421152580215145678e-01 5.979245733795772628e-03 +8.620696580944977177e+04 2.404450197650475629e-01 5.947863193454529587e-03 +8.631269077944161836e+04 2.307972326460711876e-01 5.773386925432368033e-03 +8.641841574943343585e+04 2.403389077662139717e-01 5.861365887473076255e-03 +8.652414071942528244e+04 2.269348731629952098e-01 5.602775845046996731e-03 +8.662986568941709993e+04 2.430935400541101854e-01 5.897626787990928147e-03 +8.673559065940893197e+04 2.348799495612539923e-01 5.659449974100525492e-03 +8.684131562940076401e+04 2.365161181559104764e-01 5.768053294236968540e-03 +8.694704059939259605e+04 2.337632740001418241e-01 5.752009131723182477e-03 +8.705276556938442809e+04 2.373233527525830111e-01 5.839073995411643916e-03 +8.715849053937626013e+04 2.402497228948280161e-01 5.778013388161470226e-03 +8.726421550936809217e+04 2.316870022365891957e-01 5.658283519361276270e-03 +8.736994047935990966e+04 2.226372732939911059e-01 5.500040400288682720e-03 +8.747566544935175625e+04 2.388502251010291288e-01 5.838786618061124305e-03 +8.758139041934357374e+04 2.370069226615016678e-01 5.689346160030188393e-03 +8.768711538933540578e+04 2.307834234430485576e-01 5.566091140431212239e-03 +8.779284035932723782e+04 2.413169279612240037e-01 5.791441628023761071e-03 +8.789856532931906986e+04 2.454781859327216376e-01 5.865499418128019768e-03 +8.800429029931090190e+04 2.374575552942649326e-01 5.723775170360712906e-03 +8.811001526930273394e+04 2.435217500028152293e-01 5.798070332863233291e-03 +8.821574023929456598e+04 2.328867761961038174e-01 5.686781427551678217e-03 +8.832146520928638347e+04 2.337886154291392016e-01 5.659524586786045947e-03 +8.842719017927823006e+04 2.375972238070387377e-01 5.679671876606879818e-03 +8.853291514927004755e+04 2.394729821607527176e-01 5.788272337189972680e-03 +8.863864011926187959e+04 2.369502933652910537e-01 5.697304047220391916e-03 +8.874436508925371163e+04 2.350972888665391614e-01 5.651524479901677209e-03 +8.885009005924554367e+04 2.407541071699346447e-01 5.791881212905373479e-03 +8.895581502923737571e+04 2.391641278084239985e-01 5.699080212918077731e-03 +8.906153999922920775e+04 2.450211087409890354e-01 5.773182036722817462e-03 +8.916726496922103979e+04 2.377135798376047437e-01 5.675863682197206453e-03 +8.927298993921285728e+04 2.324202964136028726e-01 5.566150524785151710e-03 +8.937871490920470387e+04 2.429761507360285455e-01 5.823274463259879921e-03 +8.948443987919652136e+04 2.445811674465853125e-01 5.810739952868228426e-03 +8.959016484918835340e+04 2.341448591939206403e-01 5.685844510635655949e-03 +8.969588981918018544e+04 2.403274391225742879e-01 5.750327600288412250e-03 +8.980161478917201748e+04 2.370903619558431541e-01 5.650924503292365994e-03 +8.990733975916384952e+04 2.361199791623728172e-01 5.600204627420560938e-03 +9.001306472915568156e+04 2.406118207138208953e-01 5.643368669133234233e-03 +9.011878969914751360e+04 2.317881209352611604e-01 5.643591908891861832e-03 +9.022451466913933109e+04 2.436038669601931217e-01 5.703336588682181817e-03 +9.033023963913117768e+04 2.390256593737383195e-01 5.786621728839469285e-03 +9.043596460912299517e+04 2.364102719997014102e-01 5.562892204952777676e-03 +9.054168957911482721e+04 2.410219177063288587e-01 5.615169409368177093e-03 +9.064741454910665925e+04 2.369113859855961901e-01 5.683217750834232418e-03 +9.075313951909849129e+04 2.517447063183702038e-01 5.775455119853254576e-03 +9.085886448909032333e+04 2.337340869846782077e-01 5.566022650512602449e-03 +9.096458945908215537e+04 2.438294856925670162e-01 5.806328964853373770e-03 +9.107031442907398741e+04 2.387718635366549158e-01 5.666253855737463097e-03 +9.117603939906580490e+04 2.377451754527614147e-01 5.605067981213939128e-03 +9.128176436905765149e+04 2.288605441536659679e-01 5.442041245622958497e-03 +9.138748933904946898e+04 2.437250376968907450e-01 5.717631887941590843e-03 +9.149321430904131557e+04 2.375473900600935107e-01 5.638547299936964852e-03 +9.159893927903313306e+04 2.379673524457187050e-01 5.582334420086958703e-03 +9.170466424902496510e+04 2.361511592410139027e-01 5.589286556559362566e-03 +9.181038921901679714e+04 2.430588409591417087e-01 5.642370895227611510e-03 +9.191611418900862918e+04 2.275545570439921339e-01 5.388609385600122079e-03 +9.202183915900046122e+04 2.385677481839061087e-01 5.559247976726948252e-03 +9.212756412899227871e+04 2.437213383119481713e-01 5.590614211003942444e-03 +9.223328909898412530e+04 2.453600152973225978e-01 5.419510668390434792e-03 +9.233901406897594279e+04 2.737756420638410848e-01 5.702317117563152071e-03 +9.244473903896778938e+04 3.081844780089277869e-01 5.854057971074013919e-03 +9.255046400895960687e+04 3.592132359059781455e-01 6.140191930195268606e-03 +9.265618897895143891e+04 4.222663915332037221e-01 6.239837015851271498e-03 +9.276191394894327095e+04 5.348300451628769103e-01 6.723585138884169594e-03 +9.286763891893510299e+04 6.406239570142734374e-01 6.827709790649732699e-03 +9.297336388892693503e+04 8.145394280585551705e-01 7.143460009505667001e-03 +9.307908885891876707e+04 1.021051973935370727e+00 7.779014997123303091e-03 +9.318481382891059911e+04 1.187690355615206306e+00 7.963936312436076595e-03 +9.329053879890241660e+04 1.263014984832801391e+00 8.262775998490517679e-03 +9.339626376889426319e+04 1.198687082370358370e+00 8.143059112722875539e-03 +9.350198873888608068e+04 1.015876699144417250e+00 7.828165027742724560e-03 +9.360771370887791272e+04 7.858581231759373953e-01 7.145831037782050116e-03 +9.371343867886974476e+04 6.240610121610272731e-01 6.806930540899180579e-03 +9.381916364886157680e+04 4.877247334248596689e-01 6.285620186560929475e-03 +9.392488861885340884e+04 4.010336397971520084e-01 6.167053704785157783e-03 +9.403061358884524088e+04 3.447646094505456560e-01 6.000139250729370245e-03 +9.413633855883707292e+04 3.095222233611519824e-01 6.040685168834409625e-03 +9.424206352882889041e+04 2.740925886007472001e-01 5.656714035931697908e-03 +9.434778849882073700e+04 2.594715925283435087e-01 5.795690387992232136e-03 +9.445351346881255449e+04 2.364548370020411183e-01 5.502525380914707193e-03 +9.455923843880438653e+04 2.471429249849227128e-01 5.637767660154347979e-03 +9.466496340879621857e+04 2.360738740695893789e-01 5.667312208123535637e-03 +9.477068837878805061e+04 2.345570731822971822e-01 5.551072189621604654e-03 +9.487641334877988265e+04 2.330107325828433551e-01 5.580343626093909985e-03 +9.498213831877171469e+04 2.369621361794074232e-01 5.591188826635389020e-03 +9.508786328876354673e+04 2.507091394633882420e-01 5.901181114321148169e-03 +9.519358825875536422e+04 2.373756536455611799e-01 5.751537744745481573e-03 +9.529931322874721081e+04 2.544784013014544377e-01 5.907797031350188292e-03 +9.540503819873902830e+04 2.598175259488404998e-01 6.082544255285763507e-03 +9.551076316873086034e+04 2.718343593564854777e-01 6.276356764268403200e-03 +9.561648813872269238e+04 2.911416657991320878e-01 6.499871865511324016e-03 +9.572221310871452442e+04 3.182082377666529682e-01 6.858485720755752926e-03 +9.582793807870635646e+04 3.522996397956210668e-01 7.219076731684241459e-03 +9.593366304869818850e+04 3.923307490198521541e-01 7.643881654871283876e-03 +9.603938801869002054e+04 4.195493494083159525e-01 7.787805108355341267e-03 +9.614511298868183803e+04 4.382542207199987550e-01 7.917172500626666956e-03 +9.625083795867368462e+04 4.441632100543953521e-01 7.986979750250179644e-03 +9.635656292866550211e+04 4.528274707933922505e-01 8.323598426441976977e-03 +9.646228789865733415e+04 3.971776348057954875e-01 7.765793695204168540e-03 +9.656801286864916619e+04 3.506819778547104471e-01 7.330343431917187361e-03 +9.667373783864099823e+04 3.170653238135352492e-01 6.858906489805019144e-03 +9.677946280863283027e+04 2.912529940561455755e-01 6.560287641119968462e-03 +9.688518777862466231e+04 2.682618944586948051e-01 6.258661951105946170e-03 +9.699091274861649435e+04 2.648235495667780603e-01 6.280506626733435918e-03 +9.709663771860831184e+04 2.518872884080502472e-01 6.035261236302504571e-03 +9.720236268860015844e+04 2.389958973492171124e-01 5.899406852002886913e-03 +9.730808765859197592e+04 2.364104984899290107e-01 5.841023455327993066e-03 +9.741381262858380796e+04 2.307459548659116233e-01 5.709728633474603354e-03 +9.751953759857564000e+04 2.229411665132003395e-01 5.570612857073969915e-03 +9.762526256856747204e+04 2.340699739984347105e-01 5.876982998811500734e-03 +9.773098753855930408e+04 2.328910724734198079e-01 5.737875461305897047e-03 +9.783671250855113612e+04 2.246149580691099990e-01 5.650782980472352640e-03 +9.794243747854296817e+04 2.401301492041913177e-01 5.962347048141213024e-03 +9.804816244853478565e+04 2.157769709367049482e-01 5.692628869955048895e-03 +9.815388741852663225e+04 2.350765370705859003e-01 5.864369502435934356e-03 +9.825961238851844973e+04 2.255989885899820635e-01 5.797651525432546450e-03 +9.836533735851029633e+04 2.296883309303234810e-01 5.911374282315119688e-03 +9.847106232850211381e+04 2.305515457433224003e-01 5.922711437140970765e-03 +9.857678729849394585e+04 2.383085337707525897e-01 6.022611818090311403e-03 +9.868251226848577789e+04 2.189971320380158515e-01 5.679411800341331064e-03 +9.878823723847760994e+04 2.313617429149878446e-01 5.953381086401097859e-03 +9.889396220846944198e+04 2.274673896045601995e-01 5.811645043784190515e-03 +9.899968717846125946e+04 2.321753932549352750e-01 5.820734102301607440e-03 +9.910541214845310606e+04 2.340574988084984376e-01 5.985651147788535568e-03 +9.921113711844492354e+04 2.303271387237815215e-01 6.076603384398978659e-03 +9.931686208843677014e+04 2.287798427792104017e-01 5.941326633159602251e-03 +9.942258705842858762e+04 2.256665976846416732e-01 5.956332365536105670e-03 +9.952831202842041967e+04 2.312458095200239649e-01 5.907921288510625119e-03 +9.963403699841225171e+04 2.297004475257611589e-01 6.145843739233356612e-03 +9.973976196840408375e+04 2.288671816537979631e-01 5.966620419993537081e-03 +9.984548693839591579e+04 2.388256075497229292e-01 6.285702798921793955e-03 +9.995121190838773327e+04 2.335779916343460605e-01 6.164724891526741218e-03 +1.000569368783795799e+05 2.239580858064132707e-01 5.946700673057494363e-03 +1.001626618483713974e+05 2.316452235763014622e-01 6.154296597388992512e-03 +1.002683868183632439e+05 2.311031894870776149e-01 6.165714759998346464e-03 +1.003741117883550614e+05 2.236115124158718492e-01 5.882089544053322426e-03 +1.004798367583469080e+05 2.290005209915749462e-01 6.044249939734342228e-03 +1.005855617283387255e+05 2.307129197114163033e-01 6.166549799206184207e-03 +1.006912866983305576e+05 2.297576730505376252e-01 6.246878357195702683e-03 +1.007970116683223896e+05 2.285435988180871680e-01 6.192697885928176785e-03 +1.009027366383142071e+05 2.426466863057535339e-01 6.433807565335675563e-03 +1.010084616083060537e+05 2.322134895635103169e-01 6.223778818646836207e-03 +1.011141865782978712e+05 2.262876807352516839e-01 6.080653956078929667e-03 +1.012199115482897178e+05 2.312682009742838551e-01 6.260574225151128297e-03 +1.013256365182815352e+05 2.299602088984619985e-01 6.110629787233240635e-03 +1.014313614882733818e+05 2.350825250702631708e-01 6.263197210841614862e-03 +1.015370864582651993e+05 2.292658099525866633e-01 6.102619473427516907e-03 +1.016428114282570314e+05 2.382583320982571973e-01 6.510185964401254965e-03 +1.017485363982488634e+05 2.419109093770879515e-01 6.268555131598419101e-03 +1.018542613682406809e+05 2.324982947943358413e-01 6.020019018562958180e-03 +1.019599863382325275e+05 2.430377891945013913e-01 6.293873883329180810e-03 +1.020657113082243450e+05 2.505085624770104769e-01 6.280520708516761259e-03 +1.021714362782161916e+05 2.433078002962065223e-01 6.282476350770776520e-03 +1.022771612482080091e+05 2.343100481767358412e-01 6.137374708541759247e-03 +1.023828862181998556e+05 2.393585515761680327e-01 6.262944741928986453e-03 +1.024886111881916731e+05 2.431825573720217404e-01 6.398591585564804458e-03 +1.025943361581835052e+05 2.374256886147133594e-01 6.373977124849615310e-03 +1.027000611281753372e+05 2.410658011972425241e-01 6.452623648913712040e-03 +1.028057860981671547e+05 2.335589672489657986e-01 6.346022627168703897e-03 +1.029115110681590013e+05 2.339626360777678216e-01 6.487341697871127841e-03 +1.030172360381508188e+05 2.327613643532314147e-01 6.526402143707070273e-03 +1.031229610081426654e+05 2.208691610965225760e-01 6.376730702086200533e-03 +1.032286859781344829e+05 2.197153270163706984e-01 6.340199256212709390e-03 +1.033344109481263295e+05 2.293615732521382955e-01 6.586131772271927240e-03 +1.034401359181181469e+05 2.310672098493448123e-01 6.750342315769809060e-03 +1.035458608881099935e+05 2.296997192109805908e-01 6.746560892120990333e-03 +1.036515858581018110e+05 2.302020994947862886e-01 6.706354136747504253e-03 +1.037573108280936285e+05 2.383293872596527474e-01 6.919917411065683484e-03 +1.038630357980854751e+05 2.335601218870987095e-01 6.804538320995087881e-03 +1.039687607680772926e+05 2.215478213653629125e-01 6.434975078281260710e-03 +1.040744857380691392e+05 2.143012720665207205e-01 6.264898756892499712e-03 +1.041802107080609567e+05 2.273013957905303806e-01 6.661120274960655348e-03 +1.042859356780528033e+05 2.193324539328596057e-01 6.455944092060404357e-03 +1.043916606480446208e+05 2.295383953897203733e-01 6.836434560928441456e-03 +1.044973856180364673e+05 2.292223961260936860e-01 6.899520428901160379e-03 +1.046031105880282848e+05 2.292273568223362201e-01 6.782607534439063710e-03 +1.047088355580201023e+05 2.137427054412775196e-01 6.361090236644106020e-03 +1.048145605280119489e+05 2.248308511918960251e-01 6.703435185843221664e-03 +1.049202854980037664e+05 2.254243273176077533e-01 6.829152832446847357e-03 +1.050260104679956130e+05 2.219965918322654164e-01 6.630801406094279267e-03 +1.051317354379874305e+05 2.237002337771973326e-01 6.662808379764053636e-03 +1.052374604079792771e+05 2.369900256987922671e-01 7.118081067792656966e-03 +1.053431853779710946e+05 2.199046216077362170e-01 6.654801020810978927e-03 +1.054489103479629412e+05 2.250291597863849635e-01 6.684804827919914837e-03 +1.055546353179547586e+05 2.170866207581369500e-01 6.570274517038433848e-03 +1.056603602879465761e+05 2.281948182285441218e-01 7.041862429548173367e-03 +1.057660852579384227e+05 2.176046723047871112e-01 6.707607620595036277e-03 +1.058718102279302402e+05 2.183754595916245489e-01 6.667688779732296699e-03 +1.059775351979220868e+05 2.107087480033515703e-01 6.565000110724012947e-03 +1.060832601679139043e+05 2.277276989404456997e-01 6.970193527055869830e-03 +1.061889851379057509e+05 2.323321408174894298e-01 7.024816656435557520e-03 +1.062947101078975684e+05 2.240945977330833505e-01 6.963764295625812784e-03 +1.064004350778894150e+05 2.190521276413318064e-01 6.931496109055897657e-03 +1.065061600478812325e+05 2.182555902798008207e-01 6.913118294931691263e-03 +1.066118850178730645e+05 2.284147591131344135e-01 7.173747424792554714e-03 +1.067176099878648965e+05 2.216658641119720885e-01 6.853382037370663732e-03 +1.068233349578567140e+05 2.245846651707050778e-01 7.060912605954450597e-03 +1.069290599278485606e+05 2.201857447807886170e-01 6.858302109089594277e-03 +1.070347848978403781e+05 2.271832321980436775e-01 7.161301617186700309e-03 +1.071405098678322247e+05 2.462510995047789142e-01 7.690881139474047001e-03 +1.072462348378240422e+05 2.212714086609266773e-01 7.026626016188081483e-03 +1.073519598078158888e+05 2.240503345296331328e-01 7.111623880393032858e-03 +1.074576847778077063e+05 2.256279906000076552e-01 7.162638131500760619e-03 +1.075634097477995383e+05 2.230171962356684023e-01 7.062820875646158916e-03 +1.076691347177913703e+05 2.196314236755727012e-01 7.156715455880737799e-03 +1.077748596877831878e+05 2.267623424608512517e-01 7.130809225217230388e-03 +1.078805846577750344e+05 2.124526046635991650e-01 6.812625277766074135e-03 +1.079863096277668519e+05 2.145295081500096235e-01 6.898412477966332779e-03 +1.080920345977586985e+05 2.147733659805458051e-01 7.074021063863481125e-03 +1.081977595677505160e+05 2.187021494605794480e-01 7.090452733078881145e-03 +1.083034845377423626e+05 2.284166675311083694e-01 7.393991313100398838e-03 +1.084092095077341801e+05 2.216610952638484178e-01 7.067834417254371081e-03 +1.085149344777260121e+05 2.258901595805957729e-01 7.477517737698123439e-03 +1.086206594477178442e+05 2.224200665732038174e-01 7.257691925779645795e-03 +1.087263844177096616e+05 2.174888260659025574e-01 7.247761601814843753e-03 +1.088321093877015082e+05 2.207969087907420414e-01 7.036425693859255440e-03 +1.089378343576933257e+05 2.298860575850922294e-01 7.376232007234931332e-03 +1.090435593276851723e+05 2.223733906094225443e-01 7.124848135690415099e-03 +1.091492842976769898e+05 2.157596742439404358e-01 7.089300378063738937e-03 +1.092550092676688364e+05 2.163072156326687479e-01 7.168115185170145787e-03 +1.093607342376606539e+05 2.248962639339047997e-01 7.504057804953481216e-03 +1.094664592076524859e+05 2.291051618778167376e-01 7.576486314683079405e-03 +1.095721841776443180e+05 2.284851753257101936e-01 7.519608560451891167e-03 +1.096779091476361355e+05 2.198076624353832720e-01 7.465522592580624804e-03 +1.097836341176279821e+05 2.162273109030391771e-01 7.150240251585298148e-03 +1.098893590876197995e+05 2.214048861968398174e-01 7.254973483565122470e-03 +1.099950840576116461e+05 2.426720632022522361e-01 7.913003161625046730e-03 +1.101008090276034636e+05 2.274097874681288156e-01 7.533842691924477579e-03 +1.102065339975953102e+05 2.167534422469586941e-01 7.231434281560007206e-03 +1.103122589675871277e+05 2.261989197166907051e-01 7.527478070727361241e-03 +1.104179839375789743e+05 2.266514433375358406e-01 7.620635985141617323e-03 +1.105237089075707918e+05 2.197747238652564272e-01 7.508891854202340982e-03 +1.106294338775626093e+05 2.204664089261318682e-01 7.436988419635218346e-03 +1.107351588475544559e+05 2.189127393752144657e-01 7.468331491131314365e-03 +1.108408838175462733e+05 2.305460752907467215e-01 7.971748104857637185e-03 +1.109466087875381199e+05 2.369333239399126489e-01 8.037860554438251356e-03 +1.110523337575299374e+05 2.385332862173387136e-01 7.973590071989521133e-03 +1.111580587275217840e+05 2.489255693347435794e-01 8.301746816438986334e-03 +1.112637836975136015e+05 2.502625757375911975e-01 8.425362960017231118e-03 +1.113695086675054481e+05 2.578731142392921560e-01 8.553317262614126143e-03 +1.114752336374972656e+05 2.783928831098771983e-01 9.038342218383236398e-03 +1.115809586074890831e+05 2.940136382637022483e-01 9.561708122842934102e-03 +1.116866835774809297e+05 3.039598688963775497e-01 9.564626116408044346e-03 +1.117924085474727472e+05 3.213789513649180640e-01 1.012629775420946336e-02 +1.118981335174645938e+05 3.744234085002342560e-01 1.139622860784857659e-02 +1.120038584874564112e+05 4.095557231282768718e-01 1.230421915220622324e-02 +1.121095834574482578e+05 4.325357543290219153e-01 1.245415885124057272e-02 +1.122153084274400753e+05 4.612958252484533062e-01 1.320052671027970893e-02 +1.123210333974319219e+05 5.772103333209712694e-01 1.665036106728259163e-02 +1.124267583674237394e+05 6.499774076710906900e-01 1.791095037450700367e-02 +1.125324833374155569e+05 8.297930724697216709e-01 2.097491604884949012e-02 +1.126382083074074035e+05 9.700608517550691756e-01 2.373181786529523357e-02 +1.127439332773992210e+05 1.334826252196155139e+00 2.868718979847906941e-02 +1.128496582473910676e+05 1.740799059206852295e+00 3.465905153190305954e-02 +1.129553832173828851e+05 2.261733757864666128e+00 3.997068205554018400e-02 +1.130611081873747316e+05 2.934555419106620100e+00 4.561368423033982517e-02 +1.131668331573665491e+05 3.658561173134416755e+00 5.156095187136472413e-02 +1.132725581273583957e+05 4.338599706711704584e+00 5.604804958740713938e-02 +1.133782830973502132e+05 4.914494997423563660e+00 5.932896219697691986e-02 +1.134840080673420453e+05 5.628669039580987743e+00 6.368528337614128010e-02 +1.135897330373338773e+05 6.093457575098121914e+00 6.580926972621979620e-02 +1.136954580073256948e+05 6.383661640791628678e+00 6.761848572438522442e-02 +1.138011829773175414e+05 6.783411891501448743e+00 7.006458183512596916e-02 +1.139069079473093589e+05 6.819194956335646651e+00 7.102551105980797752e-02 +1.140126329173012055e+05 6.609649730121343048e+00 6.951069944138665857e-02 +1.141183578872930229e+05 6.775060196860873241e+00 7.094684415763233276e-02 +1.142240828572848695e+05 6.831562996680222710e+00 7.148852451988071954e-02 +1.143298078272766870e+05 6.586404075418719195e+00 7.034701943301942262e-02 +1.144355327972685191e+05 6.670130349179557605e+00 7.059834834001088577e-02 +1.145412577672603511e+05 6.638707675027411881e+00 7.068220854830475908e-02 +1.146469827372521686e+05 6.505260349655211272e+00 6.979251512627378251e-02 +1.147527077072440152e+05 6.251884719974541760e+00 6.830668441725853968e-02 +1.148584326772358327e+05 5.984348050504031846e+00 6.740343448734857634e-02 +1.149641576472276793e+05 5.439807090488378627e+00 6.355507706906417253e-02 +1.150698826172194968e+05 4.793800556136482705e+00 5.876385766252443382e-02 +1.151756075872113433e+05 4.293366235200997139e+00 5.667753128224114340e-02 +1.152813325572031608e+05 3.583336159790688757e+00 5.185109396863247372e-02 +1.153870575271949929e+05 2.868124369921182026e+00 4.611286905458601704e-02 +1.154927824971868249e+05 2.312533944751546944e+00 4.132685461323091364e-02 +1.155985074671786424e+05 1.786913937516891426e+00 3.599282015884298913e-02 +1.157042324371704890e+05 1.382257900403568662e+00 3.171434826178856636e-02 +1.158099574071623065e+05 1.042569936838993128e+00 2.668688524345145391e-02 +1.159156823771541531e+05 7.799166180016225969e-01 2.207789100471631988e-02 +1.160214073471459706e+05 5.976875264410026478e-01 1.852447940256848197e-02 +1.161271323171378172e+05 5.064300264027586929e-01 1.640934489694750517e-02 +1.162328572871296346e+05 3.962116236569352967e-01 1.391994093734208633e-02 +1.163385822571214812e+05 3.329170334288482080e-01 1.203463122487609047e-02 +1.164443072271132987e+05 3.017420298364422715e-01 1.098739890631990172e-02 +1.165500321971051162e+05 2.652487468568870965e-01 9.799915324755808371e-03 +1.166557571670969628e+05 2.591749875649940749e-01 9.837543952070135211e-03 +1.167614821370887803e+05 2.441859006984713476e-01 9.002772600727229277e-03 +1.168672071070806269e+05 2.375954022953338518e-01 8.871220761366496732e-03 +1.169729320770724444e+05 2.404334651965049363e-01 8.849940207776621146e-03 +1.170786570470642910e+05 2.200378487134159178e-01 8.192574042744961427e-03 +1.171843820170561085e+05 2.554628528064570858e-01 9.146554059431622266e-03 +1.172901069870479550e+05 2.402345262870869969e-01 8.927084950318001436e-03 +1.173958319570397725e+05 2.223830941370235348e-01 8.238663235775855673e-03 +1.175015569270315900e+05 2.156714715390434522e-01 8.288753662859365753e-03 +1.176072818970234366e+05 2.144975533566969850e-01 8.089387836981216939e-03 +1.177130068670152541e+05 2.222523115257560300e-01 8.382666999938129249e-03 +1.178187318370071007e+05 2.247122374664604350e-01 8.527413637404647473e-03 +1.179244568069989182e+05 2.176991314704052327e-01 8.289646023031281216e-03 +1.180301817769907648e+05 2.202914916945064305e-01 8.320446291019545706e-03 +1.181359067469825823e+05 2.262941688769418702e-01 8.470290334371148935e-03 +1.182416317169744289e+05 2.163303455132120634e-01 8.200087863822798015e-03 +1.183473566869662463e+05 2.253529041357771601e-01 8.485746369038572878e-03 +1.184530816569580638e+05 2.153499840044142410e-01 8.222166384983095253e-03 +1.185588066269499104e+05 2.041143242015868164e-01 7.939314386426732026e-03 +1.186645315969417279e+05 2.209486178069004492e-01 8.504295104284041729e-03 +1.187702565669335745e+05 2.231067037839766509e-01 8.422231363233291176e-03 +1.188759815369253920e+05 2.218412548674120743e-01 8.485103294017847311e-03 +1.189817065069172386e+05 2.157033484859799954e-01 8.156913895739323003e-03 +1.190874314769090561e+05 2.078469953472356913e-01 8.083721380256607761e-03 +1.191931564469009027e+05 2.101531620564707770e-01 8.214911401571690919e-03 +1.192988814168927202e+05 2.184732438751674777e-01 8.376701961007622724e-03 +1.194046063868845376e+05 2.132863965792252126e-01 8.245373751325613121e-03 +1.195103313568763842e+05 2.128789276299013211e-01 8.525464556040345671e-03 +1.196160563268682017e+05 2.301955929833881254e-01 8.831706168314263500e-03 +1.197217812968600483e+05 2.062005398636251319e-01 8.055834012324869856e-03 +1.198275062668518658e+05 2.256572161908273200e-01 8.949993127757290695e-03 +1.199332312368437124e+05 2.207237400361440616e-01 8.555612465914184603e-03 +1.200389562068355299e+05 2.351981671126369411e-01 9.640919642585430577e-03 +1.201446811768273765e+05 2.324430913244192320e-01 9.041065208960108804e-03 +1.202504061468191940e+05 2.303221807871182747e-01 8.924024510082954192e-03 +1.203561311168110406e+05 2.275659094798652415e-01 8.867316931710363462e-03 +1.204618560868028580e+05 2.248402975871915954e-01 8.677478100208187856e-03 +1.205675810567946755e+05 2.184323348598804504e-01 8.758614215015282992e-03 +1.206733060267865221e+05 2.317178357512484355e-01 9.056218496695278217e-03 +1.207790309967783396e+05 2.124165120819478947e-01 8.682584140491455410e-03 +1.208847559667701862e+05 2.243497803893636233e-01 9.103269878316555541e-03 +1.209904809367620037e+05 2.280121304650390146e-01 8.829331062745032419e-03 +1.210962059067538503e+05 2.187342705615127336e-01 8.657291970720432106e-03 +1.212019308767456678e+05 2.398898227276120010e-01 9.634962908160054490e-03 +1.213076558467374853e+05 2.316024270351623449e-01 9.097278465358323365e-03 +1.214133808167293319e+05 2.258060026264544218e-01 8.731425467288339223e-03 +1.215191057867211493e+05 2.238943740466861898e-01 8.948038859518397600e-03 +1.216248307567129959e+05 2.059461437445352372e-01 8.478657054053694367e-03 +1.217305557267048134e+05 2.144192111066511031e-01 8.694261319514810446e-03 +1.218362806966966600e+05 2.227939529094750126e-01 9.058414468026574837e-03 +1.219420056666884775e+05 2.394265429210962193e-01 9.303432036005721342e-03 +1.220477306366803241e+05 2.271891986129690733e-01 9.241446051595438374e-03 +1.221534556066721416e+05 2.275607329655660593e-01 8.960339716086410111e-03 +1.222591805766639882e+05 2.160697972488861696e-01 9.052624894128865132e-03 +1.223649055466558057e+05 2.090149333117529151e-01 8.499604092621397544e-03 +1.224706305166476232e+05 2.315773871433376430e-01 9.148042180670541354e-03 +1.225763554866394697e+05 2.356176745955541607e-01 9.328286248841258232e-03 +1.226820804566312872e+05 2.023163927594236466e-01 8.450429502534365436e-03 +1.227878054266231338e+05 2.195085832688976890e-01 9.282767907360446255e-03 +1.228935303966149513e+05 2.354113633245441539e-01 9.360077047676763212e-03 +1.229992553666067979e+05 2.040771835439862958e-01 8.506602654178671563e-03 +1.231049803365986154e+05 2.223674949341691298e-01 9.231909884003680969e-03 +1.232107053065904620e+05 2.178303662504975646e-01 8.829362445309671403e-03 +1.233164302765822795e+05 2.313766398051848860e-01 9.279331370126042700e-03 +1.234221552465740970e+05 2.111630908041708110e-01 8.553477002482748684e-03 +1.235278802165659436e+05 2.187891170546616137e-01 9.050681020963088561e-03 +1.236336051865577610e+05 2.137452986604335414e-01 8.960600075031284126e-03 +1.237393301565496076e+05 2.204680841826383297e-01 9.051132631252130356e-03 +1.238450551265414251e+05 2.247560191533417018e-01 9.195171014808345769e-03 +1.239507800965332717e+05 2.317509032874050245e-01 9.485755505930365539e-03 +1.240565050665250892e+05 2.135759393129103567e-01 8.724028395751577333e-03 +1.241622300365169358e+05 2.230356342331409336e-01 9.211068580953397575e-03 +1.242679550065087533e+05 2.289045600554253657e-01 9.696828534352065418e-03 +1.243736799765005708e+05 2.228165592345090207e-01 9.290548745217463295e-03 +1.244794049464924174e+05 2.084372276899973397e-01 8.726235123248446759e-03 +1.245851299164842349e+05 2.249115756404905242e-01 9.491095211002656060e-03 +1.246908548864760814e+05 2.259690825957728078e-01 9.077627390589881190e-03 +1.247965798564678989e+05 2.071356471813606825e-01 8.622041275204618202e-03 +1.249023048264597455e+05 2.287892385057558042e-01 9.578086182026865347e-03 +1.250080297964515630e+05 2.207825433874555932e-01 9.255014279901812441e-03 +1.251137547664434096e+05 2.258863036783118339e-01 9.657414854847416394e-03 +1.252194797364352271e+05 2.096245198315886682e-01 8.875144621501967687e-03 +1.253252047064270446e+05 2.252686974842575407e-01 9.271972968076358512e-03 +1.254309296764188912e+05 2.187826556545689194e-01 9.026620807967213056e-03 +1.255366546464107087e+05 2.365761774561976061e-01 9.847842720708628941e-03 +1.256423796164025553e+05 2.224118147960971736e-01 9.503129738164981313e-03 +1.257481045863943727e+05 2.138064115151800393e-01 9.118128089499065794e-03 +1.258538295563862193e+05 2.482629497474752867e-01 1.010066299061661461e-02 +1.259595545263780368e+05 2.207166099696870054e-01 9.147919766525078669e-03 +1.260652794963698834e+05 2.243406531358708711e-01 9.209123491555191998e-03 +1.261710044663617009e+05 2.288595193438521802e-01 9.444793531526772187e-03 +1.262767294363535184e+05 2.189241429910153136e-01 9.094435346032875636e-03 +1.263824544063453650e+05 2.314572964219691054e-01 9.695287534665796361e-03 +1.264881793763371825e+05 2.169751523227949619e-01 9.053150415157390496e-03 +1.265939043463290291e+05 2.342480896167123960e-01 9.923156924957456798e-03 +1.266996293163208466e+05 2.230879153378876878e-01 9.509992661107949732e-03 +1.268053542863126931e+05 2.335441693595659285e-01 9.918842364248987506e-03 +1.269110792563045106e+05 2.218909041712402719e-01 9.292974531301149629e-03 +1.270168042262963572e+05 2.084503936562527859e-01 9.009991753653702126e-03 +1.271225291962881747e+05 2.234813535659227746e-01 9.374389256488929387e-03 +1.272282541662800213e+05 2.355269707333294549e-01 9.988462269370151220e-03 +1.273339791362718388e+05 2.194846223947048980e-01 9.486598415590906039e-03 +1.274397041062636563e+05 2.138723902048775549e-01 9.257286540708941150e-03 +1.275454290762555029e+05 2.209127362430622632e-01 9.665130439337896867e-03 +1.276511540462473204e+05 2.210549334536791588e-01 9.331882907159564158e-03 +1.277568790162391670e+05 2.223949588780788078e-01 9.528901741107747431e-03 +1.278626039862309844e+05 2.180547158738130320e-01 9.307857837490428679e-03 +1.279683289562228310e+05 2.198326746820335742e-01 9.319363106504491637e-03 +1.280740539262146485e+05 2.305519119937660399e-01 9.862387764340401972e-03 +1.281797788962064660e+05 2.274317320891862393e-01 9.942075584247686559e-03 +1.282855038661983126e+05 2.053671548021328286e-01 9.300173090999600337e-03 +1.283912288361901301e+05 2.388033615983886915e-01 1.080940696919313604e-02 +1.284969538061819767e+05 2.437059220798022952e-01 1.114903099291441810e-02 +1.286026787761737942e+05 2.460141998668553265e-01 1.144260374128189435e-02 +1.287084037461656408e+05 2.558842268307560119e-01 1.077598950523712962e-02 +1.288141287161574583e+05 2.478323170337098924e-01 1.133126734666561539e-02 +1.289198536861493048e+05 2.869324365246377906e-01 1.314048565519590830e-02 +1.290255786561411223e+05 3.133253902027609561e-01 1.485399050108035350e-02 +1.291313036261329689e+05 3.522136160514384717e-01 1.557705152527841426e-02 +1.292370285961247864e+05 3.979548875337485248e-01 1.841824653445779669e-02 +1.293427535661166039e+05 4.898672851196529954e-01 1.994449672072443752e-02 +1.294484785361084505e+05 6.195159505582389370e-01 2.342891079027479423e-02 +1.295542035061002680e+05 8.271246993829881600e-01 2.882285201018386367e-02 +1.296599284760921146e+05 1.091723254033132529e+00 3.402762159262347208e-02 +1.297656534460839321e+05 1.330634795445736263e+00 3.755206155146765395e-02 +1.298713784160757787e+05 1.746838338557887615e+00 4.386598931703151322e-02 +1.299771033860675961e+05 2.162094919985972918e+00 4.941425748839173293e-02 +1.300828283560594427e+05 2.775822194626114570e+00 5.696113046341477054e-02 +1.301885533260512602e+05 3.241105289386324362e+00 6.090589138067965119e-02 +1.302942782960430777e+05 4.024725253232925404e+00 6.904691260174526668e-02 +1.304000032660349243e+05 4.619247908685898629e+00 7.364484699216285180e-02 +1.305057282360267418e+05 5.143740663106269650e+00 7.856641048725394871e-02 +1.306114532060185884e+05 5.681885859736343747e+00 8.195687513465932383e-02 +1.307171781760104059e+05 6.117856335990666139e+00 8.478095973101976157e-02 +1.308229031460022525e+05 6.211499011704282758e+00 8.548277325068305565e-02 +1.309286281159940700e+05 6.559895982229568823e+00 8.815049292534184178e-02 +1.310343530859859166e+05 6.725039730578382446e+00 8.931357789307270423e-02 +1.311400780559777340e+05 6.784162239342376388e+00 8.975667407204843129e-02 +1.312458030259695661e+05 6.883224267654023620e+00 9.123393455051700962e-02 +1.313515279959613981e+05 6.763938202590786375e+00 9.022667561809091796e-02 +1.314572529659532302e+05 7.005841050690907679e+00 9.307678279662043308e-02 +1.315629779359450622e+05 7.212399855260141379e+00 9.528444561152357717e-02 +1.316687029059368942e+05 7.155318475661229805e+00 9.529888729584928830e-02 +1.317744278759287263e+05 6.926090007217214684e+00 9.269610185209714581e-02 +1.318801528459205583e+05 6.939886988667817391e+00 9.296408407874250102e-02 +1.319858778159123904e+05 7.057098973357736504e+00 9.407318330990788180e-02 +1.320916027859042224e+05 6.796847173533040021e+00 9.216975498667878686e-02 +1.321973277558960544e+05 6.886101654739394284e+00 9.271471901296646223e-02 +1.323030527258878865e+05 6.826501516784505341e+00 9.191019085556513535e-02 +1.324087776958796894e+05 6.740690912118140865e+00 9.142897026284561857e-02 +1.325145026658715506e+05 6.875761182148048434e+00 9.273149405383059041e-02 +1.326202276358633535e+05 6.574465438692802088e+00 9.066632427775678238e-02 +1.327259526058552146e+05 6.430736073077643056e+00 8.882504949729827515e-02 +1.328316775758470176e+05 6.205065743580179038e+00 8.763619373092146336e-02 +1.329374025458388787e+05 6.055975046733847122e+00 8.525740423084744724e-02 +1.330431275158306817e+05 5.810348073920614809e+00 8.374584388258708711e-02 +1.331488524858225137e+05 5.202487269788142576e+00 7.871458581884838157e-02 +1.332545774558143457e+05 4.901439285522314115e+00 7.621545152238522192e-02 +1.333603024258061778e+05 4.455441012613665208e+00 7.374988084979992864e-02 +1.334660273957980098e+05 4.014624427558124431e+00 6.949829970652772471e-02 +1.335717523657898419e+05 3.357439258884150846e+00 6.276471752736464960e-02 +1.336774773357816739e+05 3.074243334279343376e+00 6.102761363688193053e-02 +1.337832023057735059e+05 2.690993926106871381e+00 5.718516535053889266e-02 +1.338889272757653380e+05 2.133341267243306749e+00 5.087841703258451365e-02 +1.339946522457571700e+05 1.706145606702275552e+00 4.479025146509699185e-02 +1.341003772157490021e+05 1.418776366430156255e+00 4.009345603896813381e-02 +1.342061021857408341e+05 1.149651540600688193e+00 3.567116834105521495e-02 +1.343118271557326370e+05 9.359240093721680198e-01 3.111805124868454939e-02 +1.344175521257244982e+05 7.392217604264499364e-01 2.649974956730228107e-02 +1.345232770957163011e+05 5.974010016922741695e-01 2.352050725370338075e-02 +1.346290020657081623e+05 5.122529783628895217e-01 2.100117299440942831e-02 +1.347347270356999652e+05 4.369186828094981379e-01 1.820779875510566970e-02 +1.348404520056918263e+05 3.641264360181142856e-01 1.642250957061542477e-02 +1.349461769756836293e+05 3.324689255102892815e-01 1.538996285737589086e-02 +1.350519019456754904e+05 2.751887213688019584e-01 1.319941013637726882e-02 +1.351576269156672934e+05 2.667179515874109619e-01 1.248006522290483027e-02 +1.352633518856591254e+05 2.500309949662977149e-01 1.150413873101356621e-02 +1.353690768556509574e+05 2.376828160934296164e-01 1.100730112193640600e-02 +1.354748018256427895e+05 2.437813663201297554e-01 1.136482046127797532e-02 +1.355805267956346215e+05 2.348008615430852153e-01 1.139226133452267246e-02 +1.356862517656264536e+05 2.359489136583078350e-01 1.123487954992605058e-02 +1.357919767356182856e+05 2.327644388621944727e-01 1.066525192081893385e-02 +1.358977017056101176e+05 2.410306573787168727e-01 1.115112533463190510e-02 +1.360034266756019497e+05 2.242376006735766480e-01 1.032589394511670283e-02 +1.361091516455937817e+05 2.319750333518749152e-01 1.095563704117427650e-02 +1.362148766155855847e+05 2.116585743169624445e-01 9.733423203371843399e-03 +1.363206015855774458e+05 2.136912711850529334e-01 9.840610356199291919e-03 +1.364263265555692487e+05 2.120566679334806026e-01 1.005681956296230854e-02 +1.365320515255611099e+05 2.119287589879387534e-01 1.010160107992742924e-02 +1.366377764955529128e+05 2.199103222741660424e-01 1.039148600746339808e-02 +1.367435014655447740e+05 2.217394754404639623e-01 1.064154330791901998e-02 +1.368492264355365769e+05 2.341387165850998264e-01 1.071070038242468922e-02 +1.369549514055284380e+05 2.324031005537131600e-01 1.078576870721577145e-02 +1.370606763755202410e+05 2.154112891526790696e-01 1.013772262138356098e-02 +1.371664013455120730e+05 2.304913606265952264e-01 1.041527487308956806e-02 +1.372721263155039051e+05 2.133676942045822644e-01 1.028921090783435632e-02 +1.373778512854957371e+05 2.200850222152321289e-01 1.043479041848628316e-02 +1.374835762554875691e+05 2.115067946024764278e-01 1.033513161981168375e-02 +1.375893012254794012e+05 1.968794775734498403e-01 9.846882664359547788e-03 +1.376950261954712332e+05 2.286996489878565519e-01 1.094573632454564835e-02 +1.378007511654630653e+05 2.212893557373361575e-01 1.032539163103112119e-02 +1.379064761354548973e+05 2.250654077754672966e-01 1.064917588366093466e-02 +1.380122011054467293e+05 2.169303156388561193e-01 1.032316625401726376e-02 +1.381179260754385323e+05 2.145950150099039111e-01 1.012287691026014617e-02 +1.382236510454303934e+05 2.240664463440875109e-01 1.107640221079702995e-02 +1.383293760154221964e+05 1.988185497232080601e-01 9.711236072524841861e-03 +1.384351009854140575e+05 2.093568921841441333e-01 1.029671070184533764e-02 +1.385408259554058604e+05 2.142482338934685870e-01 1.015253852770874737e-02 +1.386465509253977216e+05 2.084701257242053685e-01 1.046632516021427789e-02 +1.387522758953895245e+05 2.282332222856282289e-01 1.083485532107760982e-02 +1.388580008653813857e+05 2.262544609658330708e-01 1.101399246343460168e-02 +1.389637258353731886e+05 2.240826899551640328e-01 1.089836170990601816e-02 +1.390694508053650497e+05 2.289736397968118176e-01 1.145088782611786496e-02 +1.391751757753568527e+05 2.310072912813540824e-01 1.150649571277934970e-02 +1.392809007453486847e+05 2.038365634135492765e-01 1.051415911945256798e-02 +1.393866257153405168e+05 2.262122093036055548e-01 1.095605118036692069e-02 +1.394923506853323488e+05 1.916324762462837672e-01 9.643281062944117007e-03 +1.395980756553241808e+05 2.254004695020522531e-01 1.077301778468769608e-02 +1.397038006253160129e+05 2.153486277460286702e-01 9.987850834905333611e-03 +1.398095255953078449e+05 2.208633543146503175e-01 1.102043924903204318e-02 +1.399152505652996770e+05 2.233555962178540300e-01 1.094810024249037901e-02 +1.400209755352914799e+05 2.192687014135046297e-01 1.088985056186542351e-02 +1.401267005052833410e+05 2.165800754864121158e-01 1.044935353902403524e-02 +1.402324254752751440e+05 2.076625923939720564e-01 1.083998341298254668e-02 +1.403381504452670051e+05 2.152322182713863052e-01 1.078052720834613183e-02 +1.404438754152588081e+05 2.175911622190190020e-01 1.068329195952606551e-02 +1.405496003852506692e+05 2.086664678388002736e-01 1.029812382130434502e-02 +1.406553253552424721e+05 1.910022871059703087e-01 9.658639264563293261e-03 +1.407610503252343333e+05 2.221918741249029883e-01 1.055978759462712982e-02 +1.408667752952261362e+05 2.310929462772041143e-01 1.157389965595615605e-02 +1.409725002652179974e+05 2.206030962114894078e-01 1.068442149108067736e-02 +1.410782252352098003e+05 2.365143343865339365e-01 1.184234088487312424e-02 +1.411839502052016323e+05 2.061497226990990916e-01 1.004178058305370269e-02 +1.412896751751934644e+05 2.007457820692460093e-01 1.057397840135616829e-02 +1.413954001451852964e+05 2.269138040572972748e-01 1.148299052592839480e-02 +1.415011251151771285e+05 2.187444430487174851e-01 1.082464688322948634e-02 +1.416068500851689605e+05 2.327294966834441148e-01 1.115294157088562652e-02 +1.417125750551607925e+05 2.175345617951129906e-01 1.078633199830639905e-02 +1.418183000251526246e+05 2.205083336886310696e-01 1.086512205478367549e-02 +1.419240249951444566e+05 2.107837208582757360e-01 1.066605843326687980e-02 +1.420297499651362887e+05 2.115061275133223451e-01 1.084752385721470501e-02 +1.421354749351280916e+05 2.210205203144896269e-01 1.075493428538479290e-02 +1.422411999051199527e+05 2.247154919034082543e-01 1.135457546655715272e-02 +1.423469248751117557e+05 2.062548271999571081e-01 1.029943063170208825e-02 +1.424526498451036168e+05 2.162923613660452382e-01 1.098583139769640331e-02 +1.425583748150954198e+05 2.332573209093087574e-01 1.194451508968604782e-02 +1.426640997850872809e+05 2.092738016426494430e-01 1.103322839976716464e-02 +1.427698247550790838e+05 2.143855732549622695e-01 1.064079137519201301e-02 +1.428755497250709450e+05 2.133773675911857792e-01 1.080022188061474132e-02 +1.429812746950627479e+05 2.299257802683101204e-01 1.148402317243009223e-02 +1.430869996650545800e+05 2.087614621120868486e-01 1.092430336169621617e-02 +1.431927246350464120e+05 2.073160943720060712e-01 1.014374598971759522e-02 +1.432984496050382440e+05 2.260519614255812326e-01 1.143851478058990033e-02 +1.434041745750300761e+05 2.227841552713855366e-01 1.100163050303500610e-02 +1.435098995450219081e+05 1.948186260977458617e-01 1.010294251347885509e-02 +1.436156245150137402e+05 2.313299169970647884e-01 1.167571944402923979e-02 +1.437213494850055722e+05 2.329533458356829456e-01 1.198649392210136833e-02 +1.438270744549974042e+05 2.012773579395452095e-01 1.040978777252183490e-02 +1.439327994249892363e+05 2.253177030378108459e-01 1.131059633984226979e-02 +1.440385243949810392e+05 2.170440597185670228e-01 1.084618256759973566e-02 +1.441442493649729004e+05 2.089957378865812399e-01 1.088842783133075337e-02 +1.442499743349647033e+05 2.229141845655621956e-01 1.158828897545098428e-02 +1.443556993049565644e+05 2.296959583369811153e-01 1.163691531986209282e-02 +1.444614242749483674e+05 2.265642362697773970e-01 1.138401542262160865e-02 +1.445671492449402285e+05 1.979754986227920122e-01 1.041118615332669445e-02 +1.446728742149320315e+05 2.232505629395563074e-01 1.143882934112433122e-02 +1.447785991849238926e+05 2.203379242243530545e-01 1.114684743982490879e-02 +1.448843241549156955e+05 2.094989442160778703e-01 1.077022085893173005e-02 +1.449900491249075276e+05 2.230321104575319624e-01 1.136664416747953411e-02 +1.450957740948993596e+05 2.185709323448341845e-01 1.130061606684995730e-02 +1.452014990648911917e+05 2.189993589854714595e-01 1.165968446031035929e-02 +1.453072240348830237e+05 2.170760965710200607e-01 1.107997997411090500e-02 +1.454129490048748557e+05 2.089368235514239835e-01 1.115264126309307817e-02 +1.455186739748666878e+05 2.227906958277255656e-01 1.157524481695150140e-02 +1.456243989448585198e+05 2.288984347382182760e-01 1.163572171851656213e-02 +1.457301239148503519e+05 2.166324780278295614e-01 1.112606046329517838e-02 +1.458358488848421839e+05 2.240686013203098681e-01 1.131007647578926786e-02 +1.459415738548340159e+05 2.137727374667499902e-01 1.070626977777805466e-02 +1.460472988248258480e+05 2.092772608277773394e-01 1.085519659922256838e-02 +1.461530237948176509e+05 2.183977916289762400e-01 1.091454500692021906e-02 +1.462587487648095121e+05 2.161329271579593703e-01 1.104795174943974841e-02 +1.463644737348013150e+05 2.057192560355345090e-01 1.109275398540651714e-02 +1.464701987047931761e+05 2.261594132862939921e-01 1.142945533388271470e-02 +1.465759236747849791e+05 2.211331050662099507e-01 1.151463489844892912e-02 +1.466816486447768402e+05 2.086239028174097787e-01 1.097638051050979502e-02 +1.467873736147686432e+05 2.088391152223439684e-01 1.092892571183915786e-02 diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb new file mode 100644 index 00000000..1d74fb1d --- /dev/null +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb @@ -0,0 +1,1619 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "8ff514e8", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Remove this cell in the final version of the tutorial.\n", + "# Google Colab and Jupyter Notebook environments may not have the\n", + "# easydiffraction library installed by default. So, we check if the\n", + "# library is available and install it if necessary.\n", + "import builtins\n", + "import importlib.util\n", + "\n", + "if hasattr(builtins, \"__IPYTHON__\"):\n", + " if importlib.util.find_spec('easydiffraction') is None:\n", + " print('Installing the easydiffraction library...')\n", + " !pip install git+https://github.com/easyscience/diffraction-lib@d-spacing" + ] + }, + { + "cell_type": "markdown", + "id": "c4f59cef", + "metadata": {}, + "source": [ + "# Data Analysis: Powder Diffraction\n", + "\n", + "This tutorial will guide you through the refinement of simulated diffraction\n", + "patterns for Si (Part 1) and La₀.₅Ba₀.₅CoO₃ (LBCO) (Part 2) using the\n", + "EasyDiffraction Python library.\n", + "\n", + "The objective is to develop familiarity with the Rietveld refinement process\n", + "for crystal structures using powder diffraction data.\n", + "\n", + "## 🛠️ Import Library\n", + "\n", + "First, import the necessary library for the analysis. In this tutorial, we\n", + "use the EasyDiffraction library, which offers tools for\n", + "analyzing and refining powder diffraction data.\n", + "\n", + "This tutorial is self-contained and designed for hands-on learning.\n", + "However, if you're interested in exploring more advanced features or learning\n", + "about additional capabilities of the EasyDiffraction library, please refer to\n", + "the official documentation: https://easyscience.github.io/diffraction-lib\n", + "\n", + "Depending on your requirements, you may choose to import only specific\n", + "classes. However, for the sake of simplicity in this tutorial, we will import\n", + "the entire library." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b4905a50", + "metadata": {}, + "outputs": [], + "source": [ + "import easydiffraction as ed" + ] + }, + { + "cell_type": "markdown", + "id": "c8b56df0", + "metadata": {}, + "source": [ + "## 📘 Introduction: Simple Reference Fit – Si\n", + "\n", + "Before diving into the more complex fitting exercise with the La₀.₅Ba₀.₅CoO₃\n", + "(LBCO) crystal structure, let's start with a simpler example using the\n", + "silicon (Si) crystal structure. This will help us understand the basic\n", + "concepts and steps involved in fitting a crystal structure using powder\n", + "diffraction data.\n", + "\n", + "For this part of the tutorial, we will use the powder diffraction data\n", + "from the [previous tutorial](#), simulated using the Si crystal structure.\n", + "\n", + "### 📦 Create a Project – 'reference'\n", + "\n", + "In EasyDiffraction, a project serves as a container for all information\n", + "related to the analysis of a specific experiment or set of experiments. It\n", + "enables you to organize your data, experiments, sample models, and fitting\n", + "parameters in a structured manner. You can think of it as a folder containing\n", + "all the essential details about your analysis. The project also allows\n", + "us to visualize both the measured and calculated diffraction patterns, among\n", + "other things." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30116e14", + "metadata": {}, + "outputs": [], + "source": [ + "project_1 = ed.Project(name='reference')" + ] + }, + { + "cell_type": "markdown", + "id": "c1d17f64", + "metadata": {}, + "source": [ + "\n", + "You can set the title and description of the project to provide context\n", + "and information about the analysis being performed. This is useful for\n", + "documentation purposes and helps others (or yourself in the future) understand\n", + "the purpose of the project at a glance." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e8fabf6", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.info.title = 'Reference Silicon Fit'\n", + "project_1.info.description = 'Fitting simulated powder diffraction pattern of Si.'" + ] + }, + { + "cell_type": "markdown", + "id": "ad044ebb", + "metadata": {}, + "source": [ + "### 🔬 Create an Experiment\n", + "\n", + "Now we will create an experiment within the project. An experiment\n", + "represents a specific diffraction measurement performed on a specific sample\n", + "using a particular instrument. It contains\n", + "details about the measured data, instrument parameters, and other relevant\n", + "information.\n", + "\n", + "In this case, the experiment is defined as a powder diffraction measurement\n", + "using time-of-flight neutrons. The measured data is loaded from a file\n", + "containing the reduced diffraction pattern of Si from the previous\n", + "tutorial." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7b6124c0", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Remove this cell in the final version of the tutorial.\n", + "# Google Colab does not have the data files needed for this tutorial.\n", + "ed.download_from_repository('powder_reduced_Si_2large_bank.xye',\n", + " branch='d-spacing',\n", + " destination='data')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c71a924b", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.experiments.add(name='sim_si',\n", + " sample_form='powder',\n", + " beam_mode='time-of-flight',\n", + " radiation_probe='neutron',\n", + " data_path='data/powder_reduced_Si_2large_bank.xye')" + ] + }, + { + "cell_type": "markdown", + "id": "4ec59b39", + "metadata": {}, + "source": [ + "#### Inspect Measured Data\n", + "\n", + "After creating the experiment, we can examine the measured data. The measured\n", + "data consists of a diffraction pattern comprising time-of-flight (TOF) values\n", + "and corresponding intensities. The TOF values are given in microseconds (μs),\n", + "and the intensities are in arbitrary units.\n", + "\n", + "The data is stored in XYE format, a simple text format containing three\n", + "columns: TOF, intensity, and intensity error (if available).\n", + "\n", + "The `plot_meas` method of the project enables us to visualize the measured\n", + "diffraction pattern.\n", + "\n", + "Before plotting, we set the plotting engine to 'plotly', which provides\n", + "interactive visualizations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e993a5e", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.plotter.engine = 'plotly'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6452757", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.plot_meas(expt_name='sim_si')" + ] + }, + { + "cell_type": "markdown", + "id": "0362eb2a", + "metadata": {}, + "source": [ + "If you zoom in on the highest TOF peak (around 120,000 μs), you will notice\n", + "that it has a broad and unusual shape. This is a result of the simplified\n", + "data reduction process. Obtaining a more accurate diffraction pattern would\n", + "require a more advanced data reduction, which is beyond the scope of this\n", + "tutorial. Therefore, we will simply exclude the high TOF region from the analysis by\n", + "adding an excluded region to the experiment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13b0c182", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.experiments['sim_si'].excluded_regions.add(minimum=108000, maximum=200000)" + ] + }, + { + "cell_type": "markdown", + "id": "b6434dd6", + "metadata": {}, + "source": [ + "To visualize the effect of excluding the high TOF region, we can plot\n", + "the measured data again. The excluded region will be omitted from the plot\n", + "and is not used in the fitting process." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0c06624e", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.plot_meas(expt_name='sim_si')" + ] + }, + { + "cell_type": "markdown", + "id": "49c00bd2", + "metadata": {}, + "source": [ + "#### Set Instrument Parameters\n", + "\n", + "After experiment is created and measured data are loaded, we would need\n", + "to set the instrument parameters.\n", + "\n", + "In this type of experiment, the instrument parameters define how the\n", + "measured data is converted between d-spacing and time-of-flight (TOF)\n", + "during the data reduction process as well as the angular position of the\n", + "detector. So, we put values based on those from the reduction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3da278e", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.experiments['sim_si'].instrument.setup_twotheta_bank = 101.46\n", + "#project_1.experiments['sim_si'].instrument.calib_d_to_tof_offset = 0.0\n", + "project_1.experiments['sim_si'].instrument.calib_d_to_tof_linear = 61710.64\n", + "project_1.experiments['sim_si'].instrument.calib_d_to_tof_quad = -0.00001" + ] + }, + { + "cell_type": "markdown", + "id": "d866b023", + "metadata": {}, + "source": [ + "#### Set Peak Profile Parameters\n", + "\n", + "The next set of parameters is needed to define the peak profile used in the\n", + "fitting process. The peak profile describes shape of the diffraction peaks.\n", + "They include parameters for the broadening and asymmetry of the peaks. Here,\n", + "we use a pseudo-Voigt peak profile function with Ikeda-Carpenter asymmetry, which is a common\n", + "choice for neutron powder diffraction data. The values are typically determined\n", + "experimentally on the same instrument and under the same configuration as the\n", + "data being analyzed based on measurements of a standard\n", + "sample. In some cases, these parameters are refined during the fitting\n", + "process to improve the fit between the measured and calculated diffraction, but\n", + "in this case, we will use the values from another simulation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3c9e509a", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.experiments['sim_si'].peak_profile_type = 'pseudo-voigt * ikeda-carpenter'\n", + "project_1.experiments['sim_si'].peak.broad_gauss_sigma_0 = 45137\n", + "project_1.experiments['sim_si'].peak.broad_gauss_sigma_1 = -52394\n", + "project_1.experiments['sim_si'].peak.broad_gauss_sigma_2 = 22998\n", + "project_1.experiments['sim_si'].peak.broad_mix_beta_0 = 0.0055\n", + "project_1.experiments['sim_si'].peak.broad_mix_beta_1 = 0.0041\n", + "project_1.experiments['sim_si'].peak.asym_alpha_0 = 0\n", + "project_1.experiments['sim_si'].peak.asym_alpha_1 = 0.0097" + ] + }, + { + "cell_type": "markdown", + "id": "4b960a31", + "metadata": {}, + "source": [ + "#### Set Background\n", + "\n", + "The background of the diffraction pattern represents the portion of the pattern that\n", + "is not related to the crystal structure of the sample, but rather to\n", + "incoherent scattering from the sample itself, the sample holder, the sample\n", + "environment, and the instrument. The background can be modeled in various\n", + "ways. In this case, we will use a simple line segment background, which is a\n", + "common approach for powder diffraction data. The background intensity at any\n", + "point is defined by linear interpolation between neighboring points.\n", + "The background points are selected\n", + "to span the range of the diffraction pattern while avoiding the peaks.\n", + "\n", + "In this case, we will add several background points at specific TOF values\n", + "(in microseconds) and corresponding intensity values. These points are\n", + "chosen to represent the background level in the diffraction pattern free from\n", + "any peaks. The background points are added using the `add` method of the\n", + "`background` attribute of the experiment. The `x` parameter represents the TOF\n", + "value, and the `y` parameter represents the intensity value at that TOF.\n", + "\n", + "Let's set all the background points at a constant value of 0.01, which can be\n", + "roughly determined by the eye, and we will refine them later during the fitting\n", + "process." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57d6f06c", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.experiments['sim_si'].background_type = 'line-segment'\n", + "project_1.experiments['sim_si'].background.add(x=50000, y=0.01)\n", + "project_1.experiments['sim_si'].background.add(x=60000, y=0.01)\n", + "project_1.experiments['sim_si'].background.add(x=70000, y=0.01)\n", + "project_1.experiments['sim_si'].background.add(x=80000, y=0.01)\n", + "project_1.experiments['sim_si'].background.add(x=90000, y=0.01)\n", + "project_1.experiments['sim_si'].background.add(x=100000, y=0.01)\n", + "project_1.experiments['sim_si'].background.add(x=110000, y=0.01)" + ] + }, + { + "cell_type": "markdown", + "id": "fada02dd", + "metadata": {}, + "source": [ + "### 🧩 Create a Sample Model – Si\n", + "\n", + "After setting up the experiment, we need to create a sample model that\n", + "describes the crystal structure of the sample being analyzed.\n", + "\n", + "In this case, we will create a sample model for silicon (Si) with a\n", + "cubic crystal structure. The sample model contains information about the\n", + "space group, lattice parameters, atomic positions of the atoms in the\n", + "unit cell, atom types, occupancies and atomic displacement parameters.\n", + "The sample model is essential for the fitting process, as it\n", + "is used to calculate the expected diffraction pattern.\n", + "\n", + "EasyDiffraction refines the crystal structure of the sample,\n", + "but does not solve it. Therefore, we need a good starting point with\n", + "reasonable structural parameters. Here, we define the Si structure as a\n", + "cubic structure with the space group F d -3 m. As this is a simple cubic\n", + "structure, we only need to define the single lattice parameter, which\n", + "is the length of the unit cell edge. The Si crystal structure has a\n", + "single atom in the unit cell, which is located at the origin (0, 0, 0) of\n", + "the unit cell. The symmetry of this site is defined by the Wyckoff letter 'a'.\n", + "The atomic displacement parameter defines the thermal vibrations of the\n", + "atoms in the unit cell and is presented as an isotropic parameter (B_iso).\n", + "\n", + "Sometimes, the initial crystal structure parameters can be obtained\n", + "from one of the crystallographic databases, like for example\n", + "the Crystallography Open Database (COD). In this case, we use the COD\n", + "entry for silicon as a reference for the initial crystal structure model:\n", + "https://www.crystallography.net/cod/4507226.html\n", + "\n", + "As with adding the experiment in the\n", + "previous step, we will create a default sample model\n", + "and then modify its parameters to match the Si structure.\n", + "\n", + "#### Add Sample Model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b4026bb", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.sample_models.add(name='si')" + ] + }, + { + "cell_type": "markdown", + "id": "a0c36f1f", + "metadata": {}, + "source": [ + "#### Set Space Group" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ceac0e8e", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.sample_models['si'].space_group.name_h_m = 'F d -3 m'\n", + "project_1.sample_models['si'].space_group.it_coordinate_system_code = '2'" + ] + }, + { + "cell_type": "markdown", + "id": "9a0a23cc", + "metadata": {}, + "source": [ + "#### Set Lattice Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0f860366", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.sample_models['si'].cell.length_a = 5.43" + ] + }, + { + "cell_type": "markdown", + "id": "9270c42b", + "metadata": {}, + "source": [ + "#### Set Atom Sites" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "759a998c", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.sample_models['si'].atom_sites.add(label='Si',\n", + " type_symbol='Si',\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter='a',\n", + " b_iso=0.95)" + ] + }, + { + "cell_type": "markdown", + "id": "4be2f331", + "metadata": {}, + "source": [ + "### 🔗 Assign Sample Model to Experiment\n", + "\n", + "Now we need to assign, or link, this sample model to the experiment created above.\n", + "This linked crystallographic phase will be used to calculate the expected diffraction\n", + "pattern based on the crystal structure defined in the sample model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "610ef867", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.experiments['sim_si'].linked_phases.add(id='si', scale=1.0)" + ] + }, + { + "cell_type": "markdown", + "id": "7e909775", + "metadata": {}, + "source": [ + "### 🚀 Analyze and Fit the Data\n", + "\n", + "After setting up the experiment and sample model, we can now analyze the\n", + "measured diffraction pattern and perform the fitting process.\n", + "\n", + "The fitting process involves comparing the measured diffraction pattern with\n", + "the calculated diffraction pattern based on the sample model and instrument\n", + "parameters. The goal is to adjust the parameters of the sample model and\n", + "the experiment to minimize the difference between the measured and calculated\n", + "diffraction patterns. This is done by refining the parameters of the sample\n", + "model and the instrument settings to achieve a better fit.\n", + "\n", + "#### Set Fit Parameters\n", + "\n", + "To perform the fit, we need to specify the refinement parameters. These\n", + "are the parameters that will be adjusted during the fitting process to\n", + "minimize the difference between the measured and calculated diffraction\n", + "patterns. In this case, we will refine only the scale factor of the Si phase\n", + "in the experiment, as well as the intensities of the background points.\n", + "This is done by setting\n", + "the `free` attribute of the corresponding parameters to `True`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7cd309e4", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.experiments['sim_si'].linked_phases['si'].scale.free = True\n", + "for line_segment in project_1.experiments['sim_si'].background:\n", + " line_segment.y.free = True" + ] + }, + { + "cell_type": "markdown", + "id": "2bacde08", + "metadata": {}, + "source": [ + "#### Show Free Parameters\n", + "\n", + "We can check which parameters are free to be refined by calling the\n", + "`show_free_params` method of the `analysis` object of the project." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "edb510ad", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.analysis.show_free_params()" + ] + }, + { + "cell_type": "markdown", + "id": "ec5b380e", + "metadata": {}, + "source": [ + "#### Visualize Diffraction Patterns\n", + "\n", + "Before performing the fit, we can visually compare the measured\n", + "diffraction pattern with the calculated diffraction pattern based on the\n", + "initial parameters of the sample model and the instrument settings.\n", + "This provides an indication of how well the initial parameters\n", + "match the measured data. The `plot_meas_vs_calc` method of the project\n", + "allows this comparison." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de73d893", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.plot_meas_vs_calc(expt_name='sim_si')" + ] + }, + { + "cell_type": "markdown", + "id": "1a0b603c", + "metadata": {}, + "source": [ + "#### Run Fitting\n", + "\n", + "We can now perform the fit using the `fit` method of the `analysis`\n", + "object of the project." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b55a8a1f", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.analysis.fit()" + ] + }, + { + "cell_type": "markdown", + "id": "d4353cd6", + "metadata": {}, + "source": [ + "#### Check Fit Results\n", + "You will\n", + "see that the fit is now much improved and that the intensities of the\n", + "calculated peaks align much better with the measured peaks. To check the\n", + "quality of the fit numerically, we can look at the goodness-of-fit\n", + "chi-squared value and the R-factors. The chi-squared value is a measure of how well\n", + "the calculated diffraction pattern matches the measured pattern, and it is\n", + "calculated as the sum of the squared differences between the measured and\n", + "calculated intensities, divided by the number of data points. Ideally, the\n", + "chi-squared value should be close to 1, indicating a good fit." + ] + }, + { + "cell_type": "markdown", + "id": "7fbe3845", + "metadata": {}, + "source": [ + "#### Visualize Fit Results\n", + "\n", + "After the fit is completed, we can plot the comparison between the\n", + "measured and calculated diffraction patterns again to see how well the fit\n", + "improved the agreement between the two. The calculated diffraction pattern\n", + "is now based on the refined parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d1c1cd1", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.plot_meas_vs_calc(expt_name='sim_si')" + ] + }, + { + "cell_type": "markdown", + "id": "830290d5", + "metadata": {}, + "source": [ + "#### TOF vs d-spacing\n", + "\n", + "The diffraction pattern is typically analyzed and plotted in the\n", + "time-of-flight (TOF) axis, which represents the time it takes for neutrons\n", + "to travel from the sample to the detector. However, it is sometimes more\n", + "convenient to visualize the diffraction pattern in the d-spacing axis,\n", + "which represents the distance between planes in the crystal lattice. The\n", + "d-spacing can be calculated from the TOF values using the instrument\n", + "parameters. The `plot_meas_vs_calc` method of the project allows us to\n", + "plot the measured and calculated diffraction patterns in the d-spacing axis\n", + "by setting the `d_spacing` parameter to `True`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a1ce9090", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.plot_meas_vs_calc(expt_name='sim_si', d_spacing=True)" + ] + }, + { + "cell_type": "markdown", + "id": "d152e9eb", + "metadata": {}, + "source": [ + "As you can see, the calculated diffraction pattern now matches the measured\n", + "pattern much more closely. Typically, additional parameters are included in the\n", + "refinement process to further improve the fit. However, we will stop here,\n", + "as the goal of this part of the tutorial is to demonstrate that the data reduction\n", + "and fitting process function correctly. The fit is not perfect, but it is\n", + "sufficient to show that the fitting process works and that the parameters\n", + "are being adjusted appropriately. The next part of the tutorial will be more advanced\n", + "and will involve fitting a more complex crystal structure: La₀.₅Ba₀.₅CoO₃ (LBCO).\n", + "\n", + "## 💪 Exercise: Complex Fit – LBCO\n", + "\n", + "Now that you have a basic understanding of the fitting process, we will\n", + "undertake a more complex fit of the La₀.₅Ba₀.₅CoO₃ (LBCO) crystal structure\n", + "using simulated powder diffraction data from the [previous tutorial](#).\n", + "\n", + "You can use the same approach as in the previous part of the tutorial, but\n", + "this time we will refine a more complex crystal structure LBCO with multiple atoms\n", + "in the unit cell.\n", + "\n", + "### 📦 Exercise 1: Create a Project – 'main'\n", + "\n", + "Create a new project for the LBCO fit.\n", + "\n", + "**Hint:** You can use the same approach as in the previous part of the\n", + "tutorial, but this time we will create a new project for the LBCO fit.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2171418", + "metadata": {}, + "outputs": [], + "source": [ + "project_2 = ed.Project(name='main')\n", + "project_2.info.title = 'La0.5Ba0.5CoO3 Fit'\n", + "project_2.info.description = 'Fitting simulated powder diffraction pattern of La0.5Ba0.5CoO3.'" + ] + }, + { + "cell_type": "markdown", + "id": "55e10c61", + "metadata": {}, + "source": [ + "### 🔬 Exercise 2: Define an Experiment – LBCO\n", + "\n", + "#### Exercise 2.1: Create an Experiment\n", + "\n", + "Create an experiment within the new project and load the reduced diffraction\n", + "pattern for LBCO.\n", + "\n", + "**Hint:** You can use the same approach as in the previous part of the\n", + "tutorial, but this time you need to use the data file for LBCO.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94da590f", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Remove this cell in the final version of the tutorial.\n", + "# Google Colab does not have the data files needed for this tutorial.\n", + "ed.download_from_repository('powder_reduced_lbco_0_05si_2large_bank.xye',\n", + " branch='d-spacing',\n", + " destination='data')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb5ba926", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments.add(name='sim_lbco',\n", + " sample_form='powder',\n", + " beam_mode='time-of-flight',\n", + " radiation_probe='neutron',\n", + " data_path='data/powder_reduced_lbco_0_05si_2large_bank.xye')" + ] + }, + { + "cell_type": "markdown", + "id": "491a17da", + "metadata": {}, + "source": [ + "#### Exercise 2.1: Inspect Measured Data\n", + "\n", + "Check the measured data of the LBCO experiment. Are there any\n", + "peaks with the shape similar to the Si peaks? If so, exclude them from the\n", + "analysis.\n", + "\n", + "**Hint:** You can use the `plot_meas` method of the project to visualize the\n", + "measured diffraction pattern. You can also use the `excluded_regions` attribute\n", + "of the experiment to exclude specific regions from the analysis.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4ee035f", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plotter.engine = 'plotly'\n", + "project_2.plot_meas(expt_name='sim_lbco')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d8cb981a", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments['sim_lbco'].excluded_regions.add(minimum=108000, maximum=200000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2660e4cc", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas(expt_name='sim_lbco')" + ] + }, + { + "cell_type": "markdown", + "id": "47fa6a1a", + "metadata": {}, + "source": [ + "#### Exercise 2.2: Set Instrument Parameters\n", + "\n", + "Set the instrument parameters for the LBCO experiment.\n", + "\n", + "**Hint:** Use the values from the data reduction process for the LBCO and\n", + "follow the same approach as in the previous part of the tutorial.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55faca39", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments['sim_lbco'].instrument.setup_twotheta_bank = 94.90931761529106\n", + "project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_offset = 0.0\n", + "project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_linear = 58752.5575 #58724.76869981215\n", + "project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_quad = -0.00001" + ] + }, + { + "cell_type": "markdown", + "id": "7bac55a8", + "metadata": {}, + "source": [ + "#### Exercise 2.3: Set Peak Profile Parameters\n", + "\n", + "Set the peak profile parameters for the LBCO experiment.\n", + "\n", + "**Hint:** Use the values from the previous part of the tutorial.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e8f46e7", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.peak_profile_type = 'pseudo-voigt * ikeda-carpenter'\n", + "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_0 = 47347.4233 #45211\n", + "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_1 = -55360.0162 #-52477\n", + "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_2 = 23882.4236 #23014\n", + "project_2.experiments['sim_lbco'].peak.broad_mix_beta_0 = 0.0055\n", + "project_2.experiments['sim_lbco'].peak.broad_mix_beta_1 = 0.0041\n", + "project_2.experiments['sim_lbco'].peak.asym_alpha_0 = 0\n", + "project_2.experiments['sim_lbco'].peak.asym_alpha_1 = 0.0096 #0.0097" + ] + }, + { + "cell_type": "markdown", + "id": "6030ce74", + "metadata": {}, + "source": [ + "#### Exercise 2.4: Set Background\n", + "\n", + "Set the background points for the LBCO experiment. What would you suggest as\n", + "the initial intensity value for the background points?\n", + "\n", + "**Hint:** Use the same approach as in the previous part of the tutorial, but\n", + "this time you need to set the background points for the LBCO experiment. You can\n", + "zoom in on the measured diffraction pattern to determine the approximate\n", + "background level.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40abaa16", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments['sim_lbco'].background_type = 'line-segment'\n", + "project_2.experiments['sim_lbco'].background.add(x=50000, y=0.2)\n", + "project_2.experiments['sim_lbco'].background.add(x=60000, y=0.2)\n", + "project_2.experiments['sim_lbco'].background.add(x=70000, y=0.2)\n", + "project_2.experiments['sim_lbco'].background.add(x=80000, y=0.2)\n", + "project_2.experiments['sim_lbco'].background.add(x=90000, y=0.2)\n", + "project_2.experiments['sim_lbco'].background.add(x=100000, y=0.2)\n", + "project_2.experiments['sim_lbco'].background.add(x=110000, y=0.2)" + ] + }, + { + "cell_type": "markdown", + "id": "e766f8bc", + "metadata": {}, + "source": [ + "### 🧩 Exercise 3: Define a Sample Model – LBCO\n", + "\n", + "The LBSO structure is not as simple as the Si model, as it contains multiple\n", + "atoms in the unit cell. It is not in COD, so we give you the structural\n", + "parameters in CIF format to create the sample model right here:" + ] + }, + { + "cell_type": "markdown", + "id": "89eb58d4", + "metadata": {}, + "source": [ + "```\n", + "data_lbco\n", + "\n", + "_space_group.name_H-M_alt \"P m -3 m\"\n", + "_space_group.IT_coordinate_system_code 1\n", + "\n", + "_cell.length_a 3.89\n", + "_cell.length_b 3.89\n", + "_cell.length_c 3.89\n", + "_cell.angle_alpha 90.0\n", + "_cell.angle_beta 90.0\n", + "_cell.angle_gamma 90.0\n", + "\n", + "loop_\n", + "_atom_site.label\n", + "_atom_site.type_symbol\n", + "_atom_site.fract_x\n", + "_atom_site.fract_y\n", + "_atom_site.fract_z\n", + "_atom_site.wyckoff_letter\n", + "_atom_site.occupancy\n", + "_atom_site.ADP_type\n", + "_atom_site.B_iso_or_equiv\n", + "La La 0.0 0.0 0.0 a 0.5 Biso 0.10\n", + "Ba Ba 0.0 0.0 0.0 a 0.5 Biso 0.10\n", + "Co Co 0.5 0.5 0.5 b 1.0 Biso 0.36\n", + "O O 0.0 0.5 0.5 c 1.0 Biso 2.14\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "922b6b26", + "metadata": {}, + "source": [ + "#### Exercise 3.1: Create Sample Model\n", + "\n", + "Create a sample model for LBCO based on the provided CIF data.\n", + "\n", + "**Hint:** You can use the same approach as in the previous part of the\n", + "tutorial, but this time you need to create a sample model for LBCO.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5cf2ac8d", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.sample_models.add(name='lbco')" + ] + }, + { + "cell_type": "markdown", + "id": "84557c0c", + "metadata": {}, + "source": [ + "#### Exercise 3.2: Set Space Group\n", + "\n", + "Set the space group for the LBCO sample model.\n", + "\n", + "**Hint:** Use the space group name and IT coordinate system code from the CIF data.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "613c126c", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.sample_models['lbco'].space_group.name_h_m = 'P m -3 m'\n", + "project_2.sample_models['lbco'].space_group.it_coordinate_system_code = '1'" + ] + }, + { + "cell_type": "markdown", + "id": "9fd2f8d1", + "metadata": {}, + "source": [ + "#### Exercise 3.3: Set Lattice Parameters\n", + "\n", + "Set the lattice parameters for the LBCO sample model.\n", + "\n", + "**Hint:** Use the lattice parameters from the CIF data.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5cb72236", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.sample_models['lbco'].cell.length_a = 3.88" + ] + }, + { + "cell_type": "markdown", + "id": "1ad253c4", + "metadata": {}, + "source": [ + "#### Exercise 3.4: Set Atom Sites\n", + "\n", + "Set the atom sites for the LBCO sample model.\n", + "\n", + "**Hint:** Use the atom sites from the CIF data. You can use the `add` method of\n", + "the `atom_sites` attribute of the sample model to add the atom sites.\n", + "Note that the `occupancy` of the La and Ba atoms is 0.5 and those atoms\n", + "are located in the same position (0, 0, 0) in the unit cell. This means that\n", + "an extra attribute `occupancy` needs to be set for those atoms." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa734bbd", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.sample_models['lbco'].atom_sites.add(label='La',\n", + " type_symbol='La',\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter='a',\n", + " b_iso=0.1,\n", + " occupancy=0.5)\n", + "project_2.sample_models['lbco'].atom_sites.add(label='Ba',\n", + " type_symbol='Ba',\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter='a',\n", + " b_iso=0.1,\n", + " occupancy=0.5)\n", + "project_2.sample_models['lbco'].atom_sites.add(label='Co',\n", + " type_symbol='Co',\n", + " fract_x=0.5,\n", + " fract_y=0.5,\n", + " fract_z=0.5,\n", + " wyckoff_letter='b',\n", + " b_iso=0.36)\n", + "project_2.sample_models['lbco'].atom_sites.add(label='O',\n", + " type_symbol='O',\n", + " fract_x=0,\n", + " fract_y=0.5,\n", + " fract_z=0.5,\n", + " wyckoff_letter='c',\n", + " b_iso=2.14)" + ] + }, + { + "cell_type": "markdown", + "id": "e5d5917c", + "metadata": {}, + "source": [ + "### 🔗 Exercise 4: Assign Sample Model to Experiment\n", + "\n", + "Now assign the LBCO sample model to the LBCO experiment created above.\n", + "\n", + "**Hint:** Use the `linked_phases` attribute of the experiment to link the sample model.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a41e1266", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments['sim_lbco'].linked_phases.add(id='lbco', scale=1.0)" + ] + }, + { + "cell_type": "markdown", + "id": "3ab7815e", + "metadata": {}, + "source": [ + "### 🚀 Exercise 5: Analyze and Fit the Data\n", + "\n", + "#### Exercise 5.1: Set Fit Parameters\n", + "\n", + "Select the parameters to be refined during the fitting process.\n", + "\n", + "**Hint:** You can start with the same parameters as in the Si fit, but\n", + "this time you will refine the scale factor of the LBCO phase and the\n", + "background points for the second simulation.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "265283f7", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments['sim_lbco'].linked_phases['lbco'].scale.free = True\n", + "for line_segment in project_2.experiments['sim_lbco'].background:\n", + " line_segment.y.free = True" + ] + }, + { + "cell_type": "markdown", + "id": "92879d1b", + "metadata": {}, + "source": [ + "#### Exercise 5.2: Run Fitting\n", + "\n", + "Visualize the measured and calculated diffraction patterns before fitting and\n", + "then run the fitting process.\n", + "\n", + "**Hint:** Use the `plot_meas_vs_calc` method of the project to visualize the\n", + "measured and calculated diffraction patterns before fitting. Then, use the\n", + "`fit` method of the `analysis` object of the project to perform the fitting\n", + "process.\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5440a819", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fa88267", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.analysis.fit()" + ] + }, + { + "cell_type": "markdown", + "id": "6a0f858f", + "metadata": {}, + "source": [ + "#### Exercise 6.1: ❓Find the Misfit in the Fit\n", + "\n", + "Visualize the measured and calculated diffraction patterns after the fit. As\n", + "you can see, the fit shows noticeable discrepancies. If you zoom in on different regions of the pattern,\n", + "you will observe that all the calculated peaks are shifted to the left.\n", + "\n", + "**Question**: What could be the reason for the misfit?\n", + "\n", + "**Hint**: Consider the following options:\n", + "- The conversion parameters from TOF to d-spacing are not correct.\n", + "- The lattice parameters of the LBCO phase are not correct.\n", + "- The peak profile parameters are not correct.\n", + "- The background points are not correct.\n", + "\n", + "**Solution**:\n", + "- ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction process and this was verified in\n", + "the Si fit.\n", + "- ✅ The lattice parameters of the LBCO phase were set based on the CIF data, which is a good starting point.\n", + "- ❌ The peak profile parameters do not change the position of the peaks, but rather their shape.\n", + "- ❌ The background points affect the background level, but not the peak positions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7cb1c91", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + ] + }, + { + "cell_type": "markdown", + "id": "275b1e32", + "metadata": {}, + "source": [ + "### 🚀 Exercise 6.2: Refine the LBCO Lattice Parameter\n", + "\n", + "To improve the fit, refine the lattice parameter of the LBCO phase.\n", + "\n", + "**Hint**: To accomplish this, we will set the `free` attribute of the `length_a` parameter\n", + "of the LBCO cell to `True`. This will allow the fitting process to adjust\n", + "the lattice parameter in addition to the scale factor of the LBCO phase\n", + "and the background points. Then, you can run the fitting process again.\n", + "\n", + "**Solution**:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efedcb50", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.sample_models['lbco'].cell.length_a.free = True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69360600", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.analysis.fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8628719e", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + ] + }, + { + "cell_type": "markdown", + "id": "5a21ce56", + "metadata": {}, + "source": [ + "### Exercise 6.3: Visualize the Fit Results in d-spacing\n", + "\n", + "Plot measured vs calculated diffraction patterns in d-spacing instead of TOF.\n", + "\n", + "**Hint**: Use the `plot_meas_vs_calc` method of the project and set the\n", + "`d_spacing` parameter to `True`.\n", + "\n", + "**Solution**:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b352148", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name='sim_lbco', d_spacing=True)" + ] + }, + { + "cell_type": "markdown", + "id": "c2b286a7", + "metadata": {}, + "source": [ + "### ❓Exercise 7.1: Find Undefined Features\n", + "\n", + "After refining the lattice parameter, the fit is significantly improved, but\n", + "inspect the diffraction pattern again. Are you noticing anything undefined?\n", + "\n", + "**Hint**: While the fit is now significantly better, there are still some unexplained peaks\n", + "in the diffraction pattern. These peaks are not accounted for by the LBCO phase.\n", + "For example, if you zoom in on the region around 1.6 Å (or 95,000 μs), you will\n", + "notice that the rightmost peak is not explained by the LBCO phase at all.\n", + "\n", + "Solution:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5b77eca", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1.53, x_max=1.7, d_spacing=True)" + ] + }, + { + "cell_type": "markdown", + "id": "756c1a61", + "metadata": {}, + "source": [ + "### Exercise 7.2: Identify the Cause of the Unexplained Peaks\n", + "\n", + "**Hint**: Consider the following options:\n", + "- The LBCO phase is not the only phase present in the sample.\n", + "- The LBCO phase is not correctly modeled.\n", + "- The data reduction process introduced artifacts.\n", + "\n", + "**Solution**:\n", + "- ✅ The LBCO phase is not the only phase present in the sample. The unexplained peaks\n", + "are likely due to the presence of an impurity phase in the sample, which is not\n", + "included in the current model.\n", + "- ❌ In principle, this could be the case, but in this case, the LBCO phase is correctly modeled.\n", + "- ❌ The data reduction process is not likely to introduce such specific peaks, as it is\n", + "tested and verified in the previous part of the tutorial." + ] + }, + { + "cell_type": "markdown", + "id": "fe05eadc", + "metadata": {}, + "source": [ + "### 🧠 Exercise 7.3: Identify the impurity phase\n", + "\n", + "Identify the impurity phase.\n", + "\n", + "**Hint**: Check the positions of the unexplained peaks in the diffraction pattern.\n", + "Compare them with the known diffraction patterns in the introduction section of the\n", + "tutorial.\n", + "\n", + "**Solution**:\n", + "The unexplained peaks are likely due to the presence of silicon (Si) in the sample." + ] + }, + { + "cell_type": "markdown", + "id": "9b573c56", + "metadata": {}, + "source": [ + "### 🧠 Exercise 8: Refine with the Impurity Phase\n", + "\n", + "#### 🧩 Exercise 8.1: Create a Second Sample Model – Si as Impurity\n", + "\n", + "**Solution:**" + ] + }, + { + "cell_type": "markdown", + "id": "3ca59bdb", + "metadata": {}, + "source": [ + "**Set Space Group**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "371b565b", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.sample_models.add(name='si')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85e7164c", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.sample_models['si'].space_group.name_h_m = 'F d -3 m'\n", + "project_2.sample_models['si'].space_group.it_coordinate_system_code = '2'" + ] + }, + { + "cell_type": "markdown", + "id": "f92190d4", + "metadata": {}, + "source": [ + "**Set Lattice Parameters**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "308b58a6", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.sample_models['si'].cell.length_a = 5.43" + ] + }, + { + "cell_type": "markdown", + "id": "959de1cb", + "metadata": {}, + "source": [ + "**Set Atom Sites**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "86c9626d", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.sample_models['si'].atom_sites.add(label='Si',\n", + " type_symbol='Si',\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter='a',\n", + " b_iso=0.95)" + ] + }, + { + "cell_type": "markdown", + "id": "d2d41865", + "metadata": {}, + "source": [ + "**🔗 Assign Sample Model to Experiment**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41d7fe1a", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments['sim_lbco'].linked_phases.add(id='si', scale=1.0)" + ] + }, + { + "cell_type": "markdown", + "id": "27cabcc5", + "metadata": {}, + "source": [ + "#### 🚀 Exercise 8.3: Analyze and Fit the Data: 3rd Fit\n", + "\n", + "**Solution:**\n", + "\n", + "Before optimizing the parameters, we can visualize the measured\n", + "diffraction pattern and the calculated diffraction pattern based on the\n", + "two phases: LBCO and Si.\n", + "\n", + "**Visualize Diffraction Patterns**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "243006f7", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + ] + }, + { + "cell_type": "markdown", + "id": "d999f364", + "metadata": {}, + "source": [ + "As you can see, the calculated pattern is now the sum of both phases,\n", + "and Si peaks are visible in the calculated pattern. However, their intensities\n", + "are much too high. Therefore, we need to refine the scale factor of the Si phase.\n", + "\n", + "**Set Fit Parameters**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5277cc94", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments['sim_lbco'].linked_phases['si'].scale.free = True" + ] + }, + { + "cell_type": "markdown", + "id": "de18b359", + "metadata": {}, + "source": [ + "**Run Fitting**\n", + "\n", + "Now we can perform the fit with both phases included." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aa150a35", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.analysis.fit()" + ] + }, + { + "cell_type": "markdown", + "id": "1437a346", + "metadata": {}, + "source": [ + "**Visualize Fit Results**\n", + "\n", + "Let's plot the measured diffraction pattern and the calculated diffraction\n", + "pattern both for the full range and for a zoomed-in region around the previously unexplained\n", + "peak near 90,000 μs. The calculated pattern will be the sum of the two phases." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a3085273", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58400b9a", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=85000, x_max=105000)" + ] + }, + { + "cell_type": "markdown", + "id": "bf21e5a3", + "metadata": {}, + "source": [ + "Now there are no unexplained peaks in the pattern, and the fit is improved.\n", + "Some discrepancies in the peak intensities remain, but\n", + "further improvements would require more advanced data reduction and analysis,\n", + "which are beyond the scope of this tutorial." + ] + }, + { + "cell_type": "markdown", + "id": "e273f6d0", + "metadata": {}, + "source": [ + "## 📑 Summary\n", + "\n", + "In this tutorial, you refined two simulated diffraction patterns:\n", + "- **Si** as a simple reference system, and\n", + "- **LBCO** as a more complex, realistic case with an unknown impurity.\n", + "\n", + "Along the way, you learned how to:\n", + "- Define a project, experiment, and sample model in EasyDiffraction\n", + "- Set up instrument and peak profile parameters\n", + "- Visualize measured and calculated patterns\n", + "- Identify and interpret misfits in the diffraction data\n", + "- Add and refine multiple phases to improve the model\n", + "\n", + "Key Takeaways:\n", + "- A good refinement starts with a reasonable structural model and\n", + " well-defined instrument parameters.\n", + "- Even simulated data may include artifacts or unintended\n", + " contributions—mimicking real experimental conditions.\n", + "- Visual inspection is a critical part of model validation. Residual peaks\n", + " often reveal missing physics or contamination." + ] + }, + { + "cell_type": "markdown", + "id": "ffdb6632", + "metadata": {}, + "source": [ + "## 🎁 Bonus\n", + "\n", + "You've now completed the fitting portion of the Summer School workflow,\n", + "demonstrating the practical use of EasyDiffraction for refining simulated\n", + "powder diffraction data.\n", + "\n", + "To continue learning and exploring more features of\n", + "the EasyDiffraction library, you can visit the official tutorial page\n", + "and select one of the many available tutorials:\n", + "https://easyscience.github.io/diffraction-lib/tutorials/" + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py new file mode 100644 index 00000000..499014e9 --- /dev/null +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py @@ -0,0 +1,931 @@ +# %% +# TODO: Remove this cell in the final version of the tutorial. +# Google Colab and Jupyter Notebook environments may not have the +# easydiffraction library installed by default. So, we check if the +# library is available and install it if necessary. +import builtins +import importlib.util + +if hasattr(builtins, "__IPYTHON__"): + if importlib.util.find_spec('easydiffraction') is None: + print('Installing the easydiffraction library...') + # !pip install git+https://github.com/easyscience/diffraction-lib@d-spacing + +# %% [markdown] +# # Data Analysis: Powder Diffraction +# +# This tutorial will guide you through the refinement of simulated diffraction +# patterns for Si (Part 1) and La₀.₅Ba₀.₅CoO₃ (LBCO) (Part 2) using the +# EasyDiffraction Python library. +# +# The objective is to develop familiarity with the Rietveld refinement process +# for crystal structures using powder diffraction data. +# +# ## 🛠️ Import Library +# +# First, import the necessary library for the analysis. In this tutorial, we +# use the EasyDiffraction library, which offers tools for +# analyzing and refining powder diffraction data. +# +# This tutorial is self-contained and designed for hands-on learning. +# However, if you're interested in exploring more advanced features or learning +# about additional capabilities of the EasyDiffraction library, please refer to +# the official documentation: https://easyscience.github.io/diffraction-lib +# +# Depending on your requirements, you may choose to import only specific +# classes. However, for the sake of simplicity in this tutorial, we will import +# the entire library. + +# %% +import easydiffraction as ed + +# %% [markdown] +# ## 📘 Introduction: Simple Reference Fit – Si +# +# Before diving into the more complex fitting exercise with the La₀.₅Ba₀.₅CoO₃ +# (LBCO) crystal structure, let's start with a simpler example using the +# silicon (Si) crystal structure. This will help us understand the basic +# concepts and steps involved in fitting a crystal structure using powder +# diffraction data. +# +# For this part of the tutorial, we will use the powder diffraction data +# from the [previous tutorial](#), simulated using the Si crystal structure. +# +# ### 📦 Create a Project – 'reference' +# +# In EasyDiffraction, a project serves as a container for all information +# related to the analysis of a specific experiment or set of experiments. It +# enables you to organize your data, experiments, sample models, and fitting +# parameters in a structured manner. You can think of it as a folder containing +# all the essential details about your analysis. The project also allows +# us to visualize both the measured and calculated diffraction patterns, among +# other things. + +# %% +project_1 = ed.Project(name='reference') + +# %% [markdown] + +# You can set the title and description of the project to provide context +# and information about the analysis being performed. This is useful for +# documentation purposes and helps others (or yourself in the future) understand +# the purpose of the project at a glance. + +# %% +project_1.info.title = 'Reference Silicon Fit' +project_1.info.description = 'Fitting simulated powder diffraction pattern of Si.' + +# %% [markdown] +# ### 🔬 Create an Experiment +# +# Now we will create an experiment within the project. An experiment +# represents a specific diffraction measurement performed on a specific sample +# using a particular instrument. It contains +# details about the measured data, instrument parameters, and other relevant +# information. +# +# In this case, the experiment is defined as a powder diffraction measurement +# using time-of-flight neutrons. The measured data is loaded from a file +# containing the reduced diffraction pattern of Si from the previous +# tutorial. + +# %% +# TODO: Remove this cell in the final version of the tutorial. +# Google Colab does not have the data files needed for this tutorial. +ed.download_from_repository('powder_reduced_Si_2large_bank.xye', + branch='d-spacing', + destination='data') + +# %% +project_1.experiments.add(name='sim_si', + sample_form='powder', + beam_mode='time-of-flight', + radiation_probe='neutron', + data_path='data/powder_reduced_Si_2large_bank.xye') + +# %% [markdown] +# #### Inspect Measured Data +# +# After creating the experiment, we can examine the measured data. The measured +# data consists of a diffraction pattern comprising time-of-flight (TOF) values +# and corresponding intensities. The TOF values are given in microseconds (μs), +# and the intensities are in arbitrary units. +# +# The data is stored in XYE format, a simple text format containing three +# columns: TOF, intensity, and intensity error (if available). +# +# The `plot_meas` method of the project enables us to visualize the measured +# diffraction pattern. +# +# Before plotting, we set the plotting engine to 'plotly', which provides +# interactive visualizations. + +# %% +project_1.plotter.engine = 'plotly' + +# %% +project_1.plot_meas(expt_name='sim_si') + +# %% [markdown] +# If you zoom in on the highest TOF peak (around 120,000 μs), you will notice +# that it has a broad and unusual shape. This is a result of the simplified +# data reduction process. Obtaining a more accurate diffraction pattern would +# require a more advanced data reduction, which is beyond the scope of this +# tutorial. Therefore, we will simply exclude the high TOF region from the analysis by +# adding an excluded region to the experiment. + +# %% +project_1.experiments['sim_si'].excluded_regions.add(minimum=108000, maximum=200000) + +# %% [markdown] +# To visualize the effect of excluding the high TOF region, we can plot +# the measured data again. The excluded region will be omitted from the plot +# and is not used in the fitting process. + +# %% +project_1.plot_meas(expt_name='sim_si') + +# %% [markdown] +# #### Set Instrument Parameters +# +# After experiment is created and measured data are loaded, we would need +# to set the instrument parameters. +# +# In this type of experiment, the instrument parameters define how the +# measured data is converted between d-spacing and time-of-flight (TOF) +# during the data reduction process as well as the angular position of the +# detector. So, we put values based on those from the reduction. + +# %% +project_1.experiments['sim_si'].instrument.setup_twotheta_bank = 101.46 +#project_1.experiments['sim_si'].instrument.calib_d_to_tof_offset = 0.0 +project_1.experiments['sim_si'].instrument.calib_d_to_tof_linear = 61710.64 +project_1.experiments['sim_si'].instrument.calib_d_to_tof_quad = -0.00001 + +# %% [markdown] +# #### Set Peak Profile Parameters +# +# The next set of parameters is needed to define the peak profile used in the +# fitting process. The peak profile describes shape of the diffraction peaks. +# They include parameters for the broadening and asymmetry of the peaks. Here, +# we use a pseudo-Voigt peak profile function with Ikeda-Carpenter asymmetry, which is a common +# choice for neutron powder diffraction data. The values are typically determined +# experimentally on the same instrument and under the same configuration as the +# data being analyzed based on measurements of a standard +# sample. In some cases, these parameters are refined during the fitting +# process to improve the fit between the measured and calculated diffraction, but +# in this case, we will use the values from another simulation. + +# %% +project_1.experiments['sim_si'].peak_profile_type = 'pseudo-voigt * ikeda-carpenter' +project_1.experiments['sim_si'].peak.broad_gauss_sigma_0 = 45137 +project_1.experiments['sim_si'].peak.broad_gauss_sigma_1 = -52394 +project_1.experiments['sim_si'].peak.broad_gauss_sigma_2 = 22998 +project_1.experiments['sim_si'].peak.broad_mix_beta_0 = 0.0055 +project_1.experiments['sim_si'].peak.broad_mix_beta_1 = 0.0041 +project_1.experiments['sim_si'].peak.asym_alpha_0 = 0 +project_1.experiments['sim_si'].peak.asym_alpha_1 = 0.0097 + +# %% [markdown] +# #### Set Background +# +# The background of the diffraction pattern represents the portion of the pattern that +# is not related to the crystal structure of the sample, but rather to +# incoherent scattering from the sample itself, the sample holder, the sample +# environment, and the instrument. The background can be modeled in various +# ways. In this case, we will use a simple line segment background, which is a +# common approach for powder diffraction data. The background intensity at any +# point is defined by linear interpolation between neighboring points. +# The background points are selected +# to span the range of the diffraction pattern while avoiding the peaks. +# +# In this case, we will add several background points at specific TOF values +# (in microseconds) and corresponding intensity values. These points are +# chosen to represent the background level in the diffraction pattern free from +# any peaks. The background points are added using the `add` method of the +# `background` attribute of the experiment. The `x` parameter represents the TOF +# value, and the `y` parameter represents the intensity value at that TOF. +# +# Let's set all the background points at a constant value of 0.01, which can be +# roughly determined by the eye, and we will refine them later during the fitting +# process. + +# %% +project_1.experiments['sim_si'].background_type = 'line-segment' +project_1.experiments['sim_si'].background.add(x=50000, y=0.01) +project_1.experiments['sim_si'].background.add(x=60000, y=0.01) +project_1.experiments['sim_si'].background.add(x=70000, y=0.01) +project_1.experiments['sim_si'].background.add(x=80000, y=0.01) +project_1.experiments['sim_si'].background.add(x=90000, y=0.01) +project_1.experiments['sim_si'].background.add(x=100000, y=0.01) +project_1.experiments['sim_si'].background.add(x=110000, y=0.01) + +# %% [markdown] +# ### 🧩 Create a Sample Model – Si +# +# After setting up the experiment, we need to create a sample model that +# describes the crystal structure of the sample being analyzed. +# +# In this case, we will create a sample model for silicon (Si) with a +# cubic crystal structure. The sample model contains information about the +# space group, lattice parameters, atomic positions of the atoms in the +# unit cell, atom types, occupancies and atomic displacement parameters. +# The sample model is essential for the fitting process, as it +# is used to calculate the expected diffraction pattern. +# +# EasyDiffraction refines the crystal structure of the sample, +# but does not solve it. Therefore, we need a good starting point with +# reasonable structural parameters. Here, we define the Si structure as a +# cubic structure with the space group F d -3 m. As this is a simple cubic +# structure, we only need to define the single lattice parameter, which +# is the length of the unit cell edge. The Si crystal structure has a +# single atom in the unit cell, which is located at the origin (0, 0, 0) of +# the unit cell. The symmetry of this site is defined by the Wyckoff letter 'a'. +# The atomic displacement parameter defines the thermal vibrations of the +# atoms in the unit cell and is presented as an isotropic parameter (B_iso). +# +# Sometimes, the initial crystal structure parameters can be obtained +# from one of the crystallographic databases, like for example +# the Crystallography Open Database (COD). In this case, we use the COD +# entry for silicon as a reference for the initial crystal structure model: +# https://www.crystallography.net/cod/4507226.html +# +# As with adding the experiment in the +# previous step, we will create a default sample model +# and then modify its parameters to match the Si structure. +# +# #### Add Sample Model + +# %% +project_1.sample_models.add(name='si') + +# %% [markdown] +# #### Set Space Group + +# %% +project_1.sample_models['si'].space_group.name_h_m = 'F d -3 m' +project_1.sample_models['si'].space_group.it_coordinate_system_code = '2' + +# %% [markdown] +# #### Set Lattice Parameters + +# %% +project_1.sample_models['si'].cell.length_a = 5.43 + +# %% [markdown] +# #### Set Atom Sites + +# %% +project_1.sample_models['si'].atom_sites.add(label='Si', + type_symbol='Si', + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter='a', + b_iso=0.95) + +# %% [markdown] +# ### 🔗 Assign Sample Model to Experiment +# +# Now we need to assign, or link, this sample model to the experiment created above. +# This linked crystallographic phase will be used to calculate the expected diffraction +# pattern based on the crystal structure defined in the sample model. + +# %% +project_1.experiments['sim_si'].linked_phases.add(id='si', scale=1.0) + +# %% [markdown] +# ### 🚀 Analyze and Fit the Data +# +# After setting up the experiment and sample model, we can now analyze the +# measured diffraction pattern and perform the fitting process. +# +# The fitting process involves comparing the measured diffraction pattern with +# the calculated diffraction pattern based on the sample model and instrument +# parameters. The goal is to adjust the parameters of the sample model and +# the experiment to minimize the difference between the measured and calculated +# diffraction patterns. This is done by refining the parameters of the sample +# model and the instrument settings to achieve a better fit. +# +# #### Set Fit Parameters +# +# To perform the fit, we need to specify the refinement parameters. These +# are the parameters that will be adjusted during the fitting process to +# minimize the difference between the measured and calculated diffraction +# patterns. In this case, we will refine only the scale factor of the Si phase +# in the experiment, as well as the intensities of the background points. +# This is done by setting +# the `free` attribute of the corresponding parameters to `True`. + +# %% +project_1.experiments['sim_si'].linked_phases['si'].scale.free = True +for line_segment in project_1.experiments['sim_si'].background: + line_segment.y.free = True + +# %% [markdown] +# #### Show Free Parameters +# +# We can check which parameters are free to be refined by calling the +# `show_free_params` method of the `analysis` object of the project. + +# %% +project_1.analysis.show_free_params() + +# %% [markdown] +# #### Visualize Diffraction Patterns +# +# Before performing the fit, we can visually compare the measured +# diffraction pattern with the calculated diffraction pattern based on the +# initial parameters of the sample model and the instrument settings. +# This provides an indication of how well the initial parameters +# match the measured data. The `plot_meas_vs_calc` method of the project +# allows this comparison. + +# %% +project_1.plot_meas_vs_calc(expt_name='sim_si') + +# %% [markdown] +# #### Run Fitting +# +# We can now perform the fit using the `fit` method of the `analysis` +# object of the project. + +# %% +project_1.analysis.fit() + +# %% [markdown] +# #### Check Fit Results +# You will +# see that the fit is now much improved and that the intensities of the +# calculated peaks align much better with the measured peaks. To check the +# quality of the fit numerically, we can look at the goodness-of-fit +# chi-squared value and the R-factors. The chi-squared value is a measure of how well +# the calculated diffraction pattern matches the measured pattern, and it is +# calculated as the sum of the squared differences between the measured and +# calculated intensities, divided by the number of data points. Ideally, the +# chi-squared value should be close to 1, indicating a good fit. + +# %% [markdown] +# #### Visualize Fit Results +# +# After the fit is completed, we can plot the comparison between the +# measured and calculated diffraction patterns again to see how well the fit +# improved the agreement between the two. The calculated diffraction pattern +# is now based on the refined parameters. + +# %% +project_1.plot_meas_vs_calc(expt_name='sim_si') + +# %% [markdown] +# #### TOF vs d-spacing +# +# The diffraction pattern is typically analyzed and plotted in the +# time-of-flight (TOF) axis, which represents the time it takes for neutrons +# to travel from the sample to the detector. However, it is sometimes more +# convenient to visualize the diffraction pattern in the d-spacing axis, +# which represents the distance between planes in the crystal lattice. The +# d-spacing can be calculated from the TOF values using the instrument +# parameters. The `plot_meas_vs_calc` method of the project allows us to +# plot the measured and calculated diffraction patterns in the d-spacing axis +# by setting the `d_spacing` parameter to `True`. + +# %% +project_1.plot_meas_vs_calc(expt_name='sim_si', d_spacing=True) + +# %% [markdown] +# As you can see, the calculated diffraction pattern now matches the measured +# pattern much more closely. Typically, additional parameters are included in the +# refinement process to further improve the fit. However, we will stop here, +# as the goal of this part of the tutorial is to demonstrate that the data reduction +# and fitting process function correctly. The fit is not perfect, but it is +# sufficient to show that the fitting process works and that the parameters +# are being adjusted appropriately. The next part of the tutorial will be more advanced +# and will involve fitting a more complex crystal structure: La₀.₅Ba₀.₅CoO₃ (LBCO). +# +# ## 💪 Exercise: Complex Fit – LBCO +# +# Now that you have a basic understanding of the fitting process, we will +# undertake a more complex fit of the La₀.₅Ba₀.₅CoO₃ (LBCO) crystal structure +# using simulated powder diffraction data from the [previous tutorial](#). +# +# You can use the same approach as in the previous part of the tutorial, but +# this time we will refine a more complex crystal structure LBCO with multiple atoms +# in the unit cell. +# +# ### 📦 Exercise 1: Create a Project – 'main' +# +# Create a new project for the LBCO fit. +# +# **Hint:** You can use the same approach as in the previous part of the +# tutorial, but this time we will create a new project for the LBCO fit. +# +# **Solution:** + +# %% +project_2 = ed.Project(name='main') +project_2.info.title = 'La0.5Ba0.5CoO3 Fit' +project_2.info.description = 'Fitting simulated powder diffraction pattern of La0.5Ba0.5CoO3.' + +# %% [markdown] +# ### 🔬 Exercise 2: Define an Experiment – LBCO +# +# #### Exercise 2.1: Create an Experiment +# +# Create an experiment within the new project and load the reduced diffraction +# pattern for LBCO. +# +# **Hint:** You can use the same approach as in the previous part of the +# tutorial, but this time you need to use the data file for LBCO. +# +# **Solution:** + +# %% +# TODO: Remove this cell in the final version of the tutorial. +# Google Colab does not have the data files needed for this tutorial. +ed.download_from_repository('powder_reduced_lbco_0_05si_2large_bank.xye', + branch='d-spacing', + destination='data') + +# %% +project_2.experiments.add(name='sim_lbco', + sample_form='powder', + beam_mode='time-of-flight', + radiation_probe='neutron', + data_path='data/powder_reduced_lbco_0_05si_2large_bank.xye') + +# %% [markdown] +# #### Exercise 2.1: Inspect Measured Data +# +# Check the measured data of the LBCO experiment. Are there any +# peaks with the shape similar to the Si peaks? If so, exclude them from the +# analysis. +# +# **Hint:** You can use the `plot_meas` method of the project to visualize the +# measured diffraction pattern. You can also use the `excluded_regions` attribute +# of the experiment to exclude specific regions from the analysis. +# +# **Solution:** + +# %% +project_2.plotter.engine = 'plotly' +project_2.plot_meas(expt_name='sim_lbco') + +# %% +project_2.experiments['sim_lbco'].excluded_regions.add(minimum=108000, maximum=200000) + +# %% +project_2.plot_meas(expt_name='sim_lbco') + +# %% [markdown] +# #### Exercise 2.2: Set Instrument Parameters +# +# Set the instrument parameters for the LBCO experiment. +# +# **Hint:** Use the values from the data reduction process for the LBCO and +# follow the same approach as in the previous part of the tutorial. +# +# **Solution:** + +# %% +project_2.experiments['sim_lbco'].instrument.setup_twotheta_bank = 94.90931761529106 +project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_offset = 0.0 +project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_linear = 58752.5575 #58724.76869981215 +project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_quad = -0.00001 + +# %% [markdown] +# #### Exercise 2.3: Set Peak Profile Parameters +# +# Set the peak profile parameters for the LBCO experiment. +# +# **Hint:** Use the values from the previous part of the tutorial. +# +# **Solution:** + +# %% +project_2.peak_profile_type = 'pseudo-voigt * ikeda-carpenter' +project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_0 = 47347.4233 #45211 +project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_1 = -55360.0162 #-52477 +project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_2 = 23882.4236 #23014 +project_2.experiments['sim_lbco'].peak.broad_mix_beta_0 = 0.0055 +project_2.experiments['sim_lbco'].peak.broad_mix_beta_1 = 0.0041 +project_2.experiments['sim_lbco'].peak.asym_alpha_0 = 0 +project_2.experiments['sim_lbco'].peak.asym_alpha_1 = 0.0096 #0.0097 + +# %% [markdown] +# #### Exercise 2.4: Set Background +# +# Set the background points for the LBCO experiment. What would you suggest as +# the initial intensity value for the background points? +# +# **Hint:** Use the same approach as in the previous part of the tutorial, but +# this time you need to set the background points for the LBCO experiment. You can +# zoom in on the measured diffraction pattern to determine the approximate +# background level. +# +# **Solution:** + +# %% +project_2.experiments['sim_lbco'].background_type = 'line-segment' +project_2.experiments['sim_lbco'].background.add(x=50000, y=0.2) +project_2.experiments['sim_lbco'].background.add(x=60000, y=0.2) +project_2.experiments['sim_lbco'].background.add(x=70000, y=0.2) +project_2.experiments['sim_lbco'].background.add(x=80000, y=0.2) +project_2.experiments['sim_lbco'].background.add(x=90000, y=0.2) +project_2.experiments['sim_lbco'].background.add(x=100000, y=0.2) +project_2.experiments['sim_lbco'].background.add(x=110000, y=0.2) + +# %% [markdown] +# ### 🧩 Exercise 3: Define a Sample Model – LBCO +# +# The LBSO structure is not as simple as the Si model, as it contains multiple +# atoms in the unit cell. It is not in COD, so we give you the structural +# parameters in CIF format to create the sample model right here: + +# %% [markdown] +# ``` +# data_lbco +# +# _space_group.name_H-M_alt "P m -3 m" +# _space_group.IT_coordinate_system_code 1 +# +# _cell.length_a 3.89 +# _cell.length_b 3.89 +# _cell.length_c 3.89 +# _cell.angle_alpha 90.0 +# _cell.angle_beta 90.0 +# _cell.angle_gamma 90.0 +# +# loop_ +# _atom_site.label +# _atom_site.type_symbol +# _atom_site.fract_x +# _atom_site.fract_y +# _atom_site.fract_z +# _atom_site.wyckoff_letter +# _atom_site.occupancy +# _atom_site.ADP_type +# _atom_site.B_iso_or_equiv +# La La 0.0 0.0 0.0 a 0.5 Biso 0.10 +# Ba Ba 0.0 0.0 0.0 a 0.5 Biso 0.10 +# Co Co 0.5 0.5 0.5 b 1.0 Biso 0.36 +# O O 0.0 0.5 0.5 c 1.0 Biso 2.14 +# ``` + +# %% [markdown] +# #### Exercise 3.1: Create Sample Model +# +# Create a sample model for LBCO based on the provided CIF data. +# +# **Hint:** You can use the same approach as in the previous part of the +# tutorial, but this time you need to create a sample model for LBCO. +# +# **Solution:** + +# %% +project_2.sample_models.add(name='lbco') + +# %% [markdown] +# #### Exercise 3.2: Set Space Group +# +# Set the space group for the LBCO sample model. +# +# **Hint:** Use the space group name and IT coordinate system code from the CIF data. +# +# **Solution:** + +# %% +project_2.sample_models['lbco'].space_group.name_h_m = 'P m -3 m' +project_2.sample_models['lbco'].space_group.it_coordinate_system_code = '1' + +# %% [markdown] +# #### Exercise 3.3: Set Lattice Parameters +# +# Set the lattice parameters for the LBCO sample model. +# +# **Hint:** Use the lattice parameters from the CIF data. +# +# **Solution:** + +# %% +project_2.sample_models['lbco'].cell.length_a = 3.88 + +# %% [markdown] +# #### Exercise 3.4: Set Atom Sites +# +# Set the atom sites for the LBCO sample model. +# +# **Hint:** Use the atom sites from the CIF data. You can use the `add` method of +# the `atom_sites` attribute of the sample model to add the atom sites. +# Note that the `occupancy` of the La and Ba atoms is 0.5 and those atoms +# are located in the same position (0, 0, 0) in the unit cell. This means that +# an extra attribute `occupancy` needs to be set for those atoms. + +# %% +project_2.sample_models['lbco'].atom_sites.add(label='La', + type_symbol='La', + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter='a', + b_iso=0.1, + occupancy=0.5) +project_2.sample_models['lbco'].atom_sites.add(label='Ba', + type_symbol='Ba', + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter='a', + b_iso=0.1, + occupancy=0.5) +project_2.sample_models['lbco'].atom_sites.add(label='Co', + type_symbol='Co', + fract_x=0.5, + fract_y=0.5, + fract_z=0.5, + wyckoff_letter='b', + b_iso=0.36) +project_2.sample_models['lbco'].atom_sites.add(label='O', + type_symbol='O', + fract_x=0, + fract_y=0.5, + fract_z=0.5, + wyckoff_letter='c', + b_iso=2.14) + +# %% [markdown] +# ### 🔗 Exercise 4: Assign Sample Model to Experiment +# +# Now assign the LBCO sample model to the LBCO experiment created above. +# +# **Hint:** Use the `linked_phases` attribute of the experiment to link the sample model. +# +# **Solution:** + +# %% +project_2.experiments['sim_lbco'].linked_phases.add(id='lbco', scale=1.0) + +# %% [markdown] +# ### 🚀 Exercise 5: Analyze and Fit the Data +# +# #### Exercise 5.1: Set Fit Parameters +# +# Select the parameters to be refined during the fitting process. +# +# **Hint:** You can start with the same parameters as in the Si fit, but +# this time you will refine the scale factor of the LBCO phase and the +# background points for the second simulation. +# +# **Solution:** + +# %% +project_2.experiments['sim_lbco'].linked_phases['lbco'].scale.free = True +for line_segment in project_2.experiments['sim_lbco'].background: + line_segment.y.free = True + +# %% [markdown] +# #### Exercise 5.2: Run Fitting +# +# Visualize the measured and calculated diffraction patterns before fitting and +# then run the fitting process. +# +# **Hint:** Use the `plot_meas_vs_calc` method of the project to visualize the +# measured and calculated diffraction patterns before fitting. Then, use the +# `fit` method of the `analysis` object of the project to perform the fitting +# process. +# +# **Solution:** + +# %% +project_2.plot_meas_vs_calc(expt_name='sim_lbco') + +# %% +project_2.analysis.fit() + +# %% [markdown] +# #### Exercise 6.1: ❓Find the Misfit in the Fit +# +# Visualize the measured and calculated diffraction patterns after the fit. As +# you can see, the fit shows noticeable discrepancies. If you zoom in on different regions of the pattern, +# you will observe that all the calculated peaks are shifted to the left. +# +# **Question**: What could be the reason for the misfit? +# +# **Hint**: Consider the following options: +# - The conversion parameters from TOF to d-spacing are not correct. +# - The lattice parameters of the LBCO phase are not correct. +# - The peak profile parameters are not correct. +# - The background points are not correct. +# +# **Solution**: +# - ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction process and this was verified in +# the Si fit. +# - ✅ The lattice parameters of the LBCO phase were set based on the CIF data, which is a good starting point. +# - ❌ The peak profile parameters do not change the position of the peaks, but rather their shape. +# - ❌ The background points affect the background level, but not the peak positions. + +# %% +project_2.plot_meas_vs_calc(expt_name='sim_lbco') + +# %% [markdown] +# ### 🚀 Exercise 6.2: Refine the LBCO Lattice Parameter +# +# To improve the fit, refine the lattice parameter of the LBCO phase. +# +# **Hint**: To accomplish this, we will set the `free` attribute of the `length_a` parameter +# of the LBCO cell to `True`. This will allow the fitting process to adjust +# the lattice parameter in addition to the scale factor of the LBCO phase +# and the background points. Then, you can run the fitting process again. +# +# **Solution**: + +# %% +project_2.sample_models['lbco'].cell.length_a.free = True + +# %% +project_2.analysis.fit() + +# %% +project_2.plot_meas_vs_calc(expt_name='sim_lbco') + +# %% [markdown] +# ### Exercise 6.3: Visualize the Fit Results in d-spacing +# +# Plot measured vs calculated diffraction patterns in d-spacing instead of TOF. +# +# **Hint**: Use the `plot_meas_vs_calc` method of the project and set the +# `d_spacing` parameter to `True`. +# +# **Solution**: + +# %% +project_2.plot_meas_vs_calc(expt_name='sim_lbco', d_spacing=True) + +# %% [markdown] +# ### ❓Exercise 7.1: Find Undefined Features +# +# After refining the lattice parameter, the fit is significantly improved, but +# inspect the diffraction pattern again. Are you noticing anything undefined? +# +# **Hint**: While the fit is now significantly better, there are still some unexplained peaks +# in the diffraction pattern. These peaks are not accounted for by the LBCO phase. +# For example, if you zoom in on the region around 1.6 Å (or 95,000 μs), you will +# notice that the rightmost peak is not explained by the LBCO phase at all. +# +# Solution: + +# %% +project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1.53, x_max=1.7, d_spacing=True) + +# %% [markdown] +# ### Exercise 7.2: Identify the Cause of the Unexplained Peaks +# +# **Hint**: Consider the following options: +# - The LBCO phase is not the only phase present in the sample. +# - The LBCO phase is not correctly modeled. +# - The data reduction process introduced artifacts. +# +# **Solution**: +# - ✅ The LBCO phase is not the only phase present in the sample. The unexplained peaks +# are likely due to the presence of an impurity phase in the sample, which is not +# included in the current model. +# - ❌ In principle, this could be the case, but in this case, the LBCO phase is correctly modeled. +# - ❌ The data reduction process is not likely to introduce such specific peaks, as it is +# tested and verified in the previous part of the tutorial. + +# %% [markdown] +# ### 🧠 Exercise 7.3: Identify the impurity phase +# +# Identify the impurity phase. +# +# **Hint**: Check the positions of the unexplained peaks in the diffraction pattern. +# Compare them with the known diffraction patterns in the introduction section of the +# tutorial. +# +# **Solution**: +# The unexplained peaks are likely due to the presence of silicon (Si) in the sample. + +# %% [markdown] +# ### 🧠 Exercise 8: Refine with the Impurity Phase +# +# #### 🧩 Exercise 8.1: Create a Second Sample Model – Si as Impurity +# +# **Solution:** + +# %% [markdown] +# **Set Space Group** + +# %% +project_2.sample_models.add(name='si') + +# %% +project_2.sample_models['si'].space_group.name_h_m = 'F d -3 m' +project_2.sample_models['si'].space_group.it_coordinate_system_code = '2' + +# %% [markdown] +# **Set Lattice Parameters** + +# %% +project_2.sample_models['si'].cell.length_a = 5.43 + +# %% [markdown] +# **Set Atom Sites** + +# %% +project_2.sample_models['si'].atom_sites.add(label='Si', + type_symbol='Si', + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter='a', + b_iso=0.95) + +# %% [markdown] +# **🔗 Assign Sample Model to Experiment** + +# %% +project_2.experiments['sim_lbco'].linked_phases.add(id='si', scale=1.0) + +# %% [markdown] +# #### 🚀 Exercise 8.3: Analyze and Fit the Data: 3rd Fit + +# **Solution:** +# +# Before optimizing the parameters, we can visualize the measured +# diffraction pattern and the calculated diffraction pattern based on the +# two phases: LBCO and Si. +# +# **Visualize Diffraction Patterns** + +# %% +project_2.plot_meas_vs_calc(expt_name='sim_lbco') + +# %% [markdown] +# As you can see, the calculated pattern is now the sum of both phases, +# and Si peaks are visible in the calculated pattern. However, their intensities +# are much too high. Therefore, we need to refine the scale factor of the Si phase. +# +# **Set Fit Parameters** + +# %% +project_2.experiments['sim_lbco'].linked_phases['si'].scale.free = True + +# %% [markdown] +# **Run Fitting** +# +# Now we can perform the fit with both phases included. + +# %% +project_2.analysis.fit() + +# %% [markdown] +# **Visualize Fit Results** + +# Let's plot the measured diffraction pattern and the calculated diffraction +# pattern both for the full range and for a zoomed-in region around the previously unexplained +# peak near 90,000 μs. The calculated pattern will be the sum of the two phases. + +# %% +project_2.plot_meas_vs_calc(expt_name='sim_lbco') + +# %% +project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=85000, x_max=105000) + +# %% [markdown] +# Now there are no unexplained peaks in the pattern, and the fit is improved. +# Some discrepancies in the peak intensities remain, but +# further improvements would require more advanced data reduction and analysis, +# which are beyond the scope of this tutorial. + +# %% [markdown] +# ## 📑 Summary +# +# In this tutorial, you refined two simulated diffraction patterns: +# - **Si** as a simple reference system, and +# - **LBCO** as a more complex, realistic case with an unknown impurity. +# +# Along the way, you learned how to: +# - Define a project, experiment, and sample model in EasyDiffraction +# - Set up instrument and peak profile parameters +# - Visualize measured and calculated patterns +# - Identify and interpret misfits in the diffraction data +# - Add and refine multiple phases to improve the model +# +# Key Takeaways: +# - A good refinement starts with a reasonable structural model and +# well-defined instrument parameters. +# - Even simulated data may include artifacts or unintended +# contributions—mimicking real experimental conditions. +# - Visual inspection is a critical part of model validation. Residual peaks +# often reveal missing physics or contamination. + +# %% [markdown] +# ## 🎁 Bonus +# +# You've now completed the fitting portion of the Summer School workflow, +# demonstrating the practical use of EasyDiffraction for refining simulated +# powder diffraction data. +# +# To continue learning and exploring more features of +# the EasyDiffraction library, you can visit the official tutorial page +# and select one of the many available tutorials: +# https://easyscience.github.io/diffraction-lib/tutorials/ From f3b1549957b938d1c0233d151c7544cef1eed466 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 11 Jul 2025 13:22:14 +0200 Subject: [PATCH 07/41] Updates Summer School tutorial --- ...ool-2025_analysis-powder-diffraction.ipynb | 390 ++++++++++-------- ...school-2025_analysis-powder-diffraction.py | 156 +++---- 2 files changed, 293 insertions(+), 253 deletions(-) diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb index 1d74fb1d..0f9af094 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb @@ -3,14 +3,13 @@ { "cell_type": "code", "execution_count": null, - "id": "8ff514e8", + "id": "73f597e7", "metadata": {}, "outputs": [], "source": [ "# TODO: Remove this cell in the final version of the tutorial.\n", - "# Google Colab and Jupyter Notebook environments may not have the\n", - "# easydiffraction library installed by default. So, we check if the\n", - "# library is available and install it if necessary.\n", + "# Needed for the Google Colab environment.\n", + "# Install the easydiffraction library if it is not already installed.\n", "import builtins\n", "import importlib.util\n", "\n", @@ -22,21 +21,21 @@ }, { "cell_type": "markdown", - "id": "c4f59cef", + "id": "69dab116", "metadata": {}, "source": [ "# Data Analysis: Powder Diffraction\n", "\n", - "This tutorial will guide you through the refinement of simulated diffraction\n", + "This tutorial guides you through the refinement of simulated diffraction\n", "patterns for Si (Part 1) and La₀.₅Ba₀.₅CoO₃ (LBCO) (Part 2) using the\n", "EasyDiffraction Python library.\n", "\n", - "The objective is to develop familiarity with the Rietveld refinement process\n", + "The goal is to develop familiarity with the Rietveld refinement process\n", "for crystal structures using powder diffraction data.\n", "\n", "## 🛠️ Import Library\n", "\n", - "First, import the necessary library for the analysis. In this tutorial, we\n", + "Start by importing the necessary library for the analysis. In this tutorial, we\n", "use the EasyDiffraction library, which offers tools for\n", "analyzing and refining powder diffraction data.\n", "\n", @@ -53,7 +52,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b4905a50", + "id": "688e5061", "metadata": {}, "outputs": [], "source": [ @@ -62,7 +61,7 @@ }, { "cell_type": "markdown", - "id": "c8b56df0", + "id": "cb20df0e", "metadata": {}, "source": [ "## 📘 Introduction: Simple Reference Fit – Si\n", @@ -90,7 +89,7 @@ { "cell_type": "code", "execution_count": null, - "id": "30116e14", + "id": "36ef2666", "metadata": {}, "outputs": [], "source": [ @@ -99,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "c1d17f64", + "id": "7dcfc574", "metadata": {}, "source": [ "\n", @@ -112,7 +111,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6e8fabf6", + "id": "f4fb8b63", "metadata": {}, "outputs": [], "source": [ @@ -122,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "ad044ebb", + "id": "0e4c7e4e", "metadata": {}, "source": [ "### 🔬 Create an Experiment\n", @@ -142,7 +141,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7b6124c0", + "id": "816bc73b", "metadata": {}, "outputs": [], "source": [ @@ -156,7 +155,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c71a924b", + "id": "f4cc88f4", "metadata": {}, "outputs": [], "source": [ @@ -169,13 +168,13 @@ }, { "cell_type": "markdown", - "id": "4ec59b39", + "id": "c84dd22d", "metadata": {}, "source": [ "#### Inspect Measured Data\n", "\n", "After creating the experiment, we can examine the measured data. The measured\n", - "data consists of a diffraction pattern comprising time-of-flight (TOF) values\n", + "data consists of a diffraction pattern having time-of-flight (TOF) values\n", "and corresponding intensities. The TOF values are given in microseconds (μs),\n", "and the intensities are in arbitrary units.\n", "\n", @@ -192,7 +191,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1e993a5e", + "id": "1f5d7c00", "metadata": {}, "outputs": [], "source": [ @@ -202,7 +201,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c6452757", + "id": "fd82020c", "metadata": {}, "outputs": [], "source": [ @@ -211,7 +210,7 @@ }, { "cell_type": "markdown", - "id": "0362eb2a", + "id": "dcd77c5f", "metadata": {}, "source": [ "If you zoom in on the highest TOF peak (around 120,000 μs), you will notice\n", @@ -225,7 +224,7 @@ { "cell_type": "code", "execution_count": null, - "id": "13b0c182", + "id": "4ae0af65", "metadata": {}, "outputs": [], "source": [ @@ -234,7 +233,7 @@ }, { "cell_type": "markdown", - "id": "b6434dd6", + "id": "e4c55f5a", "metadata": {}, "source": [ "To visualize the effect of excluding the high TOF region, we can plot\n", @@ -245,7 +244,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0c06624e", + "id": "44c11bea", "metadata": {}, "outputs": [], "source": [ @@ -254,7 +253,7 @@ }, { "cell_type": "markdown", - "id": "49c00bd2", + "id": "49d2ee09", "metadata": {}, "source": [ "#### Set Instrument Parameters\n", @@ -271,19 +270,18 @@ { "cell_type": "code", "execution_count": null, - "id": "e3da278e", + "id": "e044da2c", "metadata": {}, "outputs": [], "source": [ "project_1.experiments['sim_si'].instrument.setup_twotheta_bank = 101.46\n", - "#project_1.experiments['sim_si'].instrument.calib_d_to_tof_offset = 0.0\n", "project_1.experiments['sim_si'].instrument.calib_d_to_tof_linear = 61710.64\n", "project_1.experiments['sim_si'].instrument.calib_d_to_tof_quad = -0.00001" ] }, { "cell_type": "markdown", - "id": "d866b023", + "id": "e0740e17", "metadata": {}, "source": [ "#### Set Peak Profile Parameters\n", @@ -303,23 +301,25 @@ { "cell_type": "code", "execution_count": null, - "id": "3c9e509a", - "metadata": {}, + "id": "422f1a4d", + "metadata": { + "lines_to_next_cell": 2 + }, "outputs": [], "source": [ "project_1.experiments['sim_si'].peak_profile_type = 'pseudo-voigt * ikeda-carpenter'\n", - "project_1.experiments['sim_si'].peak.broad_gauss_sigma_0 = 45137\n", - "project_1.experiments['sim_si'].peak.broad_gauss_sigma_1 = -52394\n", - "project_1.experiments['sim_si'].peak.broad_gauss_sigma_2 = 22998\n", + "project_1.experiments['sim_si'].peak.broad_gauss_sigma_0 = 47347.42\n", + "project_1.experiments['sim_si'].peak.broad_gauss_sigma_1 = -55360.02\n", + "project_1.experiments['sim_si'].peak.broad_gauss_sigma_2 = 23882.42\n", "project_1.experiments['sim_si'].peak.broad_mix_beta_0 = 0.0055\n", "project_1.experiments['sim_si'].peak.broad_mix_beta_1 = 0.0041\n", "project_1.experiments['sim_si'].peak.asym_alpha_0 = 0\n", - "project_1.experiments['sim_si'].peak.asym_alpha_1 = 0.0097" + "project_1.experiments['sim_si'].peak.asym_alpha_1 = 0.0096" ] }, { "cell_type": "markdown", - "id": "4b960a31", + "id": "8d3469cf", "metadata": {}, "source": [ "#### Set Background\n", @@ -349,7 +349,7 @@ { "cell_type": "code", "execution_count": null, - "id": "57d6f06c", + "id": "109b54fb", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ }, { "cell_type": "markdown", - "id": "fada02dd", + "id": "effc5b79", "metadata": {}, "source": [ "### 🧩 Create a Sample Model – Si\n", @@ -407,7 +407,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2b4026bb", + "id": "60660d84", "metadata": {}, "outputs": [], "source": [ @@ -416,7 +416,7 @@ }, { "cell_type": "markdown", - "id": "a0c36f1f", + "id": "479a83fb", "metadata": {}, "source": [ "#### Set Space Group" @@ -425,7 +425,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ceac0e8e", + "id": "26b972cc", "metadata": {}, "outputs": [], "source": [ @@ -435,7 +435,7 @@ }, { "cell_type": "markdown", - "id": "9a0a23cc", + "id": "94c441f9", "metadata": {}, "source": [ "#### Set Lattice Parameters" @@ -444,7 +444,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0f860366", + "id": "07d4896f", "metadata": {}, "outputs": [], "source": [ @@ -453,7 +453,7 @@ }, { "cell_type": "markdown", - "id": "9270c42b", + "id": "94d4636f", "metadata": {}, "source": [ "#### Set Atom Sites" @@ -462,22 +462,22 @@ { "cell_type": "code", "execution_count": null, - "id": "759a998c", + "id": "d0fd5744", "metadata": {}, "outputs": [], "source": [ "project_1.sample_models['si'].atom_sites.add(label='Si',\n", - " type_symbol='Si',\n", - " fract_x=0,\n", - " fract_y=0,\n", - " fract_z=0,\n", - " wyckoff_letter='a',\n", - " b_iso=0.95)" + " type_symbol='Si',\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter='a',\n", + " b_iso=0.95)" ] }, { "cell_type": "markdown", - "id": "4be2f331", + "id": "58d1ef57", "metadata": {}, "source": [ "### 🔗 Assign Sample Model to Experiment\n", @@ -490,7 +490,7 @@ { "cell_type": "code", "execution_count": null, - "id": "610ef867", + "id": "bbf4a7cd", "metadata": {}, "outputs": [], "source": [ @@ -499,7 +499,7 @@ }, { "cell_type": "markdown", - "id": "7e909775", + "id": "2b39d19e", "metadata": {}, "source": [ "### 🚀 Analyze and Fit the Data\n", @@ -528,7 +528,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7cd309e4", + "id": "42b61e69", "metadata": {}, "outputs": [], "source": [ @@ -539,7 +539,7 @@ }, { "cell_type": "markdown", - "id": "2bacde08", + "id": "e5508b39", "metadata": {}, "source": [ "#### Show Free Parameters\n", @@ -551,7 +551,7 @@ { "cell_type": "code", "execution_count": null, - "id": "edb510ad", + "id": "ae57abbd", "metadata": {}, "outputs": [], "source": [ @@ -560,7 +560,7 @@ }, { "cell_type": "markdown", - "id": "ec5b380e", + "id": "7702bf46", "metadata": {}, "source": [ "#### Visualize Diffraction Patterns\n", @@ -576,7 +576,7 @@ { "cell_type": "code", "execution_count": null, - "id": "de73d893", + "id": "2f629cb8", "metadata": {}, "outputs": [], "source": [ @@ -585,7 +585,7 @@ }, { "cell_type": "markdown", - "id": "1a0b603c", + "id": "1a618e7d", "metadata": {}, "source": [ "#### Run Fitting\n", @@ -597,7 +597,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b55a8a1f", + "id": "80c0ed64", "metadata": {}, "outputs": [], "source": [ @@ -606,7 +606,7 @@ }, { "cell_type": "markdown", - "id": "d4353cd6", + "id": "06e5a46f", "metadata": {}, "source": [ "#### Check Fit Results\n", @@ -623,7 +623,7 @@ }, { "cell_type": "markdown", - "id": "7fbe3845", + "id": "536a2996", "metadata": {}, "source": [ "#### Visualize Fit Results\n", @@ -637,7 +637,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1d1c1cd1", + "id": "dc9bb18d", "metadata": {}, "outputs": [], "source": [ @@ -646,7 +646,7 @@ }, { "cell_type": "markdown", - "id": "830290d5", + "id": "40eceafd", "metadata": {}, "source": [ "#### TOF vs d-spacing\n", @@ -665,7 +665,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a1ce9090", + "id": "3c01cbb3", "metadata": {}, "outputs": [], "source": [ @@ -674,7 +674,7 @@ }, { "cell_type": "markdown", - "id": "d152e9eb", + "id": "6553c89a", "metadata": {}, "source": [ "As you can see, the calculated diffraction pattern now matches the measured\n", @@ -709,7 +709,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c2171418", + "id": "edf1a8f0", "metadata": {}, "outputs": [], "source": [ @@ -720,10 +720,10 @@ }, { "cell_type": "markdown", - "id": "55e10c61", + "id": "fc9db4fc", "metadata": {}, "source": [ - "### 🔬 Exercise 2: Define an Experiment – LBCO\n", + "### 🔬 Exercise 2: Define an Experiment\n", "\n", "#### Exercise 2.1: Create an Experiment\n", "\n", @@ -739,7 +739,7 @@ { "cell_type": "code", "execution_count": null, - "id": "94da590f", + "id": "e89abd6b", "metadata": {}, "outputs": [], "source": [ @@ -753,7 +753,7 @@ { "cell_type": "code", "execution_count": null, - "id": "eb5ba926", + "id": "ab7f0436", "metadata": {}, "outputs": [], "source": [ @@ -766,7 +766,7 @@ }, { "cell_type": "markdown", - "id": "491a17da", + "id": "bf9c8516", "metadata": {}, "source": [ "#### Exercise 2.1: Inspect Measured Data\n", @@ -785,7 +785,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f4ee035f", + "id": "b0386f80", "metadata": {}, "outputs": [], "source": [ @@ -796,7 +796,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d8cb981a", + "id": "aa7f76d0", "metadata": {}, "outputs": [], "source": [ @@ -806,7 +806,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2660e4cc", + "id": "7f393378", "metadata": {}, "outputs": [], "source": [ @@ -815,7 +815,7 @@ }, { "cell_type": "markdown", - "id": "47fa6a1a", + "id": "78e45bfd", "metadata": {}, "source": [ "#### Exercise 2.2: Set Instrument Parameters\n", @@ -831,19 +831,18 @@ { "cell_type": "code", "execution_count": null, - "id": "55faca39", + "id": "d547d488", "metadata": {}, "outputs": [], "source": [ - "project_2.experiments['sim_lbco'].instrument.setup_twotheta_bank = 94.90931761529106\n", - "project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_offset = 0.0\n", - "project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_linear = 58752.5575 #58724.76869981215\n", + "project_2.experiments['sim_lbco'].instrument.setup_twotheta_bank = 94.91\n", + "project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_linear = 58752.56\n", "project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_quad = -0.00001" ] }, { "cell_type": "markdown", - "id": "7bac55a8", + "id": "92e43f5d", "metadata": {}, "source": [ "#### Exercise 2.3: Set Peak Profile Parameters\n", @@ -858,23 +857,23 @@ { "cell_type": "code", "execution_count": null, - "id": "8e8f46e7", + "id": "5ea35fb6", "metadata": {}, "outputs": [], "source": [ "project_2.peak_profile_type = 'pseudo-voigt * ikeda-carpenter'\n", - "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_0 = 47347.4233 #45211\n", - "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_1 = -55360.0162 #-52477\n", - "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_2 = 23882.4236 #23014\n", + "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_0 = 47347.42\n", + "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_1 = -55360.02\n", + "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_2 = 23882.42\n", "project_2.experiments['sim_lbco'].peak.broad_mix_beta_0 = 0.0055\n", "project_2.experiments['sim_lbco'].peak.broad_mix_beta_1 = 0.0041\n", "project_2.experiments['sim_lbco'].peak.asym_alpha_0 = 0\n", - "project_2.experiments['sim_lbco'].peak.asym_alpha_1 = 0.0096 #0.0097" + "project_2.experiments['sim_lbco'].peak.asym_alpha_1 = 0.0096" ] }, { "cell_type": "markdown", - "id": "6030ce74", + "id": "8aac95f4", "metadata": {}, "source": [ "#### Exercise 2.4: Set Background\n", @@ -893,7 +892,7 @@ { "cell_type": "code", "execution_count": null, - "id": "40abaa16", + "id": "cac87735", "metadata": {}, "outputs": [], "source": [ @@ -909,7 +908,7 @@ }, { "cell_type": "markdown", - "id": "e766f8bc", + "id": "6f3f9e4c", "metadata": {}, "source": [ "### 🧩 Exercise 3: Define a Sample Model – LBCO\n", @@ -921,7 +920,7 @@ }, { "cell_type": "markdown", - "id": "89eb58d4", + "id": "a8703439", "metadata": {}, "source": [ "```\n", @@ -956,7 +955,7 @@ }, { "cell_type": "markdown", - "id": "922b6b26", + "id": "d3372a43", "metadata": {}, "source": [ "#### Exercise 3.1: Create Sample Model\n", @@ -972,7 +971,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5cf2ac8d", + "id": "4f1d9719", "metadata": {}, "outputs": [], "source": [ @@ -981,7 +980,7 @@ }, { "cell_type": "markdown", - "id": "84557c0c", + "id": "997a39da", "metadata": {}, "source": [ "#### Exercise 3.2: Set Space Group\n", @@ -996,7 +995,7 @@ { "cell_type": "code", "execution_count": null, - "id": "613c126c", + "id": "cbcffb43", "metadata": {}, "outputs": [], "source": [ @@ -1006,7 +1005,7 @@ }, { "cell_type": "markdown", - "id": "9fd2f8d1", + "id": "0a67bdb7", "metadata": {}, "source": [ "#### Exercise 3.3: Set Lattice Parameters\n", @@ -1021,7 +1020,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5cb72236", + "id": "4d9883fd", "metadata": {}, "outputs": [], "source": [ @@ -1030,7 +1029,7 @@ }, { "cell_type": "markdown", - "id": "1ad253c4", + "id": "f8c86dec", "metadata": {}, "source": [ "#### Exercise 3.4: Set Atom Sites\n", @@ -1047,45 +1046,45 @@ { "cell_type": "code", "execution_count": null, - "id": "aa734bbd", + "id": "8f437bc4", "metadata": {}, "outputs": [], "source": [ "project_2.sample_models['lbco'].atom_sites.add(label='La',\n", - " type_symbol='La',\n", - " fract_x=0,\n", - " fract_y=0,\n", - " fract_z=0,\n", - " wyckoff_letter='a',\n", - " b_iso=0.1,\n", - " occupancy=0.5)\n", + " type_symbol='La',\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter='a',\n", + " b_iso=0.1,\n", + " occupancy=0.5)\n", "project_2.sample_models['lbco'].atom_sites.add(label='Ba',\n", - " type_symbol='Ba',\n", - " fract_x=0,\n", - " fract_y=0,\n", - " fract_z=0,\n", - " wyckoff_letter='a',\n", - " b_iso=0.1,\n", - " occupancy=0.5)\n", + " type_symbol='Ba',\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter='a',\n", + " b_iso=0.1,\n", + " occupancy=0.5)\n", "project_2.sample_models['lbco'].atom_sites.add(label='Co',\n", - " type_symbol='Co',\n", - " fract_x=0.5,\n", - " fract_y=0.5,\n", - " fract_z=0.5,\n", - " wyckoff_letter='b',\n", - " b_iso=0.36)\n", + " type_symbol='Co',\n", + " fract_x=0.5,\n", + " fract_y=0.5,\n", + " fract_z=0.5,\n", + " wyckoff_letter='b',\n", + " b_iso=0.36)\n", "project_2.sample_models['lbco'].atom_sites.add(label='O',\n", - " type_symbol='O',\n", - " fract_x=0,\n", - " fract_y=0.5,\n", - " fract_z=0.5,\n", - " wyckoff_letter='c',\n", - " b_iso=2.14)" + " type_symbol='O',\n", + " fract_x=0,\n", + " fract_y=0.5,\n", + " fract_z=0.5,\n", + " wyckoff_letter='c',\n", + " b_iso=2.14)" ] }, { "cell_type": "markdown", - "id": "e5d5917c", + "id": "86176cbc", "metadata": {}, "source": [ "### 🔗 Exercise 4: Assign Sample Model to Experiment\n", @@ -1100,7 +1099,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a41e1266", + "id": "83dbf0bf", "metadata": {}, "outputs": [], "source": [ @@ -1109,7 +1108,7 @@ }, { "cell_type": "markdown", - "id": "3ab7815e", + "id": "9b6fed82", "metadata": {}, "source": [ "### 🚀 Exercise 5: Analyze and Fit the Data\n", @@ -1128,7 +1127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "265283f7", + "id": "90ce5c80", "metadata": {}, "outputs": [], "source": [ @@ -1139,7 +1138,7 @@ }, { "cell_type": "markdown", - "id": "92879d1b", + "id": "120cf52a", "metadata": {}, "source": [ "#### Exercise 5.2: Run Fitting\n", @@ -1158,7 +1157,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5440a819", + "id": "28bf3dc6", "metadata": {}, "outputs": [], "source": [ @@ -1168,7 +1167,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3fa88267", + "id": "c801b71a", "metadata": {}, "outputs": [], "source": [ @@ -1177,16 +1176,16 @@ }, { "cell_type": "markdown", - "id": "6a0f858f", + "id": "cca969c7", "metadata": {}, "source": [ - "#### Exercise 6.1: ❓Find the Misfit in the Fit\n", + "#### Exercise 5.3: Find the Misfit in the Fit\n", "\n", "Visualize the measured and calculated diffraction patterns after the fit. As\n", "you can see, the fit shows noticeable discrepancies. If you zoom in on different regions of the pattern,\n", "you will observe that all the calculated peaks are shifted to the left.\n", "\n", - "**Question**: What could be the reason for the misfit?\n", + "What could be the reason for the misfit?\n", "\n", "**Hint**: Consider the following options:\n", "- The conversion parameters from TOF to d-spacing are not correct.\n", @@ -1205,7 +1204,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f7cb1c91", + "id": "00c1e512", "metadata": {}, "outputs": [], "source": [ @@ -1214,10 +1213,10 @@ }, { "cell_type": "markdown", - "id": "275b1e32", + "id": "30980973", "metadata": {}, "source": [ - "### 🚀 Exercise 6.2: Refine the LBCO Lattice Parameter\n", + "#### Exercise 5.4: Refine the LBCO Lattice Parameter\n", "\n", "To improve the fit, refine the lattice parameter of the LBCO phase.\n", "\n", @@ -1232,7 +1231,7 @@ { "cell_type": "code", "execution_count": null, - "id": "efedcb50", + "id": "5dc59af7", "metadata": {}, "outputs": [], "source": [ @@ -1242,7 +1241,7 @@ { "cell_type": "code", "execution_count": null, - "id": "69360600", + "id": "2d14ef4d", "metadata": {}, "outputs": [], "source": [ @@ -1252,7 +1251,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8628719e", + "id": "b0f92293", "metadata": {}, "outputs": [], "source": [ @@ -1261,10 +1260,10 @@ }, { "cell_type": "markdown", - "id": "5a21ce56", + "id": "85dfb0d5", "metadata": {}, "source": [ - "### Exercise 6.3: Visualize the Fit Results in d-spacing\n", + "#### Exercise 5.5: Visualize the Fit Results in d-spacing\n", "\n", "Plot measured vs calculated diffraction patterns in d-spacing instead of TOF.\n", "\n", @@ -1277,7 +1276,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9b352148", + "id": "8b227ebc", "metadata": {}, "outputs": [], "source": [ @@ -1286,10 +1285,10 @@ }, { "cell_type": "markdown", - "id": "c2b286a7", + "id": "6399be85", "metadata": {}, "source": [ - "### ❓Exercise 7.1: Find Undefined Features\n", + "#### Exercise 5.6: Find Undefined Features\n", "\n", "After refining the lattice parameter, the fit is significantly improved, but\n", "inspect the diffraction pattern again. Are you noticing anything undefined?\n", @@ -1305,7 +1304,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d5b77eca", + "id": "71c223a1", "metadata": {}, "outputs": [], "source": [ @@ -1314,31 +1313,31 @@ }, { "cell_type": "markdown", - "id": "756c1a61", + "id": "17d5d870", "metadata": {}, "source": [ - "### Exercise 7.2: Identify the Cause of the Unexplained Peaks\n", + "#### Exercise 5.7: Identify the Cause of the Unexplained Peaks\n", "\n", "**Hint**: Consider the following options:\n", - "- The LBCO phase is not the only phase present in the sample.\n", "- The LBCO phase is not correctly modeled.\n", + "- The LBCO phase is not the only phase present in the sample.\n", "- The data reduction process introduced artifacts.\n", "\n", "**Solution**:\n", + "- ❌ In principle, this could be the case, but in this case, the LBCO phase is correctly modeled.\n", "- ✅ The LBCO phase is not the only phase present in the sample. The unexplained peaks\n", "are likely due to the presence of an impurity phase in the sample, which is not\n", "included in the current model.\n", - "- ❌ In principle, this could be the case, but in this case, the LBCO phase is correctly modeled.\n", "- ❌ The data reduction process is not likely to introduce such specific peaks, as it is\n", "tested and verified in the previous part of the tutorial." ] }, { "cell_type": "markdown", - "id": "fe05eadc", + "id": "fcdaac01", "metadata": {}, "source": [ - "### 🧠 Exercise 7.3: Identify the impurity phase\n", + "#### Exercise 5.8: Identify the impurity phase\n", "\n", "Identify the impurity phase.\n", "\n", @@ -1347,24 +1346,42 @@ "tutorial.\n", "\n", "**Solution**:\n", - "The unexplained peaks are likely due to the presence of silicon (Si) in the sample." + "The unexplained peaks are likely due to the presence of silicon (Si) in the sample.\n", + "You can visalize both the patterns of the Si and LBCO phases to confirm this hypothesis." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97952b28", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.plot_meas_vs_calc(expt_name='sim_si', x_min=1, x_max=1.7, d_spacing=True)\n", + "project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1, x_max=1.7, d_spacing=True)" ] }, { "cell_type": "markdown", - "id": "9b573c56", + "id": "b78f6653", "metadata": {}, "source": [ - "### 🧠 Exercise 8: Refine with the Impurity Phase\n", + "#### Exercise 5.9: Create a Second Sample Model – Si as Impurity\n", + "\n", + "Create a second sample model for the Si phase, which is the impurity phase\n", + "identified in the previous step. Link this sample model to the LBCO\n", + "experiment.\n", "\n", - "#### 🧩 Exercise 8.1: Create a Second Sample Model – Si as Impurity\n", + "**Hint**: You can use the same approach as in the previous part of the\n", + "tutorial, but this time you need to create a sample model for Si and link it\n", + "to the LBCO experiment.\n", "\n", "**Solution:**" ] }, { "cell_type": "markdown", - "id": "3ca59bdb", + "id": "e6f9b0f9", "metadata": {}, "source": [ "**Set Space Group**" @@ -1373,7 +1390,7 @@ { "cell_type": "code", "execution_count": null, - "id": "371b565b", + "id": "f696180d", "metadata": {}, "outputs": [], "source": [ @@ -1383,7 +1400,7 @@ { "cell_type": "code", "execution_count": null, - "id": "85e7164c", + "id": "35eb4ef0", "metadata": {}, "outputs": [], "source": [ @@ -1393,7 +1410,7 @@ }, { "cell_type": "markdown", - "id": "f92190d4", + "id": "10b57d6d", "metadata": {}, "source": [ "**Set Lattice Parameters**" @@ -1402,7 +1419,7 @@ { "cell_type": "code", "execution_count": null, - "id": "308b58a6", + "id": "e7500019", "metadata": {}, "outputs": [], "source": [ @@ -1411,7 +1428,7 @@ }, { "cell_type": "markdown", - "id": "959de1cb", + "id": "e1c5293c", "metadata": {}, "source": [ "**Set Atom Sites**" @@ -1420,7 +1437,7 @@ { "cell_type": "code", "execution_count": null, - "id": "86c9626d", + "id": "b31ee25a", "metadata": {}, "outputs": [], "source": [ @@ -1435,7 +1452,7 @@ }, { "cell_type": "markdown", - "id": "d2d41865", + "id": "b26dc406", "metadata": {}, "source": [ "**🔗 Assign Sample Model to Experiment**" @@ -1444,7 +1461,7 @@ { "cell_type": "code", "execution_count": null, - "id": "41d7fe1a", + "id": "928d3168", "metadata": {}, "outputs": [], "source": [ @@ -1453,10 +1470,19 @@ }, { "cell_type": "markdown", - "id": "27cabcc5", + "id": "3e4dfdde", "metadata": {}, "source": [ - "#### 🚀 Exercise 8.3: Analyze and Fit the Data: 3rd Fit\n", + "#### Exercise 5.10: Refine the Scale of the Si Phase\n", + "\n", + "Visualize the measured diffraction pattern and the calculated diffraction\n", + "pattern. Check if the Si phase is contributing to the calculated diffraction\n", + "pattern. Refine the scale factor of the Si phase to improve the fit.\n", + "\n", + "**Hint**: You can use the `plot_meas_vs_calc` method of the project to\n", + "visualize the patterns. Then, set the `free` attribute of the `scale`\n", + "parameter of the Si phase to `True` to allow the fitting process to adjust\n", + "the scale factor.\n", "\n", "**Solution:**\n", "\n", @@ -1470,7 +1496,7 @@ { "cell_type": "code", "execution_count": null, - "id": "243006f7", + "id": "e7b9162e", "metadata": {}, "outputs": [], "source": [ @@ -1479,7 +1505,7 @@ }, { "cell_type": "markdown", - "id": "d999f364", + "id": "499e367e", "metadata": {}, "source": [ "As you can see, the calculated pattern is now the sum of both phases,\n", @@ -1492,7 +1518,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5277cc94", + "id": "0f115865", "metadata": {}, "outputs": [], "source": [ @@ -1501,7 +1527,7 @@ }, { "cell_type": "markdown", - "id": "de18b359", + "id": "8ee5648a", "metadata": {}, "source": [ "**Run Fitting**\n", @@ -1512,7 +1538,7 @@ { "cell_type": "code", "execution_count": null, - "id": "aa150a35", + "id": "017ebcde", "metadata": {}, "outputs": [], "source": [ @@ -1521,7 +1547,7 @@ }, { "cell_type": "markdown", - "id": "1437a346", + "id": "09b5da6c", "metadata": {}, "source": [ "**Visualize Fit Results**\n", @@ -1534,7 +1560,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a3085273", + "id": "e67cb19f", "metadata": {}, "outputs": [], "source": [ @@ -1544,7 +1570,7 @@ { "cell_type": "code", "execution_count": null, - "id": "58400b9a", + "id": "3bca5e00", "metadata": {}, "outputs": [], "source": [ @@ -1553,10 +1579,10 @@ }, { "cell_type": "markdown", - "id": "bf21e5a3", + "id": "ffe6e765", "metadata": {}, "source": [ - "Now there are no unexplained peaks in the pattern, and the fit is improved.\n", + "All previously unexplained peaks are now accounted for in the pattern, and the fit is improved.\n", "Some discrepancies in the peak intensities remain, but\n", "further improvements would require more advanced data reduction and analysis,\n", "which are beyond the scope of this tutorial." @@ -1564,14 +1590,14 @@ }, { "cell_type": "markdown", - "id": "e273f6d0", + "id": "cfe8c3a3", "metadata": {}, "source": [ "## 📑 Summary\n", "\n", "In this tutorial, you refined two simulated diffraction patterns:\n", "- **Si** as a simple reference system, and\n", - "- **LBCO** as a more complex, realistic case with an unknown impurity.\n", + "- **LBCO** as a more complex, realistic case with an initially unknown impurity.\n", "\n", "Along the way, you learned how to:\n", "- Define a project, experiment, and sample model in EasyDiffraction\n", @@ -1583,20 +1609,18 @@ "Key Takeaways:\n", "- A good refinement starts with a reasonable structural model and\n", " well-defined instrument parameters.\n", - "- Even simulated data may include artifacts or unintended\n", - " contributions—mimicking real experimental conditions.\n", "- Visual inspection is a critical part of model validation. Residual peaks\n", " often reveal missing physics or contamination." ] }, { "cell_type": "markdown", - "id": "ffdb6632", + "id": "cbc35980", "metadata": {}, "source": [ "## 🎁 Bonus\n", "\n", - "You've now completed the fitting portion of the Summer School workflow,\n", + "You've now completed the analysis part of the Summer School workflow,\n", "demonstrating the practical use of EasyDiffraction for refining simulated\n", "powder diffraction data.\n", "\n", diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py index 499014e9..20200aec 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py @@ -1,8 +1,7 @@ # %% # TODO: Remove this cell in the final version of the tutorial. -# Google Colab and Jupyter Notebook environments may not have the -# easydiffraction library installed by default. So, we check if the -# library is available and install it if necessary. +# Needed for the Google Colab environment. +# Install the easydiffraction library if it is not already installed. import builtins import importlib.util @@ -14,16 +13,16 @@ # %% [markdown] # # Data Analysis: Powder Diffraction # -# This tutorial will guide you through the refinement of simulated diffraction +# This tutorial guides you through the refinement of simulated diffraction # patterns for Si (Part 1) and La₀.₅Ba₀.₅CoO₃ (LBCO) (Part 2) using the # EasyDiffraction Python library. # -# The objective is to develop familiarity with the Rietveld refinement process +# The goal is to develop familiarity with the Rietveld refinement process # for crystal structures using powder diffraction data. # # ## 🛠️ Import Library # -# First, import the necessary library for the analysis. In this tutorial, we +# Start by importing the necessary library for the analysis. In this tutorial, we # use the EasyDiffraction library, which offers tools for # analyzing and refining powder diffraction data. # @@ -107,7 +106,7 @@ # #### Inspect Measured Data # # After creating the experiment, we can examine the measured data. The measured -# data consists of a diffraction pattern comprising time-of-flight (TOF) values +# data consists of a diffraction pattern having time-of-flight (TOF) values # and corresponding intensities. The TOF values are given in microseconds (μs), # and the intensities are in arbitrary units. # @@ -158,7 +157,6 @@ # %% project_1.experiments['sim_si'].instrument.setup_twotheta_bank = 101.46 -#project_1.experiments['sim_si'].instrument.calib_d_to_tof_offset = 0.0 project_1.experiments['sim_si'].instrument.calib_d_to_tof_linear = 61710.64 project_1.experiments['sim_si'].instrument.calib_d_to_tof_quad = -0.00001 @@ -178,13 +176,14 @@ # %% project_1.experiments['sim_si'].peak_profile_type = 'pseudo-voigt * ikeda-carpenter' -project_1.experiments['sim_si'].peak.broad_gauss_sigma_0 = 45137 -project_1.experiments['sim_si'].peak.broad_gauss_sigma_1 = -52394 -project_1.experiments['sim_si'].peak.broad_gauss_sigma_2 = 22998 +project_1.experiments['sim_si'].peak.broad_gauss_sigma_0 = 47347.42 +project_1.experiments['sim_si'].peak.broad_gauss_sigma_1 = -55360.02 +project_1.experiments['sim_si'].peak.broad_gauss_sigma_2 = 23882.42 project_1.experiments['sim_si'].peak.broad_mix_beta_0 = 0.0055 project_1.experiments['sim_si'].peak.broad_mix_beta_1 = 0.0041 project_1.experiments['sim_si'].peak.asym_alpha_0 = 0 -project_1.experiments['sim_si'].peak.asym_alpha_1 = 0.0097 +project_1.experiments['sim_si'].peak.asym_alpha_1 = 0.0096 + # %% [markdown] # #### Set Background @@ -277,12 +276,12 @@ # %% project_1.sample_models['si'].atom_sites.add(label='Si', - type_symbol='Si', - fract_x=0, - fract_y=0, - fract_z=0, - wyckoff_letter='a', - b_iso=0.95) + type_symbol='Si', + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter='a', + b_iso=0.95) # %% [markdown] # ### 🔗 Assign Sample Model to Experiment @@ -427,7 +426,7 @@ project_2.info.description = 'Fitting simulated powder diffraction pattern of La0.5Ba0.5CoO3.' # %% [markdown] -# ### 🔬 Exercise 2: Define an Experiment – LBCO +# ### 🔬 Exercise 2: Define an Experiment # # #### Exercise 2.1: Create an Experiment # @@ -487,9 +486,8 @@ # **Solution:** # %% -project_2.experiments['sim_lbco'].instrument.setup_twotheta_bank = 94.90931761529106 -project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_offset = 0.0 -project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_linear = 58752.5575 #58724.76869981215 +project_2.experiments['sim_lbco'].instrument.setup_twotheta_bank = 94.91 +project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_linear = 58752.56 project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_quad = -0.00001 # %% [markdown] @@ -503,13 +501,13 @@ # %% project_2.peak_profile_type = 'pseudo-voigt * ikeda-carpenter' -project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_0 = 47347.4233 #45211 -project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_1 = -55360.0162 #-52477 -project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_2 = 23882.4236 #23014 +project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_0 = 47347.42 +project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_1 = -55360.02 +project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_2 = 23882.42 project_2.experiments['sim_lbco'].peak.broad_mix_beta_0 = 0.0055 project_2.experiments['sim_lbco'].peak.broad_mix_beta_1 = 0.0041 project_2.experiments['sim_lbco'].peak.asym_alpha_0 = 0 -project_2.experiments['sim_lbco'].peak.asym_alpha_1 = 0.0096 #0.0097 +project_2.experiments['sim_lbco'].peak.asym_alpha_1 = 0.0096 # %% [markdown] # #### Exercise 2.4: Set Background @@ -622,35 +620,35 @@ # %% project_2.sample_models['lbco'].atom_sites.add(label='La', - type_symbol='La', - fract_x=0, - fract_y=0, - fract_z=0, - wyckoff_letter='a', - b_iso=0.1, - occupancy=0.5) + type_symbol='La', + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter='a', + b_iso=0.1, + occupancy=0.5) project_2.sample_models['lbco'].atom_sites.add(label='Ba', - type_symbol='Ba', - fract_x=0, - fract_y=0, - fract_z=0, - wyckoff_letter='a', - b_iso=0.1, - occupancy=0.5) + type_symbol='Ba', + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter='a', + b_iso=0.1, + occupancy=0.5) project_2.sample_models['lbco'].atom_sites.add(label='Co', - type_symbol='Co', - fract_x=0.5, - fract_y=0.5, - fract_z=0.5, - wyckoff_letter='b', - b_iso=0.36) + type_symbol='Co', + fract_x=0.5, + fract_y=0.5, + fract_z=0.5, + wyckoff_letter='b', + b_iso=0.36) project_2.sample_models['lbco'].atom_sites.add(label='O', - type_symbol='O', - fract_x=0, - fract_y=0.5, - fract_z=0.5, - wyckoff_letter='c', - b_iso=2.14) + type_symbol='O', + fract_x=0, + fract_y=0.5, + fract_z=0.5, + wyckoff_letter='c', + b_iso=2.14) # %% [markdown] # ### 🔗 Exercise 4: Assign Sample Model to Experiment @@ -702,13 +700,13 @@ project_2.analysis.fit() # %% [markdown] -# #### Exercise 6.1: ❓Find the Misfit in the Fit +# #### Exercise 5.3: Find the Misfit in the Fit # # Visualize the measured and calculated diffraction patterns after the fit. As # you can see, the fit shows noticeable discrepancies. If you zoom in on different regions of the pattern, # you will observe that all the calculated peaks are shifted to the left. # -# **Question**: What could be the reason for the misfit? +# What could be the reason for the misfit? # # **Hint**: Consider the following options: # - The conversion parameters from TOF to d-spacing are not correct. @@ -727,7 +725,7 @@ project_2.plot_meas_vs_calc(expt_name='sim_lbco') # %% [markdown] -# ### 🚀 Exercise 6.2: Refine the LBCO Lattice Parameter +# #### Exercise 5.4: Refine the LBCO Lattice Parameter # # To improve the fit, refine the lattice parameter of the LBCO phase. # @@ -748,7 +746,7 @@ project_2.plot_meas_vs_calc(expt_name='sim_lbco') # %% [markdown] -# ### Exercise 6.3: Visualize the Fit Results in d-spacing +# #### Exercise 5.5: Visualize the Fit Results in d-spacing # # Plot measured vs calculated diffraction patterns in d-spacing instead of TOF. # @@ -761,7 +759,7 @@ project_2.plot_meas_vs_calc(expt_name='sim_lbco', d_spacing=True) # %% [markdown] -# ### ❓Exercise 7.1: Find Undefined Features +# #### Exercise 5.6: Find Undefined Features # # After refining the lattice parameter, the fit is significantly improved, but # inspect the diffraction pattern again. Are you noticing anything undefined? @@ -777,23 +775,23 @@ project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1.53, x_max=1.7, d_spacing=True) # %% [markdown] -# ### Exercise 7.2: Identify the Cause of the Unexplained Peaks +# #### Exercise 5.7: Identify the Cause of the Unexplained Peaks # # **Hint**: Consider the following options: -# - The LBCO phase is not the only phase present in the sample. # - The LBCO phase is not correctly modeled. +# - The LBCO phase is not the only phase present in the sample. # - The data reduction process introduced artifacts. # # **Solution**: +# - ❌ In principle, this could be the case, but in this case, the LBCO phase is correctly modeled. # - ✅ The LBCO phase is not the only phase present in the sample. The unexplained peaks # are likely due to the presence of an impurity phase in the sample, which is not # included in the current model. -# - ❌ In principle, this could be the case, but in this case, the LBCO phase is correctly modeled. # - ❌ The data reduction process is not likely to introduce such specific peaks, as it is # tested and verified in the previous part of the tutorial. # %% [markdown] -# ### 🧠 Exercise 7.3: Identify the impurity phase +# #### Exercise 5.8: Identify the impurity phase # # Identify the impurity phase. # @@ -803,11 +801,22 @@ # # **Solution**: # The unexplained peaks are likely due to the presence of silicon (Si) in the sample. +# You can visalize both the patterns of the Si and LBCO phases to confirm this hypothesis. + +# %% +project_1.plot_meas_vs_calc(expt_name='sim_si', x_min=1, x_max=1.7, d_spacing=True) +project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1, x_max=1.7, d_spacing=True) # %% [markdown] -# ### 🧠 Exercise 8: Refine with the Impurity Phase +# #### Exercise 5.9: Create a Second Sample Model – Si as Impurity # -# #### 🧩 Exercise 8.1: Create a Second Sample Model – Si as Impurity +# Create a second sample model for the Si phase, which is the impurity phase +# identified in the previous step. Link this sample model to the LBCO +# experiment. +# +# **Hint**: You can use the same approach as in the previous part of the +# tutorial, but this time you need to create a sample model for Si and link it +# to the LBCO experiment. # # **Solution:** @@ -846,8 +855,17 @@ project_2.experiments['sim_lbco'].linked_phases.add(id='si', scale=1.0) # %% [markdown] -# #### 🚀 Exercise 8.3: Analyze and Fit the Data: 3rd Fit - +# #### Exercise 5.10: Refine the Scale of the Si Phase +# +# Visualize the measured diffraction pattern and the calculated diffraction +# pattern. Check if the Si phase is contributing to the calculated diffraction +# pattern. Refine the scale factor of the Si phase to improve the fit. +# +# **Hint**: You can use the `plot_meas_vs_calc` method of the project to +# visualize the patterns. Then, set the `free` attribute of the `scale` +# parameter of the Si phase to `True` to allow the fitting process to adjust +# the scale factor. +# # **Solution:** # # Before optimizing the parameters, we can visualize the measured @@ -891,7 +909,7 @@ project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=85000, x_max=105000) # %% [markdown] -# Now there are no unexplained peaks in the pattern, and the fit is improved. +# All previously unexplained peaks are now accounted for in the pattern, and the fit is improved. # Some discrepancies in the peak intensities remain, but # further improvements would require more advanced data reduction and analysis, # which are beyond the scope of this tutorial. @@ -901,7 +919,7 @@ # # In this tutorial, you refined two simulated diffraction patterns: # - **Si** as a simple reference system, and -# - **LBCO** as a more complex, realistic case with an unknown impurity. +# - **LBCO** as a more complex, realistic case with an initially unknown impurity. # # Along the way, you learned how to: # - Define a project, experiment, and sample model in EasyDiffraction @@ -913,15 +931,13 @@ # Key Takeaways: # - A good refinement starts with a reasonable structural model and # well-defined instrument parameters. -# - Even simulated data may include artifacts or unintended -# contributions—mimicking real experimental conditions. # - Visual inspection is a critical part of model validation. Residual peaks # often reveal missing physics or contamination. # %% [markdown] # ## 🎁 Bonus # -# You've now completed the fitting portion of the Summer School workflow, +# You've now completed the analysis part of the Summer School workflow, # demonstrating the practical use of EasyDiffraction for refining simulated # powder diffraction data. # From 570310876dea9a07bb9aefdb5e28779483c9cd09 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 11 Jul 2025 13:22:43 +0200 Subject: [PATCH 08/41] Includes d-spacing branch in documentation build --- .github/workflows/building-deploying-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/building-deploying-docs.yml b/.github/workflows/building-deploying-docs.yml index 778514ca..95231927 100644 --- a/.github/workflows/building-deploying-docs.yml +++ b/.github/workflows/building-deploying-docs.yml @@ -4,7 +4,7 @@ on: # Trigger the workflow on push push: # To the develop and master branches - branches: [develop, master, docs] + branches: [develop, master, docs, d-spacing] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: From dffa1bc6ba4930229dcabee71eda8735ef1f9cc2 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 11 Jul 2025 13:38:22 +0200 Subject: [PATCH 09/41] Relocates easydiffraction installation cell --- ...ool-2025_analysis-powder-diffraction.ipynb | 262 +++++++++--------- ...school-2025_analysis-powder-diffraction.py | 24 +- 2 files changed, 143 insertions(+), 143 deletions(-) diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb index 0f9af094..142ccc8f 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb @@ -1,27 +1,8 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "73f597e7", - "metadata": {}, - "outputs": [], - "source": [ - "# TODO: Remove this cell in the final version of the tutorial.\n", - "# Needed for the Google Colab environment.\n", - "# Install the easydiffraction library if it is not already installed.\n", - "import builtins\n", - "import importlib.util\n", - "\n", - "if hasattr(builtins, \"__IPYTHON__\"):\n", - " if importlib.util.find_spec('easydiffraction') is None:\n", - " print('Installing the easydiffraction library...')\n", - " !pip install git+https://github.com/easyscience/diffraction-lib@d-spacing" - ] - }, { "cell_type": "markdown", - "id": "69dab116", + "id": "ecff44f9", "metadata": {}, "source": [ "# Data Analysis: Powder Diffraction\n", @@ -52,7 +33,26 @@ { "cell_type": "code", "execution_count": null, - "id": "688e5061", + "id": "046034e8", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: Remove this cell in the final version of the tutorial.\n", + "# Needed for the Google Colab environment.\n", + "# Install the easydiffraction library if it is not already installed.\n", + "import builtins\n", + "import importlib.util\n", + "\n", + "if hasattr(builtins, \"__IPYTHON__\"):\n", + " if importlib.util.find_spec('easydiffraction') is None:\n", + " print('Installing the easydiffraction library...')\n", + " !pip install git+https://github.com/easyscience/diffraction-lib@d-spacing" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16a249af", "metadata": {}, "outputs": [], "source": [ @@ -61,7 +61,7 @@ }, { "cell_type": "markdown", - "id": "cb20df0e", + "id": "f882101d", "metadata": {}, "source": [ "## 📘 Introduction: Simple Reference Fit – Si\n", @@ -89,7 +89,7 @@ { "cell_type": "code", "execution_count": null, - "id": "36ef2666", + "id": "bb9816fb", "metadata": {}, "outputs": [], "source": [ @@ -98,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "7dcfc574", + "id": "ccff30a7", "metadata": {}, "source": [ "\n", @@ -111,7 +111,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f4fb8b63", + "id": "905e4942", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +121,7 @@ }, { "cell_type": "markdown", - "id": "0e4c7e4e", + "id": "008c34b1", "metadata": {}, "source": [ "### 🔬 Create an Experiment\n", @@ -141,7 +141,7 @@ { "cell_type": "code", "execution_count": null, - "id": "816bc73b", + "id": "17b4761f", "metadata": {}, "outputs": [], "source": [ @@ -155,7 +155,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f4cc88f4", + "id": "b5096292", "metadata": {}, "outputs": [], "source": [ @@ -168,7 +168,7 @@ }, { "cell_type": "markdown", - "id": "c84dd22d", + "id": "527f08f0", "metadata": {}, "source": [ "#### Inspect Measured Data\n", @@ -191,7 +191,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1f5d7c00", + "id": "f39f5449", "metadata": {}, "outputs": [], "source": [ @@ -201,7 +201,7 @@ { "cell_type": "code", "execution_count": null, - "id": "fd82020c", + "id": "55d7fd55", "metadata": {}, "outputs": [], "source": [ @@ -210,7 +210,7 @@ }, { "cell_type": "markdown", - "id": "dcd77c5f", + "id": "4f0795c3", "metadata": {}, "source": [ "If you zoom in on the highest TOF peak (around 120,000 μs), you will notice\n", @@ -224,7 +224,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4ae0af65", + "id": "4a4e62ac", "metadata": {}, "outputs": [], "source": [ @@ -233,7 +233,7 @@ }, { "cell_type": "markdown", - "id": "e4c55f5a", + "id": "ce47a9b5", "metadata": {}, "source": [ "To visualize the effect of excluding the high TOF region, we can plot\n", @@ -244,7 +244,7 @@ { "cell_type": "code", "execution_count": null, - "id": "44c11bea", + "id": "f74580f3", "metadata": {}, "outputs": [], "source": [ @@ -253,7 +253,7 @@ }, { "cell_type": "markdown", - "id": "49d2ee09", + "id": "9372a4cb", "metadata": {}, "source": [ "#### Set Instrument Parameters\n", @@ -270,7 +270,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e044da2c", + "id": "7fa78e5a", "metadata": {}, "outputs": [], "source": [ @@ -281,7 +281,7 @@ }, { "cell_type": "markdown", - "id": "e0740e17", + "id": "28739203", "metadata": {}, "source": [ "#### Set Peak Profile Parameters\n", @@ -301,7 +301,7 @@ { "cell_type": "code", "execution_count": null, - "id": "422f1a4d", + "id": "35f368ce", "metadata": { "lines_to_next_cell": 2 }, @@ -319,7 +319,7 @@ }, { "cell_type": "markdown", - "id": "8d3469cf", + "id": "4581bc55", "metadata": {}, "source": [ "#### Set Background\n", @@ -349,7 +349,7 @@ { "cell_type": "code", "execution_count": null, - "id": "109b54fb", + "id": "ee2f3343", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ }, { "cell_type": "markdown", - "id": "effc5b79", + "id": "20b96bab", "metadata": {}, "source": [ "### 🧩 Create a Sample Model – Si\n", @@ -407,7 +407,7 @@ { "cell_type": "code", "execution_count": null, - "id": "60660d84", + "id": "c126ff1e", "metadata": {}, "outputs": [], "source": [ @@ -416,7 +416,7 @@ }, { "cell_type": "markdown", - "id": "479a83fb", + "id": "6a4bfe48", "metadata": {}, "source": [ "#### Set Space Group" @@ -425,7 +425,7 @@ { "cell_type": "code", "execution_count": null, - "id": "26b972cc", + "id": "c9aefe50", "metadata": {}, "outputs": [], "source": [ @@ -435,7 +435,7 @@ }, { "cell_type": "markdown", - "id": "94c441f9", + "id": "0ba3e102", "metadata": {}, "source": [ "#### Set Lattice Parameters" @@ -444,7 +444,7 @@ { "cell_type": "code", "execution_count": null, - "id": "07d4896f", + "id": "f65b1421", "metadata": {}, "outputs": [], "source": [ @@ -453,7 +453,7 @@ }, { "cell_type": "markdown", - "id": "94d4636f", + "id": "f1903f3f", "metadata": {}, "source": [ "#### Set Atom Sites" @@ -462,7 +462,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d0fd5744", + "id": "87e7be9d", "metadata": {}, "outputs": [], "source": [ @@ -477,7 +477,7 @@ }, { "cell_type": "markdown", - "id": "58d1ef57", + "id": "2a49fcc6", "metadata": {}, "source": [ "### 🔗 Assign Sample Model to Experiment\n", @@ -490,7 +490,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bbf4a7cd", + "id": "03ba7667", "metadata": {}, "outputs": [], "source": [ @@ -499,7 +499,7 @@ }, { "cell_type": "markdown", - "id": "2b39d19e", + "id": "79e6c8fe", "metadata": {}, "source": [ "### 🚀 Analyze and Fit the Data\n", @@ -528,7 +528,7 @@ { "cell_type": "code", "execution_count": null, - "id": "42b61e69", + "id": "d6082008", "metadata": {}, "outputs": [], "source": [ @@ -539,7 +539,7 @@ }, { "cell_type": "markdown", - "id": "e5508b39", + "id": "87921d9c", "metadata": {}, "source": [ "#### Show Free Parameters\n", @@ -551,7 +551,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ae57abbd", + "id": "0da8e8bb", "metadata": {}, "outputs": [], "source": [ @@ -560,7 +560,7 @@ }, { "cell_type": "markdown", - "id": "7702bf46", + "id": "45c79d12", "metadata": {}, "source": [ "#### Visualize Diffraction Patterns\n", @@ -576,7 +576,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2f629cb8", + "id": "19698029", "metadata": {}, "outputs": [], "source": [ @@ -585,7 +585,7 @@ }, { "cell_type": "markdown", - "id": "1a618e7d", + "id": "f09c3cac", "metadata": {}, "source": [ "#### Run Fitting\n", @@ -597,7 +597,7 @@ { "cell_type": "code", "execution_count": null, - "id": "80c0ed64", + "id": "9ae6a49d", "metadata": {}, "outputs": [], "source": [ @@ -606,7 +606,7 @@ }, { "cell_type": "markdown", - "id": "06e5a46f", + "id": "3dc0a1bf", "metadata": {}, "source": [ "#### Check Fit Results\n", @@ -623,7 +623,7 @@ }, { "cell_type": "markdown", - "id": "536a2996", + "id": "bf3b3969", "metadata": {}, "source": [ "#### Visualize Fit Results\n", @@ -637,7 +637,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dc9bb18d", + "id": "0ee26ab8", "metadata": {}, "outputs": [], "source": [ @@ -646,7 +646,7 @@ }, { "cell_type": "markdown", - "id": "40eceafd", + "id": "4f176764", "metadata": {}, "source": [ "#### TOF vs d-spacing\n", @@ -665,7 +665,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3c01cbb3", + "id": "273abd73", "metadata": {}, "outputs": [], "source": [ @@ -674,7 +674,7 @@ }, { "cell_type": "markdown", - "id": "6553c89a", + "id": "9ee77050", "metadata": {}, "source": [ "As you can see, the calculated diffraction pattern now matches the measured\n", @@ -709,7 +709,7 @@ { "cell_type": "code", "execution_count": null, - "id": "edf1a8f0", + "id": "b0eeee3c", "metadata": {}, "outputs": [], "source": [ @@ -720,7 +720,7 @@ }, { "cell_type": "markdown", - "id": "fc9db4fc", + "id": "c6c1fd55", "metadata": {}, "source": [ "### 🔬 Exercise 2: Define an Experiment\n", @@ -739,7 +739,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e89abd6b", + "id": "2f347d76", "metadata": {}, "outputs": [], "source": [ @@ -753,7 +753,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ab7f0436", + "id": "1e091cf4", "metadata": {}, "outputs": [], "source": [ @@ -766,7 +766,7 @@ }, { "cell_type": "markdown", - "id": "bf9c8516", + "id": "9d6191f5", "metadata": {}, "source": [ "#### Exercise 2.1: Inspect Measured Data\n", @@ -785,7 +785,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b0386f80", + "id": "b75dc067", "metadata": {}, "outputs": [], "source": [ @@ -796,7 +796,7 @@ { "cell_type": "code", "execution_count": null, - "id": "aa7f76d0", + "id": "a0c3ce8d", "metadata": {}, "outputs": [], "source": [ @@ -806,7 +806,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7f393378", + "id": "940ae02e", "metadata": {}, "outputs": [], "source": [ @@ -815,7 +815,7 @@ }, { "cell_type": "markdown", - "id": "78e45bfd", + "id": "e490736c", "metadata": {}, "source": [ "#### Exercise 2.2: Set Instrument Parameters\n", @@ -831,7 +831,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d547d488", + "id": "41f2dfa7", "metadata": {}, "outputs": [], "source": [ @@ -842,7 +842,7 @@ }, { "cell_type": "markdown", - "id": "92e43f5d", + "id": "4af2a143", "metadata": {}, "source": [ "#### Exercise 2.3: Set Peak Profile Parameters\n", @@ -857,7 +857,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5ea35fb6", + "id": "0a7ff6ad", "metadata": {}, "outputs": [], "source": [ @@ -873,7 +873,7 @@ }, { "cell_type": "markdown", - "id": "8aac95f4", + "id": "d0d83f8f", "metadata": {}, "source": [ "#### Exercise 2.4: Set Background\n", @@ -892,7 +892,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cac87735", + "id": "6b4a843d", "metadata": {}, "outputs": [], "source": [ @@ -908,7 +908,7 @@ }, { "cell_type": "markdown", - "id": "6f3f9e4c", + "id": "c862563d", "metadata": {}, "source": [ "### 🧩 Exercise 3: Define a Sample Model – LBCO\n", @@ -920,7 +920,7 @@ }, { "cell_type": "markdown", - "id": "a8703439", + "id": "d3ec92b7", "metadata": {}, "source": [ "```\n", @@ -955,7 +955,7 @@ }, { "cell_type": "markdown", - "id": "d3372a43", + "id": "54061688", "metadata": {}, "source": [ "#### Exercise 3.1: Create Sample Model\n", @@ -971,7 +971,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4f1d9719", + "id": "ea43591f", "metadata": {}, "outputs": [], "source": [ @@ -980,7 +980,7 @@ }, { "cell_type": "markdown", - "id": "997a39da", + "id": "bb4812dc", "metadata": {}, "source": [ "#### Exercise 3.2: Set Space Group\n", @@ -995,7 +995,7 @@ { "cell_type": "code", "execution_count": null, - "id": "cbcffb43", + "id": "7f6952ef", "metadata": {}, "outputs": [], "source": [ @@ -1005,7 +1005,7 @@ }, { "cell_type": "markdown", - "id": "0a67bdb7", + "id": "3ed5fed4", "metadata": {}, "source": [ "#### Exercise 3.3: Set Lattice Parameters\n", @@ -1020,7 +1020,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4d9883fd", + "id": "a64ce129", "metadata": {}, "outputs": [], "source": [ @@ -1029,7 +1029,7 @@ }, { "cell_type": "markdown", - "id": "f8c86dec", + "id": "0ff5cd46", "metadata": {}, "source": [ "#### Exercise 3.4: Set Atom Sites\n", @@ -1046,7 +1046,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8f437bc4", + "id": "4972896d", "metadata": {}, "outputs": [], "source": [ @@ -1084,7 +1084,7 @@ }, { "cell_type": "markdown", - "id": "86176cbc", + "id": "eac42a2d", "metadata": {}, "source": [ "### 🔗 Exercise 4: Assign Sample Model to Experiment\n", @@ -1099,7 +1099,7 @@ { "cell_type": "code", "execution_count": null, - "id": "83dbf0bf", + "id": "f0498d84", "metadata": {}, "outputs": [], "source": [ @@ -1108,7 +1108,7 @@ }, { "cell_type": "markdown", - "id": "9b6fed82", + "id": "3253415a", "metadata": {}, "source": [ "### 🚀 Exercise 5: Analyze and Fit the Data\n", @@ -1127,7 +1127,7 @@ { "cell_type": "code", "execution_count": null, - "id": "90ce5c80", + "id": "00e773c4", "metadata": {}, "outputs": [], "source": [ @@ -1138,7 +1138,7 @@ }, { "cell_type": "markdown", - "id": "120cf52a", + "id": "a8fa0859", "metadata": {}, "source": [ "#### Exercise 5.2: Run Fitting\n", @@ -1157,7 +1157,7 @@ { "cell_type": "code", "execution_count": null, - "id": "28bf3dc6", + "id": "998fbd82", "metadata": {}, "outputs": [], "source": [ @@ -1167,7 +1167,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c801b71a", + "id": "dd417d4e", "metadata": {}, "outputs": [], "source": [ @@ -1176,7 +1176,7 @@ }, { "cell_type": "markdown", - "id": "cca969c7", + "id": "8a9dfa4f", "metadata": {}, "source": [ "#### Exercise 5.3: Find the Misfit in the Fit\n", @@ -1204,7 +1204,7 @@ { "cell_type": "code", "execution_count": null, - "id": "00c1e512", + "id": "f6bcd46a", "metadata": {}, "outputs": [], "source": [ @@ -1213,7 +1213,7 @@ }, { "cell_type": "markdown", - "id": "30980973", + "id": "5d6025fc", "metadata": {}, "source": [ "#### Exercise 5.4: Refine the LBCO Lattice Parameter\n", @@ -1231,7 +1231,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5dc59af7", + "id": "2d5be7dc", "metadata": {}, "outputs": [], "source": [ @@ -1241,7 +1241,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2d14ef4d", + "id": "f8daa1e2", "metadata": {}, "outputs": [], "source": [ @@ -1251,7 +1251,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b0f92293", + "id": "5f2c17ab", "metadata": {}, "outputs": [], "source": [ @@ -1260,7 +1260,7 @@ }, { "cell_type": "markdown", - "id": "85dfb0d5", + "id": "e2f4b2ef", "metadata": {}, "source": [ "#### Exercise 5.5: Visualize the Fit Results in d-spacing\n", @@ -1276,7 +1276,7 @@ { "cell_type": "code", "execution_count": null, - "id": "8b227ebc", + "id": "c0dc9dc6", "metadata": {}, "outputs": [], "source": [ @@ -1285,7 +1285,7 @@ }, { "cell_type": "markdown", - "id": "6399be85", + "id": "a3742d6f", "metadata": {}, "source": [ "#### Exercise 5.6: Find Undefined Features\n", @@ -1304,7 +1304,7 @@ { "cell_type": "code", "execution_count": null, - "id": "71c223a1", + "id": "3b4ba20b", "metadata": {}, "outputs": [], "source": [ @@ -1313,7 +1313,7 @@ }, { "cell_type": "markdown", - "id": "17d5d870", + "id": "efe7c079", "metadata": {}, "source": [ "#### Exercise 5.7: Identify the Cause of the Unexplained Peaks\n", @@ -1334,7 +1334,7 @@ }, { "cell_type": "markdown", - "id": "fcdaac01", + "id": "8b4f14d8", "metadata": {}, "source": [ "#### Exercise 5.8: Identify the impurity phase\n", @@ -1353,7 +1353,7 @@ { "cell_type": "code", "execution_count": null, - "id": "97952b28", + "id": "e4b2d864", "metadata": {}, "outputs": [], "source": [ @@ -1363,7 +1363,7 @@ }, { "cell_type": "markdown", - "id": "b78f6653", + "id": "9c3c2020", "metadata": {}, "source": [ "#### Exercise 5.9: Create a Second Sample Model – Si as Impurity\n", @@ -1381,7 +1381,7 @@ }, { "cell_type": "markdown", - "id": "e6f9b0f9", + "id": "40a37dac", "metadata": {}, "source": [ "**Set Space Group**" @@ -1390,7 +1390,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f696180d", + "id": "848f1cf5", "metadata": {}, "outputs": [], "source": [ @@ -1400,7 +1400,7 @@ { "cell_type": "code", "execution_count": null, - "id": "35eb4ef0", + "id": "eed3741a", "metadata": {}, "outputs": [], "source": [ @@ -1410,7 +1410,7 @@ }, { "cell_type": "markdown", - "id": "10b57d6d", + "id": "42245107", "metadata": {}, "source": [ "**Set Lattice Parameters**" @@ -1419,7 +1419,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e7500019", + "id": "76892dac", "metadata": {}, "outputs": [], "source": [ @@ -1428,7 +1428,7 @@ }, { "cell_type": "markdown", - "id": "e1c5293c", + "id": "9e72f797", "metadata": {}, "source": [ "**Set Atom Sites**" @@ -1437,7 +1437,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b31ee25a", + "id": "26e2e2ff", "metadata": {}, "outputs": [], "source": [ @@ -1452,7 +1452,7 @@ }, { "cell_type": "markdown", - "id": "b26dc406", + "id": "75dbee8e", "metadata": {}, "source": [ "**🔗 Assign Sample Model to Experiment**" @@ -1461,7 +1461,7 @@ { "cell_type": "code", "execution_count": null, - "id": "928d3168", + "id": "62a465a0", "metadata": {}, "outputs": [], "source": [ @@ -1470,7 +1470,7 @@ }, { "cell_type": "markdown", - "id": "3e4dfdde", + "id": "a3c0aa00", "metadata": {}, "source": [ "#### Exercise 5.10: Refine the Scale of the Si Phase\n", @@ -1496,7 +1496,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e7b9162e", + "id": "82b5ed57", "metadata": {}, "outputs": [], "source": [ @@ -1505,7 +1505,7 @@ }, { "cell_type": "markdown", - "id": "499e367e", + "id": "1fe19d3b", "metadata": {}, "source": [ "As you can see, the calculated pattern is now the sum of both phases,\n", @@ -1518,7 +1518,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0f115865", + "id": "316acc03", "metadata": {}, "outputs": [], "source": [ @@ -1527,7 +1527,7 @@ }, { "cell_type": "markdown", - "id": "8ee5648a", + "id": "f61b84ed", "metadata": {}, "source": [ "**Run Fitting**\n", @@ -1538,7 +1538,7 @@ { "cell_type": "code", "execution_count": null, - "id": "017ebcde", + "id": "c63e2b6c", "metadata": {}, "outputs": [], "source": [ @@ -1547,7 +1547,7 @@ }, { "cell_type": "markdown", - "id": "09b5da6c", + "id": "c3434af6", "metadata": {}, "source": [ "**Visualize Fit Results**\n", @@ -1560,7 +1560,7 @@ { "cell_type": "code", "execution_count": null, - "id": "e67cb19f", + "id": "ac57cf1b", "metadata": {}, "outputs": [], "source": [ @@ -1570,7 +1570,7 @@ { "cell_type": "code", "execution_count": null, - "id": "3bca5e00", + "id": "bfed16df", "metadata": {}, "outputs": [], "source": [ @@ -1579,7 +1579,7 @@ }, { "cell_type": "markdown", - "id": "ffe6e765", + "id": "f0f9f094", "metadata": {}, "source": [ "All previously unexplained peaks are now accounted for in the pattern, and the fit is improved.\n", @@ -1590,7 +1590,7 @@ }, { "cell_type": "markdown", - "id": "cfe8c3a3", + "id": "68476909", "metadata": {}, "source": [ "## 📑 Summary\n", @@ -1615,7 +1615,7 @@ }, { "cell_type": "markdown", - "id": "cbc35980", + "id": "2f011035", "metadata": {}, "source": [ "## 🎁 Bonus\n", diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py index 20200aec..0306c4a4 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py @@ -1,15 +1,3 @@ -# %% -# TODO: Remove this cell in the final version of the tutorial. -# Needed for the Google Colab environment. -# Install the easydiffraction library if it is not already installed. -import builtins -import importlib.util - -if hasattr(builtins, "__IPYTHON__"): - if importlib.util.find_spec('easydiffraction') is None: - print('Installing the easydiffraction library...') - # !pip install git+https://github.com/easyscience/diffraction-lib@d-spacing - # %% [markdown] # # Data Analysis: Powder Diffraction # @@ -35,6 +23,18 @@ # classes. However, for the sake of simplicity in this tutorial, we will import # the entire library. +# %% +# TODO: Remove this cell in the final version of the tutorial. +# Needed for the Google Colab environment. +# Install the easydiffraction library if it is not already installed. +import builtins +import importlib.util + +if hasattr(builtins, "__IPYTHON__"): + if importlib.util.find_spec('easydiffraction') is None: + print('Installing the easydiffraction library...') + # !pip install git+https://github.com/easyscience/diffraction-lib@d-spacing + # %% import easydiffraction as ed From b73cefe5a0b8e25d4aa441d65ed2f6646b3f51d7 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 11 Jul 2025 22:24:29 +0200 Subject: [PATCH 10/41] Refines powder diffraction tutorial --- ...ool-2025_analysis-powder-diffraction.ipynb | 451 ++++++++++-------- ...school-2025_analysis-powder-diffraction.py | 215 +++++---- 2 files changed, 381 insertions(+), 285 deletions(-) diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb index 142ccc8f..6dfbe92f 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb @@ -2,22 +2,20 @@ "cells": [ { "cell_type": "markdown", - "id": "ecff44f9", + "id": "60194511", "metadata": {}, "source": [ "# Data Analysis: Powder Diffraction\n", "\n", - "This tutorial guides you through the refinement of simulated diffraction\n", - "patterns for Si (Part 1) and La₀.₅Ba₀.₅CoO₃ (LBCO) (Part 2) using the\n", - "EasyDiffraction Python library.\n", - "\n", - "The goal is to develop familiarity with the Rietveld refinement process\n", - "for crystal structures using powder diffraction data.\n", + "This tutorial guides you through the Rietveld refinement of crystal\n", + "structures using simulated powder diffraction data. It consists of two parts:\n", + "- Introduction: A simple reference fit using silicon (Si) crystal structure.\n", + "- Exercise: A more complex fit using La₀.₅Ba₀.₅CoO₃ (LBCO) crystal structure.\n", "\n", "## 🛠️ Import Library\n", "\n", - "Start by importing the necessary library for the analysis. In this tutorial, we\n", - "use the EasyDiffraction library, which offers tools for\n", + "We start by importing the necessary library for the analysis. In this\n", + "tutorial, we use the EasyDiffraction library, which offers tools for\n", "analyzing and refining powder diffraction data.\n", "\n", "This tutorial is self-contained and designed for hands-on learning.\n", @@ -33,7 +31,7 @@ { "cell_type": "code", "execution_count": null, - "id": "046034e8", + "id": "6a6add32", "metadata": {}, "outputs": [], "source": [ @@ -52,7 +50,7 @@ { "cell_type": "code", "execution_count": null, - "id": "16a249af", + "id": "ec0e8dc6", "metadata": {}, "outputs": [], "source": [ @@ -61,7 +59,7 @@ }, { "cell_type": "markdown", - "id": "f882101d", + "id": "37c36d31", "metadata": {}, "source": [ "## 📘 Introduction: Simple Reference Fit – Si\n", @@ -73,7 +71,7 @@ "diffraction data.\n", "\n", "For this part of the tutorial, we will use the powder diffraction data\n", - "from the [previous tutorial](#), simulated using the Si crystal structure.\n", + "from the previous tutorial, simulated using the Si crystal structure.\n", "\n", "### 📦 Create a Project – 'reference'\n", "\n", @@ -89,7 +87,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bb9816fb", + "id": "4164e1d9", "metadata": {}, "outputs": [], "source": [ @@ -98,20 +96,20 @@ }, { "cell_type": "markdown", - "id": "ccff30a7", + "id": "0d6eb80f", "metadata": {}, "source": [ "\n", "You can set the title and description of the project to provide context\n", "and information about the analysis being performed. This is useful for\n", - "documentation purposes and helps others (or yourself in the future) understand\n", - "the purpose of the project at a glance." + "documentation purposes and helps others (or yourself in the future)\n", + "understand the purpose of the project at a glance." ] }, { "cell_type": "code", "execution_count": null, - "id": "905e4942", + "id": "656b2e32", "metadata": {}, "outputs": [], "source": [ @@ -121,27 +119,25 @@ }, { "cell_type": "markdown", - "id": "008c34b1", + "id": "a326b89c", "metadata": {}, "source": [ "### 🔬 Create an Experiment\n", "\n", "Now we will create an experiment within the project. An experiment\n", "represents a specific diffraction measurement performed on a specific sample\n", - "using a particular instrument. It contains\n", - "details about the measured data, instrument parameters, and other relevant\n", - "information.\n", + "using a particular instrument. It contains details about the measured data,\n", + "instrument parameters, and other relevant information.\n", "\n", "In this case, the experiment is defined as a powder diffraction measurement\n", "using time-of-flight neutrons. The measured data is loaded from a file\n", - "containing the reduced diffraction pattern of Si from the previous\n", - "tutorial." + "containing the reduced diffraction pattern of Si from the previous tutorial." ] }, { "cell_type": "code", "execution_count": null, - "id": "17b4761f", + "id": "cc73c9e8", "metadata": {}, "outputs": [], "source": [ @@ -155,7 +151,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b5096292", + "id": "d7aa9526", "metadata": {}, "outputs": [], "source": [ @@ -168,7 +164,7 @@ }, { "cell_type": "markdown", - "id": "527f08f0", + "id": "c6939180", "metadata": {}, "source": [ "#### Inspect Measured Data\n", @@ -191,7 +187,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f39f5449", + "id": "ad96437f", "metadata": {}, "outputs": [], "source": [ @@ -201,7 +197,7 @@ { "cell_type": "code", "execution_count": null, - "id": "55d7fd55", + "id": "bb89e799", "metadata": {}, "outputs": [], "source": [ @@ -210,21 +206,21 @@ }, { "cell_type": "markdown", - "id": "4f0795c3", + "id": "1b130688", "metadata": {}, "source": [ "If you zoom in on the highest TOF peak (around 120,000 μs), you will notice\n", "that it has a broad and unusual shape. This is a result of the simplified\n", "data reduction process. Obtaining a more accurate diffraction pattern would\n", "require a more advanced data reduction, which is beyond the scope of this\n", - "tutorial. Therefore, we will simply exclude the high TOF region from the analysis by\n", - "adding an excluded region to the experiment." + "tutorial. Therefore, we will simply exclude the high TOF region from the\n", + "analysis by adding an excluded region to the experiment." ] }, { "cell_type": "code", "execution_count": null, - "id": "4a4e62ac", + "id": "61862088", "metadata": {}, "outputs": [], "source": [ @@ -233,7 +229,7 @@ }, { "cell_type": "markdown", - "id": "ce47a9b5", + "id": "6ff6d8f6", "metadata": {}, "source": [ "To visualize the effect of excluding the high TOF region, we can plot\n", @@ -244,7 +240,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f74580f3", + "id": "7bcfd1d2", "metadata": {}, "outputs": [], "source": [ @@ -253,7 +249,7 @@ }, { "cell_type": "markdown", - "id": "9372a4cb", + "id": "779a4569", "metadata": {}, "source": [ "#### Set Instrument Parameters\n", @@ -270,7 +266,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7fa78e5a", + "id": "1dda5bf0", "metadata": {}, "outputs": [], "source": [ @@ -281,27 +277,29 @@ }, { "cell_type": "markdown", - "id": "28739203", + "id": "8669fd57", "metadata": {}, "source": [ "#### Set Peak Profile Parameters\n", "\n", "The next set of parameters is needed to define the peak profile used in the\n", - "fitting process. The peak profile describes shape of the diffraction peaks.\n", - "They include parameters for the broadening and asymmetry of the peaks. Here,\n", - "we use a pseudo-Voigt peak profile function with Ikeda-Carpenter asymmetry, which is a common\n", - "choice for neutron powder diffraction data. The values are typically determined\n", - "experimentally on the same instrument and under the same configuration as the\n", - "data being analyzed based on measurements of a standard\n", - "sample. In some cases, these parameters are refined during the fitting\n", - "process to improve the fit between the measured and calculated diffraction, but\n", - "in this case, we will use the values from another simulation." + "fitting process. The peak profile describes the shape of the diffraction peaks.\n", + "They include parameters for the broadening and asymmetry of the peaks.\n", + "\n", + "Here, we use a pseudo-Voigt peak profile function with Ikeda-Carpenter\n", + "asymmetry, which is a common choice for neutron powder diffraction data.\n", + "\n", + "The values are typically determined experimentally on the same instrument and\n", + "under the same configuration as the data being analyzed based on measurements\n", + "of a standard sample. In some cases, these parameters are refined during the\n", + "fitting process to improve the fit between the measured and calculated\n", + "diffraction, but in this case, we will use the values from another simulation." ] }, { "cell_type": "code", "execution_count": null, - "id": "35f368ce", + "id": "8dbc7188", "metadata": { "lines_to_next_cell": 2 }, @@ -319,27 +317,31 @@ }, { "cell_type": "markdown", - "id": "4581bc55", + "id": "078f95cc", "metadata": {}, "source": [ "#### Set Background\n", "\n", - "The background of the diffraction pattern represents the portion of the pattern that\n", - "is not related to the crystal structure of the sample, but rather to\n", - "incoherent scattering from the sample itself, the sample holder, the sample\n", - "environment, and the instrument. The background can be modeled in various\n", - "ways. In this case, we will use a simple line segment background, which is a\n", - "common approach for powder diffraction data. The background intensity at any\n", - "point is defined by linear interpolation between neighboring points.\n", - "The background points are selected\n", + "The background of the diffraction pattern represents the portion of the\n", + "pattern that is not related to the crystal structure of the sample. It's\n", + "rather representing the noise and other sources of scattering that can affect\n", + "the measured intensities. This includes contributions from the instrument,\n", + "the sample holder, the sample environment, and other sources of incoherent\n", + "scattering.\n", + "\n", + "The background can be modeled in various ways. In this example, we will use\n", + "a simple line segment background, which is a common approach for powder\n", + "diffraction data. The background intensity at any point is defined by linear\n", + "interpolation between neighboring points. The background points are selected\n", "to span the range of the diffraction pattern while avoiding the peaks.\n", "\n", - "In this case, we will add several background points at specific TOF values\n", - "(in microseconds) and corresponding intensity values. These points are\n", - "chosen to represent the background level in the diffraction pattern free from\n", - "any peaks. The background points are added using the `add` method of the\n", - "`background` attribute of the experiment. The `x` parameter represents the TOF\n", - "value, and the `y` parameter represents the intensity value at that TOF.\n", + "We will add several background points at specific TOF values (in μs) and\n", + "corresponding intensity values. These points are chosen to represent the\n", + "background level in the diffraction pattern free from any peaks.\n", + "\n", + "The background points are added using the `add` method of the `background`\n", + "object. The `x` parameter represents the TOF value, and the `y` parameter\n", + "represents the intensity value at that TOF.\n", "\n", "Let's set all the background points at a constant value of 0.01, which can be\n", "roughly determined by the eye, and we will refine them later during the fitting\n", @@ -349,7 +351,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ee2f3343", + "id": "a3b802aa", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +367,7 @@ }, { "cell_type": "markdown", - "id": "20b96bab", + "id": "77fae341", "metadata": {}, "source": [ "### 🧩 Create a Sample Model – Si\n", @@ -382,9 +384,11 @@ "\n", "EasyDiffraction refines the crystal structure of the sample,\n", "but does not solve it. Therefore, we need a good starting point with\n", - "reasonable structural parameters. Here, we define the Si structure as a\n", - "cubic structure with the space group F d -3 m. As this is a simple cubic\n", - "structure, we only need to define the single lattice parameter, which\n", + "reasonable structural parameters.\n", + "\n", + "Here, we define the Si structure as a\n", + "cubic structure. As this is a cubic structure, we only need to define\n", + "the single lattice parameter, which\n", "is the length of the unit cell edge. The Si crystal structure has a\n", "single atom in the unit cell, which is located at the origin (0, 0, 0) of\n", "the unit cell. The symmetry of this site is defined by the Wyckoff letter 'a'.\n", @@ -396,6 +400,50 @@ "the Crystallography Open Database (COD). In this case, we use the COD\n", "entry for silicon as a reference for the initial crystal structure model:\n", "https://www.crystallography.net/cod/4507226.html\n", + "\n", + "Usually, the crystal structure parameters are provided in a CIF file\n", + "format, which is a standard format for crystallographic data. An example\n", + "of a CIF file for silicon is shown below. The CIF file contains the\n", + "space group information, unit cell parameters, and atomic positions." + ] + }, + { + "cell_type": "markdown", + "id": "b897365b", + "metadata": {}, + "source": [ + "```\n", + "data_si\n", + "\n", + "_space_group.name_H-M_alt \"F d -3 m\"\n", + "_space_group.IT_coordinate_system_code 2\n", + "\n", + "_cell.length_a 5.43\n", + "_cell.length_b 5.43\n", + "_cell.length_c 5.43\n", + "_cell.angle_alpha 90.0\n", + "_cell.angle_beta 90.0\n", + "_cell.angle_gamma 90.0\n", + "\n", + "loop_\n", + "_atom_site.label\n", + "_atom_site.type_symbol\n", + "_atom_site.fract_x\n", + "_atom_site.fract_y\n", + "_atom_site.fract_z\n", + "_atom_site.wyckoff_letter\n", + "_atom_site.occupancy\n", + "_atom_site.ADP_type\n", + "_atom_site.B_iso_or_equiv\n", + "Si Si 0 0 0 a 1.0 Biso 0.95\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "6c36ee5a", + "metadata": {}, + "source": [ "\n", "As with adding the experiment in the\n", "previous step, we will create a default sample model\n", @@ -407,7 +455,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c126ff1e", + "id": "e46d255a", "metadata": {}, "outputs": [], "source": [ @@ -416,7 +464,7 @@ }, { "cell_type": "markdown", - "id": "6a4bfe48", + "id": "4c3ac1e6", "metadata": {}, "source": [ "#### Set Space Group" @@ -425,7 +473,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c9aefe50", + "id": "ba69a031", "metadata": {}, "outputs": [], "source": [ @@ -435,7 +483,7 @@ }, { "cell_type": "markdown", - "id": "0ba3e102", + "id": "f6afea8d", "metadata": {}, "source": [ "#### Set Lattice Parameters" @@ -444,7 +492,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f65b1421", + "id": "0fc252e3", "metadata": {}, "outputs": [], "source": [ @@ -453,7 +501,7 @@ }, { "cell_type": "markdown", - "id": "f1903f3f", + "id": "54fc9101", "metadata": {}, "source": [ "#### Set Atom Sites" @@ -462,7 +510,7 @@ { "cell_type": "code", "execution_count": null, - "id": "87e7be9d", + "id": "325d5f49", "metadata": {}, "outputs": [], "source": [ @@ -477,7 +525,7 @@ }, { "cell_type": "markdown", - "id": "2a49fcc6", + "id": "33349f94", "metadata": {}, "source": [ "### 🔗 Assign Sample Model to Experiment\n", @@ -490,7 +538,7 @@ { "cell_type": "code", "execution_count": null, - "id": "03ba7667", + "id": "e47d6115", "metadata": {}, "outputs": [], "source": [ @@ -499,13 +547,13 @@ }, { "cell_type": "markdown", - "id": "79e6c8fe", + "id": "ad28c299", "metadata": {}, "source": [ "### 🚀 Analyze and Fit the Data\n", "\n", "After setting up the experiment and sample model, we can now analyze the\n", - "measured diffraction pattern and perform the fitting process.\n", + "measured diffraction pattern and perform the fit.\n", "\n", "The fitting process involves comparing the measured diffraction pattern with\n", "the calculated diffraction pattern based on the sample model and instrument\n", @@ -528,7 +576,7 @@ { "cell_type": "code", "execution_count": null, - "id": "d6082008", + "id": "e0b4b651", "metadata": {}, "outputs": [], "source": [ @@ -539,7 +587,7 @@ }, { "cell_type": "markdown", - "id": "87921d9c", + "id": "04ac3b70", "metadata": {}, "source": [ "#### Show Free Parameters\n", @@ -551,7 +599,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0da8e8bb", + "id": "11d464c3", "metadata": {}, "outputs": [], "source": [ @@ -560,14 +608,14 @@ }, { "cell_type": "markdown", - "id": "45c79d12", + "id": "637fb4b6", "metadata": {}, "source": [ "#### Visualize Diffraction Patterns\n", "\n", "Before performing the fit, we can visually compare the measured\n", "diffraction pattern with the calculated diffraction pattern based on the\n", - "initial parameters of the sample model and the instrument settings.\n", + "initial parameters of the sample model and the instrument.\n", "This provides an indication of how well the initial parameters\n", "match the measured data. The `plot_meas_vs_calc` method of the project\n", "allows this comparison." @@ -576,7 +624,7 @@ { "cell_type": "code", "execution_count": null, - "id": "19698029", + "id": "37089fac", "metadata": {}, "outputs": [], "source": [ @@ -585,7 +633,7 @@ }, { "cell_type": "markdown", - "id": "f09c3cac", + "id": "4c669678", "metadata": {}, "source": [ "#### Run Fitting\n", @@ -597,7 +645,7 @@ { "cell_type": "code", "execution_count": null, - "id": "9ae6a49d", + "id": "26fea591", "metadata": {}, "outputs": [], "source": [ @@ -606,24 +654,25 @@ }, { "cell_type": "markdown", - "id": "3dc0a1bf", + "id": "0128aea9", "metadata": {}, "source": [ "#### Check Fit Results\n", - "You will\n", - "see that the fit is now much improved and that the intensities of the\n", + "You can\n", + "see that the agreement between the measured and calculated diffraction patterns\n", + "is now much improved and that the intensities of the\n", "calculated peaks align much better with the measured peaks. To check the\n", "quality of the fit numerically, we can look at the goodness-of-fit\n", - "chi-squared value and the R-factors. The chi-squared value is a measure of how well\n", + "χ² value and the reliability R-factors. The χ² value is a measure of how well\n", "the calculated diffraction pattern matches the measured pattern, and it is\n", "calculated as the sum of the squared differences between the measured and\n", "calculated intensities, divided by the number of data points. Ideally, the\n", - "chi-squared value should be close to 1, indicating a good fit." + "χ² value should be close to 1, indicating a good fit." ] }, { "cell_type": "markdown", - "id": "bf3b3969", + "id": "b6b10e3a", "metadata": {}, "source": [ "#### Visualize Fit Results\n", @@ -637,7 +686,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0ee26ab8", + "id": "dbd9d48f", "metadata": {}, "outputs": [], "source": [ @@ -646,7 +695,7 @@ }, { "cell_type": "markdown", - "id": "4f176764", + "id": "3728cc3d", "metadata": {}, "source": [ "#### TOF vs d-spacing\n", @@ -665,7 +714,7 @@ { "cell_type": "code", "execution_count": null, - "id": "273abd73", + "id": "ba29f44a", "metadata": {}, "outputs": [], "source": [ @@ -674,7 +723,7 @@ }, { "cell_type": "markdown", - "id": "9ee77050", + "id": "372cfac2", "metadata": {}, "source": [ "As you can see, the calculated diffraction pattern now matches the measured\n", @@ -690,7 +739,7 @@ "\n", "Now that you have a basic understanding of the fitting process, we will\n", "undertake a more complex fit of the La₀.₅Ba₀.₅CoO₃ (LBCO) crystal structure\n", - "using simulated powder diffraction data from the [previous tutorial](#).\n", + "using simulated powder diffraction data from the previous tutorial.\n", "\n", "You can use the same approach as in the previous part of the tutorial, but\n", "this time we will refine a more complex crystal structure LBCO with multiple atoms\n", @@ -709,7 +758,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b0eeee3c", + "id": "c9ac219f", "metadata": {}, "outputs": [], "source": [ @@ -720,7 +769,7 @@ }, { "cell_type": "markdown", - "id": "c6c1fd55", + "id": "9db79f04", "metadata": {}, "source": [ "### 🔬 Exercise 2: Define an Experiment\n", @@ -739,7 +788,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2f347d76", + "id": "285702d3", "metadata": {}, "outputs": [], "source": [ @@ -753,27 +802,27 @@ { "cell_type": "code", "execution_count": null, - "id": "1e091cf4", + "id": "18359b79", "metadata": {}, "outputs": [], "source": [ "project_2.experiments.add(name='sim_lbco',\n", - " sample_form='powder',\n", - " beam_mode='time-of-flight',\n", - " radiation_probe='neutron',\n", - " data_path='data/powder_reduced_lbco_0_05si_2large_bank.xye')" + " sample_form='powder',\n", + " beam_mode='time-of-flight',\n", + " radiation_probe='neutron',\n", + " data_path='data/powder_reduced_lbco_0_05si_2large_bank.xye')" ] }, { "cell_type": "markdown", - "id": "9d6191f5", + "id": "a6d13779", "metadata": {}, "source": [ "#### Exercise 2.1: Inspect Measured Data\n", "\n", "Check the measured data of the LBCO experiment. Are there any\n", - "peaks with the shape similar to the Si peaks? If so, exclude them from the\n", - "analysis.\n", + "peaks with the shape similar to those excluded in the Si fit?\n", + "If so, exclude them from this analysis as well.\n", "\n", "**Hint:** You can use the `plot_meas` method of the project to visualize the\n", "measured diffraction pattern. You can also use the `excluded_regions` attribute\n", @@ -785,7 +834,7 @@ { "cell_type": "code", "execution_count": null, - "id": "b75dc067", + "id": "d5798e4b", "metadata": {}, "outputs": [], "source": [ @@ -796,7 +845,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a0c3ce8d", + "id": "2a2dcb68", "metadata": {}, "outputs": [], "source": [ @@ -806,7 +855,7 @@ { "cell_type": "code", "execution_count": null, - "id": "940ae02e", + "id": "95ba2cb8", "metadata": {}, "outputs": [], "source": [ @@ -815,7 +864,7 @@ }, { "cell_type": "markdown", - "id": "e490736c", + "id": "c4078a0d", "metadata": {}, "source": [ "#### Exercise 2.2: Set Instrument Parameters\n", @@ -831,7 +880,7 @@ { "cell_type": "code", "execution_count": null, - "id": "41f2dfa7", + "id": "af03ff64", "metadata": {}, "outputs": [], "source": [ @@ -842,7 +891,7 @@ }, { "cell_type": "markdown", - "id": "4af2a143", + "id": "17de2311", "metadata": {}, "source": [ "#### Exercise 2.3: Set Peak Profile Parameters\n", @@ -857,7 +906,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0a7ff6ad", + "id": "6c5c978d", "metadata": {}, "outputs": [], "source": [ @@ -873,7 +922,7 @@ }, { "cell_type": "markdown", - "id": "d0d83f8f", + "id": "a8384726", "metadata": {}, "source": [ "#### Exercise 2.4: Set Background\n", @@ -892,7 +941,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6b4a843d", + "id": "72899511", "metadata": {}, "outputs": [], "source": [ @@ -908,7 +957,7 @@ }, { "cell_type": "markdown", - "id": "c862563d", + "id": "bc3338fd", "metadata": {}, "source": [ "### 🧩 Exercise 3: Define a Sample Model – LBCO\n", @@ -920,7 +969,7 @@ }, { "cell_type": "markdown", - "id": "d3ec92b7", + "id": "f9a2183d", "metadata": {}, "source": [ "```\n", @@ -955,7 +1004,7 @@ }, { "cell_type": "markdown", - "id": "54061688", + "id": "cea5b06e", "metadata": {}, "source": [ "#### Exercise 3.1: Create Sample Model\n", @@ -971,7 +1020,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ea43591f", + "id": "d14df9ce", "metadata": {}, "outputs": [], "source": [ @@ -980,7 +1029,7 @@ }, { "cell_type": "markdown", - "id": "bb4812dc", + "id": "76ca4888", "metadata": {}, "source": [ "#### Exercise 3.2: Set Space Group\n", @@ -995,7 +1044,7 @@ { "cell_type": "code", "execution_count": null, - "id": "7f6952ef", + "id": "76e256b3", "metadata": {}, "outputs": [], "source": [ @@ -1005,7 +1054,7 @@ }, { "cell_type": "markdown", - "id": "3ed5fed4", + "id": "140fb92a", "metadata": {}, "source": [ "#### Exercise 3.3: Set Lattice Parameters\n", @@ -1020,7 +1069,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a64ce129", + "id": "b2fee473", "metadata": {}, "outputs": [], "source": [ @@ -1029,7 +1078,7 @@ }, { "cell_type": "markdown", - "id": "0ff5cd46", + "id": "16094c3b", "metadata": {}, "source": [ "#### Exercise 3.4: Set Atom Sites\n", @@ -1046,7 +1095,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4972896d", + "id": "f4c6a3fd", "metadata": {}, "outputs": [], "source": [ @@ -1084,12 +1133,12 @@ }, { "cell_type": "markdown", - "id": "eac42a2d", + "id": "3ef67cad", "metadata": {}, "source": [ "### 🔗 Exercise 4: Assign Sample Model to Experiment\n", "\n", - "Now assign the LBCO sample model to the LBCO experiment created above.\n", + "Now assign the LBCO sample model to the experiment created above.\n", "\n", "**Hint:** Use the `linked_phases` attribute of the experiment to link the sample model.\n", "\n", @@ -1099,7 +1148,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f0498d84", + "id": "79a3d3f3", "metadata": {}, "outputs": [], "source": [ @@ -1108,7 +1157,7 @@ }, { "cell_type": "markdown", - "id": "3253415a", + "id": "60e8f0fc", "metadata": {}, "source": [ "### 🚀 Exercise 5: Analyze and Fit the Data\n", @@ -1127,7 +1176,7 @@ { "cell_type": "code", "execution_count": null, - "id": "00e773c4", + "id": "72ba7c10", "metadata": {}, "outputs": [], "source": [ @@ -1138,7 +1187,7 @@ }, { "cell_type": "markdown", - "id": "a8fa0859", + "id": "76151a8e", "metadata": {}, "source": [ "#### Exercise 5.2: Run Fitting\n", @@ -1157,7 +1206,7 @@ { "cell_type": "code", "execution_count": null, - "id": "998fbd82", + "id": "17d6fab3", "metadata": {}, "outputs": [], "source": [ @@ -1167,7 +1216,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dd417d4e", + "id": "cab87e11", "metadata": {}, "outputs": [], "source": [ @@ -1176,7 +1225,7 @@ }, { "cell_type": "markdown", - "id": "8a9dfa4f", + "id": "3e8311ca", "metadata": {}, "source": [ "#### Exercise 5.3: Find the Misfit in the Fit\n", @@ -1188,23 +1237,22 @@ "What could be the reason for the misfit?\n", "\n", "**Hint**: Consider the following options:\n", - "- The conversion parameters from TOF to d-spacing are not correct.\n", - "- The lattice parameters of the LBCO phase are not correct.\n", - "- The peak profile parameters are not correct.\n", - "- The background points are not correct.\n", + "1. The conversion parameters from TOF to d-spacing are not correct.\n", + "2. The lattice parameters of the LBCO phase are not correct.\n", + "3. The peak profile parameters are not correct.\n", + "4. The background points are not correct.\n", "\n", "**Solution**:\n", - "- ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction process and this was verified in\n", - "the Si fit.\n", - "- ✅ The lattice parameters of the LBCO phase were set based on the CIF data, which is a good starting point.\n", - "- ❌ The peak profile parameters do not change the position of the peaks, but rather their shape.\n", - "- ❌ The background points affect the background level, but not the peak positions." + "1. ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction process and this was verified in the Si fit.\n", + "2. ✅ The lattice parameters of the LBCO phase were set based on the CIF data, which is a good starting point, but they are not necessarily as accurate as needed for the fit. The lattice parameters may need to be refined.\n", + "3. ❌ The peak profile parameters do not change the position of the peaks, but rather their shape.\n", + "4. ❌ The background points affect the background level, but not the peak positions." ] }, { "cell_type": "code", "execution_count": null, - "id": "f6bcd46a", + "id": "ee498b05", "metadata": {}, "outputs": [], "source": [ @@ -1213,7 +1261,7 @@ }, { "cell_type": "markdown", - "id": "5d6025fc", + "id": "953a893f", "metadata": {}, "source": [ "#### Exercise 5.4: Refine the LBCO Lattice Parameter\n", @@ -1231,7 +1279,7 @@ { "cell_type": "code", "execution_count": null, - "id": "2d5be7dc", + "id": "ae225dae", "metadata": {}, "outputs": [], "source": [ @@ -1241,7 +1289,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f8daa1e2", + "id": "63f62a6a", "metadata": {}, "outputs": [], "source": [ @@ -1251,7 +1299,7 @@ { "cell_type": "code", "execution_count": null, - "id": "5f2c17ab", + "id": "3a68fe49", "metadata": {}, "outputs": [], "source": [ @@ -1260,7 +1308,7 @@ }, { "cell_type": "markdown", - "id": "e2f4b2ef", + "id": "29bbcdf6", "metadata": {}, "source": [ "#### Exercise 5.5: Visualize the Fit Results in d-spacing\n", @@ -1276,7 +1324,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c0dc9dc6", + "id": "2cf8b9fa", "metadata": {}, "outputs": [], "source": [ @@ -1285,7 +1333,7 @@ }, { "cell_type": "markdown", - "id": "a3742d6f", + "id": "9947fdf6", "metadata": {}, "source": [ "#### Exercise 5.6: Find Undefined Features\n", @@ -1298,13 +1346,13 @@ "For example, if you zoom in on the region around 1.6 Å (or 95,000 μs), you will\n", "notice that the rightmost peak is not explained by the LBCO phase at all.\n", "\n", - "Solution:" + "**Solution**:" ] }, { "cell_type": "code", "execution_count": null, - "id": "3b4ba20b", + "id": "d52d3593", "metadata": {}, "outputs": [], "source": [ @@ -1313,28 +1361,30 @@ }, { "cell_type": "markdown", - "id": "efe7c079", + "id": "1a6bd5ab", "metadata": {}, "source": [ "#### Exercise 5.7: Identify the Cause of the Unexplained Peaks\n", "\n", "**Hint**: Consider the following options:\n", - "- The LBCO phase is not correctly modeled.\n", - "- The LBCO phase is not the only phase present in the sample.\n", - "- The data reduction process introduced artifacts.\n", + "1. The LBCO phase is not correctly modeled.\n", + "2. The LBCO phase is not the only phase present in the sample.\n", + "3. The data reduction process introduced artifacts.\n", "\n", "**Solution**:\n", - "- ❌ In principle, this could be the case, but in this case, the LBCO phase is correctly modeled.\n", - "- ✅ The LBCO phase is not the only phase present in the sample. The unexplained peaks\n", - "are likely due to the presence of an impurity phase in the sample, which is not\n", - "included in the current model.\n", - "- ❌ The data reduction process is not likely to introduce such specific peaks, as it is\n", + "1. ❌ In principle, this could be the case, as sometimes the presence of\n", + "extra peaks in the diffraction pattern can indicate a lower symmetry\n", + "than the one used in the model, or that the model is not complete. However,\n", + "in this case, the LBCO phase is correctly modeled based on the CIF data.\n", + "2. ✅ The unexplained peaks are due to the presence of an impurity phase\n", + "in the sample, which is not included in the current model.\n", + "3. ❌ The data reduction process is not likely to introduce such specific peaks, as it is\n", "tested and verified in the previous part of the tutorial." ] }, { "cell_type": "markdown", - "id": "8b4f14d8", + "id": "46addc5f", "metadata": {}, "source": [ "#### Exercise 5.8: Identify the impurity phase\n", @@ -1346,14 +1396,17 @@ "tutorial.\n", "\n", "**Solution**:\n", - "The unexplained peaks are likely due to the presence of silicon (Si) in the sample.\n", + "The unexplained peaks are likely due to the presence of small amount of\n", + "Si in the LBCO sample. In real experiments, it might happen, e.g., because the\n", + "sample holder was not cleaned properly after the Si experiment.\n", + "\n", "You can visalize both the patterns of the Si and LBCO phases to confirm this hypothesis." ] }, { "cell_type": "code", "execution_count": null, - "id": "e4b2d864", + "id": "e9639a9b", "metadata": {}, "outputs": [], "source": [ @@ -1363,7 +1416,7 @@ }, { "cell_type": "markdown", - "id": "9c3c2020", + "id": "9729a3e3", "metadata": {}, "source": [ "#### Exercise 5.9: Create a Second Sample Model – Si as Impurity\n", @@ -1381,7 +1434,7 @@ }, { "cell_type": "markdown", - "id": "40a37dac", + "id": "32078229", "metadata": {}, "source": [ "**Set Space Group**" @@ -1390,7 +1443,7 @@ { "cell_type": "code", "execution_count": null, - "id": "848f1cf5", + "id": "12e2f067", "metadata": {}, "outputs": [], "source": [ @@ -1400,7 +1453,7 @@ { "cell_type": "code", "execution_count": null, - "id": "eed3741a", + "id": "9d5dfa50", "metadata": {}, "outputs": [], "source": [ @@ -1410,7 +1463,7 @@ }, { "cell_type": "markdown", - "id": "42245107", + "id": "64e97830", "metadata": {}, "source": [ "**Set Lattice Parameters**" @@ -1419,7 +1472,7 @@ { "cell_type": "code", "execution_count": null, - "id": "76892dac", + "id": "2e147ff4", "metadata": {}, "outputs": [], "source": [ @@ -1428,7 +1481,7 @@ }, { "cell_type": "markdown", - "id": "9e72f797", + "id": "4054a7d1", "metadata": {}, "source": [ "**Set Atom Sites**" @@ -1437,7 +1490,7 @@ { "cell_type": "code", "execution_count": null, - "id": "26e2e2ff", + "id": "e6654513", "metadata": {}, "outputs": [], "source": [ @@ -1452,7 +1505,7 @@ }, { "cell_type": "markdown", - "id": "75dbee8e", + "id": "1bab0afa", "metadata": {}, "source": [ "**🔗 Assign Sample Model to Experiment**" @@ -1461,7 +1514,7 @@ { "cell_type": "code", "execution_count": null, - "id": "62a465a0", + "id": "96d4c73f", "metadata": {}, "outputs": [], "source": [ @@ -1470,7 +1523,7 @@ }, { "cell_type": "markdown", - "id": "a3c0aa00", + "id": "4aa8f8f7", "metadata": {}, "source": [ "#### Exercise 5.10: Refine the Scale of the Si Phase\n", @@ -1496,7 +1549,7 @@ { "cell_type": "code", "execution_count": null, - "id": "82b5ed57", + "id": "8e6bc18e", "metadata": {}, "outputs": [], "source": [ @@ -1505,7 +1558,7 @@ }, { "cell_type": "markdown", - "id": "1fe19d3b", + "id": "2a01d9fd", "metadata": {}, "source": [ "As you can see, the calculated pattern is now the sum of both phases,\n", @@ -1518,7 +1571,7 @@ { "cell_type": "code", "execution_count": null, - "id": "316acc03", + "id": "0a683b74", "metadata": {}, "outputs": [], "source": [ @@ -1527,7 +1580,7 @@ }, { "cell_type": "markdown", - "id": "f61b84ed", + "id": "c7596964", "metadata": {}, "source": [ "**Run Fitting**\n", @@ -1538,7 +1591,7 @@ { "cell_type": "code", "execution_count": null, - "id": "c63e2b6c", + "id": "a7216729", "metadata": {}, "outputs": [], "source": [ @@ -1547,20 +1600,20 @@ }, { "cell_type": "markdown", - "id": "c3434af6", + "id": "b62290c6", "metadata": {}, "source": [ "**Visualize Fit Results**\n", "\n", "Let's plot the measured diffraction pattern and the calculated diffraction\n", "pattern both for the full range and for a zoomed-in region around the previously unexplained\n", - "peak near 90,000 μs. The calculated pattern will be the sum of the two phases." + "peak near 95,000 μs. The calculated pattern will be the sum of the two phases." ] }, { "cell_type": "code", "execution_count": null, - "id": "ac57cf1b", + "id": "38004527", "metadata": {}, "outputs": [], "source": [ @@ -1570,16 +1623,16 @@ { "cell_type": "code", "execution_count": null, - "id": "bfed16df", + "id": "6fc93114", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=85000, x_max=105000)" + "project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=88000, x_max=101000)" ] }, { "cell_type": "markdown", - "id": "f0f9f094", + "id": "d9315e63", "metadata": {}, "source": [ "All previously unexplained peaks are now accounted for in the pattern, and the fit is improved.\n", @@ -1590,7 +1643,7 @@ }, { "cell_type": "markdown", - "id": "68476909", + "id": "5df41737", "metadata": {}, "source": [ "## 📑 Summary\n", @@ -1599,12 +1652,12 @@ "- **Si** as a simple reference system, and\n", "- **LBCO** as a more complex, realistic case with an initially unknown impurity.\n", "\n", - "Along the way, you learned how to:\n", - "- Define a project, experiment, and sample model in EasyDiffraction\n", - "- Set up instrument and peak profile parameters\n", - "- Visualize measured and calculated patterns\n", - "- Identify and interpret misfits in the diffraction data\n", - "- Add and refine multiple phases to improve the model\n", + "Along the way, you learned how to work with the EasyDiffraction library to:\n", + "- Define a project, experiment, and sample model.\n", + "- Set up instrument and peak profile parameters.\n", + "- Visualize measured and calculated patterns.\n", + "- Identify and interpret misfits in the diffraction data.\n", + "- Add and refine multiple phases to improve the model.\n", "\n", "Key Takeaways:\n", "- A good refinement starts with a reasonable structural model and\n", @@ -1615,12 +1668,12 @@ }, { "cell_type": "markdown", - "id": "2f011035", + "id": "51f12db7", "metadata": {}, "source": [ "## 🎁 Bonus\n", "\n", - "You've now completed the analysis part of the Summer School workflow,\n", + "You've now completed the analysis part of the DMSC Summer School workflow,\n", "demonstrating the practical use of EasyDiffraction for refining simulated\n", "powder diffraction data.\n", "\n", diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py index 0306c4a4..f910d7aa 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py @@ -1,17 +1,15 @@ # %% [markdown] # # Data Analysis: Powder Diffraction # -# This tutorial guides you through the refinement of simulated diffraction -# patterns for Si (Part 1) and La₀.₅Ba₀.₅CoO₃ (LBCO) (Part 2) using the -# EasyDiffraction Python library. -# -# The goal is to develop familiarity with the Rietveld refinement process -# for crystal structures using powder diffraction data. +# This tutorial guides you through the Rietveld refinement of crystal +# structures using simulated powder diffraction data. It consists of two parts: +# - Introduction: A simple reference fit using silicon (Si) crystal structure. +# - Exercise: A more complex fit using La₀.₅Ba₀.₅CoO₃ (LBCO) crystal structure. # # ## 🛠️ Import Library # -# Start by importing the necessary library for the analysis. In this tutorial, we -# use the EasyDiffraction library, which offers tools for +# We start by importing the necessary library for the analysis. In this +# tutorial, we use the EasyDiffraction library, which offers tools for # analyzing and refining powder diffraction data. # # This tutorial is self-contained and designed for hands-on learning. @@ -48,7 +46,7 @@ # diffraction data. # # For this part of the tutorial, we will use the powder diffraction data -# from the [previous tutorial](#), simulated using the Si crystal structure. +# from the previous tutorial, simulated using the Si crystal structure. # # ### 📦 Create a Project – 'reference' # @@ -67,8 +65,8 @@ # You can set the title and description of the project to provide context # and information about the analysis being performed. This is useful for -# documentation purposes and helps others (or yourself in the future) understand -# the purpose of the project at a glance. +# documentation purposes and helps others (or yourself in the future) +# understand the purpose of the project at a glance. # %% project_1.info.title = 'Reference Silicon Fit' @@ -79,14 +77,12 @@ # # Now we will create an experiment within the project. An experiment # represents a specific diffraction measurement performed on a specific sample -# using a particular instrument. It contains -# details about the measured data, instrument parameters, and other relevant -# information. +# using a particular instrument. It contains details about the measured data, +# instrument parameters, and other relevant information. # # In this case, the experiment is defined as a powder diffraction measurement # using time-of-flight neutrons. The measured data is loaded from a file -# containing the reduced diffraction pattern of Si from the previous -# tutorial. +# containing the reduced diffraction pattern of Si from the previous tutorial. # %% # TODO: Remove this cell in the final version of the tutorial. @@ -130,8 +126,8 @@ # that it has a broad and unusual shape. This is a result of the simplified # data reduction process. Obtaining a more accurate diffraction pattern would # require a more advanced data reduction, which is beyond the scope of this -# tutorial. Therefore, we will simply exclude the high TOF region from the analysis by -# adding an excluded region to the experiment. +# tutorial. Therefore, we will simply exclude the high TOF region from the +# analysis by adding an excluded region to the experiment. # %% project_1.experiments['sim_si'].excluded_regions.add(minimum=108000, maximum=200000) @@ -164,15 +160,17 @@ # #### Set Peak Profile Parameters # # The next set of parameters is needed to define the peak profile used in the -# fitting process. The peak profile describes shape of the diffraction peaks. -# They include parameters for the broadening and asymmetry of the peaks. Here, -# we use a pseudo-Voigt peak profile function with Ikeda-Carpenter asymmetry, which is a common -# choice for neutron powder diffraction data. The values are typically determined -# experimentally on the same instrument and under the same configuration as the -# data being analyzed based on measurements of a standard -# sample. In some cases, these parameters are refined during the fitting -# process to improve the fit between the measured and calculated diffraction, but -# in this case, we will use the values from another simulation. +# fitting process. The peak profile describes the shape of the diffraction peaks. +# They include parameters for the broadening and asymmetry of the peaks. +# +# Here, we use a pseudo-Voigt peak profile function with Ikeda-Carpenter +# asymmetry, which is a common choice for neutron powder diffraction data. +# +# The values are typically determined experimentally on the same instrument and +# under the same configuration as the data being analyzed based on measurements +# of a standard sample. In some cases, these parameters are refined during the +# fitting process to improve the fit between the measured and calculated +# diffraction, but in this case, we will use the values from another simulation. # %% project_1.experiments['sim_si'].peak_profile_type = 'pseudo-voigt * ikeda-carpenter' @@ -188,22 +186,26 @@ # %% [markdown] # #### Set Background # -# The background of the diffraction pattern represents the portion of the pattern that -# is not related to the crystal structure of the sample, but rather to -# incoherent scattering from the sample itself, the sample holder, the sample -# environment, and the instrument. The background can be modeled in various -# ways. In this case, we will use a simple line segment background, which is a -# common approach for powder diffraction data. The background intensity at any -# point is defined by linear interpolation between neighboring points. -# The background points are selected +# The background of the diffraction pattern represents the portion of the +# pattern that is not related to the crystal structure of the sample. It's +# rather representing the noise and other sources of scattering that can affect +# the measured intensities. This includes contributions from the instrument, +# the sample holder, the sample environment, and other sources of incoherent +# scattering. +# +# The background can be modeled in various ways. In this example, we will use +# a simple line segment background, which is a common approach for powder +# diffraction data. The background intensity at any point is defined by linear +# interpolation between neighboring points. The background points are selected # to span the range of the diffraction pattern while avoiding the peaks. # -# In this case, we will add several background points at specific TOF values -# (in microseconds) and corresponding intensity values. These points are -# chosen to represent the background level in the diffraction pattern free from -# any peaks. The background points are added using the `add` method of the -# `background` attribute of the experiment. The `x` parameter represents the TOF -# value, and the `y` parameter represents the intensity value at that TOF. +# We will add several background points at specific TOF values (in μs) and +# corresponding intensity values. These points are chosen to represent the +# background level in the diffraction pattern free from any peaks. +# +# The background points are added using the `add` method of the `background` +# object. The `x` parameter represents the TOF value, and the `y` parameter +# represents the intensity value at that TOF. # # Let's set all the background points at a constant value of 0.01, which can be # roughly determined by the eye, and we will refine them later during the fitting @@ -234,9 +236,11 @@ # # EasyDiffraction refines the crystal structure of the sample, # but does not solve it. Therefore, we need a good starting point with -# reasonable structural parameters. Here, we define the Si structure as a -# cubic structure with the space group F d -3 m. As this is a simple cubic -# structure, we only need to define the single lattice parameter, which +# reasonable structural parameters. +# +# Here, we define the Si structure as a +# cubic structure. As this is a cubic structure, we only need to define +# the single lattice parameter, which # is the length of the unit cell edge. The Si crystal structure has a # single atom in the unit cell, which is located at the origin (0, 0, 0) of # the unit cell. The symmetry of this site is defined by the Wyckoff letter 'a'. @@ -249,6 +253,40 @@ # entry for silicon as a reference for the initial crystal structure model: # https://www.crystallography.net/cod/4507226.html # +# Usually, the crystal structure parameters are provided in a CIF file +# format, which is a standard format for crystallographic data. An example +# of a CIF file for silicon is shown below. The CIF file contains the +# space group information, unit cell parameters, and atomic positions. + +# %% [markdown] +# ``` +# data_si +# +# _space_group.name_H-M_alt "F d -3 m" +# _space_group.IT_coordinate_system_code 2 +# +# _cell.length_a 5.43 +# _cell.length_b 5.43 +# _cell.length_c 5.43 +# _cell.angle_alpha 90.0 +# _cell.angle_beta 90.0 +# _cell.angle_gamma 90.0 +# +# loop_ +# _atom_site.label +# _atom_site.type_symbol +# _atom_site.fract_x +# _atom_site.fract_y +# _atom_site.fract_z +# _atom_site.wyckoff_letter +# _atom_site.occupancy +# _atom_site.ADP_type +# _atom_site.B_iso_or_equiv +# Si Si 0 0 0 a 1.0 Biso 0.95 +# ``` + +# %% [markdown] +# # As with adding the experiment in the # previous step, we will create a default sample model # and then modify its parameters to match the Si structure. @@ -297,7 +335,7 @@ # ### 🚀 Analyze and Fit the Data # # After setting up the experiment and sample model, we can now analyze the -# measured diffraction pattern and perform the fitting process. +# measured diffraction pattern and perform the fit. # # The fitting process involves comparing the measured diffraction pattern with # the calculated diffraction pattern based on the sample model and instrument @@ -335,7 +373,7 @@ # # Before performing the fit, we can visually compare the measured # diffraction pattern with the calculated diffraction pattern based on the -# initial parameters of the sample model and the instrument settings. +# initial parameters of the sample model and the instrument. # This provides an indication of how well the initial parameters # match the measured data. The `plot_meas_vs_calc` method of the project # allows this comparison. @@ -354,15 +392,16 @@ # %% [markdown] # #### Check Fit Results -# You will -# see that the fit is now much improved and that the intensities of the +# You can +# see that the agreement between the measured and calculated diffraction patterns +# is now much improved and that the intensities of the # calculated peaks align much better with the measured peaks. To check the # quality of the fit numerically, we can look at the goodness-of-fit -# chi-squared value and the R-factors. The chi-squared value is a measure of how well +# χ² value and the reliability R-factors. The χ² value is a measure of how well # the calculated diffraction pattern matches the measured pattern, and it is # calculated as the sum of the squared differences between the measured and # calculated intensities, divided by the number of data points. Ideally, the -# chi-squared value should be close to 1, indicating a good fit. +# χ² value should be close to 1, indicating a good fit. # %% [markdown] # #### Visualize Fit Results @@ -405,7 +444,7 @@ # # Now that you have a basic understanding of the fitting process, we will # undertake a more complex fit of the La₀.₅Ba₀.₅CoO₃ (LBCO) crystal structure -# using simulated powder diffraction data from the [previous tutorial](#). +# using simulated powder diffraction data from the previous tutorial. # # You can use the same approach as in the previous part of the tutorial, but # this time we will refine a more complex crystal structure LBCO with multiple atoms @@ -447,17 +486,17 @@ # %% project_2.experiments.add(name='sim_lbco', - sample_form='powder', - beam_mode='time-of-flight', - radiation_probe='neutron', - data_path='data/powder_reduced_lbco_0_05si_2large_bank.xye') + sample_form='powder', + beam_mode='time-of-flight', + radiation_probe='neutron', + data_path='data/powder_reduced_lbco_0_05si_2large_bank.xye') # %% [markdown] # #### Exercise 2.1: Inspect Measured Data # # Check the measured data of the LBCO experiment. Are there any -# peaks with the shape similar to the Si peaks? If so, exclude them from the -# analysis. +# peaks with the shape similar to those excluded in the Si fit? +# If so, exclude them from this analysis as well. # # **Hint:** You can use the `plot_meas` method of the project to visualize the # measured diffraction pattern. You can also use the `excluded_regions` attribute @@ -653,7 +692,7 @@ # %% [markdown] # ### 🔗 Exercise 4: Assign Sample Model to Experiment # -# Now assign the LBCO sample model to the LBCO experiment created above. +# Now assign the LBCO sample model to the experiment created above. # # **Hint:** Use the `linked_phases` attribute of the experiment to link the sample model. # @@ -709,17 +748,16 @@ # What could be the reason for the misfit? # # **Hint**: Consider the following options: -# - The conversion parameters from TOF to d-spacing are not correct. -# - The lattice parameters of the LBCO phase are not correct. -# - The peak profile parameters are not correct. -# - The background points are not correct. +# 1. The conversion parameters from TOF to d-spacing are not correct. +# 2. The lattice parameters of the LBCO phase are not correct. +# 3. The peak profile parameters are not correct. +# 4. The background points are not correct. # # **Solution**: -# - ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction process and this was verified in -# the Si fit. -# - ✅ The lattice parameters of the LBCO phase were set based on the CIF data, which is a good starting point. -# - ❌ The peak profile parameters do not change the position of the peaks, but rather their shape. -# - ❌ The background points affect the background level, but not the peak positions. +# 1. ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction process and this was verified in the Si fit. +# 2. ✅ The lattice parameters of the LBCO phase were set based on the CIF data, which is a good starting point, but they are not necessarily as accurate as needed for the fit. The lattice parameters may need to be refined. +# 3. ❌ The peak profile parameters do not change the position of the peaks, but rather their shape. +# 4. ❌ The background points affect the background level, but not the peak positions. # %% project_2.plot_meas_vs_calc(expt_name='sim_lbco') @@ -769,7 +807,7 @@ # For example, if you zoom in on the region around 1.6 Å (or 95,000 μs), you will # notice that the rightmost peak is not explained by the LBCO phase at all. # -# Solution: +# **Solution**: # %% project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1.53, x_max=1.7, d_spacing=True) @@ -778,16 +816,18 @@ # #### Exercise 5.7: Identify the Cause of the Unexplained Peaks # # **Hint**: Consider the following options: -# - The LBCO phase is not correctly modeled. -# - The LBCO phase is not the only phase present in the sample. -# - The data reduction process introduced artifacts. +# 1. The LBCO phase is not correctly modeled. +# 2. The LBCO phase is not the only phase present in the sample. +# 3. The data reduction process introduced artifacts. # # **Solution**: -# - ❌ In principle, this could be the case, but in this case, the LBCO phase is correctly modeled. -# - ✅ The LBCO phase is not the only phase present in the sample. The unexplained peaks -# are likely due to the presence of an impurity phase in the sample, which is not -# included in the current model. -# - ❌ The data reduction process is not likely to introduce such specific peaks, as it is +# 1. ❌ In principle, this could be the case, as sometimes the presence of +# extra peaks in the diffraction pattern can indicate a lower symmetry +# than the one used in the model, or that the model is not complete. However, +# in this case, the LBCO phase is correctly modeled based on the CIF data. +# 2. ✅ The unexplained peaks are due to the presence of an impurity phase +# in the sample, which is not included in the current model. +# 3. ❌ The data reduction process is not likely to introduce such specific peaks, as it is # tested and verified in the previous part of the tutorial. # %% [markdown] @@ -800,7 +840,10 @@ # tutorial. # # **Solution**: -# The unexplained peaks are likely due to the presence of silicon (Si) in the sample. +# The unexplained peaks are likely due to the presence of small amount of +# Si in the LBCO sample. In real experiments, it might happen, e.g., because the +# sample holder was not cleaned properly after the Si experiment. +# # You can visalize both the patterns of the Si and LBCO phases to confirm this hypothesis. # %% @@ -900,13 +943,13 @@ # Let's plot the measured diffraction pattern and the calculated diffraction # pattern both for the full range and for a zoomed-in region around the previously unexplained -# peak near 90,000 μs. The calculated pattern will be the sum of the two phases. +# peak near 95,000 μs. The calculated pattern will be the sum of the two phases. # %% project_2.plot_meas_vs_calc(expt_name='sim_lbco') # %% -project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=85000, x_max=105000) +project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=88000, x_max=101000) # %% [markdown] # All previously unexplained peaks are now accounted for in the pattern, and the fit is improved. @@ -921,12 +964,12 @@ # - **Si** as a simple reference system, and # - **LBCO** as a more complex, realistic case with an initially unknown impurity. # -# Along the way, you learned how to: -# - Define a project, experiment, and sample model in EasyDiffraction -# - Set up instrument and peak profile parameters -# - Visualize measured and calculated patterns -# - Identify and interpret misfits in the diffraction data -# - Add and refine multiple phases to improve the model +# Along the way, you learned how to work with the EasyDiffraction library to: +# - Define a project, experiment, and sample model. +# - Set up instrument and peak profile parameters. +# - Visualize measured and calculated patterns. +# - Identify and interpret misfits in the diffraction data. +# - Add and refine multiple phases to improve the model. # # Key Takeaways: # - A good refinement starts with a reasonable structural model and @@ -937,7 +980,7 @@ # %% [markdown] # ## 🎁 Bonus # -# You've now completed the analysis part of the Summer School workflow, +# You've now completed the analysis part of the DMSC Summer School workflow, # demonstrating the practical use of EasyDiffraction for refining simulated # powder diffraction data. # From e6084475795feffc854c18e09064f4622aebb144 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 16 Jul 2025 12:59:11 +0200 Subject: [PATCH 11/41] Enhances Plotly figure display in Jupyter Improves the display of Plotly figures in Jupyter notebooks by checking for IPython availability. Converts figures to HTML for better compatibility, avoiding warnings related to unknown MIME types. --- .../plotting/plotters/plotter_plotly.py | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/easydiffraction/plotting/plotters/plotter_plotly.py b/src/easydiffraction/plotting/plotters/plotter_plotly.py index af5e99ea..4f6a9d5d 100644 --- a/src/easydiffraction/plotting/plotters/plotter_plotly.py +++ b/src/easydiffraction/plotting/plotters/plotter_plotly.py @@ -2,6 +2,15 @@ import plotly.graph_objects as go import plotly.io as pio +try: + import IPython + from IPython.display import ( + display, + HTML + ) +except ImportError: + IPython = None + from .plotter_base import ( PlotterBase, SERIES_CONFIG @@ -82,4 +91,18 @@ def plot(self, layout=layout ) - fig.show() + # Show the figure + + # This can lead to warnings in Jupyter notebooks: + # WARNING: skipping unknown output mime type: application/vnd.plotly.v1+json [mystnb.unknown_mime_type] + if IPython is None: + fig.show() + + # If IPython is available, we can convert the figure to HTML and + # display it in the notebook. + else: + # Convert figure to HTML + html_fig = pio.to_html(fig, include_plotlyjs="cdn", full_html=False) + + # Display it in the notebook + display(HTML(html_fig)) From 43265d281964d5a133be49f7b746d3fa0494e683 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 16 Jul 2025 14:08:42 +0200 Subject: [PATCH 12/41] Suppresses Cryspy warnings by redirecting stderr Wraps Cryspy calculation in stderr redirection to prevent warning messages from cluttering the output. This is a temporary measure until Cryspy handles warnings more efficiently. --- .../analysis/calculators/calculator_cryspy.py | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/easydiffraction/analysis/calculators/calculator_cryspy.py b/src/easydiffraction/analysis/calculators/calculator_cryspy.py index 09209806..302e89a5 100644 --- a/src/easydiffraction/analysis/calculators/calculator_cryspy.py +++ b/src/easydiffraction/analysis/calculators/calculator_cryspy.py @@ -1,4 +1,6 @@ import copy +import io +import contextlib import numpy as np from typing import Any, Dict, List, Union from .calculator_base import CalculatorBase @@ -81,12 +83,20 @@ def _calculate_single_model_pattern( self._cryspy_dicts[combined_name] = copy.deepcopy(cryspy_dict) cryspy_in_out_dict: Dict[str, Any] = {} - rhochi_calc_chi_sq_by_dictionary( - cryspy_dict, - dict_in_out=cryspy_in_out_dict, - flag_use_precalculated_data=False, - flag_calc_analytical_derivatives=False - ) + + # Calculate the pattern using Cryspy + # TODO: Redirect stderr to suppress Cryspy warnings. + # This is a temporary solution to avoid cluttering the output. + # E.g. cryspy/A_functions_base/powder_diffraction_tof.py:106: + # RuntimeWarning: overflow encountered in exp + # Remove this when Cryspy is updated to handle warnings better. + with contextlib.redirect_stderr(io.StringIO()): + rhochi_calc_chi_sq_by_dictionary( + cryspy_dict, + dict_in_out=cryspy_in_out_dict, + flag_use_precalculated_data=False, + flag_calc_analytical_derivatives=False + ) prefixes = { "constant wavelength": "pd", From 92139eb1223cc01e03ddf47b5cdbf1abea97bf14 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Mon, 21 Jul 2025 10:43:55 +0200 Subject: [PATCH 13/41] Adjusts default quadratic calibration parameter --- src/easydiffraction/experiments/components/instrument.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/easydiffraction/experiments/components/instrument.py b/src/easydiffraction/experiments/components/instrument.py index 30caaf43..855863cd 100644 --- a/src/easydiffraction/experiments/components/instrument.py +++ b/src/easydiffraction/experiments/components/instrument.py @@ -48,7 +48,7 @@ def __init__(self, setup_twotheta_bank: float = 150.0, calib_d_to_tof_offset: float = 0.0, calib_d_to_tof_linear: float = 10000.0, - calib_d_to_tof_quad: float = -1.0, + calib_d_to_tof_quad: float = -0.00001, calib_d_to_tof_recip: float = 0.0) -> None: super().__init__() From 02daac3001ab39ccd832c39a7059100dbf7f7dee Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 23 Jul 2025 00:15:18 +0200 Subject: [PATCH 14/41] Adds function to extract value from XYE file header --- src/easydiffraction/__init__.py | 8 ++++++-- src/easydiffraction/utils/utils.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/easydiffraction/__init__.py b/src/easydiffraction/__init__.py index 8b129615..04330631 100644 --- a/src/easydiffraction/__init__.py +++ b/src/easydiffraction/__init__.py @@ -19,7 +19,10 @@ from easydiffraction.summary import Summary # Utils -from easydiffraction.utils.utils import download_from_repository +from easydiffraction.utils.utils import ( + download_from_repository, + get_value_from_xye_header +) from easydiffraction.utils.formatting import ( chapter, section, @@ -39,5 +42,6 @@ "chapter", "section", "paragraph", - 'download_from_repository' + "download_from_repository", + "get_value_from_xye_header" ] \ No newline at end of file diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index 5d3feb21..4c6eaf33 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -5,6 +5,7 @@ import numpy as np import pandas as pd import pooch +import re from tabulate import tabulate try: @@ -163,4 +164,30 @@ def tof_to_d(tof, offset, linear, quad): sqrt_discriminant = np.sqrt(discriminant) d = (-B + sqrt_discriminant) / (2*A) - return d \ No newline at end of file + return d + + +def get_value_from_xye_header(file_path, key): + """ + Extracts a floating point value from the first line of the file, corresponding to the given key. + + Parameters: + file_path (str): Path to the input file. + key (str): The key to extract ('DIFC' or 'two_theta'). + + Returns: + float: The extracted value. + + Raises: + ValueError: If the key is not found. + """ + pattern = rf"{key}\s*=\s*([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)" + + with open(file_path, 'r') as f: + first_line = f.readline() + + match = re.search(pattern, first_line) + if match: + return float(match.group(1)) + else: + raise ValueError(f"{key} not found in the header.") \ No newline at end of file From 4e22adb9f4739dca1a615c1b365f9a79fac6f329 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 23 Jul 2025 10:31:12 +0200 Subject: [PATCH 15/41] Updates the summer school tutorial --- ...powder_reduced_lbco_0_05si_2large_bank.xye | 1002 ----------------- tutorials/data/reduced_LBCO.xye | 902 +++++++++++++++ tutorials/data/reduced_Si.xye | 902 +++++++++++++++ ...ool-2025_analysis-powder-diffraction.ipynb | 866 ++++++++------ ...school-2025_analysis-powder-diffraction.py | 544 +++++---- 5 files changed, 2675 insertions(+), 1541 deletions(-) delete mode 100644 tutorials/data/powder_reduced_lbco_0_05si_2large_bank.xye create mode 100644 tutorials/data/reduced_LBCO.xye create mode 100644 tutorials/data/reduced_Si.xye diff --git a/tutorials/data/powder_reduced_lbco_0_05si_2large_bank.xye b/tutorials/data/powder_reduced_lbco_0_05si_2large_bank.xye deleted file mode 100644 index dfbdffe8..00000000 --- a/tutorials/data/powder_reduced_lbco_0_05si_2large_bank.xye +++ /dev/null @@ -1,1002 +0,0 @@ -# DIFC = 58736.09443990583 [µ/Å] L = 157.66511528266744 [m] two_theta = 94.93340423102556 [deg] -# tof [µs] Y [counts] E [counts] -4.116812859292999201e+04 2.153710746931005171e-01 2.485114069864158629e-02 -4.127385356292182405e+04 2.608731253560512831e-01 3.329888041963863926e-02 -4.137957853291364881e+04 3.043368615904640806e-01 3.547087591788450345e-02 -4.148530350290548085e+04 4.736670804811050073e-01 4.206283617542717901e-02 -4.159102847289731289e+04 6.002651986502521853e-01 4.196647994561224920e-02 -4.169675344288914494e+04 6.017448324066868581e-01 3.965186271654011496e-02 -4.180247841288097698e+04 5.011825843970607597e-01 3.810348675822586295e-02 -4.190820338287280174e+04 3.770226414883808830e-01 3.458905645764303455e-02 -4.201392835286463378e+04 2.753318277463203678e-01 3.190950665975840483e-02 -4.211965332285646582e+04 2.618231130009330276e-01 2.830042526454298185e-02 -4.222537829284829786e+04 2.928088563756663376e-01 3.145301661570625018e-02 -4.233110326284012262e+04 3.578142823373394177e-01 4.155932289601068502e-02 -4.243682823283195467e+04 3.769179959521566370e-01 3.849597975143188855e-02 -4.254255320282378671e+04 4.158391911279324393e-01 4.449771134056958177e-02 -4.264827817281561875e+04 3.779803744828383327e-01 4.193951997252232111e-02 -4.275400314280745079e+04 3.198893594846607957e-01 3.309901263703583785e-02 -4.285972811279928283e+04 2.658741522251843459e-01 2.855729616760260825e-02 -4.296545308279110759e+04 2.573176035624888947e-01 3.093264002198454002e-02 -4.307117805278293963e+04 2.577564704480500013e-01 2.793004132928919581e-02 -4.317690302277477167e+04 2.436818233779233789e-01 2.633848204890042871e-02 -4.328262799276660371e+04 2.292366928663013004e-01 2.670909544346710199e-02 -4.338835296275842848e+04 2.509718661544597107e-01 2.812685157678675857e-02 -4.349407793275026052e+04 2.520164318371221901e-01 2.840260670459381076e-02 -4.359980290274209256e+04 2.966280574563536221e-01 2.933221528558389857e-02 -4.370552787273392460e+04 5.917885671986631291e-01 4.715812670168278986e-02 -4.381125284272575664e+04 1.128510510097429753e+00 6.592621547237847990e-02 -4.391697781271758140e+04 1.134676835970059416e+00 5.575804856372774260e-02 -4.402270278270941344e+04 8.777986080928671386e-01 4.135430851512232608e-02 -4.412842775270124548e+04 5.660575761924040439e-01 3.186612578727112538e-02 -4.423415272269307752e+04 3.978815799809931053e-01 2.999555575290682383e-02 -4.433987769268490229e+04 2.767054054920717876e-01 2.831555763835678571e-02 -4.444560266267673433e+04 3.725751083717299128e-01 3.306140498413820406e-02 -4.455132763266856637e+04 5.620474590198114573e-01 3.747912960742691424e-02 -4.465705260266039841e+04 8.794032862318595933e-01 4.339597485143953381e-02 -4.476277757265223045e+04 1.049733673425403024e+00 4.470369284474142585e-02 -4.486850254264405521e+04 8.065912472297915858e-01 3.562084390842406439e-02 -4.497422751263588725e+04 5.838432924396242951e-01 3.171070339140553973e-02 -4.507995248262771929e+04 3.754946792436575920e-01 2.585913508481106626e-02 -4.518567745261955133e+04 3.223595345777620635e-01 2.872205216524737273e-02 -4.529140242261137610e+04 2.586153666396504569e-01 2.514014802920313055e-02 -4.539712739260320814e+04 2.653946194115984203e-01 2.506320120119176834e-02 -4.550285236259504018e+04 3.204047378434953242e-01 3.374661251894776198e-02 -4.560857733258687222e+04 2.951144619245948397e-01 2.703262344951972915e-02 -4.571430230257870426e+04 3.108126736372315291e-01 2.683275683619879698e-02 -4.582002727257052902e+04 2.586610723515629373e-01 2.363213831492192926e-02 -4.592575224256236106e+04 2.953395370430179634e-01 2.502299927193591539e-02 -4.603147721255419310e+04 3.026068399569262768e-01 2.666410003952783894e-02 -4.613720218254602514e+04 3.903729423138836974e-01 4.433754393616119727e-02 -4.624292715253785718e+04 3.378836691835625516e-01 3.236157093051930667e-02 -4.634865212252968195e+04 7.252934849637189263e-01 6.077502775372350952e-02 -4.645437709252151399e+04 1.444078091575856426e+00 8.695420663068247069e-02 -4.656010206251334603e+04 2.160799078436518972e+00 1.058313665320170238e-01 -4.666582703250517807e+04 2.048563565799041530e+00 9.242447066920182752e-02 -4.677155200249701011e+04 1.282381284886184858e+00 5.868380667032114389e-02 -4.687727697248883487e+04 5.866001925346094881e-01 3.394969722869588952e-02 -4.698300194248066691e+04 3.739496315689567196e-01 2.685663276171922423e-02 -4.708872691247249895e+04 3.121051489047478866e-01 2.469331623046316232e-02 -4.719445188246433099e+04 2.630577114198744404e-01 2.288312367098122024e-02 -4.730017685245615576e+04 2.723258006960146971e-01 2.341727581514723919e-02 -4.740590182244798780e+04 2.412913354834822499e-01 2.147243362812975218e-02 -4.751162679243981984e+04 2.523896954981822982e-01 2.318341377024033326e-02 -4.761735176243165188e+04 2.184825433916667559e-01 1.920620904244086172e-02 -4.772307673242348392e+04 2.718324481106246804e-01 2.709558555661976953e-02 -4.782880170241530868e+04 2.628702244172894109e-01 2.161559381449554978e-02 -4.793452667240714072e+04 2.915223352375253540e-01 2.580408739341092175e-02 -4.804025164239897276e+04 2.530127940493845928e-01 2.138592736343572151e-02 -4.814597661239080480e+04 2.296839766414642825e-01 2.172373342743272664e-02 -4.825170158238262957e+04 2.630428626295486794e-01 2.133630588335756403e-02 -4.835742655237446161e+04 3.301884295987274065e-01 2.417924467260626833e-02 -4.846315152236629365e+04 3.695739281579626945e-01 2.295722673016692764e-02 -4.856887649235812569e+04 4.968789872605733904e-01 2.344131668866666560e-02 -4.867460146234995773e+04 5.483382902045680352e-01 2.325019238751704909e-02 -4.878032643234178249e+04 5.327191627479830327e-01 2.385465602729653842e-02 -4.888605140233361453e+04 4.183505548474412139e-01 2.212000839498857660e-02 -4.899177637232544657e+04 2.822691967721844830e-01 1.967979342239069285e-02 -4.909750134231727861e+04 2.866173486109942492e-01 2.136233932695521393e-02 -4.920322631230911065e+04 2.522132411861770507e-01 2.034966938360983219e-02 -4.930895128230093542e+04 2.488703826341970571e-01 1.955887366173672537e-02 -4.941467625229276746e+04 2.448078436988982698e-01 1.959869374087079216e-02 -4.952040122228459950e+04 2.601371397266339369e-01 2.587688364710211478e-02 -4.962612619227643154e+04 2.604647821395448815e-01 1.890954890145047154e-02 -4.973185116226825630e+04 3.113392816636900151e-01 2.192317175306443197e-02 -4.983757613226008834e+04 2.829567596015400421e-01 1.827207039423774798e-02 -4.994330110225192038e+04 3.214703596991227985e-01 2.233293022269595973e-02 -5.004902607224375242e+04 2.967639647355652666e-01 2.135032154107910710e-02 -5.015475104223558446e+04 2.680889839522346274e-01 1.925716582985162809e-02 -5.026047601222740923e+04 2.937093175842762638e-01 2.234167454325169944e-02 -5.036620098221924127e+04 3.079523703996563944e-01 2.216200674252769703e-02 -5.047192595221107331e+04 3.427802563886976350e-01 2.430553829132631530e-02 -5.057765092220290535e+04 3.619795633444084504e-01 2.631117900596903827e-02 -5.068337589219473739e+04 4.524771598823785768e-01 3.236845016249723789e-02 -5.078910086218656215e+04 8.838686127494939093e-01 5.260557836590706166e-02 -5.089482583217839419e+04 1.824757955809221066e+00 8.032464359556136524e-02 -5.100055080217022623e+04 2.913515320430418054e+00 1.026145629233496531e-01 -5.110627577216205827e+04 3.143102761371809883e+00 1.038394170389491944e-01 -5.121200074215389031e+04 2.403252941381652796e+00 8.542323864103675002e-02 -5.131772571214571508e+04 1.209045360096914434e+00 5.227567522888452306e-02 -5.142345068213754712e+04 5.860551625034998713e-01 2.959684125270913707e-02 -5.152917565212937916e+04 3.459746775442253397e-01 2.165689371791541112e-02 -5.163490062212121120e+04 2.720163149432728300e-01 1.844464326506729812e-02 -5.174062559211303596e+04 2.290974918298087082e-01 1.591446668835031983e-02 -5.184635056210486800e+04 2.936624044874694972e-01 2.045654517157154823e-02 -5.195207553209670004e+04 2.967278931397528963e-01 2.058125270356776781e-02 -5.205780050208853208e+04 4.798908863347365328e-01 2.798479666580701297e-02 -5.216352547208036412e+04 8.143691279984882625e-01 3.854817201873923099e-02 -5.226925044207218889e+04 1.535671873748238880e+00 5.355963405776297676e-02 -5.237497541206402093e+04 2.084068314161176438e+00 6.357017087954838774e-02 -5.248070038205585297e+04 1.928725550712737435e+00 5.888010583522335084e-02 -5.258642535204768501e+04 1.390773407300172071e+00 4.801671833159894959e-02 -5.269215032203950977e+04 7.037742698705139466e-01 3.020862573463304820e-02 -5.279787529203134181e+04 3.889558208910198212e-01 2.095658690632551738e-02 -5.290360026202317385e+04 3.064782716432409848e-01 1.957311781682838023e-02 -5.300932523201500589e+04 2.245358708337966969e-01 1.519657172746591810e-02 -5.311505020200683794e+04 2.350024874859830970e-01 1.676991307429799224e-02 -5.322077517199866270e+04 2.576466474746033630e-01 1.685674029532719526e-02 -5.332650014199049474e+04 2.459277008889770855e-01 1.635902888906161368e-02 -5.343222511198232678e+04 2.949416902369990656e-01 1.729796712387578206e-02 -5.353795008197415882e+04 3.578213142742978636e-01 1.831058572382073327e-02 -5.364367505196599086e+04 5.162626826748403230e-01 1.889672459609052085e-02 -5.374940002195781562e+04 8.043354875969166429e-01 2.271373300691972505e-02 -5.385512499194964767e+04 8.955710385483885982e-01 2.348465205034437620e-02 -5.396084996194147971e+04 8.454331381685515900e-01 2.430894807919327383e-02 -5.406657493193331175e+04 6.697227051116388941e-01 2.474791602679036334e-02 -5.417229990192513651e+04 4.149354144200905203e-01 1.918281222484124332e-02 -5.427802487191696855e+04 2.703659713579263379e-01 1.562156544953471372e-02 -5.438374984190880059e+04 2.699116166663160787e-01 1.721182920731275171e-02 -5.448947481190063263e+04 2.696290563527132811e-01 1.602469359478985583e-02 -5.459519978189246467e+04 2.332701288268579365e-01 1.548438118047886468e-02 -5.470092475188428944e+04 2.992378239825526642e-01 1.756047172264648543e-02 -5.480664972187612148e+04 2.544819126921636920e-01 1.650531420760956505e-02 -5.491237469186795352e+04 2.621729555779466203e-01 1.641350017030758154e-02 -5.501809966185978556e+04 2.922209274619719799e-01 1.781668389560021187e-02 -5.512382463185161760e+04 2.875155866064892374e-01 1.703243274437635929e-02 -5.522954960184344236e+04 2.768548631633431234e-01 1.718310947320735374e-02 -5.533527457183527440e+04 2.913825800245142816e-01 1.515185428982697251e-02 -5.544099954182710644e+04 3.033791032872547033e-01 1.622110984771307773e-02 -5.554672451181893848e+04 3.072023726799349985e-01 1.606921451438052262e-02 -5.565244948181076325e+04 2.672811653082456940e-01 1.476849635667062087e-02 -5.575817445180259529e+04 2.671051207358477453e-01 1.500842336169567852e-02 -5.586389942179442733e+04 2.761008854012295677e-01 1.602590646782442799e-02 -5.596962439178625937e+04 2.626905252209964514e-01 1.538533442335943482e-02 -5.607534936177809141e+04 2.425106423311819692e-01 1.426233132145164444e-02 -5.618107433176992345e+04 2.719298002174761475e-01 1.523041883139009817e-02 -5.628679930176174821e+04 3.089762544910952258e-01 1.595256094263953345e-02 -5.639252427175358025e+04 3.117078510728122365e-01 1.562528073052104130e-02 -5.649824924174541229e+04 3.110546473878670337e-01 1.580158735611719018e-02 -5.660397421173723706e+04 3.136732800561387591e-01 1.687084690249390090e-02 -5.670969918172906910e+04 3.612622000982856907e-01 1.738288861614042599e-02 -5.681542415172090114e+04 5.692034181151193195e-01 2.127425188175019119e-02 -5.692114912171273318e+04 9.024145041887405849e-01 2.566462776860295447e-02 -5.702687409170456522e+04 1.310078961033423584e+00 3.087994035170033014e-02 -5.713259906169639726e+04 1.388124754610512213e+00 3.087577938558860521e-02 -5.723832403168822202e+04 1.253053340898884649e+00 2.890379268629977849e-02 -5.734404900168005406e+04 8.852727257861658927e-01 2.452559237091598079e-02 -5.744977397167188610e+04 5.531365275394289904e-01 1.956794748268836370e-02 -5.755549894166371087e+04 3.578118600987075792e-01 1.619093592433212131e-02 -5.766122391165554291e+04 2.764076578807457274e-01 1.417519266443980838e-02 -5.776694888164737495e+04 2.545598108117405056e-01 1.381721192821199276e-02 -5.787267385163920699e+04 2.620681669408651548e-01 1.430973519241612868e-02 -5.797839882163103903e+04 2.679810480432835429e-01 1.467260100318671344e-02 -5.808412379162287107e+04 2.785179905420335777e-01 1.499952315973867960e-02 -5.818984876161469583e+04 2.579693973616148384e-01 1.479400054306367375e-02 -5.829557373160652787e+04 2.606695108822812412e-01 1.517154610225861927e-02 -5.840129870159835991e+04 2.568557081521639085e-01 1.346900104251730172e-02 -5.850702367159019195e+04 2.442328104920105936e-01 1.327551160505504452e-02 -5.861274864158201672e+04 2.511302172265642563e-01 1.386914178717005633e-02 -5.871847361157384876e+04 2.504224214898718714e-01 1.314973340354531374e-02 -5.882419858156568807e+04 2.637752400484691950e-01 1.345927793910209162e-02 -5.892992355155750556e+04 2.644583043066947026e-01 1.388159803911763121e-02 -5.903564852154935215e+04 2.708333079152489553e-01 1.461421395838648565e-02 -5.914137349154116964e+04 2.576523065118234701e-01 1.427843958927238650e-02 -5.924709846153300168e+04 2.531378969060431028e-01 1.346411626729160371e-02 -5.935282343152483372e+04 2.681484402168856085e-01 1.348853301241573731e-02 -5.945854840151666576e+04 2.423213524438379840e-01 1.246387940864682707e-02 -5.956427337150849780e+04 2.496728747172669571e-01 1.257850672301267549e-02 -5.966999834150032257e+04 2.664614794005397691e-01 1.347951018164133749e-02 -5.977572331149216188e+04 2.678898972704827353e-01 1.311899624502996242e-02 -5.988144828148397937e+04 2.531867839976721934e-01 1.316204732504211786e-02 -5.998717325147582596e+04 2.579200490850795391e-01 1.313214149795720147e-02 -6.009289822146764345e+04 2.639651402910249689e-01 1.303961904430984975e-02 -6.019862319145947549e+04 2.571376644940963074e-01 1.297659233397437627e-02 -6.030434816145130753e+04 2.556765127148905026e-01 1.262842355223556950e-02 -6.041007313144313957e+04 2.936488898076692888e-01 1.368859656883815966e-02 -6.051579810143497161e+04 2.970412290164322067e-01 1.337787648927450841e-02 -6.062152307142679638e+04 3.315704229500917033e-01 1.423302151199909438e-02 -6.072724804141863569e+04 4.197496154411256009e-01 1.459406654176504878e-02 -6.083297301141046046e+04 6.729761175543871321e-01 1.796416666630230516e-02 -6.093869798140229977e+04 1.028495515222632273e+00 2.072357941245445839e-02 -6.104442295139411726e+04 1.187586131094396036e+00 2.127191519707625350e-02 -6.115014792138594930e+04 1.215208935269679325e+00 2.117806085653267320e-02 -6.125587289137778134e+04 9.139143974243897350e-01 1.851300834854351443e-02 -6.136159786136961338e+04 7.009141961914646668e-01 1.714113789437486310e-02 -6.146732283136144542e+04 5.011843854293078770e-01 1.518404991039024737e-02 -6.157304780135327019e+04 3.635027078620511887e-01 1.350470376178352500e-02 -6.167877277134510950e+04 2.972464839269961523e-01 1.242195529105087452e-02 -6.178449774133693427e+04 2.975371579147865764e-01 1.315649875716912165e-02 -6.189022271132877358e+04 2.628639507769817141e-01 1.286334853265197822e-02 -6.199594768132059107e+04 2.577393307409369672e-01 1.151776679846635253e-02 -6.210167265131242311e+04 2.612924704731126035e-01 1.161047992394215189e-02 -6.220739762130425515e+04 2.500632480852333916e-01 1.186528818843076739e-02 -6.231312259129608719e+04 2.494934704492355881e-01 1.146276574448418760e-02 -6.241884756128791923e+04 2.579458980236530863e-01 1.147293749550409858e-02 -6.252457253127974400e+04 2.359353714853535122e-01 1.091559803082713456e-02 -6.263029750127158331e+04 2.334517780734865211e-01 1.114364302364331295e-02 -6.273602247126340808e+04 2.615893593554464713e-01 1.195191554433323693e-02 -6.284174744125524740e+04 2.397369088869018283e-01 1.092678523811795206e-02 -6.294747241124707216e+04 2.651839273661140139e-01 1.147332783271173655e-02 -6.305319738123891148e+04 2.641508894461597756e-01 1.164223507976873580e-02 -6.315892235123072896e+04 2.560209361608498102e-01 1.116485038947329089e-02 -6.326464732122256100e+04 2.440130008341020729e-01 1.064393008778644935e-02 -6.337037229121439304e+04 2.695559550600108434e-01 1.153352244735585640e-02 -6.347609726120621781e+04 2.567677856634049682e-01 1.080212465949361225e-02 -6.358182223119805712e+04 2.414534503458179715e-01 1.045330584302135886e-02 -6.368754720118988189e+04 2.572680395077308613e-01 1.081561687751143343e-02 -6.379327217118172121e+04 2.494193814230429018e-01 1.108117151280665034e-02 -6.389899714117354597e+04 2.470315591965163426e-01 1.044353255378311675e-02 -6.400472211116538529e+04 2.467783934782481758e-01 1.046139215304635849e-02 -6.411044708115720277e+04 2.584042999053819956e-01 1.101495842120117120e-02 -6.421617205114903481e+04 2.387704999207234113e-01 1.028189337747785134e-02 -6.432189702114086685e+04 2.364082051586776645e-01 1.013720083030077504e-02 -6.442762199113269162e+04 2.612216413150915684e-01 1.047671201111289967e-02 -6.453334696112453094e+04 2.489941024443725892e-01 1.052787647627317219e-02 -6.463907193111635570e+04 2.516159720823578638e-01 1.050846743139435303e-02 -6.474479690110819502e+04 2.996276552388459358e-01 1.185888661380172376e-02 -6.485052187110001978e+04 3.303528700645373406e-01 1.235835806377064139e-02 -6.495624684109185910e+04 4.052694143559218420e-01 1.469967694468926264e-02 -6.506197181108368386e+04 4.287356658506749629e-01 1.518769225567730662e-02 -6.516769678107550862e+04 4.413954434921170122e-01 1.508120432091632733e-02 -6.527342175106734067e+04 4.010946641743854957e-01 1.416615440215991499e-02 -6.537914672105917271e+04 3.964790586456777843e-01 1.410616683912667944e-02 -6.548487169105100475e+04 5.085401144141257213e-01 1.672683091770560057e-02 -6.559059666104282951e+04 7.781373062475197555e-01 2.066414428122907015e-02 -6.569632163103467610e+04 1.445874052339014115e+00 2.807218000299617836e-02 -6.580204660102649359e+04 2.465790736504362979e+00 3.679287239274418864e-02 -6.590777157101834018e+04 3.126713081552214835e+00 4.063395719279198903e-02 -6.601349654101015767e+04 3.179229423995032278e+00 4.018240811389910128e-02 -6.611922151100198971e+04 2.422360518529352191e+00 3.408929248968482761e-02 -6.622494648099382175e+04 1.454961682297714942e+00 2.576790342717837773e-02 -6.633067145098565379e+04 8.143249923787676536e-01 1.932655671966656760e-02 -6.643639642097748583e+04 4.756062517999517514e-01 1.422750433122568769e-02 -6.654212139096930332e+04 3.538000459582563706e-01 1.230305108027457753e-02 -6.664784636096114991e+04 2.895889914605696003e-01 1.041707665163589015e-02 -6.675357133095296740e+04 2.537068093532732216e-01 9.616790970996987736e-03 -6.685929630094481399e+04 2.393703226533146489e-01 9.055459208632763921e-03 -6.696502127093663148e+04 2.532881289680958270e-01 9.645000827537183671e-03 -6.707074624092846352e+04 2.425682443817209211e-01 9.418700960545235701e-03 -6.717647121092029556e+04 2.537897440863364773e-01 9.578805403922009687e-03 -6.728219618091212760e+04 2.475104034903072014e-01 9.548110846646844924e-03 -6.738792115090395964e+04 2.310229745077113650e-01 8.900379132648471997e-03 -6.749364612089577713e+04 2.550900940063549616e-01 9.344681116369140533e-03 -6.759937109088762372e+04 2.350973858595828692e-01 8.972575103113951400e-03 -6.770509606087944121e+04 2.648949299910587363e-01 9.841488989181312180e-03 -6.781082103087128780e+04 2.480215165956837220e-01 9.427458944646430195e-03 -6.791654600086310529e+04 2.582706368585657164e-01 1.034583997077205032e-02 -6.802227097085493733e+04 2.815924509115133589e-01 1.071764859215887898e-02 -6.812799594084676937e+04 2.893011300969298705e-01 1.121109327466562194e-02 -6.823372091083860141e+04 3.965450002733932888e-01 1.575935472657262124e-02 -6.833944588083043345e+04 4.938733356990868684e-01 1.828959554383506603e-02 -6.844517085082225094e+04 8.844633790820334296e-01 2.611033936532454122e-02 -6.855089582081409753e+04 1.776663354043423126e+00 3.848824025750206129e-02 -6.865662079080591502e+04 3.462905178048456989e+00 5.543707052559553039e-02 -6.876234576079776161e+04 5.629349777464291549e+00 7.080615141533266876e-02 -6.886807073078957910e+04 6.728341650025493337e+00 7.575581337866610365e-02 -6.897379570078142569e+04 6.198594237923834349e+00 7.102105172067600669e-02 -6.907952067077324318e+04 4.342802902548902111e+00 5.725092716982064373e-02 -6.918524564076507522e+04 2.446689264886297011e+00 4.080947422291159726e-02 -6.929097061075690726e+04 1.288074729783375671e+00 2.841976986317077541e-02 -6.939669558074872475e+04 7.044727348357692209e-01 1.980897752036525281e-02 -6.950242055074057134e+04 4.647080730124361070e-01 1.547568711673538364e-02 -6.960814552073238883e+04 3.110685500106273316e-01 1.132748842948613430e-02 -6.971387049072423542e+04 2.737746294835372574e-01 9.718019370143030425e-03 -6.981959546071605291e+04 2.634456929244144985e-01 9.245392653095572261e-03 -6.992532043070789950e+04 2.567098672003880200e-01 8.823941405229499338e-03 -7.003104540069971699e+04 2.367304650589087400e-01 8.330833070053529979e-03 -7.013677037069154903e+04 2.374833995291177335e-01 8.145452762357580784e-03 -7.024249534068338107e+04 2.317402452134979252e-01 8.065123129290016624e-03 -7.034822031067519856e+04 2.378455804479022995e-01 8.388505337370616780e-03 -7.045394528066704515e+04 2.455079442071830542e-01 8.573869706868811336e-03 -7.055967025065886264e+04 2.433087339654111392e-01 8.367032664891286067e-03 -7.066539522065070923e+04 2.400370258365473741e-01 8.393852956526202252e-03 -7.077112019064252672e+04 2.420808160193218261e-01 8.217927654646895591e-03 -7.087684516063435876e+04 2.306251559263440276e-01 8.014181030620869117e-03 -7.098257013062619080e+04 2.497575217984906171e-01 8.402484315836582576e-03 -7.108829510061802284e+04 2.583726877652068321e-01 8.700472684506554630e-03 -7.119402007060985488e+04 2.382137985584143747e-01 8.086423583625157452e-03 -7.129974504060168692e+04 2.554300905788884357e-01 8.489978954411487796e-03 -7.140547001059351896e+04 2.493553377540576876e-01 8.280111606897235313e-03 -7.151119498058533645e+04 2.500039703310768524e-01 8.281309169979480730e-03 -7.161691995057718304e+04 2.509552523224448106e-01 8.072103809935112645e-03 -7.172264492056900053e+04 2.869485163586003029e-01 8.562909077433593016e-03 -7.182836989056083257e+04 3.261786587479619803e-01 8.216832329056619061e-03 -7.193409486055266461e+04 4.638657152686291862e-01 9.216991226892744943e-03 -7.203981983054449665e+04 6.522895648654145617e-01 9.733703170241895034e-03 -7.214554480053632869e+04 8.642982148063441672e-01 1.050190251747794637e-02 -7.225126977052816073e+04 9.850478153371600154e-01 1.105430779895480095e-02 -7.235699474051999277e+04 8.691397390360924291e-01 1.027746388370191777e-02 -7.246271971051181026e+04 6.381204349157917344e-01 9.442309412733123145e-03 -7.256844468050365685e+04 4.477264473908512676e-01 8.642065290159416449e-03 -7.267416965049547434e+04 3.491532268472096745e-01 8.476578548868914098e-03 -7.277989462048732094e+04 3.247074905688613899e-01 8.597290857401554756e-03 -7.288561959047913842e+04 3.181507011557557218e-01 8.702229120605304083e-03 -7.299134456047097046e+04 3.370053960398645132e-01 9.167774213283255702e-03 -7.309706953046280250e+04 3.661278382403361231e-01 9.595873861250251227e-03 -7.320279450045463454e+04 3.767498574843116121e-01 9.723096675549052978e-03 -7.330851947044646658e+04 3.562424081559920075e-01 9.513077255154647402e-03 -7.341424444043828407e+04 3.046810274015752107e-01 8.676590608036405597e-03 -7.351996941043013067e+04 2.650027695871237099e-01 7.897949809329785076e-03 -7.362569438042194815e+04 2.642180508286832707e-01 8.032809101377377109e-03 -7.373141935041379475e+04 2.347523277806704833e-01 7.529239269088603900e-03 -7.383714432040561223e+04 2.566873090184088047e-01 8.049699776532758672e-03 -7.394286929039744427e+04 2.438382117367899893e-01 7.722917821256130959e-03 -7.404859426038927631e+04 2.566795079729149998e-01 8.080934017260279698e-03 -7.415431923038110835e+04 2.313146245233833886e-01 7.439103563679216012e-03 -7.426004420037294040e+04 2.391278327265358439e-01 7.480397066950293140e-03 -7.436576917036477244e+04 2.534450459823232027e-01 7.873369340064136426e-03 -7.447149414035660448e+04 2.408397888129752973e-01 7.711516695366636524e-03 -7.457721911034842196e+04 2.363149906505465914e-01 7.395430386340105453e-03 -7.468294408034026856e+04 2.408521084421503533e-01 7.539296017698683683e-03 -7.478866905033208604e+04 2.413250397413475024e-01 7.531403037034299121e-03 -7.489439402032391808e+04 2.323314138514395721e-01 7.263109152028564448e-03 -7.500011899031575012e+04 2.361717400037610382e-01 7.399474428122357512e-03 -7.510584396030758217e+04 2.456942484514550440e-01 7.571780232460714050e-03 -7.521156893029941421e+04 2.305472730755449284e-01 7.191782391744863841e-03 -7.531729390029124625e+04 2.371502880297157168e-01 7.339356648455888817e-03 -7.542301887028307829e+04 2.458202222408842341e-01 7.361139870154743449e-03 -7.552874384027489577e+04 2.439157874626672051e-01 7.519381726847823577e-03 -7.563446881026674237e+04 2.375947534507191761e-01 7.333747934590359799e-03 -7.574019378025855985e+04 2.410420323571544343e-01 7.377413878608280080e-03 -7.584591875025039189e+04 2.359958582113838299e-01 7.186734855529825980e-03 -7.595164372024222394e+04 2.525585482654302272e-01 7.537125429777985323e-03 -7.605736869023405598e+04 2.361332724946209882e-01 7.162542383321248048e-03 -7.616309366022588802e+04 2.472639757012290718e-01 7.460733586878003434e-03 -7.626881863021772006e+04 2.374670319181043654e-01 7.230911259685389100e-03 -7.637454360020955210e+04 2.377133334120040964e-01 7.279105957753793932e-03 -7.648026857020136958e+04 2.463204439721720651e-01 7.276349545600669343e-03 -7.658599354019321618e+04 2.340552904772802978e-01 7.197671174938777977e-03 -7.669171851018503367e+04 2.427718478383286971e-01 7.315756348957971542e-03 -7.679744348017686571e+04 2.410396799839986670e-01 7.221883361682949337e-03 -7.690316845016869775e+04 2.430290710315454461e-01 7.278542147309856845e-03 -7.700889342016052979e+04 2.453782500432619418e-01 7.145651332514320157e-03 -7.711461839015236183e+04 2.460795004707207467e-01 7.312836373750168477e-03 -7.722034336014419387e+04 2.506322126461691391e-01 7.329341156010697050e-03 -7.732606833013602591e+04 2.326000375473203097e-01 6.924857692967861453e-03 -7.743179330012784339e+04 2.371863799534748296e-01 7.092686648087046658e-03 -7.753751827011968999e+04 2.350962686126348011e-01 6.858618913559076831e-03 -7.764324324011150748e+04 2.398885737843565735e-01 6.966255265637526922e-03 -7.774896821010333952e+04 2.451457415476965829e-01 7.079026950485624650e-03 -7.785469318009517156e+04 2.357465139735842874e-01 6.935491302873229326e-03 -7.796041815008700360e+04 2.482955512568460199e-01 7.165272563042425491e-03 -7.806614312007883564e+04 2.579952659919894642e-01 7.331858080216594777e-03 -7.817186809007066768e+04 2.357580877260021246e-01 6.955944573799979248e-03 -7.827759306006249972e+04 2.387326096950205534e-01 6.827963616041488049e-03 -7.838331803005431721e+04 2.377390297012521025e-01 6.894557424468043989e-03 -7.848904300004616380e+04 2.325978663694625859e-01 6.758637538622979182e-03 -7.859476797003798129e+04 2.510156945547549756e-01 7.050742079022054992e-03 -7.870049294002982788e+04 2.410020185648097668e-01 6.896972932855464228e-03 -7.880621791002164537e+04 2.437184784725141828e-01 6.948121126756296242e-03 -7.891194288001347741e+04 2.403822860701247122e-01 6.823950602041774574e-03 -7.901766785000530945e+04 2.411202828647301954e-01 6.896484420120215127e-03 -7.912339281999714149e+04 2.432196882574894636e-01 6.882198898675168097e-03 -7.922911778998897353e+04 2.525134198600595958e-01 6.932477344209614194e-03 -7.933484275998079102e+04 2.572305075459423440e-01 7.083047646463017100e-03 -7.944056772997263761e+04 3.059962959215863920e-01 7.823218228023074219e-03 -7.954629269996445510e+04 3.109220276059253552e-01 7.454215216420702686e-03 -7.965201766995630169e+04 3.423045124001402595e-01 8.133094109193298935e-03 -7.975774263994811918e+04 3.721317965819235796e-01 9.095499060880786468e-03 -7.986346760993995122e+04 3.796342766459379070e-01 9.286809394706991086e-03 -7.996919257993178326e+04 4.153995538714082003e-01 1.036711177112782482e-02 -8.007491754992361530e+04 5.578591545498596815e-01 1.324127717263347270e-02 -8.018064251991544734e+04 8.313654796565629335e-01 1.804357946005009927e-02 -8.028636748990727938e+04 1.473474871116151386e+00 2.588674768837821022e-02 -8.039209245989911142e+04 2.741207969815802947e+00 3.680166545196267985e-02 -8.049781742989092891e+04 5.043104836458268458e+00 5.087321139772594397e-02 -8.060354239988277550e+04 8.042368423873497818e+00 6.487018290229588924e-02 -8.070926736987459299e+04 1.025321180349329886e+01 7.287831844081565924e-02 -8.081499233986642503e+04 1.035809483312996271e+01 7.298035572703166773e-02 -8.092071730985825707e+04 8.233308248026094844e+00 6.418759541986544803e-02 -8.102644227985008911e+04 5.530655212605462445e+00 5.163476777821233293e-02 -8.113216724984192115e+04 3.209213480801980989e+00 3.772268470864296314e-02 -8.123789221983375319e+04 1.793660633867060428e+00 2.687197661669621374e-02 -8.134361718982558523e+04 1.039296058302184411e+00 1.901241857062095988e-02 -8.144934215981740272e+04 6.861129352329876641e-01 1.474880629416975598e-02 -8.155506712980924931e+04 4.665652502393312084e-01 1.091846999475652551e-02 -8.166079209980106680e+04 3.523558397407150489e-01 8.839994713502882101e-03 -8.176651706979289884e+04 3.025964446750451509e-01 7.880788467111349282e-03 -8.187224203978473088e+04 2.852017976241553177e-01 7.376697747931950516e-03 -8.197796700977656292e+04 2.464878967511951180e-01 6.487593549472378887e-03 -8.208369197976839496e+04 2.339536070006690838e-01 6.273562726078799404e-03 -8.218941694976022700e+04 2.455048754222482199e-01 6.405690913477673186e-03 -8.229514191975205904e+04 2.356356136406724533e-01 6.189799034224382178e-03 -8.240086688974387653e+04 2.278378584490330927e-01 6.045152587006440668e-03 -8.250659185973572312e+04 2.396966444209003566e-01 6.307047046645785845e-03 -8.261231682972754061e+04 2.471601384548685887e-01 6.505903551660472024e-03 -8.271804179971937265e+04 2.496323325432682483e-01 6.424836453509869157e-03 -8.282376676971120469e+04 2.336682783531549845e-01 6.211629022914649974e-03 -8.292949173970303673e+04 2.444946786618269752e-01 6.262373656545724802e-03 -8.303521670969486877e+04 2.352366266334421641e-01 6.061564226842916167e-03 -8.314094167968670081e+04 2.382641299942638846e-01 6.164429834038020854e-03 -8.324666664967853285e+04 2.320877234714173454e-01 5.980895443700848593e-03 -8.335239161967035034e+04 2.389925257136767123e-01 6.147827151061066239e-03 -8.345811658966219693e+04 2.345558979525924903e-01 6.057484289229989050e-03 -8.356384155965401442e+04 2.348252868332300625e-01 6.014377451267960070e-03 -8.366956652964584646e+04 2.461399257472669244e-01 6.249745663865336094e-03 -8.377529149963767850e+04 2.406096363105013625e-01 6.095866387810814843e-03 -8.388101646962951054e+04 2.399423364132702297e-01 6.030899964468539910e-03 -8.398674143962134258e+04 2.288260142818417664e-01 5.859504195759533338e-03 -8.409246640961317462e+04 2.451044203682479217e-01 6.143105955085933351e-03 -8.419819137960500666e+04 2.370084423993918943e-01 6.054222165161319245e-03 -8.430391634959682415e+04 2.408003240347480201e-01 6.029206526396762612e-03 -8.440964131958867074e+04 2.368322962859423786e-01 5.966048983799226817e-03 -8.451536628958048823e+04 2.435400138652197566e-01 6.096117748840398400e-03 -8.462109125957232027e+04 2.436676850911776715e-01 6.061398050280372707e-03 -8.472681622956415231e+04 2.367936022215952896e-01 5.977744504789799483e-03 -8.483254119955598435e+04 2.501110501592926916e-01 6.196366527209784536e-03 -8.493826616954781639e+04 2.457007801028756599e-01 6.078512582683289096e-03 -8.504399113953964843e+04 2.487889772978331970e-01 6.125255147190282988e-03 -8.514971610953148047e+04 2.472449675321437557e-01 6.083771338994754981e-03 -8.525544107952329796e+04 2.400697231009010224e-01 5.976058777498295151e-03 -8.536116604951514455e+04 2.392628507425957340e-01 5.931779670537819585e-03 -8.546689101950696204e+04 2.391931674535404673e-01 5.937629317052667798e-03 -8.557261598949880863e+04 2.497557835233683299e-01 6.127316394102431084e-03 -8.567834095949062612e+04 2.375431297316757118e-01 5.867843963806084612e-03 -8.578406592948245816e+04 2.306427204332220648e-01 5.655990968933048008e-03 -8.588979089947429020e+04 2.206904839704564303e-01 5.537666411924068756e-03 -8.599551586946612224e+04 2.294210620793566968e-01 5.697881282542336875e-03 -8.610124083945795428e+04 2.421152580215145678e-01 5.979245733795772628e-03 -8.620696580944977177e+04 2.404450197650475629e-01 5.947863193454529587e-03 -8.631269077944161836e+04 2.307972326460711876e-01 5.773386925432368033e-03 -8.641841574943343585e+04 2.403389077662139717e-01 5.861365887473076255e-03 -8.652414071942528244e+04 2.269348731629952098e-01 5.602775845046996731e-03 -8.662986568941709993e+04 2.430935400541101854e-01 5.897626787990928147e-03 -8.673559065940893197e+04 2.348799495612539923e-01 5.659449974100525492e-03 -8.684131562940076401e+04 2.365161181559104764e-01 5.768053294236968540e-03 -8.694704059939259605e+04 2.337632740001418241e-01 5.752009131723182477e-03 -8.705276556938442809e+04 2.373233527525830111e-01 5.839073995411643916e-03 -8.715849053937626013e+04 2.402497228948280161e-01 5.778013388161470226e-03 -8.726421550936809217e+04 2.316870022365891957e-01 5.658283519361276270e-03 -8.736994047935990966e+04 2.226372732939911059e-01 5.500040400288682720e-03 -8.747566544935175625e+04 2.388502251010291288e-01 5.838786618061124305e-03 -8.758139041934357374e+04 2.370069226615016678e-01 5.689346160030188393e-03 -8.768711538933540578e+04 2.307834234430485576e-01 5.566091140431212239e-03 -8.779284035932723782e+04 2.413169279612240037e-01 5.791441628023761071e-03 -8.789856532931906986e+04 2.454781859327216376e-01 5.865499418128019768e-03 -8.800429029931090190e+04 2.374575552942649326e-01 5.723775170360712906e-03 -8.811001526930273394e+04 2.435217500028152293e-01 5.798070332863233291e-03 -8.821574023929456598e+04 2.328867761961038174e-01 5.686781427551678217e-03 -8.832146520928638347e+04 2.337886154291392016e-01 5.659524586786045947e-03 -8.842719017927823006e+04 2.375972238070387377e-01 5.679671876606879818e-03 -8.853291514927004755e+04 2.394729821607527176e-01 5.788272337189972680e-03 -8.863864011926187959e+04 2.369502933652910537e-01 5.697304047220391916e-03 -8.874436508925371163e+04 2.350972888665391614e-01 5.651524479901677209e-03 -8.885009005924554367e+04 2.407541071699346447e-01 5.791881212905373479e-03 -8.895581502923737571e+04 2.391641278084239985e-01 5.699080212918077731e-03 -8.906153999922920775e+04 2.450211087409890354e-01 5.773182036722817462e-03 -8.916726496922103979e+04 2.377135798376047437e-01 5.675863682197206453e-03 -8.927298993921285728e+04 2.324202964136028726e-01 5.566150524785151710e-03 -8.937871490920470387e+04 2.429761507360285455e-01 5.823274463259879921e-03 -8.948443987919652136e+04 2.445811674465853125e-01 5.810739952868228426e-03 -8.959016484918835340e+04 2.341448591939206403e-01 5.685844510635655949e-03 -8.969588981918018544e+04 2.403274391225742879e-01 5.750327600288412250e-03 -8.980161478917201748e+04 2.370903619558431541e-01 5.650924503292365994e-03 -8.990733975916384952e+04 2.361199791623728172e-01 5.600204627420560938e-03 -9.001306472915568156e+04 2.406118207138208953e-01 5.643368669133234233e-03 -9.011878969914751360e+04 2.317881209352611604e-01 5.643591908891861832e-03 -9.022451466913933109e+04 2.436038669601931217e-01 5.703336588682181817e-03 -9.033023963913117768e+04 2.390256593737383195e-01 5.786621728839469285e-03 -9.043596460912299517e+04 2.364102719997014102e-01 5.562892204952777676e-03 -9.054168957911482721e+04 2.410219177063288587e-01 5.615169409368177093e-03 -9.064741454910665925e+04 2.369113859855961901e-01 5.683217750834232418e-03 -9.075313951909849129e+04 2.517447063183702038e-01 5.775455119853254576e-03 -9.085886448909032333e+04 2.337340869846782077e-01 5.566022650512602449e-03 -9.096458945908215537e+04 2.438294856925670162e-01 5.806328964853373770e-03 -9.107031442907398741e+04 2.387718635366549158e-01 5.666253855737463097e-03 -9.117603939906580490e+04 2.377451754527614147e-01 5.605067981213939128e-03 -9.128176436905765149e+04 2.288605441536659679e-01 5.442041245622958497e-03 -9.138748933904946898e+04 2.437250376968907450e-01 5.717631887941590843e-03 -9.149321430904131557e+04 2.375473900600935107e-01 5.638547299936964852e-03 -9.159893927903313306e+04 2.379673524457187050e-01 5.582334420086958703e-03 -9.170466424902496510e+04 2.361511592410139027e-01 5.589286556559362566e-03 -9.181038921901679714e+04 2.430588409591417087e-01 5.642370895227611510e-03 -9.191611418900862918e+04 2.275545570439921339e-01 5.388609385600122079e-03 -9.202183915900046122e+04 2.385677481839061087e-01 5.559247976726948252e-03 -9.212756412899227871e+04 2.437213383119481713e-01 5.590614211003942444e-03 -9.223328909898412530e+04 2.453600152973225978e-01 5.419510668390434792e-03 -9.233901406897594279e+04 2.737756420638410848e-01 5.702317117563152071e-03 -9.244473903896778938e+04 3.081844780089277869e-01 5.854057971074013919e-03 -9.255046400895960687e+04 3.592132359059781455e-01 6.140191930195268606e-03 -9.265618897895143891e+04 4.222663915332037221e-01 6.239837015851271498e-03 -9.276191394894327095e+04 5.348300451628769103e-01 6.723585138884169594e-03 -9.286763891893510299e+04 6.406239570142734374e-01 6.827709790649732699e-03 -9.297336388892693503e+04 8.145394280585551705e-01 7.143460009505667001e-03 -9.307908885891876707e+04 1.021051973935370727e+00 7.779014997123303091e-03 -9.318481382891059911e+04 1.187690355615206306e+00 7.963936312436076595e-03 -9.329053879890241660e+04 1.263014984832801391e+00 8.262775998490517679e-03 -9.339626376889426319e+04 1.198687082370358370e+00 8.143059112722875539e-03 -9.350198873888608068e+04 1.015876699144417250e+00 7.828165027742724560e-03 -9.360771370887791272e+04 7.858581231759373953e-01 7.145831037782050116e-03 -9.371343867886974476e+04 6.240610121610272731e-01 6.806930540899180579e-03 -9.381916364886157680e+04 4.877247334248596689e-01 6.285620186560929475e-03 -9.392488861885340884e+04 4.010336397971520084e-01 6.167053704785157783e-03 -9.403061358884524088e+04 3.447646094505456560e-01 6.000139250729370245e-03 -9.413633855883707292e+04 3.095222233611519824e-01 6.040685168834409625e-03 -9.424206352882889041e+04 2.740925886007472001e-01 5.656714035931697908e-03 -9.434778849882073700e+04 2.594715925283435087e-01 5.795690387992232136e-03 -9.445351346881255449e+04 2.364548370020411183e-01 5.502525380914707193e-03 -9.455923843880438653e+04 2.471429249849227128e-01 5.637767660154347979e-03 -9.466496340879621857e+04 2.360738740695893789e-01 5.667312208123535637e-03 -9.477068837878805061e+04 2.345570731822971822e-01 5.551072189621604654e-03 -9.487641334877988265e+04 2.330107325828433551e-01 5.580343626093909985e-03 -9.498213831877171469e+04 2.369621361794074232e-01 5.591188826635389020e-03 -9.508786328876354673e+04 2.507091394633882420e-01 5.901181114321148169e-03 -9.519358825875536422e+04 2.373756536455611799e-01 5.751537744745481573e-03 -9.529931322874721081e+04 2.544784013014544377e-01 5.907797031350188292e-03 -9.540503819873902830e+04 2.598175259488404998e-01 6.082544255285763507e-03 -9.551076316873086034e+04 2.718343593564854777e-01 6.276356764268403200e-03 -9.561648813872269238e+04 2.911416657991320878e-01 6.499871865511324016e-03 -9.572221310871452442e+04 3.182082377666529682e-01 6.858485720755752926e-03 -9.582793807870635646e+04 3.522996397956210668e-01 7.219076731684241459e-03 -9.593366304869818850e+04 3.923307490198521541e-01 7.643881654871283876e-03 -9.603938801869002054e+04 4.195493494083159525e-01 7.787805108355341267e-03 -9.614511298868183803e+04 4.382542207199987550e-01 7.917172500626666956e-03 -9.625083795867368462e+04 4.441632100543953521e-01 7.986979750250179644e-03 -9.635656292866550211e+04 4.528274707933922505e-01 8.323598426441976977e-03 -9.646228789865733415e+04 3.971776348057954875e-01 7.765793695204168540e-03 -9.656801286864916619e+04 3.506819778547104471e-01 7.330343431917187361e-03 -9.667373783864099823e+04 3.170653238135352492e-01 6.858906489805019144e-03 -9.677946280863283027e+04 2.912529940561455755e-01 6.560287641119968462e-03 -9.688518777862466231e+04 2.682618944586948051e-01 6.258661951105946170e-03 -9.699091274861649435e+04 2.648235495667780603e-01 6.280506626733435918e-03 -9.709663771860831184e+04 2.518872884080502472e-01 6.035261236302504571e-03 -9.720236268860015844e+04 2.389958973492171124e-01 5.899406852002886913e-03 -9.730808765859197592e+04 2.364104984899290107e-01 5.841023455327993066e-03 -9.741381262858380796e+04 2.307459548659116233e-01 5.709728633474603354e-03 -9.751953759857564000e+04 2.229411665132003395e-01 5.570612857073969915e-03 -9.762526256856747204e+04 2.340699739984347105e-01 5.876982998811500734e-03 -9.773098753855930408e+04 2.328910724734198079e-01 5.737875461305897047e-03 -9.783671250855113612e+04 2.246149580691099990e-01 5.650782980472352640e-03 -9.794243747854296817e+04 2.401301492041913177e-01 5.962347048141213024e-03 -9.804816244853478565e+04 2.157769709367049482e-01 5.692628869955048895e-03 -9.815388741852663225e+04 2.350765370705859003e-01 5.864369502435934356e-03 -9.825961238851844973e+04 2.255989885899820635e-01 5.797651525432546450e-03 -9.836533735851029633e+04 2.296883309303234810e-01 5.911374282315119688e-03 -9.847106232850211381e+04 2.305515457433224003e-01 5.922711437140970765e-03 -9.857678729849394585e+04 2.383085337707525897e-01 6.022611818090311403e-03 -9.868251226848577789e+04 2.189971320380158515e-01 5.679411800341331064e-03 -9.878823723847760994e+04 2.313617429149878446e-01 5.953381086401097859e-03 -9.889396220846944198e+04 2.274673896045601995e-01 5.811645043784190515e-03 -9.899968717846125946e+04 2.321753932549352750e-01 5.820734102301607440e-03 -9.910541214845310606e+04 2.340574988084984376e-01 5.985651147788535568e-03 -9.921113711844492354e+04 2.303271387237815215e-01 6.076603384398978659e-03 -9.931686208843677014e+04 2.287798427792104017e-01 5.941326633159602251e-03 -9.942258705842858762e+04 2.256665976846416732e-01 5.956332365536105670e-03 -9.952831202842041967e+04 2.312458095200239649e-01 5.907921288510625119e-03 -9.963403699841225171e+04 2.297004475257611589e-01 6.145843739233356612e-03 -9.973976196840408375e+04 2.288671816537979631e-01 5.966620419993537081e-03 -9.984548693839591579e+04 2.388256075497229292e-01 6.285702798921793955e-03 -9.995121190838773327e+04 2.335779916343460605e-01 6.164724891526741218e-03 -1.000569368783795799e+05 2.239580858064132707e-01 5.946700673057494363e-03 -1.001626618483713974e+05 2.316452235763014622e-01 6.154296597388992512e-03 -1.002683868183632439e+05 2.311031894870776149e-01 6.165714759998346464e-03 -1.003741117883550614e+05 2.236115124158718492e-01 5.882089544053322426e-03 -1.004798367583469080e+05 2.290005209915749462e-01 6.044249939734342228e-03 -1.005855617283387255e+05 2.307129197114163033e-01 6.166549799206184207e-03 -1.006912866983305576e+05 2.297576730505376252e-01 6.246878357195702683e-03 -1.007970116683223896e+05 2.285435988180871680e-01 6.192697885928176785e-03 -1.009027366383142071e+05 2.426466863057535339e-01 6.433807565335675563e-03 -1.010084616083060537e+05 2.322134895635103169e-01 6.223778818646836207e-03 -1.011141865782978712e+05 2.262876807352516839e-01 6.080653956078929667e-03 -1.012199115482897178e+05 2.312682009742838551e-01 6.260574225151128297e-03 -1.013256365182815352e+05 2.299602088984619985e-01 6.110629787233240635e-03 -1.014313614882733818e+05 2.350825250702631708e-01 6.263197210841614862e-03 -1.015370864582651993e+05 2.292658099525866633e-01 6.102619473427516907e-03 -1.016428114282570314e+05 2.382583320982571973e-01 6.510185964401254965e-03 -1.017485363982488634e+05 2.419109093770879515e-01 6.268555131598419101e-03 -1.018542613682406809e+05 2.324982947943358413e-01 6.020019018562958180e-03 -1.019599863382325275e+05 2.430377891945013913e-01 6.293873883329180810e-03 -1.020657113082243450e+05 2.505085624770104769e-01 6.280520708516761259e-03 -1.021714362782161916e+05 2.433078002962065223e-01 6.282476350770776520e-03 -1.022771612482080091e+05 2.343100481767358412e-01 6.137374708541759247e-03 -1.023828862181998556e+05 2.393585515761680327e-01 6.262944741928986453e-03 -1.024886111881916731e+05 2.431825573720217404e-01 6.398591585564804458e-03 -1.025943361581835052e+05 2.374256886147133594e-01 6.373977124849615310e-03 -1.027000611281753372e+05 2.410658011972425241e-01 6.452623648913712040e-03 -1.028057860981671547e+05 2.335589672489657986e-01 6.346022627168703897e-03 -1.029115110681590013e+05 2.339626360777678216e-01 6.487341697871127841e-03 -1.030172360381508188e+05 2.327613643532314147e-01 6.526402143707070273e-03 -1.031229610081426654e+05 2.208691610965225760e-01 6.376730702086200533e-03 -1.032286859781344829e+05 2.197153270163706984e-01 6.340199256212709390e-03 -1.033344109481263295e+05 2.293615732521382955e-01 6.586131772271927240e-03 -1.034401359181181469e+05 2.310672098493448123e-01 6.750342315769809060e-03 -1.035458608881099935e+05 2.296997192109805908e-01 6.746560892120990333e-03 -1.036515858581018110e+05 2.302020994947862886e-01 6.706354136747504253e-03 -1.037573108280936285e+05 2.383293872596527474e-01 6.919917411065683484e-03 -1.038630357980854751e+05 2.335601218870987095e-01 6.804538320995087881e-03 -1.039687607680772926e+05 2.215478213653629125e-01 6.434975078281260710e-03 -1.040744857380691392e+05 2.143012720665207205e-01 6.264898756892499712e-03 -1.041802107080609567e+05 2.273013957905303806e-01 6.661120274960655348e-03 -1.042859356780528033e+05 2.193324539328596057e-01 6.455944092060404357e-03 -1.043916606480446208e+05 2.295383953897203733e-01 6.836434560928441456e-03 -1.044973856180364673e+05 2.292223961260936860e-01 6.899520428901160379e-03 -1.046031105880282848e+05 2.292273568223362201e-01 6.782607534439063710e-03 -1.047088355580201023e+05 2.137427054412775196e-01 6.361090236644106020e-03 -1.048145605280119489e+05 2.248308511918960251e-01 6.703435185843221664e-03 -1.049202854980037664e+05 2.254243273176077533e-01 6.829152832446847357e-03 -1.050260104679956130e+05 2.219965918322654164e-01 6.630801406094279267e-03 -1.051317354379874305e+05 2.237002337771973326e-01 6.662808379764053636e-03 -1.052374604079792771e+05 2.369900256987922671e-01 7.118081067792656966e-03 -1.053431853779710946e+05 2.199046216077362170e-01 6.654801020810978927e-03 -1.054489103479629412e+05 2.250291597863849635e-01 6.684804827919914837e-03 -1.055546353179547586e+05 2.170866207581369500e-01 6.570274517038433848e-03 -1.056603602879465761e+05 2.281948182285441218e-01 7.041862429548173367e-03 -1.057660852579384227e+05 2.176046723047871112e-01 6.707607620595036277e-03 -1.058718102279302402e+05 2.183754595916245489e-01 6.667688779732296699e-03 -1.059775351979220868e+05 2.107087480033515703e-01 6.565000110724012947e-03 -1.060832601679139043e+05 2.277276989404456997e-01 6.970193527055869830e-03 -1.061889851379057509e+05 2.323321408174894298e-01 7.024816656435557520e-03 -1.062947101078975684e+05 2.240945977330833505e-01 6.963764295625812784e-03 -1.064004350778894150e+05 2.190521276413318064e-01 6.931496109055897657e-03 -1.065061600478812325e+05 2.182555902798008207e-01 6.913118294931691263e-03 -1.066118850178730645e+05 2.284147591131344135e-01 7.173747424792554714e-03 -1.067176099878648965e+05 2.216658641119720885e-01 6.853382037370663732e-03 -1.068233349578567140e+05 2.245846651707050778e-01 7.060912605954450597e-03 -1.069290599278485606e+05 2.201857447807886170e-01 6.858302109089594277e-03 -1.070347848978403781e+05 2.271832321980436775e-01 7.161301617186700309e-03 -1.071405098678322247e+05 2.462510995047789142e-01 7.690881139474047001e-03 -1.072462348378240422e+05 2.212714086609266773e-01 7.026626016188081483e-03 -1.073519598078158888e+05 2.240503345296331328e-01 7.111623880393032858e-03 -1.074576847778077063e+05 2.256279906000076552e-01 7.162638131500760619e-03 -1.075634097477995383e+05 2.230171962356684023e-01 7.062820875646158916e-03 -1.076691347177913703e+05 2.196314236755727012e-01 7.156715455880737799e-03 -1.077748596877831878e+05 2.267623424608512517e-01 7.130809225217230388e-03 -1.078805846577750344e+05 2.124526046635991650e-01 6.812625277766074135e-03 -1.079863096277668519e+05 2.145295081500096235e-01 6.898412477966332779e-03 -1.080920345977586985e+05 2.147733659805458051e-01 7.074021063863481125e-03 -1.081977595677505160e+05 2.187021494605794480e-01 7.090452733078881145e-03 -1.083034845377423626e+05 2.284166675311083694e-01 7.393991313100398838e-03 -1.084092095077341801e+05 2.216610952638484178e-01 7.067834417254371081e-03 -1.085149344777260121e+05 2.258901595805957729e-01 7.477517737698123439e-03 -1.086206594477178442e+05 2.224200665732038174e-01 7.257691925779645795e-03 -1.087263844177096616e+05 2.174888260659025574e-01 7.247761601814843753e-03 -1.088321093877015082e+05 2.207969087907420414e-01 7.036425693859255440e-03 -1.089378343576933257e+05 2.298860575850922294e-01 7.376232007234931332e-03 -1.090435593276851723e+05 2.223733906094225443e-01 7.124848135690415099e-03 -1.091492842976769898e+05 2.157596742439404358e-01 7.089300378063738937e-03 -1.092550092676688364e+05 2.163072156326687479e-01 7.168115185170145787e-03 -1.093607342376606539e+05 2.248962639339047997e-01 7.504057804953481216e-03 -1.094664592076524859e+05 2.291051618778167376e-01 7.576486314683079405e-03 -1.095721841776443180e+05 2.284851753257101936e-01 7.519608560451891167e-03 -1.096779091476361355e+05 2.198076624353832720e-01 7.465522592580624804e-03 -1.097836341176279821e+05 2.162273109030391771e-01 7.150240251585298148e-03 -1.098893590876197995e+05 2.214048861968398174e-01 7.254973483565122470e-03 -1.099950840576116461e+05 2.426720632022522361e-01 7.913003161625046730e-03 -1.101008090276034636e+05 2.274097874681288156e-01 7.533842691924477579e-03 -1.102065339975953102e+05 2.167534422469586941e-01 7.231434281560007206e-03 -1.103122589675871277e+05 2.261989197166907051e-01 7.527478070727361241e-03 -1.104179839375789743e+05 2.266514433375358406e-01 7.620635985141617323e-03 -1.105237089075707918e+05 2.197747238652564272e-01 7.508891854202340982e-03 -1.106294338775626093e+05 2.204664089261318682e-01 7.436988419635218346e-03 -1.107351588475544559e+05 2.189127393752144657e-01 7.468331491131314365e-03 -1.108408838175462733e+05 2.305460752907467215e-01 7.971748104857637185e-03 -1.109466087875381199e+05 2.369333239399126489e-01 8.037860554438251356e-03 -1.110523337575299374e+05 2.385332862173387136e-01 7.973590071989521133e-03 -1.111580587275217840e+05 2.489255693347435794e-01 8.301746816438986334e-03 -1.112637836975136015e+05 2.502625757375911975e-01 8.425362960017231118e-03 -1.113695086675054481e+05 2.578731142392921560e-01 8.553317262614126143e-03 -1.114752336374972656e+05 2.783928831098771983e-01 9.038342218383236398e-03 -1.115809586074890831e+05 2.940136382637022483e-01 9.561708122842934102e-03 -1.116866835774809297e+05 3.039598688963775497e-01 9.564626116408044346e-03 -1.117924085474727472e+05 3.213789513649180640e-01 1.012629775420946336e-02 -1.118981335174645938e+05 3.744234085002342560e-01 1.139622860784857659e-02 -1.120038584874564112e+05 4.095557231282768718e-01 1.230421915220622324e-02 -1.121095834574482578e+05 4.325357543290219153e-01 1.245415885124057272e-02 -1.122153084274400753e+05 4.612958252484533062e-01 1.320052671027970893e-02 -1.123210333974319219e+05 5.772103333209712694e-01 1.665036106728259163e-02 -1.124267583674237394e+05 6.499774076710906900e-01 1.791095037450700367e-02 -1.125324833374155569e+05 8.297930724697216709e-01 2.097491604884949012e-02 -1.126382083074074035e+05 9.700608517550691756e-01 2.373181786529523357e-02 -1.127439332773992210e+05 1.334826252196155139e+00 2.868718979847906941e-02 -1.128496582473910676e+05 1.740799059206852295e+00 3.465905153190305954e-02 -1.129553832173828851e+05 2.261733757864666128e+00 3.997068205554018400e-02 -1.130611081873747316e+05 2.934555419106620100e+00 4.561368423033982517e-02 -1.131668331573665491e+05 3.658561173134416755e+00 5.156095187136472413e-02 -1.132725581273583957e+05 4.338599706711704584e+00 5.604804958740713938e-02 -1.133782830973502132e+05 4.914494997423563660e+00 5.932896219697691986e-02 -1.134840080673420453e+05 5.628669039580987743e+00 6.368528337614128010e-02 -1.135897330373338773e+05 6.093457575098121914e+00 6.580926972621979620e-02 -1.136954580073256948e+05 6.383661640791628678e+00 6.761848572438522442e-02 -1.138011829773175414e+05 6.783411891501448743e+00 7.006458183512596916e-02 -1.139069079473093589e+05 6.819194956335646651e+00 7.102551105980797752e-02 -1.140126329173012055e+05 6.609649730121343048e+00 6.951069944138665857e-02 -1.141183578872930229e+05 6.775060196860873241e+00 7.094684415763233276e-02 -1.142240828572848695e+05 6.831562996680222710e+00 7.148852451988071954e-02 -1.143298078272766870e+05 6.586404075418719195e+00 7.034701943301942262e-02 -1.144355327972685191e+05 6.670130349179557605e+00 7.059834834001088577e-02 -1.145412577672603511e+05 6.638707675027411881e+00 7.068220854830475908e-02 -1.146469827372521686e+05 6.505260349655211272e+00 6.979251512627378251e-02 -1.147527077072440152e+05 6.251884719974541760e+00 6.830668441725853968e-02 -1.148584326772358327e+05 5.984348050504031846e+00 6.740343448734857634e-02 -1.149641576472276793e+05 5.439807090488378627e+00 6.355507706906417253e-02 -1.150698826172194968e+05 4.793800556136482705e+00 5.876385766252443382e-02 -1.151756075872113433e+05 4.293366235200997139e+00 5.667753128224114340e-02 -1.152813325572031608e+05 3.583336159790688757e+00 5.185109396863247372e-02 -1.153870575271949929e+05 2.868124369921182026e+00 4.611286905458601704e-02 -1.154927824971868249e+05 2.312533944751546944e+00 4.132685461323091364e-02 -1.155985074671786424e+05 1.786913937516891426e+00 3.599282015884298913e-02 -1.157042324371704890e+05 1.382257900403568662e+00 3.171434826178856636e-02 -1.158099574071623065e+05 1.042569936838993128e+00 2.668688524345145391e-02 -1.159156823771541531e+05 7.799166180016225969e-01 2.207789100471631988e-02 -1.160214073471459706e+05 5.976875264410026478e-01 1.852447940256848197e-02 -1.161271323171378172e+05 5.064300264027586929e-01 1.640934489694750517e-02 -1.162328572871296346e+05 3.962116236569352967e-01 1.391994093734208633e-02 -1.163385822571214812e+05 3.329170334288482080e-01 1.203463122487609047e-02 -1.164443072271132987e+05 3.017420298364422715e-01 1.098739890631990172e-02 -1.165500321971051162e+05 2.652487468568870965e-01 9.799915324755808371e-03 -1.166557571670969628e+05 2.591749875649940749e-01 9.837543952070135211e-03 -1.167614821370887803e+05 2.441859006984713476e-01 9.002772600727229277e-03 -1.168672071070806269e+05 2.375954022953338518e-01 8.871220761366496732e-03 -1.169729320770724444e+05 2.404334651965049363e-01 8.849940207776621146e-03 -1.170786570470642910e+05 2.200378487134159178e-01 8.192574042744961427e-03 -1.171843820170561085e+05 2.554628528064570858e-01 9.146554059431622266e-03 -1.172901069870479550e+05 2.402345262870869969e-01 8.927084950318001436e-03 -1.173958319570397725e+05 2.223830941370235348e-01 8.238663235775855673e-03 -1.175015569270315900e+05 2.156714715390434522e-01 8.288753662859365753e-03 -1.176072818970234366e+05 2.144975533566969850e-01 8.089387836981216939e-03 -1.177130068670152541e+05 2.222523115257560300e-01 8.382666999938129249e-03 -1.178187318370071007e+05 2.247122374664604350e-01 8.527413637404647473e-03 -1.179244568069989182e+05 2.176991314704052327e-01 8.289646023031281216e-03 -1.180301817769907648e+05 2.202914916945064305e-01 8.320446291019545706e-03 -1.181359067469825823e+05 2.262941688769418702e-01 8.470290334371148935e-03 -1.182416317169744289e+05 2.163303455132120634e-01 8.200087863822798015e-03 -1.183473566869662463e+05 2.253529041357771601e-01 8.485746369038572878e-03 -1.184530816569580638e+05 2.153499840044142410e-01 8.222166384983095253e-03 -1.185588066269499104e+05 2.041143242015868164e-01 7.939314386426732026e-03 -1.186645315969417279e+05 2.209486178069004492e-01 8.504295104284041729e-03 -1.187702565669335745e+05 2.231067037839766509e-01 8.422231363233291176e-03 -1.188759815369253920e+05 2.218412548674120743e-01 8.485103294017847311e-03 -1.189817065069172386e+05 2.157033484859799954e-01 8.156913895739323003e-03 -1.190874314769090561e+05 2.078469953472356913e-01 8.083721380256607761e-03 -1.191931564469009027e+05 2.101531620564707770e-01 8.214911401571690919e-03 -1.192988814168927202e+05 2.184732438751674777e-01 8.376701961007622724e-03 -1.194046063868845376e+05 2.132863965792252126e-01 8.245373751325613121e-03 -1.195103313568763842e+05 2.128789276299013211e-01 8.525464556040345671e-03 -1.196160563268682017e+05 2.301955929833881254e-01 8.831706168314263500e-03 -1.197217812968600483e+05 2.062005398636251319e-01 8.055834012324869856e-03 -1.198275062668518658e+05 2.256572161908273200e-01 8.949993127757290695e-03 -1.199332312368437124e+05 2.207237400361440616e-01 8.555612465914184603e-03 -1.200389562068355299e+05 2.351981671126369411e-01 9.640919642585430577e-03 -1.201446811768273765e+05 2.324430913244192320e-01 9.041065208960108804e-03 -1.202504061468191940e+05 2.303221807871182747e-01 8.924024510082954192e-03 -1.203561311168110406e+05 2.275659094798652415e-01 8.867316931710363462e-03 -1.204618560868028580e+05 2.248402975871915954e-01 8.677478100208187856e-03 -1.205675810567946755e+05 2.184323348598804504e-01 8.758614215015282992e-03 -1.206733060267865221e+05 2.317178357512484355e-01 9.056218496695278217e-03 -1.207790309967783396e+05 2.124165120819478947e-01 8.682584140491455410e-03 -1.208847559667701862e+05 2.243497803893636233e-01 9.103269878316555541e-03 -1.209904809367620037e+05 2.280121304650390146e-01 8.829331062745032419e-03 -1.210962059067538503e+05 2.187342705615127336e-01 8.657291970720432106e-03 -1.212019308767456678e+05 2.398898227276120010e-01 9.634962908160054490e-03 -1.213076558467374853e+05 2.316024270351623449e-01 9.097278465358323365e-03 -1.214133808167293319e+05 2.258060026264544218e-01 8.731425467288339223e-03 -1.215191057867211493e+05 2.238943740466861898e-01 8.948038859518397600e-03 -1.216248307567129959e+05 2.059461437445352372e-01 8.478657054053694367e-03 -1.217305557267048134e+05 2.144192111066511031e-01 8.694261319514810446e-03 -1.218362806966966600e+05 2.227939529094750126e-01 9.058414468026574837e-03 -1.219420056666884775e+05 2.394265429210962193e-01 9.303432036005721342e-03 -1.220477306366803241e+05 2.271891986129690733e-01 9.241446051595438374e-03 -1.221534556066721416e+05 2.275607329655660593e-01 8.960339716086410111e-03 -1.222591805766639882e+05 2.160697972488861696e-01 9.052624894128865132e-03 -1.223649055466558057e+05 2.090149333117529151e-01 8.499604092621397544e-03 -1.224706305166476232e+05 2.315773871433376430e-01 9.148042180670541354e-03 -1.225763554866394697e+05 2.356176745955541607e-01 9.328286248841258232e-03 -1.226820804566312872e+05 2.023163927594236466e-01 8.450429502534365436e-03 -1.227878054266231338e+05 2.195085832688976890e-01 9.282767907360446255e-03 -1.228935303966149513e+05 2.354113633245441539e-01 9.360077047676763212e-03 -1.229992553666067979e+05 2.040771835439862958e-01 8.506602654178671563e-03 -1.231049803365986154e+05 2.223674949341691298e-01 9.231909884003680969e-03 -1.232107053065904620e+05 2.178303662504975646e-01 8.829362445309671403e-03 -1.233164302765822795e+05 2.313766398051848860e-01 9.279331370126042700e-03 -1.234221552465740970e+05 2.111630908041708110e-01 8.553477002482748684e-03 -1.235278802165659436e+05 2.187891170546616137e-01 9.050681020963088561e-03 -1.236336051865577610e+05 2.137452986604335414e-01 8.960600075031284126e-03 -1.237393301565496076e+05 2.204680841826383297e-01 9.051132631252130356e-03 -1.238450551265414251e+05 2.247560191533417018e-01 9.195171014808345769e-03 -1.239507800965332717e+05 2.317509032874050245e-01 9.485755505930365539e-03 -1.240565050665250892e+05 2.135759393129103567e-01 8.724028395751577333e-03 -1.241622300365169358e+05 2.230356342331409336e-01 9.211068580953397575e-03 -1.242679550065087533e+05 2.289045600554253657e-01 9.696828534352065418e-03 -1.243736799765005708e+05 2.228165592345090207e-01 9.290548745217463295e-03 -1.244794049464924174e+05 2.084372276899973397e-01 8.726235123248446759e-03 -1.245851299164842349e+05 2.249115756404905242e-01 9.491095211002656060e-03 -1.246908548864760814e+05 2.259690825957728078e-01 9.077627390589881190e-03 -1.247965798564678989e+05 2.071356471813606825e-01 8.622041275204618202e-03 -1.249023048264597455e+05 2.287892385057558042e-01 9.578086182026865347e-03 -1.250080297964515630e+05 2.207825433874555932e-01 9.255014279901812441e-03 -1.251137547664434096e+05 2.258863036783118339e-01 9.657414854847416394e-03 -1.252194797364352271e+05 2.096245198315886682e-01 8.875144621501967687e-03 -1.253252047064270446e+05 2.252686974842575407e-01 9.271972968076358512e-03 -1.254309296764188912e+05 2.187826556545689194e-01 9.026620807967213056e-03 -1.255366546464107087e+05 2.365761774561976061e-01 9.847842720708628941e-03 -1.256423796164025553e+05 2.224118147960971736e-01 9.503129738164981313e-03 -1.257481045863943727e+05 2.138064115151800393e-01 9.118128089499065794e-03 -1.258538295563862193e+05 2.482629497474752867e-01 1.010066299061661461e-02 -1.259595545263780368e+05 2.207166099696870054e-01 9.147919766525078669e-03 -1.260652794963698834e+05 2.243406531358708711e-01 9.209123491555191998e-03 -1.261710044663617009e+05 2.288595193438521802e-01 9.444793531526772187e-03 -1.262767294363535184e+05 2.189241429910153136e-01 9.094435346032875636e-03 -1.263824544063453650e+05 2.314572964219691054e-01 9.695287534665796361e-03 -1.264881793763371825e+05 2.169751523227949619e-01 9.053150415157390496e-03 -1.265939043463290291e+05 2.342480896167123960e-01 9.923156924957456798e-03 -1.266996293163208466e+05 2.230879153378876878e-01 9.509992661107949732e-03 -1.268053542863126931e+05 2.335441693595659285e-01 9.918842364248987506e-03 -1.269110792563045106e+05 2.218909041712402719e-01 9.292974531301149629e-03 -1.270168042262963572e+05 2.084503936562527859e-01 9.009991753653702126e-03 -1.271225291962881747e+05 2.234813535659227746e-01 9.374389256488929387e-03 -1.272282541662800213e+05 2.355269707333294549e-01 9.988462269370151220e-03 -1.273339791362718388e+05 2.194846223947048980e-01 9.486598415590906039e-03 -1.274397041062636563e+05 2.138723902048775549e-01 9.257286540708941150e-03 -1.275454290762555029e+05 2.209127362430622632e-01 9.665130439337896867e-03 -1.276511540462473204e+05 2.210549334536791588e-01 9.331882907159564158e-03 -1.277568790162391670e+05 2.223949588780788078e-01 9.528901741107747431e-03 -1.278626039862309844e+05 2.180547158738130320e-01 9.307857837490428679e-03 -1.279683289562228310e+05 2.198326746820335742e-01 9.319363106504491637e-03 -1.280740539262146485e+05 2.305519119937660399e-01 9.862387764340401972e-03 -1.281797788962064660e+05 2.274317320891862393e-01 9.942075584247686559e-03 -1.282855038661983126e+05 2.053671548021328286e-01 9.300173090999600337e-03 -1.283912288361901301e+05 2.388033615983886915e-01 1.080940696919313604e-02 -1.284969538061819767e+05 2.437059220798022952e-01 1.114903099291441810e-02 -1.286026787761737942e+05 2.460141998668553265e-01 1.144260374128189435e-02 -1.287084037461656408e+05 2.558842268307560119e-01 1.077598950523712962e-02 -1.288141287161574583e+05 2.478323170337098924e-01 1.133126734666561539e-02 -1.289198536861493048e+05 2.869324365246377906e-01 1.314048565519590830e-02 -1.290255786561411223e+05 3.133253902027609561e-01 1.485399050108035350e-02 -1.291313036261329689e+05 3.522136160514384717e-01 1.557705152527841426e-02 -1.292370285961247864e+05 3.979548875337485248e-01 1.841824653445779669e-02 -1.293427535661166039e+05 4.898672851196529954e-01 1.994449672072443752e-02 -1.294484785361084505e+05 6.195159505582389370e-01 2.342891079027479423e-02 -1.295542035061002680e+05 8.271246993829881600e-01 2.882285201018386367e-02 -1.296599284760921146e+05 1.091723254033132529e+00 3.402762159262347208e-02 -1.297656534460839321e+05 1.330634795445736263e+00 3.755206155146765395e-02 -1.298713784160757787e+05 1.746838338557887615e+00 4.386598931703151322e-02 -1.299771033860675961e+05 2.162094919985972918e+00 4.941425748839173293e-02 -1.300828283560594427e+05 2.775822194626114570e+00 5.696113046341477054e-02 -1.301885533260512602e+05 3.241105289386324362e+00 6.090589138067965119e-02 -1.302942782960430777e+05 4.024725253232925404e+00 6.904691260174526668e-02 -1.304000032660349243e+05 4.619247908685898629e+00 7.364484699216285180e-02 -1.305057282360267418e+05 5.143740663106269650e+00 7.856641048725394871e-02 -1.306114532060185884e+05 5.681885859736343747e+00 8.195687513465932383e-02 -1.307171781760104059e+05 6.117856335990666139e+00 8.478095973101976157e-02 -1.308229031460022525e+05 6.211499011704282758e+00 8.548277325068305565e-02 -1.309286281159940700e+05 6.559895982229568823e+00 8.815049292534184178e-02 -1.310343530859859166e+05 6.725039730578382446e+00 8.931357789307270423e-02 -1.311400780559777340e+05 6.784162239342376388e+00 8.975667407204843129e-02 -1.312458030259695661e+05 6.883224267654023620e+00 9.123393455051700962e-02 -1.313515279959613981e+05 6.763938202590786375e+00 9.022667561809091796e-02 -1.314572529659532302e+05 7.005841050690907679e+00 9.307678279662043308e-02 -1.315629779359450622e+05 7.212399855260141379e+00 9.528444561152357717e-02 -1.316687029059368942e+05 7.155318475661229805e+00 9.529888729584928830e-02 -1.317744278759287263e+05 6.926090007217214684e+00 9.269610185209714581e-02 -1.318801528459205583e+05 6.939886988667817391e+00 9.296408407874250102e-02 -1.319858778159123904e+05 7.057098973357736504e+00 9.407318330990788180e-02 -1.320916027859042224e+05 6.796847173533040021e+00 9.216975498667878686e-02 -1.321973277558960544e+05 6.886101654739394284e+00 9.271471901296646223e-02 -1.323030527258878865e+05 6.826501516784505341e+00 9.191019085556513535e-02 -1.324087776958796894e+05 6.740690912118140865e+00 9.142897026284561857e-02 -1.325145026658715506e+05 6.875761182148048434e+00 9.273149405383059041e-02 -1.326202276358633535e+05 6.574465438692802088e+00 9.066632427775678238e-02 -1.327259526058552146e+05 6.430736073077643056e+00 8.882504949729827515e-02 -1.328316775758470176e+05 6.205065743580179038e+00 8.763619373092146336e-02 -1.329374025458388787e+05 6.055975046733847122e+00 8.525740423084744724e-02 -1.330431275158306817e+05 5.810348073920614809e+00 8.374584388258708711e-02 -1.331488524858225137e+05 5.202487269788142576e+00 7.871458581884838157e-02 -1.332545774558143457e+05 4.901439285522314115e+00 7.621545152238522192e-02 -1.333603024258061778e+05 4.455441012613665208e+00 7.374988084979992864e-02 -1.334660273957980098e+05 4.014624427558124431e+00 6.949829970652772471e-02 -1.335717523657898419e+05 3.357439258884150846e+00 6.276471752736464960e-02 -1.336774773357816739e+05 3.074243334279343376e+00 6.102761363688193053e-02 -1.337832023057735059e+05 2.690993926106871381e+00 5.718516535053889266e-02 -1.338889272757653380e+05 2.133341267243306749e+00 5.087841703258451365e-02 -1.339946522457571700e+05 1.706145606702275552e+00 4.479025146509699185e-02 -1.341003772157490021e+05 1.418776366430156255e+00 4.009345603896813381e-02 -1.342061021857408341e+05 1.149651540600688193e+00 3.567116834105521495e-02 -1.343118271557326370e+05 9.359240093721680198e-01 3.111805124868454939e-02 -1.344175521257244982e+05 7.392217604264499364e-01 2.649974956730228107e-02 -1.345232770957163011e+05 5.974010016922741695e-01 2.352050725370338075e-02 -1.346290020657081623e+05 5.122529783628895217e-01 2.100117299440942831e-02 -1.347347270356999652e+05 4.369186828094981379e-01 1.820779875510566970e-02 -1.348404520056918263e+05 3.641264360181142856e-01 1.642250957061542477e-02 -1.349461769756836293e+05 3.324689255102892815e-01 1.538996285737589086e-02 -1.350519019456754904e+05 2.751887213688019584e-01 1.319941013637726882e-02 -1.351576269156672934e+05 2.667179515874109619e-01 1.248006522290483027e-02 -1.352633518856591254e+05 2.500309949662977149e-01 1.150413873101356621e-02 -1.353690768556509574e+05 2.376828160934296164e-01 1.100730112193640600e-02 -1.354748018256427895e+05 2.437813663201297554e-01 1.136482046127797532e-02 -1.355805267956346215e+05 2.348008615430852153e-01 1.139226133452267246e-02 -1.356862517656264536e+05 2.359489136583078350e-01 1.123487954992605058e-02 -1.357919767356182856e+05 2.327644388621944727e-01 1.066525192081893385e-02 -1.358977017056101176e+05 2.410306573787168727e-01 1.115112533463190510e-02 -1.360034266756019497e+05 2.242376006735766480e-01 1.032589394511670283e-02 -1.361091516455937817e+05 2.319750333518749152e-01 1.095563704117427650e-02 -1.362148766155855847e+05 2.116585743169624445e-01 9.733423203371843399e-03 -1.363206015855774458e+05 2.136912711850529334e-01 9.840610356199291919e-03 -1.364263265555692487e+05 2.120566679334806026e-01 1.005681956296230854e-02 -1.365320515255611099e+05 2.119287589879387534e-01 1.010160107992742924e-02 -1.366377764955529128e+05 2.199103222741660424e-01 1.039148600746339808e-02 -1.367435014655447740e+05 2.217394754404639623e-01 1.064154330791901998e-02 -1.368492264355365769e+05 2.341387165850998264e-01 1.071070038242468922e-02 -1.369549514055284380e+05 2.324031005537131600e-01 1.078576870721577145e-02 -1.370606763755202410e+05 2.154112891526790696e-01 1.013772262138356098e-02 -1.371664013455120730e+05 2.304913606265952264e-01 1.041527487308956806e-02 -1.372721263155039051e+05 2.133676942045822644e-01 1.028921090783435632e-02 -1.373778512854957371e+05 2.200850222152321289e-01 1.043479041848628316e-02 -1.374835762554875691e+05 2.115067946024764278e-01 1.033513161981168375e-02 -1.375893012254794012e+05 1.968794775734498403e-01 9.846882664359547788e-03 -1.376950261954712332e+05 2.286996489878565519e-01 1.094573632454564835e-02 -1.378007511654630653e+05 2.212893557373361575e-01 1.032539163103112119e-02 -1.379064761354548973e+05 2.250654077754672966e-01 1.064917588366093466e-02 -1.380122011054467293e+05 2.169303156388561193e-01 1.032316625401726376e-02 -1.381179260754385323e+05 2.145950150099039111e-01 1.012287691026014617e-02 -1.382236510454303934e+05 2.240664463440875109e-01 1.107640221079702995e-02 -1.383293760154221964e+05 1.988185497232080601e-01 9.711236072524841861e-03 -1.384351009854140575e+05 2.093568921841441333e-01 1.029671070184533764e-02 -1.385408259554058604e+05 2.142482338934685870e-01 1.015253852770874737e-02 -1.386465509253977216e+05 2.084701257242053685e-01 1.046632516021427789e-02 -1.387522758953895245e+05 2.282332222856282289e-01 1.083485532107760982e-02 -1.388580008653813857e+05 2.262544609658330708e-01 1.101399246343460168e-02 -1.389637258353731886e+05 2.240826899551640328e-01 1.089836170990601816e-02 -1.390694508053650497e+05 2.289736397968118176e-01 1.145088782611786496e-02 -1.391751757753568527e+05 2.310072912813540824e-01 1.150649571277934970e-02 -1.392809007453486847e+05 2.038365634135492765e-01 1.051415911945256798e-02 -1.393866257153405168e+05 2.262122093036055548e-01 1.095605118036692069e-02 -1.394923506853323488e+05 1.916324762462837672e-01 9.643281062944117007e-03 -1.395980756553241808e+05 2.254004695020522531e-01 1.077301778468769608e-02 -1.397038006253160129e+05 2.153486277460286702e-01 9.987850834905333611e-03 -1.398095255953078449e+05 2.208633543146503175e-01 1.102043924903204318e-02 -1.399152505652996770e+05 2.233555962178540300e-01 1.094810024249037901e-02 -1.400209755352914799e+05 2.192687014135046297e-01 1.088985056186542351e-02 -1.401267005052833410e+05 2.165800754864121158e-01 1.044935353902403524e-02 -1.402324254752751440e+05 2.076625923939720564e-01 1.083998341298254668e-02 -1.403381504452670051e+05 2.152322182713863052e-01 1.078052720834613183e-02 -1.404438754152588081e+05 2.175911622190190020e-01 1.068329195952606551e-02 -1.405496003852506692e+05 2.086664678388002736e-01 1.029812382130434502e-02 -1.406553253552424721e+05 1.910022871059703087e-01 9.658639264563293261e-03 -1.407610503252343333e+05 2.221918741249029883e-01 1.055978759462712982e-02 -1.408667752952261362e+05 2.310929462772041143e-01 1.157389965595615605e-02 -1.409725002652179974e+05 2.206030962114894078e-01 1.068442149108067736e-02 -1.410782252352098003e+05 2.365143343865339365e-01 1.184234088487312424e-02 -1.411839502052016323e+05 2.061497226990990916e-01 1.004178058305370269e-02 -1.412896751751934644e+05 2.007457820692460093e-01 1.057397840135616829e-02 -1.413954001451852964e+05 2.269138040572972748e-01 1.148299052592839480e-02 -1.415011251151771285e+05 2.187444430487174851e-01 1.082464688322948634e-02 -1.416068500851689605e+05 2.327294966834441148e-01 1.115294157088562652e-02 -1.417125750551607925e+05 2.175345617951129906e-01 1.078633199830639905e-02 -1.418183000251526246e+05 2.205083336886310696e-01 1.086512205478367549e-02 -1.419240249951444566e+05 2.107837208582757360e-01 1.066605843326687980e-02 -1.420297499651362887e+05 2.115061275133223451e-01 1.084752385721470501e-02 -1.421354749351280916e+05 2.210205203144896269e-01 1.075493428538479290e-02 -1.422411999051199527e+05 2.247154919034082543e-01 1.135457546655715272e-02 -1.423469248751117557e+05 2.062548271999571081e-01 1.029943063170208825e-02 -1.424526498451036168e+05 2.162923613660452382e-01 1.098583139769640331e-02 -1.425583748150954198e+05 2.332573209093087574e-01 1.194451508968604782e-02 -1.426640997850872809e+05 2.092738016426494430e-01 1.103322839976716464e-02 -1.427698247550790838e+05 2.143855732549622695e-01 1.064079137519201301e-02 -1.428755497250709450e+05 2.133773675911857792e-01 1.080022188061474132e-02 -1.429812746950627479e+05 2.299257802683101204e-01 1.148402317243009223e-02 -1.430869996650545800e+05 2.087614621120868486e-01 1.092430336169621617e-02 -1.431927246350464120e+05 2.073160943720060712e-01 1.014374598971759522e-02 -1.432984496050382440e+05 2.260519614255812326e-01 1.143851478058990033e-02 -1.434041745750300761e+05 2.227841552713855366e-01 1.100163050303500610e-02 -1.435098995450219081e+05 1.948186260977458617e-01 1.010294251347885509e-02 -1.436156245150137402e+05 2.313299169970647884e-01 1.167571944402923979e-02 -1.437213494850055722e+05 2.329533458356829456e-01 1.198649392210136833e-02 -1.438270744549974042e+05 2.012773579395452095e-01 1.040978777252183490e-02 -1.439327994249892363e+05 2.253177030378108459e-01 1.131059633984226979e-02 -1.440385243949810392e+05 2.170440597185670228e-01 1.084618256759973566e-02 -1.441442493649729004e+05 2.089957378865812399e-01 1.088842783133075337e-02 -1.442499743349647033e+05 2.229141845655621956e-01 1.158828897545098428e-02 -1.443556993049565644e+05 2.296959583369811153e-01 1.163691531986209282e-02 -1.444614242749483674e+05 2.265642362697773970e-01 1.138401542262160865e-02 -1.445671492449402285e+05 1.979754986227920122e-01 1.041118615332669445e-02 -1.446728742149320315e+05 2.232505629395563074e-01 1.143882934112433122e-02 -1.447785991849238926e+05 2.203379242243530545e-01 1.114684743982490879e-02 -1.448843241549156955e+05 2.094989442160778703e-01 1.077022085893173005e-02 -1.449900491249075276e+05 2.230321104575319624e-01 1.136664416747953411e-02 -1.450957740948993596e+05 2.185709323448341845e-01 1.130061606684995730e-02 -1.452014990648911917e+05 2.189993589854714595e-01 1.165968446031035929e-02 -1.453072240348830237e+05 2.170760965710200607e-01 1.107997997411090500e-02 -1.454129490048748557e+05 2.089368235514239835e-01 1.115264126309307817e-02 -1.455186739748666878e+05 2.227906958277255656e-01 1.157524481695150140e-02 -1.456243989448585198e+05 2.288984347382182760e-01 1.163572171851656213e-02 -1.457301239148503519e+05 2.166324780278295614e-01 1.112606046329517838e-02 -1.458358488848421839e+05 2.240686013203098681e-01 1.131007647578926786e-02 -1.459415738548340159e+05 2.137727374667499902e-01 1.070626977777805466e-02 -1.460472988248258480e+05 2.092772608277773394e-01 1.085519659922256838e-02 -1.461530237948176509e+05 2.183977916289762400e-01 1.091454500692021906e-02 -1.462587487648095121e+05 2.161329271579593703e-01 1.104795174943974841e-02 -1.463644737348013150e+05 2.057192560355345090e-01 1.109275398540651714e-02 -1.464701987047931761e+05 2.261594132862939921e-01 1.142945533388271470e-02 -1.465759236747849791e+05 2.211331050662099507e-01 1.151463489844892912e-02 -1.466816486447768402e+05 2.086239028174097787e-01 1.097638051050979502e-02 -1.467873736147686432e+05 2.088391152223439684e-01 1.092892571183915786e-02 diff --git a/tutorials/data/reduced_LBCO.xye b/tutorials/data/reduced_LBCO.xye new file mode 100644 index 00000000..44cfa33b --- /dev/null +++ b/tutorials/data/reduced_LBCO.xye @@ -0,0 +1,902 @@ +# DIFC = 58742.43986364694 [µ/Å] L = 157.66265789680057 [m] two_theta = 94.94884670921479 [deg] +# tof [µs] Y [counts] E [counts] +4.117845034441650205e+04 1.026389187055301577e-01 4.225152566050356662e-02 +4.129593522414379549e+04 1.397996173304456302e-01 5.937152338800123080e-02 +4.141342010387108894e+04 2.666955111644808696e-01 8.751190952582538207e-02 +4.153090498359838239e+04 1.563151311823567091e-01 3.426022627818102462e-02 +4.164838986332567583e+04 5.003577461678563321e-01 1.669673879687668394e-01 +4.176587474305297656e+04 2.779526117451250888e-01 8.140658228668147534e-02 +4.188335962278027000e+04 1.113988784721996056e-01 3.677602382130990000e-02 +4.200084450250756345e+04 3.011376408168025542e-01 1.161955857515008378e-01 +4.211832938223485689e+04 1.539924473965925134e-01 5.637477375677454883e-02 +4.223581426196215034e+04 1.541574346289662778e-01 5.469507374083806828e-02 +4.235329914168944379e+04 4.408160583357101925e-01 2.465782094191208140e-01 +4.247078402141673723e+04 5.988458702287119406e-01 1.948004649739943084e-01 +4.258826890114403068e+04 2.380660219115039722e-01 8.018171404984904271e-02 +4.270575378087132412e+04 2.521421873382467815e-01 7.418850693400946827e-02 +4.282323866059861757e+04 3.350950052255010636e-01 9.996528771297324978e-02 +4.294072354032591102e+04 3.170949010371763022e-01 1.424870368934531562e-01 +4.305820842005320446e+04 2.243927625923709812e-01 6.772588789459792202e-02 +4.317569329978049791e+04 2.156664492794893584e-01 6.352532923016059041e-02 +4.329317817950779863e+04 4.163510810820859609e-01 1.611728368673726597e-01 +4.341066305923509208e+04 2.046904023909681403e-01 6.573369340526692695e-02 +4.352814793896238552e+04 2.804203082450570927e-01 9.308419340286468169e-02 +4.364563281868967897e+04 5.879831824752109748e-01 1.470764811254518800e-01 +4.376311769841697242e+04 1.101109869063088054e+00 2.389428450243492319e-01 +4.388060257814426586e+04 1.394779005797829541e+00 2.761904724316771587e-01 +4.399808745787155931e+04 1.294628364019181355e+00 1.684972297264019925e-01 +4.411557233759885276e+04 7.814970591539392997e-01 1.207599643623660512e-01 +4.423305721732614620e+04 5.687515463628171064e-01 1.350109391764439115e-01 +4.435054209705343965e+04 1.576175311134561940e-01 4.497303922909259150e-02 +4.446802697678073309e+04 3.547714724630695593e-01 8.550572579130311102e-02 +4.458551185650802654e+04 4.423691109556327494e-01 6.735876979181899815e-02 +4.470299673623531999e+04 4.573751134146945563e-01 9.526048250602438261e-02 +4.482048161596261343e+04 3.279558551585880499e-01 5.130469559109392119e-02 +4.493796649568991415e+04 2.389881442034525461e-01 4.138885040356351380e-02 +4.505545137541720760e+04 2.123369803205721329e-01 6.459690998523801020e-02 +4.517293625514450105e+04 1.858569228935731676e-01 4.939442428382466443e-02 +4.529042113487179449e+04 1.759397147174096010e-01 4.194068562423873547e-02 +4.540790601459908066e+04 2.552824873718267384e-01 6.941300464870439613e-02 +4.552539089432637411e+04 2.074721412492958605e-01 5.224882521736466667e-02 +4.564287577405366756e+04 2.120929032442840367e-01 6.596884792158991262e-02 +4.576036065378096100e+04 2.243806406207009274e-01 6.759405578046848162e-02 +4.587784553350825445e+04 3.434590416453084938e-01 9.143335351084230789e-02 +4.599533041323554789e+04 1.972183919488424420e-01 4.459150904217114991e-02 +4.611281529296284134e+04 3.575284802729824518e-01 1.343198571451001688e-01 +4.623030017269013479e+04 4.897942416317968006e-01 1.037430739126674883e-01 +4.634778505241743551e+04 1.148245187776967935e+00 2.420949407938559061e-01 +4.646526993214472895e+04 1.440943851601442782e+00 2.237360194321589557e-01 +4.658275481187202240e+04 2.116692129800185729e+00 2.999407332702407336e-01 +4.670023969159931585e+04 1.866778848337942609e+00 2.197080100841554140e-01 +4.681772457132660929e+04 9.301070760895107092e-01 1.425421329102326828e-01 +4.693520945105390274e+04 3.483713034073008807e-01 7.227509455423848650e-02 +4.705269433078119619e+04 3.050320126841059021e-01 6.662674476658600464e-02 +4.717017921050848963e+04 3.190793105961332587e-01 7.012057826066810107e-02 +4.728766409023578308e+04 2.056502335010176041e-01 5.778848012212412649e-02 +4.740514896996307652e+04 2.355621511847355853e-01 5.560678073289240797e-02 +4.752263384969036997e+04 1.805404906738535820e-01 5.230409007618768563e-02 +4.764011872941766342e+04 1.641491941196681348e-01 4.386847082092074079e-02 +4.775760360914495686e+04 2.918774529868228274e-01 6.354175707528118833e-02 +4.787508848887225759e+04 1.806686727283106642e-01 4.155940322254216002e-02 +4.799257336859955103e+04 2.375248920265329855e-01 6.565694135350037819e-02 +4.811005824832684448e+04 1.970863911535516433e-01 4.653400025227761444e-02 +4.822754312805413792e+04 2.768125945194677695e-01 6.016775823080430102e-02 +4.834502800778143137e+04 3.625915745812156588e-01 6.676513720375761018e-02 +4.846251288750872482e+04 3.009596682604915863e-01 6.126511698476317519e-02 +4.857999776723601826e+04 4.370636387985246674e-01 6.134879068238736910e-02 +4.869748264696331171e+04 4.480827915359385516e-01 6.422265908751494112e-02 +4.881496752669060515e+04 4.102597476714902047e-01 6.545354096077310446e-02 +4.893245240641789860e+04 2.223535771888536516e-01 4.223128897580422786e-02 +4.904993728614519205e+04 2.800089982609574313e-01 5.476549529502094255e-02 +4.916742216587248549e+04 2.583422801858330509e-01 6.069343907956215728e-02 +4.928490704559977894e+04 3.583249343391253228e-01 7.018305617517393846e-02 +4.940239192532707239e+04 1.808071788812058434e-01 4.067831597318177783e-02 +4.951987680505437311e+04 2.344234320076104827e-01 4.899109876576211720e-02 +4.963736168478166655e+04 1.786241465134877082e-01 3.546259713783536660e-02 +4.975484656450896000e+04 3.165364691960502186e-01 5.575189342758964800e-02 +4.987233144423625345e+04 2.710446602441035080e-01 5.002782337259915196e-02 +4.998981632396354689e+04 2.540375573623566696e-01 4.948080217025891542e-02 +5.010730120369084034e+04 2.775635615734625694e-01 5.066599737501824297e-02 +5.022478608341813379e+04 3.027463317211346316e-01 5.146294478740141148e-02 +5.034227096314542723e+04 3.448205792011599935e-01 5.330425704932195002e-02 +5.045975584287272068e+04 2.712994980188523919e-01 5.224044454025159046e-02 +5.057724072260001412e+04 4.801960914813830361e-01 9.110252623180518927e-02 +5.069472560232730757e+04 6.551712819584299963e-01 1.186359030473278370e-01 +5.081221048205460102e+04 1.428317269489179475e+00 1.843974280172484548e-01 +5.092969536178189446e+04 2.477631122172635258e+00 2.344042498707337718e-01 +5.104718024150919518e+04 3.109356740677123199e+00 2.710324303857019612e-01 +5.116466512123648863e+04 2.894320877172095408e+00 2.503345429433697089e-01 +5.128215000096378208e+04 1.776867041069938313e+00 1.907050019214412140e-01 +5.139963488069107552e+04 6.838292067254779782e-01 9.438958964119406603e-02 +5.151711976041836169e+04 4.011008798981476886e-01 5.599364729647646199e-02 +5.163460464014565514e+04 3.152835350627751776e-01 5.335731352842004033e-02 +5.175208951987294859e+04 1.762273740812384804e-01 3.446279013659030166e-02 +5.186957439960024203e+04 4.463427405142346149e-01 7.269775858318987261e-02 +5.198705927932753548e+04 5.133536268715744866e-01 7.626360975192469915e-02 +5.210454415905482892e+04 9.777315862581714700e-01 1.167719599278059378e-01 +5.222202903878212237e+04 1.401651198557053668e+00 1.332053878155231297e-01 +5.233951391850941582e+04 1.859388199584021573e+00 1.475541193267937423e-01 +5.245699879823671654e+04 2.280993745755428126e+00 1.680642729278420400e-01 +5.257448367796400998e+04 1.261402566972920081e+00 1.168532555493235620e-01 +5.269196855769130343e+04 9.893020260898341967e-01 9.833034091587138092e-02 +5.280945343741859688e+04 3.973177648042109378e-01 5.207818992380534862e-02 +5.292693831714589032e+04 2.991894446890911996e-01 5.361270874356904859e-02 +5.304442319687318377e+04 2.176496709684266617e-01 3.281408644570833061e-02 +5.316190807660047722e+04 2.888505235245324432e-01 4.472586889161238310e-02 +5.327939295632777066e+04 2.139974025712714223e-01 3.284838829395493598e-02 +5.339687783605506411e+04 3.089486545353599678e-01 5.356231140217268538e-02 +5.351436271578235755e+04 3.136057204463469361e-01 4.312662649259511871e-02 +5.363184759550965100e+04 3.766335364764256122e-01 4.660722367079853101e-02 +5.374933247523694445e+04 5.255693066382454148e-01 4.888245968690718701e-02 +5.386681735496423789e+04 5.380119524081909965e-01 4.803358408642433713e-02 +5.398430223469153134e+04 4.840966158284778498e-01 4.511853245832278536e-02 +5.410178711441883206e+04 3.927968612810832649e-01 5.265165825081648265e-02 +5.421927199414612551e+04 3.300325160569344551e-01 4.297279325690894075e-02 +5.433675687387341895e+04 2.950616403855323422e-01 3.880218708974195185e-02 +5.445424175360071240e+04 2.492450132397787399e-01 3.654222640529062455e-02 +5.457172663332800585e+04 2.260370755253208741e-01 3.701443804427470563e-02 +5.468921151305529929e+04 2.200890243240609390e-01 3.182892108474195264e-02 +5.480669639278259274e+04 2.388887332652326612e-01 3.380584156396045092e-02 +5.492418127250988618e+04 2.981100937439706833e-01 4.585553763770799235e-02 +5.504166615223717963e+04 2.507240125616799764e-01 3.491424399433303710e-02 +5.515915103196447308e+04 2.907883480310323732e-01 5.245691280659597194e-02 +5.527663591169176652e+04 2.972758668025365369e-01 4.351121393522942166e-02 +5.539412079141905997e+04 2.992136396268765819e-01 3.782760886718196380e-02 +5.551160567114635342e+04 3.133570637017624172e-01 3.844731763204999736e-02 +5.562909055087365414e+04 2.906278744172185458e-01 3.982450655197066619e-02 +5.574657543060094758e+04 2.205034716934419770e-01 3.089954222050324967e-02 +5.586406031032824103e+04 3.114768333198998373e-01 3.848971723370582521e-02 +5.598154519005553448e+04 2.681625387510871983e-01 3.456439718156366359e-02 +5.609903006978282792e+04 2.334800495873709525e-01 3.105286338920121986e-02 +5.621651494951012137e+04 2.628616311053066368e-01 3.369713834452245371e-02 +5.633399982923741481e+04 3.264739671110050145e-01 3.961055956392658256e-02 +5.645148470896470826e+04 2.750124082771673861e-01 3.515633143795317966e-02 +5.656896958869200171e+04 3.484533729327924934e-01 4.339428526900690475e-02 +5.668645446841929515e+04 4.207129441528209002e-01 4.190014871027057664e-02 +5.680393934814658860e+04 5.697530021731159744e-01 4.887732359987120162e-02 +5.692142422787388205e+04 1.084961587477615508e+00 6.789981620985753585e-02 +5.703890910760117549e+04 1.341056912963587644e+00 7.120711110798993992e-02 +5.715639398732846894e+04 1.416352827203603226e+00 7.012595958865129597e-02 +5.727387886705576966e+04 1.108508624142690024e+00 6.248681888143868546e-02 +5.739136374678306311e+04 7.401612009659254143e-01 5.598387613963796972e-02 +5.750884862651035655e+04 5.099077652680423789e-01 4.627281143997867552e-02 +5.762633350623765000e+04 3.226604723308503786e-01 3.327785648096771159e-02 +5.774381838596494345e+04 2.729626911048345650e-01 3.430102799522007778e-02 +5.786130326569223689e+04 2.683922495946046705e-01 3.511618683689714249e-02 +5.797878814541953034e+04 2.279039540673531983e-01 2.758132657525257450e-02 +5.809627302514682378e+04 2.663281272455145232e-01 2.988421144968735413e-02 +5.821375790487411723e+04 2.982290740014431618e-01 3.628929822108504372e-02 +5.833124278460141068e+04 2.716854910856432159e-01 3.112372202815927302e-02 +5.844872766432870412e+04 1.687394724503477605e-01 2.459200597701623886e-02 +5.856621254405599757e+04 3.151325406870690293e-01 3.437945208176153983e-02 +5.868369742378329101e+04 2.384950308673110253e-01 3.088554620173410842e-02 +5.880118230351058446e+04 2.192608351763692953e-01 2.799542726883336163e-02 +5.891866718323789246e+04 2.818340686740458678e-01 3.387253350647381062e-02 +5.903615206296517135e+04 2.103860293040363538e-01 2.516950844527445982e-02 +5.915363694269247935e+04 2.754037021629112680e-01 3.536185801746966062e-02 +5.927112182241975825e+04 2.748286261158389698e-01 3.098949290462835529e-02 +5.938860670214706624e+04 1.799680752417056606e-01 2.457206463407791627e-02 +5.950609158187434514e+04 2.684116157890129029e-01 3.182729042315890489e-02 +5.962357646160165314e+04 2.561959651574642893e-01 2.832736916623309828e-02 +5.974106134132893203e+04 2.362063025408863148e-01 2.682812144953062791e-02 +5.985854622105624003e+04 2.484754895654770757e-01 2.716887688159074637e-02 +5.997603110078351892e+04 2.951295312525735182e-01 3.457661253194847101e-02 +6.009351598051082692e+04 2.313622393520459175e-01 2.607075062861102799e-02 +6.021100086023811309e+04 2.592063919389324678e-01 2.742091733947288681e-02 +6.032848573996541381e+04 3.012588854924239112e-01 3.281957200156777194e-02 +6.044597061969269998e+04 2.898015795895670377e-01 3.116722805268002869e-02 +6.056345549942000798e+04 3.151563471178265852e-01 3.054300011708842300e-02 +6.068094037914728688e+04 3.231772743984794860e-01 3.033029085688535714e-02 +6.079842525887459487e+04 3.916999147126978276e-01 2.778122594764691200e-02 +6.091591013860187377e+04 5.941493552219679897e-01 3.169551850024424078e-02 +6.103339501832918177e+04 6.335808193848617709e-01 2.846664571011001815e-02 +6.115087989805646066e+04 6.891299218371546020e-01 3.411529652918380423e-02 +6.126836477778376866e+04 5.391072951228950139e-01 2.876267547860211077e-02 +6.138584965751104755e+04 3.765874132216841530e-01 2.454095872750633456e-02 +6.150333453723835555e+04 3.595357835669124591e-01 2.649316632219251080e-02 +6.162081941696563445e+04 3.014513256900653304e-01 2.963418623355060580e-02 +6.173830429669294244e+04 2.869966337765393338e-01 2.751263780377226700e-02 +6.185578917642022861e+04 2.658387508915355801e-01 2.747555970071190179e-02 +6.197327405614752206e+04 3.030963824624803848e-01 3.050613183260279110e-02 +6.209075893587481551e+04 2.129301885040605358e-01 2.404238102176765868e-02 +6.220824381560210895e+04 2.400057333190389053e-01 2.259117502681410108e-02 +6.232572869532940240e+04 2.477600088857740968e-01 2.388000089408538057e-02 +6.244321357505669584e+04 2.427831942759788586e-01 2.779004657901198994e-02 +6.256069845478398929e+04 2.754104107103764743e-01 2.741776324730318959e-02 +6.267818333451128274e+04 2.738118714648523633e-01 2.822859346429010957e-02 +6.279566821423857618e+04 2.855226118425853166e-01 2.838295754999469594e-02 +6.291315309396586963e+04 2.665292980989751315e-01 2.523098816847036199e-02 +6.303063797369316308e+04 2.693537510850672612e-01 2.477083614831812608e-02 +6.314812285342045652e+04 2.593559323368711533e-01 2.496805486446207131e-02 +6.326560773314774997e+04 2.229415722547544165e-01 2.092645777875307145e-02 +6.338309261287505069e+04 2.350419748094108030e-01 2.288622327568160322e-02 +6.350057749260234414e+04 2.423356049664524559e-01 2.277992095283584706e-02 +6.361806237232963758e+04 2.440359797194407709e-01 2.278291170978402266e-02 +6.373554725205693103e+04 2.385715228216548911e-01 2.221563922064439742e-02 +6.385303213178422448e+04 2.651661389868560370e-01 2.414344493558440857e-02 +6.397051701151151792e+04 2.353225021421111174e-01 2.199213719259634353e-02 +6.408800189123881137e+04 2.448070803769231973e-01 2.182540032818428358e-02 +6.420548677096610481e+04 2.815819360211286870e-01 2.424386243248216263e-02 +6.432297165069339826e+04 2.684002897548007360e-01 2.442655466725215593e-02 +6.444045653042069171e+04 3.435577281984454334e-01 3.119176911417102793e-02 +6.455794141014798515e+04 2.787557621395475027e-01 2.500724488836946618e-02 +6.467542628987527860e+04 2.593076063091149241e-01 2.369323442635849417e-02 +6.479291116960257204e+04 3.062829735150675026e-01 2.428473245260866567e-02 +6.491039604932987277e+04 3.327128624431512360e-01 2.831017278965381953e-02 +6.502788092905716621e+04 3.904259634375378818e-01 3.023967233351303185e-02 +6.514536580878445966e+04 4.244170015911279403e-01 3.108145652474826603e-02 +6.526285068851175311e+04 4.320919709034340417e-01 3.268717310334914861e-02 +6.538033556823904655e+04 4.187238024452321627e-01 3.067786425908582137e-02 +6.549782044796634000e+04 6.053641304913618404e-01 3.879412180624448869e-02 +6.561530532769362617e+04 1.023979507415267109e+00 5.059799153908047659e-02 +6.573279020742091234e+04 1.722177642426386157e+00 6.585242527460281881e-02 +6.585027508714822761e+04 2.869575078021976644e+00 8.483646805009378844e-02 +6.596775996687549923e+04 3.284110397651819113e+00 8.926877630141735742e-02 +6.608524484660281450e+04 3.046118587262390598e+00 8.650867226807658350e-02 +6.620272972633008612e+04 1.819862521790002408e+00 6.482667947956427534e-02 +6.632021460605740140e+04 9.157173299745184902e-01 4.379609404738438183e-02 +6.643769948578467302e+04 5.302548279874113035e-01 3.198112794092978356e-02 +6.655518436551198829e+04 3.610700549980613294e-01 2.639578074592303925e-02 +6.667266924523925991e+04 2.792614633281114145e-01 2.212352307389857040e-02 +6.679015412496657518e+04 2.506401662027586408e-01 1.942840315613269739e-02 +6.690763900469384680e+04 2.459135717704753199e-01 1.932334708431501097e-02 +6.702512388442116207e+04 2.704298743065955413e-01 2.184002266236532638e-02 +6.714260876414844824e+04 2.430428420625999064e-01 2.122484006521542163e-02 +6.726009364387574897e+04 2.373042785068660565e-01 2.086855456862465527e-02 +6.737757852360303514e+04 2.741943653955253302e-01 2.187648494376301378e-02 +6.749506340333033586e+04 2.223181958561409322e-01 1.848249094891096095e-02 +6.761254828305762203e+04 2.484951155264427947e-01 2.070021790801592626e-02 +6.773003316278492275e+04 2.995813421252266351e-01 2.582430013449591930e-02 +6.784751804251220892e+04 2.886347125737102060e-01 2.450983745359829394e-02 +6.796500292223950964e+04 3.280950800537890122e-01 2.789551417319516627e-02 +6.808248780196679581e+04 3.598127918433652872e-01 2.936329826495984868e-02 +6.819997268169409654e+04 3.387790909183935328e-01 2.728478519188057630e-02 +6.831745756142138271e+04 6.106575919450546452e-01 4.202056068595941968e-02 +6.843494244114868343e+04 1.036263293450311096e+00 6.005625058857194665e-02 +6.855242732087596960e+04 1.827639238472944072e+00 8.285667937181179221e-02 +6.866991220060327032e+04 3.715782611186581263e+00 1.212454713971919118e-01 +6.878739708033055649e+04 6.608505152163179908e+00 1.639646501714923932e-01 +6.890488196005787177e+04 7.620959341487798078e+00 1.755418204262962079e-01 +6.902236683978514338e+04 6.340171736842076911e+00 1.600330773473809531e-01 +6.913985171951245866e+04 3.945107232923390939e+00 1.197382189389138152e-01 +6.925733659923973028e+04 1.858624142641227328e+00 7.687835818393214116e-02 +6.937482147896704555e+04 9.745155813333851169e-01 5.285047601676039902e-02 +6.949230635869431717e+04 5.942483121679360547e-01 3.828503107727526666e-02 +6.960979123842163244e+04 4.072990947127381189e-01 3.008992194749297855e-02 +6.972727611814890406e+04 3.249043045536640362e-01 2.300290722028994553e-02 +6.984476099787621934e+04 2.679826716357985306e-01 2.007924872128617755e-02 +6.996224587760349095e+04 2.332746614252014239e-01 1.701787491319955645e-02 +7.007973075733080623e+04 3.077984374111149002e-01 2.074064902161703097e-02 +7.019721563705809240e+04 2.293375571855331974e-01 1.671286783578572466e-02 +7.031470051678539312e+04 2.439637879087989958e-01 1.719874894819669112e-02 +7.043218539651267929e+04 2.608900551027117931e-01 1.833054771915438794e-02 +7.054967027623998001e+04 2.505142359417926734e-01 1.724705567970473766e-02 +7.066715515596726618e+04 2.430037537024954675e-01 1.732129138540690338e-02 +7.078464003569456690e+04 2.144521152047729473e-01 1.530962237758228678e-02 +7.090212491542185307e+04 2.482335621663267211e-01 1.713021297581737018e-02 +7.101960979514915380e+04 2.435107311470857960e-01 1.618759216233205123e-02 +7.113709467487643997e+04 2.510173606250347689e-01 1.764244247134177934e-02 +7.125457955460374069e+04 2.700765960858671488e-01 1.888552687582526965e-02 +7.137206443433102686e+04 2.221540267197681662e-01 1.567993899490387200e-02 +7.148954931405832758e+04 2.474955149410510702e-01 1.750469435653384531e-02 +7.160703419378561375e+04 2.339498149027210427e-01 1.610910528440698264e-02 +7.172451907351291447e+04 2.752388985423036560e-01 1.699814391420089929e-02 +7.184200395324020064e+04 2.681219037458177357e-01 1.475024385904641702e-02 +7.195948883296750137e+04 3.778104168695359255e-01 1.757253589666064875e-02 +7.207697371269478754e+04 4.916953374349823380e-01 1.778928998366503117e-02 +7.219445859242210281e+04 6.325672164916609219e-01 1.884378671860735197e-02 +7.231194347214937443e+04 6.468555702085228010e-01 1.893608218184573283e-02 +7.242942835187668970e+04 5.621343132970443301e-01 1.967882460853638896e-02 +7.254691323160396132e+04 3.884918589609526185e-01 1.638171475625302409e-02 +7.266439811133127660e+04 3.277092847890691329e-01 1.727957370600969114e-02 +7.278188299105854821e+04 3.072029353142167185e-01 1.879750302001862231e-02 +7.289936787078586349e+04 3.121760854050493750e-01 1.748027299177910138e-02 +7.301685275051313511e+04 3.158597248735866003e-01 1.766423552855218501e-02 +7.313433763024045038e+04 3.495645148876029840e-01 1.858717772543205457e-02 +7.325182250996772200e+04 3.779317372231783545e-01 1.983890501424235425e-02 +7.336930738969503727e+04 3.016515237349527978e-01 1.750049802459521103e-02 +7.348679226942232344e+04 2.642882875759293704e-01 1.602666045683603935e-02 +7.360427714914962417e+04 2.467033015151160469e-01 1.537268295713969078e-02 +7.372176202887691034e+04 2.583477603644355747e-01 1.647760369160293156e-02 +7.383924690860421106e+04 2.196510918098707743e-01 1.417342980047160868e-02 +7.395673178833149723e+04 2.438666081819843012e-01 1.593700330549025976e-02 +7.407421666805879795e+04 2.286508101762403933e-01 1.533896846970885137e-02 +7.419170154778608412e+04 2.284767621278146754e-01 1.485976849543357500e-02 +7.430918642751338484e+04 2.693819629225019385e-01 1.656452399438761505e-02 +7.442667130724067101e+04 2.822834194303860400e-01 1.750275931444024088e-02 +7.454415618696797173e+04 2.464651902046932352e-01 1.567244164940046619e-02 +7.466164106669525790e+04 2.187049768720053244e-01 1.519224848166734164e-02 +7.477912594642255863e+04 2.604609849149542300e-01 1.659475241779284627e-02 +7.489661082614984480e+04 2.607212127084548858e-01 1.623651386453009438e-02 +7.501409570587714552e+04 2.496355174135630739e-01 1.548550819598428115e-02 +7.513158058560443169e+04 2.239448959625868207e-01 1.456352348006314211e-02 +7.524906546533173241e+04 2.604207706163541580e-01 1.633147379347373723e-02 +7.536655034505901858e+04 2.617216257481469466e-01 1.605858930156012221e-02 +7.548403522478631930e+04 2.287439573508639745e-01 1.427640841630284027e-02 +7.560152010451360547e+04 2.544659536418589219e-01 1.563429218493380193e-02 +7.571900498424090620e+04 2.523082101234948582e-01 1.526181147455010073e-02 +7.583648986396819237e+04 2.627978644853515844e-01 1.582193370252416714e-02 +7.595397474369549309e+04 2.857862211104597039e-01 1.583306184024893190e-02 +7.607145962342277926e+04 2.856759177545141193e-01 1.499630559562889140e-02 +7.618894450315007998e+04 2.762781482864891669e-01 1.444740209300829185e-02 +7.630642938287736615e+04 2.744786396440926368e-01 1.515719500110723587e-02 +7.642391426260466687e+04 2.698854129303119298e-01 1.545147823167379933e-02 +7.654139914233196760e+04 2.611728701388578711e-01 1.535635404694849979e-02 +7.665888402205925377e+04 2.487609030567312085e-01 1.460012831045296236e-02 +7.677636890178655449e+04 2.589254047731875397e-01 1.471998368524818357e-02 +7.689385378151384066e+04 2.438434789842611750e-01 1.462928966552092327e-02 +7.701133866124114138e+04 2.599324628536570647e-01 1.505149158707442050e-02 +7.712882354096842755e+04 2.427420345494490650e-01 1.435398580381514952e-02 +7.724630842069572827e+04 2.196275016799306423e-01 1.307607367758112024e-02 +7.736379330042301444e+04 2.327363648503985860e-01 1.370923748968199893e-02 +7.748127818015031517e+04 2.396130136674551880e-01 1.436600191763026321e-02 +7.759876305987760134e+04 2.381478086813833273e-01 1.400171256760133522e-02 +7.771624793960490206e+04 2.311743327372884349e-01 1.359339812598762964e-02 +7.783373281933218823e+04 2.542738871825155345e-01 1.450045225638801893e-02 +7.795121769905948895e+04 2.635849358626350947e-01 1.471059484446322896e-02 +7.806870257878678967e+04 2.641964778612655440e-01 1.499437300503753297e-02 +7.818618745851407584e+04 2.347322226098160769e-01 1.372512682045429026e-02 +7.830367233824137656e+04 2.637992356285898676e-01 1.496300395371568878e-02 +7.842115721796866274e+04 2.622162796733039647e-01 1.427254789854758878e-02 +7.853864209769596346e+04 2.357865026915225426e-01 1.363267650836430360e-02 +7.865612697742324963e+04 2.456952640084646977e-01 1.377451300031466361e-02 +7.877361185715055035e+04 2.453440253195703913e-01 1.407899751485479703e-02 +7.889109673687783652e+04 2.558434740289881604e-01 1.461002394448900239e-02 +7.900858161660513724e+04 2.439786221673118649e-01 1.366347699396048242e-02 +7.912606649633242341e+04 2.555824043626228614e-01 1.372698631384466211e-02 +7.924355137605972413e+04 2.530190632290198471e-01 1.451688790242196790e-02 +7.936103625578701030e+04 2.680840431144656533e-01 1.387551464498451223e-02 +7.947852113551431103e+04 3.061468517519026489e-01 1.546854021508436115e-02 +7.959600601524161175e+04 3.368497318171845278e-01 1.577685612647141550e-02 +7.971349089496889792e+04 3.901963190522604319e-01 1.794270697476631551e-02 +7.983097577469619864e+04 4.065304455028960762e-01 1.914942121181879148e-02 +7.994846065442348481e+04 4.568147644894976489e-01 2.210992243209041266e-02 +8.006594553415078553e+04 6.325591803025866211e-01 2.978985724702188850e-02 +8.018343041387807170e+04 9.560411814995216639e-01 3.954080756207344755e-02 +8.030091529360537243e+04 1.582604344737334801e+00 5.256589160458978449e-02 +8.041840017333265860e+04 2.991607384223537558e+00 7.587777451294198949e-02 +8.053588505305995932e+04 5.544238911554531413e+00 1.041434221648967762e-01 +8.065336993278724549e+04 9.066369793559719170e+00 1.341081073817377567e-01 +8.077085481251454621e+04 1.118670896468542963e+01 1.510870167278008103e-01 +8.088833969224183238e+04 1.038613401324233365e+01 1.447597288616404854e-01 +8.100582457196913310e+04 7.390600409595702303e+00 1.224308253363256271e-01 +8.112330945169641927e+04 3.975941793080358444e+00 8.772059607213507360e-02 +8.124079433142372000e+04 2.157062752986575127e+00 6.199243081146460499e-02 +8.135827921115102072e+04 1.209544025661601685e+00 4.325439941990810028e-02 +8.147576409087830689e+04 7.639969239843060755e-01 3.210059112981426821e-02 +8.159324897060560761e+04 5.294200931696162460e-01 2.429551583989006738e-02 +8.171073385033289378e+04 4.008900287069679380e-01 1.979383081964489546e-02 +8.182821873006019450e+04 3.137847721791904299e-01 1.583668484462920009e-02 +8.194570360978748067e+04 2.846407275605110643e-01 1.496601677304223478e-02 +8.206318848951478139e+04 2.569373839470143195e-01 1.347229389890966175e-02 +8.218067336924206757e+04 2.793780820848453805e-01 1.383367665593681142e-02 +8.229815824896936829e+04 2.507909805955650939e-01 1.243200014681651588e-02 +8.241564312869665446e+04 2.602917765599425115e-01 1.283904463081043772e-02 +8.253312800842394063e+04 2.314232081944593289e-01 1.195265728519036112e-02 +8.265061288815124135e+04 2.706129461973929007e-01 1.328319145450221166e-02 +8.276809776787852752e+04 2.499372972837755336e-01 1.274014202912272277e-02 +8.288558264760584279e+04 2.370604116053851296e-01 1.198314615107681606e-02 +8.300306752733311441e+04 2.501180615432377907e-01 1.280227935021162160e-02 +8.312055240706042969e+04 2.240131306755544227e-01 1.123861592365976367e-02 +8.323803728678770131e+04 2.381634239090330285e-01 1.185513489755068116e-02 +8.335552216651501658e+04 2.436875348023024024e-01 1.212523749594874266e-02 +8.347300704624228820e+04 2.487730515915544671e-01 1.242974405657244243e-02 +8.359049192596960347e+04 2.344852645714093908e-01 1.170092430705882598e-02 +8.370797680569687509e+04 2.284218126659737780e-01 1.143914246467647548e-02 +8.382546168542419036e+04 2.458359297219424311e-01 1.191150632992059484e-02 +8.394294656515146198e+04 2.529152742933930553e-01 1.241623964030431036e-02 +8.406043144487877726e+04 2.486127879516559502e-01 1.212683758273027691e-02 +8.417791632460606343e+04 2.353554413968428904e-01 1.180001703159493619e-02 +8.429540120433336415e+04 2.589480602325739400e-01 1.236167187659707907e-02 +8.441288608406065032e+04 2.176679386776328995e-01 1.096161752062463877e-02 +8.453037096378795104e+04 2.425656923433729684e-01 1.169653177395690337e-02 +8.464785584351523721e+04 2.470378821777743095e-01 1.211975081626509923e-02 +8.476534072324253793e+04 2.672180374281797888e-01 1.251162447214065193e-02 +8.488282560296982410e+04 2.364567766238570012e-01 1.165246003139473220e-02 +8.500031048269712483e+04 2.372676900665205979e-01 1.128904432454848686e-02 +8.511779536242441100e+04 2.579218530711435142e-01 1.201232029924224204e-02 +8.523528024215171172e+04 2.377781221049344307e-01 1.134412987986936801e-02 +8.535276512187899789e+04 2.115923403934457103e-01 1.050476812292224990e-02 +8.547025000160629861e+04 2.504487138201756946e-01 1.175831591722686052e-02 +8.558773488133358478e+04 2.455786466951162261e-01 1.139935194394717244e-02 +8.570521976106088550e+04 2.268553791727657420e-01 1.127642961039109111e-02 +8.582270464078817167e+04 2.248863312314465790e-01 1.095836036730804888e-02 +8.594018952051548695e+04 2.254954114687338362e-01 1.106317772282018434e-02 +8.605767440024275857e+04 2.446001562405590024e-01 1.144035643752968484e-02 +8.617515927997007384e+04 2.387864111182593507e-01 1.126076189836724452e-02 +8.629264415969734546e+04 2.347155402254920975e-01 1.094391923862396247e-02 +8.641012903942466073e+04 2.403404991250415457e-01 1.148575532773789959e-02 +8.652761391915193235e+04 2.322908215480234961e-01 1.091503769786278735e-02 +8.664509879887924762e+04 2.541243043793154910e-01 1.191668949628181540e-02 +8.676258367860651924e+04 2.622991418023756238e-01 1.194270827295045197e-02 +8.688006855833383452e+04 2.392626319972793736e-01 1.103547064533561516e-02 +8.699755343806110614e+04 2.440509527338726725e-01 1.140794113780237151e-02 +8.711503831778842141e+04 2.205875710659934708e-01 1.088301980007597321e-02 +8.723252319751570758e+04 2.540655245990858790e-01 1.155785144461297757e-02 +8.735000807724300830e+04 2.351072959677929231e-01 1.106866436914643106e-02 +8.746749295697029447e+04 2.523690079386587959e-01 1.152452130540374854e-02 +8.758497783669759519e+04 2.390161906705245698e-01 1.097316671745359080e-02 +8.770246271642488136e+04 2.434782981924367984e-01 1.098168868145680925e-02 +8.781994759615218209e+04 2.368862424649141041e-01 1.109846355229609539e-02 +8.793743247587946826e+04 2.568747079220431440e-01 1.147640538449756255e-02 +8.805491735560676898e+04 2.468716072514495763e-01 1.158343232046775938e-02 +8.817240223533405515e+04 2.450538511805538111e-01 1.125921497434179651e-02 +8.828988711506135587e+04 2.326612976564627067e-01 1.041035772694169810e-02 +8.840737199478864204e+04 2.409907685509790343e-01 1.104967146238102979e-02 +8.852485687451594276e+04 2.410486196689766158e-01 1.075584891394720452e-02 +8.864234175424322893e+04 2.542791922202619626e-01 1.172658705040070456e-02 +8.875982663397052966e+04 2.487136338956549009e-01 1.107665123223781911e-02 +8.887731151369781583e+04 2.349966290410357150e-01 1.088017010213396252e-02 +8.899479639342511655e+04 2.636904806082637220e-01 1.168454383016104617e-02 +8.911228127315240272e+04 2.467052367784499378e-01 1.128062252658268601e-02 +8.922976615287971799e+04 2.414286148988728231e-01 1.102986774470776990e-02 +8.934725103260698961e+04 2.399044597116381239e-01 1.102598573054756025e-02 +8.946473591233430489e+04 2.374008998357685918e-01 1.089107322722213111e-02 +8.958222079206157650e+04 2.433681524383710382e-01 1.083995225006499814e-02 +8.969970567178889178e+04 2.229701176916610850e-01 1.040101131530981118e-02 +8.981719055151616340e+04 2.269806649839689050e-01 1.044353421560286280e-02 +8.993467543124347867e+04 2.448944228894550101e-01 1.104171734536066839e-02 +9.005216031097075029e+04 2.437929677409204077e-01 1.075850071883872015e-02 +9.016964519069805101e+04 2.429366177937539173e-01 1.091876648117540670e-02 +9.028713007042533718e+04 2.497607402583381930e-01 1.133346051684374148e-02 +9.040461495015263790e+04 2.673288808654772364e-01 1.145960347926451225e-02 +9.052209982987993862e+04 2.692554995982928689e-01 1.158096527853953728e-02 +9.063958470960722480e+04 2.471859276062864930e-01 1.108540533676991881e-02 +9.075706958933452552e+04 2.712037404420062914e-01 1.174798025226952980e-02 +9.087455446906181169e+04 2.446963607048677491e-01 1.106162640539137820e-02 +9.099203934878911241e+04 2.494825865655170005e-01 1.110403779537625160e-02 +9.110952422851639858e+04 2.374509662145194433e-01 1.105056662068712621e-02 +9.122700910824369930e+04 2.236936392222478864e-01 1.008867988709542980e-02 +9.134449398797098547e+04 2.281142220243304042e-01 1.041261683242979130e-02 +9.146197886769828619e+04 2.354430784760714879e-01 1.058684565677522546e-02 +9.157946374742557236e+04 2.521982886908827326e-01 1.124237688702390756e-02 +9.169694862715287309e+04 2.140988245623053343e-01 9.945762349716311818e-03 +9.181443350688015926e+04 2.402196011578697499e-01 1.074350018077753488e-02 +9.193191838660745998e+04 2.495712816829033232e-01 1.077320136056984096e-02 +9.204940326633476070e+04 2.256516572224245010e-01 1.014260754218515755e-02 +9.216688814606204687e+04 2.585247737508243326e-01 1.110511451252669569e-02 +9.228437302578934759e+04 2.641138988730946657e-01 1.097746208796351007e-02 +9.240185790551663376e+04 2.856368967852610519e-01 1.111794418660644844e-02 +9.251934278524393449e+04 2.940639618343212636e-01 1.057484067058013510e-02 +9.263682766497122066e+04 3.346807272316177362e-01 1.137442755981196187e-02 +9.275431254469852138e+04 3.690270465839171621e-01 1.112492544762257347e-02 +9.287179742442580755e+04 4.720799185659342867e-01 1.154890259626635378e-02 +9.298928230415310827e+04 5.701145817822420581e-01 1.147104344746549195e-02 +9.310676718388039444e+04 7.166782660968731289e-01 1.226968652708650825e-02 +9.322425206360769516e+04 9.262942931885581599e-01 1.341657243622912214e-02 +9.334173694333498133e+04 9.711632190673806786e-01 1.347157385779203936e-02 +9.345922182306228206e+04 8.857163148553062193e-01 1.305524059645513102e-02 +9.357670670278958278e+04 7.126479162983397897e-01 1.290284990289426205e-02 +9.369419158251686895e+04 5.409442454143157386e-01 1.239457300524312786e-02 +9.381167646224416967e+04 4.242034901285901549e-01 1.117351107482072135e-02 +9.392916134197145584e+04 3.526572050413880333e-01 1.105166429727582472e-02 +9.404664622169875656e+04 3.068098308439413668e-01 1.067919388079890952e-02 +9.416413110142604273e+04 3.079727767314518472e-01 1.127422505272768910e-02 +9.428161598115334345e+04 2.685575582279924323e-01 1.078621126692638765e-02 +9.439910086088062963e+04 2.638921715712007066e-01 1.103318940002177666e-02 +9.451658574060793035e+04 2.396315294814058139e-01 1.057503497142174217e-02 +9.463407062033521652e+04 2.326848882218328640e-01 1.053237009139014989e-02 +9.475155550006251724e+04 2.621720924207842085e-01 1.157412862709324489e-02 +9.486904037978980341e+04 2.268480643523560769e-01 1.057975565647393396e-02 +9.498652525951710413e+04 2.383940356719330966e-01 1.078156711116825921e-02 +9.510401013924440485e+04 2.346014507354489964e-01 1.049442899830104088e-02 +9.522149501897169102e+04 2.646163907112967784e-01 1.176019976079362150e-02 +9.533897989869899175e+04 2.337829883299970823e-01 1.047669520070074016e-02 +9.545646477842627792e+04 2.687860790983300774e-01 1.172187282516169715e-02 +9.557394965815357864e+04 2.882913936563240576e-01 1.207598450491083678e-02 +9.569143453788086481e+04 2.947125682312523587e-01 1.213782627944392720e-02 +9.580891941760816553e+04 3.370772376071001775e-01 1.326831027828798484e-02 +9.592640429733545170e+04 3.823864349516625794e-01 1.435494896341133614e-02 +9.604388917706275242e+04 4.492448385088455010e-01 1.554621884290629218e-02 +9.616137405679003859e+04 4.576440592257060569e-01 1.565929452066485567e-02 +9.627885893651733932e+04 4.252879162505428523e-01 1.488811826441259131e-02 +9.639634381624462549e+04 3.933209765278379844e-01 1.450807164435903747e-02 +9.651382869597192621e+04 3.562275702997366733e-01 1.403544532616619878e-02 +9.663131357569921238e+04 3.166256071250094783e-01 1.305430409192362244e-02 +9.674879845542651310e+04 2.816958144785192131e-01 1.233384564190660032e-02 +9.686628333515381382e+04 2.751910618827491661e-01 1.242041783047625331e-02 +9.698376821488109999e+04 2.419670037513425853e-01 1.091977463079796956e-02 +9.710125309460840072e+04 2.467337342348722706e-01 1.121276435181491754e-02 +9.721873797433568689e+04 2.324073160108961755e-01 1.108972888931556745e-02 +9.733622285406298761e+04 2.277431194329681552e-01 1.085846818857879280e-02 +9.745370773379025923e+04 2.283646174108394933e-01 1.044078831814559266e-02 +9.757119261351757450e+04 2.124940524969559652e-01 1.020015193533271164e-02 +9.768867749324484612e+04 2.339774846935772368e-01 1.148157012777625656e-02 +9.780616237297216139e+04 2.240870624075844142e-01 1.040706610767724340e-02 +9.792364725269944756e+04 2.508614851583843564e-01 1.138376155796188074e-02 +9.804113213242674829e+04 2.217675020523723617e-01 1.040480640364378935e-02 +9.815861701215403446e+04 2.446512247930383299e-01 1.184410763625304806e-02 +9.827610189188133518e+04 2.244422255708350966e-01 1.062065134804501820e-02 +9.839358677160862135e+04 2.392470741072987295e-01 1.166154542318707105e-02 +9.851107165133592207e+04 2.412779521088068702e-01 1.171633154536276707e-02 +9.862855653106320824e+04 2.104512050484133034e-01 1.032010372723256644e-02 +9.874604141079050896e+04 2.416008747302485493e-01 1.174457550410270244e-02 +9.886352629051779513e+04 2.289083021975752696e-01 1.074508518861790399e-02 +9.898101117024509585e+04 2.196232971450560456e-01 1.078537561621299365e-02 +9.909849604997238202e+04 2.193773001104861453e-01 1.094128553271097280e-02 +9.921598092969968275e+04 2.077491182044146900e-01 1.007666437943702427e-02 +9.933346580942696892e+04 2.310452861877522746e-01 1.131573124288017332e-02 +9.945095068915426964e+04 2.166090737789030940e-01 1.072068147108341633e-02 +9.956843556888155581e+04 2.219557928861534135e-01 1.081501638642971309e-02 +9.968592044860885653e+04 2.208351741512233346e-01 1.126380685696272768e-02 +9.980340532833614270e+04 2.068052402878251816e-01 1.035076363214740801e-02 +9.992089020806345798e+04 2.345090222897882604e-01 1.166418473095150177e-02 +1.000383750877907296e+05 2.212858838328070621e-01 1.099179334975830015e-02 +1.001558599675180449e+05 2.338783036068806664e-01 1.205542793523114824e-02 +1.002733448472453165e+05 2.594285886406736963e-01 1.285329418128887055e-02 +1.003908297269726318e+05 2.199993079236126636e-01 1.141739303596478287e-02 +1.005083146066999034e+05 2.392505591907489459e-01 1.171846689458710088e-02 +1.006257994864272187e+05 2.353225943378983442e-01 1.186656905039768992e-02 +1.007432843661544903e+05 2.292927764839515492e-01 1.185785108688810346e-02 +1.008607692458818055e+05 2.396065837797195786e-01 1.146840652835138565e-02 +1.009782541256090772e+05 2.143105905088254770e-01 1.061592785341150362e-02 +1.010957390053363924e+05 2.436492104373796097e-01 1.173199296063023346e-02 +1.012132238850636786e+05 2.494619826143534835e-01 1.169070741808782461e-02 +1.013307087647909793e+05 2.597018067946054720e-01 1.266541204274185088e-02 +1.014481936445182655e+05 2.333872469661280868e-01 1.150074571830989913e-02 +1.015656785242455662e+05 2.551792133585535916e-01 1.207262876273582607e-02 +1.016831634039728524e+05 2.713945736255545249e-01 1.234918992983388350e-02 +1.018006482837001531e+05 2.556113971062462520e-01 1.150552294785175261e-02 +1.019181331634274393e+05 2.789840885978011609e-01 1.213774689111053219e-02 +1.020356180431547400e+05 2.769559954599709606e-01 1.156875779288939199e-02 +1.021531029228820262e+05 3.138817712460071352e-01 1.259239405096566032e-02 +1.022705878026093269e+05 3.074740334962498545e-01 1.216446341362712076e-02 +1.023880726823366131e+05 3.075027838767253052e-01 1.232019661893228590e-02 +1.025055575620639138e+05 2.541006043945929771e-01 1.041654610476908625e-02 +1.026230424417912000e+05 2.856598928390500780e-01 1.282137680602293481e-02 +1.027405273215185007e+05 2.698709432729959334e-01 1.255016874266030869e-02 +1.028580122012457869e+05 2.427745146336031667e-01 1.177583926589783996e-02 +1.029754970809731021e+05 2.474902495722011708e-01 1.225750885597640463e-02 +1.030929819607003737e+05 2.375006616770269641e-01 1.199211870602138498e-02 +1.032104668404276890e+05 2.400759360484121530e-01 1.272602188867557119e-02 +1.033279517201549606e+05 2.242038052757907296e-01 1.215526796763156253e-02 +1.034454365998822759e+05 2.362420165046576481e-01 1.270110423878791604e-02 +1.035629214796095475e+05 2.433606859877452122e-01 1.337908186069694701e-02 +1.036804063593368628e+05 2.339837664490622415e-01 1.283319250834981384e-02 +1.037978912390641344e+05 2.269166074205836992e-01 1.240708271463418153e-02 +1.039153761187914497e+05 2.594075163653213889e-01 1.425655922976838338e-02 +1.040328609985187213e+05 2.386026807102224478e-01 1.331341476032305363e-02 +1.041503458782460366e+05 2.083703647533003689e-01 1.163399014806285395e-02 +1.042678307579733228e+05 2.193209901413262497e-01 1.171049990175818643e-02 +1.043853156377006235e+05 2.149551201381922072e-01 1.162058518855914324e-02 +1.045028005174279097e+05 2.489993959478950247e-01 1.365579640916535741e-02 +1.046202853971552104e+05 2.403981119551927559e-01 1.375304180003374295e-02 +1.047377702768824965e+05 2.248554544807151445e-01 1.275690464002751483e-02 +1.048552551566097973e+05 2.588853183505293032e-01 1.395520065485957376e-02 +1.049727400363370834e+05 2.402449268522730830e-01 1.376167378782915465e-02 +1.050902249160643842e+05 2.193957638883676231e-01 1.286485492338918998e-02 +1.052077097957916703e+05 2.310097201192728988e-01 1.329623336715051937e-02 +1.053251946755189711e+05 2.603613244322567355e-01 1.425035131311929923e-02 +1.054426795552462572e+05 2.579493755358049367e-01 1.455506685920229457e-02 +1.055601644349735579e+05 2.496388641445785317e-01 1.455235403245119102e-02 +1.056776493147008441e+05 2.202022876310867905e-01 1.316005433499709866e-02 +1.057951341944281448e+05 2.108514454565982577e-01 1.282103584540436429e-02 +1.059126190741554310e+05 2.126016382287385376e-01 1.255461905550517981e-02 +1.060301039538827317e+05 2.276001056556641589e-01 1.349233320575559357e-02 +1.061475888336100179e+05 2.432816409335315233e-01 1.411858942187371388e-02 +1.062650737133373332e+05 2.217773248214115200e-01 1.347043762380568423e-02 +1.063825585930646048e+05 2.179983833072072774e-01 1.297605785011075874e-02 +1.065000434727919201e+05 2.058262019921825170e-01 1.214159313442642919e-02 +1.066175283525191917e+05 2.091853525079675202e-01 1.255607982524824598e-02 +1.067350132322465070e+05 2.472445345833340080e-01 1.445809116804101790e-02 +1.068524981119737786e+05 2.185521567729556691e-01 1.295024412231593307e-02 +1.069699829917010939e+05 2.182834375948058125e-01 1.308055332304250938e-02 +1.070874678714283655e+05 2.373834839900824112e-01 1.423237022652786010e-02 +1.072049527511556807e+05 2.215421127287066916e-01 1.351061597320783909e-02 +1.073224376308829524e+05 2.141908209046155809e-01 1.286709262406270267e-02 +1.074399225106102676e+05 2.224598741399155810e-01 1.379190684803868229e-02 +1.075574073903375538e+05 2.143698681664308048e-01 1.295031901055987596e-02 +1.076748922700648545e+05 2.077380945877449758e-01 1.188668005477101774e-02 +1.077923771497921407e+05 2.560195873053874860e-01 1.470779113173182120e-02 +1.079098620295194414e+05 2.302025228158773584e-01 1.348340523180930998e-02 +1.080273469092467276e+05 2.251790018645438984e-01 1.339300627767091821e-02 +1.081448317889740283e+05 2.266611296936791586e-01 1.388316552759024172e-02 +1.082623166687013145e+05 2.412857661651856833e-01 1.468604492694627374e-02 +1.083798015484286152e+05 2.423347231519440981e-01 1.490355418227259747e-02 +1.084972864281559014e+05 2.383842911003844767e-01 1.447944580790597700e-02 +1.086147713078832021e+05 2.481051874116829148e-01 1.571823837416662720e-02 +1.087322561876104883e+05 2.456925177242854919e-01 1.427728697299581774e-02 +1.088497410673377744e+05 2.244972793760436069e-01 1.329598324580835884e-02 +1.089672259470650752e+05 2.495505737830834569e-01 1.516517779666301177e-02 +1.090847108267923613e+05 2.068720771858999219e-01 1.353299886513123322e-02 +1.092021957065196621e+05 2.435496394073541349e-01 1.462051821498635065e-02 +1.093196805862469482e+05 2.500636473709054175e-01 1.629265576406232346e-02 +1.094371654659742489e+05 2.427451344971307268e-01 1.468008277271494813e-02 +1.095546503457015351e+05 2.348835866725982602e-01 1.478012307297644698e-02 +1.096721352254288358e+05 2.245301770287964627e-01 1.424925985347576946e-02 +1.097896201051561220e+05 2.116633451065770000e-01 1.393112069210339365e-02 +1.099071049848834227e+05 2.379739472515425003e-01 1.430994677312849572e-02 +1.100245898646107089e+05 2.209530532987007967e-01 1.430224251874450542e-02 +1.101420747443380096e+05 2.296498644074938811e-01 1.403712129600446362e-02 +1.102595596240652958e+05 2.313645555786927044e-01 1.412546008659467181e-02 +1.103770445037925965e+05 2.403784118148158400e-01 1.483098561413646876e-02 +1.104945293835198827e+05 1.864127145610335601e-01 1.252995002229595131e-02 +1.106120142632471980e+05 2.305394090040071009e-01 1.489049680731549009e-02 +1.107294991429744696e+05 2.585404724007095423e-01 1.651381782264910864e-02 +1.108469840227017849e+05 2.244416304849835286e-01 1.491827348717686234e-02 +1.109644689024290565e+05 2.501679058655378873e-01 1.558499145114783380e-02 +1.110819537821563717e+05 2.289975332616484560e-01 1.470767196005642874e-02 +1.111994386618836434e+05 2.465034222637831895e-01 1.575613260040524891e-02 +1.113169235416109586e+05 2.674511575259220231e-01 1.726164138722591224e-02 +1.114344084213382303e+05 2.566808441881203717e-01 1.662614313308320366e-02 +1.115518933010655455e+05 2.976243178151989355e-01 1.840609222962810709e-02 +1.116693781807928171e+05 3.405774481740634907e-01 2.169561299963925979e-02 +1.117868630605201324e+05 3.409394193217474278e-01 2.076229044733053988e-02 +1.119043479402474186e+05 4.003610246296546160e-01 2.234622138115515896e-02 +1.120218328199747193e+05 4.791932271364964246e-01 2.719754031568687863e-02 +1.121393176997020055e+05 5.281446387701528300e-01 2.902232479908265980e-02 +1.122568025794293062e+05 6.654687168938603348e-01 3.483404539129326266e-02 +1.123742874591565924e+05 7.309477997439035590e-01 3.544846184369733477e-02 +1.124917723388838931e+05 9.948043745081123213e-01 4.594105349796404059e-02 +1.126092572186111793e+05 1.166925524108633372e+00 4.858777720320460458e-02 +1.127267420983384800e+05 1.436334956132423457e+00 5.513615501373247269e-02 +1.128442269780657662e+05 1.856308363975737841e+00 6.486541256714803416e-02 +1.129617118577930669e+05 2.217030258395859210e+00 7.258645492516629938e-02 +1.130791967375203531e+05 2.549939244746350475e+00 7.705635980236676119e-02 +1.131966816172476538e+05 3.108652140233421513e+00 8.605858239269409404e-02 +1.133141664969749399e+05 3.661227500133411361e+00 9.443881091588751664e-02 +1.134316513767022407e+05 3.998171335683280425e+00 9.911040379244985543e-02 +1.135491362564295268e+05 4.751888029075893805e+00 1.093977451946266527e-01 +1.136666211361568276e+05 5.552436832036200087e+00 1.182588426800536274e-01 +1.137841060158841137e+05 5.964069196961370167e+00 1.232824284812730348e-01 +1.139015908956114290e+05 6.705451856319442072e+00 1.312227223350376226e-01 +1.140190757753387006e+05 7.057566917878198787e+00 1.358540753410417690e-01 +1.141365606550660159e+05 7.378308629436899579e+00 1.394088080614944714e-01 +1.142540455347932875e+05 7.809876180850787719e+00 1.440946633544973876e-01 +1.143715304145206028e+05 7.585981091293604095e+00 1.421967430586363601e-01 +1.144890152942478744e+05 7.814357741004222646e+00 1.455417771239653768e-01 +1.146065001739751897e+05 6.970194112394607622e+00 1.372597370649631943e-01 +1.147239850537024613e+05 6.674095723476483499e+00 1.358181062094493130e-01 +1.148414699334297766e+05 6.036634315253600391e+00 1.287293363759010045e-01 +1.149589548131570627e+05 5.247697641134750235e+00 1.196452701971979643e-01 +1.150764396928843635e+05 4.520484278890338103e+00 1.105516627016990411e-01 +1.151939245726116496e+05 4.157522376014259891e+00 1.057370988908770959e-01 +1.153114094523389504e+05 3.589060523089417476e+00 9.982551344772683244e-02 +1.154288943320662365e+05 3.137215620300946917e+00 9.353358239345090086e-02 +1.155463792117935373e+05 2.456669677221676285e+00 8.215080620729382777e-02 +1.156638640915208234e+05 2.081439910432856699e+00 7.579960837044945332e-02 +1.157813489712481241e+05 1.665778149431258681e+00 6.736391808962144401e-02 +1.158988338509754103e+05 1.425746661715816099e+00 6.242005930863187696e-02 +1.160163187307027110e+05 1.076159006450872146e+00 5.365450858573964782e-02 +1.161338036104299972e+05 7.895205513728150715e-01 4.298994015453794226e-02 +1.162512884901572979e+05 6.332499863917293581e-01 3.796518650292145247e-02 +1.163687733698845841e+05 5.602562432706161832e-01 3.520736652831734509e-02 +1.164862582496118848e+05 4.248687006117683462e-01 2.839318537613583562e-02 +1.166037431293391710e+05 3.575948319059084057e-01 2.550869503846947550e-02 +1.167212280090664717e+05 3.421286163822018223e-01 2.198207331553045027e-02 +1.168387128887937579e+05 3.513020957197742211e-01 2.350096840739717211e-02 +1.169561977685210732e+05 2.783192458258862412e-01 1.874389491850804793e-02 +1.170736826482483448e+05 2.519406252022912129e-01 1.760080276576658428e-02 +1.171911675279756601e+05 2.568269748095718952e-01 1.870011361175020342e-02 +1.173086524077029317e+05 2.445369103143682221e-01 1.616009315161530402e-02 +1.174261372874302469e+05 2.254687958657485003e-01 1.549507036601656743e-02 +1.175436221671575186e+05 2.329388923796853195e-01 1.650750732439636159e-02 +1.176611070468848338e+05 1.948286713818560556e-01 1.407988962033462389e-02 +1.177785919266121055e+05 2.201185238399131217e-01 1.555396731038732015e-02 +1.178960768063394207e+05 2.566902269271682524e-01 1.774481445268855789e-02 +1.180135616860666923e+05 2.259261076900802856e-01 1.649021640610611600e-02 +1.181310465657940076e+05 2.140946464771740776e-01 1.642104686388786566e-02 +1.182485314455212938e+05 2.332173602239309140e-01 1.654603608750747704e-02 +1.183660163252485945e+05 2.265365070374532608e-01 1.565139352974590295e-02 +1.184835012049758807e+05 2.282787159104447960e-01 1.589470251103435386e-02 +1.186009860847031814e+05 2.147948223764836462e-01 1.582365694959793345e-02 +1.187184709644304676e+05 2.237662991661819034e-01 1.655895419290424886e-02 +1.188359558441577683e+05 2.098432690929404043e-01 1.584553523648514831e-02 +1.189534407238850545e+05 2.527152176844035258e-01 1.880899878213900325e-02 +1.190709256036123552e+05 2.140485547679393530e-01 1.600105056860163383e-02 +1.191884104833396414e+05 2.135533347741424282e-01 1.573490363539525871e-02 +1.193058953630669421e+05 2.228634622593697601e-01 1.632589812169780649e-02 +1.194233802427942283e+05 2.404227751992798479e-01 1.664399871644330411e-02 +1.195408651225215290e+05 2.194417956189916308e-01 1.604227348660577923e-02 +1.196583500022488151e+05 2.528683557313506913e-01 1.798829880647222212e-02 +1.197758348819761159e+05 2.250847666114388634e-01 1.679793017396393265e-02 +1.198933197617034020e+05 2.474762985825435524e-01 1.767083769161257797e-02 +1.200108046414307028e+05 2.233473069937113031e-01 1.635007691336961763e-02 +1.201282895211579889e+05 2.093531359614556608e-01 1.503084665841967170e-02 +1.202457744008853042e+05 2.134997126705191761e-01 1.533010432488371780e-02 +1.203632592806125758e+05 2.353727424110668986e-01 1.684813577109831387e-02 +1.204807441603398911e+05 2.698231905243265727e-01 1.877848226490577005e-02 +1.205982290400671627e+05 2.208243130842004465e-01 1.636389705230478081e-02 +1.207157139197944780e+05 2.140866136553914167e-01 1.599842808612646564e-02 +1.208331987995217496e+05 2.257224662300148232e-01 1.644871119188045724e-02 +1.209506836792490649e+05 2.052849227142077571e-01 1.640992369978581250e-02 +1.210681685589763365e+05 2.246002751399630015e-01 1.743728385482986101e-02 +1.211856534387036518e+05 2.494392002161015254e-01 1.838825778320467980e-02 +1.213031383184309379e+05 2.317702068165096441e-01 1.707771227784538048e-02 +1.214206231981582387e+05 2.256074396697411999e-01 1.610392722853403250e-02 +1.215381080778855248e+05 2.309882096485998959e-01 1.691718526438677761e-02 +1.216555929576128256e+05 2.175813337568766048e-01 1.696047289573238137e-02 +1.217730778373401117e+05 2.297045493375270975e-01 1.724609268167373935e-02 +1.218905627170674124e+05 2.104220640488875527e-01 1.610734758322386953e-02 +1.220080475967946986e+05 2.386278858531523939e-01 1.808509018508428629e-02 +1.221255324765219993e+05 2.231847172009840952e-01 1.720381394283936397e-02 +1.222430173562492855e+05 2.413273245974097148e-01 1.711287546082848263e-02 +1.223605022359765862e+05 2.227511958614360188e-01 1.925876107207787069e-02 +1.224779871157038724e+05 2.166832747249904101e-01 1.651409119081825166e-02 +1.225954719954311731e+05 2.328376777336592096e-01 1.799450457656018298e-02 +1.227129568751584593e+05 2.290692127756792096e-01 1.791753012921570160e-02 +1.228304417548857600e+05 2.129917079219728338e-01 1.679328662355511481e-02 +1.229479266346130462e+05 2.239720974285371036e-01 1.830095611507877654e-02 +1.230654115143403469e+05 2.144435919340253460e-01 1.690440211314702887e-02 +1.231828963940676331e+05 2.026482938215892204e-01 1.573039755930690647e-02 +1.233003812737949484e+05 2.228980483574817539e-01 1.794370004543157857e-02 +1.234178661535222200e+05 2.225207222887532199e-01 1.752542732390620014e-02 +1.235353510332495352e+05 1.969937765898790716e-01 1.581272156651533992e-02 +1.236528359129768069e+05 2.420982073125591827e-01 1.868152556693021202e-02 +1.237703207927040930e+05 2.524741812215208769e-01 1.915236184335301559e-02 +1.238878056724313938e+05 2.346295141400547846e-01 1.753849854511061943e-02 +1.240052905521586799e+05 2.264092338347447331e-01 1.776859120070288511e-02 +1.241227754318859807e+05 2.341119348157043034e-01 1.814556247896692912e-02 +1.242402603116132668e+05 2.145317704061421582e-01 1.719346514053650410e-02 +1.243577451913405675e+05 2.317732743845295762e-01 1.711292127789928313e-02 +1.244752300710678537e+05 2.045581435172956208e-01 1.556129574090322175e-02 +1.245927149507951690e+05 2.440007904537500882e-01 1.883548078757719263e-02 +1.247101998305224406e+05 2.434432537949161590e-01 1.974430153953530415e-02 +1.248276847102497559e+05 2.170560676460491223e-01 1.757776148034769295e-02 +1.249451695899770275e+05 2.090695391501743994e-01 1.652805630038831769e-02 +1.250626544697043428e+05 2.309376534094533528e-01 1.892397010171012472e-02 +1.251801393494316144e+05 2.117037453223024890e-01 1.714847145595811695e-02 +1.252976242291589297e+05 2.417421402580183509e-01 1.904509593157632449e-02 +1.254151091088862013e+05 2.034405134687605199e-01 1.629408505734642257e-02 +1.255325939886135166e+05 2.391198012418365992e-01 1.825764081070993181e-02 +1.256500788683407882e+05 2.230834837973324769e-01 1.798751391621165874e-02 +1.257675637480681035e+05 2.365073370602275571e-01 1.858943069147862837e-02 +1.258850486277953896e+05 2.367345876709884001e-01 1.917805779537342173e-02 +1.260025335075226903e+05 2.328148250909625738e-01 1.727307588020270818e-02 +1.261200183872499765e+05 2.259409369944247459e-01 1.788626813329623894e-02 +1.262375032669772772e+05 1.948756480923007073e-01 1.571530902384576933e-02 +1.263549881467045634e+05 1.942284877770625862e-01 1.590756597001957012e-02 +1.264724730264318641e+05 2.072562477595510932e-01 1.719254983411123636e-02 +1.265899579061591503e+05 2.504822925644161757e-01 1.937369743387563209e-02 +1.267074427858864510e+05 2.399929479848841585e-01 1.932568401944073297e-02 +1.268249276656137372e+05 2.082315319693070488e-01 1.691042422069126416e-02 +1.269424125453410379e+05 2.325165238108052312e-01 1.753624760195370350e-02 +1.270598974250683241e+05 2.363682571559889978e-01 1.903088352785659021e-02 +1.271773823047956248e+05 2.450238662917161303e-01 1.935184477633975636e-02 +1.272948671845229110e+05 1.802932460305764206e-01 1.546129763664735868e-02 +1.274123520642502117e+05 2.446895024759105086e-01 2.070380376207851467e-02 +1.275298369439774979e+05 2.460659649795940151e-01 1.931861264447571128e-02 +1.276473218237048131e+05 2.282771628107461703e-01 1.783704161173264510e-02 +1.277648067034320848e+05 2.352010493224142851e-01 1.922642366514439385e-02 +1.278822915831594000e+05 2.450778110978650837e-01 2.017146236124153780e-02 +1.279997764628866717e+05 2.670799629815789888e-01 2.057558967194471691e-02 +1.281172613426139869e+05 2.006155931560232863e-01 1.778424666490622738e-02 +1.282347462223412585e+05 2.679087560207915053e-01 2.355266937517784195e-02 +1.283522311020685738e+05 2.883276397278663472e-01 2.421355787114329305e-02 +1.284697159817958454e+05 2.829767145070997691e-01 2.304583113609024597e-02 +1.285872008615231607e+05 3.223036260535277475e-01 2.752210190555570701e-02 +1.287046857412504323e+05 4.193350956025239107e-01 3.351368166819366362e-02 +1.288221706209777476e+05 3.996212113410264055e-01 3.240613013132868231e-02 +1.289396555007050338e+05 4.872896045690381928e-01 3.539606966877553718e-02 +1.290571403804323345e+05 6.215633054714929662e-01 4.487466299289910587e-02 +1.291746252601596207e+05 6.131008565629598728e-01 4.399295839663033142e-02 +1.292921101398869214e+05 7.589586889442243578e-01 5.007468714887838152e-02 +1.294095950196142076e+05 9.907271513889376324e-01 6.149813999675818321e-02 +1.295270798993415083e+05 1.146052409768538061e+00 6.350301742649488990e-02 +1.296445647790687945e+05 1.447581342406567773e+00 7.335075954425374078e-02 +1.297620496587960952e+05 1.764027001460912514e+00 8.333194307415237034e-02 +1.298795345385233813e+05 2.170668803926478319e+00 9.403645397231776004e-02 +1.299970194182506821e+05 2.279811816655127554e+00 9.436267552270123649e-02 +1.301145042979779682e+05 2.713606844222839598e+00 1.035058614401042909e-01 +1.302319891777052690e+05 2.836962841428707360e+00 1.055019713978366663e-01 +1.303494740574325551e+05 3.106750223002396893e+00 1.132337852419648128e-01 +1.304669589371598559e+05 3.494494061483244263e+00 1.168668267984635245e-01 +1.305844438168871420e+05 3.865952850461285450e+00 1.274420774969564907e-01 +1.307019286966144427e+05 4.306067896337864909e+00 1.324850837175406415e-01 +1.308194135763417289e+05 4.695921172822825618e+00 1.384074524724584754e-01 +1.309368984560690442e+05 5.581438824274327359e+00 1.543196107618371171e-01 +1.310543833357963158e+05 6.087618453667707819e+00 1.620075849690432446e-01 +1.311718682155236311e+05 6.469410649453312345e+00 1.671459710018292077e-01 +1.312893530952509027e+05 6.716191989424893372e+00 1.685022241291173062e-01 +1.314068379749782034e+05 7.341305164884164292e+00 1.778307012750021399e-01 +1.315243228547055041e+05 7.225103944694677871e+00 1.752216826650824510e-01 +1.316418077344328049e+05 7.354374014031952456e+00 1.763750130124747684e-01 +1.317592926141600765e+05 7.538671830070997615e+00 1.809531199024841386e-01 +1.318767774938873772e+05 7.862953831663602067e+00 1.903823994601530345e-01 +1.319942623736146779e+05 7.876353021437791035e+00 1.874720981547867704e-01 +1.321117472533419786e+05 8.396673196524037763e+00 1.950626918471315419e-01 +1.322292321330692503e+05 7.761538351802085955e+00 1.881077241811713041e-01 +1.323467170127965801e+05 7.824832528430278877e+00 1.891455544554022095e-01 +1.324642018925238517e+05 7.190836426455124553e+00 1.801021123900239662e-01 +1.325816867722511524e+05 6.832212245410886453e+00 1.760635312852639744e-01 +1.326991716519784241e+05 6.620450760284724900e+00 1.757683352760807949e-01 +1.328166565317057539e+05 5.828987672853485513e+00 1.623470144569603424e-01 +1.329341414114330255e+05 5.970171372263425980e+00 1.656313474568123778e-01 +1.330516262911603262e+05 5.220235452874552706e+00 1.516264684446875788e-01 +1.331691111708875978e+05 5.003448411105026139e+00 1.505038838433579440e-01 +1.332865960506149277e+05 4.711544090177627986e+00 1.460179227630293564e-01 +1.334040809303421993e+05 4.038300677439967679e+00 1.350848626333875646e-01 +1.335215658100695000e+05 3.820419041166876806e+00 1.293850736131019197e-01 +1.336390506897968007e+05 3.214279182947023639e+00 1.185330671354298676e-01 +1.337565355695241014e+05 3.004018841332030565e+00 1.141892764801204774e-01 +1.338740204492513731e+05 2.597392316704508097e+00 1.068839393670230897e-01 +1.339915053289786738e+05 2.460184707716626562e+00 1.056180475031707894e-01 +1.341089902087059745e+05 2.185942600040531758e+00 9.834569134213144714e-02 +1.342264750884332752e+05 1.835490942889292931e+00 9.164953332607272962e-02 +1.343439599681605469e+05 1.503921425480966523e+00 7.919737725637163162e-02 +1.344614448478878476e+05 1.416873078545464404e+00 8.002239524169273144e-02 +1.345789297276151483e+05 1.192579766161664168e+00 6.958813224661981878e-02 +1.346964146073424490e+05 8.614364503569397202e-01 5.768772301303362604e-02 +1.348138994870697206e+05 7.554791424434922353e-01 5.381308112968142404e-02 +1.349313843667970214e+05 5.226712222545190079e-01 4.160244445968605542e-02 +1.350488692465243221e+05 4.889792513985166122e-01 4.047902166248545930e-02 +1.351663541262516228e+05 4.983100147427576565e-01 3.801009466240976714e-02 +1.352838390059788944e+05 4.001916668423292633e-01 3.205047968600271274e-02 +1.354013238857061951e+05 2.833738414840148434e-01 2.641830590498692177e-02 +1.355188087654334959e+05 3.631147241272152937e-01 2.848726703769758825e-02 +1.356362936451607966e+05 3.251759813468912963e-01 2.767295318349730776e-02 +1.357537785248880682e+05 2.457438948195440342e-01 2.394689619715225856e-02 +1.358712634046153980e+05 2.778412283483303047e-01 2.478598573705527441e-02 +1.359887482843426696e+05 2.799365264971197531e-01 2.501148691040391142e-02 +1.361062331640699704e+05 2.400021074282521760e-01 2.180426355473732633e-02 +1.362237180437972420e+05 2.432460854707270692e-01 2.159388001240633917e-02 +1.363412029235245718e+05 2.533056865515351253e-01 2.361127069082044963e-02 +1.364586878032518434e+05 2.419871295410692402e-01 2.097636429888202411e-02 +1.365761726829791442e+05 2.475715945232409010e-01 2.052938786121222617e-02 +1.366936575627064158e+05 2.379741300636333268e-01 2.211241247447837122e-02 +1.368111424424337456e+05 2.108183626424425805e-01 1.954009004613770084e-02 +1.369286273221610172e+05 2.057425954252680711e-01 2.097390546486326349e-02 +1.370461122018883179e+05 2.501861500724995024e-01 2.057499425965304135e-02 +1.371635970816156187e+05 2.092057486816185086e-01 1.914579445133246169e-02 +1.372810819613429194e+05 2.335065387922592994e-01 2.072075066108042263e-02 +1.373985668410701910e+05 2.414205917226931730e-01 2.099575120503082218e-02 +1.375160517207974917e+05 2.231611985527595654e-01 1.994772466325907961e-02 +1.376335366005247924e+05 2.250328115436325827e-01 2.053892177880790176e-02 +1.377510214802520932e+05 1.851442659335603980e-01 1.817563487944027362e-02 +1.378685063599793648e+05 1.960763895110924637e-01 1.817068168940171383e-02 +1.379859912397066655e+05 2.043771632584235054e-01 1.895275887944478793e-02 +1.381034761194339662e+05 1.947911359162619038e-01 1.873483711285511139e-02 +1.382209609991612670e+05 2.174081052850139473e-01 1.890193434111024293e-02 +1.383384458788885386e+05 2.292953239374515839e-01 2.081477263051159654e-02 +1.384559307586158393e+05 2.020282751899976359e-01 1.891656666013287816e-02 +1.385734156383431400e+05 2.255378998409990343e-01 1.986654327366763062e-02 +1.386909005180704407e+05 2.070791294227522783e-01 1.857175735010326012e-02 +1.388083853977977124e+05 2.333014018723337524e-01 2.183186935593352945e-02 +1.389258702775250131e+05 2.184424567253663574e-01 2.107082280441580080e-02 +1.390433551572523138e+05 2.475730669373260306e-01 2.263289303294371488e-02 +1.391608400369795854e+05 1.880235059952837240e-01 1.840799551279040033e-02 +1.392783249167068861e+05 2.043007775932030035e-01 1.904798950639484054e-02 +1.393958097964341869e+05 2.440265797343975085e-01 2.051823108812632010e-02 +1.395132946761614876e+05 2.359725476793890775e-01 2.442021174224642821e-02 +1.396307795558887592e+05 2.126931783032081913e-01 2.002717941365868282e-02 +1.397482644356160599e+05 2.232549744017370275e-01 1.979766452939403856e-02 +1.398657493153433606e+05 2.076095855034292004e-01 1.850978016227176892e-02 +1.399832341950706614e+05 2.402444745013241345e-01 2.118922530102374316e-02 +1.401007190747979330e+05 2.173583822977477598e-01 2.006719390103689146e-02 +1.402182039545252628e+05 2.360327042689593646e-01 2.264981627386492002e-02 +1.403356888342525344e+05 2.068953411867287262e-01 1.948168249475263486e-02 +1.404531737139798352e+05 1.994784416143469685e-01 1.861490632362236552e-02 +1.405706585937071068e+05 2.275711798067840685e-01 2.114707078785809866e-02 +1.406881434734344366e+05 2.317918013514492781e-01 2.153691857426428755e-02 +1.408056283531617082e+05 2.190210484030785665e-01 2.153844901665821071e-02 +1.409231132328890089e+05 2.249084909649597674e-01 2.106247608013264716e-02 +1.410405981126162806e+05 2.252589136910122525e-01 2.123635881810173945e-02 +1.411580829923436104e+05 2.168771303341062162e-01 2.015661958632691125e-02 +1.412755678720708820e+05 2.260393313379173430e-01 2.205798959344297885e-02 +1.413930527517981827e+05 2.267130040048858375e-01 2.228114662751935759e-02 +1.415105376315254834e+05 1.964599696023258402e-01 1.864531359569064281e-02 +1.416280225112527842e+05 2.061489893890988689e-01 1.987638711398324876e-02 +1.417455073909800558e+05 2.403635169820383666e-01 2.369818902367381783e-02 +1.418629922707073565e+05 2.199791046206352463e-01 2.163310613408632108e-02 +1.419804771504346572e+05 2.398798416912288067e-01 2.254727099854084496e-02 +1.420979620301619580e+05 2.152674690933043533e-01 2.135420562845135109e-02 +1.422154469098892296e+05 2.387728602089413399e-01 2.296478292232911542e-02 +1.423329317896165303e+05 1.930963875264040119e-01 1.984539078534280215e-02 +1.424504166693438310e+05 2.334064667464729459e-01 2.179311597013758317e-02 +1.425679015490711317e+05 2.303261044536974445e-01 2.125459535347871270e-02 +1.426853864287984034e+05 2.412974063878585707e-01 2.362855891619311532e-02 +1.428028713085257041e+05 2.364278647330163297e-01 2.256696187679142762e-02 +1.429203561882530048e+05 2.419127979305375487e-01 2.416660768635339393e-02 +1.430378410679803055e+05 2.206512503117442625e-01 2.395832619183502557e-02 +1.431553259477075771e+05 2.172162067273023245e-01 2.088279882974578699e-02 +1.432728108274349070e+05 2.130167082062490169e-01 2.023305772751932824e-02 +1.433902957071621786e+05 2.198243411731706787e-01 2.190282121331126389e-02 +1.435077805868894793e+05 2.044180052340493214e-01 2.011788225771195607e-02 +1.436252654666167509e+05 2.618921311611432934e-01 2.637129726137863242e-02 +1.437427503463440808e+05 1.817002918628866370e-01 1.896706885930996359e-02 +1.438602352260713524e+05 2.403975031839041543e-01 2.180060271804888303e-02 +1.439777201057986531e+05 2.066864803871902856e-01 2.004845302324301248e-02 +1.440952049855259247e+05 2.563789557114540818e-01 2.370922965704785196e-02 +1.442126898652532545e+05 2.436882386468995632e-01 2.387497345722550818e-02 +1.443301747449805262e+05 1.725394935028055354e-01 1.804199720066807996e-02 +1.444476596247078269e+05 2.403042606178949769e-01 2.358758484450338214e-02 +1.445651445044351276e+05 2.411013056732917437e-01 2.220441282491281837e-02 +1.446826293841624283e+05 1.836164270882989780e-01 1.831087911424300954e-02 +1.448001142638896999e+05 2.477587369863544497e-01 2.314994231499638636e-02 +1.449175991436170007e+05 2.458078150834430153e-01 2.345745091953123362e-02 +1.450350840233443014e+05 2.545839926221765692e-01 2.403085607764959483e-02 +1.451525689030716021e+05 2.293953119982797273e-01 2.260998504958860664e-02 +1.452700537827988737e+05 1.823000346346969891e-01 1.795026599894439245e-02 +1.453875386625261744e+05 2.508010463611186625e-01 2.389483842582058870e-02 +1.455050235422534752e+05 2.382650371170346726e-01 2.183769887801852855e-02 +1.456225084219807759e+05 1.947212898986235841e-01 1.934006251392738837e-02 +1.457399933017080475e+05 2.611740012967556646e-01 2.334109036592236022e-02 +1.458574781814353482e+05 2.199958776299537622e-01 2.084356186717264622e-02 +1.459749630611626490e+05 2.448706141207788733e-01 2.369772258431792830e-02 +1.460924479408899497e+05 2.647832594856187050e-01 2.533854235928310189e-02 +1.462099328206172213e+05 1.958631796110804901e-01 2.108702755181398811e-02 +1.463274177003445511e+05 2.457612778020611122e-01 2.383486275318819764e-02 +1.464449025800718227e+05 1.958506111854323439e-01 1.940963298382267221e-02 +1.465623874597991235e+05 2.221998704926612389e-01 2.250450219792940812e-02 +1.466798723395263951e+05 2.394536950887428406e-01 2.453411936772287652e-02 +1.467973572192537249e+05 2.006465454201287468e-01 2.004622795337769256e-02 diff --git a/tutorials/data/reduced_Si.xye b/tutorials/data/reduced_Si.xye new file mode 100644 index 00000000..a67bfe07 --- /dev/null +++ b/tutorials/data/reduced_Si.xye @@ -0,0 +1,902 @@ +# DIFC = 61445.893309194034 [µ/Å] L = 157.66268347144953 [m] two_theta = 100.86825208258315 [deg] +# tof [µs] Y [counts] E [counts] +4.307357120974501595e+04 2.614406030852304275e-01 9.767951624820182810e-02 +4.319646299636340700e+04 7.231481733808859946e-01 1.721440591230470607e-01 +4.331935478298179078e+04 9.067852969670007202e-01 1.960260175758943013e-01 +4.344224656960018183e+04 5.001423986218110906e-01 1.104052290789490492e-01 +4.356513835621856560e+04 2.330089848511389117e-01 6.232452021607914200e-02 +4.368803014283695666e+04 4.577950474058652824e-02 1.387764552011676832e-02 +4.381092192945534771e+04 2.747075657158290843e-02 1.786411939895242440e-02 +4.393381371607373148e+04 1.205752260938521535e-04 1.163792379326632551e-04 +4.405670550269212254e+04 3.301908011226034612e-01 3.087931772567463762e-01 +4.417959728931050631e+04 2.683216371230714437e-01 1.331409772491164156e-01 +4.430248907592889736e+04 3.693707285802512730e-01 1.301257074118656321e-01 +4.442538086254728842e+04 2.493195360120423310e+00 6.481348436571477967e-01 +4.454827264916567219e+04 1.301797237105924543e+00 3.426311654348359048e-01 +4.467116443578406324e+04 5.319153687090193428e-01 1.526588989729135148e-01 +4.479405622240244702e+04 1.895725211232355267e-01 8.748185055069722382e-02 +4.491694800902083807e+04 2.656566499896653027e-02 1.398572560811204603e-02 +4.503983979563922912e+04 1.217629066624106166e-01 7.695603080314572519e-02 +4.516273158225761290e+04 5.009300108108324760e-03 4.547738585340118343e-03 +4.528562336887600395e+04 4.932732597735289652e-03 3.882674447052707374e-03 +4.540851515549438773e+04 3.423506509463508651e-02 2.264345880095759711e-02 +4.553140694211277878e+04 4.868682786772584453e-02 4.135830858872623084e-02 +4.565429872873116983e+04 5.941579377354194551e-03 5.928345556125902936e-03 +4.577719051534955361e+04 6.180331079635076373e-05 6.180221910050190382e-05 +4.590008230196794466e+04 6.505283887576456122e-05 6.504814757370739567e-05 +4.602297408858632843e+04 3.208331024031151751e-02 3.189740248871294342e-02 +4.614586587520471949e+04 5.731290509123661281e-02 4.104294376534545902e-02 +4.626875766182311054e+04 3.014530028795526229e-01 1.004126170327893780e-01 +4.639164944844149431e+04 4.971366037320363307e-01 1.126915690211019033e-01 +4.651454123505988537e+04 7.284979724783806621e-01 1.418176418872806044e-01 +4.663743302167826914e+04 1.232631327790934428e+00 1.839644062609641362e-01 +4.676032480829666019e+04 4.027109967829009540e-01 6.595304295864261312e-02 +4.688321659491505125e+04 2.111016810293083745e-01 4.939225726456079185e-02 +4.700610838153343502e+04 3.708628835677264118e-02 1.131486228426300047e-02 +4.712900016815182607e+04 3.648262962744580010e-03 2.429422708590055213e-03 +4.725189195477020985e+04 2.766673890225774483e-03 1.945952910757313458e-03 +4.737478374138860090e+04 7.079477173320242525e-03 5.957348651336989015e-03 +4.749767552800698468e+04 1.146226340718213034e-02 1.039034057222208880e-02 +4.762056731462536845e+04 3.249535335454309393e-02 2.418044832365951260e-02 +4.774345910124375951e+04 1.407520989234909981e-01 4.547061429047930675e-02 +4.786635088786215056e+04 4.606839645354271484e-01 9.463777081355050080e-02 +4.798924267448053433e+04 3.589874945874731993e-01 6.640532147384839434e-02 +4.811213446109892539e+04 4.405166639576483800e-01 7.981437641385227821e-02 +4.823502624771730916e+04 2.697042634385895532e-01 4.978891513870355862e-02 +4.835791803433570021e+04 9.222552784581555807e-02 2.027009231605331196e-02 +4.848080982095409126e+04 2.551974472512043984e-02 1.030539298490122484e-02 +4.860370160757247504e+04 2.113258166389655676e-02 1.726188938857031382e-02 +4.872659339419086609e+04 3.224984127291242314e-02 2.118071863683338579e-02 +4.884948518080924987e+04 1.051812244683303409e-03 7.169688716341632946e-04 +4.897237696742764092e+04 1.158745161939888149e-02 7.450701706796339016e-03 +4.909526875404603197e+04 1.278874181192501437e-02 1.065352712427606457e-02 +4.921816054066441575e+04 9.641759631177023587e-03 9.641353865575552282e-03 +4.934105232728280680e+04 5.262633213090804618e-03 5.262401379450387662e-03 +4.946394411390119058e+04 1.673869704298438371e-02 1.315006096621162100e-02 +4.958683590051958163e+04 1.984306215762888184e-08 1.402696059279434149e-08 +4.970972768713797268e+04 2.165466453590308982e-03 1.691172704836307276e-03 +4.983261947375635646e+04 1.169663619546873912e-03 9.317179974710012875e-04 +4.995551126037474751e+04 3.242144967032938724e-02 2.164750739453711811e-02 +5.007840304699313128e+04 5.654520837650479914e-04 4.133372897113483935e-04 +5.020129483361152234e+04 5.517134189149992471e-03 3.403000536371954005e-03 +5.032418662022991339e+04 6.995630769789633330e-02 3.694041289084053908e-02 +5.044707840684829716e+04 1.194907936273317817e-01 3.785920400705055505e-02 +5.056997019346668822e+04 4.882028253657797467e-01 8.419872059384947427e-02 +5.069286198008507199e+04 6.431285285172693156e-01 9.580710894089691787e-02 +5.081575376670346304e+04 8.517134895684006501e-01 1.011830632316666756e-01 +5.093864555332185409e+04 4.641273198604962125e-01 7.307393161852447638e-02 +5.106153733994023787e+04 1.441971907393962138e-01 3.061603293947642510e-02 +5.118442912655862892e+04 8.513427858967401174e-02 2.495612401288760385e-02 +5.130732091317701997e+04 2.046042005914042866e-02 7.366699978875676687e-03 +5.143021269979540375e+04 7.732635176359513654e-03 7.293599742139712100e-03 +5.155310448641379480e+04 7.005934234496973001e-02 3.744529904561860745e-02 +5.167599627303217858e+04 8.805306102988463834e-02 5.643578336841002102e-02 +5.179888805965056963e+04 1.976742304404576628e-02 1.434334423227896088e-02 +5.192177984626896068e+04 9.829702431070690485e-03 8.952147661632209666e-03 +5.204467163288734446e+04 1.057653550478017124e-01 5.203744251898900081e-02 +5.216756341950573551e+04 1.196911340344748720e-01 5.180891689918713794e-02 +5.229045520612411929e+04 3.689557713670090222e-01 9.696744179751078108e-02 +5.241334699274251034e+04 6.053126581767869219e-01 1.140164339555282819e-01 +5.253623877936090139e+04 1.687657703251453922e+00 1.962942438617417962e-01 +5.265913056597928517e+04 1.998319527818617658e+00 1.975710586955810588e-01 +5.278202235259767622e+04 1.865819342188598684e+00 1.862126065520066653e-01 +5.290491413921605999e+04 1.019904274642519759e+00 1.314911281765574758e-01 +5.302780592583445105e+04 3.503459205505120022e-01 6.925590501883499561e-02 +5.315069771245284210e+04 1.293303333370788566e-01 3.789219135816129097e-02 +5.327358949907122587e+04 3.633071794638631502e-02 2.332942281493393527e-02 +5.339648128568961693e+04 1.486536860183792184e-02 9.107511471720852042e-03 +5.351937307230800070e+04 3.713217095558597053e-02 2.295080526107595026e-02 +5.364226485892639175e+04 2.543970329520079884e-02 1.785033629364798924e-02 +5.376515664554478280e+04 2.999912217960708227e-02 2.304899416752763039e-02 +5.388804843216315930e+04 6.837555478335138361e-03 6.418192910038218908e-03 +5.401094021878155036e+04 2.012247975209907518e-06 1.062765979248885761e-06 +5.413383200539994141e+04 2.186383746192708741e-02 1.165192742470247053e-02 +5.425672379201832518e+04 9.183945393694215031e-03 4.715392902878034163e-03 +5.437961557863671624e+04 9.990634524544284717e-03 6.521225225131757272e-03 +5.450250736525510001e+04 1.896450042214836013e-02 1.150268152857087008e-02 +5.462539915187349106e+04 3.843386591225760041e-02 2.406845580816299734e-02 +5.474829093849188212e+04 2.426361043744842266e-02 1.668145340213418246e-02 +5.487118272511026589e+04 9.928524873565465828e-03 6.764834874816595851e-03 +5.499407451172865694e+04 1.979502032998215963e-02 1.746625305087919772e-02 +5.511696629834704072e+04 4.641134270807505645e-03 3.524878144820037425e-03 +5.523985808496543177e+04 2.768273633847952164e-02 2.386275010725327772e-02 +5.536274987158382282e+04 9.820944545466992609e-03 6.081519042323904438e-03 +5.548564165820220660e+04 5.785088022376581873e-02 3.182367038426580502e-02 +5.560853344482059765e+04 9.170775453995628351e-03 6.485904963622290270e-03 +5.573142523143898143e+04 1.041397790592858419e-01 4.279063905654883343e-02 +5.585431701805737248e+04 1.597704072096750583e-01 4.678169893671726282e-02 +5.597720880467576353e+04 3.889173465427506193e-01 7.294791887304298561e-02 +5.610010059129414731e+04 1.286926356611941991e+00 1.450444318931776444e-01 +5.622299237791253836e+04 2.120746414603299712e+00 1.774346832342210967e-01 +5.634588416453092213e+04 2.606281851562028073e+00 1.923568297021129858e-01 +5.646877595114931319e+04 2.116710601450774387e+00 1.715586547091425274e-01 +5.659166773776770424e+04 1.194841926468726667e+00 1.249927388482903051e-01 +5.671455952438608801e+04 5.803212681115323957e-01 8.266035174042449252e-02 +5.683745131100447907e+04 1.447785649203827130e-01 3.641631021648107647e-02 +5.696034309762286284e+04 4.874174739962919278e-02 1.685638360181220680e-02 +5.708323488424125389e+04 1.185854859345750363e-02 7.224561682905080578e-03 +5.720612667085964495e+04 4.919557221334413220e-03 3.190023696602510214e-03 +5.732901845747802872e+04 1.045628318031630727e-02 6.578081168356427269e-03 +5.745191024409641977e+04 1.618355063851919726e-02 9.375334385479470317e-03 +5.757480203071480355e+04 1.263990641226056012e-02 8.427553651900036510e-03 +5.769769381733319460e+04 5.057004827410277806e-03 3.184827597146905592e-03 +5.782058560395158565e+04 1.722066787824647061e-02 1.122440958697065380e-02 +5.794347739056996943e+04 2.214026662921088351e-02 9.603401535256128607e-03 +5.806636917718836048e+04 1.232428909883375931e-03 1.173834588314423555e-03 +5.818926096380674426e+04 4.224655640499186404e-02 2.125545007837561715e-02 +5.831215275042513531e+04 7.267165434136396707e-02 2.271832460693594749e-02 +5.843504453704352636e+04 1.641336214052323828e-01 3.488133051209568736e-02 +5.855793632366191014e+04 3.965928757661499882e-01 5.197145521094571202e-02 +5.868082811028030119e+04 6.835091068369288925e-01 6.518802601566911492e-02 +5.880371989689868496e+04 1.202540408657013060e+00 8.617873866400743710e-02 +5.892661168351707602e+04 1.496257260954354962e+00 9.415712477325834107e-02 +5.904950347013546707e+04 1.306807832813252856e+00 8.581666412270463895e-02 +5.917239525675385084e+04 6.810446500126237090e-01 6.278962355515900484e-02 +5.929528704337224190e+04 3.475719800117426095e-01 4.370884273485513977e-02 +5.941817882999063295e+04 1.005827905714438697e-01 1.969884052415993292e-02 +5.954107061660901672e+04 2.976428694794600385e-02 9.868133076198099332e-03 +5.966396240322740778e+04 2.863945215564069405e-02 1.409778061293529353e-02 +5.978685418984579155e+04 2.968258983267855339e-02 1.342423762727215295e-02 +5.990974597646418260e+04 3.336704379757581690e-02 1.739113351717280070e-02 +6.003263776308257366e+04 3.936306880701879139e-03 2.533651290813391209e-03 +6.015552954970095743e+04 2.392238660582340221e-03 1.292685486621380359e-03 +6.027842133631934848e+04 4.468006240457108452e-02 1.750917605373862249e-02 +6.040131312293773226e+04 1.394535612571112630e-02 8.924721210393336476e-03 +6.052420490955612331e+04 2.231504393050614751e-02 1.265864719605375860e-02 +6.064709669617451436e+04 2.469596026104206588e-02 1.157252334203666237e-02 +6.076998848279289814e+04 6.669313770018741976e-03 4.779053481689868668e-03 +6.089288026941128919e+04 3.684236367082734803e-02 1.827569822689644949e-02 +6.101577205602967297e+04 1.346735426249232905e-02 7.170391324962586271e-03 +6.113866384264806402e+04 2.542581328823012923e-02 1.397807670882752866e-02 +6.126155562926645507e+04 2.956212460439119546e-02 1.748523557284983876e-02 +6.138444741588483885e+04 2.870590383778779536e-02 1.347256571348738954e-02 +6.150733920250322262e+04 2.787561469701084482e-02 1.326318000314933611e-02 +6.163023098912162095e+04 1.431421840416721367e-02 7.220451061508112098e-03 +6.175312277573999745e+04 3.449545164862743291e-02 1.365334307541504928e-02 +6.187601456235840305e+04 1.141205097782288340e-02 6.494404527579135389e-03 +6.199890634897677228e+04 9.998360382802249507e-03 5.717461790483207608e-03 +6.212179813559517788e+04 2.662753202467940672e-02 1.123305882276068660e-02 +6.224468992221354711e+04 1.635251914566110756e-02 9.018115890393488265e-03 +6.236758170883195271e+04 1.609044309726317956e-02 8.721138111463775516e-03 +6.249047349545032921e+04 1.382986954661967471e-02 6.090155084736818998e-03 +6.261336528206872754e+04 3.221359830131605845e-02 1.315714216187315044e-02 +6.273625706868710404e+04 2.650068693520575211e-02 1.099672663831434763e-02 +6.285914885530550237e+04 3.502032626806634436e-02 1.351252348256047446e-02 +6.298204064192387887e+04 1.823009537577723396e-02 8.376905555015011842e-03 +6.310493242854228447e+04 3.783277941970459440e-02 1.151145043918805171e-02 +6.322782421516065369e+04 5.268379399702288746e-02 2.062473344550976723e-02 +6.335071600177905930e+04 9.135516253462216962e-02 2.013570852204204023e-02 +6.347360778839743580e+04 8.780117780849516773e-02 1.836734384581114113e-02 +6.359649957501583413e+04 2.107675768913426229e-01 3.181436593710075533e-02 +6.371939136163421063e+04 3.878518050709474640e-01 3.793424153080367928e-02 +6.384228314825260895e+04 8.398486329249176263e-01 5.397538658228078629e-02 +6.396517493487098545e+04 1.626440302294985596e+00 7.503977261024719070e-02 +6.408806672148938378e+04 2.528894784276713992e+00 9.207855639808039394e-02 +6.421095850810776028e+04 2.667175445521093646e+00 9.350203165804148175e-02 +6.433385029472616588e+04 2.011428035368783895e+00 8.252159752983506680e-02 +6.445674208134453511e+04 1.046469264400033072e+00 5.699426017341840955e-02 +6.457963386796294071e+04 5.645096728682509335e-01 4.201317437683729089e-02 +6.470252565458131721e+04 2.091728159131260034e-01 2.459313087005366577e-02 +6.482541744119970099e+04 7.635047231041330873e-02 1.341345219610286764e-02 +6.494830922781809204e+04 3.089816173059814833e-02 7.715224228517734810e-03 +6.507120101443647582e+04 2.496989353661076619e-02 7.278610987240322940e-03 +6.519409280105486687e+04 2.266770385727271200e-02 8.954397809090700044e-03 +6.531698458767325792e+04 8.214365173792854621e-03 3.603357248857395802e-03 +6.543987637429164170e+04 2.248574355968013458e-02 8.251916289423242082e-03 +6.556276816091002547e+04 1.768240940296235061e-02 9.226057467251139871e-03 +6.568565994752841652e+04 2.470798795910412668e-02 9.771636354122524917e-03 +6.580855173414680758e+04 1.775809876080445063e-02 6.591539946574678441e-03 +6.593144352076519863e+04 1.188683989855638876e-02 4.424741498084167925e-03 +6.605433530738358968e+04 2.667639787291982423e-02 8.738445368188916054e-03 +6.617722709400196618e+04 2.201461983309700374e-02 8.484167088062924064e-03 +6.630011888062035723e+04 2.721105775332020166e-02 8.537033546881584584e-03 +6.642301066723874828e+04 1.188603848032673306e-02 5.403880989293228729e-03 +6.654590245385713934e+04 3.424152916808773789e-02 1.158283656453130452e-02 +6.666879424047553039e+04 2.534389292657672835e-02 8.528853506113511646e-03 +6.679168602709390689e+04 2.656175874469974066e-02 7.550262679468273605e-03 +6.691457781371229794e+04 5.465533995208156359e-02 2.056241294666322911e-02 +6.703746960033068899e+04 6.048612029569988557e-02 2.035874101747332104e-02 +6.716036138694908004e+04 6.636534466770552254e-02 2.037907251756479118e-02 +6.728325317356747109e+04 1.221703090606570674e-01 2.956452527023717761e-02 +6.740614496018584759e+04 1.675425338324148250e-01 3.093034722338107445e-02 +6.752903674680423865e+04 4.443769665572708805e-01 5.197020838510030966e-02 +6.765192853342262970e+04 9.414561815874945561e-01 7.332867171082201041e-02 +6.777482032004102075e+04 1.899047684517799039e+00 1.016791888531426297e-01 +6.789771210665941180e+04 3.873911663500289038e+00 1.502901239471576000e-01 +6.802060389327778830e+04 5.414839494592134095e+00 1.739734168170551654e-01 +6.814349567989617935e+04 5.123564997772787954e+00 1.687188761815729410e-01 +6.826638746651457041e+04 3.297209342399824550e+00 1.297228158032047440e-01 +6.838927925313296146e+04 1.497249278868549860e+00 8.612313801825384474e-02 +6.851217103975135251e+04 7.089606901523232141e-01 5.909008360451549480e-02 +6.863506282636972901e+04 3.314123221956515319e-01 3.918104736925408921e-02 +6.875795461298810551e+04 1.503547645041291569e-01 2.320363009888826156e-02 +6.888084639960651111e+04 6.828376328099892978e-02 1.530469829019234611e-02 +6.900373818622488761e+04 5.260282214452814686e-02 1.225248946563713137e-02 +6.912662997284329322e+04 1.914152850300149256e-02 7.109509497408374873e-03 +6.924952175946166972e+04 2.098402709073221573e-02 6.382499946556194348e-03 +6.937241354608006077e+04 2.796744373952507121e-02 7.638589590988427783e-03 +6.949530533269843727e+04 3.771557889656233786e-02 1.120688198285945021e-02 +6.961819711931684287e+04 2.037318011244422175e-02 6.911019123634430834e-03 +6.974108890593521937e+04 1.170458896494513609e-02 3.540962523479342268e-03 +6.986398069255362498e+04 1.867411416303464688e-02 5.367637434720147656e-03 +6.998687247917198692e+04 2.113666230360059309e-02 5.689769747095871182e-03 +7.010976426579039253e+04 2.296877404579451137e-02 7.672879638924419085e-03 +7.023265605240876903e+04 3.258128154393452602e-02 9.636588052141162666e-03 +7.035554783902717463e+04 1.399313994027977237e-02 4.736815839807005310e-03 +7.047843962564555113e+04 2.506872898603429781e-02 7.721484780455327782e-03 +7.060133141226394218e+04 3.398389140716999435e-02 9.855267394332692388e-03 +7.072422319888231868e+04 2.207904752020723241e-02 6.298256073553046806e-03 +7.084711498550072429e+04 2.489588422462159570e-02 7.639484212553430791e-03 +7.097000677211910079e+04 1.367686819415908292e-02 5.162345667588611603e-03 +7.109289855873750639e+04 2.301232112142640243e-02 6.638596253711405264e-03 +7.121579034535586834e+04 2.205199119157533194e-02 6.590991145752040682e-03 +7.133868213197427394e+04 3.702722301419609369e-02 8.808018673748578553e-03 +7.146157391859265044e+04 1.718838367659631522e-02 5.959157741484368345e-03 +7.158446570521105605e+04 2.160014555071878770e-02 8.289024280064389086e-03 +7.170735749182943255e+04 2.591235580751219403e-02 8.425274348965037380e-03 +7.183024927844782360e+04 2.394090839757660391e-02 7.387416650988755037e-03 +7.195314106506620010e+04 2.787005845140742843e-02 7.985127201583163206e-03 +7.207603285168460570e+04 3.043366508376278007e-02 7.114038867399124361e-03 +7.219892463830298220e+04 2.526718383769459980e-02 6.517769315068855200e-03 +7.232181642492138781e+04 2.992287254718775658e-02 8.307859851723227440e-03 +7.244470821153974975e+04 2.165586749271515912e-02 6.678680780703310366e-03 +7.256759999815815536e+04 2.119407736665906636e-02 6.240116158244907174e-03 +7.269049178477653186e+04 1.241486829520200945e-02 3.856809500264354353e-03 +7.281338357139493746e+04 1.673636652006262049e-02 4.662605369941371161e-03 +7.293627535801331396e+04 2.367019011100638184e-02 6.039280675302218827e-03 +7.305916714463170501e+04 2.421568537868369966e-02 7.350774902051516839e-03 +7.318205893125008151e+04 2.677992360021840337e-02 7.633200095030676612e-03 +7.330495071786848712e+04 4.183712164395528982e-02 1.060213890269963606e-02 +7.342784250448686362e+04 2.563811293812898878e-02 7.306793760788013979e-03 +7.355073429110526922e+04 3.072275470208123138e-02 8.879300512892648184e-03 +7.367362607772363117e+04 2.706880827953433294e-02 7.684348860621937130e-03 +7.379651786434203677e+04 1.878437338430185774e-02 4.576802856755173357e-03 +7.391940965096041327e+04 1.412087363797686138e-02 4.846182427616863887e-03 +7.404230143757881888e+04 3.072039208966821991e-02 7.028050734308084052e-03 +7.416519322419719538e+04 2.066291590546190382e-02 5.750157875864843858e-03 +7.428808501081558643e+04 1.350881566276713498e-02 4.339335664110954317e-03 +7.441097679743396293e+04 2.018939633925891791e-02 5.605913719202381372e-03 +7.453386858405236853e+04 1.698223913953282940e-02 5.128387200502659490e-03 +7.465676037067074503e+04 1.855676006232259700e-02 5.590817052156395184e-03 +7.477965215728915064e+04 2.023651555251099188e-02 5.128829370308383463e-03 +7.490254394390751258e+04 1.956969117167127806e-02 4.730328081869554328e-03 +7.502543573052591819e+04 2.672278600703646700e-02 6.626790880145745806e-03 +7.514832751714429469e+04 2.540931783867304145e-02 7.042802465678581550e-03 +7.527121930376270029e+04 4.677612440987675285e-02 1.018273083315268668e-02 +7.539411109038107679e+04 3.854403212688401609e-02 8.214595801371604375e-03 +7.551700287699946784e+04 7.408490098345288377e-02 1.177494525956841731e-02 +7.563989466361784434e+04 7.404158437014854433e-02 1.027925556409471815e-02 +7.576278645023624995e+04 1.296955424013124525e-01 1.377479607277435660e-02 +7.588567823685462645e+04 2.479955457597962376e-01 1.898820162450831628e-02 +7.600857002347303205e+04 4.719799772042018726e-01 2.815544403829123646e-02 +7.613146181009139400e+04 1.100537528023541212e+00 4.487955719630416090e-02 +7.625435359670979960e+04 2.418150088350044857e+00 6.841977195321641281e-02 +7.637724538332817610e+04 4.005071231830684475e+00 8.986178688728065078e-02 +7.650013716994658171e+04 4.771279325814213657e+00 9.935253673561919574e-02 +7.662302895656495821e+04 3.940132983858767535e+00 8.828417659372182758e-02 +7.674592074318334926e+04 2.332780188881946160e+00 6.438234630920722235e-02 +7.686881252980172576e+04 1.132427522263754538e+00 4.213976410306810583e-02 +7.699170431642013136e+04 5.020357231289048761e-01 2.575966806268807641e-02 +7.711459610303850786e+04 2.461036648175272401e-01 1.747994678384678924e-02 +7.723748788965691347e+04 1.223755085769033940e-01 1.199855316548263662e-02 +7.736037967627528997e+04 9.386804610315875597e-02 1.127490961021068543e-02 +7.748327146289368102e+04 4.916191652807219703e-02 8.303607802791296288e-03 +7.760616324951205752e+04 3.190454463965865239e-02 7.077752820019594417e-03 +7.772905503613046312e+04 3.135098233280075863e-02 6.995989405465274404e-03 +7.785194682274883962e+04 3.161283432969886481e-02 7.162947317201898666e-03 +7.797483860936723067e+04 2.376406277015737437e-02 5.077208522968883198e-03 +7.809773039598560717e+04 2.581533009058662592e-02 6.733081927246624236e-03 +7.822062218260401278e+04 2.866031357027992374e-02 6.223807337388857774e-03 +7.834351396922238928e+04 1.785152891599883426e-02 4.456429163470418224e-03 +7.846640575584079488e+04 1.789534805047311022e-02 4.989977536936331809e-03 +7.858929754245917138e+04 2.403616250326479423e-02 6.401134407306856809e-03 +7.871218932907754788e+04 2.294631312310149718e-02 5.439493112977217965e-03 +7.883508111569593893e+04 2.722632926623967317e-02 6.626113728003790379e-03 +7.895797290231432999e+04 2.606581667149644038e-02 6.182634194450570449e-03 +7.908086468893272104e+04 2.593032165927236510e-02 6.460156851985783891e-03 +7.920375647555111209e+04 2.828429154886608760e-02 6.606058817342698453e-03 +7.932664826216948859e+04 2.669300626346635813e-02 7.063726347825266191e-03 +7.944954004878787964e+04 1.606083034744586538e-02 4.232242687874416057e-03 +7.957243183540627069e+04 2.139132883254591874e-02 4.784259636410837131e-03 +7.969532362202466174e+04 2.189654268653720703e-02 5.345258805270568410e-03 +7.981821540864305280e+04 2.837490811623056761e-02 6.919538107855654346e-03 +7.994110719526142930e+04 1.356044159236658754e-02 3.465061024566593300e-03 +8.006399898187982035e+04 1.780941114732721361e-02 4.575766253661787963e-03 +8.018689076849821140e+04 3.049101711971272111e-02 6.564256955782613728e-03 +8.030978255511660245e+04 3.349411443662946020e-02 7.183822919497824533e-03 +8.043267434173499350e+04 2.721583734958054474e-02 6.754685992833115923e-03 +8.055556612835337000e+04 2.614016657761616610e-02 5.962296079109914541e-03 +8.067845791497176106e+04 2.958802694004611031e-02 6.540083099944119308e-03 +8.080134970159015211e+04 2.317850506262076477e-02 5.033497016780183637e-03 +8.092424148820854316e+04 2.591569770935713696e-02 6.096873289195135770e-03 +8.104713327482693421e+04 2.358766682727237232e-02 5.080929623264423232e-03 +8.117002506144531071e+04 2.249722753369863895e-02 4.458483789670739453e-03 +8.129291684806370176e+04 2.671891032314405168e-02 5.688258001223640836e-03 +8.141580863468209282e+04 2.642974572685603124e-02 6.115143115606069824e-03 +8.153870042130048387e+04 4.141069782448261738e-02 7.848682196123491633e-03 +8.166159220791887492e+04 2.661829082509504715e-02 6.004150598481999834e-03 +8.178448399453725142e+04 3.076917422391797774e-02 6.114424418013658658e-03 +8.190737578115564247e+04 3.595709328278504091e-02 6.443019405352577375e-03 +8.203026756777403352e+04 2.428214558143130045e-02 4.707399535861409197e-03 +8.215315935439242458e+04 3.811971986085928299e-02 5.980817366432590251e-03 +8.227605114101081563e+04 4.383570183554371530e-02 6.474117970449464431e-03 +8.239894292762919213e+04 6.352912251676484656e-02 7.520169265633537027e-03 +8.252183471424758318e+04 9.406100545016289616e-02 8.309551838736387724e-03 +8.264472650086597423e+04 1.533933377744230164e-01 9.992448437511614739e-03 +8.276761828748436528e+04 2.607804629000199381e-01 1.382982942072871584e-02 +8.289051007410275633e+04 4.909189889967712772e-01 1.872678597746533363e-02 +8.301340186072113283e+04 1.004558372160307522e+00 2.742073695289107271e-02 +8.313629364733952389e+04 1.875702712972960207e+00 3.778036728572654185e-02 +8.325918543395791494e+04 2.718743110572757526e+00 4.545031280152154324e-02 +8.338207722057630599e+04 3.191026522825232359e+00 4.955509136290034422e-02 +8.350496900719469704e+04 2.768194935278490476e+00 4.589748582369918700e-02 +8.362786079381307354e+04 1.705782704172841058e+00 3.553281651487832926e-02 +8.375075258043146459e+04 8.652475984772673989e-01 2.450549719260164752e-02 +8.387364436704985565e+04 4.060377453234611522e-01 1.580429719447112857e-02 +8.399653615366824670e+04 2.390098585577476176e-01 1.250610253913211380e-02 +8.411942794028663775e+04 1.199417113920614175e-01 8.868549707735328552e-03 +8.424231972690501425e+04 7.839220576545122277e-02 7.059282031259041419e-03 +8.436521151352340530e+04 5.609087367788808537e-02 6.502006359587841552e-03 +8.448810330014179635e+04 4.652165679755376065e-02 6.185369024056133411e-03 +8.461099508676018741e+04 3.908828237606343931e-02 6.246711318627143177e-03 +8.473388687337857846e+04 2.887915616686190928e-02 5.627277813925915355e-03 +8.485677865999695496e+04 2.485858057665547502e-02 4.770399345559581637e-03 +8.497967044661534601e+04 2.775142156582309158e-02 5.058097152478578488e-03 +8.510256223323373706e+04 2.141224528762200596e-02 3.862331900039418526e-03 +8.522545401985212811e+04 3.075304962173616014e-02 5.442046530703370001e-03 +8.534834580647051916e+04 2.107782614362813112e-02 4.240399115342853055e-03 +8.547123759308889566e+04 2.950635295787033471e-02 5.205890421608468967e-03 +8.559412937970728672e+04 2.824892987065389521e-02 4.888499236291695554e-03 +8.571702116632567777e+04 2.670712872209227151e-02 5.267529735886874835e-03 +8.583991295294406882e+04 3.475625706574547030e-02 6.254485316286522746e-03 +8.596280473956245987e+04 2.755026672865573678e-02 5.208222837379008346e-03 +8.608569652618083637e+04 2.687352857555804289e-02 4.865607808200392119e-03 +8.620858831279922742e+04 3.042697315211748479e-02 5.321428580892406668e-03 +8.633148009941760392e+04 2.270415098750259986e-02 4.488260516550077010e-03 +8.645437188603600953e+04 3.041428799010932257e-02 5.865621167503389313e-03 +8.657726367265438603e+04 2.391763311691126256e-02 4.544686539873066429e-03 +8.670015545927279163e+04 3.506292560209189890e-02 5.769716743794911333e-03 +8.682304724589115358e+04 2.934737179137126423e-02 5.913959562161807439e-03 +8.694593903250955918e+04 1.791543391424041051e-02 3.710540417115279835e-03 +8.706883081912793568e+04 2.106236449451416581e-02 4.329386665613320709e-03 +8.719172260574634129e+04 2.488090396862706333e-02 4.815782116009683853e-03 +8.731461439236471779e+04 2.665477053947245059e-02 4.910931651993613069e-03 +8.743750617898310884e+04 3.531810229889101316e-02 6.368053765174063255e-03 +8.756039796560148534e+04 2.608054534274468345e-02 4.811293306994764152e-03 +8.768328975221989094e+04 2.308884669595498429e-02 4.354983487481835919e-03 +8.780618153883826744e+04 3.203331460018005172e-02 5.627688879201762223e-03 +8.792907332545667305e+04 2.683605715112836673e-02 4.510788080284071008e-03 +8.805196511207503499e+04 2.176804789893801648e-02 4.315215383774293444e-03 +8.817485689869344060e+04 1.671756800308221713e-02 3.230842758821709723e-03 +8.829774868531181710e+04 2.525109105326553763e-02 4.836943001116135628e-03 +8.842064047193022270e+04 1.299212888311564694e-02 2.778740585289008261e-03 +8.854353225854859920e+04 2.225766548821920404e-02 4.039716823245687385e-03 +8.866642404516699025e+04 2.832353226537602173e-02 5.587017476668403211e-03 +8.878931583178536675e+04 2.162058555872433188e-02 4.107561611345179366e-03 +8.891220761840377236e+04 2.178817930890417434e-02 3.992863414911925271e-03 +8.903509940502214886e+04 2.589373184446823808e-02 4.256780439088217113e-03 +8.915799119164055446e+04 2.512777335560806291e-02 4.303786740088921120e-03 +8.928088297825891641e+04 2.462679501430414461e-02 4.611616117346960947e-03 +8.940377476487732201e+04 2.718293557516528874e-02 4.827557130580746418e-03 +8.952666655149569851e+04 1.990121894567184815e-02 3.841371100348699510e-03 +8.964955833811410412e+04 2.339106884322782881e-02 4.047776222024327200e-03 +8.977245012473248062e+04 2.221227236491581103e-02 3.716598378296298577e-03 +8.989534191135087167e+04 1.991380171426378187e-02 3.626620543125019022e-03 +9.001823369796924817e+04 2.210737103905503417e-02 4.364659647934830689e-03 +9.014112548458765377e+04 2.591025486255157592e-02 4.081680978628497540e-03 +9.026401727120603027e+04 2.458407131766215600e-02 4.250780353469081271e-03 +9.038690905782443588e+04 2.351680697570711354e-02 4.348524961734708677e-03 +9.050980084444279782e+04 2.404863250344212167e-02 4.506113051696521155e-03 +9.063269263106120343e+04 2.728038261622629454e-02 4.959498362454717833e-03 +9.075558441767957993e+04 4.303868711542955389e-02 6.563558045661323399e-03 +9.087847620429798553e+04 2.323017099427122922e-02 3.853935819643311295e-03 +9.100136799091636203e+04 1.690603762001323049e-02 3.132396804398782358e-03 +9.112425977753475308e+04 2.419192817792452377e-02 3.857620229139423120e-03 +9.124715156415312958e+04 2.792962837893350758e-02 4.697558916134666508e-03 +9.137004335077153519e+04 2.179292152313015013e-02 3.981457890499661735e-03 +9.149293513738991169e+04 2.456749371689524383e-02 4.383125428345437981e-03 +9.161582692400831729e+04 2.074659059555497218e-02 3.869402005916376848e-03 +9.173871871062667924e+04 2.608068746450484948e-02 4.424932336842123115e-03 +9.186161049724508484e+04 3.215920445874884820e-02 5.155507759136054510e-03 +9.198450228386346134e+04 1.977789115375788026e-02 3.348063145543502678e-03 +9.210739407048186695e+04 2.406758219098954418e-02 3.911914725614405210e-03 +9.223028585710024345e+04 3.254119465500417141e-02 5.043178375709327955e-03 +9.235317764371863450e+04 2.296982201241220753e-02 3.976407844677207898e-03 +9.247606943033701100e+04 2.320966847757177307e-02 3.629830262669879026e-03 +9.259896121695541660e+04 3.038315070433827633e-02 4.544047376819670796e-03 +9.272185300357379310e+04 3.460901604624234268e-02 5.574739202715531423e-03 +9.284474479019219871e+04 2.948858905134105896e-02 4.683460640830703139e-03 +9.296763657681056065e+04 3.545498521207655213e-02 5.346082541595755487e-03 +9.309052836342896626e+04 2.346203511766197652e-02 3.930853036527257559e-03 +9.321342015004734276e+04 2.304921801029378645e-02 3.964467443892087314e-03 +9.333631193666574836e+04 2.720818351009037309e-02 4.171958660022274598e-03 +9.345920372328412486e+04 2.756197166971311591e-02 4.456358496110619273e-03 +9.358209550990251591e+04 2.634930956016309778e-02 4.224378435466529143e-03 +9.370498729652089241e+04 2.098426919132276650e-02 4.048092798223120077e-03 +9.382787908313929802e+04 2.997270657210101066e-02 4.647401867089825077e-03 +9.395077086975767452e+04 2.775393783443254325e-02 4.780417244012037485e-03 +9.407366265637608012e+04 2.401340531008387680e-02 3.991672100130202669e-03 +9.419655444299445662e+04 2.645825621395649432e-02 3.895817243167747860e-03 +9.431944622961283312e+04 2.437973685334434565e-02 3.839326179087277236e-03 +9.444233801623122417e+04 2.487808714657049544e-02 3.867974551561210918e-03 +9.456522980284961523e+04 2.124207546463814308e-02 3.616799805756768134e-03 +9.468812158946800628e+04 3.766861897681184762e-02 5.317096760952834053e-03 +9.481101337608639733e+04 2.690252376826404376e-02 4.093631342952901674e-03 +9.493390516270477383e+04 2.560155731614277563e-02 4.340984852678790411e-03 +9.505679694932316488e+04 2.708832092726072907e-02 4.401670354506484820e-03 +9.517968873594155593e+04 2.586859996813031110e-02 4.216532560773329080e-03 +9.530258052255994698e+04 2.026482356943638471e-02 3.468544065691182583e-03 +9.542547230917833804e+04 2.520299112843990899e-02 3.878577349922723849e-03 +9.554836409579671454e+04 2.173505386129501171e-02 3.480055640618242175e-03 +9.567125588241510559e+04 2.648738263074303795e-02 4.339623321148678749e-03 +9.579414766903349664e+04 2.861148065497350415e-02 4.755806095306167915e-03 +9.591703945565188769e+04 2.451561970209420807e-02 4.254290079822432499e-03 +9.603993124227027874e+04 2.637678814559990190e-02 4.114392951259668828e-03 +9.616282302888865524e+04 2.564221706155856914e-02 3.899026681159801621e-03 +9.628571481550704630e+04 2.605761564851893919e-02 4.471365041960701989e-03 +9.640860660212543735e+04 2.585230103599973212e-02 4.479087316588910989e-03 +9.653149838874382840e+04 2.098217817348849157e-02 4.024412383476418803e-03 +9.665439017536221945e+04 2.452370152147468133e-02 4.304447855296184011e-03 +9.677728196198059595e+04 2.200367509367389535e-02 3.931807434807451165e-03 +9.690017374859898700e+04 1.996620442974210777e-02 3.430242690547567058e-03 +9.702306553521737806e+04 3.009400034694303255e-02 4.853873329525020854e-03 +9.714595732183576911e+04 2.572205744415553483e-02 4.408512195903559715e-03 +9.726884910845416016e+04 2.836605618402144799e-02 4.429617969522553662e-03 +9.739174089507253666e+04 2.674010936926798920e-02 4.408088383129420661e-03 +9.751463268169092771e+04 3.214927111275740074e-02 5.156060933920410261e-03 +9.763752446830931876e+04 2.610869341531120436e-02 4.700284089080127709e-03 +9.776041625492770982e+04 2.703191758895025915e-02 4.367563396472460419e-03 +9.788330804154610087e+04 1.963687609102989992e-02 3.833487132540980367e-03 +9.800619982816447737e+04 2.741091818427069879e-02 4.380706080589191406e-03 +9.812909161478286842e+04 2.453873711099061050e-02 3.765248224038293245e-03 +9.825198340140125947e+04 3.024166644852360059e-02 4.431364016041825990e-03 +9.837487518801965052e+04 3.762932525840347042e-02 5.341792228728653794e-03 +9.849776697463804157e+04 2.809514409910616323e-02 4.185952097889103669e-03 +9.862065876125641807e+04 4.794047392477884112e-02 6.539383183124920784e-03 +9.874355054787480913e+04 4.545151094222412563e-02 6.934576025942760548e-03 +9.886644233449320018e+04 7.098752072861491680e-02 8.272388520692180655e-03 +9.898933412111159123e+04 9.608940893206253941e-02 9.809100766708649111e-03 +9.911222590772998228e+04 1.383952014592440549e-01 1.247733580185843988e-02 +9.923511769434835878e+04 2.068253159894596349e-01 1.606795207599657702e-02 +9.935800948096674983e+04 3.259385401429704676e-01 2.014077697472155953e-02 +9.948090126758514089e+04 5.502781843699933173e-01 2.787457921500991267e-02 +9.960379305420353194e+04 7.861274952436110297e-01 3.329446076593822745e-02 +9.972668484082192299e+04 1.179451471443894395e+00 4.042102475563026653e-02 +9.984957662744029949e+04 1.762129497628476926e+00 4.881388617342091035e-02 +9.997246841405869054e+04 2.408902590794673504e+00 5.605475070155550160e-02 +1.000953602006770816e+05 3.472117690543663038e+00 6.638793591186813170e-02 +1.002182519872954726e+05 4.888299558169892478e+00 7.765459928780561738e-02 +1.003411437739138637e+05 6.413185520552490360e+00 8.708778505050628060e-02 +1.004640355605322402e+05 8.561167690818367149e+00 9.895525229492227459e-02 +1.005869273471506312e+05 1.000089933645302942e+01 1.076773003690760372e-01 +1.007098191337690223e+05 9.402781944189802843e+00 1.066557299163750777e-01 +1.008327109203874134e+05 6.954780854127197820e+00 9.333897305834502889e-02 +1.009556027070058044e+05 4.788234912979342894e+00 7.915139851848922159e-02 +1.010784944936241809e+05 3.226929277042633881e+00 6.531162821145840292e-02 +1.012013862802425720e+05 2.076089378420544751e+00 5.282520413359013955e-02 +1.013242780668609630e+05 1.562081808443634312e+00 4.614136370906250090e-02 +1.014471698534793541e+05 1.045805425095804875e+00 3.850831812888751149e-02 +1.015700616400977451e+05 7.575915369776896613e-01 3.243295878514158848e-02 +1.016929534267161216e+05 4.573742893440000401e-01 2.402505629406086890e-02 +1.018158452133345127e+05 3.398596457662900749e-01 2.090375771148431441e-02 +1.019387369999528892e+05 2.144139808792064339e-01 1.618522103802210593e-02 +1.020616287865712948e+05 1.359378292001670596e-01 1.204227079940517822e-02 +1.021845205731896713e+05 9.441235272458048389e-02 9.701211856547119206e-03 +1.023074123598080623e+05 5.663977256547506056e-02 7.088295503640756369e-03 +1.024303041464264388e+05 5.289644593031729569e-02 6.953585122970671814e-03 +1.025531959330448444e+05 3.693950310540847215e-02 5.821056878230073534e-03 +1.026760877196632209e+05 3.069179444065784149e-02 5.046355588474151985e-03 +1.027989795062816265e+05 3.139194134873408981e-02 5.139238152620568059e-03 +1.029218712929000030e+05 2.562485609009558865e-02 4.810255959959087307e-03 +1.030447630795183941e+05 1.990790285246347643e-02 4.036039464665536897e-03 +1.031676548661367706e+05 2.691257091215842195e-02 4.983504086898933941e-03 +1.032905466527551762e+05 3.194855955224425864e-02 5.625816183963962616e-03 +1.034134384393735527e+05 2.615935175413517527e-02 4.533292520405480391e-03 +1.035363302259919583e+05 2.609389167737786314e-02 4.643450863471423190e-03 +1.036592220126103202e+05 2.256441944676561284e-02 4.091018780358808907e-03 +1.037821137992287258e+05 2.570437005388716278e-02 5.150035368492705823e-03 +1.039050055858471023e+05 2.365354792729624026e-02 4.162839279136419483e-03 +1.040278973724655079e+05 2.657127902893569385e-02 5.465840574336862379e-03 +1.041507891590838844e+05 2.697835405438718873e-02 5.097160034884592496e-03 +1.042736809457022755e+05 2.540550716843388568e-02 4.286715903974399645e-03 +1.043965727323206520e+05 2.443523904274902750e-02 4.942692124395666776e-03 +1.045194645189390576e+05 2.283204197361176149e-02 3.730602099903705064e-03 +1.046423563055574341e+05 2.700278024796349055e-02 5.172398700259932432e-03 +1.047652480921758397e+05 2.114072212526232897e-02 3.783548263855144190e-03 +1.048881398787942016e+05 2.381530768632732567e-02 4.501733920261779924e-03 +1.050110316654126073e+05 1.773186557687728149e-02 3.578121561523785882e-03 +1.051339234520309838e+05 1.823629831754693467e-02 3.490023689984202235e-03 +1.052568152386493894e+05 1.942867131076661188e-02 3.543067657395012129e-03 +1.053797070252677659e+05 2.418577233078519559e-02 4.589791531707066580e-03 +1.055025988118861569e+05 1.552639941936263639e-02 4.355236503773772007e-03 +1.056254905985045334e+05 2.647525428231996270e-02 4.481289642167617972e-03 +1.057483823851229390e+05 2.030327772648491194e-02 3.887828791593842849e-03 +1.058712741717413155e+05 2.722244235058464412e-02 4.936885800191554742e-03 +1.059941659583597211e+05 2.670765725490855183e-02 4.756436599893449323e-03 +1.061170577449780831e+05 3.467523310624037736e-02 5.825950985712129854e-03 +1.062399495315964887e+05 2.476865258856291233e-02 4.666130062148321316e-03 +1.063628413182148652e+05 1.895894175079753524e-02 3.609901283672967056e-03 +1.064857331048332708e+05 1.928152698777859525e-02 3.876635489644002664e-03 +1.066086248914516473e+05 2.039805378390169635e-02 4.136919946511013850e-03 +1.067315166780700383e+05 1.606442182003755409e-02 3.647930259295199210e-03 +1.068544084646884148e+05 1.767020101053510400e-02 3.538831579191573703e-03 +1.069773002513068204e+05 2.619529336283852455e-02 5.223463343370818128e-03 +1.071001920379251969e+05 2.096581568751604979e-02 3.922796330627574025e-03 +1.072230838245436025e+05 2.951695299165969094e-02 5.023912612626967554e-03 +1.073459756111619645e+05 1.683580927858368062e-02 3.883717256397853108e-03 +1.074688673977803701e+05 2.961577663813031239e-02 5.253738976123450283e-03 +1.075917591843987466e+05 2.862271150220354471e-02 5.395518256628560605e-03 +1.077146509710171522e+05 2.439385809875618816e-02 4.573974249735223568e-03 +1.078375427576355287e+05 2.060061953576076271e-02 4.203333308085578819e-03 +1.079604345442539197e+05 3.032724302711559475e-02 5.345421209637222885e-03 +1.080833263308722962e+05 2.922945300761917858e-02 5.077100455935225527e-03 +1.082062181174907018e+05 3.134967561301083699e-02 6.286928187619637495e-03 +1.083291099041090783e+05 2.654571325177701793e-02 5.124085809646126630e-03 +1.084520016907274839e+05 2.636184818923387185e-02 5.039432600025586448e-03 +1.085748934773458459e+05 2.727071230153923012e-02 5.372583309649557083e-03 +1.086977852639642515e+05 1.551217553959863098e-02 3.802899693261691319e-03 +1.088206770505826280e+05 3.265439646586547340e-02 6.710946319888424529e-03 +1.089435688372010336e+05 1.721021863769687035e-02 3.789367791118460754e-03 +1.090664606238194101e+05 2.378133365840194927e-02 5.470986711619009110e-03 +1.091893524104378012e+05 2.240466016237726427e-02 4.907210759772000046e-03 +1.093122441970561777e+05 1.660862425144457935e-02 3.429458494181294656e-03 +1.094351359836745833e+05 2.650172146236575571e-02 4.944328637536966366e-03 +1.095580277702929598e+05 2.734855519099624321e-02 4.845286792820198245e-03 +1.096809195569113654e+05 2.423169997311830706e-02 5.379171298564262155e-03 +1.098038113435297419e+05 2.452069776879309271e-02 4.416368359053094057e-03 +1.099267031301481329e+05 3.282216537602323375e-02 6.915374204778891934e-03 +1.100495949167665094e+05 1.526854643881915205e-02 3.497090101049186387e-03 +1.101724867033849150e+05 2.701551141853314117e-02 5.753681779831149382e-03 +1.102953784900032915e+05 1.516118313621385785e-02 2.714239892263344174e-03 +1.104182702766216826e+05 3.659143391272557527e-02 6.774974493761623182e-03 +1.105411620632400591e+05 2.665286704700263465e-02 5.030204007812733025e-03 +1.106640538498584647e+05 3.027375140641390405e-02 6.172375556474853954e-03 +1.107869456364768412e+05 1.578580630219226372e-02 3.261036352978229254e-03 +1.109098374230952468e+05 2.556230522288503726e-02 5.300390040125391167e-03 +1.110327292097136233e+05 2.202229380533213612e-02 4.890843883283098326e-03 +1.111556209963320143e+05 2.495856389501788578e-02 4.605268167216501965e-03 +1.112785127829503908e+05 2.650294256540739607e-02 4.690017489673375083e-03 +1.114014045695687964e+05 1.733711499617568430e-02 4.173391789775672198e-03 +1.115242963561871729e+05 2.721681179333370129e-02 6.028025340715218415e-03 +1.116471881428055640e+05 1.771258937163957409e-02 4.933688567540030906e-03 +1.117700799294239405e+05 1.961234548692393845e-02 4.112048119832094860e-03 +1.118929717160423461e+05 3.446693447623171841e-02 6.472312670790603649e-03 +1.120158635026607226e+05 2.082550945904123110e-02 4.771771811345802347e-03 +1.121387552892791282e+05 2.881764246526956341e-02 6.550741895842583824e-03 +1.122616470758975047e+05 2.682978087318365831e-02 5.703939722869622551e-03 +1.123845388625158957e+05 2.524328791458954613e-02 5.536395650637426259e-03 +1.125074306491342722e+05 2.597839164300163803e-02 5.820409495678882834e-03 +1.126303224357526778e+05 2.460806426381463574e-02 4.733750348820725887e-03 +1.127532142223710543e+05 1.734980342213817903e-02 3.501726664231770425e-03 +1.128761060089894600e+05 2.202467089479267712e-02 5.090152851562382806e-03 +1.129989977956078219e+05 2.071475547651175503e-02 4.459759703460147544e-03 +1.131218895822262275e+05 2.067312231017680302e-02 5.976427718404919188e-03 +1.132447813688446040e+05 2.411150034204717629e-02 5.847159251794636567e-03 +1.133676731554630096e+05 2.664474701497829279e-02 5.631564854893331834e-03 +1.134905649420813861e+05 2.023375967144170132e-02 5.135977669022942851e-03 +1.136134567286997772e+05 2.593598741330142843e-02 4.974464222683110289e-03 +1.137363485153181537e+05 3.067761677880320031e-02 7.462141000886197625e-03 +1.138592403019365447e+05 3.207305062022761111e-02 5.835392079155526761e-03 +1.139821320885549358e+05 2.708618641056705426e-02 5.085459650676726548e-03 +1.141050238751733123e+05 2.574614891098415265e-02 6.663787839289976069e-03 +1.142279156617917033e+05 3.049121308325900698e-02 5.668513401829286882e-03 +1.143508074484100798e+05 2.737963097414479116e-02 5.526408817761087160e-03 +1.144736992350284854e+05 4.072782620889875416e-02 8.606048466190129725e-03 +1.145965910216468619e+05 4.222220152134326804e-02 9.496869273145809587e-03 +1.147194828082652675e+05 3.189554395188187730e-02 6.686206798140833032e-03 +1.148423745948836295e+05 3.983534172637116788e-02 8.045286459626030395e-03 +1.149652663815020351e+05 3.945625885540978567e-02 8.275685001648233272e-03 +1.150881581681204116e+05 6.531084027695904792e-02 1.100804070947130654e-02 +1.152110499547388172e+05 9.114407363386609062e-02 1.273149403229316759e-02 +1.153339417413571937e+05 8.345801022572699179e-02 1.254048428010097471e-02 +1.154568335279755847e+05 1.104585654749614398e-01 1.553072986238861371e-02 +1.155797253145939612e+05 2.077897388616474217e-01 2.368287353840009893e-02 +1.157026171012123668e+05 2.443301942054940390e-01 2.545507718647382553e-02 +1.158255088878307433e+05 3.000681572437326472e-01 2.820749590839433801e-02 +1.159484006744491489e+05 4.580063810007963254e-01 3.659719160395353416e-02 +1.160712924610675109e+05 7.033064213672075571e-01 4.709625386311389744e-02 +1.161941842476859165e+05 8.474006042964701280e-01 5.035178854582137570e-02 +1.163170760343042930e+05 1.212211737330045169e+00 6.012325065235726851e-02 +1.164399678209226986e+05 1.503023467430323779e+00 6.586856093681502100e-02 +1.165628596075410751e+05 1.874084624054200399e+00 7.271620970186037924e-02 +1.166857513941594661e+05 2.479910447156692843e+00 8.517255523706535048e-02 +1.168086431807778426e+05 3.178791642593139066e+00 9.601407163146229162e-02 +1.169315349673962482e+05 3.546148811618723862e+00 1.000322075790960191e-01 +1.170544267540146247e+05 4.291223742507019878e+00 1.105375899432458620e-01 +1.171773185406330304e+05 4.880007592679699968e+00 1.181453738117101415e-01 +1.173002103272514069e+05 5.604845344046663236e+00 1.261838308855861290e-01 +1.174231021138697979e+05 6.694303126581636398e+00 1.374424545769390160e-01 +1.175459939004881744e+05 7.349069535506498774e+00 1.446152812426492185e-01 +1.176688856871065800e+05 7.729138284592840691e+00 1.480763438635762652e-01 +1.177917774737249565e+05 8.500413643986068024e+00 1.569266721630384054e-01 +1.179146692603433476e+05 8.980109397294160800e+00 1.614381380963514634e-01 +1.180375610469617241e+05 8.967517071195052480e+00 1.617263049134379238e-01 +1.181604528335801297e+05 8.760771523260665106e+00 1.614892043682620015e-01 +1.182833446201985062e+05 8.085787075086459552e+00 1.552267767607891369e-01 +1.184062364068169118e+05 7.165179781384442670e+00 1.455667131674042158e-01 +1.185291281934352883e+05 6.283551714619219908e+00 1.366626314114090246e-01 +1.186520199800536793e+05 5.684278974374303850e+00 1.306554290700716603e-01 +1.187749117666720558e+05 4.576677636044195197e+00 1.153483872115100145e-01 +1.188978035532904614e+05 4.234105258975776387e+00 1.122376511763271689e-01 +1.190206953399088379e+05 3.264282750201180416e+00 9.911251203491557027e-02 +1.191435871265272290e+05 2.748893265686167986e+00 9.071710555468498471e-02 +1.192664789131456055e+05 2.402993863983486467e+00 8.673723285958472029e-02 +1.193893706997640111e+05 1.743342832275641241e+00 7.218239469224640992e-02 +1.195122624863823876e+05 1.419650583481289363e+00 6.694169026090394936e-02 +1.196351542730007932e+05 1.137077064066290832e+00 6.190162719833444682e-02 +1.197580460596191697e+05 7.265398564588406716e-01 4.543728454128127120e-02 +1.198809378462375607e+05 6.095872006143961963e-01 4.322485191665643295e-02 +1.200038296328559372e+05 4.236791139155883790e-01 3.621588038624501404e-02 +1.201267214194743428e+05 2.825422828267355468e-01 2.737686141136096846e-02 +1.202496132060927193e+05 2.329303764101665619e-01 2.392099173567813555e-02 +1.203725049927111249e+05 1.733454069899575123e-01 2.172996053084092286e-02 +1.204953967793294869e+05 1.365093748607379975e-01 1.772034891389739561e-02 +1.206182885659478925e+05 6.723302840996996099e-02 1.187925213863806097e-02 +1.207411803525662690e+05 6.789775303496685399e-02 1.146179000140838157e-02 +1.208640721391846746e+05 6.596809156187831424e-02 1.247162824239128609e-02 +1.209869639258030511e+05 3.065721716049280704e-02 6.801682772920101053e-03 +1.211098557124214421e+05 4.199263665886830699e-02 9.610790660118497322e-03 +1.212327474990398186e+05 2.024601126360927456e-02 5.197867933632603632e-03 +1.213556392856582243e+05 3.054125508779466369e-02 6.561890840022854138e-03 +1.214785310722766008e+05 3.292787281530472343e-02 7.331122031686578520e-03 +1.216014228588950064e+05 3.097481549224300607e-02 6.987971185404927461e-03 +1.217243146455133683e+05 3.088541823173411235e-02 7.740265954316143115e-03 +1.218472064321317739e+05 1.882486725758957327e-02 4.042952057912582546e-03 +1.219700982187501504e+05 2.606278550574471498e-02 6.296207303724874089e-03 +1.220929900053685560e+05 2.918389168237185693e-02 6.410434472531188234e-03 +1.222158817919869325e+05 1.816412165326881240e-02 4.907669502176107042e-03 +1.223387735786053236e+05 2.009009866279154455e-02 4.950321911868669697e-03 +1.224616653652237001e+05 3.143937369240198954e-02 7.171245931582788044e-03 +1.225845571518421057e+05 1.699877609425338998e-02 4.947058381787601371e-03 +1.227074489384604822e+05 2.832884135496360756e-02 7.546059320754426418e-03 +1.228303407250788878e+05 1.383023570082559869e-02 3.971164966341261468e-03 +1.229532325116972497e+05 2.517007776940517749e-02 5.579103023359424825e-03 +1.230761242983156553e+05 3.373801278324694425e-02 7.763243549718459521e-03 +1.231990160849340318e+05 2.897003361337064167e-02 6.351564666539795227e-03 +1.233219078715524374e+05 2.373675152342060238e-02 7.578683880172227758e-03 +1.234447996581708139e+05 2.529563028036127537e-02 6.412509565180284782e-03 +1.235676914447892050e+05 1.653696359925942508e-02 4.219111778264306514e-03 +1.236905832314075815e+05 2.598483939761253927e-02 6.634306684445374046e-03 +1.238134750180259871e+05 2.560958348988307334e-02 6.212346540866275045e-03 +1.239363668046443636e+05 1.681666339096550208e-02 3.737563671671103455e-03 +1.240592585912627692e+05 1.653100921885662655e-02 5.394163887603099956e-03 +1.241821503778811311e+05 1.956404193707671560e-02 5.727113471199140292e-03 +1.243050421644995367e+05 2.369019765936945451e-02 5.785731978486669848e-03 +1.244279339511179132e+05 2.710367142949398483e-02 7.472245668213232765e-03 +1.245508257377363188e+05 3.557928025337843414e-02 8.711624516053529180e-03 +1.246737175243546953e+05 1.447572116531967157e-02 4.172967928331334196e-03 +1.247966093109730864e+05 1.933995211181532489e-02 5.844684864763281980e-03 +1.249195010975914629e+05 1.687259456656021658e-02 4.638378587901661673e-03 +1.250423928842098685e+05 2.402794636258288874e-02 6.216841189914889231e-03 +1.251652846708282450e+05 2.497265743610539018e-02 7.691210682271884362e-03 +1.252881764574466506e+05 1.586056887505592899e-02 4.223903857241823739e-03 +1.254110682440650125e+05 1.648901127545056300e-02 4.770876566865539167e-03 +1.255339600306834182e+05 3.163653200644397229e-02 7.232617254040629023e-03 +1.256568518173017947e+05 3.853395010138466886e-02 1.007659297066978467e-02 +1.257797436039202003e+05 2.743277995566392041e-02 6.288014286026228500e-03 +1.259026353905385768e+05 2.210172712571950235e-02 7.228223515194300182e-03 +1.260255271771569678e+05 2.509790514010995857e-02 5.528260558426322663e-03 +1.261484189637753443e+05 2.146846914263840153e-02 5.227724270020094391e-03 +1.262713107503937499e+05 3.875826026089208842e-02 8.561786526764833191e-03 +1.263942025370121264e+05 2.814238148084458740e-02 6.637444957587695926e-03 +1.265170943236305320e+05 8.264889541922625787e-03 2.629355586418252819e-03 +1.266399861102489085e+05 1.340494837485281185e-02 3.978386020049677618e-03 +1.267628778968672996e+05 2.549472866788718428e-02 7.613796202825639028e-03 +1.268857696834856761e+05 1.768415316233559048e-02 4.555469597440370971e-03 +1.270086614701040817e+05 3.300922627510662760e-02 8.798387589717206886e-03 +1.271315532567224582e+05 2.395543738965227876e-02 5.250755406779462724e-03 +1.272544450433408492e+05 1.869422113022709692e-02 5.034427631252015242e-03 +1.273773368299592257e+05 2.722285899588549468e-02 7.493221990560228023e-03 +1.275002286165776313e+05 3.599662009873788593e-02 8.739161174792032041e-03 +1.276231204031960078e+05 2.371695041952227162e-02 5.587908333717149338e-03 +1.277460121898144134e+05 3.126670116160525092e-02 7.216287184600650786e-03 +1.278689039764327899e+05 2.880947539877663777e-02 7.291759919975018128e-03 +1.279917957630511810e+05 2.540583172201398704e-02 5.841727108504319796e-03 +1.281146875496695575e+05 2.450347111911604925e-02 6.140826880201068552e-03 +1.282375793362879631e+05 3.471457458821983894e-02 8.324655767822049246e-03 +1.283604711229063396e+05 2.263985663975150164e-02 6.229705336557353479e-03 +1.284833629095247306e+05 2.824761595844180878e-02 7.307462208854439631e-03 +1.286062546961431071e+05 1.862224962481619228e-02 4.799791485676110740e-03 +1.287291464827615127e+05 2.163972908896593175e-02 5.060594519655271795e-03 +1.288520382693798892e+05 2.033280835095844716e-02 5.509937216690762897e-03 +1.289749300559982948e+05 2.956814214188010007e-02 7.431867565271396518e-03 +1.290978218426166713e+05 1.921876096424040420e-02 4.312762449807682787e-03 +1.292207136292350624e+05 3.209383039551168271e-02 7.237915959828076541e-03 +1.293436054158534389e+05 1.857322569666162299e-02 5.520458050980154782e-03 +1.294664972024718154e+05 2.845589280592272785e-02 7.400320478889285160e-03 +1.295893889890902210e+05 2.462543651324057559e-02 7.307032842444473320e-03 +1.297122807757085975e+05 3.043346726947283171e-02 8.795381078821535789e-03 +1.298351725623269886e+05 4.018646114982622058e-02 9.811352642194251517e-03 +1.299580643489453651e+05 1.947121175376902852e-02 4.669171279787532290e-03 +1.300809561355637707e+05 3.133842907940063982e-02 9.699292968001276341e-03 +1.302038479221821472e+05 2.103405482893818540e-02 6.397982148032396212e-03 +1.303267397088005528e+05 3.246540720470775937e-02 7.569860709206043155e-03 +1.304496314954189147e+05 2.232604101826119944e-02 5.727021977753930446e-03 +1.305725232820373203e+05 3.313504601273867950e-02 7.733697010935326743e-03 +1.306954150686556968e+05 3.119800970145148594e-02 8.575140385889547939e-03 +1.308183068552741024e+05 2.406946704883953722e-02 7.686839082754107384e-03 +1.309411986418924789e+05 2.240850846638621496e-02 5.964435272977636725e-03 +1.310640904285108700e+05 2.283691632754862241e-02 7.087213570281886144e-03 +1.311869822151292465e+05 2.097034388890041054e-02 5.755006942312080806e-03 +1.313098740017476666e+05 3.092075545200869205e-02 7.659418952937007384e-03 +1.314327657883660286e+05 2.487835548537051245e-02 8.519779017374714408e-03 +1.315556575749844196e+05 2.973645583502607451e-02 7.218329340463409093e-03 +1.316785493616028107e+05 2.272317948127683049e-02 6.070343669017095808e-03 +1.318014411482212017e+05 1.849252406658666650e-02 4.448098666767420946e-03 +1.319243329348395928e+05 2.357955162527827775e-02 7.469942476175827316e-03 +1.320472247214579838e+05 2.201079487675185881e-02 6.778774344695224184e-03 +1.321701165080763458e+05 3.312368969659018614e-02 7.664294123865374869e-03 +1.322930082946947659e+05 1.831753055756162735e-02 4.766861591553413734e-03 +1.324159000813131279e+05 1.361783910986427877e-02 3.627151326640130641e-03 +1.325387918679315480e+05 2.455240911075771970e-02 5.988421345343068226e-03 +1.326616836545499100e+05 2.923629812050790658e-02 8.013864882627137060e-03 +1.327845754411683010e+05 2.008660709605018108e-02 5.269091576277571722e-03 +1.329074672277866921e+05 2.548040454618463041e-02 7.650330583869706380e-03 +1.330303590144050831e+05 2.132910557973002885e-02 6.663035430023441646e-03 +1.331532508010234742e+05 1.276942303472672173e-02 3.963336237892457932e-03 +1.332761425876418652e+05 2.564181465867899218e-02 7.677271273228016869e-03 +1.333990343742602272e+05 3.765493429062476832e-02 1.107136796353695024e-02 +1.335219261608786474e+05 2.014415394071582960e-02 6.160683331770996224e-03 +1.336448179474970093e+05 2.011932776112182811e-02 5.303502734811696602e-03 +1.337677097341154295e+05 2.317828414545813551e-02 6.505449280014977305e-03 +1.338906015207337914e+05 3.755097865723158734e-02 8.510757661366132737e-03 +1.340134933073521825e+05 4.143723377139612446e-02 1.019254871563209444e-02 +1.341363850939705735e+05 2.215877532638524383e-02 5.788249191918200601e-03 +1.342592768805889646e+05 2.175212805386865858e-02 6.108289237169054614e-03 +1.343821686672073556e+05 3.782627807741873599e-02 1.144148410569884033e-02 +1.345050604538257467e+05 2.240871109753466567e-02 5.716069703307524036e-03 +1.346279522404441086e+05 3.549580357930993968e-02 8.007452861605576788e-03 +1.347508440270625288e+05 1.584915493602720785e-02 4.207086874702992835e-03 +1.348737358136808907e+05 2.704951789315197114e-02 7.523761035603609808e-03 +1.349966276002993109e+05 2.907877054410656914e-02 6.875870877957140220e-03 +1.351195193869176728e+05 3.750397301753891077e-02 8.693073709135235722e-03 +1.352424111735360639e+05 1.443175163639612117e-02 4.501993148639395204e-03 +1.353653029601544549e+05 2.943394250037071475e-02 9.730109007414260852e-03 +1.354881947467728460e+05 2.595662573949024735e-02 7.619714833122418797e-03 +1.356110865333912370e+05 2.433082617770175940e-02 8.313739877542978066e-03 +1.357339783200096281e+05 3.731321782915426877e-02 1.072552790008340050e-02 +1.358568701066279900e+05 2.240464114406427731e-02 5.109905805092363092e-03 +1.359797618932464102e+05 1.738969446040707773e-02 5.262637481021721284e-03 +1.361026536798647721e+05 2.289024452133561066e-02 5.928474310989655452e-03 +1.362255454664831923e+05 1.867154272305247831e-02 6.792643675844025827e-03 +1.363484372531015542e+05 2.316632697376173541e-02 7.453795188231421807e-03 +1.364713290397199453e+05 1.959981319584293627e-02 5.390195538508026768e-03 +1.365942208263383363e+05 2.278068005015226188e-02 6.041240024087244156e-03 +1.367171126129567274e+05 1.804365070839158633e-02 4.544816729739610019e-03 +1.368400043995751184e+05 2.394328278611511027e-02 7.827431146832148148e-03 +1.369628961861935095e+05 9.758749574833632673e-03 3.691899323857814920e-03 +1.370857879728118714e+05 5.477471814222350383e-02 1.410798868123219925e-02 +1.372086797594302916e+05 1.020146435385990355e-02 3.327691817863766537e-03 +1.373315715460486535e+05 3.660592277048071996e-02 1.024335540345241470e-02 +1.374544633326670737e+05 1.713376269280903960e-02 4.898823183185961258e-03 +1.375773551192854356e+05 2.735255685621172314e-02 8.245813253872420756e-03 +1.377002469059038267e+05 3.277270135642170595e-02 1.023437325479547785e-02 +1.378231386925222178e+05 2.783167261510330337e-02 7.934207773586911955e-03 +1.379460304791406088e+05 2.958240596088438507e-02 8.478227722264822241e-03 +1.380689222657589999e+05 2.674214085215711328e-02 8.873457697299445140e-03 +1.381918140523773909e+05 1.691544198391040435e-02 6.879005394667347083e-03 +1.383147058389957529e+05 2.241506395510313096e-02 7.363889167914180155e-03 +1.384375976256141730e+05 2.128378314953178682e-02 6.589773207195759840e-03 +1.385604894122325350e+05 2.986675373800259589e-02 9.332212930743006424e-03 +1.386833811988509551e+05 3.927482020965190196e-02 9.546641468401914285e-03 +1.388062729854693171e+05 2.314236740091778557e-02 6.087990278798252435e-03 +1.389291647720877081e+05 1.957753856484385768e-02 7.187236662203303102e-03 +1.390520565587060992e+05 2.289279691981940465e-02 6.718328540596221407e-03 +1.391749483453244902e+05 2.339398866909936023e-02 7.015554171905308799e-03 +1.392978401319428813e+05 1.814343897457159488e-02 4.985638429430456174e-03 +1.394207319185612723e+05 3.850644442328909206e-02 1.184210719259656992e-02 +1.395436237051796343e+05 1.827287775250513446e-02 5.071902209131525993e-03 +1.396665154917980544e+05 3.785907506293920838e-02 9.203790943859519944e-03 +1.397894072784164164e+05 3.161766322819439118e-02 9.041183948661929773e-03 +1.399122990650348365e+05 1.671898656174247363e-02 5.172697620244583530e-03 +1.400351908516531985e+05 2.741598502735138887e-02 7.523742519394008635e-03 +1.401580826382715895e+05 2.636460039997611665e-02 9.037726414897345045e-03 +1.402809744248899806e+05 3.044689268878435565e-02 9.209919395031832337e-03 +1.404038662115083716e+05 2.894804446162909176e-02 8.045668265763476074e-03 +1.405267579981267627e+05 2.811035041735441067e-02 8.163778167957139523e-03 +1.406496497847451537e+05 3.112412970985071678e-02 9.232768334957074802e-03 +1.407725415713635157e+05 2.953549771541171334e-02 9.016736133164227063e-03 +1.408954333579819358e+05 3.680408927758448134e-02 1.079635031003788742e-02 +1.410183251446002978e+05 1.938816245280824274e-02 6.062018280115122684e-03 +1.411412169312187179e+05 1.687130381010267313e-02 7.026317151096005305e-03 +1.412641087178370799e+05 1.169130289976441986e-02 3.990346825641509672e-03 +1.413870005044554709e+05 1.538348598225243967e-02 4.935362044028447984e-03 +1.415098922910738620e+05 1.841460025215688537e-02 5.861236397906573713e-03 +1.416327840776922530e+05 2.359573135109973088e-02 6.973788730223878622e-03 +1.417556758643106441e+05 1.875940064522780767e-02 5.338032320112207942e-03 +1.418785676509290352e+05 3.438521775946132980e-02 9.978577770367796224e-03 +1.420014594375473971e+05 2.767443813700840027e-02 8.918902423266997226e-03 +1.421243512241658173e+05 2.385901447776828110e-02 6.273827149676737200e-03 +1.422472430107841792e+05 4.460220553357491236e-02 1.125143963646436582e-02 +1.423701347974025994e+05 2.624163477506297193e-02 8.006619492155784418e-03 +1.424930265840209613e+05 3.504850047767994053e-02 9.421448692397783875e-03 +1.426159183706393524e+05 1.879670721474375333e-02 7.363064249287040557e-03 +1.427388101572577434e+05 2.773574750689462853e-02 8.164407775383322047e-03 +1.428617019438761345e+05 1.711463065698898625e-02 4.734650337688218504e-03 +1.429845937304945255e+05 2.726019030918628433e-02 7.315333185845152887e-03 +1.431074855171129166e+05 2.379521380860375943e-02 6.403730857454938488e-03 +1.432303773037312785e+05 3.110539808100201351e-02 8.443907924399786380e-03 +1.433532690903496987e+05 3.271800879309526289e-02 8.402662519051586412e-03 +1.434761608769680606e+05 3.414880377627167729e-02 1.040575179038145601e-02 +1.435990526635864808e+05 3.031626539373315568e-02 1.064244764101579706e-02 +1.437219444502048427e+05 2.033236480474250388e-02 6.414379395401822830e-03 +1.438448362368232338e+05 2.028897807641273296e-02 7.079725193338068899e-03 +1.439677280234416248e+05 4.447362486631090822e-02 1.115307514773094394e-02 +1.440906198100600159e+05 1.403230212318179806e-02 5.148329283557474476e-03 +1.442135115966784069e+05 1.130735185695058362e-02 3.909243446036396799e-03 +1.443364033832967980e+05 2.153889103317774625e-02 6.552697373824491883e-03 +1.444592951699151599e+05 1.712300725295601983e-02 4.403728191785523209e-03 +1.445821869565335801e+05 3.707536148452345720e-02 1.294857433070219568e-02 +1.447050787431519420e+05 1.710938060112859524e-02 5.721828526830458582e-03 +1.448279705297703622e+05 2.964255265109448992e-02 8.922385081739077003e-03 +1.449508623163887241e+05 3.586533900944632869e-02 9.168347504783735946e-03 +1.450737541030071152e+05 1.512059098574927360e-02 4.400964235899224031e-03 +1.451966458896255062e+05 1.934331847831652698e-02 5.564205820981941303e-03 +1.453195376762438682e+05 3.105717353881507631e-02 8.293748592204287437e-03 +1.454424294628622883e+05 2.306525424709826230e-02 9.209702565326610343e-03 +1.455653212494806503e+05 1.779544628261752609e-02 5.378630981893187113e-03 +1.456882130360990413e+05 2.081090509106390748e-02 6.389329944766053600e-03 +1.458111048227174324e+05 1.842424860158423106e-02 5.609369759412748298e-03 +1.459339966093358235e+05 3.209950998177264064e-02 1.008422280495880133e-02 +1.460568883959542145e+05 2.626497798478488396e-02 8.119899677168416693e-03 +1.461797801825726056e+05 2.282211041745452543e-02 7.461918077608964937e-03 +1.463026719691909966e+05 1.687884295000210630e-02 5.304169817708995205e-03 +1.464255637558093877e+05 1.818838982537298796e-02 6.488250369921889221e-03 +1.465484555424277496e+05 1.944212626555775689e-02 6.307001715045637731e-03 +1.466713473290461698e+05 3.481994460074928910e-02 1.056324416688415521e-02 +1.467942391156645317e+05 2.357493630866323506e-02 7.747143592086368387e-03 +1.469171309022829228e+05 2.493342944728672156e-02 8.251994493270272193e-03 +1.470400226889013138e+05 2.781352719744077662e-02 8.286722868752600946e-03 +1.471629144755197049e+05 1.632042769985373593e-02 7.701644623471446023e-03 +1.472858062621380959e+05 2.233099765977642967e-02 8.250107161809063991e-03 +1.474086980487564870e+05 7.432132978555508473e-02 1.598579709357110870e-02 +1.475315898353748780e+05 3.486558616550493317e-02 1.055230041270722140e-02 +1.476544816219932691e+05 3.078679279800601923e-02 8.959374770864709722e-03 +1.477773734086116310e+05 2.390952998233602730e-02 7.027286357389646299e-03 +1.479002651952300512e+05 2.194648116387179146e-02 7.424880459049574416e-03 +1.480231569818484131e+05 2.519557603105998175e-02 7.641511397783346329e-03 +1.481460487684668333e+05 3.121812964807225282e-02 8.592735388473876981e-03 +1.482689405550851952e+05 2.245097243088979913e-02 7.973372118142182940e-03 +1.483918323417035863e+05 1.399778377623312441e-02 5.392210505449285436e-03 +1.485147241283219773e+05 3.026184763984512971e-02 9.991866449271828363e-03 +1.486376159149403684e+05 2.308467003670581358e-02 7.979806005695469148e-03 +1.487605077015587594e+05 2.569188935350903355e-02 7.530273092211109930e-03 +1.488833994881771505e+05 3.465957915245200527e-02 8.930885149184792510e-03 +1.490062912747955124e+05 3.758830389615559070e-02 1.075774334531571369e-02 +1.491291830614139326e+05 3.648841164908084300e-02 1.025060864984335060e-02 +1.492520748480322945e+05 2.916012095053841999e-02 8.032941101008593890e-03 +1.493749666346507147e+05 3.038682613808670052e-02 8.680565340767016497e-03 +1.494978584212690766e+05 2.063872124237616651e-02 6.966560255535395908e-03 +1.496207502078874677e+05 1.879050946482481443e-02 5.574050863392393702e-03 +1.497436419945058587e+05 1.513922381915751292e-02 7.472180440781615342e-03 +1.498665337811242498e+05 2.217834916696460879e-02 7.554670572540559542e-03 +1.499894255677426409e+05 3.382991390212772287e-02 9.472017770470617104e-03 +1.501123173543610319e+05 2.245822737692045046e-02 6.204887777274029070e-03 +1.502352091409793939e+05 4.393828839064661124e-02 1.326763893289143945e-02 +1.503581009275978140e+05 2.621626303187344839e-02 7.726722054083585804e-03 +1.504809927142161760e+05 1.348800751027356797e-02 4.730557388993130927e-03 +1.506038845008345961e+05 1.643719083355406341e-02 7.120784568785215769e-03 +1.507267762874529581e+05 2.256016189645282041e-02 7.257980525233003605e-03 +1.508496680740713491e+05 3.306430511354317009e-02 1.316004812904690222e-02 +1.509725598606897402e+05 2.373292381531143941e-02 7.281658647970098465e-03 +1.510954516473081312e+05 2.901896344606406247e-02 9.454696444621610643e-03 +1.512183434339265223e+05 9.493993698998864916e-03 4.471390039413315060e-03 +1.513412352205449133e+05 1.835426436830977365e-02 6.367965839600565024e-03 +1.514641270071632753e+05 2.896425148816521994e-02 7.504926065269726561e-03 +1.515870187937816954e+05 5.601354078894441035e-02 1.317930492490759949e-02 +1.517099105804000574e+05 2.614265892192081317e-02 8.310372010843624507e-03 +1.518328023670184775e+05 2.831250116882993648e-02 8.379803158930158868e-03 +1.519556941536368395e+05 2.809701569168113200e-02 1.023744968023162887e-02 +1.520785859402552305e+05 3.375489997326326652e-02 1.090905147129029099e-02 +1.522014777268736216e+05 1.663503674781623143e-02 5.856999160901805654e-03 +1.523243695134920126e+05 1.726697942738695743e-02 6.250476367032058861e-03 +1.524472613001104037e+05 3.063532562497601336e-02 1.011779292172436742e-02 +1.525701530867287947e+05 2.716427554670540478e-02 8.416428256469571378e-03 +1.526930448733471567e+05 1.781264231860719277e-02 5.515853642702506915e-03 +1.528159366599655768e+05 1.482940999391423390e-02 4.966220624985012017e-03 +1.529388284465839388e+05 2.273292386288863418e-02 9.394243370241616917e-03 +1.530617202332023589e+05 1.868179152962668940e-02 6.128345469541743480e-03 +1.531846120198207209e+05 3.928945044934247649e-02 1.121868175819218209e-02 +1.533075038064391119e+05 2.529196058957851323e-02 7.577515400567758595e-03 +1.534303955930575030e+05 3.576205244504025715e-02 1.002459480587259560e-02 +1.535532873796758940e+05 2.961103214034191064e-02 1.044641316805218489e-02 diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb index 6dfbe92f..c2e2bcc3 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.ipynb @@ -2,10 +2,10 @@ "cells": [ { "cell_type": "markdown", - "id": "60194511", + "id": "902e4d86", "metadata": {}, "source": [ - "# Data Analysis: Powder Diffraction\n", + "# Fitting Powder Diffraction data\n", "\n", "This tutorial guides you through the Rietveld refinement of crystal\n", "structures using simulated powder diffraction data. It consists of two parts:\n", @@ -31,11 +31,10 @@ { "cell_type": "code", "execution_count": null, - "id": "6a6add32", + "id": "27d634f9", "metadata": {}, "outputs": [], "source": [ - "# TODO: Remove this cell in the final version of the tutorial.\n", "# Needed for the Google Colab environment.\n", "# Install the easydiffraction library if it is not already installed.\n", "import builtins\n", @@ -50,7 +49,7 @@ { "cell_type": "code", "execution_count": null, - "id": "ec0e8dc6", + "id": "39452a0a", "metadata": {}, "outputs": [], "source": [ @@ -59,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "37c36d31", + "id": "de7344ae", "metadata": {}, "source": [ "## 📘 Introduction: Simple Reference Fit – Si\n", @@ -87,16 +86,16 @@ { "cell_type": "code", "execution_count": null, - "id": "4164e1d9", + "id": "d4df77ab", "metadata": {}, "outputs": [], "source": [ - "project_1 = ed.Project(name='reference')" + "project_1 = ed.Project(name=\"reference\")" ] }, { "cell_type": "markdown", - "id": "0d6eb80f", + "id": "9c16f90a", "metadata": {}, "source": [ "\n", @@ -109,17 +108,17 @@ { "cell_type": "code", "execution_count": null, - "id": "656b2e32", + "id": "13f93ea5", "metadata": {}, "outputs": [], "source": [ - "project_1.info.title = 'Reference Silicon Fit'\n", - "project_1.info.description = 'Fitting simulated powder diffraction pattern of Si.'" + "project_1.info.title = \"Reference Silicon Fit\"\n", + "project_1.info.description = \"Fitting simulated powder diffraction pattern of Si.\"" ] }, { "cell_type": "markdown", - "id": "a326b89c", + "id": "e49ee0be", "metadata": {}, "source": [ "### 🔬 Create an Experiment\n", @@ -131,19 +130,19 @@ "\n", "In this case, the experiment is defined as a powder diffraction measurement\n", "using time-of-flight neutrons. The measured data is loaded from a file\n", - "containing the reduced diffraction pattern of Si from the previous tutorial." + "containing the reduced diffraction pattern of Si from the data reduction tutorial." ] }, { "cell_type": "code", "execution_count": null, - "id": "cc73c9e8", + "id": "a10e717b", "metadata": {}, "outputs": [], "source": [ - "# TODO: Remove this cell in the final version of the tutorial.\n", + "# To load the measured data from the EasyDiffraction repository, as\n", "# Google Colab does not have the data files needed for this tutorial.\n", - "ed.download_from_repository('powder_reduced_Si_2large_bank.xye',\n", + "ed.download_from_repository('reduced_Si.xye',\n", " branch='d-spacing',\n", " destination='data')" ] @@ -151,20 +150,32 @@ { "cell_type": "code", "execution_count": null, - "id": "d7aa9526", + "id": "72e414a2", "metadata": {}, "outputs": [], "source": [ - "project_1.experiments.add(name='sim_si',\n", - " sample_form='powder',\n", - " beam_mode='time-of-flight',\n", - " radiation_probe='neutron',\n", - " data_path='data/powder_reduced_Si_2large_bank.xye')" + "si_xye_path = \"data/reduced_Si.xye\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca21bf10", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.experiments.add(\n", + " name=\"sim_si\",\n", + " sample_form=\"powder\",\n", + " beam_mode=\"time-of-flight\",\n", + " radiation_probe=\"neutron\",\n", + " data_path=si_xye_path,\n", + ")" ] }, { "cell_type": "markdown", - "id": "c6939180", + "id": "7e863800", "metadata": {}, "source": [ "#### Inspect Measured Data\n", @@ -187,49 +198,51 @@ { "cell_type": "code", "execution_count": null, - "id": "ad96437f", + "id": "6afc3669", "metadata": {}, "outputs": [], "source": [ - "project_1.plotter.engine = 'plotly'" + "project_1.plotter.engine = \"plotly\"" ] }, { "cell_type": "code", "execution_count": null, - "id": "bb89e799", + "id": "e9799813", "metadata": {}, "outputs": [], "source": [ - "project_1.plot_meas(expt_name='sim_si')" + "project_1.plot_meas(expt_name=\"sim_si\")" ] }, { "cell_type": "markdown", - "id": "1b130688", + "id": "6bc5c82b", "metadata": {}, "source": [ "If you zoom in on the highest TOF peak (around 120,000 μs), you will notice\n", - "that it has a broad and unusual shape. This is a result of the simplified\n", - "data reduction process. Obtaining a more accurate diffraction pattern would\n", - "require a more advanced data reduction, which is beyond the scope of this\n", - "tutorial. Therefore, we will simply exclude the high TOF region from the\n", - "analysis by adding an excluded region to the experiment." + "that it has a broad and unusual shape. This distortion, along with some more\n", + "effects on the low TOF peaks, is a result of the simplified data reduction\n", + "process. Obtaining a more accurate diffraction pattern would require a more\n", + "advanced data reduction, which is beyond the scope of this tutorial.\n", + "Therefore, we will simply exclude both the low and high TOF regions from the\n", + "analysis by adding an excluded regions to the experiment." ] }, { "cell_type": "code", "execution_count": null, - "id": "61862088", + "id": "20906b9f", "metadata": {}, "outputs": [], "source": [ - "project_1.experiments['sim_si'].excluded_regions.add(minimum=108000, maximum=200000)" + "project_1.experiments[\"sim_si\"].excluded_regions.add(minimum=0, maximum=55000)\n", + "project_1.experiments[\"sim_si\"].excluded_regions.add(minimum=105500, maximum=200000)" ] }, { "cell_type": "markdown", - "id": "6ff6d8f6", + "id": "b78e8f4f", "metadata": {}, "source": [ "To visualize the effect of excluding the high TOF region, we can plot\n", @@ -240,44 +253,107 @@ { "cell_type": "code", "execution_count": null, - "id": "7bcfd1d2", + "id": "6ba0a364", "metadata": {}, "outputs": [], "source": [ - "project_1.plot_meas(expt_name='sim_si')" + "project_1.plot_meas(expt_name=\"sim_si\")" ] }, { "cell_type": "markdown", - "id": "779a4569", + "id": "24c7b130", "metadata": {}, "source": [ "#### Set Instrument Parameters\n", "\n", - "After experiment is created and measured data are loaded, we would need\n", + "After the experiment is created and measured data are loaded, we need\n", "to set the instrument parameters.\n", "\n", "In this type of experiment, the instrument parameters define how the\n", "measured data is converted between d-spacing and time-of-flight (TOF)\n", "during the data reduction process as well as the angular position of the\n", - "detector. So, we put values based on those from the reduction." + "detector. So, we put values based on those from the reduction. These\n", + "values can be found in the header of the corresponding .XYE file. Their\n", + "names are `two_theta` and `DIFC`, which stand for the two-theta angle\n", + "and the linear conversion factor from d-spacing to TOF, respectively.\n", + "\n", + "You can set them manually, but it is more convenient to use the\n", + "`get_value_from_xye_header` function from the EasyDiffraction library." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6eeee77", + "metadata": {}, + "outputs": [], + "source": [ + "project_1.experiments[\"sim_si\"].instrument.setup_twotheta_bank = ed.get_value_from_xye_header(\n", + " si_xye_path, \"two_theta\"\n", + ")\n", + "project_1.experiments[\"sim_si\"].instrument.calib_d_to_tof_linear = ed.get_value_from_xye_header(\n", + " si_xye_path, \"DIFC\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "4650b60e", + "metadata": {}, + "source": [ + "Every parameters is an object, which has different attributes, such as\n", + "`value`, `free`, etc. To display the parameter of interest, you can simply\n", + "print the parameter object. For example, to display the linear conversion\n", + "factor from d-spacing to TOF, which is the `calib_d_to_tof_linear` parameter,\n", + "you can use the following code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34ce6882", + "metadata": {}, + "outputs": [], + "source": [ + "print(project_1.experiments[\"sim_si\"].instrument.calib_d_to_tof_linear)" + ] + }, + { + "cell_type": "markdown", + "id": "bedc3ecb", + "metadata": {}, + "source": [ + "The `value` attribute represents the current value of the parameter as a float.\n", + "You can access it directly by using the `value` attribute of the parameter.\n", + "This is useful when you want to use the parameter value in calculations or\n", + "when you want to assign it to another parameter. For example, to get only the\n", + "value of the same parameter as floating point number, but not the whole object,\n", + "you can do the following:" ] }, { "cell_type": "code", "execution_count": null, - "id": "1dda5bf0", + "id": "9f63737c", "metadata": {}, "outputs": [], "source": [ - "project_1.experiments['sim_si'].instrument.setup_twotheta_bank = 101.46\n", - "project_1.experiments['sim_si'].instrument.calib_d_to_tof_linear = 61710.64\n", - "project_1.experiments['sim_si'].instrument.calib_d_to_tof_quad = -0.00001" + "print(project_1.experiments[\"sim_si\"].instrument.calib_d_to_tof_linear.value)" + ] + }, + { + "cell_type": "markdown", + "id": "e0efac03", + "metadata": {}, + "source": [ + "Note that to set the value of the parameter, you can simply assign a new value\n", + "to the parameter object without using the `value` attribute, as we did above." ] }, { "cell_type": "markdown", - "id": "8669fd57", + "id": "76654ebc", "metadata": {}, "source": [ "#### Set Peak Profile Parameters\n", @@ -291,33 +367,33 @@ "\n", "The values are typically determined experimentally on the same instrument and\n", "under the same configuration as the data being analyzed based on measurements\n", - "of a standard sample. In some cases, these parameters are refined during the\n", - "fitting process to improve the fit between the measured and calculated\n", - "diffraction, but in this case, we will use the values from another simulation." + "of a standard sample. We consider this Si sample as a standard reference.\n", + "Therefore, we will set the initial values of the peak profile parameters based\n", + "on the values obtained from another simulation and refine them during the\n", + "fitting process. The refined parameters will be used as a starting point for the\n", + "more complex fit in the next part of the tutorial." ] }, { "cell_type": "code", "execution_count": null, - "id": "8dbc7188", - "metadata": { - "lines_to_next_cell": 2 - }, + "id": "c8186523", + "metadata": {}, "outputs": [], "source": [ - "project_1.experiments['sim_si'].peak_profile_type = 'pseudo-voigt * ikeda-carpenter'\n", - "project_1.experiments['sim_si'].peak.broad_gauss_sigma_0 = 47347.42\n", - "project_1.experiments['sim_si'].peak.broad_gauss_sigma_1 = -55360.02\n", - "project_1.experiments['sim_si'].peak.broad_gauss_sigma_2 = 23882.42\n", - "project_1.experiments['sim_si'].peak.broad_mix_beta_0 = 0.0055\n", - "project_1.experiments['sim_si'].peak.broad_mix_beta_1 = 0.0041\n", - "project_1.experiments['sim_si'].peak.asym_alpha_0 = 0\n", - "project_1.experiments['sim_si'].peak.asym_alpha_1 = 0.0096" + "project_1.experiments[\"sim_si\"].peak_profile_type = \"pseudo-voigt * ikeda-carpenter\"\n", + "project_1.experiments[\"sim_si\"].peak.broad_gauss_sigma_0 = 69498\n", + "project_1.experiments[\"sim_si\"].peak.broad_gauss_sigma_1 = -55578\n", + "project_1.experiments[\"sim_si\"].peak.broad_gauss_sigma_2 = 14560\n", + "project_1.experiments[\"sim_si\"].peak.broad_mix_beta_0 = 0.0019\n", + "project_1.experiments[\"sim_si\"].peak.broad_mix_beta_1 = 0.0137\n", + "project_1.experiments[\"sim_si\"].peak.asym_alpha_0 = -0.0055\n", + "project_1.experiments[\"sim_si\"].peak.asym_alpha_1 = 0.0147" ] }, { "cell_type": "markdown", - "id": "078f95cc", + "id": "29c73787", "metadata": {}, "source": [ "#### Set Background\n", @@ -351,23 +427,23 @@ { "cell_type": "code", "execution_count": null, - "id": "a3b802aa", + "id": "9e44db58", "metadata": {}, "outputs": [], "source": [ - "project_1.experiments['sim_si'].background_type = 'line-segment'\n", - "project_1.experiments['sim_si'].background.add(x=50000, y=0.01)\n", - "project_1.experiments['sim_si'].background.add(x=60000, y=0.01)\n", - "project_1.experiments['sim_si'].background.add(x=70000, y=0.01)\n", - "project_1.experiments['sim_si'].background.add(x=80000, y=0.01)\n", - "project_1.experiments['sim_si'].background.add(x=90000, y=0.01)\n", - "project_1.experiments['sim_si'].background.add(x=100000, y=0.01)\n", - "project_1.experiments['sim_si'].background.add(x=110000, y=0.01)" + "project_1.experiments[\"sim_si\"].background_type = \"line-segment\"\n", + "project_1.experiments[\"sim_si\"].background.add(x=50000, y=0.01)\n", + "project_1.experiments[\"sim_si\"].background.add(x=60000, y=0.01)\n", + "project_1.experiments[\"sim_si\"].background.add(x=70000, y=0.01)\n", + "project_1.experiments[\"sim_si\"].background.add(x=80000, y=0.01)\n", + "project_1.experiments[\"sim_si\"].background.add(x=90000, y=0.01)\n", + "project_1.experiments[\"sim_si\"].background.add(x=100000, y=0.01)\n", + "project_1.experiments[\"sim_si\"].background.add(x=110000, y=0.01)" ] }, { "cell_type": "markdown", - "id": "77fae341", + "id": "c2577d1e", "metadata": {}, "source": [ "### 🧩 Create a Sample Model – Si\n", @@ -409,7 +485,7 @@ }, { "cell_type": "markdown", - "id": "b897365b", + "id": "9d516e9f", "metadata": {}, "source": [ "```\n", @@ -435,13 +511,13 @@ "_atom_site.occupancy\n", "_atom_site.ADP_type\n", "_atom_site.B_iso_or_equiv\n", - "Si Si 0 0 0 a 1.0 Biso 0.95\n", + "Si Si 0 0 0 a 1.0 Biso 0.89\n", "```" ] }, { "cell_type": "markdown", - "id": "6c36ee5a", + "id": "0da19b61", "metadata": {}, "source": [ "\n", @@ -455,16 +531,16 @@ { "cell_type": "code", "execution_count": null, - "id": "e46d255a", + "id": "cfb3312b", "metadata": {}, "outputs": [], "source": [ - "project_1.sample_models.add(name='si')" + "project_1.sample_models.add(name=\"si\")" ] }, { "cell_type": "markdown", - "id": "4c3ac1e6", + "id": "34c913ef", "metadata": {}, "source": [ "#### Set Space Group" @@ -473,17 +549,17 @@ { "cell_type": "code", "execution_count": null, - "id": "ba69a031", + "id": "015ba947", "metadata": {}, "outputs": [], "source": [ - "project_1.sample_models['si'].space_group.name_h_m = 'F d -3 m'\n", - "project_1.sample_models['si'].space_group.it_coordinate_system_code = '2'" + "project_1.sample_models[\"si\"].space_group.name_h_m = \"F d -3 m\"\n", + "project_1.sample_models[\"si\"].space_group.it_coordinate_system_code = \"2\"" ] }, { "cell_type": "markdown", - "id": "f6afea8d", + "id": "d53cf8ce", "metadata": {}, "source": [ "#### Set Lattice Parameters" @@ -492,16 +568,16 @@ { "cell_type": "code", "execution_count": null, - "id": "0fc252e3", + "id": "27761086", "metadata": {}, "outputs": [], "source": [ - "project_1.sample_models['si'].cell.length_a = 5.43" + "project_1.sample_models[\"si\"].cell.length_a = 5.43" ] }, { "cell_type": "markdown", - "id": "54fc9101", + "id": "e6065014", "metadata": {}, "source": [ "#### Set Atom Sites" @@ -510,22 +586,24 @@ { "cell_type": "code", "execution_count": null, - "id": "325d5f49", + "id": "119f9be6", "metadata": {}, "outputs": [], "source": [ - "project_1.sample_models['si'].atom_sites.add(label='Si',\n", - " type_symbol='Si',\n", - " fract_x=0,\n", - " fract_y=0,\n", - " fract_z=0,\n", - " wyckoff_letter='a',\n", - " b_iso=0.95)" + "project_1.sample_models[\"si\"].atom_sites.add(\n", + " label=\"Si\",\n", + " type_symbol=\"Si\",\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter=\"a\",\n", + " b_iso=0.89,\n", + ")" ] }, { "cell_type": "markdown", - "id": "33349f94", + "id": "eac3ad98", "metadata": {}, "source": [ "### 🔗 Assign Sample Model to Experiment\n", @@ -538,16 +616,16 @@ { "cell_type": "code", "execution_count": null, - "id": "e47d6115", + "id": "3e3d07ef", "metadata": {}, "outputs": [], "source": [ - "project_1.experiments['sim_si'].linked_phases.add(id='si', scale=1.0)" + "project_1.experiments[\"sim_si\"].linked_phases.add(id=\"si\", scale=1.0)" ] }, { "cell_type": "markdown", - "id": "ad28c299", + "id": "ab759622", "metadata": {}, "source": [ "### 🚀 Analyze and Fit the Data\n", @@ -567,27 +645,39 @@ "To perform the fit, we need to specify the refinement parameters. These\n", "are the parameters that will be adjusted during the fitting process to\n", "minimize the difference between the measured and calculated diffraction\n", - "patterns. In this case, we will refine only the scale factor of the Si phase\n", - "in the experiment, as well as the intensities of the background points.\n", - "This is done by setting\n", - "the `free` attribute of the corresponding parameters to `True`." + "patterns. This is done by setting the `free` attribute of the\n", + "corresponding parameters to `True`.\n", + "\n", + "We will refine the scale factor of the Si phase, the intensities of the\n", + "background points as well as the peak profile parameters. The structure\n", + "parameters of the Si phase will not be refined, as this sample is\n", + "considered a reference sample with known parameters." ] }, { "cell_type": "code", "execution_count": null, - "id": "e0b4b651", + "id": "65841d67", "metadata": {}, "outputs": [], "source": [ - "project_1.experiments['sim_si'].linked_phases['si'].scale.free = True\n", - "for line_segment in project_1.experiments['sim_si'].background:\n", - " line_segment.y.free = True" + "project_1.experiments[\"sim_si\"].linked_phases[\"si\"].scale.free = True\n", + "\n", + "for line_segment in project_1.experiments[\"sim_si\"].background:\n", + " line_segment.y.free = True\n", + "\n", + "project_1.experiments[\"sim_si\"].peak.broad_gauss_sigma_0.free = True\n", + "project_1.experiments[\"sim_si\"].peak.broad_gauss_sigma_1.free = True\n", + "project_1.experiments[\"sim_si\"].peak.broad_gauss_sigma_2.free = True\n", + "project_1.experiments[\"sim_si\"].peak.broad_mix_beta_0.free = True\n", + "project_1.experiments[\"sim_si\"].peak.broad_mix_beta_1.free = True\n", + "project_1.experiments[\"sim_si\"].peak.asym_alpha_0.free = True\n", + "project_1.experiments[\"sim_si\"].peak.asym_alpha_1.free = True" ] }, { "cell_type": "markdown", - "id": "04ac3b70", + "id": "26d062b7", "metadata": {}, "source": [ "#### Show Free Parameters\n", @@ -599,7 +689,7 @@ { "cell_type": "code", "execution_count": null, - "id": "11d464c3", + "id": "2797d279", "metadata": {}, "outputs": [], "source": [ @@ -608,7 +698,7 @@ }, { "cell_type": "markdown", - "id": "637fb4b6", + "id": "b2e021c6", "metadata": {}, "source": [ "#### Visualize Diffraction Patterns\n", @@ -624,16 +714,16 @@ { "cell_type": "code", "execution_count": null, - "id": "37089fac", + "id": "fb1db679", "metadata": {}, "outputs": [], "source": [ - "project_1.plot_meas_vs_calc(expt_name='sim_si')" + "project_1.plot_meas_vs_calc(expt_name=\"sim_si\")" ] }, { "cell_type": "markdown", - "id": "4c669678", + "id": "ae971c1d", "metadata": {}, "source": [ "#### Run Fitting\n", @@ -645,7 +735,7 @@ { "cell_type": "code", "execution_count": null, - "id": "26fea591", + "id": "5916a649", "metadata": {}, "outputs": [], "source": [ @@ -654,7 +744,7 @@ }, { "cell_type": "markdown", - "id": "0128aea9", + "id": "4e198a2c", "metadata": {}, "source": [ "#### Check Fit Results\n", @@ -672,7 +762,7 @@ }, { "cell_type": "markdown", - "id": "b6b10e3a", + "id": "fbd01da5", "metadata": {}, "source": [ "#### Visualize Fit Results\n", @@ -686,16 +776,16 @@ { "cell_type": "code", "execution_count": null, - "id": "dbd9d48f", + "id": "5d596863", "metadata": {}, "outputs": [], "source": [ - "project_1.plot_meas_vs_calc(expt_name='sim_si')" + "project_1.plot_meas_vs_calc(expt_name=\"sim_si\")" ] }, { "cell_type": "markdown", - "id": "3728cc3d", + "id": "fefbfd89", "metadata": {}, "source": [ "#### TOF vs d-spacing\n", @@ -714,16 +804,16 @@ { "cell_type": "code", "execution_count": null, - "id": "ba29f44a", + "id": "b474d68e", "metadata": {}, "outputs": [], "source": [ - "project_1.plot_meas_vs_calc(expt_name='sim_si', d_spacing=True)" + "project_1.plot_meas_vs_calc(expt_name=\"sim_si\", d_spacing=True)" ] }, { "cell_type": "markdown", - "id": "372cfac2", + "id": "119e0b7d", "metadata": {}, "source": [ "As you can see, the calculated diffraction pattern now matches the measured\n", @@ -758,18 +848,20 @@ { "cell_type": "code", "execution_count": null, - "id": "c9ac219f", + "id": "1adef8dd", "metadata": {}, "outputs": [], "source": [ - "project_2 = ed.Project(name='main')\n", - "project_2.info.title = 'La0.5Ba0.5CoO3 Fit'\n", - "project_2.info.description = 'Fitting simulated powder diffraction pattern of La0.5Ba0.5CoO3.'" + "project_2 = ed.Project(name=\"main\")\n", + "project_2.info.title = \"La0.5Ba0.5CoO3 Fit\"\n", + "project_2.info.description = (\n", + " \"Fitting simulated powder diffraction pattern of La0.5Ba0.5CoO3.\"\n", + ")" ] }, { "cell_type": "markdown", - "id": "9db79f04", + "id": "3c5d72c6", "metadata": {}, "source": [ "### 🔬 Exercise 2: Define an Experiment\n", @@ -788,13 +880,13 @@ { "cell_type": "code", "execution_count": null, - "id": "285702d3", + "id": "4b0a255f", "metadata": {}, "outputs": [], "source": [ - "# TODO: Remove this cell in the final version of the tutorial.\n", + "# To load the measured data from the EasyDiffraction repository, as\n", "# Google Colab does not have the data files needed for this tutorial.\n", - "ed.download_from_repository('powder_reduced_lbco_0_05si_2large_bank.xye',\n", + "ed.download_from_repository('reduced_LBCO.xye',\n", " branch='d-spacing',\n", " destination='data')" ] @@ -802,20 +894,32 @@ { "cell_type": "code", "execution_count": null, - "id": "18359b79", + "id": "97ffee5d", "metadata": {}, "outputs": [], "source": [ - "project_2.experiments.add(name='sim_lbco',\n", - " sample_form='powder',\n", - " beam_mode='time-of-flight',\n", - " radiation_probe='neutron',\n", - " data_path='data/powder_reduced_lbco_0_05si_2large_bank.xye')" + "lbco_xye_path = \"data/reduced_LBCO.xye\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e46b573", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments.add(\n", + " name=\"sim_lbco\",\n", + " sample_form=\"powder\",\n", + " beam_mode=\"time-of-flight\",\n", + " radiation_probe=\"neutron\",\n", + " data_path=lbco_xye_path,\n", + ")" ] }, { "cell_type": "markdown", - "id": "a6d13779", + "id": "1ba9926f", "metadata": {}, "source": [ "#### Exercise 2.1: Inspect Measured Data\n", @@ -826,7 +930,8 @@ "\n", "**Hint:** You can use the `plot_meas` method of the project to visualize the\n", "measured diffraction pattern. You can also use the `excluded_regions` attribute\n", - "of the experiment to exclude specific regions from the analysis.\n", + "of the experiment to exclude specific regions from the analysis as we did\n", + "in the previous part of the tutorial.\n", "\n", "**Solution:**" ] @@ -834,37 +939,38 @@ { "cell_type": "code", "execution_count": null, - "id": "d5798e4b", + "id": "12d28523", "metadata": {}, "outputs": [], "source": [ - "project_2.plotter.engine = 'plotly'\n", - "project_2.plot_meas(expt_name='sim_lbco')" + "project_2.plotter.engine = \"plotly\"\n", + "project_2.plot_meas(expt_name=\"sim_lbco\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "2a2dcb68", + "id": "41d33b71", "metadata": {}, "outputs": [], "source": [ - "project_2.experiments['sim_lbco'].excluded_regions.add(minimum=108000, maximum=200000)" + "project_2.experiments[\"sim_lbco\"].excluded_regions.add(minimum=0, maximum=55000)\n", + "project_2.experiments[\"sim_lbco\"].excluded_regions.add(minimum=105500, maximum=200000)" ] }, { "cell_type": "code", "execution_count": null, - "id": "95ba2cb8", + "id": "12f7332c", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas(expt_name='sim_lbco')" + "project_2.plot_meas(expt_name=\"sim_lbco\")" ] }, { "cell_type": "markdown", - "id": "c4078a0d", + "id": "f60fe31a", "metadata": {}, "source": [ "#### Exercise 2.2: Set Instrument Parameters\n", @@ -880,25 +986,31 @@ { "cell_type": "code", "execution_count": null, - "id": "af03ff64", + "id": "0602dcef", "metadata": {}, "outputs": [], "source": [ - "project_2.experiments['sim_lbco'].instrument.setup_twotheta_bank = 94.91\n", - "project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_linear = 58752.56\n", - "project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_quad = -0.00001" + "project_2.experiments[\"sim_lbco\"].instrument.setup_twotheta_bank = ed.get_value_from_xye_header(\n", + " lbco_xye_path, \"two_theta\"\n", + ")\n", + "project_2.experiments[\"sim_lbco\"].instrument.calib_d_to_tof_linear = ed.get_value_from_xye_header(\n", + " lbco_xye_path, \"DIFC\"\n", + ")" ] }, { "cell_type": "markdown", - "id": "17de2311", + "id": "bd97c6df", "metadata": {}, "source": [ "#### Exercise 2.3: Set Peak Profile Parameters\n", "\n", "Set the peak profile parameters for the LBCO experiment.\n", "\n", - "**Hint:** Use the values from the previous part of the tutorial.\n", + "**Hint:** Use the values from the previous part of the tutorial. You can\n", + "either manually copy the values from the Si fit or use the `value` attribute of\n", + "the parameters from the Si experiment to set the initial values for the LBCO\n", + "experiment. This will help us to have a good starting point for the fit.\n", "\n", "**Solution:**" ] @@ -906,23 +1018,23 @@ { "cell_type": "code", "execution_count": null, - "id": "6c5c978d", + "id": "daec69f1", "metadata": {}, "outputs": [], "source": [ - "project_2.peak_profile_type = 'pseudo-voigt * ikeda-carpenter'\n", - "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_0 = 47347.42\n", - "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_1 = -55360.02\n", - "project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_2 = 23882.42\n", - "project_2.experiments['sim_lbco'].peak.broad_mix_beta_0 = 0.0055\n", - "project_2.experiments['sim_lbco'].peak.broad_mix_beta_1 = 0.0041\n", - "project_2.experiments['sim_lbco'].peak.asym_alpha_0 = 0\n", - "project_2.experiments['sim_lbco'].peak.asym_alpha_1 = 0.0096" + "project_2.peak_profile_type = \"pseudo-voigt * ikeda-carpenter\"\n", + "project_2.experiments[\"sim_lbco\"].peak.broad_gauss_sigma_0 = project_1.experiments[\"sim_si\"].peak.broad_gauss_sigma_0.value\n", + "project_2.experiments[\"sim_lbco\"].peak.broad_gauss_sigma_1 = project_1.experiments[\"sim_si\"].peak.broad_gauss_sigma_1.value\n", + "project_2.experiments[\"sim_lbco\"].peak.broad_gauss_sigma_2 = project_1.experiments[\"sim_si\"].peak.broad_gauss_sigma_2.value\n", + "project_2.experiments[\"sim_lbco\"].peak.broad_mix_beta_0 = project_1.experiments[\"sim_si\"].peak.broad_mix_beta_0.value\n", + "project_2.experiments[\"sim_lbco\"].peak.broad_mix_beta_1 = project_1.experiments[\"sim_si\"].peak.broad_mix_beta_1.value\n", + "project_2.experiments[\"sim_lbco\"].peak.asym_alpha_0 = project_1.experiments[\"sim_si\"].peak.asym_alpha_0.value\n", + "project_2.experiments[\"sim_lbco\"].peak.asym_alpha_1 = project_1.experiments[\"sim_si\"].peak.asym_alpha_1.value" ] }, { "cell_type": "markdown", - "id": "a8384726", + "id": "36c7b0b6", "metadata": {}, "source": [ "#### Exercise 2.4: Set Background\n", @@ -941,35 +1053,39 @@ { "cell_type": "code", "execution_count": null, - "id": "72899511", + "id": "a850fe96", "metadata": {}, "outputs": [], "source": [ - "project_2.experiments['sim_lbco'].background_type = 'line-segment'\n", - "project_2.experiments['sim_lbco'].background.add(x=50000, y=0.2)\n", - "project_2.experiments['sim_lbco'].background.add(x=60000, y=0.2)\n", - "project_2.experiments['sim_lbco'].background.add(x=70000, y=0.2)\n", - "project_2.experiments['sim_lbco'].background.add(x=80000, y=0.2)\n", - "project_2.experiments['sim_lbco'].background.add(x=90000, y=0.2)\n", - "project_2.experiments['sim_lbco'].background.add(x=100000, y=0.2)\n", - "project_2.experiments['sim_lbco'].background.add(x=110000, y=0.2)" + "project_2.experiments[\"sim_lbco\"].background_type = \"line-segment\"\n", + "project_2.experiments[\"sim_lbco\"].background.add(x=50000, y=0.2)\n", + "project_2.experiments[\"sim_lbco\"].background.add(x=60000, y=0.2)\n", + "project_2.experiments[\"sim_lbco\"].background.add(x=70000, y=0.2)\n", + "project_2.experiments[\"sim_lbco\"].background.add(x=80000, y=0.2)\n", + "project_2.experiments[\"sim_lbco\"].background.add(x=90000, y=0.2)\n", + "project_2.experiments[\"sim_lbco\"].background.add(x=100000, y=0.2)\n", + "project_2.experiments[\"sim_lbco\"].background.add(x=110000, y=0.2)" ] }, { "cell_type": "markdown", - "id": "bc3338fd", + "id": "aee720ab", "metadata": {}, "source": [ "### 🧩 Exercise 3: Define a Sample Model – LBCO\n", "\n", "The LBSO structure is not as simple as the Si model, as it contains multiple\n", "atoms in the unit cell. It is not in COD, so we give you the structural\n", - "parameters in CIF format to create the sample model right here:" + "parameters in CIF format to create the sample model.\n", + "\n", + "Note that those parameters are not necessarily the most accurate ones, but they\n", + "are a good starting point for the fit. The aim of the study is to refine the\n", + "LBCO lattice parameters." ] }, { "cell_type": "markdown", - "id": "f9a2183d", + "id": "c357104b", "metadata": {}, "source": [ "```\n", @@ -995,16 +1111,16 @@ "_atom_site.occupancy\n", "_atom_site.ADP_type\n", "_atom_site.B_iso_or_equiv\n", - "La La 0.0 0.0 0.0 a 0.5 Biso 0.10\n", - "Ba Ba 0.0 0.0 0.0 a 0.5 Biso 0.10\n", - "Co Co 0.5 0.5 0.5 b 1.0 Biso 0.36\n", - "O O 0.0 0.5 0.5 c 1.0 Biso 2.14\n", + "La La 0.0 0.0 0.0 a 0.5 Biso 0.95\n", + "Ba Ba 0.0 0.0 0.0 a 0.5 Biso 0.95\n", + "Co Co 0.5 0.5 0.5 b 1.0 Biso 0.80\n", + "O O 0.0 0.5 0.5 c 1.0 Biso 1.66\n", "```" ] }, { "cell_type": "markdown", - "id": "cea5b06e", + "id": "fe7f787a", "metadata": {}, "source": [ "#### Exercise 3.1: Create Sample Model\n", @@ -1020,16 +1136,16 @@ { "cell_type": "code", "execution_count": null, - "id": "d14df9ce", + "id": "a081e43a", "metadata": {}, "outputs": [], "source": [ - "project_2.sample_models.add(name='lbco')" + "project_2.sample_models.add(name=\"lbco\")" ] }, { "cell_type": "markdown", - "id": "76ca4888", + "id": "2aac3285", "metadata": {}, "source": [ "#### Exercise 3.2: Set Space Group\n", @@ -1044,17 +1160,17 @@ { "cell_type": "code", "execution_count": null, - "id": "76e256b3", + "id": "39c8b8fa", "metadata": {}, "outputs": [], "source": [ - "project_2.sample_models['lbco'].space_group.name_h_m = 'P m -3 m'\n", - "project_2.sample_models['lbco'].space_group.it_coordinate_system_code = '1'" + "project_2.sample_models[\"lbco\"].space_group.name_h_m = \"P m -3 m\"\n", + "project_2.sample_models[\"lbco\"].space_group.it_coordinate_system_code = \"1\"" ] }, { "cell_type": "markdown", - "id": "140fb92a", + "id": "b80d50d5", "metadata": {}, "source": [ "#### Exercise 3.3: Set Lattice Parameters\n", @@ -1069,16 +1185,16 @@ { "cell_type": "code", "execution_count": null, - "id": "b2fee473", + "id": "87ff71a6", "metadata": {}, "outputs": [], "source": [ - "project_2.sample_models['lbco'].cell.length_a = 3.88" + "project_2.sample_models[\"lbco\"].cell.length_a = 3.88" ] }, { "cell_type": "markdown", - "id": "16094c3b", + "id": "863eb3c0", "metadata": {}, "source": [ "#### Exercise 3.4: Set Atom Sites\n", @@ -1095,45 +1211,53 @@ { "cell_type": "code", "execution_count": null, - "id": "f4c6a3fd", + "id": "87a280a6", "metadata": {}, "outputs": [], "source": [ - "project_2.sample_models['lbco'].atom_sites.add(label='La',\n", - " type_symbol='La',\n", - " fract_x=0,\n", - " fract_y=0,\n", - " fract_z=0,\n", - " wyckoff_letter='a',\n", - " b_iso=0.1,\n", - " occupancy=0.5)\n", - "project_2.sample_models['lbco'].atom_sites.add(label='Ba',\n", - " type_symbol='Ba',\n", - " fract_x=0,\n", - " fract_y=0,\n", - " fract_z=0,\n", - " wyckoff_letter='a',\n", - " b_iso=0.1,\n", - " occupancy=0.5)\n", - "project_2.sample_models['lbco'].atom_sites.add(label='Co',\n", - " type_symbol='Co',\n", - " fract_x=0.5,\n", - " fract_y=0.5,\n", - " fract_z=0.5,\n", - " wyckoff_letter='b',\n", - " b_iso=0.36)\n", - "project_2.sample_models['lbco'].atom_sites.add(label='O',\n", - " type_symbol='O',\n", - " fract_x=0,\n", - " fract_y=0.5,\n", - " fract_z=0.5,\n", - " wyckoff_letter='c',\n", - " b_iso=2.14)" + "project_2.sample_models[\"lbco\"].atom_sites.add(\n", + " label=\"La\",\n", + " type_symbol=\"La\",\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter=\"a\",\n", + " b_iso=0.95,\n", + " occupancy=0.5,\n", + ")\n", + "project_2.sample_models[\"lbco\"].atom_sites.add(\n", + " label=\"Ba\",\n", + " type_symbol=\"Ba\",\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter=\"a\",\n", + " b_iso=0.95,\n", + " occupancy=0.5,\n", + ")\n", + "project_2.sample_models[\"lbco\"].atom_sites.add(\n", + " label=\"Co\",\n", + " type_symbol=\"Co\",\n", + " fract_x=0.5,\n", + " fract_y=0.5,\n", + " fract_z=0.5,\n", + " wyckoff_letter=\"b\",\n", + " b_iso=0.80,\n", + ")\n", + "project_2.sample_models[\"lbco\"].atom_sites.add(\n", + " label=\"O\",\n", + " type_symbol=\"O\",\n", + " fract_x=0,\n", + " fract_y=0.5,\n", + " fract_z=0.5,\n", + " wyckoff_letter=\"c\",\n", + " b_iso=1.66,\n", + ")" ] }, { "cell_type": "markdown", - "id": "3ef67cad", + "id": "b5562be3", "metadata": {}, "source": [ "### 🔗 Exercise 4: Assign Sample Model to Experiment\n", @@ -1148,27 +1272,28 @@ { "cell_type": "code", "execution_count": null, - "id": "79a3d3f3", + "id": "e73c1d5b", "metadata": {}, "outputs": [], "source": [ - "project_2.experiments['sim_lbco'].linked_phases.add(id='lbco', scale=1.0)" + "project_2.experiments[\"sim_lbco\"].linked_phases.add(id=\"lbco\", scale=1.0)" ] }, { "cell_type": "markdown", - "id": "60e8f0fc", + "id": "f47971d2", "metadata": {}, "source": [ "### 🚀 Exercise 5: Analyze and Fit the Data\n", "\n", "#### Exercise 5.1: Set Fit Parameters\n", "\n", - "Select the parameters to be refined during the fitting process.\n", + "Select the initial set of parameters to be refined during the fitting\n", + "process.\n", "\n", - "**Hint:** You can start with the same parameters as in the Si fit, but\n", - "this time you will refine the scale factor of the LBCO phase and the\n", - "background points for the second simulation.\n", + "**Hint:** You can start with the scale factor and the background\n", + "points, as in the Si fit, but this time you will refine the LBCO\n", + "phase related parameters.\n", "\n", "**Solution:**" ] @@ -1176,18 +1301,19 @@ { "cell_type": "code", "execution_count": null, - "id": "72ba7c10", + "id": "e66fa8cf", "metadata": {}, "outputs": [], "source": [ - "project_2.experiments['sim_lbco'].linked_phases['lbco'].scale.free = True\n", - "for line_segment in project_2.experiments['sim_lbco'].background:\n", + "project_2.experiments[\"sim_lbco\"].linked_phases[\"lbco\"].scale.free = True\n", + "\n", + "for line_segment in project_2.experiments[\"sim_lbco\"].background:\n", " line_segment.y.free = True" ] }, { "cell_type": "markdown", - "id": "76151a8e", + "id": "8aab9cda", "metadata": {}, "source": [ "#### Exercise 5.2: Run Fitting\n", @@ -1206,17 +1332,17 @@ { "cell_type": "code", "execution_count": null, - "id": "17d6fab3", + "id": "96d70a36", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "cab87e11", + "id": "c10a0430", "metadata": {}, "outputs": [], "source": [ @@ -1225,7 +1351,7 @@ }, { "cell_type": "markdown", - "id": "3e8311ca", + "id": "21771dca", "metadata": {}, "source": [ "#### Exercise 5.3: Find the Misfit in the Fit\n", @@ -1243,7 +1369,9 @@ "4. The background points are not correct.\n", "\n", "**Solution**:\n", - "1. ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction process and this was verified in the Si fit.\n", + "1. ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction step. While they are\n", + "specific to each dataset and thus differ from those used for the Si data, the full reduction workflow has already been\n", + "validated with the Si fit. Therefore, they are not the cause of the misfit in this case.\n", "2. ✅ The lattice parameters of the LBCO phase were set based on the CIF data, which is a good starting point, but they are not necessarily as accurate as needed for the fit. The lattice parameters may need to be refined.\n", "3. ❌ The peak profile parameters do not change the position of the peaks, but rather their shape.\n", "4. ❌ The background points affect the background level, but not the peak positions." @@ -1252,26 +1380,24 @@ { "cell_type": "code", "execution_count": null, - "id": "ee498b05", + "id": "b5ecdfce", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\")" ] }, { "cell_type": "markdown", - "id": "953a893f", + "id": "1ff89ab5", "metadata": {}, "source": [ "#### Exercise 5.4: Refine the LBCO Lattice Parameter\n", "\n", "To improve the fit, refine the lattice parameter of the LBCO phase.\n", "\n", - "**Hint**: To accomplish this, we will set the `free` attribute of the `length_a` parameter\n", - "of the LBCO cell to `True`. This will allow the fitting process to adjust\n", - "the lattice parameter in addition to the scale factor of the LBCO phase\n", - "and the background points. Then, you can run the fitting process again.\n", + "**Hint**: To achieve this, we will set the `free` attribute of the `length_a` parameter\n", + "of the LBCO cell to `True`.\n", "\n", "**Solution**:" ] @@ -1279,17 +1405,17 @@ { "cell_type": "code", "execution_count": null, - "id": "ae225dae", + "id": "4842e297", "metadata": {}, "outputs": [], "source": [ - "project_2.sample_models['lbco'].cell.length_a.free = True" + "project_2.sample_models[\"lbco\"].cell.length_a.free = True" ] }, { "cell_type": "code", "execution_count": null, - "id": "63f62a6a", + "id": "ff756f2e", "metadata": {}, "outputs": [], "source": [ @@ -1299,16 +1425,24 @@ { "cell_type": "code", "execution_count": null, - "id": "3a68fe49", + "id": "250674ea", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\")" ] }, { "cell_type": "markdown", - "id": "29bbcdf6", + "id": "a86bee0a", + "metadata": {}, + "source": [ + "One of the main goals of this study was to refine the lattice parameter of the LBCO phase. As shown in the updated fit results, the overall fit has improved significantly, even though the change in cell length is less than 1% of the initial value. This demonstrates how even a small adjustment to the lattice parameter can have a substantial impact on the quality of the fit." + ] + }, + { + "cell_type": "markdown", + "id": "39551f16", "metadata": {}, "source": [ "#### Exercise 5.5: Visualize the Fit Results in d-spacing\n", @@ -1324,22 +1458,106 @@ { "cell_type": "code", "execution_count": null, - "id": "2cf8b9fa", + "id": "a55ad1c4", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas_vs_calc(expt_name='sim_lbco', d_spacing=True)" + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\", d_spacing=True)" ] }, { "cell_type": "markdown", - "id": "9947fdf6", + "id": "23d31ecc", "metadata": {}, "source": [ - "#### Exercise 5.6: Find Undefined Features\n", + "#### Exercise 5.6: Refine the Peak Profile Parameters\n", "\n", - "After refining the lattice parameter, the fit is significantly improved, but\n", - "inspect the diffraction pattern again. Are you noticing anything undefined?\n", + "As you can see, the fit is now relatively good and the peak positions are much\n", + "closer to the measured data.\n", + "\n", + "The peak profile parameters were not refined, and their starting values were\n", + "set based on the previous fit of the Si standard sample. Although these starting\n", + "values are reasonable and provide a good starting point for the fit, they are\n", + "not necessarily optimal for the LBCO phase. This can be seen while inspecting\n", + "the individual peaks in the diffraction pattern. For example, the calculated curve\n", + "does not perfectly describe the peak at about 1.38 Å, as can be seen below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e54bf83", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\", d_spacing=True, x_min=1.35, x_max=1.40)" + ] + }, + { + "cell_type": "markdown", + "id": "a2ef3e32", + "metadata": {}, + "source": [ + "The peak profile parameters are determined based on both the instrument\n", + "and the sample characteristics, so they can vary when analyzing different\n", + "samples on the same instrument. Therefore, it is better to refine them as well.\n", + "\n", + "Select the peak profile parameters to be refined during the fitting process.\n", + "\n", + "**Hint**: You can set the `free` attribute of the peak profile parameters to `True`\n", + "to allow the fitting process to adjust them. You can use the same approach as in\n", + "the previous part of the tutorial, but this time you will refine the peak profile\n", + "parameters of the LBCO phase.\n", + "\n", + "**Solution**:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0db388ec", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.experiments[\"sim_lbco\"].peak.broad_gauss_sigma_0.free = True\n", + "project_2.experiments[\"sim_lbco\"].peak.broad_gauss_sigma_1.free = True\n", + "project_2.experiments[\"sim_lbco\"].peak.broad_gauss_sigma_2.free = True\n", + "project_2.experiments[\"sim_lbco\"].peak.broad_mix_beta_0.free = True\n", + "project_2.experiments[\"sim_lbco\"].peak.broad_mix_beta_1.free = True\n", + "project_2.experiments[\"sim_lbco\"].peak.asym_alpha_0.free = True\n", + "project_2.experiments[\"sim_lbco\"].peak.asym_alpha_1.free = True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8102bbe9", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.analysis.fit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8e16df1", + "metadata": {}, + "outputs": [], + "source": [ + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\", d_spacing=True, x_min=1.35, x_max=1.40)" + ] + }, + { + "cell_type": "markdown", + "id": "8eba2fac", + "metadata": {}, + "source": [ + "#### Exercise 5.7: Find Undefined Features\n", + "\n", + "After refining the lattice parameter and the peak profile parameters, the fit is\n", + "significantly improved, but inspect the diffraction pattern again. Are you noticing\n", + "anything undefined?\n", "\n", "**Hint**: While the fit is now significantly better, there are still some unexplained peaks\n", "in the diffraction pattern. These peaks are not accounted for by the LBCO phase.\n", @@ -1352,24 +1570,25 @@ { "cell_type": "code", "execution_count": null, - "id": "d52d3593", + "id": "acb4ef20", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1.53, x_max=1.7, d_spacing=True)" + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\", x_min=1.53, x_max=1.7, d_spacing=True)" ] }, { "cell_type": "markdown", - "id": "1a6bd5ab", + "id": "640e35d9", "metadata": {}, "source": [ - "#### Exercise 5.7: Identify the Cause of the Unexplained Peaks\n", + "#### Exercise 5.8: Identify the Cause of the Unexplained Peaks\n", "\n", "**Hint**: Consider the following options:\n", "1. The LBCO phase is not correctly modeled.\n", "2. The LBCO phase is not the only phase present in the sample.\n", "3. The data reduction process introduced artifacts.\n", + "4. The studied sample is not LBCO, but rather a different phase.\n", "\n", "**Solution**:\n", "1. ❌ In principle, this could be the case, as sometimes the presence of\n", @@ -1378,16 +1597,18 @@ "in this case, the LBCO phase is correctly modeled based on the CIF data.\n", "2. ✅ The unexplained peaks are due to the presence of an impurity phase\n", "in the sample, which is not included in the current model.\n", - "3. ❌ The data reduction process is not likely to introduce such specific peaks, as it is\n", - "tested and verified in the previous part of the tutorial." + "3. ❌ The data reduction process is not likely to introduce such specific\n", + "peaks, as it is tested and verified in the previous part of the tutorial.\n", + "4. ❌ This could also be the case in real experiments, but in this case,\n", + "we know that the sample is LBCO, as it was simulated based on the CIF data." ] }, { "cell_type": "markdown", - "id": "46addc5f", + "id": "6cdbb630", "metadata": {}, "source": [ - "#### Exercise 5.8: Identify the impurity phase\n", + "#### Exercise 5.9: Identify the impurity phase\n", "\n", "Identify the impurity phase.\n", "\n", @@ -1396,7 +1617,7 @@ "tutorial.\n", "\n", "**Solution**:\n", - "The unexplained peaks are likely due to the presence of small amount of\n", + "The unexplained peaks are likely due to the presence of a small amount of\n", "Si in the LBCO sample. In real experiments, it might happen, e.g., because the\n", "sample holder was not cleaned properly after the Si experiment.\n", "\n", @@ -1406,20 +1627,20 @@ { "cell_type": "code", "execution_count": null, - "id": "e9639a9b", + "id": "052ef93f", "metadata": {}, "outputs": [], "source": [ - "project_1.plot_meas_vs_calc(expt_name='sim_si', x_min=1, x_max=1.7, d_spacing=True)\n", - "project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1, x_max=1.7, d_spacing=True)" + "project_1.plot_meas_vs_calc(expt_name=\"sim_si\", x_min=1, x_max=1.7, d_spacing=True)\n", + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\", x_min=1, x_max=1.7, d_spacing=True)" ] }, { "cell_type": "markdown", - "id": "9729a3e3", + "id": "c1e12324", "metadata": {}, "source": [ - "#### Exercise 5.9: Create a Second Sample Model – Si as Impurity\n", + "#### Exercise 5.10: Create a Second Sample Model – Si as Impurity\n", "\n", "Create a second sample model for the Si phase, which is the impurity phase\n", "identified in the previous step. Link this sample model to the LBCO\n", @@ -1434,7 +1655,7 @@ }, { "cell_type": "markdown", - "id": "32078229", + "id": "9f1a3666", "metadata": {}, "source": [ "**Set Space Group**" @@ -1443,27 +1664,27 @@ { "cell_type": "code", "execution_count": null, - "id": "12e2f067", + "id": "b971f115", "metadata": {}, "outputs": [], "source": [ - "project_2.sample_models.add(name='si')" + "project_2.sample_models.add(name=\"si\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "9d5dfa50", + "id": "b8442af8", "metadata": {}, "outputs": [], "source": [ - "project_2.sample_models['si'].space_group.name_h_m = 'F d -3 m'\n", - "project_2.sample_models['si'].space_group.it_coordinate_system_code = '2'" + "project_2.sample_models[\"si\"].space_group.name_h_m = \"F d -3 m\"\n", + "project_2.sample_models[\"si\"].space_group.it_coordinate_system_code = \"2\"" ] }, { "cell_type": "markdown", - "id": "64e97830", + "id": "16d50271", "metadata": {}, "source": [ "**Set Lattice Parameters**" @@ -1472,16 +1693,16 @@ { "cell_type": "code", "execution_count": null, - "id": "2e147ff4", + "id": "a47cb8e6", "metadata": {}, "outputs": [], "source": [ - "project_2.sample_models['si'].cell.length_a = 5.43" + "project_2.sample_models[\"si\"].cell.length_a = 5.43" ] }, { "cell_type": "markdown", - "id": "4054a7d1", + "id": "41229e56", "metadata": {}, "source": [ "**Set Atom Sites**" @@ -1490,22 +1711,24 @@ { "cell_type": "code", "execution_count": null, - "id": "e6654513", + "id": "8b4ae4bf", "metadata": {}, "outputs": [], "source": [ - "project_2.sample_models['si'].atom_sites.add(label='Si',\n", - " type_symbol='Si',\n", - " fract_x=0,\n", - " fract_y=0,\n", - " fract_z=0,\n", - " wyckoff_letter='a',\n", - " b_iso=0.95)" + "project_2.sample_models[\"si\"].atom_sites.add(\n", + " label=\"Si\",\n", + " type_symbol=\"Si\",\n", + " fract_x=0,\n", + " fract_y=0,\n", + " fract_z=0,\n", + " wyckoff_letter=\"a\",\n", + " b_iso=0.89,\n", + ")" ] }, { "cell_type": "markdown", - "id": "1bab0afa", + "id": "74b5370d", "metadata": {}, "source": [ "**🔗 Assign Sample Model to Experiment**" @@ -1514,19 +1737,19 @@ { "cell_type": "code", "execution_count": null, - "id": "96d4c73f", + "id": "66970e6f", "metadata": {}, "outputs": [], "source": [ - "project_2.experiments['sim_lbco'].linked_phases.add(id='si', scale=1.0)" + "project_2.experiments[\"sim_lbco\"].linked_phases.add(id=\"si\", scale=1.0)" ] }, { "cell_type": "markdown", - "id": "4aa8f8f7", + "id": "365840c4", "metadata": {}, "source": [ - "#### Exercise 5.10: Refine the Scale of the Si Phase\n", + "#### Exercise 5.11: Refine the Scale of the Si Phase\n", "\n", "Visualize the measured diffraction pattern and the calculated diffraction\n", "pattern. Check if the Si phase is contributing to the calculated diffraction\n", @@ -1549,16 +1772,16 @@ { "cell_type": "code", "execution_count": null, - "id": "8e6bc18e", + "id": "bada2fb4", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\")" ] }, { "cell_type": "markdown", - "id": "2a01d9fd", + "id": "ec0e0d50", "metadata": {}, "source": [ "As you can see, the calculated pattern is now the sum of both phases,\n", @@ -1571,16 +1794,16 @@ { "cell_type": "code", "execution_count": null, - "id": "0a683b74", + "id": "969cbfb1", "metadata": {}, "outputs": [], "source": [ - "project_2.experiments['sim_lbco'].linked_phases['si'].scale.free = True" + "project_2.experiments[\"sim_lbco\"].linked_phases[\"si\"].scale.free = True" ] }, { "cell_type": "markdown", - "id": "c7596964", + "id": "2db13c55", "metadata": {}, "source": [ "**Run Fitting**\n", @@ -1591,7 +1814,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a7216729", + "id": "ca1a63c5", "metadata": {}, "outputs": [], "source": [ @@ -1600,7 +1823,7 @@ }, { "cell_type": "markdown", - "id": "b62290c6", + "id": "1b85eafb", "metadata": {}, "source": [ "**Visualize Fit Results**\n", @@ -1613,62 +1836,45 @@ { "cell_type": "code", "execution_count": null, - "id": "38004527", + "id": "668f5c29", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas_vs_calc(expt_name='sim_lbco')" + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "6fc93114", + "id": "6f5f7afc", "metadata": {}, "outputs": [], "source": [ - "project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=88000, x_max=101000)" + "project_2.plot_meas_vs_calc(expt_name=\"sim_lbco\", x_min=88000, x_max=101000)" ] }, { "cell_type": "markdown", - "id": "d9315e63", + "id": "a418ffa1", "metadata": {}, "source": [ "All previously unexplained peaks are now accounted for in the pattern, and the fit is improved.\n", "Some discrepancies in the peak intensities remain, but\n", "further improvements would require more advanced data reduction and analysis,\n", - "which are beyond the scope of this tutorial." - ] - }, - { - "cell_type": "markdown", - "id": "5df41737", - "metadata": {}, - "source": [ - "## 📑 Summary\n", - "\n", - "In this tutorial, you refined two simulated diffraction patterns:\n", - "- **Si** as a simple reference system, and\n", - "- **LBCO** as a more complex, realistic case with an initially unknown impurity.\n", + "which are beyond the scope of this tutorial.\n", "\n", - "Along the way, you learned how to work with the EasyDiffraction library to:\n", - "- Define a project, experiment, and sample model.\n", - "- Set up instrument and peak profile parameters.\n", - "- Visualize measured and calculated patterns.\n", - "- Identify and interpret misfits in the diffraction data.\n", - "- Add and refine multiple phases to improve the model.\n", + "#### Final Remarks\n", "\n", - "Key Takeaways:\n", - "- A good refinement starts with a reasonable structural model and\n", - " well-defined instrument parameters.\n", - "- Visual inspection is a critical part of model validation. Residual peaks\n", - " often reveal missing physics or contamination." + "In this part of the tutorial, we have demonstrated how to use EasyDiffraction\n", + "to refine lattice parameters for a more complex crystal structure, La₀.₅Ba₀.₅CoO₃ (LBCO).\n", + "In real experiments, additional parameters, such as atomic positions, occupancies, and atomic displacement factors, can also be refined to further improve the fit.\n", + "However, we will stop here, as the purpose of this part of the tutorial is to demonstrate the practical use of\n", + "EasyDiffraction for fitting powder diffraction data." ] }, { "cell_type": "markdown", - "id": "51f12db7", + "id": "07275b55", "metadata": {}, "source": [ "## 🎁 Bonus\n", diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py index f910d7aa..9b8146ac 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py @@ -1,5 +1,5 @@ # %% [markdown] -# # Data Analysis: Powder Diffraction +# # Fitting Powder Diffraction data # # This tutorial guides you through the Rietveld refinement of crystal # structures using simulated powder diffraction data. It consists of two parts: @@ -22,7 +22,6 @@ # the entire library. # %% -# TODO: Remove this cell in the final version of the tutorial. # Needed for the Google Colab environment. # Install the easydiffraction library if it is not already installed. import builtins @@ -59,18 +58,18 @@ # other things. # %% -project_1 = ed.Project(name='reference') +project_1 = ed.Project(name="reference") # %% [markdown] - +# # You can set the title and description of the project to provide context # and information about the analysis being performed. This is useful for # documentation purposes and helps others (or yourself in the future) # understand the purpose of the project at a glance. # %% -project_1.info.title = 'Reference Silicon Fit' -project_1.info.description = 'Fitting simulated powder diffraction pattern of Si.' +project_1.info.title = "Reference Silicon Fit" +project_1.info.description = "Fitting simulated powder diffraction pattern of Si." # %% [markdown] # ### 🔬 Create an Experiment @@ -82,21 +81,26 @@ # # In this case, the experiment is defined as a powder diffraction measurement # using time-of-flight neutrons. The measured data is loaded from a file -# containing the reduced diffraction pattern of Si from the previous tutorial. +# containing the reduced diffraction pattern of Si from the data reduction tutorial. # %% -# TODO: Remove this cell in the final version of the tutorial. +# To load the measured data from the EasyDiffraction repository, as # Google Colab does not have the data files needed for this tutorial. -ed.download_from_repository('powder_reduced_Si_2large_bank.xye', +ed.download_from_repository('reduced_Si.xye', branch='d-spacing', destination='data') # %% -project_1.experiments.add(name='sim_si', - sample_form='powder', - beam_mode='time-of-flight', - radiation_probe='neutron', - data_path='data/powder_reduced_Si_2large_bank.xye') +si_xye_path = "data/reduced_Si.xye" + +# %% +project_1.experiments.add( + name="sim_si", + sample_form="powder", + beam_mode="time-of-flight", + radiation_probe="neutron", + data_path=si_xye_path, +) # %% [markdown] # #### Inspect Measured Data @@ -116,21 +120,23 @@ # interactive visualizations. # %% -project_1.plotter.engine = 'plotly' +project_1.plotter.engine = "plotly" # %% -project_1.plot_meas(expt_name='sim_si') +project_1.plot_meas(expt_name="sim_si") # %% [markdown] # If you zoom in on the highest TOF peak (around 120,000 μs), you will notice -# that it has a broad and unusual shape. This is a result of the simplified -# data reduction process. Obtaining a more accurate diffraction pattern would -# require a more advanced data reduction, which is beyond the scope of this -# tutorial. Therefore, we will simply exclude the high TOF region from the -# analysis by adding an excluded region to the experiment. +# that it has a broad and unusual shape. This distortion, along with some more +# effects on the low TOF peaks, is a result of the simplified data reduction +# process. Obtaining a more accurate diffraction pattern would require a more +# advanced data reduction, which is beyond the scope of this tutorial. +# Therefore, we will simply exclude both the low and high TOF regions from the +# analysis by adding an excluded regions to the experiment. # %% -project_1.experiments['sim_si'].excluded_regions.add(minimum=108000, maximum=200000) +project_1.experiments["sim_si"].excluded_regions.add(minimum=0, maximum=55000) +project_1.experiments["sim_si"].excluded_regions.add(minimum=105500, maximum=200000) # %% [markdown] # To visualize the effect of excluding the high TOF region, we can plot @@ -138,23 +144,57 @@ # and is not used in the fitting process. # %% -project_1.plot_meas(expt_name='sim_si') +project_1.plot_meas(expt_name="sim_si") # %% [markdown] # #### Set Instrument Parameters # -# After experiment is created and measured data are loaded, we would need +# After the experiment is created and measured data are loaded, we need # to set the instrument parameters. # # In this type of experiment, the instrument parameters define how the # measured data is converted between d-spacing and time-of-flight (TOF) # during the data reduction process as well as the angular position of the -# detector. So, we put values based on those from the reduction. +# detector. So, we put values based on those from the reduction. These +# values can be found in the header of the corresponding .XYE file. Their +# names are `two_theta` and `DIFC`, which stand for the two-theta angle +# and the linear conversion factor from d-spacing to TOF, respectively. +# +# You can set them manually, but it is more convenient to use the +# `get_value_from_xye_header` function from the EasyDiffraction library. + +# %% +project_1.experiments["sim_si"].instrument.setup_twotheta_bank = ed.get_value_from_xye_header( + si_xye_path, "two_theta" +) +project_1.experiments["sim_si"].instrument.calib_d_to_tof_linear = ed.get_value_from_xye_header( + si_xye_path, "DIFC" +) + +# %% [markdown] +# Every parameters is an object, which has different attributes, such as +# `value`, `free`, etc. To display the parameter of interest, you can simply +# print the parameter object. For example, to display the linear conversion +# factor from d-spacing to TOF, which is the `calib_d_to_tof_linear` parameter, +# you can use the following code: + +# %% +print(project_1.experiments["sim_si"].instrument.calib_d_to_tof_linear) + +# %% [markdown] +# The `value` attribute represents the current value of the parameter as a float. +# You can access it directly by using the `value` attribute of the parameter. +# This is useful when you want to use the parameter value in calculations or +# when you want to assign it to another parameter. For example, to get only the +# value of the same parameter as floating point number, but not the whole object, +# you can do the following: # %% -project_1.experiments['sim_si'].instrument.setup_twotheta_bank = 101.46 -project_1.experiments['sim_si'].instrument.calib_d_to_tof_linear = 61710.64 -project_1.experiments['sim_si'].instrument.calib_d_to_tof_quad = -0.00001 +print(project_1.experiments["sim_si"].instrument.calib_d_to_tof_linear.value) + +# %% [markdown] +# Note that to set the value of the parameter, you can simply assign a new value +# to the parameter object without using the `value` attribute, as we did above. # %% [markdown] # #### Set Peak Profile Parameters @@ -168,20 +208,21 @@ # # The values are typically determined experimentally on the same instrument and # under the same configuration as the data being analyzed based on measurements -# of a standard sample. In some cases, these parameters are refined during the -# fitting process to improve the fit between the measured and calculated -# diffraction, but in this case, we will use the values from another simulation. +# of a standard sample. We consider this Si sample as a standard reference. +# Therefore, we will set the initial values of the peak profile parameters based +# on the values obtained from another simulation and refine them during the +# fitting process. The refined parameters will be used as a starting point for the +# more complex fit in the next part of the tutorial. # %% -project_1.experiments['sim_si'].peak_profile_type = 'pseudo-voigt * ikeda-carpenter' -project_1.experiments['sim_si'].peak.broad_gauss_sigma_0 = 47347.42 -project_1.experiments['sim_si'].peak.broad_gauss_sigma_1 = -55360.02 -project_1.experiments['sim_si'].peak.broad_gauss_sigma_2 = 23882.42 -project_1.experiments['sim_si'].peak.broad_mix_beta_0 = 0.0055 -project_1.experiments['sim_si'].peak.broad_mix_beta_1 = 0.0041 -project_1.experiments['sim_si'].peak.asym_alpha_0 = 0 -project_1.experiments['sim_si'].peak.asym_alpha_1 = 0.0096 - +project_1.experiments["sim_si"].peak_profile_type = "pseudo-voigt * ikeda-carpenter" +project_1.experiments["sim_si"].peak.broad_gauss_sigma_0 = 69498 +project_1.experiments["sim_si"].peak.broad_gauss_sigma_1 = -55578 +project_1.experiments["sim_si"].peak.broad_gauss_sigma_2 = 14560 +project_1.experiments["sim_si"].peak.broad_mix_beta_0 = 0.0019 +project_1.experiments["sim_si"].peak.broad_mix_beta_1 = 0.0137 +project_1.experiments["sim_si"].peak.asym_alpha_0 = -0.0055 +project_1.experiments["sim_si"].peak.asym_alpha_1 = 0.0147 # %% [markdown] # #### Set Background @@ -212,14 +253,14 @@ # process. # %% -project_1.experiments['sim_si'].background_type = 'line-segment' -project_1.experiments['sim_si'].background.add(x=50000, y=0.01) -project_1.experiments['sim_si'].background.add(x=60000, y=0.01) -project_1.experiments['sim_si'].background.add(x=70000, y=0.01) -project_1.experiments['sim_si'].background.add(x=80000, y=0.01) -project_1.experiments['sim_si'].background.add(x=90000, y=0.01) -project_1.experiments['sim_si'].background.add(x=100000, y=0.01) -project_1.experiments['sim_si'].background.add(x=110000, y=0.01) +project_1.experiments["sim_si"].background_type = "line-segment" +project_1.experiments["sim_si"].background.add(x=50000, y=0.01) +project_1.experiments["sim_si"].background.add(x=60000, y=0.01) +project_1.experiments["sim_si"].background.add(x=70000, y=0.01) +project_1.experiments["sim_si"].background.add(x=80000, y=0.01) +project_1.experiments["sim_si"].background.add(x=90000, y=0.01) +project_1.experiments["sim_si"].background.add(x=100000, y=0.01) +project_1.experiments["sim_si"].background.add(x=110000, y=0.01) # %% [markdown] # ### 🧩 Create a Sample Model – Si @@ -282,7 +323,7 @@ # _atom_site.occupancy # _atom_site.ADP_type # _atom_site.B_iso_or_equiv -# Si Si 0 0 0 a 1.0 Biso 0.95 +# Si Si 0 0 0 a 1.0 Biso 0.89 # ``` # %% [markdown] @@ -294,32 +335,34 @@ # #### Add Sample Model # %% -project_1.sample_models.add(name='si') +project_1.sample_models.add(name="si") # %% [markdown] # #### Set Space Group # %% -project_1.sample_models['si'].space_group.name_h_m = 'F d -3 m' -project_1.sample_models['si'].space_group.it_coordinate_system_code = '2' +project_1.sample_models["si"].space_group.name_h_m = "F d -3 m" +project_1.sample_models["si"].space_group.it_coordinate_system_code = "2" # %% [markdown] # #### Set Lattice Parameters # %% -project_1.sample_models['si'].cell.length_a = 5.43 +project_1.sample_models["si"].cell.length_a = 5.43 # %% [markdown] # #### Set Atom Sites # %% -project_1.sample_models['si'].atom_sites.add(label='Si', - type_symbol='Si', - fract_x=0, - fract_y=0, - fract_z=0, - wyckoff_letter='a', - b_iso=0.95) +project_1.sample_models["si"].atom_sites.add( + label="Si", + type_symbol="Si", + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter="a", + b_iso=0.89, +) # %% [markdown] # ### 🔗 Assign Sample Model to Experiment @@ -329,7 +372,7 @@ # pattern based on the crystal structure defined in the sample model. # %% -project_1.experiments['sim_si'].linked_phases.add(id='si', scale=1.0) +project_1.experiments["sim_si"].linked_phases.add(id="si", scale=1.0) # %% [markdown] # ### 🚀 Analyze and Fit the Data @@ -349,16 +392,28 @@ # To perform the fit, we need to specify the refinement parameters. These # are the parameters that will be adjusted during the fitting process to # minimize the difference between the measured and calculated diffraction -# patterns. In this case, we will refine only the scale factor of the Si phase -# in the experiment, as well as the intensities of the background points. -# This is done by setting -# the `free` attribute of the corresponding parameters to `True`. +# patterns. This is done by setting the `free` attribute of the +# corresponding parameters to `True`. +# +# We will refine the scale factor of the Si phase, the intensities of the +# background points as well as the peak profile parameters. The structure +# parameters of the Si phase will not be refined, as this sample is +# considered a reference sample with known parameters. # %% -project_1.experiments['sim_si'].linked_phases['si'].scale.free = True -for line_segment in project_1.experiments['sim_si'].background: +project_1.experiments["sim_si"].linked_phases["si"].scale.free = True + +for line_segment in project_1.experiments["sim_si"].background: line_segment.y.free = True +project_1.experiments["sim_si"].peak.broad_gauss_sigma_0.free = True +project_1.experiments["sim_si"].peak.broad_gauss_sigma_1.free = True +project_1.experiments["sim_si"].peak.broad_gauss_sigma_2.free = True +project_1.experiments["sim_si"].peak.broad_mix_beta_0.free = True +project_1.experiments["sim_si"].peak.broad_mix_beta_1.free = True +project_1.experiments["sim_si"].peak.asym_alpha_0.free = True +project_1.experiments["sim_si"].peak.asym_alpha_1.free = True + # %% [markdown] # #### Show Free Parameters # @@ -379,7 +434,7 @@ # allows this comparison. # %% -project_1.plot_meas_vs_calc(expt_name='sim_si') +project_1.plot_meas_vs_calc(expt_name="sim_si") # %% [markdown] # #### Run Fitting @@ -412,7 +467,7 @@ # is now based on the refined parameters. # %% -project_1.plot_meas_vs_calc(expt_name='sim_si') +project_1.plot_meas_vs_calc(expt_name="sim_si") # %% [markdown] # #### TOF vs d-spacing @@ -428,7 +483,7 @@ # by setting the `d_spacing` parameter to `True`. # %% -project_1.plot_meas_vs_calc(expt_name='sim_si', d_spacing=True) +project_1.plot_meas_vs_calc(expt_name="sim_si", d_spacing=True) # %% [markdown] # As you can see, the calculated diffraction pattern now matches the measured @@ -460,9 +515,11 @@ # **Solution:** # %% -project_2 = ed.Project(name='main') -project_2.info.title = 'La0.5Ba0.5CoO3 Fit' -project_2.info.description = 'Fitting simulated powder diffraction pattern of La0.5Ba0.5CoO3.' +project_2 = ed.Project(name="main") +project_2.info.title = "La0.5Ba0.5CoO3 Fit" +project_2.info.description = ( + "Fitting simulated powder diffraction pattern of La0.5Ba0.5CoO3." +) # %% [markdown] # ### 🔬 Exercise 2: Define an Experiment @@ -478,18 +535,23 @@ # **Solution:** # %% -# TODO: Remove this cell in the final version of the tutorial. +# To load the measured data from the EasyDiffraction repository, as # Google Colab does not have the data files needed for this tutorial. -ed.download_from_repository('powder_reduced_lbco_0_05si_2large_bank.xye', +ed.download_from_repository('reduced_LBCO.xye', branch='d-spacing', destination='data') # %% -project_2.experiments.add(name='sim_lbco', - sample_form='powder', - beam_mode='time-of-flight', - radiation_probe='neutron', - data_path='data/powder_reduced_lbco_0_05si_2large_bank.xye') +lbco_xye_path = "data/reduced_LBCO.xye" + +# %% +project_2.experiments.add( + name="sim_lbco", + sample_form="powder", + beam_mode="time-of-flight", + radiation_probe="neutron", + data_path=lbco_xye_path, +) # %% [markdown] # #### Exercise 2.1: Inspect Measured Data @@ -500,19 +562,21 @@ # # **Hint:** You can use the `plot_meas` method of the project to visualize the # measured diffraction pattern. You can also use the `excluded_regions` attribute -# of the experiment to exclude specific regions from the analysis. +# of the experiment to exclude specific regions from the analysis as we did +# in the previous part of the tutorial. # # **Solution:** # %% -project_2.plotter.engine = 'plotly' -project_2.plot_meas(expt_name='sim_lbco') +project_2.plotter.engine = "plotly" +project_2.plot_meas(expt_name="sim_lbco") # %% -project_2.experiments['sim_lbco'].excluded_regions.add(minimum=108000, maximum=200000) +project_2.experiments["sim_lbco"].excluded_regions.add(minimum=0, maximum=55000) +project_2.experiments["sim_lbco"].excluded_regions.add(minimum=105500, maximum=200000) # %% -project_2.plot_meas(expt_name='sim_lbco') +project_2.plot_meas(expt_name="sim_lbco") # %% [markdown] # #### Exercise 2.2: Set Instrument Parameters @@ -525,28 +589,34 @@ # **Solution:** # %% -project_2.experiments['sim_lbco'].instrument.setup_twotheta_bank = 94.91 -project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_linear = 58752.56 -project_2.experiments['sim_lbco'].instrument.calib_d_to_tof_quad = -0.00001 +project_2.experiments["sim_lbco"].instrument.setup_twotheta_bank = ed.get_value_from_xye_header( + lbco_xye_path, "two_theta" +) +project_2.experiments["sim_lbco"].instrument.calib_d_to_tof_linear = ed.get_value_from_xye_header( + lbco_xye_path, "DIFC" +) # %% [markdown] # #### Exercise 2.3: Set Peak Profile Parameters # # Set the peak profile parameters for the LBCO experiment. # -# **Hint:** Use the values from the previous part of the tutorial. +# **Hint:** Use the values from the previous part of the tutorial. You can +# either manually copy the values from the Si fit or use the `value` attribute of +# the parameters from the Si experiment to set the initial values for the LBCO +# experiment. This will help us to have a good starting point for the fit. # # **Solution:** # %% -project_2.peak_profile_type = 'pseudo-voigt * ikeda-carpenter' -project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_0 = 47347.42 -project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_1 = -55360.02 -project_2.experiments['sim_lbco'].peak.broad_gauss_sigma_2 = 23882.42 -project_2.experiments['sim_lbco'].peak.broad_mix_beta_0 = 0.0055 -project_2.experiments['sim_lbco'].peak.broad_mix_beta_1 = 0.0041 -project_2.experiments['sim_lbco'].peak.asym_alpha_0 = 0 -project_2.experiments['sim_lbco'].peak.asym_alpha_1 = 0.0096 +project_2.peak_profile_type = "pseudo-voigt * ikeda-carpenter" +project_2.experiments["sim_lbco"].peak.broad_gauss_sigma_0 = project_1.experiments["sim_si"].peak.broad_gauss_sigma_0.value +project_2.experiments["sim_lbco"].peak.broad_gauss_sigma_1 = project_1.experiments["sim_si"].peak.broad_gauss_sigma_1.value +project_2.experiments["sim_lbco"].peak.broad_gauss_sigma_2 = project_1.experiments["sim_si"].peak.broad_gauss_sigma_2.value +project_2.experiments["sim_lbco"].peak.broad_mix_beta_0 = project_1.experiments["sim_si"].peak.broad_mix_beta_0.value +project_2.experiments["sim_lbco"].peak.broad_mix_beta_1 = project_1.experiments["sim_si"].peak.broad_mix_beta_1.value +project_2.experiments["sim_lbco"].peak.asym_alpha_0 = project_1.experiments["sim_si"].peak.asym_alpha_0.value +project_2.experiments["sim_lbco"].peak.asym_alpha_1 = project_1.experiments["sim_si"].peak.asym_alpha_1.value # %% [markdown] # #### Exercise 2.4: Set Background @@ -562,21 +632,25 @@ # **Solution:** # %% -project_2.experiments['sim_lbco'].background_type = 'line-segment' -project_2.experiments['sim_lbco'].background.add(x=50000, y=0.2) -project_2.experiments['sim_lbco'].background.add(x=60000, y=0.2) -project_2.experiments['sim_lbco'].background.add(x=70000, y=0.2) -project_2.experiments['sim_lbco'].background.add(x=80000, y=0.2) -project_2.experiments['sim_lbco'].background.add(x=90000, y=0.2) -project_2.experiments['sim_lbco'].background.add(x=100000, y=0.2) -project_2.experiments['sim_lbco'].background.add(x=110000, y=0.2) +project_2.experiments["sim_lbco"].background_type = "line-segment" +project_2.experiments["sim_lbco"].background.add(x=50000, y=0.2) +project_2.experiments["sim_lbco"].background.add(x=60000, y=0.2) +project_2.experiments["sim_lbco"].background.add(x=70000, y=0.2) +project_2.experiments["sim_lbco"].background.add(x=80000, y=0.2) +project_2.experiments["sim_lbco"].background.add(x=90000, y=0.2) +project_2.experiments["sim_lbco"].background.add(x=100000, y=0.2) +project_2.experiments["sim_lbco"].background.add(x=110000, y=0.2) # %% [markdown] # ### 🧩 Exercise 3: Define a Sample Model – LBCO # # The LBSO structure is not as simple as the Si model, as it contains multiple # atoms in the unit cell. It is not in COD, so we give you the structural -# parameters in CIF format to create the sample model right here: +# parameters in CIF format to create the sample model. +# +# Note that those parameters are not necessarily the most accurate ones, but they +# are a good starting point for the fit. The aim of the study is to refine the +# LBCO lattice parameters. # %% [markdown] # ``` @@ -602,10 +676,10 @@ # _atom_site.occupancy # _atom_site.ADP_type # _atom_site.B_iso_or_equiv -# La La 0.0 0.0 0.0 a 0.5 Biso 0.10 -# Ba Ba 0.0 0.0 0.0 a 0.5 Biso 0.10 -# Co Co 0.5 0.5 0.5 b 1.0 Biso 0.36 -# O O 0.0 0.5 0.5 c 1.0 Biso 2.14 +# La La 0.0 0.0 0.0 a 0.5 Biso 0.95 +# Ba Ba 0.0 0.0 0.0 a 0.5 Biso 0.95 +# Co Co 0.5 0.5 0.5 b 1.0 Biso 0.80 +# O O 0.0 0.5 0.5 c 1.0 Biso 1.66 # ``` # %% [markdown] @@ -619,7 +693,7 @@ # **Solution:** # %% -project_2.sample_models.add(name='lbco') +project_2.sample_models.add(name="lbco") # %% [markdown] # #### Exercise 3.2: Set Space Group @@ -631,8 +705,8 @@ # **Solution:** # %% -project_2.sample_models['lbco'].space_group.name_h_m = 'P m -3 m' -project_2.sample_models['lbco'].space_group.it_coordinate_system_code = '1' +project_2.sample_models["lbco"].space_group.name_h_m = "P m -3 m" +project_2.sample_models["lbco"].space_group.it_coordinate_system_code = "1" # %% [markdown] # #### Exercise 3.3: Set Lattice Parameters @@ -644,7 +718,7 @@ # **Solution:** # %% -project_2.sample_models['lbco'].cell.length_a = 3.88 +project_2.sample_models["lbco"].cell.length_a = 3.88 # %% [markdown] # #### Exercise 3.4: Set Atom Sites @@ -658,36 +732,44 @@ # an extra attribute `occupancy` needs to be set for those atoms. # %% -project_2.sample_models['lbco'].atom_sites.add(label='La', - type_symbol='La', - fract_x=0, - fract_y=0, - fract_z=0, - wyckoff_letter='a', - b_iso=0.1, - occupancy=0.5) -project_2.sample_models['lbco'].atom_sites.add(label='Ba', - type_symbol='Ba', - fract_x=0, - fract_y=0, - fract_z=0, - wyckoff_letter='a', - b_iso=0.1, - occupancy=0.5) -project_2.sample_models['lbco'].atom_sites.add(label='Co', - type_symbol='Co', - fract_x=0.5, - fract_y=0.5, - fract_z=0.5, - wyckoff_letter='b', - b_iso=0.36) -project_2.sample_models['lbco'].atom_sites.add(label='O', - type_symbol='O', - fract_x=0, - fract_y=0.5, - fract_z=0.5, - wyckoff_letter='c', - b_iso=2.14) +project_2.sample_models["lbco"].atom_sites.add( + label="La", + type_symbol="La", + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter="a", + b_iso=0.95, + occupancy=0.5, +) +project_2.sample_models["lbco"].atom_sites.add( + label="Ba", + type_symbol="Ba", + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter="a", + b_iso=0.95, + occupancy=0.5, +) +project_2.sample_models["lbco"].atom_sites.add( + label="Co", + type_symbol="Co", + fract_x=0.5, + fract_y=0.5, + fract_z=0.5, + wyckoff_letter="b", + b_iso=0.80, +) +project_2.sample_models["lbco"].atom_sites.add( + label="O", + type_symbol="O", + fract_x=0, + fract_y=0.5, + fract_z=0.5, + wyckoff_letter="c", + b_iso=1.66, +) # %% [markdown] # ### 🔗 Exercise 4: Assign Sample Model to Experiment @@ -699,24 +781,26 @@ # **Solution:** # %% -project_2.experiments['sim_lbco'].linked_phases.add(id='lbco', scale=1.0) +project_2.experiments["sim_lbco"].linked_phases.add(id="lbco", scale=1.0) # %% [markdown] # ### 🚀 Exercise 5: Analyze and Fit the Data # # #### Exercise 5.1: Set Fit Parameters # -# Select the parameters to be refined during the fitting process. +# Select the initial set of parameters to be refined during the fitting +# process. # -# **Hint:** You can start with the same parameters as in the Si fit, but -# this time you will refine the scale factor of the LBCO phase and the -# background points for the second simulation. +# **Hint:** You can start with the scale factor and the background +# points, as in the Si fit, but this time you will refine the LBCO +# phase related parameters. # # **Solution:** # %% -project_2.experiments['sim_lbco'].linked_phases['lbco'].scale.free = True -for line_segment in project_2.experiments['sim_lbco'].background: +project_2.experiments["sim_lbco"].linked_phases["lbco"].scale.free = True + +for line_segment in project_2.experiments["sim_lbco"].background: line_segment.y.free = True # %% [markdown] @@ -733,7 +817,7 @@ # **Solution:** # %% -project_2.plot_meas_vs_calc(expt_name='sim_lbco') +project_2.plot_meas_vs_calc(expt_name="sim_lbco") # %% project_2.analysis.fit() @@ -754,34 +838,37 @@ # 4. The background points are not correct. # # **Solution**: -# 1. ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction process and this was verified in the Si fit. +# 1. ❌ The conversion parameters from TOF to d-spacing were set based on the data reduction step. While they are +# specific to each dataset and thus differ from those used for the Si data, the full reduction workflow has already been +# validated with the Si fit. Therefore, they are not the cause of the misfit in this case. # 2. ✅ The lattice parameters of the LBCO phase were set based on the CIF data, which is a good starting point, but they are not necessarily as accurate as needed for the fit. The lattice parameters may need to be refined. # 3. ❌ The peak profile parameters do not change the position of the peaks, but rather their shape. # 4. ❌ The background points affect the background level, but not the peak positions. # %% -project_2.plot_meas_vs_calc(expt_name='sim_lbco') +project_2.plot_meas_vs_calc(expt_name="sim_lbco") # %% [markdown] # #### Exercise 5.4: Refine the LBCO Lattice Parameter # # To improve the fit, refine the lattice parameter of the LBCO phase. # -# **Hint**: To accomplish this, we will set the `free` attribute of the `length_a` parameter -# of the LBCO cell to `True`. This will allow the fitting process to adjust -# the lattice parameter in addition to the scale factor of the LBCO phase -# and the background points. Then, you can run the fitting process again. +# **Hint**: To achieve this, we will set the `free` attribute of the `length_a` parameter +# of the LBCO cell to `True`. # # **Solution**: # %% -project_2.sample_models['lbco'].cell.length_a.free = True +project_2.sample_models["lbco"].cell.length_a.free = True # %% project_2.analysis.fit() # %% -project_2.plot_meas_vs_calc(expt_name='sim_lbco') +project_2.plot_meas_vs_calc(expt_name="sim_lbco") + +# %% [markdown] +# One of the main goals of this study was to refine the lattice parameter of the LBCO phase. As shown in the updated fit results, the overall fit has improved significantly, even though the change in cell length is less than 1% of the initial value. This demonstrates how even a small adjustment to the lattice parameter can have a substantial impact on the quality of the fit. # %% [markdown] # #### Exercise 5.5: Visualize the Fit Results in d-spacing @@ -794,13 +881,59 @@ # **Solution**: # %% -project_2.plot_meas_vs_calc(expt_name='sim_lbco', d_spacing=True) +project_2.plot_meas_vs_calc(expt_name="sim_lbco", d_spacing=True) + +# %% [markdown] +# #### Exercise 5.6: Refine the Peak Profile Parameters +# +# As you can see, the fit is now relatively good and the peak positions are much +# closer to the measured data. +# +# The peak profile parameters were not refined, and their starting values were +# set based on the previous fit of the Si standard sample. Although these starting +# values are reasonable and provide a good starting point for the fit, they are +# not necessarily optimal for the LBCO phase. This can be seen while inspecting +# the individual peaks in the diffraction pattern. For example, the calculated curve +# does not perfectly describe the peak at about 1.38 Å, as can be seen below: + +# %% +project_2.plot_meas_vs_calc(expt_name="sim_lbco", d_spacing=True, x_min=1.35, x_max=1.40) # %% [markdown] -# #### Exercise 5.6: Find Undefined Features +# The peak profile parameters are determined based on both the instrument +# and the sample characteristics, so they can vary when analyzing different +# samples on the same instrument. Therefore, it is better to refine them as well. # -# After refining the lattice parameter, the fit is significantly improved, but -# inspect the diffraction pattern again. Are you noticing anything undefined? +# Select the peak profile parameters to be refined during the fitting process. +# +# **Hint**: You can set the `free` attribute of the peak profile parameters to `True` +# to allow the fitting process to adjust them. You can use the same approach as in +# the previous part of the tutorial, but this time you will refine the peak profile +# parameters of the LBCO phase. +# +# **Solution**: + +# %% +project_2.experiments["sim_lbco"].peak.broad_gauss_sigma_0.free = True +project_2.experiments["sim_lbco"].peak.broad_gauss_sigma_1.free = True +project_2.experiments["sim_lbco"].peak.broad_gauss_sigma_2.free = True +project_2.experiments["sim_lbco"].peak.broad_mix_beta_0.free = True +project_2.experiments["sim_lbco"].peak.broad_mix_beta_1.free = True +project_2.experiments["sim_lbco"].peak.asym_alpha_0.free = True +project_2.experiments["sim_lbco"].peak.asym_alpha_1.free = True + +# %% +project_2.analysis.fit() + +# %% +project_2.plot_meas_vs_calc(expt_name="sim_lbco", d_spacing=True, x_min=1.35, x_max=1.40) + +# %% [markdown] +# #### Exercise 5.7: Find Undefined Features +# +# After refining the lattice parameter and the peak profile parameters, the fit is +# significantly improved, but inspect the diffraction pattern again. Are you noticing +# anything undefined? # # **Hint**: While the fit is now significantly better, there are still some unexplained peaks # in the diffraction pattern. These peaks are not accounted for by the LBCO phase. @@ -810,15 +943,16 @@ # **Solution**: # %% -project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1.53, x_max=1.7, d_spacing=True) +project_2.plot_meas_vs_calc(expt_name="sim_lbco", x_min=1.53, x_max=1.7, d_spacing=True) # %% [markdown] -# #### Exercise 5.7: Identify the Cause of the Unexplained Peaks +# #### Exercise 5.8: Identify the Cause of the Unexplained Peaks # # **Hint**: Consider the following options: # 1. The LBCO phase is not correctly modeled. # 2. The LBCO phase is not the only phase present in the sample. # 3. The data reduction process introduced artifacts. +# 4. The studied sample is not LBCO, but rather a different phase. # # **Solution**: # 1. ❌ In principle, this could be the case, as sometimes the presence of @@ -827,11 +961,13 @@ # in this case, the LBCO phase is correctly modeled based on the CIF data. # 2. ✅ The unexplained peaks are due to the presence of an impurity phase # in the sample, which is not included in the current model. -# 3. ❌ The data reduction process is not likely to introduce such specific peaks, as it is -# tested and verified in the previous part of the tutorial. +# 3. ❌ The data reduction process is not likely to introduce such specific +# peaks, as it is tested and verified in the previous part of the tutorial. +# 4. ❌ This could also be the case in real experiments, but in this case, +# we know that the sample is LBCO, as it was simulated based on the CIF data. # %% [markdown] -# #### Exercise 5.8: Identify the impurity phase +# #### Exercise 5.9: Identify the impurity phase # # Identify the impurity phase. # @@ -840,18 +976,18 @@ # tutorial. # # **Solution**: -# The unexplained peaks are likely due to the presence of small amount of +# The unexplained peaks are likely due to the presence of a small amount of # Si in the LBCO sample. In real experiments, it might happen, e.g., because the # sample holder was not cleaned properly after the Si experiment. # # You can visalize both the patterns of the Si and LBCO phases to confirm this hypothesis. # %% -project_1.plot_meas_vs_calc(expt_name='sim_si', x_min=1, x_max=1.7, d_spacing=True) -project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=1, x_max=1.7, d_spacing=True) +project_1.plot_meas_vs_calc(expt_name="sim_si", x_min=1, x_max=1.7, d_spacing=True) +project_2.plot_meas_vs_calc(expt_name="sim_lbco", x_min=1, x_max=1.7, d_spacing=True) # %% [markdown] -# #### Exercise 5.9: Create a Second Sample Model – Si as Impurity +# #### Exercise 5.10: Create a Second Sample Model – Si as Impurity # # Create a second sample model for the Si phase, which is the impurity phase # identified in the previous step. Link this sample model to the LBCO @@ -867,38 +1003,40 @@ # **Set Space Group** # %% -project_2.sample_models.add(name='si') +project_2.sample_models.add(name="si") # %% -project_2.sample_models['si'].space_group.name_h_m = 'F d -3 m' -project_2.sample_models['si'].space_group.it_coordinate_system_code = '2' +project_2.sample_models["si"].space_group.name_h_m = "F d -3 m" +project_2.sample_models["si"].space_group.it_coordinate_system_code = "2" # %% [markdown] # **Set Lattice Parameters** # %% -project_2.sample_models['si'].cell.length_a = 5.43 +project_2.sample_models["si"].cell.length_a = 5.43 # %% [markdown] # **Set Atom Sites** # %% -project_2.sample_models['si'].atom_sites.add(label='Si', - type_symbol='Si', - fract_x=0, - fract_y=0, - fract_z=0, - wyckoff_letter='a', - b_iso=0.95) +project_2.sample_models["si"].atom_sites.add( + label="Si", + type_symbol="Si", + fract_x=0, + fract_y=0, + fract_z=0, + wyckoff_letter="a", + b_iso=0.89, +) # %% [markdown] # **🔗 Assign Sample Model to Experiment** # %% -project_2.experiments['sim_lbco'].linked_phases.add(id='si', scale=1.0) +project_2.experiments["sim_lbco"].linked_phases.add(id="si", scale=1.0) # %% [markdown] -# #### Exercise 5.10: Refine the Scale of the Si Phase +# #### Exercise 5.11: Refine the Scale of the Si Phase # # Visualize the measured diffraction pattern and the calculated diffraction # pattern. Check if the Si phase is contributing to the calculated diffraction @@ -918,7 +1056,7 @@ # **Visualize Diffraction Patterns** # %% -project_2.plot_meas_vs_calc(expt_name='sim_lbco') +project_2.plot_meas_vs_calc(expt_name="sim_lbco") # %% [markdown] # As you can see, the calculated pattern is now the sum of both phases, @@ -928,7 +1066,7 @@ # **Set Fit Parameters** # %% -project_2.experiments['sim_lbco'].linked_phases['si'].scale.free = True +project_2.experiments["sim_lbco"].linked_phases["si"].scale.free = True # %% [markdown] # **Run Fitting** @@ -940,42 +1078,30 @@ # %% [markdown] # **Visualize Fit Results** - +# # Let's plot the measured diffraction pattern and the calculated diffraction # pattern both for the full range and for a zoomed-in region around the previously unexplained # peak near 95,000 μs. The calculated pattern will be the sum of the two phases. # %% -project_2.plot_meas_vs_calc(expt_name='sim_lbco') +project_2.plot_meas_vs_calc(expt_name="sim_lbco") # %% -project_2.plot_meas_vs_calc(expt_name='sim_lbco', x_min=88000, x_max=101000) +project_2.plot_meas_vs_calc(expt_name="sim_lbco", x_min=88000, x_max=101000) # %% [markdown] # All previously unexplained peaks are now accounted for in the pattern, and the fit is improved. # Some discrepancies in the peak intensities remain, but # further improvements would require more advanced data reduction and analysis, # which are beyond the scope of this tutorial. - -# %% [markdown] -# ## 📑 Summary -# -# In this tutorial, you refined two simulated diffraction patterns: -# - **Si** as a simple reference system, and -# - **LBCO** as a more complex, realistic case with an initially unknown impurity. # -# Along the way, you learned how to work with the EasyDiffraction library to: -# - Define a project, experiment, and sample model. -# - Set up instrument and peak profile parameters. -# - Visualize measured and calculated patterns. -# - Identify and interpret misfits in the diffraction data. -# - Add and refine multiple phases to improve the model. +# #### Final Remarks # -# Key Takeaways: -# - A good refinement starts with a reasonable structural model and -# well-defined instrument parameters. -# - Visual inspection is a critical part of model validation. Residual peaks -# often reveal missing physics or contamination. +# In this part of the tutorial, we have demonstrated how to use EasyDiffraction +# to refine lattice parameters for a more complex crystal structure, La₀.₅Ba₀.₅CoO₃ (LBCO). +# In real experiments, additional parameters, such as atomic positions, occupancies, and atomic displacement factors, can also be refined to further improve the fit. +# However, we will stop here, as the purpose of this part of the tutorial is to demonstrate the practical use of +# EasyDiffraction for fitting powder diffraction data. # %% [markdown] # ## 🎁 Bonus From 74f6ce3739a6bd6262418863513e29b67f308202 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 10:13:29 +0200 Subject: [PATCH 16/41] Configures Plotly to hide certain mode bar buttons --- .../plotting/plotters/plotter_plotly.py | 29 +++++++++++++++---- src/easydiffraction/utils/utils.py | 11 +++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/easydiffraction/plotting/plotters/plotter_plotly.py b/src/easydiffraction/plotting/plotters/plotter_plotly.py index 4f6a9d5d..a7712b22 100644 --- a/src/easydiffraction/plotting/plotters/plotter_plotly.py +++ b/src/easydiffraction/plotting/plotters/plotter_plotly.py @@ -3,13 +3,18 @@ import plotly.io as pio try: - import IPython from IPython.display import ( display, HTML ) except ImportError: - IPython = None + display = None + HTML = None + +from easydiffraction.utils.utils import ( + is_notebook, + is_pycharm +) from .plotter_base import ( PlotterBase, @@ -86,23 +91,35 @@ def plot(self, ), ) + config=dict( + displaylogo=False, + modeBarButtonsToRemove=['select2d', + 'lasso2d', + 'zoomIn2d', + 'zoomOut2d', + 'autoScale2d'], + ) + fig = go.Figure( data=data, - layout=layout + layout=layout, ) # Show the figure # This can lead to warnings in Jupyter notebooks: # WARNING: skipping unknown output mime type: application/vnd.plotly.v1+json [mystnb.unknown_mime_type] - if IPython is None: - fig.show() + if is_notebook() or is_pycharm() or display is None or HTML is None: + fig.show(config=config) # If IPython is available, we can convert the figure to HTML and # display it in the notebook. else: # Convert figure to HTML - html_fig = pio.to_html(fig, include_plotlyjs="cdn", full_html=False) + html_fig = pio.to_html(fig, + include_plotlyjs="cdn", + full_html=False, + config=config) # Display it in the notebook display(HTML(html_fig)) diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index 4c6eaf33..a77f1f5c 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -6,6 +6,7 @@ import pandas as pd import pooch import re +import os from tabulate import tabulate try: @@ -64,6 +65,16 @@ def is_notebook() -> bool: return False # Probably standard Python interpreter +def is_pycharm() -> bool: + """ + Determines if the current environment is PyCharm. + + Returns: + bool: True if running inside PyCharm, False otherwise. + """ + return os.environ.get("PYCHARM_HOSTED") == "1" + + def render_table(columns_headers, columns_alignment, columns_data, From 9a509ccb78c89de445c8ef83f2e032c6c962016c Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 13:22:13 +0200 Subject: [PATCH 17/41] Refactors CIF display functionality --- src/easydiffraction/analysis/analysis.py | 19 +++---- src/easydiffraction/experiments/experiment.py | 17 +++--- src/easydiffraction/project.py | 17 +++--- .../sample_models/sample_model.py | 17 ++---- src/easydiffraction/utils/utils.py | 54 +++++++++++++++---- 5 files changed, 69 insertions(+), 55 deletions(-) diff --git a/src/easydiffraction/analysis/analysis.py b/src/easydiffraction/analysis/analysis.py index fd223a53..101d280d 100644 --- a/src/easydiffraction/analysis/analysis.py +++ b/src/easydiffraction/analysis/analysis.py @@ -2,7 +2,10 @@ import numpy as np from typing import List, Optional, Union -from easydiffraction.utils.utils import render_table +from easydiffraction.utils.utils import ( + render_cif, + render_table +) from easydiffraction.utils.formatting import ( paragraph, warning @@ -417,14 +420,6 @@ def as_cif(self): return "\n".join(lines) def show_as_cif(self) -> None: - cif_text = self.as_cif() - lines = cif_text.splitlines() - max_width = max(len(line) for line in lines) - padded_lines = [f"│ {line.ljust(max_width)} │" for line in lines] - top = f"╒{'═' * (max_width + 2)}╕" - bottom = f"╘{'═' * (max_width + 2)}╛" - - print(paragraph(f"Analysis 🧮 info as cif")) - print(top) - print("\n".join(padded_lines)) - print(bottom) + cif_text: str = self.as_cif() + paragraph_title: str = paragraph(f"Analysis 🧮 info as cif") + render_cif(cif_text, paragraph_title) diff --git a/src/easydiffraction/experiments/experiment.py b/src/easydiffraction/experiments/experiment.py index 20d9a2aa..e015daad 100644 --- a/src/easydiffraction/experiments/experiment.py +++ b/src/easydiffraction/experiments/experiment.py @@ -4,7 +4,10 @@ from abc import abstractmethod -from easydiffraction.utils.utils import render_table +from easydiffraction.utils.utils import ( + render_cif, + render_table +) from easydiffraction.utils.decorators import enforce_type from easydiffraction.experiments.components.experiment_type import ExperimentType from easydiffraction.experiments.components.instrument import ( @@ -163,16 +166,8 @@ def as_cif(self, max_points: Optional[int] = None) -> str: def show_as_cif(self) -> None: cif_text: str = self.as_cif(max_points=5) - lines: List[str] = cif_text.splitlines() - max_width: int = max(len(line) for line in lines) - padded_lines: List[str] = [f"│ {line.ljust(max_width)} │" for line in lines] - top: str = f"╒{'═' * (max_width + 2)}╕" - bottom: str = f"╘{'═' * (max_width + 2)}╛" - - print(paragraph(f"Experiment 🔬 '{self.name}' as cif")) - print(top) - print("\n".join(padded_lines)) - print(bottom) + paragraph_title: str = paragraph(f"Experiment 🔬 '{self.name}' as cif") + render_cif(cif_text, paragraph_title) @abstractmethod def _load_ascii_data_to_experiment(self, data_path: str) -> None: diff --git a/src/easydiffraction/project.py b/src/easydiffraction/project.py index 64b4c143..2d1a3391 100644 --- a/src/easydiffraction/project.py +++ b/src/easydiffraction/project.py @@ -6,7 +6,10 @@ from varname import varname from typing import List -from easydiffraction.utils.utils import tof_to_d +from easydiffraction.utils.utils import ( + render_cif, + tof_to_d +) from easydiffraction.utils.formatting import ( paragraph, error @@ -111,16 +114,8 @@ def as_cif(self) -> str: def show_as_cif(self) -> None: cif_text: str = self.as_cif() - lines: List[str] = cif_text.splitlines() - max_width: int = max(len(line) for line in lines) - padded_lines: List[str] = [f"│ {line.ljust(max_width)} │" for line in lines] - top: str = f"╒{'═' * (max_width + 2)}╕" - bottom: str = f"╘{'═' * (max_width + 2)}╛" - - print(paragraph(f"Project 📦 '{self.name}' info as cif")) - print(top) - print("\n".join(padded_lines)) - print(bottom) + paragraph_title: str = paragraph(f"Project 📦 '{self.name}' info as cif") + render_cif(cif_text, paragraph_title) class Project: diff --git a/src/easydiffraction/sample_models/sample_model.py b/src/easydiffraction/sample_models/sample_model.py index 6130eb41..2115cdbf 100644 --- a/src/easydiffraction/sample_models/sample_model.py +++ b/src/easydiffraction/sample_models/sample_model.py @@ -1,5 +1,6 @@ from easydiffraction.utils.decorators import enforce_type from easydiffraction.utils.formatting import paragraph +from easydiffraction.utils.utils import render_cif from easydiffraction.core.objects import Datablock from easydiffraction.crystallography import crystallography as ecr from easydiffraction.sample_models.components.space_group import SpaceGroup @@ -193,15 +194,7 @@ def show_params(self): print("Atom sites:") self.atom_sites.show() - def show_as_cif(self): - cif_text = self.as_cif() - lines = cif_text.splitlines() - max_width = max(len(line) for line in lines) - padded_lines = [f"│ {line.ljust(max_width)} │" for line in lines] - top = f"╒{'═' * (max_width + 2)}╕" - bottom = f"╘{'═' * (max_width + 2)}╛" - - print(paragraph(f"Sample model 🧩 '{self.name}' as cif")) - print(top) - print("\n".join(padded_lines)) - print(bottom) + def show_as_cif(self) -> None: + cif_text: str = self.as_cif() + paragraph_title: str = paragraph(f"Sample model 🧩 '{self.name}' as cif") + render_cif(cif_text, paragraph_title) diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index a77f1f5c..62e87512 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -8,6 +8,7 @@ import re import os from tabulate import tabulate +from typing import List, Optional try: import IPython @@ -75,26 +76,33 @@ def is_pycharm() -> bool: return os.environ.get("PYCHARM_HOSTED") == "1" -def render_table(columns_headers, +def render_table(columns_data, columns_alignment, - columns_data, + columns_headers=None, show_index=False): """ Renders a table either as an HTML (in Jupyter Notebook) or ASCII (in terminal), with aligned columns. Args: - columns_headers (list): List of column headers. + columns_data (list): List of lists, where each inner list represents a row of data. columns_alignment (list): Corresponding text alignment for each column (e.g., 'left', 'center', 'right'). - columns_data (list): List of row data. + columns_headers (list): List of column headers. show_index (bool): Whether to show the index column. """ # Use pandas DataFrame for Jupyter Notebook rendering if is_notebook(): # Create DataFrame - df = pd.DataFrame(columns_data, - columns=columns_headers) + if columns_headers is None: + df = pd.DataFrame(columns_data) + df.columns = range(df.shape[1]) # Ensure numeric column labels + columns_headers = df.columns.tolist() + skip_headers = True + else: + df = pd.DataFrame(columns_data, + columns=columns_headers) + skip_headers = False # Force starting index from 1 if show_index: @@ -116,7 +124,8 @@ def make_formatter(align): html = df.to_html(escape=False, index=show_index, formatters=formatters, - border=0) + border=0, + header=not skip_headers) # Add inline CSS to align the entire table to the left and show border html = html.replace('', @@ -128,13 +137,17 @@ def make_formatter(align): '">') # Manually apply text alignment to headers - for col, align in zip(columns_headers, columns_alignment): - html = html.replace(f'
{col}', f'{col}') + if not skip_headers: + for col, align in zip(columns_headers, columns_alignment): + html = html.replace(f'{col}', f'{col}') display(HTML(html)) # Use tabulate for terminal rendering else: + if columns_headers is None: + columns_headers = [] + indices = show_index if show_index: # Force starting index from 1 @@ -152,6 +165,29 @@ def make_formatter(align): print(table) +def render_cif(cif_text, paragraph_title) -> None: + """ + Display the CIF text as a formatted table in Jupyter Notebook or terminal. + """ + # Split into lines and replace empty ones with a ' ' + # (non-breaking space) to force empty lines to be rendered in + # full height in the table. This is only needed in Jupyter Notebook. + if is_notebook(): + lines: List[str] = [line if line.strip() else ' ' for line in cif_text.splitlines()] + else: + lines: List[str] = [line for line in cif_text.splitlines()] + + # Convert each line into a single-column format for table rendering + columns: List[List[str]] = [[line] for line in lines] + + # Print title paragraph + print(paragraph_title) + + # Render the table using left alignment and no headers + render_table(columns_data=columns, + columns_alignment=["left"]) + + def tof_to_d(tof, offset, linear, quad): """ Convert TOF to d-spacing using quadratic calibration. From 413bb6b0e267d76e84224df8938f6cbee29ee692 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 13:56:08 +0200 Subject: [PATCH 18/41] Enhances progress tracking with notebook support --- .../minimizers/fitting_progress_tracker.py | 72 ++++++++++++------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py b/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py index 0e4a80d2..5fb8eceb 100644 --- a/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py +++ b/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py @@ -1,5 +1,20 @@ import numpy as np +import time from typing import List, Optional + +try: + from IPython.display import ( + display, + clear_output + ) +except ImportError: + display = None + clear_output = None + +from easydiffraction.utils.utils import ( + is_notebook, + render_table +) from easydiffraction.analysis.reliability_factors import calculate_reduced_chi_square SIGNIFICANT_CHANGE_THRESHOLD = 0.01 # 1% threshold @@ -33,6 +48,9 @@ def __init__(self) -> None: self._best_chi2: Optional[float] = None self._best_iteration: Optional[int] = None self._fitting_time: Optional[float] = None + self._headers: List[str] = ["iteration", "χ²", "improvement [%]"] + self._alignments: List[str] = ["center", "center", "center"] + self._df_rows: List[List[str]] = [] def reset(self) -> None: self._iteration = 0 @@ -118,43 +136,48 @@ def fitting_time(self) -> Optional[float]: return self._fitting_time def start_timer(self) -> None: - import time self._start_time = time.perf_counter() def stop_timer(self) -> None: - import time self._end_time = time.perf_counter() self._fitting_time = self._end_time - self._start_time def start_tracking(self, minimizer_name: str) -> None: - headers: List[str] = ["iteration", "χ²", "improvement [%]"] - print(f"🚀 Starting fitting process with '{minimizer_name}'...") print("📈 Goodness-of-fit (reduced χ²) change:") - # Top border - print("╒" + "╤".join(["═" * FIXED_WIDTH for _ in headers]) + "╕") + if is_notebook() and display is not None: + self._df_rows = [] # Reset notebook tracking + else: + # Top border + print("╒" + "╤".join(["═" * FIXED_WIDTH for _ in self._headers]) + "╕") - # Header row (all centered) - header_row = "│" + "│".join([format_cell(h, align="center") for h in headers]) + "│" - print(header_row) + # Header row (all centered) + header_row = "│" + "│".join([format_cell(h, align="center") for h in self._headers]) + "│" + print(header_row) - # Separator - print("╞" + "╪".join(["═" * FIXED_WIDTH for _ in headers]) + "╡") + # Separator + print("╞" + "╪".join(["═" * FIXED_WIDTH for _ in self._headers]) + "╡") def add_tracking_info(self, row: List[str]) -> None: - # Alignments for each column: iteration, χ², improvement [%] - aligns: List[str] = ["center", "center", "center"] - - formatted_row = "│" + "│".join([ - format_cell(cell, align=aligns[i]) - for i, cell in enumerate(row) - ]) + "│" - - print(formatted_row) + if is_notebook() and display is not None and clear_output is not None: + # Add row to DataFrame, clear previous output, and show updated table + self._df_rows.append(row) + clear_output(wait=True) + render_table(columns_data=self._df_rows, + columns_alignment=self._alignments, + columns_headers=self._headers) + else: + # Alignments for each column + formatted_row = "│" + "│".join([ + format_cell(cell, align=self._alignments[i]) + for i, cell in enumerate(row) + ]) + "│" + + print(formatted_row) def finish_tracking(self) -> None: - # Print last iteration as last row + # Add last iteration as last row row: List[str] = [ str(self._last_iteration), f"{self._last_chi2:.2f}" if self._last_chi2 is not None else "", @@ -162,9 +185,10 @@ def finish_tracking(self) -> None: ] self.add_tracking_info(row) - # Print bottom border - print("╘" + "╧".join(["═" * FIXED_WIDTH for _ in range(len(row))]) + "╛") + if not is_notebook(): + # Bottom border for terminal only + print("╘" + "╧".join(["═" * FIXED_WIDTH for _ in range(len(row))]) + "╛") # Print best result print(f"🏆 Best goodness-of-fit (reduced χ²) is {self._best_chi2:.2f} at iteration {self._best_iteration}") - print("✅ Fitting complete.") \ No newline at end of file + print("✅ Fitting complete.") From 146c6ffa16160633c664b7c6c0d8367351017a78 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 16:48:19 +0200 Subject: [PATCH 19/41] Improves phase handling in experiments --- src/easydiffraction/experiments/experiment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/easydiffraction/experiments/experiment.py b/src/easydiffraction/experiments/experiment.py index e015daad..9ec902da 100644 --- a/src/easydiffraction/experiments/experiment.py +++ b/src/easydiffraction/experiments/experiment.py @@ -122,7 +122,7 @@ def as_cif(self, max_points: Optional[int] = None) -> str: cif_lines += ["", self.peak.as_cif()] # Phase scale factors for powder experiments - if hasattr(self, "linked_phases"): + if hasattr(self, "linked_phases") and self.linked_phases._items: cif_lines += ["", self.linked_phases.as_cif()] # Crystal scale factor for single crystal experiments From 03df207da0856eab85eda76221c7666cf85b0106 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 16:51:36 +0200 Subject: [PATCH 20/41] Removes CIF display call --- tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py b/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py index 7c83be58..2158d0ce 100644 --- a/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py +++ b/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py @@ -81,10 +81,6 @@ project.experiments['hrpt'].excluded_regions.add(minimum=0, maximum=5) project.experiments['hrpt'].excluded_regions.add(minimum=165, maximum=180) -# %% -project.experiments['hrpt'].show_as_cif() - - # %% project.experiments['hrpt'].linked_phases.add(id='lbco', scale=10.0) From 070795b9d177150f5b5dfc304a38736d9f45a8f8 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 17:16:52 +0200 Subject: [PATCH 21/41] Converts error logging to printed messages --- src/easydiffraction/plotting/plotting.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/easydiffraction/plotting/plotting.py b/src/easydiffraction/plotting/plotting.py index 16cb4aa6..f262b64c 100644 --- a/src/easydiffraction/plotting/plotting.py +++ b/src/easydiffraction/plotting/plotting.py @@ -215,13 +215,13 @@ def plot_meas_vs_calc(self, show_residual=False, d_spacing=False): if pattern.x is None: - error(f"No data available for experiment {expt_name}") + print(error(f"No data available for experiment {expt_name}")) return if pattern.meas is None: - error(f"No measured data available for experiment {expt_name}") + print(error(f"No measured data available for experiment {expt_name}")) return if pattern.calc is None: - print(f"No calculated data available for experiment {expt_name}") + print(error(f"No calculated data available for experiment {expt_name}")) return if d_spacing: From 21c05b41aa106ebc13ffca822f1a7d475a7417f0 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 17:17:29 +0200 Subject: [PATCH 22/41] Adds d-spacing conversion for constant wavelength --- src/easydiffraction/project.py | 48 ++++++++++++++++++------------ src/easydiffraction/utils/utils.py | 20 +++++++++++++ 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/easydiffraction/project.py b/src/easydiffraction/project.py index 2d1a3391..35aeeac7 100644 --- a/src/easydiffraction/project.py +++ b/src/easydiffraction/project.py @@ -8,7 +8,8 @@ from easydiffraction.utils.utils import ( render_cif, - tof_to_d + tof_to_d, + two_theta_to_d ) from easydiffraction.utils.formatting import ( paragraph, @@ -247,13 +248,15 @@ def plot_meas(self, pattern = experiment.datastore.pattern expt_type = experiment.type - beam_mode = expt_type.beam_mode.value - if d_spacing: # TODO: move this logic to somewhere else - if beam_mode == 'time-of-flight': - self.update_pattern_d_spacing(expt_name) - else: - d_spacing = False + # Update d-spacing if necessary + # TODO: This is done before every plot, and not when parameters + # needed for d-spacing conversion are changed. The reason is + # to minimize the performance impact during the fitting process. + # Need to find a better way to handle this. + if d_spacing: + self.update_pattern_d_spacing(expt_name) + # Plot measured pattern self.plotter.plot_meas(pattern, expt_name, expt_type, @@ -271,13 +274,15 @@ def plot_calc(self, pattern = experiment.datastore.pattern expt_type = experiment.type - beam_mode = expt_type.beam_mode.value - if d_spacing: # TODO: move this logic to somewhere else - if beam_mode == 'time-of-flight': - self.update_pattern_d_spacing(expt_name) - else: - d_spacing = False + # Update d-spacing if necessary + # TODO: This is done before every plot, and not when parameters + # needed for d-spacing conversion are changed. The reason is + # to minimize the performance impact during the fitting process. + # Need to find a better way to handle this. + if d_spacing: + self.update_pattern_d_spacing(expt_name) + # Plot calculated pattern self.plotter.plot_calc(pattern, expt_name, expt_type, @@ -296,13 +301,15 @@ def plot_meas_vs_calc(self, pattern = experiment.datastore.pattern expt_type = experiment.type - beam_mode = expt_type.beam_mode.value - if d_spacing: # TODO: move this logic to somewhere else - if beam_mode == 'time-of-flight': - self.update_pattern_d_spacing(expt_name) - else: - d_spacing = False + # Update d-spacing if necessary + # TODO: This is done before every plot, and not when parameters + # needed for d-spacing conversion are changed. The reason is + # to minimize the performance impact during the fitting process. + # Need to find a better way to handle this. + if d_spacing: + self.update_pattern_d_spacing(expt_name) + # Plot measured vs calculated self.plotter.plot_meas_vs_calc(pattern, expt_name, expt_type, @@ -325,5 +332,8 @@ def update_pattern_d_spacing(self, expt_name: str) -> None: experiment.instrument.calib_d_to_tof_offset.value, experiment.instrument.calib_d_to_tof_linear.value, experiment.instrument.calib_d_to_tof_quad.value) + elif beam_mode == 'constant wavelength': + pattern.d = two_theta_to_d(pattern.x, + experiment.instrument.setup_wavelength.value) else: print(error(f"Unsupported beam mode: {beam_mode} for d-spacing update.")) diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index 62e87512..858673d4 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -214,6 +214,26 @@ def tof_to_d(tof, offset, linear, quad): return d +def two_theta_to_d(two_theta, wavelength): + """ + Convert 2-theta to d-spacing using Bragg's law. + + Parameters: + two_theta (float or np.ndarray): 2-theta angle in degrees. + wavelength (float): Wavelength in Å. + + Returns: + d (float or np.ndarray): d-spacing in Å. + """ + # Convert two_theta from degrees to radians + theta_rad = np.radians(two_theta / 2) + + # Calculate d-spacing using Bragg's law + d = wavelength / (2 * np.sin(theta_rad)) + + return d + + def get_value_from_xye_header(file_path, key): """ Extracts a floating point value from the first line of the file, corresponding to the given key. From ab1626f0ec5c3354b5145f0356ecd2ace67a794b Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 17:26:37 +0200 Subject: [PATCH 23/41] Adjusts default plotting engine based on environment --- src/easydiffraction/plotting/plotters/plotter_base.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/easydiffraction/plotting/plotters/plotter_base.py b/src/easydiffraction/plotting/plotters/plotter_base.py index e0fe53a7..f1a229ef 100644 --- a/src/easydiffraction/plotting/plotters/plotter_base.py +++ b/src/easydiffraction/plotting/plotters/plotter_base.py @@ -1,8 +1,13 @@ import numpy as np from abc import ABC, abstractmethod +from easydiffraction.utils.utils import ( + is_notebook, + is_pycharm +) + +DEFAULT_ENGINE = 'plotly' if is_notebook() or is_pycharm() else 'asciichartpy' DEFAULT_HEIGHT = 9 -DEFAULT_ENGINE = 'asciichartpy' DEFAULT_MIN = -np.inf DEFAULT_MAX = np.inf From 05b7561ca65fe4971afafdb8967abd9a42376b5e Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 17:27:26 +0200 Subject: [PATCH 24/41] Simplifies LBCO quick tutorial --- .../quick_single-fit_pd-neut-cwl_LBCO-HRPT.py | 93 ++++++++++--------- 1 file changed, 51 insertions(+), 42 deletions(-) diff --git a/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py b/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py index 2158d0ce..3fabf28f 100644 --- a/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py +++ b/tutorials/quick_single-fit_pd-neut-cwl_LBCO-HRPT.py @@ -16,6 +16,9 @@ # might look like in code. For a more detailed explanation of the code, please # refer to the other tutorials. +# %% [markdown] +# ## Import Library + # %% import easydiffraction as ed @@ -25,9 +28,6 @@ # %% project = ed.Project() -# %% -project.plotter.engine = 'plotly' - # %% [markdown] # ## Step 2: Define Sample Model @@ -35,23 +35,28 @@ project.sample_models.add(name='lbco') # %% -project.sample_models['lbco'].space_group.name_h_m = 'P m -3 m' -project.sample_models['lbco'].space_group.it_coordinate_system_code = '1' +sample_model = project.sample_models['lbco'] # %% -project.sample_models['lbco'].cell.length_a = 3.88 +sample_model.space_group.name_h_m = 'P m -3 m' +sample_model.space_group.it_coordinate_system_code = '1' # %% -project.sample_models['lbco'].atom_sites.add('La', 'La', 0, 0, 0, b_iso=0.5, occupancy=0.5) -project.sample_models['lbco'].atom_sites.add('Ba', 'Ba', 0, 0, 0, b_iso=0.5, occupancy=0.5) -project.sample_models['lbco'].atom_sites.add('Co', 'Co', 0.5, 0.5, 0.5, b_iso=0.5) -project.sample_models['lbco'].atom_sites.add('O', 'O', 0, 0.5, 0.5, b_iso=0.5) +sample_model.cell.length_a = 3.88 + +# %% +sample_model.atom_sites.add('La', 'La', 0, 0, 0, b_iso=0.5, occupancy=0.5) +sample_model.atom_sites.add('Ba', 'Ba', 0, 0, 0, b_iso=0.5, occupancy=0.5) +sample_model.atom_sites.add('Co', 'Co', 0.5, 0.5, 0.5, b_iso=0.5) +sample_model.atom_sites.add('O', 'O', 0, 0.5, 0.5, b_iso=0.5) # %% [markdown] # ## Step 3: Define Experiment # %% -ed.download_from_repository('hrpt_lbco.xye', branch='develop', destination='data') +ed.download_from_repository('hrpt_lbco.xye', + branch='develop', + destination='data') # %% project.experiments.add(name='hrpt', @@ -61,58 +66,62 @@ data_path='data/hrpt_lbco.xye') # %% -project.experiments['hrpt'].instrument.setup_wavelength = 1.494 -project.experiments['hrpt'].instrument.calib_twotheta_offset = 0.6 +experiment = project.experiments['hrpt'] + +# %% +experiment.instrument.setup_wavelength = 1.494 +experiment.instrument.calib_twotheta_offset = 0.6 # %% -project.experiments['hrpt'].peak.broad_gauss_u = 0.1 -project.experiments['hrpt'].peak.broad_gauss_v = -0.1 -project.experiments['hrpt'].peak.broad_gauss_w = 0.1 -project.experiments['hrpt'].peak.broad_lorentz_y = 0.1 +experiment.peak.broad_gauss_u = 0.1 +experiment.peak.broad_gauss_v = -0.1 +experiment.peak.broad_gauss_w = 0.1 +experiment.peak.broad_lorentz_y = 0.1 # %% -project.experiments['hrpt'].background.add(x=10, y=170) -project.experiments['hrpt'].background.add(x=30, y=170) -project.experiments['hrpt'].background.add(x=50, y=170) -project.experiments['hrpt'].background.add(x=110, y=170) -project.experiments['hrpt'].background.add(x=165, y=170) +experiment.background.add(x=10, y=170) +experiment.background.add(x=30, y=170) +experiment.background.add(x=50, y=170) +experiment.background.add(x=110, y=170) +experiment.background.add(x=165, y=170) # %% -project.experiments['hrpt'].excluded_regions.add(minimum=0, maximum=5) -project.experiments['hrpt'].excluded_regions.add(minimum=165, maximum=180) +experiment.excluded_regions.add(minimum=0, maximum=5) +experiment.excluded_regions.add(minimum=165, maximum=180) # %% -project.experiments['hrpt'].linked_phases.add(id='lbco', scale=10.0) +experiment.linked_phases.add(id='lbco', scale=10.0) # %% [markdown] # ## Step 4: Perform Analysis # %% -project.sample_models['lbco'].cell.length_a.free = True +sample_model.cell.length_a.free = True -project.sample_models['lbco'].atom_sites['La'].b_iso.free = True -project.sample_models['lbco'].atom_sites['Ba'].b_iso.free = True -project.sample_models['lbco'].atom_sites['Co'].b_iso.free = True -project.sample_models['lbco'].atom_sites['O'].b_iso.free = True +sample_model.atom_sites['La'].b_iso.free = True +sample_model.atom_sites['Ba'].b_iso.free = True +sample_model.atom_sites['Co'].b_iso.free = True +sample_model.atom_sites['O'].b_iso.free = True # %% -project.experiments['hrpt'].linked_phases['lbco'].scale.free = True +experiment.instrument.calib_twotheta_offset.free = True -project.experiments['hrpt'].instrument.calib_twotheta_offset.free = True +experiment.peak.broad_gauss_u.free = True +experiment.peak.broad_gauss_v.free = True +experiment.peak.broad_gauss_w.free = True +experiment.peak.broad_lorentz_y.free = True -project.experiments['hrpt'].background['10'].y.free = True -project.experiments['hrpt'].background['30'].y.free = True -project.experiments['hrpt'].background['50'].y.free = True -project.experiments['hrpt'].background['110'].y.free = True -project.experiments['hrpt'].background['165'].y.free = True +experiment.background['10'].y.free = True +experiment.background['30'].y.free = True +experiment.background['50'].y.free = True +experiment.background['110'].y.free = True +experiment.background['165'].y.free = True -project.experiments['hrpt'].peak.broad_gauss_u.free = True -project.experiments['hrpt'].peak.broad_gauss_v.free = True -project.experiments['hrpt'].peak.broad_gauss_w.free = True -project.experiments['hrpt'].peak.broad_lorentz_y.free = True +experiment.linked_phases['lbco'].scale.free = True # %% project.analysis.fit() # %% -project.plot_meas_vs_calc(expt_name='hrpt', show_residual=True) +project.plot_meas_vs_calc(expt_name='hrpt', + show_residual=True) From 1705188a2272028c062670337da0c92c66920147 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Tue, 5 Aug 2025 17:50:27 +0200 Subject: [PATCH 25/41] Standardizes variable naming for 2-theta calculations --- .../calculators/calculator_crysfml.py | 10 +++++----- .../analysis/calculators/calculator_cryspy.py | 20 +++++++++---------- src/easydiffraction/project.py | 6 +++--- src/easydiffraction/utils/utils.py | 8 ++++---- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/easydiffraction/analysis/calculators/calculator_crysfml.py b/src/easydiffraction/analysis/calculators/calculator_crysfml.py index 100c5dab..5719a4d2 100644 --- a/src/easydiffraction/analysis/calculators/calculator_crysfml.py +++ b/src/easydiffraction/analysis/calculators/calculator_crysfml.py @@ -148,8 +148,8 @@ def _convert_experiment_to_dict(self, experiment: Experiment) -> Dict[str, Any]: peak = getattr(experiment, "peak", None) x_data = experiment.datastore.pattern.x - two_theta_min = float(x_data.min()) - two_theta_max = float(x_data.max()) + twotheta_min = float(x_data.min()) + twotheta_max = float(x_data.max()) exp_dict = { "NPD": { @@ -163,9 +163,9 @@ def _convert_experiment_to_dict(self, experiment: Experiment) -> Dict[str, Any]: #"_pd_instr_reflex_s_l": peak_asymm.s_l.value if peak_asymm else 0.0, #"_pd_instr_reflex_d_l": peak_asymm.d_l.value if peak_asymm else 0.0, "_pd_meas_2theta_offset": instrument.calib_twotheta_offset.value if instrument else 0.0, - "_pd_meas_2theta_range_min": two_theta_min, - "_pd_meas_2theta_range_max": two_theta_max, - "_pd_meas_2theta_range_inc": (two_theta_max - two_theta_min) / len(x_data) + "_pd_meas_2theta_range_min": twotheta_min, + "_pd_meas_2theta_range_max": twotheta_max, + "_pd_meas_2theta_range_inc": (twotheta_max - twotheta_min) / len(x_data) } } diff --git a/src/easydiffraction/analysis/calculators/calculator_cryspy.py b/src/easydiffraction/analysis/calculators/calculator_cryspy.py index 302e89a5..0c579df8 100644 --- a/src/easydiffraction/analysis/calculators/calculator_cryspy.py +++ b/src/easydiffraction/analysis/calculators/calculator_cryspy.py @@ -310,15 +310,15 @@ def _convert_experiment_to_cryspy_cif(self, cif_lines.append(f"{engine_key_name} {attr_value}") x_data = experiment.datastore.pattern.x - two_theta_min = float(x_data.min()) - two_theta_max = float(x_data.max()) + twotheta_min = float(x_data.min()) + twotheta_max = float(x_data.max()) cif_lines.append("") if expt_type.beam_mode.value == "constant wavelength": - cif_lines.append(f"_range_2theta_min {two_theta_min}") - cif_lines.append(f"_range_2theta_max {two_theta_max}") + cif_lines.append(f"_range_2theta_min {twotheta_min}") + cif_lines.append(f"_range_2theta_max {twotheta_max}") elif expt_type.beam_mode.value == "time-of-flight": - cif_lines.append(f"_range_time_min {two_theta_min}") - cif_lines.append(f"_range_time_max {two_theta_max}") + cif_lines.append(f"_range_time_min {twotheta_min}") + cif_lines.append(f"_range_time_max {twotheta_max}") cif_lines.append("") cif_lines.append("loop_") @@ -331,15 +331,15 @@ def _convert_experiment_to_cryspy_cif(self, cif_lines.append("loop_") cif_lines.append("_pd_background_2theta") cif_lines.append("_pd_background_intensity") - cif_lines.append(f"{two_theta_min} 0.0") - cif_lines.append(f"{two_theta_max} 0.0") + cif_lines.append(f"{twotheta_min} 0.0") + cif_lines.append(f"{twotheta_max} 0.0") elif expt_type.beam_mode.value == "time-of-flight": cif_lines.append("") cif_lines.append("loop_") cif_lines.append("_tof_backgroundpoint_time") cif_lines.append("_tof_backgroundpoint_intensity") - cif_lines.append(f"{two_theta_min} 0.0") - cif_lines.append(f"{two_theta_max} 0.0") + cif_lines.append(f"{twotheta_min} 0.0") + cif_lines.append(f"{twotheta_max} 0.0") if expt_type.beam_mode.value == "constant wavelength": cif_lines.append("") diff --git a/src/easydiffraction/project.py b/src/easydiffraction/project.py index 35aeeac7..1ec7ae14 100644 --- a/src/easydiffraction/project.py +++ b/src/easydiffraction/project.py @@ -9,7 +9,7 @@ from easydiffraction.utils.utils import ( render_cif, tof_to_d, - two_theta_to_d + twotheta_to_d ) from easydiffraction.utils.formatting import ( paragraph, @@ -333,7 +333,7 @@ def update_pattern_d_spacing(self, expt_name: str) -> None: experiment.instrument.calib_d_to_tof_linear.value, experiment.instrument.calib_d_to_tof_quad.value) elif beam_mode == 'constant wavelength': - pattern.d = two_theta_to_d(pattern.x, - experiment.instrument.setup_wavelength.value) + pattern.d = twotheta_to_d(pattern.x, + experiment.instrument.setup_wavelength.value) else: print(error(f"Unsupported beam mode: {beam_mode} for d-spacing update.")) diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index 858673d4..89221cbe 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -214,19 +214,19 @@ def tof_to_d(tof, offset, linear, quad): return d -def two_theta_to_d(two_theta, wavelength): +def twotheta_to_d(twotheta, wavelength): """ Convert 2-theta to d-spacing using Bragg's law. Parameters: - two_theta (float or np.ndarray): 2-theta angle in degrees. + twotheta (float or np.ndarray): 2-theta angle in degrees. wavelength (float): Wavelength in Å. Returns: d (float or np.ndarray): d-spacing in Å. """ - # Convert two_theta from degrees to radians - theta_rad = np.radians(two_theta / 2) + # Convert twotheta from degrees to radians + theta_rad = np.radians(twotheta / 2) # Calculate d-spacing using Bragg's law d = wavelength / (2 * np.sin(theta_rad)) From 06ec9d8f0f7c1dede30520177908fdbe09b966a9 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 10:25:37 +0200 Subject: [PATCH 26/41] Add units to b_iso parameter in AtomSite class --- src/easydiffraction/sample_models/collections/atom_sites.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/easydiffraction/sample_models/collections/atom_sites.py b/src/easydiffraction/sample_models/collections/atom_sites.py index 0278b11f..d1647ef5 100644 --- a/src/easydiffraction/sample_models/collections/atom_sites.py +++ b/src/easydiffraction/sample_models/collections/atom_sites.py @@ -73,6 +73,7 @@ def __init__(self, self.b_iso = Parameter( value=b_iso, name="b_iso", + units="Ų", cif_name="B_iso_or_equiv", ) # Select which of the input parameters is used for the From 8387fff01d772c65a4ad4ba3ce809c991609d0eb Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 11:28:04 +0200 Subject: [PATCH 27/41] Formats fitter method arguments for readability --- src/easydiffraction/analysis/analysis.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/easydiffraction/analysis/analysis.py b/src/easydiffraction/analysis/analysis.py index 101d280d..8e583104 100644 --- a/src/easydiffraction/analysis/analysis.py +++ b/src/easydiffraction/analysis/analysis.py @@ -387,14 +387,19 @@ def fit(self): if self.fit_mode == 'joint': print(paragraph(f"Using all experiments 🔬 {experiment_ids} for '{self.fit_mode}' fitting")) - self.fitter.fit(sample_models, experiments, calculator, weights=self.joint_fit_experiments) + self.fitter.fit(sample_models, + experiments, + calculator, + weights=self.joint_fit_experiments) elif self.fit_mode == 'single': for expt_name in experiments.ids: print(paragraph(f"Using experiment 🔬 '{expt_name}' for '{self.fit_mode}' fitting")) experiment = experiments[expt_name] dummy_experiments = Experiments() # TODO: Find a better name dummy_experiments.add(experiment) - self.fitter.fit(sample_models, dummy_experiments, calculator) + self.fitter.fit(sample_models, + dummy_experiments, + calculator) else: raise NotImplementedError(f"Fit mode {self.fit_mode} not implemented yet.") From 2ec5473fbc5ce9dfdf480787f103b921e3920df0 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 11:28:24 +0200 Subject: [PATCH 28/41] Enhances fitting progress tracker with updated display --- .../minimizers/fitting_progress_tracker.py | 36 ++++++++++++++----- src/easydiffraction/utils/utils.py | 9 +++-- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py b/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py index 5fb8eceb..e4540cb9 100644 --- a/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py +++ b/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py @@ -5,7 +5,8 @@ try: from IPython.display import ( display, - clear_output + HTML, + DisplayHandle ) except ImportError: display = None @@ -48,9 +49,11 @@ def __init__(self) -> None: self._best_chi2: Optional[float] = None self._best_iteration: Optional[int] = None self._fitting_time: Optional[float] = None + self._headers: List[str] = ["iteration", "χ²", "improvement [%]"] self._alignments: List[str] = ["center", "center", "center"] self._df_rows: List[List[str]] = [] + self._display_handle: Optional[DisplayHandle] = None def reset(self) -> None: self._iteration = 0 @@ -143,11 +146,24 @@ def stop_timer(self) -> None: self._fitting_time = self._end_time - self._start_time def start_tracking(self, minimizer_name: str) -> None: - print(f"🚀 Starting fitting process with '{minimizer_name}'...") + print(f"🚀 Starting fit process with '{minimizer_name}'...") print("📈 Goodness-of-fit (reduced χ²) change:") if is_notebook() and display is not None: - self._df_rows = [] # Reset notebook tracking + # Reset the DataFrame rows + self._df_rows = [] + + # Recreate display handle for updating the table + self._display_handle = DisplayHandle() + + # Create placeholder for display + self._display_handle.display(HTML("")) + + # Show empty table with headers + render_table(columns_data=self._df_rows, + columns_alignment=self._alignments, + columns_headers=self._headers, + display_handle=self._display_handle) else: # Top border print("╒" + "╤".join(["═" * FIXED_WIDTH for _ in self._headers]) + "╕") @@ -160,13 +176,15 @@ def start_tracking(self, minimizer_name: str) -> None: print("╞" + "╪".join(["═" * FIXED_WIDTH for _ in self._headers]) + "╡") def add_tracking_info(self, row: List[str]) -> None: - if is_notebook() and display is not None and clear_output is not None: - # Add row to DataFrame, clear previous output, and show updated table + if is_notebook() and display is not None: + # Add row to DataFrame self._df_rows.append(row) - clear_output(wait=True) + + # Show fully updated table render_table(columns_data=self._df_rows, columns_alignment=self._alignments, - columns_headers=self._headers) + columns_headers=self._headers, + display_handle=self._display_handle) else: # Alignments for each column formatted_row = "│" + "│".join([ @@ -174,6 +192,7 @@ def add_tracking_info(self, row: List[str]) -> None: for i, cell in enumerate(row) ]) + "│" + # Print the new row print(formatted_row) def finish_tracking(self) -> None: @@ -185,7 +204,8 @@ def finish_tracking(self) -> None: ] self.add_tracking_info(row) - if not is_notebook(): + # Bottom border for terminal only + if not is_notebook() or display is None: # Bottom border for terminal only print("╘" + "╧".join(["═" * FIXED_WIDTH for _ in range(len(row))]) + "╛") diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index 89221cbe..ad869f4b 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -79,7 +79,8 @@ def is_pycharm() -> bool: def render_table(columns_data, columns_alignment, columns_headers=None, - show_index=False): + show_index=False, + display_handle=None): """ Renders a table either as an HTML (in Jupyter Notebook) or ASCII (in terminal), with aligned columns. @@ -141,7 +142,11 @@ def make_formatter(align): for col, align in zip(columns_headers, columns_alignment): html = html.replace(f'{col}', f'{col}') - display(HTML(html)) + # Display or update the table in Jupyter Notebook + if display_handle is not None: + display_handle.update(HTML(html)) + else: + display(HTML(html)) # Use tabulate for terminal rendering else: From 9df8519b980d8981795ad700d5abd48ebaa0fba9 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 11:32:08 +0200 Subject: [PATCH 29/41] Refactors header defaults for table rendering --- .../minimizers/fitting_progress_tracker.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py b/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py index e4540cb9..8931fa5e 100644 --- a/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py +++ b/src/easydiffraction/analysis/minimizers/fitting_progress_tracker.py @@ -20,6 +20,8 @@ SIGNIFICANT_CHANGE_THRESHOLD = 0.01 # 1% threshold FIXED_WIDTH = 17 +DEFAULT_HEADERS = ["iteration", "χ²", "improvement [%]"] +DEFAULT_ALIGNMENTS = ["center", "center", "center"] def format_cell(cell: str, @@ -50,8 +52,6 @@ def __init__(self) -> None: self._best_iteration: Optional[int] = None self._fitting_time: Optional[float] = None - self._headers: List[str] = ["iteration", "χ²", "improvement [%]"] - self._alignments: List[str] = ["center", "center", "center"] self._df_rows: List[List[str]] = [] self._display_handle: Optional[DisplayHandle] = None @@ -161,19 +161,19 @@ def start_tracking(self, minimizer_name: str) -> None: # Show empty table with headers render_table(columns_data=self._df_rows, - columns_alignment=self._alignments, - columns_headers=self._headers, + columns_alignment=DEFAULT_ALIGNMENTS, + columns_headers=DEFAULT_HEADERS, display_handle=self._display_handle) else: # Top border - print("╒" + "╤".join(["═" * FIXED_WIDTH for _ in self._headers]) + "╕") + print("╒" + "╤".join(["═" * FIXED_WIDTH for _ in DEFAULT_HEADERS]) + "╕") # Header row (all centered) - header_row = "│" + "│".join([format_cell(h, align="center") for h in self._headers]) + "│" + header_row = "│" + "│".join([format_cell(h, align="center") for h in DEFAULT_HEADERS]) + "│" print(header_row) # Separator - print("╞" + "╪".join(["═" * FIXED_WIDTH for _ in self._headers]) + "╡") + print("╞" + "╪".join(["═" * FIXED_WIDTH for _ in DEFAULT_HEADERS]) + "╡") def add_tracking_info(self, row: List[str]) -> None: if is_notebook() and display is not None: @@ -182,13 +182,13 @@ def add_tracking_info(self, row: List[str]) -> None: # Show fully updated table render_table(columns_data=self._df_rows, - columns_alignment=self._alignments, - columns_headers=self._headers, + columns_alignment=DEFAULT_ALIGNMENTS, + columns_headers=DEFAULT_HEADERS, display_handle=self._display_handle) else: # Alignments for each column formatted_row = "│" + "│".join([ - format_cell(cell, align=self._alignments[i]) + format_cell(cell, align=DEFAULT_ALIGNMENTS[i]) for i, cell in enumerate(row) ]) + "│" From c562baf75113d8a4e5dc8b64e27c8a224e7e3f01 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 12:53:24 +0200 Subject: [PATCH 30/41] Update category key naming for consistency --- src/easydiffraction/experiments/collections/excluded_regions.py | 2 +- src/easydiffraction/experiments/collections/linked_phases.py | 2 +- src/easydiffraction/sample_models/collections/atom_sites.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/easydiffraction/experiments/collections/excluded_regions.py b/src/easydiffraction/experiments/collections/excluded_regions.py index f3a5fc80..47a28e04 100644 --- a/src/easydiffraction/experiments/collections/excluded_regions.py +++ b/src/easydiffraction/experiments/collections/excluded_regions.py @@ -13,7 +13,7 @@ class ExcludedRegion(Component): @property def category_key(self) -> str: - return "excluded_region" + return "excluded_regions" @property def cif_category_key(self) -> str: diff --git a/src/easydiffraction/experiments/collections/linked_phases.py b/src/easydiffraction/experiments/collections/linked_phases.py index 2ed8d755..1cda0217 100644 --- a/src/easydiffraction/experiments/collections/linked_phases.py +++ b/src/easydiffraction/experiments/collections/linked_phases.py @@ -11,7 +11,7 @@ class LinkedPhase(Component): @property def category_key(self) -> str: - return "linked_phase" + return "linked_phases" @property def cif_category_key(self) -> str: diff --git a/src/easydiffraction/sample_models/collections/atom_sites.py b/src/easydiffraction/sample_models/collections/atom_sites.py index d1647ef5..5bea6540 100644 --- a/src/easydiffraction/sample_models/collections/atom_sites.py +++ b/src/easydiffraction/sample_models/collections/atom_sites.py @@ -12,7 +12,7 @@ class AtomSite(Component): """ @property def category_key(self): - return "atom_site" + return "atom_sites" @property def cif_category_key(self): From c653a90ca7cc4852758bb407829f71bacc5e39d7 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 13:05:54 +0200 Subject: [PATCH 31/41] Corrects category key in atom site test --- tests/unit_tests/sample_models/collections/test_atom_sites.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit_tests/sample_models/collections/test_atom_sites.py b/tests/unit_tests/sample_models/collections/test_atom_sites.py index 6069cf9a..efeff44f 100644 --- a/tests/unit_tests/sample_models/collections/test_atom_sites.py +++ b/tests/unit_tests/sample_models/collections/test_atom_sites.py @@ -38,7 +38,7 @@ def test_atom_site_properties(): # Assertions assert atom_site.cif_category_key == "atom_site" - assert atom_site.category_key == "atom_site" + assert atom_site.category_key == "atom_sites" assert atom_site._entry_id == "O1" From dcdd203da66da911fa9e587c8f5b41ffdaa2d2de Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 13:10:28 +0200 Subject: [PATCH 32/41] Updates tracker start message in the unit test --- .../analysis/minimizers/test_fitting_progress_tracker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit_tests/analysis/minimizers/test_fitting_progress_tracker.py b/tests/unit_tests/analysis/minimizers/test_fitting_progress_tracker.py index a2dcebe1..90d29b23 100644 --- a/tests/unit_tests/analysis/minimizers/test_fitting_progress_tracker.py +++ b/tests/unit_tests/analysis/minimizers/test_fitting_progress_tracker.py @@ -27,7 +27,7 @@ def test_start_tracking(mock_print, tracker): tracker.start_tracking("MockMinimizer") # Assertions - mock_print.assert_any_call("🚀 Starting fitting process with 'MockMinimizer'...") + mock_print.assert_any_call("🚀 Starting fit process with 'MockMinimizer'...") mock_print.assert_any_call("📈 Goodness-of-fit (reduced χ²) change:") assert mock_print.call_count > 2 # Ensure headers and borders are printed From 175a777239909d5ba970512eb45f621e3d06780e Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 15:14:13 +0200 Subject: [PATCH 33/41] Expands parameter table with more details following discussion #24 --- src/easydiffraction/analysis/analysis.py | 26 +++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/easydiffraction/analysis/analysis.py b/src/easydiffraction/analysis/analysis.py index 8e583104..9b623808 100644 --- a/src/easydiffraction/analysis/analysis.py +++ b/src/easydiffraction/analysis/analysis.py @@ -207,8 +207,15 @@ def how_to_access_parameters(self) -> None: print(warning(f"No parameters found.")) return - columns_headers = ['Code variable', 'Unique ID for CIF'] - columns_alignment = ["left", "left"] + columns_headers = ['datablock', + 'category', + 'entry', + 'parameter', + 'How to Access in Python Code', + 'Unique Identifier for CIF Constraints'] + + columns_alignment = ['left', 'left', 'left', 'left', 'left', 'left'] + columns_data = [] project_varname = self.project._varname for datablock_type, params in params.items(): @@ -218,12 +225,17 @@ def how_to_access_parameters(self) -> None: category_key = param.category_key entry_id = param.collection_entry_id param_key = param.name - variable = f"{project_varname}.{datablock_type}['{datablock_id}'].{category_key}" + code_variable = f"{project_varname}.{datablock_type}['{datablock_id}'].{category_key}" if entry_id: - variable += f"['{entry_id}']" - variable += f".{param_key}" - uid = param._generate_human_readable_unique_id() - columns_data.append([variable, uid]) + code_variable += f"['{entry_id}']" + code_variable += f".{param_key}" + cif_uid = param._generate_human_readable_unique_id() + columns_data.append([datablock_id, + category_key, + entry_id, + param_key, + code_variable, + cif_uid]) print(paragraph("How to access parameters")) render_table(columns_headers=columns_headers, From 73fdb97405a0af27920a414237236f145aac8c31 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 15:55:17 +0200 Subject: [PATCH 34/41] Switches data download to 'd-spacing' branch in tests --- .../fitting/test_pair-distribution-function.py | 6 +++--- .../test_powder-diffraction_constant-wavelength.py | 6 +++--- .../fitting/test_powder-diffraction_joint-fit.py | 8 ++++---- .../fitting/test_powder-diffraction_multiphase.py | 2 +- .../fitting/test_powder-diffraction_time-of-flight.py | 4 ++-- .../test_single-fit_pd-neut-tof_Si-DREAM_nc.py | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/functional_tests/fitting/test_pair-distribution-function.py b/tests/functional_tests/fitting/test_pair-distribution-function.py index b6e7a550..85443f84 100644 --- a/tests/functional_tests/fitting/test_pair-distribution-function.py +++ b/tests/functional_tests/fitting/test_pair-distribution-function.py @@ -34,7 +34,7 @@ def test_single_fit_pdf_xray_pd_cw_nacl() -> None: # Set experiment data_file = 'NaCl.gr' ed.download_from_repository(data_file, - branch='docs', + branch='d-spacing', destination=TEMP_DIR) project.experiments.add(name='xray_pdf', sample_form='powder', @@ -90,7 +90,7 @@ def test_single_fit_pdf_neutron_pd_cw_ni(): # Set experiment data_file = 'ni-q27r100-neutron_from-2.gr' ed.download_from_repository(data_file, - branch='docs', + branch='d-spacing', destination=TEMP_DIR) project.experiments.add(name='pdf', sample_form='powder', @@ -144,7 +144,7 @@ def test_single_fit_pdf_neutron_pd_tof_si(): # Set experiment data_file = 'NOM_9999_Si_640g_PAC_50_ff_ftfrgr_up-to-50.gr' ed.download_from_repository(data_file, - branch='docs', + branch='d-spacing', destination=TEMP_DIR) project.experiments.add(name='nomad', sample_form='powder', diff --git a/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py b/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py index 915d71d6..4e7e0b98 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py +++ b/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py @@ -24,7 +24,7 @@ def test_single_fit_neutron_pd_cwl_lbco() -> None: # Set experiment data_file = 'hrpt_lbco.xye' - download_from_repository(data_file, branch='docs', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt = Experiment('hrpt', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_wavelength = 1.494 expt.instrument.calib_twotheta_offset = 0 @@ -114,7 +114,7 @@ def test_single_fit_neutron_pd_cwl_lbco_with_constraints() -> None: # Set experiment data_file = 'hrpt_lbco.xye' - download_from_repository(data_file, branch='docs', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt = Experiment('hrpt', data_path=os.path.join(TEMP_DIR, data_file)) @@ -240,7 +240,7 @@ def test_fit_neutron_pd_cwl_hs() -> None: # Set experiment data_file = 'hrpt_hs.xye' - download_from_repository(data_file, branch='docs', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt = Experiment('hrpt', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_wavelength = 1.89 expt.instrument.calib_twotheta_offset = 0.0 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py b/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py index 10bc068b..da44b0eb 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py +++ b/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py @@ -27,7 +27,7 @@ def test_joint_fit_split_dataset_neutron_pd_cwl_pbso4() -> None: # Set experiments data_file = 'd1a_pbso4_first-half.dat' - download_from_repository(data_file, branch='docs', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt1 = Experiment('npd1', data_path=os.path.join(TEMP_DIR, data_file)) expt1.instrument.setup_wavelength = 1.91 expt1.instrument.calib_twotheta_offset = -0.1406 @@ -51,7 +51,7 @@ def test_joint_fit_split_dataset_neutron_pd_cwl_pbso4() -> None: expt1.background.add(x, y) data_file = 'd1a_pbso4_second-half.dat' - download_from_repository(data_file, branch='docs', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt2 = Experiment('npd2', data_path=os.path.join(TEMP_DIR, data_file)) expt2.instrument.setup_wavelength = 1.91 expt2.instrument.calib_twotheta_offset = -0.1406 @@ -114,7 +114,7 @@ def test_joint_fit_neutron_xray_pd_cwl_pbso4() -> None: # Set experiments data_file = 'd1a_pbso4.dat' - download_from_repository(data_file, branch='docs', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt1 = Experiment('npd', radiation_probe='neutron', data_path=os.path.join(TEMP_DIR, data_file)) expt1.instrument.setup_wavelength = 1.91 expt1.instrument.calib_twotheta_offset = -0.1406 @@ -137,7 +137,7 @@ def test_joint_fit_neutron_xray_pd_cwl_pbso4() -> None: expt1.background.add(x, y) data_file = 'lab_pbso4.dat' - download_from_repository(data_file, branch='docs', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt2 = Experiment('xrd', radiation_probe='xray', data_path=os.path.join(TEMP_DIR, data_file)) expt2.instrument.setup_wavelength = 1.540567 expt2.instrument.calib_twotheta_offset = -0.05181 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py b/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py index 3bafaeb3..64b428d3 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py +++ b/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py @@ -31,7 +31,7 @@ def test_single_fit_neutron_pd_tof_mcstas_lbco_si() -> None: # Set experiment data_file = 'mcstas_lbco-si.xys' - download_from_repository(data_file, branch='fix-multiphase-fit', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt = Experiment('mcstas', beam_mode='time-of-flight', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_twotheta_bank = 94.90931761529106 expt.instrument.calib_d_to_tof_offset = 0.0 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py b/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py index 32c7579d..68a37aa5 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py +++ b/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py @@ -22,7 +22,7 @@ def test_single_fit_neutron_pd_tof_si() -> None: # Set experiment data_file = 'sepd_si.xye' - download_from_repository(data_file, branch='docs', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt = Experiment('sepd', beam_mode='time-of-flight', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_twotheta_bank = 144.845 expt.instrument.calib_d_to_tof_offset = -9.29 @@ -82,7 +82,7 @@ def test_single_fit_neutron_pd_tof_ncaf() -> None: # Set experiment data_file = 'wish_ncaf.xye' - download_from_repository(data_file, branch='docs', destination=TEMP_DIR) + download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) expt = Experiment('wish', beam_mode='time-of-flight', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_twotheta_bank = 152.827 expt.instrument.calib_d_to_tof_offset = -13.7123 diff --git a/tutorials-drafts/test_single-fit_pd-neut-tof_Si-DREAM_nc.py b/tutorials-drafts/test_single-fit_pd-neut-tof_Si-DREAM_nc.py index bc166aa3..84090290 100644 --- a/tutorials-drafts/test_single-fit_pd-neut-tof_Si-DREAM_nc.py +++ b/tutorials-drafts/test_single-fit_pd-neut-tof_Si-DREAM_nc.py @@ -41,7 +41,7 @@ # %% #ed.download_from_repository('NOM_9999_Si_640g_PAC_50_ff_ftfrgr_up-to-50.gr', -# branch='docs', +# branch='d-spacing', # destination='data') # %% From 0d384a3415114613c125aa133f4c7b279bcda2a9 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 15:55:57 +0200 Subject: [PATCH 35/41] Enhances Descriptor and Parameter string representation --- src/easydiffraction/core/objects.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/easydiffraction/core/objects.py b/src/easydiffraction/core/objects.py index 36c3cb63..b3d5d100 100644 --- a/src/easydiffraction/core/objects.py +++ b/src/easydiffraction/core/objects.py @@ -50,7 +50,21 @@ def __init__(self, UidMapHandler.get().add_to_uid_map(self) def __str__(self): - return f"{self.__class__.__name__}: {self.uid} = {self.value} {self.units or ''}".strip() + # Base value string + value_str = f"{self.__class__.__name__}: {self.uid} = {self.value}" + + # Append ± uncertainty if it exists and is nonzero + if hasattr(self, "uncertainty") and getattr(self, "uncertainty") != 0.0: + value_str += f" ± {self.uncertainty}" + + # Append units if available + if self.units: + value_str += f" {self.units}" + + return value_str + + def __repr__(self): + return self.__str__() def _generate_random_unique_id(self) -> str: # Derived class Parameter will use this unique id for the From fc254ea894881974e89eefd7a15bf54c794ca627 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 16:06:55 +0200 Subject: [PATCH 36/41] Improves user notifications for calculator engine imports --- src/easydiffraction/analysis/calculators/calculator_crysfml.py | 3 ++- src/easydiffraction/analysis/calculators/calculator_cryspy.py | 3 ++- src/easydiffraction/analysis/calculators/calculator_pdffit.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/easydiffraction/analysis/calculators/calculator_crysfml.py b/src/easydiffraction/analysis/calculators/calculator_crysfml.py index 5719a4d2..023955e4 100644 --- a/src/easydiffraction/analysis/calculators/calculator_crysfml.py +++ b/src/easydiffraction/analysis/calculators/calculator_crysfml.py @@ -9,8 +9,9 @@ try: from pycrysfml import cfml_py_utilities + print("✅ 'pycrysfml' calculation engine is successfully imported.") except ImportError: - print(warning('"pycrysfml" module not found. This calculator will not work.')) + print("⚠️ 'pycrysfml' module not found. This calculation engine will not be available.") cfml_py_utilities = None diff --git a/src/easydiffraction/analysis/calculators/calculator_cryspy.py b/src/easydiffraction/analysis/calculators/calculator_cryspy.py index 0c579df8..d00cd0f0 100644 --- a/src/easydiffraction/analysis/calculators/calculator_cryspy.py +++ b/src/easydiffraction/analysis/calculators/calculator_cryspy.py @@ -13,8 +13,9 @@ import cryspy from cryspy.procedure_rhochi.rhochi_by_dictionary import rhochi_calc_chi_sq_by_dictionary from cryspy.H_functions_global.function_1_cryspy_objects import str_to_globaln + print("✅ 'cryspy' calculation engine is successfully imported.") except ImportError: - print(warning("'cryspy' module not found. This calculator will not work.")) + print("⚠️ 'cryspy' module not found. This calculation engine will not be available.") cryspy = None diff --git a/src/easydiffraction/analysis/calculators/calculator_pdffit.py b/src/easydiffraction/analysis/calculators/calculator_pdffit.py index 07361fa9..da6a021b 100644 --- a/src/easydiffraction/analysis/calculators/calculator_pdffit.py +++ b/src/easydiffraction/analysis/calculators/calculator_pdffit.py @@ -13,8 +13,9 @@ from diffpy.pdffit2 import redirect_stdout from diffpy.structure.parsers.p_cif import P_cif as pdffit_cif_parser redirect_stdout(open(os.path.devnull, 'w')) # silence the C++ engine output + print("✅ 'pdffit' calculation engine is successfully imported.") except ImportError: - print(warning('"pdffit" module not found. This calculator will not work.')) + print("⚠️ 'pdffit' module not found. This calculation engine will not be available.") pdffit = None From 164210adc024a9ba5a73ded0d602bd78f34a3b61 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 16:27:29 +0200 Subject: [PATCH 37/41] Refactors calculator methods for improved readability --- .../analysis/calculators/calculator_base.py | 35 ++++++++++----- .../calculators/calculator_crysfml.py | 33 +++++++++++--- .../analysis/calculators/calculator_cryspy.py | 44 ++++++++++++------- .../calculators/calculator_factory.py | 20 +++++++-- .../analysis/calculators/calculator_pdffit.py | 15 +++---- 5 files changed, 101 insertions(+), 46 deletions(-) diff --git a/src/easydiffraction/analysis/calculators/calculator_base.py b/src/easydiffraction/analysis/calculators/calculator_base.py index 4b309fbe..c65e935b 100644 --- a/src/easydiffraction/analysis/calculators/calculator_base.py +++ b/src/easydiffraction/analysis/calculators/calculator_base.py @@ -3,6 +3,7 @@ from typing import List, Any from easydiffraction.core.singletons import ConstraintsHandler +from easydiffraction.sample_models.sample_model import SampleModel from easydiffraction.sample_models.sample_models import SampleModels from easydiffraction.experiments.experiment import Experiment @@ -22,16 +23,22 @@ def engine_imported(self) -> bool: pass @abstractmethod - def calculate_structure_factors(self, sample_model: SampleModels, experiment: Experiment) -> None: + def calculate_structure_factors( + self, + sample_model: SampleModel, + experiment: Experiment + ) -> None: """ Calculate structure factors for a single sample model and experiment. """ pass - def calculate_pattern(self, - sample_models: SampleModels, - experiment: Experiment, - called_by_minimizer: bool = False) -> np.ndarray: + def calculate_pattern( + self, + sample_models: SampleModels, + experiment: Experiment, + called_by_minimizer: bool = False + ) -> np.ndarray: """ Calculate the diffraction pattern for multiple sample models and a single experiment. @@ -84,10 +91,12 @@ def calculate_pattern(self, return y_calc_total @abstractmethod - def _calculate_single_model_pattern(self, - sample_model: SampleModels, - experiment: Experiment, - called_by_minimizer: bool) -> np.ndarray: + def _calculate_single_model_pattern( + self, + sample_model: SampleModels, + experiment: Experiment, + called_by_minimizer: bool + ) -> np.ndarray: """ Calculate the diffraction pattern for a single sample model and experiment. @@ -101,7 +110,11 @@ def _calculate_single_model_pattern(self, """ pass - def _get_valid_linked_phases(self, sample_models: SampleModels, experiment: Experiment) -> List[Any]: + def _get_valid_linked_phases( + self, + sample_models: SampleModels, + experiment: Experiment + ) -> List[Any]: """ Get valid linked phases from the experiment. @@ -126,4 +139,4 @@ def _get_valid_linked_phases(self, sample_models: SampleModels, experiment: Expe if not valid_linked_phases: print('Warning: None of the linked phases found in Sample Models. Returning empty pattern.') - return valid_linked_phases \ No newline at end of file + return valid_linked_phases diff --git a/src/easydiffraction/analysis/calculators/calculator_crysfml.py b/src/easydiffraction/analysis/calculators/calculator_crysfml.py index 023955e4..8ca91b7a 100644 --- a/src/easydiffraction/analysis/calculators/calculator_crysfml.py +++ b/src/easydiffraction/analysis/calculators/calculator_crysfml.py @@ -1,12 +1,13 @@ import numpy as np from typing import Any, Dict, List, Union -from .calculator_base import CalculatorBase -from easydiffraction.utils.formatting import warning + from easydiffraction.sample_models.sample_models import SampleModels from easydiffraction.sample_models.sample_models import SampleModel from easydiffraction.experiments.experiment import Experiment from easydiffraction.experiments.experiments import Experiments +from .calculator_base import CalculatorBase + try: from pycrysfml import cfml_py_utilities print("✅ 'pycrysfml' calculation engine is successfully imported.") @@ -26,7 +27,11 @@ class CrysfmlCalculator(CalculatorBase): def name(self) -> str: return "crysfml" - def calculate_structure_factors(self, sample_models: SampleModels, experiments: Experiments) -> None: + def calculate_structure_factors( + self, + sample_models: SampleModels, + experiments: Experiments + ) -> None: """ Call Crysfml to calculate structure factors. @@ -62,7 +67,11 @@ def _calculate_single_model_pattern( y = [] return y - def _adjust_pattern_length(self, pattern: List[float], target_length: int) -> List[float]: + def _adjust_pattern_length( + self, + pattern: List[float], + target_length: int + ) -> List[float]: """ Adjusts the length of the pattern to match the target length. @@ -78,7 +87,11 @@ def _adjust_pattern_length(self, pattern: List[float], target_length: int) -> Li return pattern[:target_length] return pattern - def _crysfml_dict(self, sample_model: SampleModels, experiment: Experiment) -> Dict[str, Union[Experiment, SampleModel]]: + def _crysfml_dict( + self, + sample_model: SampleModels, + experiment: Experiment + ) -> Dict[str, Union[Experiment, SampleModel]]: """ Converts the sample model and experiment into a dictionary format for Crysfml. @@ -96,7 +109,10 @@ def _crysfml_dict(self, sample_model: SampleModels, experiment: Experiment) -> D "experiments": [experiment_dict] } - def _convert_sample_model_to_dict(self, sample_model: SampleModels) -> Dict[str, SampleModel]: + def _convert_sample_model_to_dict( + self, + sample_model: SampleModel + ) -> Dict[str, Any]: """ Converts a sample model into a dictionary format. @@ -134,7 +150,10 @@ def _convert_sample_model_to_dict(self, sample_model: SampleModels) -> Dict[str, return sample_model_dict - def _convert_experiment_to_dict(self, experiment: Experiment) -> Dict[str, Any]: + def _convert_experiment_to_dict( + self, + experiment: Experiment + ) -> Dict[str, Any]: """ Converts an experiment into a dictionary format. diff --git a/src/easydiffraction/analysis/calculators/calculator_cryspy.py b/src/easydiffraction/analysis/calculators/calculator_cryspy.py index d00cd0f0..fe6f0fa2 100644 --- a/src/easydiffraction/analysis/calculators/calculator_cryspy.py +++ b/src/easydiffraction/analysis/calculators/calculator_cryspy.py @@ -1,14 +1,14 @@ +import contextlib import copy import io -import contextlib import numpy as np from typing import Any, Dict, List, Union -from .calculator_base import CalculatorBase -from easydiffraction.utils.formatting import warning from easydiffraction.sample_models.sample_model import SampleModel from easydiffraction.experiments.experiment import Experiment +from .calculator_base import CalculatorBase + try: import cryspy from cryspy.procedure_rhochi.rhochi_by_dictionary import rhochi_calc_chi_sq_by_dictionary @@ -35,9 +35,11 @@ def __init__(self) -> None: super().__init__() self._cryspy_dicts: Dict[str, Dict[str, Any]] = {} - def calculate_structure_factors(self, - sample_model: SampleModel, - experiment: Experiment) -> None: + def calculate_structure_factors( + self, + sample_model: SampleModel, + experiment: Experiment + ) -> None: """ Raises a NotImplementedError as HKL calculation is not implemented. @@ -120,9 +122,11 @@ def _calculate_single_model_pattern( return y_calc - def _recreate_cryspy_dict(self, - sample_model: SampleModel, - experiment: Experiment) -> Dict[str, Any]: + def _recreate_cryspy_dict( + self, + sample_model: SampleModel, + experiment: Experiment + ) -> Dict[str, Any]: """ Recreates the Cryspy dictionary for the given sample model and experiment. @@ -204,9 +208,11 @@ def _recreate_cryspy_dict(self, return cryspy_dict - def _recreate_cryspy_obj(self, - sample_model: SampleModel, - experiment: Experiment) -> Any: + def _recreate_cryspy_obj( + self, + sample_model: SampleModel, + experiment: Experiment + ) -> Any: """ Recreates the Cryspy object for the given sample model and experiment. @@ -233,8 +239,10 @@ def _recreate_cryspy_obj(self, return cryspy_obj - def _convert_sample_model_to_cryspy_cif(self, - sample_model: SampleModel) -> str: + def _convert_sample_model_to_cryspy_cif( + self, + sample_model: SampleModel + ) -> str: """ Converts a sample model to a Cryspy CIF string. @@ -246,9 +254,11 @@ def _convert_sample_model_to_cryspy_cif(self, """ return sample_model.as_cif() - def _convert_experiment_to_cryspy_cif(self, - experiment: Experiment, - linked_phase: Any) -> str: + def _convert_experiment_to_cryspy_cif( + self, + experiment: Experiment, + linked_phase: Any + ) -> str: """ Converts an experiment to a Cryspy CIF string. diff --git a/src/easydiffraction/analysis/calculators/calculator_factory.py b/src/easydiffraction/analysis/calculators/calculator_factory.py index d5c1aca8..cb990505 100644 --- a/src/easydiffraction/analysis/calculators/calculator_factory.py +++ b/src/easydiffraction/analysis/calculators/calculator_factory.py @@ -54,7 +54,10 @@ def show_supported_calculators(cls) -> None: columns_data=columns_data) @classmethod - def create_calculator(cls, calculator_name: str) -> Optional[CalculatorBase]: + def create_calculator( + cls, + calculator_name: str + ) -> Optional[CalculatorBase]: config = cls._supported_calculators().get(calculator_name) if not config: print(error(f"Unknown calculator '{calculator_name}'")) @@ -64,14 +67,25 @@ def create_calculator(cls, calculator_name: str) -> Optional[CalculatorBase]: return config['class']() @classmethod - def register_calculator(cls, calculator_type: str, calculator_cls: Type[CalculatorBase], description: str = 'No description provided.') -> None: + def register_calculator( + cls, + calculator_type: str, + calculator_cls: Type[CalculatorBase], + description: str = 'No description provided.' + ) -> None: cls._potential_calculators[calculator_type] = { 'class': calculator_cls, 'description': description } @classmethod - def register_minimizer(cls, name: str, minimizer_cls: Type[Any], method: Optional[str] = None, description: str = 'No description provided.') -> None: + def register_minimizer( + cls, + name: str, + minimizer_cls: Type[Any], + method: Optional[str] = None, + description: str = 'No description provided.' + ) -> None: cls._available_minimizers[name] = { 'engine': name, 'method': method, diff --git a/src/easydiffraction/analysis/calculators/calculator_pdffit.py b/src/easydiffraction/analysis/calculators/calculator_pdffit.py index da6a021b..cbddd011 100644 --- a/src/easydiffraction/analysis/calculators/calculator_pdffit.py +++ b/src/easydiffraction/analysis/calculators/calculator_pdffit.py @@ -1,12 +1,11 @@ -# SPDX-FileCopyrightText: 2025 EasyDiffraction contributors -# SPDX-License-Identifier: BSD-3-Clause -# © 2021-2025 Contributors to the EasyDiffraction project - import os import re import numpy as np + +from easydiffraction.sample_models.sample_model import SampleModel +from easydiffraction.experiments.experiment import Experiment + from .calculator_base import CalculatorBase -from easydiffraction.utils.formatting import warning try: from diffpy.pdffit2 import PdfFit as pdffit @@ -36,9 +35,9 @@ def calculate_structure_factors(self, sample_models, experiments): return [] def _calculate_single_model_pattern(self, - sample_model, - experiment, - called_by_minimizer=False): + sample_model: SampleModel, + experiment: Experiment, + called_by_minimizer: bool = False): # Create PDF calculator object calculator = pdffit() From 890fa492026ddc890930eb4ba986f60252aaccdd Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 16:59:12 +0200 Subject: [PATCH 38/41] Refactors report generation to improve table rendering --- src/easydiffraction/summary.py | 106 +++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 45 deletions(-) diff --git a/src/easydiffraction/summary.py b/src/easydiffraction/summary.py index 3701f311..691dcbeb 100644 --- a/src/easydiffraction/summary.py +++ b/src/easydiffraction/summary.py @@ -1,5 +1,3 @@ -from __future__ import annotations -from tabulate import tabulate from textwrap import wrap from typing import List @@ -7,6 +5,8 @@ paragraph, section ) +from easydiffraction.utils.utils import render_table + class Summary: """ @@ -30,28 +30,30 @@ def __init__(self, project) -> None: # ------------------------------------------ def show_report(self) -> None: + self.show_project_info() + self.show_crystallographic_data() + self.show_experimental_data() + self.show_fitting_details() + + def show_project_info(self) -> None: """ - Show a report of the entire analysis process, including: - - Project metadata - - Sample models and parameters - - Experiment configurations and results - - Analysis and fitting results + Print the project title and description. """ - - # ------------------------------------------ print(section("Project info")) - # ------------------------------------------ print(paragraph("Title")) print(self.project.info.title) - print(paragraph("Description")) - print('\n'.join(wrap(self.project.info.description, width=60))) + if self.project.info.description: + print(paragraph("Description")) + print('\n'.join(wrap(self.project.info.description, width=60))) - # ------------------------------------------ + def show_crystallographic_data(self) -> None: + """ + Print crystallographic data including phase datablocks, + space groups, cell parameters, and atom sites. + """ print(section("Crystallographic data")) - # ------------------------------------------ - for model in self.project.sample_models._models.values(): print(paragraph("Phase datablock")) print(f'🧩 {model.name}') @@ -60,28 +62,32 @@ def show_report(self) -> None: print(model.space_group.name_h_m.value) print(paragraph("Cell parameters")) - cell_data = [[k.replace('length_', '').replace('angle_', ''), f"{v:.4f}"] for k, v in model.cell.as_dict().items()] - print(tabulate(cell_data, headers=["Parameter", "Value"], tablefmt="fancy_outline")) + columns_alignment: List[str] = ["left", "right"] + cell_data = [[k.replace('length_', '').replace('angle_', ''), f"{v:.5f}"] + for k, v in model.cell.as_dict().items()] + render_table(columns_alignment=columns_alignment, + columns_data=cell_data) print(paragraph("Atom sites")) - atom_table: List[List[str]] = [] + columns_headers = ["Label", "Type", "fract_x", "fract_y", "fract_z", "Occupancy", "B_iso"] + columns_alignment = ["left", "left", "right", "right", "right", "right", "right"] + atom_table = [] for site in model.atom_sites: - fract_x: float = site.fract_x.value - fract_y: float = site.fract_y.value - fract_z: float = site.fract_z.value - b_iso: float = site.b_iso.value - occ: float = site.occupancy.value atom_table.append([ site.label.value, site.type_symbol.value, - f"{fract_x:.5f}", f"{fract_y:.5f}", f"{fract_z:.5f}", - f"{occ:.5f}", f"{b_iso:.5f}" + f"{site.fract_x.value:.5f}", f"{site.fract_y.value:.5f}", f"{site.fract_z.value:.5f}", + f"{site.occupancy.value:.5f}", f"{site.b_iso.value:.5f}" ]) - headers: List[str] = ["Label", "Type", "fract_x", "fract_y", "fract_z", "Occupancy", "B_iso"] - print(tabulate(atom_table, headers=headers, tablefmt="fancy_outline")) + render_table(columns_headers=columns_headers, + columns_alignment=columns_alignment, + columns_data=atom_table) - # ------------------------------------------ + def show_experimental_data(self) -> None: + """ + Print experimental data including experiment datablocks, + types, instrument settings, and peak profile information. + """ print(section("Experiments")) - # ------------------------------------------ for expt in self.project.experiments._experiments.values(): print(paragraph("Experiment datablock")) @@ -93,10 +99,10 @@ def show_report(self) -> None: if hasattr(expt, 'instrument'): if hasattr(expt.instrument, 'setup_wavelength'): print(paragraph("Wavelength")) - print(expt.instrument.setup_wavelength.value) + print(f"{expt.instrument.setup_wavelength.value:.5f}") if hasattr(expt.instrument, 'calib_twotheta_offset'): print(paragraph("2θ offset")) - print(expt.instrument.calib_twotheta_offset.value) + print(f"{expt.instrument.calib_twotheta_offset.value:.5f}") if hasattr(expt, 'peak_profile_type'): print(paragraph("Profile type")) @@ -105,22 +111,30 @@ def show_report(self) -> None: if hasattr(expt, 'peak'): if hasattr(expt.peak, 'broad_gauss_u'): print(paragraph("Peak broadening (Gaussian)")) - print(tabulate([ - ["U", expt.peak.broad_gauss_u.value], - ["V", expt.peak.broad_gauss_v.value], - ["W", expt.peak.broad_gauss_w.value] - ], headers=["Parameter", "Value"], tablefmt="fancy_outline")) - + columns_alignment = ["left", "right"] + columns_data = [ + ["U", f"{expt.peak.broad_gauss_u.value:.5f}"], + ["V", f"{expt.peak.broad_gauss_v.value:.5f}"], + ["W", f"{expt.peak.broad_gauss_w.value:.5f}"] + ] + render_table(columns_alignment=columns_alignment, + columns_data=columns_data) if hasattr(expt.peak, 'broad_lorentz_x'): print(paragraph("Peak broadening (Lorentzian)")) - print(tabulate([ - ["X", expt.peak.broad_lorentz_x.value], - ["Y", expt.peak.broad_lorentz_y.value] - ], headers=["Parameter", "Value"], tablefmt="fancy_outline")) - - # ------------------------------------------ + columns_alignment = ["left", "right"] + columns_data = [ + ["X", f"{expt.peak.broad_lorentz_x.value:.5f}"], + ["Y", f"{expt.peak.broad_lorentz_y.value:.5f}"] + ] + render_table(columns_alignment=columns_alignment, + columns_data=columns_data) + + def show_fitting_details(self) -> None: + """ + Print fitting details including calculation and minimization engines, + and fit quality metrics. + """ print(section("Fitting")) - # ------------------------------------------ print(paragraph("Calculation engine")) print(self.project.analysis.current_calculator) @@ -129,10 +143,12 @@ def show_report(self) -> None: print(self.project.analysis.current_minimizer) print(paragraph("Fit quality")) + columns_alignment = ["left", "right"] fit_metrics = [ ["Goodness-of-fit (reduced χ²)", f"{self.project.analysis.fit_results.reduced_chi_square:.2f}"] ] - print(tabulate(fit_metrics, tablefmt="fancy_outline")) + render_table(columns_alignment=columns_alignment, + columns_data=fit_metrics) # ------------------------------------------ # Exporting From cab178540f58741ec8008e0c57f4f65a115a87bf Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Wed, 6 Aug 2025 17:23:03 +0200 Subject: [PATCH 39/41] Enhances table margins for improved layout --- src/easydiffraction/summary.py | 1 + src/easydiffraction/utils/utils.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/easydiffraction/summary.py b/src/easydiffraction/summary.py index 691dcbeb..609dd3ee 100644 --- a/src/easydiffraction/summary.py +++ b/src/easydiffraction/summary.py @@ -54,6 +54,7 @@ def show_crystallographic_data(self) -> None: space groups, cell parameters, and atom sites. """ print(section("Crystallographic data")) + for model in self.project.sample_models._models.values(): print(paragraph("Phase datablock")) print(f'🧩 {model.name}') diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index ad869f4b..bece2299 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -134,7 +134,9 @@ def make_formatter(align): 'style="' 'border-collapse: collapse; ' 'border: 1px solid #515155; ' - 'margin-left: 0;' + 'margin-left: 0.5em;' + 'margin-top: 0.5em;' + 'margin-bottom: 1em;' '">') # Manually apply text alignment to headers From 945281dfce1f15c0ecd753c501544fedef695b15 Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 8 Aug 2025 10:17:10 +0200 Subject: [PATCH 40/41] Enhances TOF to d-spacing conversion --- src/easydiffraction/utils/utils.py | 89 +++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 20 deletions(-) diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index bece2299..fdeaa1b5 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -195,30 +195,79 @@ def render_cif(cif_text, paragraph_title) -> None: columns_alignment=["left"]) -def tof_to_d(tof, offset, linear, quad): - """ - Convert TOF to d-spacing using quadratic calibration. +def tof_to_d( + tof: np.ndarray, + offset: float, + linear: float, + quad: float, + quad_eps=1e-20 +) -> np.ndarray: + """Convert time-of-flight (TOF) to d-spacing using a quadratic calibration. + + Model: + TOF = offset + linear * d + quad * d² + + The function: + - Uses a linear fallback when the quadratic term is effectively zero. + - Solves the quadratic for d and selects the smallest positive, finite root. + - Returns NaN where no valid solution exists. + - Expects ``tof`` as a NumPy array; output matches its shape. - Parameters: - tof (float or np.ndarray): Time-of-flight in microseconds. - offset (float): Time offset. - linear (float): Linear coefficient. - quad (float): Quadratic coefficient. + Args: + tof (np.ndarray): Time-of-flight values (µs). Must be a NumPy array. + offset (float): Calibration offset (µs). + linear (float): Linear calibration coefficient (µs/Å). + quad (float): Quadratic calibration coefficient (µs/Ų). + quad_eps (float, optional): Threshold to treat ``quad`` as zero. Defaults to 1e-20. Returns: - d (float or np.ndarray): d-spacing in Å. - """ - A = quad - B = linear - C = offset - tof + np.ndarray: d-spacing values (Å), NaN where invalid. - discriminant = B**2 - 4*A*C - if np.any(discriminant < 0): - raise ValueError("Negative discriminant: invalid calibration or TOF range") - - sqrt_discriminant = np.sqrt(discriminant) - d = (-B + sqrt_discriminant) / (2*A) - return d + Raises: + TypeError: If ``tof`` is not a NumPy array or coefficients are not real numbers. + """ + # Type checks + if not isinstance(tof, np.ndarray): + raise TypeError(f"'tof' must be a NumPy array, got {type(tof).__name__}") + for name, val in (("offset", offset), ("linear", linear), ("quad", quad), ("quad_eps", quad_eps)): + if not isinstance(val, (int, float, np.integer, np.floating)): + raise TypeError(f"'{name}' must be a real number, got {type(val).__name__}") + + # Output initialized to NaN + d_out = np.full_like(tof, np.nan, dtype=float) + + # 1) If quadratic term is effectively zero, use linear formula: + # TOF ≈ offset + linear * d => + # d ≈ (tof - offset) / linear + if abs(quad) < quad_eps: + if linear != 0.0: + d = (tof - offset) / linear + # Keep only positive, finite results + valid = np.isfinite(d) & (d > 0) + d_out[valid] = d[valid] + # If B == 0 too, there's no solution; leave NaN + return d_out + + # 2) If quadratic term is significant, solve the quadratic equation: + # TOF = offset + linear * d + quad * d² => + # quad * d² + linear * d + (offset - tof) = 0 + discr = linear**2 - 4 * quad * (offset - tof) + has_real_roots = discr >= 0 + + if np.any(has_real_roots): + sqrt_discr = np.sqrt(discr[has_real_roots]) + + root_1 = (-linear + sqrt_discr) / (2 * quad) + root_2 = (-linear - sqrt_discr) / (2 * quad) + + # Pick smallest positive, finite root per element + roots = np.stack((root_1, root_2), axis=0) # Stack roots for comparison + roots = np.where(np.isfinite(roots) & (roots > 0), roots, np.nan) # Replace non-finite or negative roots with NaN + chosen = np.nanmin(roots, axis=0) # Choose the smallest positive root or NaN if none are valid + + d_out[has_real_roots] = chosen + + return d_out def twotheta_to_d(twotheta, wavelength): From 95cda2109771701bd278fbf75eb083a0a9d975de Mon Sep 17 00:00:00 2001 From: Andrew Sazonov Date: Fri, 8 Aug 2025 10:53:32 +0200 Subject: [PATCH 41/41] Use env variable for default branch data download --- .github/workflows/testing-code.yaml | 5 +++ .github/workflows/testing-tutorials.yaml | 5 +++ src/easydiffraction/utils/utils.py | 44 ++++++++++++------- .../test_pair-distribution-function.py | 3 -- ..._powder-diffraction_constant-wavelength.py | 6 +-- .../test_powder-diffraction_joint-fit.py | 8 ++-- .../test_powder-diffraction_multiphase.py | 2 +- .../test_powder-diffraction_time-of-flight.py | 4 +- ...vanced_joint-fit_pd-neut-xray-cwl_PbSO4.py | 2 - .../basic_single-fit_pd-neut-cwl_LBCO-HRPT.py | 1 - .../cryst-struct_pd-neut-cwl_CoSiO4-D20.py | 2 +- tutorials/cryst-struct_pd-neut-cwl_HS-HRPT.py | 1 - tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py | 1 - ...-struct_pd-neut-tof_multidata_NCAF-WISH.py | 4 +- ...t_pd-neut-tof_multiphase-LBCO-Si_McStas.py | 1 - ...school-2025_analysis-powder-diffraction.py | 2 - tutorials/pdf_pd-neut-cwl_Ni.py | 1 - tutorials/pdf_pd-neut-tof_Si-NOMAD.py | 1 - tutorials/pdf_pd-xray_NaCl.py | 1 - 19 files changed, 51 insertions(+), 43 deletions(-) diff --git a/.github/workflows/testing-code.yaml b/.github/workflows/testing-code.yaml index 297a1832..fa9a1859 100644 --- a/.github/workflows/testing-code.yaml +++ b/.github/workflows/testing-code.yaml @@ -23,6 +23,11 @@ concurrency: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true +env: + # Set the environment variables to be used in all jobs defined in this workflow + # Set the CI_BRANCH environment variable to be the branch name + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + jobs: testing-code: diff --git a/.github/workflows/testing-tutorials.yaml b/.github/workflows/testing-tutorials.yaml index fc0ad649..65a50f3d 100644 --- a/.github/workflows/testing-tutorials.yaml +++ b/.github/workflows/testing-tutorials.yaml @@ -14,6 +14,11 @@ concurrency: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true +env: + # Set the environment variables to be used in all jobs defined in this workflow + # Set the CI_BRANCH environment variable to be the branch name + CI_BRANCH: ${{ github.head_ref || github.ref_name }} + jobs: testing-tutorials: diff --git a/src/easydiffraction/utils/utils.py b/src/easydiffraction/utils/utils.py index fdeaa1b5..b02405f2 100644 --- a/src/easydiffraction/utils/utils.py +++ b/src/easydiffraction/utils/utils.py @@ -20,22 +20,33 @@ IPython = None -def download_from_repository(file_name: str, - branch: str = 'master', - destination: str = 'data') -> None: - """ - This function downloads a file from the EasyDiffraction repository - on GitHub. - :param file_name: The name of the file to download - :param branch: The branch of the repository to download from - :param destination: The destination folder to save the file - :return: None +# Single source of truth for the data repository branch. +# This can be overridden in CI or development environments. +DATA_REPO_BRANCH = ( + os.environ.get("CI_BRANCH") # CI/dev override + or "master" # Default branch for the data repository +) + + +def download_from_repository( + file_name: str, + branch: str | None = None, + destination: str = 'data' +) -> None: + """Download a data file from the EasyDiffraction repository on GitHub. + + Args: + file_name: The file name to fetch (e.g., "NaCl.gr"). + branch: Branch to fetch from. If None, uses DATA_REPO_BRANCH. + destination: Directory to save the file into (created if missing). """ - prefix = 'https://raw.githubusercontent.com' - organisation = 'easyscience' - repository = 'diffraction-lib' - source = 'tutorials/data' - url = f'{prefix}/{organisation}/{repository}/refs/heads/{branch}/{source}/{file_name}' + base = 'https://raw.githubusercontent.com' + org = 'easyscience' + repo = 'diffraction-lib' + branch = branch or DATA_REPO_BRANCH # Use the global branch variable if not provided + path_in_repo = 'tutorials/data' + url = f'{base}/{org}/{repo}/refs/heads/{branch}/{path_in_repo}/{file_name}' + pooch.retrieve( url=url, known_hash=None, @@ -142,7 +153,8 @@ def make_formatter(align): # Manually apply text alignment to headers if not skip_headers: for col, align in zip(columns_headers, columns_alignment): - html = html.replace(f'{col}', f'{col}') + html = html.replace(f'{col}', + f'{col}') # Display or update the table in Jupyter Notebook if display_handle is not None: diff --git a/tests/functional_tests/fitting/test_pair-distribution-function.py b/tests/functional_tests/fitting/test_pair-distribution-function.py index 85443f84..2643133c 100644 --- a/tests/functional_tests/fitting/test_pair-distribution-function.py +++ b/tests/functional_tests/fitting/test_pair-distribution-function.py @@ -34,7 +34,6 @@ def test_single_fit_pdf_xray_pd_cw_nacl() -> None: # Set experiment data_file = 'NaCl.gr' ed.download_from_repository(data_file, - branch='d-spacing', destination=TEMP_DIR) project.experiments.add(name='xray_pdf', sample_form='powder', @@ -90,7 +89,6 @@ def test_single_fit_pdf_neutron_pd_cw_ni(): # Set experiment data_file = 'ni-q27r100-neutron_from-2.gr' ed.download_from_repository(data_file, - branch='d-spacing', destination=TEMP_DIR) project.experiments.add(name='pdf', sample_form='powder', @@ -144,7 +142,6 @@ def test_single_fit_pdf_neutron_pd_tof_si(): # Set experiment data_file = 'NOM_9999_Si_640g_PAC_50_ff_ftfrgr_up-to-50.gr' ed.download_from_repository(data_file, - branch='d-spacing', destination=TEMP_DIR) project.experiments.add(name='nomad', sample_form='powder', diff --git a/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py b/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py index 4e7e0b98..0c699dc2 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py +++ b/tests/functional_tests/fitting/test_powder-diffraction_constant-wavelength.py @@ -24,7 +24,7 @@ def test_single_fit_neutron_pd_cwl_lbco() -> None: # Set experiment data_file = 'hrpt_lbco.xye' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt = Experiment('hrpt', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_wavelength = 1.494 expt.instrument.calib_twotheta_offset = 0 @@ -114,7 +114,7 @@ def test_single_fit_neutron_pd_cwl_lbco_with_constraints() -> None: # Set experiment data_file = 'hrpt_lbco.xye' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt = Experiment('hrpt', data_path=os.path.join(TEMP_DIR, data_file)) @@ -240,7 +240,7 @@ def test_fit_neutron_pd_cwl_hs() -> None: # Set experiment data_file = 'hrpt_hs.xye' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt = Experiment('hrpt', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_wavelength = 1.89 expt.instrument.calib_twotheta_offset = 0.0 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py b/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py index da44b0eb..9b9f3469 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py +++ b/tests/functional_tests/fitting/test_powder-diffraction_joint-fit.py @@ -27,7 +27,7 @@ def test_joint_fit_split_dataset_neutron_pd_cwl_pbso4() -> None: # Set experiments data_file = 'd1a_pbso4_first-half.dat' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt1 = Experiment('npd1', data_path=os.path.join(TEMP_DIR, data_file)) expt1.instrument.setup_wavelength = 1.91 expt1.instrument.calib_twotheta_offset = -0.1406 @@ -51,7 +51,7 @@ def test_joint_fit_split_dataset_neutron_pd_cwl_pbso4() -> None: expt1.background.add(x, y) data_file = 'd1a_pbso4_second-half.dat' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt2 = Experiment('npd2', data_path=os.path.join(TEMP_DIR, data_file)) expt2.instrument.setup_wavelength = 1.91 expt2.instrument.calib_twotheta_offset = -0.1406 @@ -114,7 +114,7 @@ def test_joint_fit_neutron_xray_pd_cwl_pbso4() -> None: # Set experiments data_file = 'd1a_pbso4.dat' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt1 = Experiment('npd', radiation_probe='neutron', data_path=os.path.join(TEMP_DIR, data_file)) expt1.instrument.setup_wavelength = 1.91 expt1.instrument.calib_twotheta_offset = -0.1406 @@ -137,7 +137,7 @@ def test_joint_fit_neutron_xray_pd_cwl_pbso4() -> None: expt1.background.add(x, y) data_file = 'lab_pbso4.dat' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt2 = Experiment('xrd', radiation_probe='xray', data_path=os.path.join(TEMP_DIR, data_file)) expt2.instrument.setup_wavelength = 1.540567 expt2.instrument.calib_twotheta_offset = -0.05181 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py b/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py index 64b428d3..e790794e 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py +++ b/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py @@ -31,7 +31,7 @@ def test_single_fit_neutron_pd_tof_mcstas_lbco_si() -> None: # Set experiment data_file = 'mcstas_lbco-si.xys' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt = Experiment('mcstas', beam_mode='time-of-flight', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_twotheta_bank = 94.90931761529106 expt.instrument.calib_d_to_tof_offset = 0.0 diff --git a/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py b/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py index 68a37aa5..f3ac7a4e 100644 --- a/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py +++ b/tests/functional_tests/fitting/test_powder-diffraction_time-of-flight.py @@ -22,7 +22,7 @@ def test_single_fit_neutron_pd_tof_si() -> None: # Set experiment data_file = 'sepd_si.xye' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt = Experiment('sepd', beam_mode='time-of-flight', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_twotheta_bank = 144.845 expt.instrument.calib_d_to_tof_offset = -9.29 @@ -82,7 +82,7 @@ def test_single_fit_neutron_pd_tof_ncaf() -> None: # Set experiment data_file = 'wish_ncaf.xye' - download_from_repository(data_file, branch='d-spacing', destination=TEMP_DIR) + download_from_repository(data_file, destination=TEMP_DIR) expt = Experiment('wish', beam_mode='time-of-flight', data_path=os.path.join(TEMP_DIR, data_file)) expt.instrument.setup_twotheta_bank = 152.827 expt.instrument.calib_d_to_tof_offset = -13.7123 diff --git a/tutorials/advanced_joint-fit_pd-neut-xray-cwl_PbSO4.py b/tutorials/advanced_joint-fit_pd-neut-xray-cwl_PbSO4.py index 9b246e01..375d2fcc 100644 --- a/tutorials/advanced_joint-fit_pd-neut-xray-cwl_PbSO4.py +++ b/tutorials/advanced_joint-fit_pd-neut-xray-cwl_PbSO4.py @@ -68,7 +68,6 @@ # %% download_from_repository('d1a_pbso4.dat', - branch='develop', destination='data') # %% [markdown] @@ -134,7 +133,6 @@ # %% download_from_repository('lab_pbso4.dat', - branch='develop', destination='data') # %% [markdown] diff --git a/tutorials/basic_single-fit_pd-neut-cwl_LBCO-HRPT.py b/tutorials/basic_single-fit_pd-neut-cwl_LBCO-HRPT.py index f9cfde66..2c9708c0 100644 --- a/tutorials/basic_single-fit_pd-neut-cwl_LBCO-HRPT.py +++ b/tutorials/basic_single-fit_pd-neut-cwl_LBCO-HRPT.py @@ -196,7 +196,6 @@ # %% ed.download_from_repository('hrpt_lbco.xye', - branch='develop', destination='data') # %% [markdown] diff --git a/tutorials/cryst-struct_pd-neut-cwl_CoSiO4-D20.py b/tutorials/cryst-struct_pd-neut-cwl_CoSiO4-D20.py index 4bb7c55e..3f121be9 100644 --- a/tutorials/cryst-struct_pd-neut-cwl_CoSiO4-D20.py +++ b/tutorials/cryst-struct_pd-neut-cwl_CoSiO4-D20.py @@ -80,7 +80,7 @@ # #### Download Measured Data # %% -download_from_repository('co2sio4_d20.xye', branch='develop', destination='data') +download_from_repository('co2sio4_d20.xye', destination='data') # %% [markdown] # #### Create Experiment diff --git a/tutorials/cryst-struct_pd-neut-cwl_HS-HRPT.py b/tutorials/cryst-struct_pd-neut-cwl_HS-HRPT.py index c456697d..61f7275b 100644 --- a/tutorials/cryst-struct_pd-neut-cwl_HS-HRPT.py +++ b/tutorials/cryst-struct_pd-neut-cwl_HS-HRPT.py @@ -79,7 +79,6 @@ # %% download_from_repository('hrpt_hs.xye', - branch='develop', destination='data') # %% [markdown] diff --git a/tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py b/tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py index 53c42c82..d97876dc 100644 --- a/tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py +++ b/tutorials/cryst-struct_pd-neut-tof_Si-SEPD.py @@ -54,7 +54,6 @@ # %% download_from_repository('sepd_si.xye', - branch='develop', destination='data') # %% [markdown] diff --git a/tutorials/cryst-struct_pd-neut-tof_multidata_NCAF-WISH.py b/tutorials/cryst-struct_pd-neut-tof_multidata_NCAF-WISH.py index d596c616..d0221244 100644 --- a/tutorials/cryst-struct_pd-neut-tof_multidata_NCAF-WISH.py +++ b/tutorials/cryst-struct_pd-neut-tof_multidata_NCAF-WISH.py @@ -61,10 +61,10 @@ # #### Download Measured Data # %% -download_from_repository('wish_ncaf_5_6.xys', branch='develop', destination='data') +download_from_repository('wish_ncaf_5_6.xys', destination='data') # %% -download_from_repository('wish_ncaf_4_7.xys', branch='develop', destination='data') +download_from_repository('wish_ncaf_4_7.xys', destination='data') # %% [markdown] # #### Create Experiment diff --git a/tutorials/cryst-struct_pd-neut-tof_multiphase-LBCO-Si_McStas.py b/tutorials/cryst-struct_pd-neut-tof_multiphase-LBCO-Si_McStas.py index 52e068b2..e3194813 100644 --- a/tutorials/cryst-struct_pd-neut-tof_multiphase-LBCO-Si_McStas.py +++ b/tutorials/cryst-struct_pd-neut-tof_multiphase-LBCO-Si_McStas.py @@ -83,7 +83,6 @@ # %% download_from_repository('mcstas_lbco-si.xye', - branch='develop', destination='data') # %% [markdown] diff --git a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py index 9b8146ac..a2511852 100644 --- a/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py +++ b/tutorials/dmsc-summer-school-2025_analysis-powder-diffraction.py @@ -87,7 +87,6 @@ # To load the measured data from the EasyDiffraction repository, as # Google Colab does not have the data files needed for this tutorial. ed.download_from_repository('reduced_Si.xye', - branch='d-spacing', destination='data') # %% @@ -538,7 +537,6 @@ # To load the measured data from the EasyDiffraction repository, as # Google Colab does not have the data files needed for this tutorial. ed.download_from_repository('reduced_LBCO.xye', - branch='d-spacing', destination='data') # %% diff --git a/tutorials/pdf_pd-neut-cwl_Ni.py b/tutorials/pdf_pd-neut-cwl_Ni.py index 18afce24..30af3425 100644 --- a/tutorials/pdf_pd-neut-cwl_Ni.py +++ b/tutorials/pdf_pd-neut-cwl_Ni.py @@ -49,7 +49,6 @@ # %% ed.download_from_repository('ni-q27r100-neutron_from-2.gr', - branch='develop', destination='data') # %% diff --git a/tutorials/pdf_pd-neut-tof_Si-NOMAD.py b/tutorials/pdf_pd-neut-tof_Si-NOMAD.py index 97113067..6bc98f2f 100644 --- a/tutorials/pdf_pd-neut-tof_Si-NOMAD.py +++ b/tutorials/pdf_pd-neut-tof_Si-NOMAD.py @@ -48,7 +48,6 @@ # %% ed.download_from_repository('NOM_9999_Si_640g_PAC_50_ff_ftfrgr_up-to-50.gr', - branch='develop', destination='data') # %% diff --git a/tutorials/pdf_pd-xray_NaCl.py b/tutorials/pdf_pd-xray_NaCl.py index c58db05a..4d8e0811 100644 --- a/tutorials/pdf_pd-xray_NaCl.py +++ b/tutorials/pdf_pd-xray_NaCl.py @@ -57,7 +57,6 @@ # %% ed.download_from_repository('NaCl.gr', - branch='develop', destination='data') # %%