diff --git a/.github/workflows/testing-code.yaml b/.github/workflows/testing-code.yaml index fa32aec..297a183 100644 --- a/.github/workflows/testing-code.yaml +++ b/.github/workflows/testing-code.yaml @@ -62,7 +62,7 @@ jobs: - name: Install Python dependencies shell: bash - run: python -m pip install -r requirements.txt + run: python -m pip install . - name: Run Python unit tests shell: bash diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 3f400db..9f8230a 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -72,6 +72,7 @@ nav: - HS pd-neut-cwl: tutorials/cryst-struct_pd-neut-cwl_HS-HRPT.ipynb - Si pd-neut-tof: tutorials/cryst-struct_pd-neut-tof_Si-SEPD.ipynb - NCAF pd-neut-tof: tutorials/cryst-struct_pd-neut-tof_NCAF-WISH.ipynb + - LBCO+Si McStas: tutorials/cryst-struct_pd-neut-tof_multphase-LBCO-Si_McStas.ipynb - Pair Distribution Function: - Ni pd-neut-cwl: tutorials/pdf_pd-neut-cwl_Ni.ipynb - Si pd-neut-tof: tutorials/pdf_pd-neut-tof_Si-NOMAD.ipynb diff --git a/src/easydiffraction/analysis/calculators/calculator_cryspy.py b/src/easydiffraction/analysis/calculators/calculator_cryspy.py index d80c717..4264f33 100644 --- a/src/easydiffraction/analysis/calculators/calculator_cryspy.py +++ b/src/easydiffraction/analysis/calculators/calculator_cryspy.py @@ -4,8 +4,7 @@ from .calculator_base import CalculatorBase from easydiffraction.utils.formatting import warning -from easydiffraction.sample_models.sample_models import SampleModels -from easydiffraction.experiments.experiments import Experiments +from easydiffraction.sample_models.sample_model import SampleModel from easydiffraction.experiments.experiment import Experiment try: @@ -33,19 +32,21 @@ def __init__(self) -> None: super().__init__() self._cryspy_dicts: Dict[str, Dict[str, Any]] = {} - def calculate_structure_factors(self, sample_models: SampleModels, experiments: Experiments) -> None: + def calculate_structure_factors(self, + sample_model: SampleModel, + experiment: Experiment) -> None: """ Raises a NotImplementedError as HKL calculation is not implemented. Args: - sample_models: The sample models to calculate structure factors for. - experiments: The experiments associated with the sample models. + sample_model: The sample model to calculate structure factors for. + experiment: The experiment associated with the sample models. """ raise NotImplementedError("HKL calculation is not implemented for CryspyCalculator.") def _calculate_single_model_pattern( self, - sample_model: SampleModels, + sample_model: SampleModel, experiment: Experiment, called_by_minimizer: bool = False ) -> Union[np.ndarray, List[float]]: @@ -65,8 +66,10 @@ def _calculate_single_model_pattern( Returns: The calculated diffraction pattern as a NumPy array or a list of floats. """ + combined_name = f"{sample_model.name}_{experiment.name}" + if called_by_minimizer: - if self._cryspy_dicts and experiment.name in self._cryspy_dicts: + if self._cryspy_dicts and combined_name in self._cryspy_dicts: cryspy_dict = self._recreate_cryspy_dict(sample_model, experiment) else: cryspy_obj = self._recreate_cryspy_obj(sample_model, experiment) @@ -75,7 +78,7 @@ def _calculate_single_model_pattern( cryspy_obj = self._recreate_cryspy_obj(sample_model, experiment) cryspy_dict = cryspy_obj.get_dictionary() - self._cryspy_dicts[experiment.name] = copy.deepcopy(cryspy_dict) + self._cryspy_dicts[combined_name] = copy.deepcopy(cryspy_dict) cryspy_in_out_dict: Dict[str, Any] = {} rhochi_calc_chi_sq_by_dictionary( @@ -99,14 +102,16 @@ def _calculate_single_model_pattern( try: signal_plus = cryspy_in_out_dict[cryspy_block_name]['signal_plus'] signal_minus = cryspy_in_out_dict[cryspy_block_name]['signal_minus'] - y_calc_total = signal_plus + signal_minus + y_calc = signal_plus + signal_minus except KeyError: print(f"[CryspyCalculator] Error: No calculated data for {cryspy_block_name}") return [] - return y_calc_total + return y_calc - def _recreate_cryspy_dict(self, sample_model: SampleModels, 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. @@ -117,7 +122,8 @@ def _recreate_cryspy_dict(self, sample_model: SampleModels, experiment: Experime Returns: The updated Cryspy dictionary. """ - cryspy_dict = copy.deepcopy(self._cryspy_dicts[experiment.name]) + combined_name = f"{sample_model.name}_{experiment.name}" + cryspy_dict = copy.deepcopy(self._cryspy_dicts[combined_name]) cryspy_model_id = f'crystal_{sample_model.name}' cryspy_model_dict = cryspy_dict[cryspy_model_id] @@ -185,7 +191,9 @@ def _recreate_cryspy_dict(self, sample_model: SampleModels, experiment: Experime return cryspy_dict - def _recreate_cryspy_obj(self, sample_model: SampleModels, 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. @@ -212,7 +220,8 @@ def _recreate_cryspy_obj(self, sample_model: SampleModels, experiment: Experimen return cryspy_obj - def _convert_sample_model_to_cryspy_cif(self, sample_model: SampleModels) -> str: + def _convert_sample_model_to_cryspy_cif(self, + sample_model: SampleModel) -> str: """ Converts a sample model to a Cryspy CIF string. @@ -224,7 +233,9 @@ def _convert_sample_model_to_cryspy_cif(self, sample_model: SampleModels) -> str """ 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/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py b/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py new file mode 100644 index 0000000..d4a5c36 --- /dev/null +++ b/tests/functional_tests/fitting/test_powder-diffraction_multiphase.py @@ -0,0 +1,92 @@ +import os +import tempfile +from numpy.testing import assert_almost_equal + +from easydiffraction import ( + Project, + SampleModel, + Experiment, + download_from_repository +) + +TEMP_DIR = tempfile.gettempdir() + + +def test_single_fit_neutron_pd_tof_mcstas_lbco_si() -> None: + # Set sample models + model_1 = SampleModel('lbco') + model_1.space_group.name_h_m = 'P m -3 m' + model_1.space_group.it_coordinate_system_code = '1' + model_1.cell.length_a = 3.8909 + model_1.atom_sites.add('La', 'La', 0, 0, 0, wyckoff_letter='a', b_iso=0.2, occupancy=0.5) + model_1.atom_sites.add('Ba', 'Ba', 0, 0, 0, wyckoff_letter='a', b_iso=0.2, occupancy=0.5) + model_1.atom_sites.add('Co', 'Co', 0.5, 0.5, 0.5, wyckoff_letter='b', b_iso=0.2567) + model_1.atom_sites.add('O', 'O', 0, 0.5, 0.5, wyckoff_letter='c', b_iso=1.4041) + + model_2 = SampleModel('si') + model_2.space_group.name_h_m = 'F d -3 m' + model_2.space_group.it_coordinate_system_code = '2' + model_2.cell.length_a = 5.43146 + model_2.atom_sites.add('Si', 'Si', 0.0, 0.0, 0.0, wyckoff_letter='a', b_iso=0.0) + + # Set experiment + data_file = 'mcstas_lbco-si.xys' + download_from_repository(data_file, branch='fix-multiphase-fit', 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 + expt.instrument.calib_d_to_tof_linear = 58724.76869981215 + expt.instrument.calib_d_to_tof_quad = -0.00001 + expt.peak_profile_type = 'pseudo-voigt * ikeda-carpenter' + expt.peak.broad_gauss_sigma_0 = 45137 + expt.peak.broad_gauss_sigma_1 = -52394 + expt.peak.broad_gauss_sigma_2 = 22998 + expt.peak.broad_mix_beta_0 = 0.0055 + expt.peak.broad_mix_beta_1 = 0.0041 + expt.peak.asym_alpha_0 = 0.0 + expt.peak.asym_alpha_1 = 0.0097 + expt.linked_phases.add('lbco', scale=4.0) + expt.linked_phases.add('si', scale=0.2) + for x in range(45000, 115000, 5000): + expt.background.add(x=x, y=0.2) + + # Create project + project = Project() + project.sample_models.add(model_1) + project.sample_models.add(model_2) + project.experiments.add(expt) + + # Prepare for fitting + project.analysis.current_calculator = 'cryspy' + project.analysis.current_minimizer = 'lmfit (leastsq)' + + # Select fitting parameters + model_1.cell.length_a.free = True + model_1.atom_sites['La'].b_iso.free = True + model_1.atom_sites['Ba'].b_iso.free = True + model_1.atom_sites['Co'].b_iso.free = True + model_1.atom_sites['O'].b_iso.free = True + model_2.cell.length_a.free = True + model_2.atom_sites['Si'].b_iso.free = True + expt.linked_phases['lbco'].scale.free = True + expt.linked_phases['si'].scale.free = True + expt.peak.broad_gauss_sigma_0.free = True + expt.peak.broad_gauss_sigma_1.free = True + expt.peak.broad_gauss_sigma_2.free = True + expt.peak.asym_alpha_1.free = True + expt.peak.broad_mix_beta_0.free = True + expt.peak.broad_mix_beta_1.free = True + for point in expt.background: + point.y.free = True + + # Perform fit + project.analysis.fit() + + # Compare fit quality + assert_almost_equal(project.analysis.fit_results.reduced_chi_square, + desired=2.87, + decimal=1) + + +if __name__ == '__main__': + test_single_fit_neutron_pd_tof_mcstas_lbco_si() diff --git a/tests/unit_tests/analysis/calculators/test_calculator_cryspy.py b/tests/unit_tests/analysis/calculators/test_calculator_cryspy.py index ad9703a..f5f1633 100644 --- a/tests/unit_tests/analysis/calculators/test_calculator_cryspy.py +++ b/tests/unit_tests/analysis/calculators/test_calculator_cryspy.py @@ -68,7 +68,7 @@ def test_calculate_single_model_pattern(mock_rhochi_calc, mock_sample_model, moc def test_recreate_cryspy_dict(mock_sample_model, mock_experiment): calculator = CryspyCalculator() calculator._cryspy_dicts = { - "experiment1": { + "sample1_experiment1": { "pd_experiment1": { "offset_ttheta": [0.1], "wavelength": [1.54], diff --git a/tutorials/cryst-struct_pd-neut-tof_multphase-LBCO-Si_McStas.py b/tutorials/cryst-struct_pd-neut-tof_multphase-LBCO-Si_McStas.py new file mode 100644 index 0000000..179d69c --- /dev/null +++ b/tutorials/cryst-struct_pd-neut-tof_multphase-LBCO-Si_McStas.py @@ -0,0 +1,279 @@ +# %% [markdown] +# # Structure Refinement: LBCO + Si, NPD McStas +# +# This example demonstrates a Rietveld refinement of La0.5Ba0.5CoO3 crystal +# structure with a small amount of Si phase using time-of-flight neutron powder +# diffraction data simulated with McStas. + +# %% [markdown] +# ## Import Library + +# %% +from easydiffraction import ( + Project, + SampleModel, + Experiment, + download_from_repository +) + +# %% [markdown] +# ## Define Sample Models +# +# This section shows how to add sample models and modify their parameters. +# +# ### Create Sample Model 1: LBCO + +# %% +model_1 = SampleModel('lbco') + +# %% [markdown] +# ### Set Space Group + +# %% +model_1.space_group.name_h_m = 'P m -3 m' +model_1.space_group.it_coordinate_system_code = '1' + +# %% [markdown] +# ### Set Unit Cell + +# %% +model_1.cell.length_a = 3.8909 + +# %% [markdown] +# ### Set Atom Sites + +# %% +model_1.atom_sites.add('La', 'La', 0, 0, 0, wyckoff_letter='a', b_iso=0.2, occupancy=0.5) +model_1.atom_sites.add('Ba', 'Ba', 0, 0, 0, wyckoff_letter='a', b_iso=0.2, occupancy=0.5) +model_1.atom_sites.add('Co', 'Co', 0.5, 0.5, 0.5, wyckoff_letter='b', b_iso=0.2567) +model_1.atom_sites.add('O', 'O', 0, 0.5, 0.5, wyckoff_letter='c', b_iso=1.4041) + +# ### Create Sample Model 2: Si + +# %% +model_2 = SampleModel('si') + +# %% [markdown] +# ### Set Space Group + +# %% +model_2.space_group.name_h_m = 'F d -3 m' +model_2.space_group.it_coordinate_system_code = '2' + +# %% [markdown] +# ### Set Unit Cell + +# %% +model_2.cell.length_a = 5.43146 + +# %% [markdown] +# ### Set Atom Sites + +# %% +model_2.atom_sites.add('Si', 'Si', 0.0, 0.0, 0.0, wyckoff_letter='a', b_iso=0.0) + +# %% [markdown] +# ## Define Experiment +# +# This section shows how to add experiments, configure their parameters, and +# link the sample models defined in the previous step. +# +# ### Experiment +# +# #### Download Data + +# %% +download_from_repository('mcstas_lbco-si.xys', + branch='fix-multiphase-fit', + destination='data') + +# %% [markdown] +# #### Create Experiment + +# %% +experiment = Experiment('mcstas', + sample_form='powder', + beam_mode='time-of-flight', + radiation_probe='neutron', + scattering_type='bragg', + data_path='data/mcstas_lbco-si.xys') + +# %% [markdown] +# #### Set Instrument + +# %% +experiment.instrument.setup_twotheta_bank = 94.90931761529106 +experiment.instrument.calib_d_to_tof_offset = 0.0 +experiment.instrument.calib_d_to_tof_linear = 58724.76869981215 +experiment.instrument.calib_d_to_tof_quad = -0.00001 + +# %% [markdown] +# #### Set Peak Profile + +# %% +#experiment.peak_profile_type = 'pseudo-voigt * ikeda-carpenter' +experiment.peak.broad_gauss_sigma_0 = 45137 +experiment.peak.broad_gauss_sigma_1 = -52394 +experiment.peak.broad_gauss_sigma_2 = 22998 +experiment.peak.broad_mix_beta_0 = 0.0055 +experiment.peak.broad_mix_beta_1 = 0.0041 +experiment.peak.asym_alpha_0 = 0 +experiment.peak.asym_alpha_1 = 0.0097 + +# %% [markdown] +# #### Set Background + +# %% [markdown] +# Select the background type. + +# %% +experiment.background_type = 'line-segment' + +# %% [markdown] +# Add background points. + +# %% +experiment.background.add(x=45000, y=0.2) +experiment.background.add(x=50000, y=0.2) +experiment.background.add(x=55000, y=0.2) +experiment.background.add(x=65000, y=0.2) +experiment.background.add(x=70000, y=0.2) +experiment.background.add(x=75000, y=0.2) +experiment.background.add(x=80000, y=0.2) +experiment.background.add(x=85000, y=0.2) +experiment.background.add(x=90000, y=0.2) +experiment.background.add(x=95000, y=0.2) +experiment.background.add(x=100000, y=0.2) +experiment.background.add(x=105000, y=0.2) +experiment.background.add(x=110000, y=0.2) + +# %% [markdown] +# #### Set Linked Phases + +# %% +experiment.linked_phases.add('lbco', scale=4.0) +experiment.linked_phases.add('si', scale=0.2) + +# %% [markdown] +# ## Define Project +# +# The project object is used to manage sample models, experiments, and analysis. +# +# ### Create Project + +# %% +project = Project() + +# %% [markdown] +# ### Set Plotting Engine + +# %% +project.plotter.engine = 'plotly' + +# %% [markdown] +# ### Add Sample Models + +# %% +project.sample_models.add(model_1) +project.sample_models.add(model_2) + +# %% [markdown] +# ### Show Defined Sample Models + +# %% +project.sample_models.show_names() + +# %% [markdown] +# ### Add Experiments + +# %% +project.experiments.add(experiment) + +# %% [markdown] +# ## Analysis +# +# This section outlines the analysis process, including how to configure calculation and fitting engines. +# +# ### Set Calculator + +# %% +project.analysis.current_calculator = 'cryspy' + +# %% [markdown] +# ### Set Fit Mode + +# %% +#project.analysis.fit_mode = 'joint' + +# %% [markdown] +# ### Set Minimizer + +# %% +project.analysis.current_minimizer = 'lmfit (leastsq)' + +# %% [markdown] +# ### Set Fitting Parameters +# +# Set sample model parameters to be optimized. + +# %% +model_1.cell.length_a.free = True +model_1.atom_sites['La'].b_iso.free = True +model_1.atom_sites['Ba'].b_iso.free = True +model_1.atom_sites['Co'].b_iso.free = True +model_1.atom_sites['O'].b_iso.free = True + +model_2.cell.length_a.free = True +model_2.atom_sites['Si'].b_iso.free = True + +# %% [markdown] +# Set experiment parameters to be optimized. + +# %% +experiment.linked_phases['lbco'].scale.free = True +experiment.linked_phases['si'].scale.free = True + +experiment.peak.broad_gauss_sigma_0.free = True +experiment.peak.broad_gauss_sigma_1.free = True +experiment.peak.broad_gauss_sigma_2.free = True + +experiment.peak.asym_alpha_1.free = True +experiment.peak.broad_mix_beta_0.free = True +experiment.peak.broad_mix_beta_1.free = True + +for point in experiment.background: + point.y.free = True + +# %% [markdown] +# ### Set Constraints + +# %% +project.analysis.aliases.add( + label='biso_La', + param_uid=project.sample_models['lbco'].atom_sites['La'].b_iso.uid +) +project.analysis.aliases.add( + label='biso_Ba', + param_uid=project.sample_models['lbco'].atom_sites['Ba'].b_iso.uid +) + +# %% +project.analysis.constraints.add( + lhs_alias='biso_Ba', + rhs_expr='biso_La' +) + +# %% +project.analysis.apply_constraints() + +# %% [markdown] +# ### Run Fit + +# %% +project.analysis.fit() + +# %% [markdown] +# ### Plot Measured vs Calculated + +# %% +project.plot_meas_vs_calc(expt_name='mcstas', show_residual=False) diff --git a/tutorials/data/mcstas_lbco-si.xys b/tutorials/data/mcstas_lbco-si.xys new file mode 100644 index 0000000..c16b77f --- /dev/null +++ b/tutorials/data/mcstas_lbco-si.xys @@ -0,0 +1,634 @@ + 41168.1289 0.2154 0.0249 + 41273.8555 0.2609 0.0333 + 41379.5781 0.3043 0.0355 + 41485.3047 0.4737 0.0421 + 41591.0273 0.6003 0.0420 + 41696.7539 0.6017 0.0397 + 41802.4766 0.5012 0.0381 + 41908.2031 0.3770 0.0346 + 42013.9297 0.2753 0.0319 + 42119.6523 0.2618 0.0283 + 42225.3789 0.2928 0.0315 + 42331.1016 0.3578 0.0416 + 42436.8281 0.3769 0.0385 + 42542.5547 0.4158 0.0445 + 42648.2773 0.3780 0.0419 + 42754.0039 0.3199 0.0331 + 42859.7266 0.2659 0.0286 + 42965.4531 0.2573 0.0309 + 43071.1797 0.2578 0.0279 + 43176.9023 0.2437 0.0263 + 43282.6289 0.2292 0.0267 + 43388.3516 0.2510 0.0281 + 43494.0781 0.2520 0.0284 + 43599.8047 0.2966 0.0293 + 43705.5273 0.5918 0.0472 + 43811.2539 1.1285 0.0659 + 43916.9766 1.1347 0.0558 + 44022.7031 0.8778 0.0414 + 44128.4297 0.5661 0.0319 + 44234.1523 0.3979 0.0300 + 44339.8789 0.2767 0.0283 + 44445.6016 0.3726 0.0331 + 44551.3281 0.5620 0.0375 + 44657.0508 0.8794 0.0434 + 44762.7773 1.0497 0.0447 + 44868.5039 0.8066 0.0356 + 44974.2266 0.5838 0.0317 + 45079.9531 0.3755 0.0259 + 45185.6758 0.3224 0.0287 + 45291.4023 0.2586 0.0251 + 45397.1289 0.2654 0.0251 + 45502.8516 0.3204 0.0337 + 45608.5781 0.2951 0.0270 + 45714.3008 0.3108 0.0268 + 45820.0273 0.2587 0.0236 + 45925.7539 0.2953 0.0250 + 46031.4766 0.3026 0.0267 + 46137.2031 0.3904 0.0443 + 46242.9258 0.3379 0.0324 + 46348.6523 0.7253 0.0608 + 46454.3789 1.4441 0.0870 + 46560.1016 2.1608 0.1058 + 46665.8281 2.0486 0.0924 + 46771.5508 1.2824 0.0587 + 46877.2773 0.5866 0.0339 + 46983.0000 0.3739 0.0269 + 47088.7266 0.3121 0.0247 + 47194.4531 0.2631 0.0229 + 47300.1758 0.2723 0.0234 + 47405.9023 0.2413 0.0215 + 47511.6250 0.2524 0.0232 + 47617.3516 0.2185 0.0192 + 47723.0781 0.2718 0.0271 + 47828.8008 0.2629 0.0216 + 47934.5273 0.2915 0.0258 + 48040.2500 0.2530 0.0214 + 48145.9766 0.2297 0.0217 + 48251.7031 0.2630 0.0213 + 48357.4258 0.3302 0.0242 + 48463.1523 0.3696 0.0230 + 48568.8750 0.4969 0.0234 + 48674.6016 0.5483 0.0233 + 48780.3281 0.5327 0.0239 + 48886.0508 0.4184 0.0221 + 48991.7773 0.2823 0.0197 + 49097.5000 0.2866 0.0214 + 49203.2266 0.2522 0.0203 + 49308.9531 0.2489 0.0196 + 49414.6758 0.2448 0.0196 + 49520.4023 0.2601 0.0259 + 49626.1250 0.2605 0.0189 + 49731.8516 0.3113 0.0219 + 49837.5742 0.2830 0.0183 + 49943.3008 0.3215 0.0223 + 50049.0273 0.2968 0.0214 + 50154.7500 0.2681 0.0193 + 50260.4766 0.2937 0.0223 + 50366.1992 0.3080 0.0222 + 50471.9258 0.3428 0.0243 + 50577.6523 0.3620 0.0263 + 50683.3750 0.4525 0.0324 + 50789.1016 0.8839 0.0526 + 50894.8242 1.8248 0.0803 + 51000.5508 2.9135 0.1026 + 51106.2773 3.1431 0.1038 + 51212.0000 2.4033 0.0854 + 51317.7266 1.2090 0.0523 + 51423.4492 0.5861 0.0296 + 51529.1758 0.3460 0.0217 + 51634.9023 0.2720 0.0184 + 51740.6250 0.2291 0.0159 + 51846.3516 0.2937 0.0205 + 51952.0742 0.2967 0.0206 + 52057.8008 0.4799 0.0280 + 52163.5273 0.8144 0.0385 + 52269.2500 1.5357 0.0536 + 52374.9766 2.0841 0.0636 + 52480.6992 1.9287 0.0589 + 52586.4258 1.3908 0.0480 + 52692.1484 0.7038 0.0302 + 52797.8750 0.3890 0.0210 + 52903.6016 0.3065 0.0196 + 53009.3242 0.2245 0.0152 + 53115.0508 0.2350 0.0168 + 53220.7734 0.2576 0.0169 + 53326.5000 0.2459 0.0164 + 53432.2266 0.2949 0.0173 + 53537.9492 0.3578 0.0183 + 53643.6758 0.5163 0.0189 + 53749.3984 0.8043 0.0227 + 53855.1250 0.8956 0.0235 + 53960.8516 0.8454 0.0243 + 54066.5742 0.6697 0.0247 + 54172.3008 0.4149 0.0192 + 54278.0234 0.2704 0.0156 + 54383.7500 0.2699 0.0172 + 54489.4766 0.2696 0.0160 + 54595.1992 0.2333 0.0155 + 54700.9258 0.2992 0.0176 + 54806.6484 0.2545 0.0165 + 54912.3750 0.2622 0.0164 + 55018.1016 0.2922 0.0178 + 55123.8242 0.2875 0.0170 + 55229.5508 0.2769 0.0172 + 55335.2734 0.2914 0.0152 + 55441.0000 0.3034 0.0162 + 55546.7227 0.3072 0.0161 + 55652.4492 0.2673 0.0148 + 55758.1758 0.2671 0.0150 + 55863.8984 0.2761 0.0160 + 55969.6250 0.2627 0.0154 + 56075.3477 0.2425 0.0143 + 56181.0742 0.2719 0.0152 + 56286.8008 0.3090 0.0160 + 56392.5234 0.3117 0.0156 + 56498.2500 0.3111 0.0158 + 56603.9727 0.3137 0.0169 + 56709.6992 0.3613 0.0174 + 56815.4258 0.5692 0.0213 + 56921.1484 0.9024 0.0257 + 57026.8750 1.3101 0.0309 + 57132.5977 1.3881 0.0309 + 57238.3242 1.2531 0.0289 + 57344.0508 0.8853 0.0245 + 57449.7734 0.5531 0.0196 + 57555.5000 0.3578 0.0162 + 57661.2227 0.2764 0.0142 + 57766.9492 0.2546 0.0138 + 57872.6758 0.2621 0.0143 + 57978.3984 0.2680 0.0147 + 58084.1250 0.2785 0.0150 + 58189.8477 0.2580 0.0148 + 58295.5742 0.2607 0.0152 + 58401.2969 0.2569 0.0135 + 58507.0234 0.2442 0.0133 + 58612.7500 0.2511 0.0139 + 58718.4727 0.2504 0.0131 + 58824.1992 0.2638 0.0135 + 58929.9219 0.2645 0.0139 + 59035.6484 0.2708 0.0146 + 59141.3750 0.2577 0.0143 + 59247.0977 0.2531 0.0135 + 59352.8242 0.2681 0.0135 + 59458.5469 0.2423 0.0125 + 59564.2734 0.2497 0.0126 + 59670.0000 0.2665 0.0135 + 59775.7227 0.2679 0.0131 + 59881.4492 0.2532 0.0132 + 59987.1719 0.2579 0.0131 + 60092.8984 0.2640 0.0130 + 60198.6250 0.2571 0.0130 + 60304.3477 0.2557 0.0126 + 60410.0742 0.2936 0.0137 + 60515.7969 0.2970 0.0134 + 60621.5234 0.3316 0.0142 + 60727.2461 0.4197 0.0146 + 60832.9727 0.6730 0.0180 + 60938.6992 1.0285 0.0207 + 61044.4219 1.1876 0.0213 + 61150.1484 1.2152 0.0212 + 61255.8711 0.9139 0.0185 + 61361.5977 0.7009 0.0171 + 61467.3242 0.5012 0.0152 + 61573.0469 0.3635 0.0135 + 61678.7734 0.2972 0.0124 + 61784.4961 0.2975 0.0132 + 61890.2227 0.2629 0.0129 + 61995.9492 0.2577 0.0115 + 62101.6719 0.2613 0.0116 + 62207.3984 0.2501 0.0119 + 62313.1211 0.2495 0.0115 + 62418.8477 0.2579 0.0115 + 62524.5742 0.2359 0.0109 + 62630.2969 0.2335 0.0111 + 62736.0234 0.2616 0.0120 + 62841.7461 0.2397 0.0109 + 62947.4727 0.2652 0.0115 + 63053.1992 0.2642 0.0116 + 63158.9219 0.2560 0.0112 + 63264.6484 0.2440 0.0106 + 63370.3711 0.2696 0.0115 + 63476.0977 0.2568 0.0108 + 63581.8203 0.2415 0.0105 + 63687.5469 0.2573 0.0108 + 63793.2734 0.2494 0.0111 + 63898.9961 0.2470 0.0104 + 64004.7227 0.2468 0.0105 + 64110.4453 0.2584 0.0110 + 64216.1719 0.2388 0.0103 + 64321.8984 0.2364 0.0101 + 64427.6211 0.2612 0.0105 + 64533.3477 0.2490 0.0105 + 64639.0703 0.2516 0.0105 + 64744.7969 0.2996 0.0119 + 64850.5234 0.3304 0.0124 + 64956.2461 0.4053 0.0147 + 65061.9727 0.4287 0.0152 + 65167.6953 0.4414 0.0151 + 65273.4219 0.4011 0.0142 + 65379.1484 0.3965 0.0141 + 65484.8711 0.5085 0.0167 + 65590.5938 0.7781 0.0207 + 65696.3203 1.4459 0.0281 + 65802.0469 2.4658 0.0368 + 65907.7734 3.1267 0.0406 + 66013.5000 3.1792 0.0402 + 66119.2188 2.4224 0.0341 + 66224.9453 1.4550 0.0258 + 66330.6719 0.8143 0.0193 + 66436.3984 0.4756 0.0142 + 66542.1250 0.3538 0.0123 + 66647.8438 0.2896 0.0104 + 66753.5703 0.2537 0.0096 + 66859.2969 0.2394 0.0091 + 66965.0234 0.2533 0.0096 + 67070.7500 0.2426 0.0094 + 67176.4688 0.2538 0.0096 + 67282.1953 0.2475 0.0095 + 67387.9219 0.2310 0.0089 + 67493.6484 0.2551 0.0093 + 67599.3672 0.2351 0.0090 + 67705.0938 0.2649 0.0098 + 67810.8203 0.2480 0.0094 + 67916.5469 0.2583 0.0103 + 68022.2734 0.2816 0.0107 + 68127.9922 0.2893 0.0112 + 68233.7188 0.3965 0.0158 + 68339.4453 0.4939 0.0183 + 68445.1719 0.8845 0.0261 + 68550.8984 1.7767 0.0385 + 68656.6172 3.4629 0.0554 + 68762.3438 5.6293 0.0708 + 68868.0703 6.7283 0.0758 + 68973.7969 6.1986 0.0710 + 69079.5234 4.3428 0.0573 + 69185.2422 2.4467 0.0408 + 69290.9688 1.2881 0.0284 + 69396.6953 0.7045 0.0198 + 69502.4219 0.4647 0.0155 + 69608.1484 0.3111 0.0113 + 69713.8672 0.2738 0.0097 + 69819.5938 0.2634 0.0092 + 69925.3203 0.2567 0.0088 + 70031.0469 0.2367 0.0083 + 70136.7734 0.2375 0.0081 + 70242.4922 0.2317 0.0081 + 70348.2188 0.2378 0.0084 + 70453.9453 0.2455 0.0086 + 70559.6719 0.2433 0.0084 + 70665.3984 0.2400 0.0084 + 70771.1172 0.2421 0.0082 + 70876.8438 0.2306 0.0080 + 70982.5703 0.2498 0.0084 + 71088.2969 0.2584 0.0087 + 71194.0234 0.2382 0.0081 + 71299.7422 0.2554 0.0085 + 71405.4688 0.2494 0.0083 + 71511.1953 0.2500 0.0083 + 71616.9219 0.2510 0.0081 + 71722.6484 0.2869 0.0086 + 71828.3672 0.3262 0.0082 + 71934.0938 0.4639 0.0092 + 72039.8203 0.6523 0.0097 + 72145.5469 0.8643 0.0105 + 72251.2734 0.9850 0.0111 + 72356.9922 0.8691 0.0103 + 72462.7188 0.6381 0.0094 + 72568.4453 0.4477 0.0086 + 72674.1719 0.3492 0.0085 + 72779.8984 0.3247 0.0086 + 72885.6172 0.3182 0.0087 + 72991.3438 0.3370 0.0092 + 73097.0703 0.3661 0.0096 + 73202.7969 0.3767 0.0097 + 73308.5156 0.3562 0.0095 + 73414.2422 0.3047 0.0087 + 73519.9688 0.2650 0.0079 + 73625.6953 0.2642 0.0080 + 73731.4219 0.2348 0.0075 + 73837.1406 0.2567 0.0080 + 73942.8672 0.2438 0.0077 + 74048.5938 0.2567 0.0081 + 74154.3203 0.2313 0.0074 + 74260.0469 0.2391 0.0075 + 74365.7656 0.2534 0.0079 + 74471.4922 0.2408 0.0077 + 74577.2188 0.2363 0.0074 + 74682.9453 0.2409 0.0075 + 74788.6719 0.2413 0.0075 + 74894.3906 0.2323 0.0073 + 75000.1172 0.2362 0.0074 + 75105.8438 0.2457 0.0076 + 75211.5703 0.2305 0.0072 + 75317.2969 0.2372 0.0073 + 75423.0156 0.2458 0.0074 + 75528.7422 0.2439 0.0075 + 75634.4688 0.2376 0.0073 + 75740.1953 0.2410 0.0074 + 75845.9219 0.2360 0.0072 + 75951.6406 0.2526 0.0075 + 76057.3672 0.2361 0.0072 + 76163.0938 0.2473 0.0075 + 76268.8203 0.2375 0.0072 + 76374.5469 0.2377 0.0073 + 76480.2656 0.2463 0.0073 + 76585.9922 0.2341 0.0072 + 76691.7188 0.2428 0.0073 + 76797.4453 0.2410 0.0072 + 76903.1719 0.2430 0.0073 + 77008.8906 0.2454 0.0071 + 77114.6172 0.2461 0.0073 + 77220.3438 0.2506 0.0073 + 77326.0703 0.2326 0.0069 + 77431.7969 0.2372 0.0071 + 77537.5156 0.2351 0.0069 + 77643.2422 0.2399 0.0070 + 77748.9688 0.2451 0.0071 + 77854.6953 0.2357 0.0069 + 77960.4219 0.2483 0.0072 + 78066.1406 0.2580 0.0073 + 78171.8672 0.2358 0.0070 + 78277.5938 0.2387 0.0068 + 78383.3203 0.2377 0.0069 + 78489.0469 0.2326 0.0068 + 78594.7656 0.2510 0.0071 + 78700.4922 0.2410 0.0069 + 78806.2188 0.2437 0.0069 + 78911.9453 0.2404 0.0068 + 79017.6641 0.2411 0.0069 + 79123.3906 0.2432 0.0069 + 79229.1172 0.2525 0.0069 + 79334.8438 0.2572 0.0071 + 79440.5703 0.3060 0.0078 + 79546.2891 0.3109 0.0075 + 79652.0156 0.3423 0.0081 + 79757.7422 0.3721 0.0091 + 79863.4688 0.3796 0.0093 + 79969.1953 0.4154 0.0104 + 80074.9141 0.5579 0.0132 + 80180.6406 0.8314 0.0180 + 80286.3672 1.4735 0.0259 + 80392.0938 2.7412 0.0368 + 80497.8203 5.0431 0.0509 + 80603.5391 8.0424 0.0649 + 80709.2656 10.2532 0.0729 + 80814.9922 10.3581 0.0730 + 80920.7188 8.2333 0.0642 + 81026.4453 5.5307 0.0516 + 81132.1641 3.2092 0.0377 + 81237.8906 1.7937 0.0269 + 81343.6172 1.0393 0.0190 + 81449.3438 0.6861 0.0147 + 81555.0703 0.4666 0.0109 + 81660.7891 0.3524 0.0088 + 81766.5156 0.3026 0.0079 + 81872.2422 0.2852 0.0074 + 81977.9688 0.2465 0.0065 + 82083.6953 0.2340 0.0063 + 82189.4141 0.2455 0.0064 + 82295.1406 0.2356 0.0062 + 82400.8672 0.2278 0.0060 + 82506.5938 0.2397 0.0063 + 82612.3203 0.2472 0.0065 + 82718.0391 0.2496 0.0064 + 82823.7656 0.2337 0.0062 + 82929.4922 0.2445 0.0063 + 83035.2188 0.2352 0.0061 + 83140.9453 0.2383 0.0062 + 83246.6641 0.2321 0.0060 + 83352.3906 0.2390 0.0061 + 83458.1172 0.2346 0.0061 + 83563.8438 0.2348 0.0060 + 83669.5703 0.2461 0.0062 + 83775.2891 0.2406 0.0061 + 83881.0156 0.2399 0.0060 + 83986.7422 0.2288 0.0059 + 84092.4688 0.2451 0.0061 + 84198.1875 0.2370 0.0061 + 84303.9141 0.2408 0.0060 + 84409.6406 0.2368 0.0060 + 84515.3672 0.2435 0.0061 + 84621.0938 0.2437 0.0061 + 84726.8125 0.2368 0.0060 + 84832.5391 0.2501 0.0062 + 84938.2656 0.2457 0.0061 + 85043.9922 0.2488 0.0061 + 85149.7188 0.2472 0.0061 + 85255.4375 0.2401 0.0060 + 85361.1641 0.2393 0.0059 + 85466.8906 0.2392 0.0059 + 85572.6172 0.2498 0.0061 + 85678.3438 0.2375 0.0059 + 85784.0625 0.2306 0.0057 + 85889.7891 0.2207 0.0055 + 85995.5156 0.2294 0.0057 + 86101.2422 0.2421 0.0060 + 86206.9688 0.2404 0.0059 + 86312.6875 0.2308 0.0058 + 86418.4141 0.2403 0.0059 + 86524.1406 0.2269 0.0056 + 86629.8672 0.2431 0.0059 + 86735.5938 0.2349 0.0057 + 86841.3125 0.2365 0.0058 + 86947.0391 0.2338 0.0058 + 87052.7656 0.2373 0.0058 + 87158.4922 0.2402 0.0058 + 87264.2188 0.2317 0.0057 + 87369.9375 0.2226 0.0055 + 87475.6641 0.2389 0.0058 + 87581.3906 0.2370 0.0057 + 87687.1172 0.2308 0.0056 + 87792.8438 0.2413 0.0058 + 87898.5625 0.2455 0.0059 + 88004.2891 0.2375 0.0057 + 88110.0156 0.2435 0.0058 + 88215.7422 0.2329 0.0057 + 88321.4688 0.2338 0.0057 + 88427.1875 0.2376 0.0057 + 88532.9141 0.2395 0.0058 + 88638.6406 0.2370 0.0057 + 88744.3672 0.2351 0.0057 + 88850.0938 0.2408 0.0058 + 88955.8125 0.2392 0.0057 + 89061.5391 0.2450 0.0058 + 89167.2656 0.2377 0.0057 + 89272.9922 0.2324 0.0056 + 89378.7188 0.2430 0.0058 + 89484.4375 0.2446 0.0058 + 89590.1641 0.2341 0.0057 + 89695.8906 0.2403 0.0058 + 89801.6172 0.2371 0.0057 + 89907.3359 0.2361 0.0056 + 90013.0625 0.2406 0.0056 + 90118.7891 0.2318 0.0056 + 90224.5156 0.2436 0.0057 + 90330.2422 0.2390 0.0058 + 90435.9609 0.2364 0.0056 + 90541.6875 0.2410 0.0056 + 90647.4141 0.2369 0.0057 + 90753.1406 0.2517 0.0058 + 90858.8672 0.2337 0.0056 + 90964.5859 0.2438 0.0058 + 91070.3125 0.2388 0.0057 + 91176.0391 0.2377 0.0056 + 91281.7656 0.2289 0.0054 + 91387.4922 0.2437 0.0057 + 91493.2109 0.2375 0.0056 + 91598.9375 0.2380 0.0056 + 91704.6641 0.2362 0.0056 + 91810.3906 0.2431 0.0056 + 91916.1172 0.2276 0.0054 + 92021.8359 0.2386 0.0056 + 92127.5625 0.2437 0.0056 + 92233.2891 0.2454 0.0054 + 92339.0156 0.2738 0.0057 + 92444.7422 0.3082 0.0059 + 92550.4609 0.3592 0.0061 + 92656.1875 0.4223 0.0062 + 92761.9141 0.5348 0.0067 + 92867.6406 0.6406 0.0068 + 92973.3672 0.8145 0.0071 + 93079.0859 1.0211 0.0078 + 93184.8125 1.1877 0.0080 + 93290.5391 1.2630 0.0083 + 93396.2656 1.1987 0.0081 + 93501.9922 1.0159 0.0078 + 93607.7109 0.7859 0.0071 + 93713.4375 0.6241 0.0068 + 93819.1641 0.4877 0.0063 + 93924.8906 0.4010 0.0062 + 94030.6172 0.3448 0.0060 + 94136.3359 0.3095 0.0060 + 94242.0625 0.2741 0.0057 + 94347.7891 0.2595 0.0058 + 94453.5156 0.2365 0.0055 + 94559.2422 0.2471 0.0056 + 94664.9609 0.2361 0.0057 + 94770.6875 0.2346 0.0056 + 94876.4141 0.2330 0.0056 + 94982.1406 0.2370 0.0056 + 95087.8672 0.2507 0.0059 + 95193.5859 0.2374 0.0058 + 95299.3125 0.2545 0.0059 + 95405.0391 0.2598 0.0061 + 95510.7656 0.2718 0.0063 + 95616.4844 0.2911 0.0065 + 95722.2109 0.3182 0.0069 + 95827.9375 0.3523 0.0072 + 95933.6641 0.3923 0.0076 + 96039.3906 0.4195 0.0078 + 96145.1094 0.4383 0.0079 + 96250.8359 0.4442 0.0080 + 96356.5625 0.4528 0.0083 + 96462.2891 0.3972 0.0078 + 96568.0156 0.3507 0.0073 + 96673.7344 0.3171 0.0069 + 96779.4609 0.2913 0.0066 + 96885.1875 0.2683 0.0063 + 96990.9141 0.2648 0.0063 + 97096.6406 0.2519 0.0060 + 97202.3594 0.2390 0.0059 + 97308.0859 0.2364 0.0058 + 97413.8125 0.2307 0.0057 + 97519.5391 0.2229 0.0056 + 97625.2656 0.2341 0.0059 + 97730.9844 0.2329 0.0057 + 97836.7109 0.2246 0.0057 + 97942.4375 0.2401 0.0060 + 98048.1641 0.2158 0.0057 + 98153.8906 0.2351 0.0059 + 98259.6094 0.2256 0.0058 + 98365.3359 0.2297 0.0059 + 98471.0625 0.2306 0.0059 + 98576.7891 0.2383 0.0060 + 98682.5156 0.2190 0.0057 + 98788.2344 0.2314 0.0060 + 98893.9609 0.2275 0.0058 + 98999.6875 0.2322 0.0058 + 99105.4141 0.2341 0.0060 + 99211.1406 0.2303 0.0061 + 99316.8594 0.2288 0.0059 + 99422.5859 0.2257 0.0060 + 99528.3125 0.2312 0.0059 + 99634.0391 0.2297 0.0061 + 99739.7656 0.2289 0.0060 + 99845.4844 0.2388 0.0063 + 99951.2109 0.2336 0.0062 + 100056.9375 0.2240 0.0059 + 100162.6641 0.2316 0.0062 + 100268.3906 0.2311 0.0062 + 100374.1094 0.2236 0.0059 + 100479.8359 0.2290 0.0060 + 100585.5625 0.2307 0.0062 + 100691.2891 0.2298 0.0062 + 100797.0078 0.2285 0.0062 + 100902.7344 0.2426 0.0064 + 101008.4609 0.2322 0.0062 + 101114.1875 0.2263 0.0061 + 101219.9141 0.2313 0.0063 + 101325.6328 0.2300 0.0061 + 101431.3594 0.2351 0.0063 + 101537.0859 0.2293 0.0061 + 101642.8125 0.2383 0.0065 + 101748.5391 0.2419 0.0063 + 101854.2578 0.2325 0.0060 + 101959.9844 0.2430 0.0063 + 102065.7109 0.2505 0.0063 + 102171.4375 0.2433 0.0063 + 102277.1641 0.2343 0.0061 + 102382.8828 0.2394 0.0063 + 102488.6094 0.2432 0.0064 + 102594.3359 0.2374 0.0064 + 102700.0625 0.2411 0.0065 + 102805.7891 0.2336 0.0063 + 102911.5078 0.2340 0.0065 + 103017.2344 0.2328 0.0065 + 103122.9609 0.2209 0.0064 + 103228.6875 0.2197 0.0063 + 103334.4141 0.2294 0.0066 + 103440.1328 0.2311 0.0068 + 103545.8594 0.2297 0.0067 + 103651.5859 0.2302 0.0067 + 103757.3125 0.2383 0.0069 + 103863.0391 0.2336 0.0068 + 103968.7578 0.2215 0.0064 + 104074.4844 0.2143 0.0063 + 104180.2109 0.2273 0.0067 + 104285.9375 0.2193 0.0065 + 104391.6641 0.2295 0.0068 + 104497.3828 0.2292 0.0069 + 104603.1094 0.2292 0.0068 + 104708.8359 0.2137 0.0064 + 104814.5625 0.2248 0.0067 + 104920.2891 0.2254 0.0068 + 105026.0078 0.2220 0.0066 + 105131.7344 0.2237 0.0067 + 105237.4609 0.2370 0.0071 + 105343.1875 0.2199 0.0067 + 105448.9141 0.2250 0.0067 + 105554.6328 0.2171 0.0066 + 105660.3594 0.2282 0.0070 + 105766.0859 0.2176 0.0067 + 105871.8125 0.2184 0.0067 + 105977.5391 0.2107 0.0066 + 106083.2578 0.2277 0.0070 + 106188.9844 0.2323 0.0070 + 106294.7109 0.2241 0.0070 + 106400.4375 0.2191 0.0069 + 106506.1562 0.2183 0.0069 + 106611.8828 0.2284 0.0072 + 106717.6094 0.2217 0.0069 + 106823.3359 0.2246 0.0071 + 106929.0625 0.2202 0.0069 + 107034.7812 0.2272 0.0072 + 107140.5078 0.2463 0.0077 + 107246.2344 0.2213 0.0070 + 107351.9609 0.2241 0.0071 + 107457.6875 0.2256 0.0072 + 107563.4062 0.2230 0.0071 + 107669.1328 0.2196 0.0072 + 107774.8594 0.2268 0.0071 + 107880.5859 0.2125 0.0068 + 107986.3125 0.2145 0.0069 + 108092.0312 0.2148 0.0071