diff --git a/docs/dev/adrs/accepted/edstar-project-persistence.md b/docs/dev/adrs/accepted/edstar-project-persistence.md index 129790bf2..a78ad06c4 100644 --- a/docs/dev/adrs/accepted/edstar-project-persistence.md +++ b/docs/dev/adrs/accepted/edstar-project-persistence.md @@ -634,7 +634,7 @@ descriptor absent from this table is a migration blocker. | `experiment.instrument` TOF | `setup_twotheta_bank`, `calib_d_to_tof_offset`, `calib_d_to_tof_linear`, `calib_d_to_tof_quad`, `calib_d_to_tof_recip` | `_instr.2theta_bank`, `_instr.{d_to_tof_offset,d_to_tof_linear,d_to_tof_quad,d_to_tof_recip}` | `_instrument.{setup_twotheta_bank,calib_d_to_tof_offset,calib_d_to_tof_linear,calib_d_to_tof_quadratic,calib_d_to_tof_reciprocal}` | `_pd_calib_d_to_tof.{id,power,coeff,coeff_su,diffractogram_id}` loop for nonzero coefficients | | `experiment.linked_crystal` → `linked_structure` (single crystal) | `id`, `scale` | `_sc_crystal_block.{id,scale}` | `_linked_structure.{structure_id,scale}` | | | `experiment.linked_phases` → `linked_structures` (powder) | `id`, `scale` | `_pd_phase_block.{id,scale}` | `_linked_structure.{structure_id,scale}` | `_pd_phase_block.{id,scale}` | -| `experiment.peak` CWL profile | `type`, `broad_gauss_u`, `broad_gauss_v`, `broad_gauss_w`, `broad_lorentz_x`, `broad_lorentz_y`, `asym_empir_1`, `asym_empir_2`, `asym_empir_3`, `asym_empir_4`, `asym_fcj_1`, `asym_fcj_2` | `_peak.*` with same item names | same | no pdCIF one-to-one parametric profile tags | +| `experiment.peak` CWL profile | `type`, `broad_gauss_u`, `broad_gauss_v`, `broad_gauss_w`, `broad_lorentz_x`, `broad_lorentz_y`, `asym_beba_a0`, `asym_beba_b0`, `asym_beba_a1`, `asym_beba_b1`, `asym_fcj_1`, `asym_fcj_2` | `_peak.*` with same item names | same | no pdCIF one-to-one parametric profile tags | | `experiment.peak` TOF profile | `broad_gauss_sigma_{0,1,2}`, `broad_lorentz_gamma_{0,1,2}`, `rise_alpha_{0,1}`, `decay_beta_{0,1}`, `dexp_rise_alpha_{1,2}`, `dexp_decay_beta_{00,01,10}`, `dexp_switch_r_{01,02,03}` | `_peak.{gauss_sigma_0,gauss_sigma_1,gauss_sigma_2,lorentz_gamma_0,lorentz_gamma_1,lorentz_gamma_2,rise_alpha_0,rise_alpha_1,decay_beta_0,decay_beta_1,dexp_rise_alpha_1,dexp_rise_alpha_2,dexp_decay_beta_00,dexp_decay_beta_01,dexp_decay_beta_10,dexp_switch_r_01,dexp_switch_r_02,dexp_switch_r_03}` | `_peak.{broad_gauss_sigma_0,broad_gauss_sigma_1,broad_gauss_sigma_2,broad_lorentz_gamma_0,broad_lorentz_gamma_1,broad_lorentz_gamma_2,rise_alpha_0,rise_alpha_1,decay_beta_0,decay_beta_1,dexp_rise_alpha_1,dexp_rise_alpha_2,dexp_decay_beta_00,dexp_decay_beta_01,dexp_decay_beta_10,dexp_switch_r_01,dexp_switch_r_02,dexp_switch_r_03}` | no pdCIF one-to-one parametric profile tags | | `experiment.peak` total scattering | `damp_q`, `broad_q`, `cutoff_q`, `sharp_delta_1`, `sharp_delta_2`, `damp_particle_diameter` | `_peak.*` with same item names | same | no finalized PDF-specific CIF tags | | `experiment.preferred_orientation` | `phase_id`, `march_r`, `index_h`, `index_k`, `index_l`, `march_random_fract` | `_pref_orient.*` with same item names | `_preferred_orientation.{structure_id,march_r,index_h,index_k,index_l,march_random_fract}` | `_pd_pref_orient_March_Dollase.{phase_id,r,index_h,index_k,index_l}`; random fraction is an EasyDiffraction report extension | @@ -859,10 +859,10 @@ column is the persisted data name. | `experiment.peak.broad_gauss_w` | same | `_peak.broad_gauss_w` | | `experiment.peak.broad_lorentz_x` | same | `_peak.broad_lorentz_x` | | `experiment.peak.broad_lorentz_y` | same | `_peak.broad_lorentz_y` | -| `experiment.peak.asym_empir_1` | same | `_peak.asym_empir_1` | -| `experiment.peak.asym_empir_2` | same | `_peak.asym_empir_2` | -| `experiment.peak.asym_empir_3` | same | `_peak.asym_empir_3` | -| `experiment.peak.asym_empir_4` | same | `_peak.asym_empir_4` | +| `experiment.peak.asym_beba_a0` | same | `_peak.asym_beba_a0` | +| `experiment.peak.asym_beba_b0` | same | `_peak.asym_beba_b0` | +| `experiment.peak.asym_beba_a1` | same | `_peak.asym_beba_a1` | +| `experiment.peak.asym_beba_b1` | same | `_peak.asym_beba_b1` | | `experiment.peak.asym_fcj_1` | same | `_peak.asym_fcj_1` | | `experiment.peak.asym_fcj_2` | same | `_peak.asym_fcj_2` | | `experiment.peak.broad_gauss_sigma_0` | same | `_peak.broad_gauss_sigma_0` | diff --git a/docs/dev/adrs/accepted/edstar-project-persistence/handler-inventory.json b/docs/dev/adrs/accepted/edstar-project-persistence/handler-inventory.json index 8d16eb185..d75c8ae71 100644 --- a/docs/dev/adrs/accepted/edstar-project-persistence/handler-inventory.json +++ b/docs/dev/adrs/accepted/edstar-project-persistence/handler-inventory.json @@ -169,267 +169,6 @@ "read_names": ["_fit_parameter_correlation.source_kind"], "unique_name": "fit_parameter_correlation._.source_kind" }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.fit_bounds_uncertainty_multiplier", - "cif_names": ["_fit_parameter.fit_bounds_uncertainty_multiplier"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "bounds_uncertainty_multiplier", - "descriptor_path": "analysis.fit_parameters[].bounds_uncertainty_multiplier", - "docs_anchor": "fit-parameter-bounds-uncertainty-multiplier", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.bounds_uncertainty_multiplier", - "edi_names": ["_fit_parameter.bounds_uncertainty_multiplier"], - "owner_class": "FitParameterItem", - "read_names": [ - "_fit_parameter.bounds_uncertainty_multiplier", - "_fit_parameter.fit_bounds_uncertainty_multiplier" - ], - "unique_name": "fit_parameter._.bounds_uncertainty_multiplier" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.fit_max", - "cif_names": ["_fit_parameter.fit_max"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "fit_max", - "descriptor_path": "analysis.fit_parameters[].fit_max", - "docs_anchor": "fit-parameter-fit-max", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.fit_max", - "edi_names": ["_fit_parameter.fit_max"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.fit_max"], - "unique_name": "fit_parameter._.fit_max" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.fit_min", - "cif_names": ["_fit_parameter.fit_min"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "fit_min", - "descriptor_path": "analysis.fit_parameters[].fit_min", - "docs_anchor": "fit-parameter-fit-min", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.fit_min", - "edi_names": ["_fit_parameter.fit_min"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.fit_min"], - "unique_name": "fit_parameter._.fit_min" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.param_unique_name", - "cif_names": ["_fit_parameter.param_unique_name"], - "context": "analysis", - "descriptor_class": "StringDescriptor", - "descriptor_name": "parameter_unique_name", - "descriptor_path": "analysis.fit_parameters[].parameter_unique_name", - "docs_anchor": "fit-parameter-parameter-unique-name", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.parameter_unique_name", - "edi_names": ["_fit_parameter.parameter_unique_name"], - "owner_class": "FitParameterItem", - "read_names": [ - "_fit_parameter.parameter_unique_name", - "_fit_parameter.param_unique_name" - ], - "unique_name": "fit_parameter._.parameter_unique_name" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.posterior_best_sample_value", - "cif_names": ["_fit_parameter.posterior_best_sample_value"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "posterior_best_sample_value", - "descriptor_path": "analysis.fit_parameters[].posterior_best_sample_value", - "docs_anchor": "fit-parameter-posterior-best-sample-value", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.posterior_best_sample_value", - "edi_names": ["_fit_parameter.posterior_best_sample_value"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.posterior_best_sample_value"], - "unique_name": "fit_parameter._.posterior_best_sample_value" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.posterior_effective_sample_size_bulk", - "cif_names": ["_fit_parameter.posterior_effective_sample_size_bulk"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "posterior_effective_sample_size_bulk", - "descriptor_path": "analysis.fit_parameters[].posterior_effective_sample_size_bulk", - "docs_anchor": "fit-parameter-posterior-effective-sample-size-bulk", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.posterior_effective_sample_size_bulk", - "edi_names": ["_fit_parameter.posterior_effective_sample_size_bulk"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.posterior_effective_sample_size_bulk"], - "unique_name": "fit_parameter._.posterior_effective_sample_size_bulk" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.posterior_gelman_rubin", - "cif_names": ["_fit_parameter.posterior_gelman_rubin"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "posterior_gelman_rubin", - "descriptor_path": "analysis.fit_parameters[].posterior_gelman_rubin", - "docs_anchor": "fit-parameter-posterior-gelman-rubin", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.posterior_gelman_rubin", - "edi_names": ["_fit_parameter.posterior_gelman_rubin"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.posterior_gelman_rubin"], - "unique_name": "fit_parameter._.posterior_gelman_rubin" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.posterior_interval_68_high", - "cif_names": ["_fit_parameter.posterior_interval_68_high"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "posterior_interval_68_high", - "descriptor_path": "analysis.fit_parameters[].posterior_interval_68_high", - "docs_anchor": "fit-parameter-posterior-interval-68-high", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.posterior_interval_68_high", - "edi_names": ["_fit_parameter.posterior_interval_68_high"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.posterior_interval_68_high"], - "unique_name": "fit_parameter._.posterior_interval_68_high" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.posterior_interval_68_low", - "cif_names": ["_fit_parameter.posterior_interval_68_low"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "posterior_interval_68_low", - "descriptor_path": "analysis.fit_parameters[].posterior_interval_68_low", - "docs_anchor": "fit-parameter-posterior-interval-68-low", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.posterior_interval_68_low", - "edi_names": ["_fit_parameter.posterior_interval_68_low"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.posterior_interval_68_low"], - "unique_name": "fit_parameter._.posterior_interval_68_low" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.posterior_interval_95_high", - "cif_names": ["_fit_parameter.posterior_interval_95_high"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "posterior_interval_95_high", - "descriptor_path": "analysis.fit_parameters[].posterior_interval_95_high", - "docs_anchor": "fit-parameter-posterior-interval-95-high", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.posterior_interval_95_high", - "edi_names": ["_fit_parameter.posterior_interval_95_high"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.posterior_interval_95_high"], - "unique_name": "fit_parameter._.posterior_interval_95_high" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.posterior_interval_95_low", - "cif_names": ["_fit_parameter.posterior_interval_95_low"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "posterior_interval_95_low", - "descriptor_path": "analysis.fit_parameters[].posterior_interval_95_low", - "docs_anchor": "fit-parameter-posterior-interval-95-low", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.posterior_interval_95_low", - "edi_names": ["_fit_parameter.posterior_interval_95_low"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.posterior_interval_95_low"], - "unique_name": "fit_parameter._.posterior_interval_95_low" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.posterior_median", - "cif_names": ["_fit_parameter.posterior_median"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "posterior_median", - "descriptor_path": "analysis.fit_parameters[].posterior_median", - "docs_anchor": "fit-parameter-posterior-median", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.posterior_median", - "edi_names": ["_fit_parameter.posterior_median"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.posterior_median"], - "unique_name": "fit_parameter._.posterior_median" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.posterior_uncertainty", - "cif_names": ["_fit_parameter.posterior_uncertainty"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "posterior_uncertainty", - "descriptor_path": "analysis.fit_parameters[].posterior_uncertainty", - "docs_anchor": "fit-parameter-posterior-uncertainty", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.posterior_uncertainty", - "edi_names": ["_fit_parameter.posterior_uncertainty"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.posterior_uncertainty"], - "unique_name": "fit_parameter._.posterior_uncertainty" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.start_uncertainty", - "cif_names": ["_fit_parameter.start_uncertainty"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "start_uncertainty", - "descriptor_path": "analysis.fit_parameters[].start_uncertainty", - "docs_anchor": "fit-parameter-start-uncertainty", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.start_uncertainty", - "edi_names": ["_fit_parameter.start_uncertainty"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.start_uncertainty"], - "unique_name": "fit_parameter._.start_uncertainty" - }, - { - "category_code": "fit_parameter", - "category_entry_name": "_", - "cif_name": "_fit_parameter.start_value", - "cif_names": ["_fit_parameter.start_value"], - "context": "analysis", - "descriptor_class": "NumericDescriptor", - "descriptor_name": "start_value", - "descriptor_path": "analysis.fit_parameters[].start_value", - "docs_anchor": "fit-parameter-start-value", - "docs_page": "fit_parameter", - "edi_name": "_fit_parameter.start_value", - "edi_names": ["_fit_parameter.start_value"], - "owner_class": "FitParameterItem", - "read_names": ["_fit_parameter.start_value"], - "unique_name": "fit_parameter._.start_value" - }, { "category_code": "fit_result", "category_entry_name": null, @@ -1120,6 +859,86 @@ ], "unique_name": "sequential_fit.reverse" }, + { + "category_code": "sequential_fit_extract", + "category_entry_name": "_", + "cif_name": "_easydiffraction_sequential_fit_extract.id", + "cif_names": ["_easydiffraction_sequential_fit_extract.id"], + "context": "analysis", + "descriptor_class": "StringDescriptor", + "descriptor_name": "id", + "descriptor_path": "analysis.sequential_fit_extract[].id", + "docs_anchor": "sequential-fit-extract-id", + "docs_page": "sequential_fit_extract", + "edi_name": "_sequential_fit_extract.id", + "edi_names": ["_sequential_fit_extract.id"], + "owner_class": "SequentialFitExtractItem", + "read_names": [ + "_sequential_fit_extract.id", + "_easydiffraction_sequential_fit_extract.id" + ], + "unique_name": "sequential_fit_extract._.id" + }, + { + "category_code": "sequential_fit_extract", + "category_entry_name": "_", + "cif_name": "_easydiffraction_sequential_fit_extract.pattern", + "cif_names": ["_easydiffraction_sequential_fit_extract.pattern"], + "context": "analysis", + "descriptor_class": "StringDescriptor", + "descriptor_name": "pattern", + "descriptor_path": "analysis.sequential_fit_extract[].pattern", + "docs_anchor": "sequential-fit-extract-pattern", + "docs_page": "sequential_fit_extract", + "edi_name": "_sequential_fit_extract.pattern", + "edi_names": ["_sequential_fit_extract.pattern"], + "owner_class": "SequentialFitExtractItem", + "read_names": [ + "_sequential_fit_extract.pattern", + "_easydiffraction_sequential_fit_extract.pattern" + ], + "unique_name": "sequential_fit_extract._.pattern" + }, + { + "category_code": "sequential_fit_extract", + "category_entry_name": "_", + "cif_name": "_easydiffraction_sequential_fit_extract.required", + "cif_names": ["_easydiffraction_sequential_fit_extract.required"], + "context": "analysis", + "descriptor_class": "BoolDescriptor", + "descriptor_name": "required", + "descriptor_path": "analysis.sequential_fit_extract[].required", + "docs_anchor": "sequential-fit-extract-required", + "docs_page": "sequential_fit_extract", + "edi_name": "_sequential_fit_extract.required", + "edi_names": ["_sequential_fit_extract.required"], + "owner_class": "SequentialFitExtractItem", + "read_names": [ + "_sequential_fit_extract.required", + "_easydiffraction_sequential_fit_extract.required" + ], + "unique_name": "sequential_fit_extract._.required" + }, + { + "category_code": "sequential_fit_extract", + "category_entry_name": "_", + "cif_name": "_easydiffraction_sequential_fit_extract.target", + "cif_names": ["_easydiffraction_sequential_fit_extract.target"], + "context": "analysis", + "descriptor_class": "StringDescriptor", + "descriptor_name": "target", + "descriptor_path": "analysis.sequential_fit_extract[].target", + "docs_anchor": "sequential-fit-extract-target", + "docs_page": "sequential_fit_extract", + "edi_name": "_sequential_fit_extract.target", + "edi_names": ["_sequential_fit_extract.target"], + "owner_class": "SequentialFitExtractItem", + "read_names": [ + "_sequential_fit_extract.target", + "_easydiffraction_sequential_fit_extract.target" + ], + "unique_name": "sequential_fit_extract._.target" + }, { "category_code": "software", "category_entry_name": "framework", @@ -1188,6 +1007,23 @@ "read_names": ["_software.version"], "unique_name": "software.framework.version" }, + { + "category_code": "absorption", + "category_entry_name": null, + "cif_name": "_easydiffraction_absorption.type", + "cif_names": ["_easydiffraction_absorption.type"], + "context": "experiment.bragg_pd_cwl", + "descriptor_class": "StringDescriptor", + "descriptor_name": "type", + "descriptor_path": "experiment.bragg_pd_cwl.absorption.type", + "docs_anchor": "absorption-type", + "docs_page": "absorption", + "edi_name": "_absorption.type", + "edi_names": ["_absorption.type"], + "owner_class": "NoAbsorption", + "read_names": ["_absorption.type", "_easydiffraction_absorption.type"], + "unique_name": "inventory_experiment.absorption.type" + }, { "category_code": null, "category_entry_name": null, @@ -2318,6 +2154,23 @@ "read_names": ["_refln.two_theta"], "unique_name": "refln.0.two_theta" }, + { + "category_code": "absorption", + "category_entry_name": null, + "cif_name": "_easydiffraction_absorption.type", + "cif_names": ["_easydiffraction_absorption.type"], + "context": "experiment.bragg_pd_tof", + "descriptor_class": "StringDescriptor", + "descriptor_name": "type", + "descriptor_path": "experiment.bragg_pd_tof.absorption.type", + "docs_anchor": "absorption-type", + "docs_page": "absorption", + "edi_name": "_absorption.type", + "edi_names": ["_absorption.type"], + "owner_class": "NoAbsorption", + "read_names": ["_absorption.type", "_easydiffraction_absorption.type"], + "unique_name": "inventory_experiment.absorption.type" + }, { "category_code": null, "category_entry_name": null, @@ -2698,6 +2551,66 @@ "read_names": ["_diffrn.ambient_temperature"], "unique_name": "inventory_experiment.diffrn.ambient_temperature" }, + { + "category_code": "excluded_regions", + "category_entry_name": "0", + "cif_name": "_easydiffraction_excluded_region.end", + "cif_names": ["_easydiffraction_excluded_region.end"], + "context": "experiment.bragg_pd_tof", + "descriptor_class": "NumericDescriptor", + "descriptor_name": "end", + "descriptor_path": "experiment.bragg_pd_tof.excluded_regions[].end", + "docs_anchor": "excluded-region-end", + "docs_page": "excluded_region", + "edi_name": "_excluded_region.end", + "edi_names": ["_excluded_region.end"], + "owner_class": "ExcludedRegion", + "read_names": [ + "_excluded_region.end", + "_easydiffraction_excluded_region.end" + ], + "unique_name": "excluded_regions.0.end" + }, + { + "category_code": "excluded_regions", + "category_entry_name": "0", + "cif_name": "_easydiffraction_excluded_region.id", + "cif_names": ["_easydiffraction_excluded_region.id"], + "context": "experiment.bragg_pd_tof", + "descriptor_class": "StringDescriptor", + "descriptor_name": "id", + "descriptor_path": "experiment.bragg_pd_tof.excluded_regions[].id", + "docs_anchor": "excluded-region-id", + "docs_page": "excluded_region", + "edi_name": "_excluded_region.id", + "edi_names": ["_excluded_region.id"], + "owner_class": "ExcludedRegion", + "read_names": [ + "_excluded_region.id", + "_easydiffraction_excluded_region.id" + ], + "unique_name": "excluded_regions.0.id" + }, + { + "category_code": "excluded_regions", + "category_entry_name": "0", + "cif_name": "_easydiffraction_excluded_region.start", + "cif_names": ["_easydiffraction_excluded_region.start"], + "context": "experiment.bragg_pd_tof", + "descriptor_class": "NumericDescriptor", + "descriptor_name": "start", + "descriptor_path": "experiment.bragg_pd_tof.excluded_regions[].start", + "docs_anchor": "excluded-region-start", + "docs_page": "excluded_region", + "edi_name": "_excluded_region.start", + "edi_names": ["_excluded_region.start"], + "owner_class": "ExcludedRegion", + "read_names": [ + "_excluded_region.start", + "_easydiffraction_excluded_region.start" + ], + "unique_name": "excluded_regions.0.start" + }, { "category_code": "experiment_type", "category_entry_name": null, @@ -5623,6 +5536,57 @@ "read_names": ["_peak.type", "_easydiffraction_peak.type"], "unique_name": "inventory_experiment.peak.type" }, + { + "category_code": "absorption", + "category_entry_name": null, + "cif_name": "_easydiffraction_absorption.mu_r", + "cif_names": ["_easydiffraction_absorption.mu_r"], + "context": "factory.AbsorptionFactory.cylinder-hewat", + "descriptor_class": "Parameter", + "descriptor_name": "mu_r", + "descriptor_path": "factory.AbsorptionFactory.cylinder-hewat.mu_r", + "docs_anchor": "absorption-mu-r", + "docs_page": "absorption", + "edi_name": "_absorption.mu_r", + "edi_names": ["_absorption.mu_r"], + "owner_class": "CylinderHewatAbsorption", + "read_names": ["_absorption.mu_r", "_easydiffraction_absorption.mu_r"], + "unique_name": "absorption.mu_r" + }, + { + "category_code": "absorption", + "category_entry_name": null, + "cif_name": "_easydiffraction_absorption.type", + "cif_names": ["_easydiffraction_absorption.type"], + "context": "factory.AbsorptionFactory.cylinder-hewat", + "descriptor_class": "StringDescriptor", + "descriptor_name": "type", + "descriptor_path": "factory.AbsorptionFactory.cylinder-hewat.type", + "docs_anchor": "absorption-type", + "docs_page": "absorption", + "edi_name": "_absorption.type", + "edi_names": ["_absorption.type"], + "owner_class": "CylinderHewatAbsorption", + "read_names": ["_absorption.type", "_easydiffraction_absorption.type"], + "unique_name": "absorption.type" + }, + { + "category_code": "absorption", + "category_entry_name": null, + "cif_name": "_easydiffraction_absorption.type", + "cif_names": ["_easydiffraction_absorption.type"], + "context": "factory.AbsorptionFactory.none", + "descriptor_class": "StringDescriptor", + "descriptor_name": "type", + "descriptor_path": "factory.AbsorptionFactory.none.type", + "docs_anchor": "absorption-type", + "docs_page": "absorption", + "edi_name": "_absorption.type", + "edi_names": ["_absorption.type"], + "owner_class": "NoAbsorption", + "read_names": ["_absorption.type", "_easydiffraction_absorption.type"], + "unique_name": "absorption.type" + }, { "category_code": "alias", "category_entry_name": "_", @@ -9571,97 +9535,97 @@ { "category_code": "peak", "category_entry_name": null, - "cif_name": "_easydiffraction_peak.asym_empir_1", - "cif_names": ["_easydiffraction_peak.asym_empir_1"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "cif_name": "_easydiffraction_peak.asym_beba_a0", + "cif_names": ["_easydiffraction_peak.asym_beba_a0"], + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "Parameter", - "descriptor_name": "asym_empir_1", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.asym_empir_1", - "docs_anchor": "peak-asym-empir-1", + "descriptor_name": "asym_beba_a0", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.asym_beba_a0", + "docs_anchor": "peak-asym-beba-a0", "docs_page": "peak", - "edi_name": "_peak.asym_empir_1", - "edi_names": ["_peak.asym_empir_1"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "edi_name": "_peak.asym_beba_a0", + "edi_names": ["_peak.asym_beba_a0"], + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": [ - "_peak.asym_empir_1", - "_easydiffraction_peak.asym_empir_1" + "_peak.asym_beba_a0", + "_easydiffraction_peak.asym_beba_a0" ], - "unique_name": "peak.asym_empir_1" + "unique_name": "peak.asym_beba_a0" }, { "category_code": "peak", "category_entry_name": null, - "cif_name": "_easydiffraction_peak.asym_empir_2", - "cif_names": ["_easydiffraction_peak.asym_empir_2"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "cif_name": "_easydiffraction_peak.asym_beba_a1", + "cif_names": ["_easydiffraction_peak.asym_beba_a1"], + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "Parameter", - "descriptor_name": "asym_empir_2", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.asym_empir_2", - "docs_anchor": "peak-asym-empir-2", + "descriptor_name": "asym_beba_a1", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.asym_beba_a1", + "docs_anchor": "peak-asym-beba-a1", "docs_page": "peak", - "edi_name": "_peak.asym_empir_2", - "edi_names": ["_peak.asym_empir_2"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "edi_name": "_peak.asym_beba_a1", + "edi_names": ["_peak.asym_beba_a1"], + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": [ - "_peak.asym_empir_2", - "_easydiffraction_peak.asym_empir_2" + "_peak.asym_beba_a1", + "_easydiffraction_peak.asym_beba_a1" ], - "unique_name": "peak.asym_empir_2" + "unique_name": "peak.asym_beba_a1" }, { "category_code": "peak", "category_entry_name": null, - "cif_name": "_easydiffraction_peak.asym_empir_3", - "cif_names": ["_easydiffraction_peak.asym_empir_3"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "cif_name": "_easydiffraction_peak.asym_beba_b0", + "cif_names": ["_easydiffraction_peak.asym_beba_b0"], + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "Parameter", - "descriptor_name": "asym_empir_3", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.asym_empir_3", - "docs_anchor": "peak-asym-empir-3", + "descriptor_name": "asym_beba_b0", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.asym_beba_b0", + "docs_anchor": "peak-asym-beba-b0", "docs_page": "peak", - "edi_name": "_peak.asym_empir_3", - "edi_names": ["_peak.asym_empir_3"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "edi_name": "_peak.asym_beba_b0", + "edi_names": ["_peak.asym_beba_b0"], + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": [ - "_peak.asym_empir_3", - "_easydiffraction_peak.asym_empir_3" + "_peak.asym_beba_b0", + "_easydiffraction_peak.asym_beba_b0" ], - "unique_name": "peak.asym_empir_3" + "unique_name": "peak.asym_beba_b0" }, { "category_code": "peak", "category_entry_name": null, - "cif_name": "_easydiffraction_peak.asym_empir_4", - "cif_names": ["_easydiffraction_peak.asym_empir_4"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "cif_name": "_easydiffraction_peak.asym_beba_b1", + "cif_names": ["_easydiffraction_peak.asym_beba_b1"], + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "Parameter", - "descriptor_name": "asym_empir_4", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.asym_empir_4", - "docs_anchor": "peak-asym-empir-4", + "descriptor_name": "asym_beba_b1", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.asym_beba_b1", + "docs_anchor": "peak-asym-beba-b1", "docs_page": "peak", - "edi_name": "_peak.asym_empir_4", - "edi_names": ["_peak.asym_empir_4"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "edi_name": "_peak.asym_beba_b1", + "edi_names": ["_peak.asym_beba_b1"], + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": [ - "_peak.asym_empir_4", - "_easydiffraction_peak.asym_empir_4" + "_peak.asym_beba_b1", + "_easydiffraction_peak.asym_beba_b1" ], - "unique_name": "peak.asym_empir_4" + "unique_name": "peak.asym_beba_b1" }, { "category_code": "peak", "category_entry_name": null, "cif_name": "_easydiffraction_peak.broad_gauss_u", "cif_names": ["_easydiffraction_peak.broad_gauss_u"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "Parameter", "descriptor_name": "broad_gauss_u", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.broad_gauss_u", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.broad_gauss_u", "docs_anchor": "peak-broad-gauss-u", "docs_page": "peak", "edi_name": "_peak.broad_gauss_u", "edi_names": ["_peak.broad_gauss_u"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": [ "_peak.broad_gauss_u", "_easydiffraction_peak.broad_gauss_u" @@ -9673,15 +9637,15 @@ "category_entry_name": null, "cif_name": "_easydiffraction_peak.broad_gauss_v", "cif_names": ["_easydiffraction_peak.broad_gauss_v"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "Parameter", "descriptor_name": "broad_gauss_v", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.broad_gauss_v", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.broad_gauss_v", "docs_anchor": "peak-broad-gauss-v", "docs_page": "peak", "edi_name": "_peak.broad_gauss_v", "edi_names": ["_peak.broad_gauss_v"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": [ "_peak.broad_gauss_v", "_easydiffraction_peak.broad_gauss_v" @@ -9693,15 +9657,15 @@ "category_entry_name": null, "cif_name": "_easydiffraction_peak.broad_gauss_w", "cif_names": ["_easydiffraction_peak.broad_gauss_w"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "Parameter", "descriptor_name": "broad_gauss_w", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.broad_gauss_w", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.broad_gauss_w", "docs_anchor": "peak-broad-gauss-w", "docs_page": "peak", "edi_name": "_peak.broad_gauss_w", "edi_names": ["_peak.broad_gauss_w"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": [ "_peak.broad_gauss_w", "_easydiffraction_peak.broad_gauss_w" @@ -9713,15 +9677,15 @@ "category_entry_name": null, "cif_name": "_easydiffraction_peak.broad_lorentz_x", "cif_names": ["_easydiffraction_peak.broad_lorentz_x"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "Parameter", "descriptor_name": "broad_lorentz_x", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.broad_lorentz_x", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.broad_lorentz_x", "docs_anchor": "peak-broad-lorentz-x", "docs_page": "peak", "edi_name": "_peak.broad_lorentz_x", "edi_names": ["_peak.broad_lorentz_x"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": [ "_peak.broad_lorentz_x", "_easydiffraction_peak.broad_lorentz_x" @@ -9733,15 +9697,15 @@ "category_entry_name": null, "cif_name": "_easydiffraction_peak.broad_lorentz_y", "cif_names": ["_easydiffraction_peak.broad_lorentz_y"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "Parameter", "descriptor_name": "broad_lorentz_y", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.broad_lorentz_y", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.broad_lorentz_y", "docs_anchor": "peak-broad-lorentz-y", "docs_page": "peak", "edi_name": "_peak.broad_lorentz_y", "edi_names": ["_peak.broad_lorentz_y"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": [ "_peak.broad_lorentz_y", "_easydiffraction_peak.broad_lorentz_y" @@ -9753,15 +9717,15 @@ "category_entry_name": null, "cif_name": "_easydiffraction_peak.type", "cif_names": ["_easydiffraction_peak.type"], - "context": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry", + "context": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry", "descriptor_class": "StringDescriptor", "descriptor_name": "type", - "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-empirical-asymmetry.type", + "descriptor_path": "factory.PeakFactory.cwl-pseudo-voigt-berar-baldinozzi-asymmetry.type", "docs_anchor": "peak-type", "docs_page": "peak", "edi_name": "_peak.type", "edi_names": ["_peak.type"], - "owner_class": "CwlPseudoVoigtEmpiricalAsymmetry", + "owner_class": "CwlPseudoVoigtBerarBaldinozziAsymmetry", "read_names": ["_peak.type", "_easydiffraction_peak.type"], "unique_name": "peak.type" }, diff --git a/docs/dev/adrs/accepted/preferred-orientation-category.md b/docs/dev/adrs/accepted/preferred-orientation-category.md index 2ed7309c6..26992f0cc 100644 --- a/docs/dev/adrs/accepted/preferred-orientation-category.md +++ b/docs/dev/adrs/accepted/preferred-orientation-category.md @@ -210,7 +210,7 @@ expt = project.experiments['hrpt'] # Add a March–Dollase correction for a linked phase, axis [0 0 1]. # Uses the keyword-based collection constructor `.create(...)`, exactly -# like `experiment.linked_phases.create(id=..., scale=...)`. +# like `experiment.linked_structures.create(id=..., scale=...)`. expt.preferred_orientation.create( phase_id='lbco', march_r=0.8, diff --git a/docs/dev/adrs/accepted/python-cif-category-correspondence.md b/docs/dev/adrs/accepted/python-cif-category-correspondence.md index 076332d4b..2ebb0a37a 100644 --- a/docs/dev/adrs/accepted/python-cif-category-correspondence.md +++ b/docs/dev/adrs/accepted/python-cif-category-correspondence.md @@ -160,7 +160,7 @@ to objects reached from the current `Project` root, for example | `experiment.peak.broad_gauss_w` | `_peak.broad_gauss_w` | Yes | CWL peak field. | | `experiment.peak.broad_lorentz_x` | `_peak.broad_lorentz_x` | Yes | CWL peak field. | | `experiment.peak.broad_lorentz_y` | `_peak.broad_lorentz_y` | Yes | CWL peak field. | -| `experiment.peak.asym_empir_1..4` | `_peak.asym_empir_1..4` | Yes | CWL peak field group. | +| `experiment.peak.asym_beba_{a0,b0,a1,b1}` | `_peak.asym_beba_{a0,b0,a1,b1}` | Yes | CWL peak field group. | | `experiment.peak.asym_fcj_1..2` | `_peak.asym_fcj_1..2` | Yes | CWL peak field group. | | `experiment.peak.broad_gauss_sigma_0..2` | `_peak.gauss_sigma_0..2` | Partly | Python prefixes the family with `broad_`; CIF tags omit that grouping prefix. | | `experiment.peak.broad_lorentz_gamma_0..2` | `_peak.lorentz_gamma_0..2` | Partly | Python prefixes the family with `broad_`; CIF tags omit that grouping prefix. | diff --git a/docs/dev/adrs/index.md b/docs/dev/adrs/index.md index 418d15c88..c150705c0 100644 --- a/docs/dev/adrs/index.md +++ b/docs/dev/adrs/index.md @@ -13,57 +13,58 @@ folders. ## ADR Index -| Group | Status | Title | Short description | Link | -| -------------------- | ---------- | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------- | -| Analysis and fitting | Accepted | Fit Mode Categories and Fit Execution API | Splits fitting configuration from execution and defines active sibling fit-mode categories. | [`fit-mode-categories.md`](accepted/fit-mode-categories.md) | -| Analysis and fitting | Accepted | Runtime Fit Results | Keeps full fit outputs runtime-only in the current design unless a narrower persistence ADR is accepted. | [`runtime-fit-results.md`](accepted/runtime-fit-results.md) | -| Analysis and fitting | Accepted | Analysis CIF Fit State | Defines the persisted fit-state projection in `analysis/analysis.cif` and `analysis/mcmc.h5`. | [`analysis-cif-fit-state.md`](accepted/analysis-cif-fit-state.md) | -| Analysis and fitting | Accepted | Parameter Correlation Persistence | Persists deterministic and posterior correlation summaries in `_fit_parameter_correlation` | [`parameter-correlation-persistence.md`](accepted/parameter-correlation-persistence.md) | -| Analysis and fitting | Suggestion | Fit Output Files and Data Exports | Narrows remaining archive/export questions after adopting `results.csv` and `mcmc.h5`. | [`fit-output-files-and-data-exports.md`](suggestions/fit-output-files-and-data-exports.md) | -| Analysis and fitting | Accepted | Minimizer Category Consolidation | Collapses the seven Bayesian categories into one owner-level switchable `minimizer` category with HDF5 sidecar. | [`minimizer-category-consolidation.md`](accepted/minimizer-category-consolidation.md) | -| Analysis and fitting | Accepted | Minimizer Input/Output Split | Keeps `analysis.minimizer` input-only and moves scalar fit outputs to paired `analysis.fit_result` classes. | [`minimizer-input-output-split.md`](accepted/minimizer-input-output-split.md) | -| Analysis and fitting | Superseded | Parameter-Level Posterior Projection | Superseded by minimizer-category consolidation; kept as historical context for `parameter.posterior`. | [`parameter-posterior-summary.md`](suggestions/parameter-posterior-summary.md) | -| Analysis and fitting | Accepted | Undo Fit | Builds rollback semantics and CLI behavior on already-persisted pre-fit scalar snapshots. | [`undo-fit.md`](accepted/undo-fit.md) | -| Analysis and fitting | Accepted | Bayesian Resume and MCMC Sidecar Naming | Extends bumps-DREAM with resume/extend like emcee and renames the MCMC sidecar to `mcmc.h5` with per-engine state groups. | [`bayesian-resume-and-mcmc-sidecar.md`](accepted/bayesian-resume-and-mcmc-sidecar.md) | -| Core model | Accepted | Category Owners and Real Datablocks | Introduces `CategoryOwner` so singleton sections do not pretend to be real CIF datablocks. | [`category-owner-sections.md`](accepted/category-owner-sections.md) | -| Core model | Accepted | Enum-Backed Closed Value Sets | Requires finite option sets to use `(str, Enum)` classes for validation and dispatch. | [`enum-backed-closed-values.md`](accepted/enum-backed-closed-values.md) | -| Core model | Accepted | Guarded Public Properties | Uses property setters as the public writability contract for guarded objects. | [`guarded-public-properties.md`](accepted/guarded-public-properties.md) | -| Core model | Accepted | Two-Level Category Parameter Access | Keeps parameter access to `datablock.category.parameter` or `datablock.collection[id].parameter`. | [`category-parameter-access.md`](accepted/category-parameter-access.md) | -| Documentation | Accepted | Descriptor Property Docstring Template | Makes descriptor metadata the source of truth for public property docstrings and annotations. | [`property-docstring-template.md`](accepted/property-docstring-template.md) | -| Documentation | Accepted | Development Documentation Structure | Defines the `docs/dev` layout for ADRs, issues, plans, package structure, and roadmap. | [`development-docs-structure.md`](accepted/development-docs-structure.md) | -| Documentation | Accepted | Help Method Discoverability | Requires primary public objects and facades to expose consistent `help()` output. | [`help-discoverability.md`](accepted/help-discoverability.md) | -| Documentation | Accepted | Notebook Generation Source of Truth | Treats tutorial `.py` files as editable sources and notebooks as generated artifacts. | [`notebook-generation.md`](accepted/notebook-generation.md) | -| Documentation | Accepted | Plotting & Docs Performance for Interactive Figures | Self-hosts a lazy, shared figure runtime so docs pages load fast and progressively while staying interactive. | [`plotting-docs-performance.md`](accepted/plotting-docs-performance.md) | -| Documentation | Accepted | Documentation CI and Build Verification | Strict MkDocs builds, API-derived docs, snippet smoke tests, link checks, and prose/spelling checks. | [`documentation-ci-build.md`](accepted/documentation-ci-build.md) | -| Documentation | Accepted | Data Download Source Pinning | Pins downloadable data to one git commit kept in a packaged file, drops the redundant index checksum, cache-busting by commit-named index. | [`data-source-pinning.md`](accepted/data-source-pinning.md) | -| Experiment model | Accepted | Immutable Experiment Type | Makes experiment type axes creation-time state rather than mutable runtime state. | [`immutable-experiment-type.md`](accepted/immutable-experiment-type.md) | -| Experiment model | Accepted | Automatic Line-Segment Background Estimation | Detects line-segment background control points from the measured pattern, peak-insensitive and editable. | [`background-auto-estimate.md`](accepted/background-auto-estimate.md) | -| Experiment model | Accepted | Calculation Without Measured Data | Adds a writable `data_range` category so a structure-only experiment is calculable and plottable without loaded data. | [`calculation-without-measured-data.md`](accepted/calculation-without-measured-data.md) | -| Experiment model | Accepted | Preferred-Orientation Category | Adds a per-phase March–Dollase preferred-orientation category for textured powder refinement on the CrysPy backend. | [`preferred-orientation-category.md`](accepted/preferred-orientation-category.md) | -| Experiment model | Accepted | Model Sample Absorption (Debye–Scherrer, μR) | Switchable `absorption` category applying a calculator-independent cylindrical Hewat A(θ) envelope for powder samples. | [`model-sample-absorption.md`](accepted/model-sample-absorption.md) | -| Factories | Accepted | Factory Contracts and Metadata | Standardizes factory construction, metadata, compatibility, and registration behavior. | [`factory-contracts.md`](accepted/factory-contracts.md) | -| Naming | Accepted | Factory Tag Naming | Defines canonical factory tag style and standard abbreviations. | [`factory-tag-naming.md`](accepted/factory-tag-naming.md) | -| Naming | Accepted | Downloadable Resource Naming | Replaces integer dataset/tutorial ids with stable descriptive slugs and moves presentation order into separate metadata. | [`resource-naming.md`](accepted/resource-naming.md) | -| Persistence | Accepted | Free-Flag CIF Encoding | Encodes fit free/fixed state through CIF uncertainty syntax instead of a separate free list. | [`free-flag-cif-encoding.md`](accepted/free-flag-cif-encoding.md) | -| Persistence | Accepted | Loop Category Keys and Identity Naming | Documents loop collection keys and naming rules aligned with CIF category keys. | [`loop-category-key-identity.md`](accepted/loop-category-key-identity.md) | -| Persistence | Accepted | Project Facade and Persistence Layout | Documents the current `Project` facade and saved directory layout. | [`project-facade-and-persistence.md`](accepted/project-facade-and-persistence.md) | -| Persistence | Accepted | IUCr CIF Tag Alignment | Aligns default CIF tags with IUCr dictionaries and adds a clean IUCr-aligned report export. | [`iucr-cif-tag-alignment.md`](accepted/iucr-cif-tag-alignment.md) | -| Persistence | Accepted | Python and CIF Category Correspondence | Compares current Python paths and CIF tags, then records scoped one-to-one mapping for project-level categories. | [`python-cif-category-correspondence.md`](accepted/python-cif-category-correspondence.md) | -| Persistence | Accepted | Edi Project Persistence | Defines STAR-based EasyDiffraction project files with UX-oriented names and strict CIF reserved for report export. | [`edstar-project-persistence.md`](accepted/edstar-project-persistence.md) | -| Quality | Accepted | Lint Complexity Thresholds | Treats ruff PLR complexity limits as design guardrails that should not be bypassed. | [`lint-complexity-thresholds.md`](accepted/lint-complexity-thresholds.md) | -| Quality | Accepted | Lint Rule Scope and Test-File Exceptions | Records the standing tests/\*\* PLR/N812 ignores and CIF-aligned `id`/`type` builtin exception from the lint audit. | [`lint-rule-exceptions.md`](accepted/lint-rule-exceptions.md) | -| Quality | Accepted | Test Strategy | Defines layered unit, functional, integration, script, and notebook testing. | [`test-strategy.md`](accepted/test-strategy.md) | -| Quality | Accepted | Test Suite and Validation Strategy | Strict test layers, cost tiers, coverage/codecov policy, cross-engine verification docs, and a nightly validation harness. | [`test-suite-and-validation.md`](accepted/test-suite-and-validation.md) | -| Structure model | Accepted | Type-Neutral ADP Parameters | Keeps ADP parameter object identities stable across B/U and iso/ani switches. | [`type-neutral-adp-parameters.md`](accepted/type-neutral-adp-parameters.md) | -| Structure model | Accepted | Automatic Wyckoff Position Detection | Detects Wyckoff letter, multiplicity, and site symmetry from space group and coordinates; calculators consume them. | [`wyckoff-letter-detection.md`](accepted/wyckoff-letter-detection.md) | -| Structure model | Accepted | Complete Space-Group Reference Database | One-time build of a complete space_groups.json.gz (all 230 groups) from cctbx, verified against multiple sources. | [`space-group-database.md`](accepted/space-group-database.md) | -| User-facing API | Accepted | Crystal Structure 3D Visualization | Adds a renderer-neutral scene model drawn by ASCII and interactive Three.js engines for viewing crystal structures. | [`crysview-structure-visualization.md`](accepted/crysview-structure-visualization.md) | -| User-facing API | Accepted | Display UX Facade | Defines `project.display` and `project.rendering` responsibilities and display method names. | [`display-ux.md`](accepted/display-ux.md) | -| User-facing API | Accepted | Fit Results Display Naming | Short, IUCr/GUM-aligned column headers (`s.u.`, `value`, `95% CI`) with a footnote glossary on every fit table. | [`fit-results-display-naming.md`](accepted/fit-results-display-naming.md) | -| User-facing API | Accepted | Project Summary Rendering | Defines project report configuration plus terminal, HTML, TeX, PDF, and clean report-CIF metadata policy. | [`project-summary-rendering.md`](accepted/project-summary-rendering.md) | -| User-facing API | Accepted | Selector Families | Distinguishes backend selectors, switchable-category selectors, and active-sibling selectors. | [`selector-families.md`](accepted/selector-families.md) | -| User-facing API | Accepted | String Paths and Live Descriptors | Separates persisted field selectors from references to live model parameters. | [`string-paths-and-live-descriptors.md`](accepted/string-paths-and-live-descriptors.md) | -| User-facing API | Accepted | Switchable Category API | Places multi-type category selectors on the owner and omits public selectors for fixed or single-type categories. | [`switchable-category-api.md`](accepted/switchable-category-api.md) | -| User-facing API | Accepted | Switchable Category Owned Selectors | Moves the writable `type` selector and `show_supported()` onto the category itself; collapses the CIF duplication. | [`switchable-category-owned-selectors.md`](accepted/switchable-category-owned-selectors.md) | -| User-facing API | Accepted | Unified Pattern View | `pattern()` always renders available data, drops `include`, and unifies single- and three-panel figure sizing. | [`pattern-display-unification.md`](accepted/pattern-display-unification.md) | -| User-facing API | Accepted | Value-Selector Discovery | Gives enumerated value fields a per-descriptor `show_supported()`, beside the three category-level selector families. | [`value-selector-discovery.md`](accepted/value-selector-discovery.md) | +| Group | Status | Title | Short description | Link | +| -------------------- | ---------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | +| Analysis and fitting | Accepted | Fit Mode Categories and Fit Execution API | Splits fitting configuration from execution and defines active sibling fit-mode categories. | [`fit-mode-categories.md`](accepted/fit-mode-categories.md) | +| Analysis and fitting | Accepted | Runtime Fit Results | Keeps full fit outputs runtime-only in the current design unless a narrower persistence ADR is accepted. | [`runtime-fit-results.md`](accepted/runtime-fit-results.md) | +| Analysis and fitting | Accepted | Analysis CIF Fit State | Defines the persisted fit-state projection in `analysis/analysis.cif` and `analysis/mcmc.h5`. | [`analysis-cif-fit-state.md`](accepted/analysis-cif-fit-state.md) | +| Analysis and fitting | Accepted | Parameter Correlation Persistence | Persists deterministic and posterior correlation summaries in `_fit_parameter_correlation` | [`parameter-correlation-persistence.md`](accepted/parameter-correlation-persistence.md) | +| Analysis and fitting | Suggestion | Fit Output Files and Data Exports | Narrows remaining archive/export questions after adopting `results.csv` and `mcmc.h5`. | [`fit-output-files-and-data-exports.md`](suggestions/fit-output-files-and-data-exports.md) | +| Analysis and fitting | Suggestion | Dataset-Driven Fit Mode Availability | Offers fit modes by per-mode preconditions, restricts `single` to one dataset (closing issue 85), and keeps `sequential` as the folder sweep. | [`dataset-driven-fit-modes.md`](suggestions/dataset-driven-fit-modes.md) | +| Analysis and fitting | Accepted | Minimizer Category Consolidation | Collapses the seven Bayesian categories into one owner-level switchable `minimizer` category with HDF5 sidecar. | [`minimizer-category-consolidation.md`](accepted/minimizer-category-consolidation.md) | +| Analysis and fitting | Accepted | Minimizer Input/Output Split | Keeps `analysis.minimizer` input-only and moves scalar fit outputs to paired `analysis.fit_result` classes. | [`minimizer-input-output-split.md`](accepted/minimizer-input-output-split.md) | +| Analysis and fitting | Superseded | Parameter-Level Posterior Projection | Superseded by minimizer-category consolidation; kept as historical context for `parameter.posterior`. | [`parameter-posterior-summary.md`](suggestions/parameter-posterior-summary.md) | +| Analysis and fitting | Accepted | Undo Fit | Builds rollback semantics and CLI behavior on already-persisted pre-fit scalar snapshots. | [`undo-fit.md`](accepted/undo-fit.md) | +| Analysis and fitting | Accepted | Bayesian Resume and MCMC Sidecar Naming | Extends bumps-DREAM with resume/extend like emcee and renames the MCMC sidecar to `mcmc.h5` with per-engine state groups. | [`bayesian-resume-and-mcmc-sidecar.md`](accepted/bayesian-resume-and-mcmc-sidecar.md) | +| Core model | Accepted | Category Owners and Real Datablocks | Introduces `CategoryOwner` so singleton sections do not pretend to be real CIF datablocks. | [`category-owner-sections.md`](accepted/category-owner-sections.md) | +| Core model | Accepted | Enum-Backed Closed Value Sets | Requires finite option sets to use `(str, Enum)` classes for validation and dispatch. | [`enum-backed-closed-values.md`](accepted/enum-backed-closed-values.md) | +| Core model | Accepted | Guarded Public Properties | Uses property setters as the public writability contract for guarded objects. | [`guarded-public-properties.md`](accepted/guarded-public-properties.md) | +| Core model | Accepted | Two-Level Category Parameter Access | Keeps parameter access to `datablock.category.parameter` or `datablock.collection[id].parameter`. | [`category-parameter-access.md`](accepted/category-parameter-access.md) | +| Documentation | Accepted | Descriptor Property Docstring Template | Makes descriptor metadata the source of truth for public property docstrings and annotations. | [`property-docstring-template.md`](accepted/property-docstring-template.md) | +| Documentation | Accepted | Development Documentation Structure | Defines the `docs/dev` layout for ADRs, issues, plans, package structure, and roadmap. | [`development-docs-structure.md`](accepted/development-docs-structure.md) | +| Documentation | Accepted | Help Method Discoverability | Requires primary public objects and facades to expose consistent `help()` output. | [`help-discoverability.md`](accepted/help-discoverability.md) | +| Documentation | Accepted | Notebook Generation Source of Truth | Treats tutorial `.py` files as editable sources and notebooks as generated artifacts. | [`notebook-generation.md`](accepted/notebook-generation.md) | +| Documentation | Accepted | Plotting & Docs Performance for Interactive Figures | Self-hosts a lazy, shared figure runtime so docs pages load fast and progressively while staying interactive. | [`plotting-docs-performance.md`](accepted/plotting-docs-performance.md) | +| Documentation | Accepted | Documentation CI and Build Verification | Strict MkDocs builds, API-derived docs, snippet smoke tests, link checks, and prose/spelling checks. | [`documentation-ci-build.md`](accepted/documentation-ci-build.md) | +| Documentation | Accepted | Data Download Source Pinning | Pins downloadable data to one git commit kept in a packaged file, drops the redundant index checksum, cache-busting by commit-named index. | [`data-source-pinning.md`](accepted/data-source-pinning.md) | +| Experiment model | Accepted | Immutable Experiment Type | Makes experiment type axes creation-time state rather than mutable runtime state. | [`immutable-experiment-type.md`](accepted/immutable-experiment-type.md) | +| Experiment model | Accepted | Automatic Line-Segment Background Estimation | Detects line-segment background control points from the measured pattern, peak-insensitive and editable. | [`background-auto-estimate.md`](accepted/background-auto-estimate.md) | +| Experiment model | Accepted | Calculation Without Measured Data | Adds a writable `data_range` category so a structure-only experiment is calculable and plottable without loaded data. | [`calculation-without-measured-data.md`](accepted/calculation-without-measured-data.md) | +| Experiment model | Accepted | Preferred-Orientation Category | Adds a per-phase March–Dollase preferred-orientation category for textured powder refinement on the CrysPy backend. | [`preferred-orientation-category.md`](accepted/preferred-orientation-category.md) | +| Experiment model | Accepted | Model Sample Absorption (Debye–Scherrer, μR) | Switchable `absorption` category applying a calculator-independent cylindrical Hewat A(θ) envelope for powder samples. | [`model-sample-absorption.md`](accepted/model-sample-absorption.md) | +| Factories | Accepted | Factory Contracts and Metadata | Standardizes factory construction, metadata, compatibility, and registration behavior. | [`factory-contracts.md`](accepted/factory-contracts.md) | +| Naming | Accepted | Factory Tag Naming | Defines canonical factory tag style and standard abbreviations. | [`factory-tag-naming.md`](accepted/factory-tag-naming.md) | +| Naming | Accepted | Downloadable Resource Naming | Replaces integer dataset/tutorial ids with stable descriptive slugs and moves presentation order into separate metadata. | [`resource-naming.md`](accepted/resource-naming.md) | +| Persistence | Accepted | Free-Flag CIF Encoding | Encodes fit free/fixed state through CIF uncertainty syntax instead of a separate free list. | [`free-flag-cif-encoding.md`](accepted/free-flag-cif-encoding.md) | +| Persistence | Accepted | Loop Category Keys and Identity Naming | Documents loop collection keys and naming rules aligned with CIF category keys. | [`loop-category-key-identity.md`](accepted/loop-category-key-identity.md) | +| Persistence | Accepted | Project Facade and Persistence Layout | Documents the current `Project` facade and saved directory layout. | [`project-facade-and-persistence.md`](accepted/project-facade-and-persistence.md) | +| Persistence | Accepted | IUCr CIF Tag Alignment | Aligns default CIF tags with IUCr dictionaries and adds a clean IUCr-aligned report export. | [`iucr-cif-tag-alignment.md`](accepted/iucr-cif-tag-alignment.md) | +| Persistence | Accepted | Python and CIF Category Correspondence | Compares current Python paths and CIF tags, then records scoped one-to-one mapping for project-level categories. | [`python-cif-category-correspondence.md`](accepted/python-cif-category-correspondence.md) | +| Persistence | Accepted | Edi Project Persistence | Defines STAR-based EasyDiffraction project files with UX-oriented names and strict CIF reserved for report export. | [`edstar-project-persistence.md`](accepted/edstar-project-persistence.md) | +| Quality | Accepted | Lint Complexity Thresholds | Treats ruff PLR complexity limits as design guardrails that should not be bypassed. | [`lint-complexity-thresholds.md`](accepted/lint-complexity-thresholds.md) | +| Quality | Accepted | Lint Rule Scope and Test-File Exceptions | Records the standing tests/\*\* PLR/N812 ignores and CIF-aligned `id`/`type` builtin exception from the lint audit. | [`lint-rule-exceptions.md`](accepted/lint-rule-exceptions.md) | +| Quality | Accepted | Test Strategy | Defines layered unit, functional, integration, script, and notebook testing. | [`test-strategy.md`](accepted/test-strategy.md) | +| Quality | Accepted | Test Suite and Validation Strategy | Strict test layers, cost tiers, coverage/codecov policy, cross-engine verification docs, and a nightly validation harness. | [`test-suite-and-validation.md`](accepted/test-suite-and-validation.md) | +| Structure model | Accepted | Type-Neutral ADP Parameters | Keeps ADP parameter object identities stable across B/U and iso/ani switches. | [`type-neutral-adp-parameters.md`](accepted/type-neutral-adp-parameters.md) | +| Structure model | Accepted | Automatic Wyckoff Position Detection | Detects Wyckoff letter, multiplicity, and site symmetry from space group and coordinates; calculators consume them. | [`wyckoff-letter-detection.md`](accepted/wyckoff-letter-detection.md) | +| Structure model | Accepted | Complete Space-Group Reference Database | One-time build of a complete space_groups.json.gz (all 230 groups) from cctbx, verified against multiple sources. | [`space-group-database.md`](accepted/space-group-database.md) | +| User-facing API | Accepted | Crystal Structure 3D Visualization | Adds a renderer-neutral scene model drawn by ASCII and interactive Three.js engines for viewing crystal structures. | [`crysview-structure-visualization.md`](accepted/crysview-structure-visualization.md) | +| User-facing API | Accepted | Display UX Facade | Defines `project.display` and `project.rendering` responsibilities and display method names. | [`display-ux.md`](accepted/display-ux.md) | +| User-facing API | Accepted | Fit Results Display Naming | Short, IUCr/GUM-aligned column headers (`s.u.`, `value`, `95% CI`) with a footnote glossary on every fit table. | [`fit-results-display-naming.md`](accepted/fit-results-display-naming.md) | +| User-facing API | Accepted | Project Summary Rendering | Defines project report configuration plus terminal, HTML, TeX, PDF, and clean report-CIF metadata policy. | [`project-summary-rendering.md`](accepted/project-summary-rendering.md) | +| User-facing API | Accepted | Selector Families | Distinguishes backend selectors, switchable-category selectors, and active-sibling selectors. | [`selector-families.md`](accepted/selector-families.md) | +| User-facing API | Accepted | String Paths and Live Descriptors | Separates persisted field selectors from references to live model parameters. | [`string-paths-and-live-descriptors.md`](accepted/string-paths-and-live-descriptors.md) | +| User-facing API | Accepted | Switchable Category API | Places multi-type category selectors on the owner and omits public selectors for fixed or single-type categories. | [`switchable-category-api.md`](accepted/switchable-category-api.md) | +| User-facing API | Accepted | Switchable Category Owned Selectors | Moves the writable `type` selector and `show_supported()` onto the category itself; collapses the CIF duplication. | [`switchable-category-owned-selectors.md`](accepted/switchable-category-owned-selectors.md) | +| User-facing API | Accepted | Unified Pattern View | `pattern()` always renders available data, drops `include`, and unifies single- and three-panel figure sizing. | [`pattern-display-unification.md`](accepted/pattern-display-unification.md) | +| User-facing API | Accepted | Value-Selector Discovery | Gives enumerated value fields a per-descriptor `show_supported()`, beside the three category-level selector families. | [`value-selector-discovery.md`](accepted/value-selector-discovery.md) | diff --git a/docs/dev/adrs/suggestions/dataset-driven-fit-modes.md b/docs/dev/adrs/suggestions/dataset-driven-fit-modes.md new file mode 100644 index 000000000..990ca85a5 --- /dev/null +++ b/docs/dev/adrs/suggestions/dataset-driven-fit-modes.md @@ -0,0 +1,259 @@ +# ADR: Dataset-Driven Fit Mode Availability + +## Status + +Proposed. + +## Date + +2026-06-16 + +## Group + +Analysis and fitting. + +## Context + +The analysis layer offers three fit modes through the `fitting_mode` +switchable category established by +[`fit-mode-categories`](accepted/fit-mode-categories.md): `single`, +`joint`, and `sequential`. Two problems make the current surface +confusing and partly incorrect. + +**`single` is overloaded.** It is the friendly name for the one-dataset +case, but it _also_ silently loops over multiple loaded experiments, +fitting each in turn (`_fit_single_experiments`, `analysis.py`). Because +the structure object is shared across experiments +(`Fitter._collect_fit_parameters` uses `structures.free_parameters`), +each fit overwrites the shared structure and per-experiment results are +not retained — so plotting an earlier experiment shows the _last_ +experiment's calculated pattern. This is **issue 85**. A legacy +in-memory `_parameter_snapshots` store plus +`plot_param_series_from_snapshots` exists only as a fallback for this +`single`-with-N path. + +**The mode list is static.** All three modes are always offered, even +when a mode cannot run on the current project, and there is no signal of +which mode actually fits the loaded data: + +- `joint` requires ≥2 loaded experiments (`_prepare_joint_fit`). +- `sequential` requires **exactly one** loaded experiment used as a + _template_, swept over a **folder of files on disk** + (`sequential_fit.data_dir` / `file_pattern`), writing per-point + results to `analysis/results.csv` with parameter-evolution plots. A + guard test asserts `match='exactly 1 experiment'`. + +The intended `sequential` workflow is already good and should be kept as +is: load one dataset, tune the model interactively, switch to +`sequential`, point at a folder (plus a file extension), and run. + +This ADR therefore (1) makes mode availability reflect what each mode +can actually do on the current project, (2) restricts `single` to the +one-dataset case — which removes the buggy multi-loop and closes issue +85 — (3) keeps `sequential` as the folder sweep it already is, and (4) +tidies the `sequential` data-source configuration (sensible defaults, an +optional copy-into-project flag, and room for a future remote source). +It extends [`fit-mode-categories`](accepted/fit-mode-categories.md). + +An earlier draft of this ADR proposed redefining `sequential` to fit the +loaded datasets in turn; that direction was dropped (see Alternatives +Considered) in favour of keeping the existing, tested `sequential` +behaviour and solving issue 85 by restricting `single`. + +## Decision + +### 1. Mode availability is precondition-based, not a static list + +Each fit mode declares a **precondition predicate** — "can I run on this +project right now?" — and `fitting_mode.show_supported()` lists exactly +the modes whose preconditions the current project satisfies. This is +wired through the existing switchable-category selector +(`FittingMode._supported_types(filters)`, which today ignores its +`filters`); it now consumes project state. No new owner-level setter is +added — the category-owned-selector contract from +[`switchable-category-owned-selectors`](accepted/switchable-category-owned-selectors.md) +is preserved. + +Preconditions: + +- `single` → exactly one experiment with measured data. +- `joint` → two or more experiments with measured data. +- `sequential` → exactly one experiment with measured data (the + template) plus a resolvable data source (checked fully at fit time; + see Decision 4). + +The availability table is a **consequence** of these predicates, not a +hard-coded rule: + +| Experiments loaded | Available modes | +| ------------------ | ---------------------- | +| 0 | — (nothing fittable) | +| 1 | `single`, `sequential` | +| ≥ 2 | `joint` | + +Predicate-based detection is preferred over a central `if count >= 2` +switch because it is **honest** (it can also reflect, e.g., an +experiment with no measured data, not just a count), **extensible** (a +future remote data source simply becomes another way `sequential`'s +"resolvable data source" precondition is met — see Deferred Work), and +keeps the selector contract clean. + +### 2. Restrict `single` to exactly one loaded experiment + +`single` means "fit the one loaded dataset." It is no longer a +multi-experiment loop. This removes the `single`-with-N behaviour. + +### 3. Keep `sequential` as the folder-of-files sweep + +`sequential` keeps its current behaviour unchanged: one loaded +experiment as a template, swept over a folder of data files, producing +per-point `results.csv` and parameter-evolution plots. It is offered +**alongside `single` when exactly one dataset is loaded** — matching the +real workflow (tune one dataset, then switch to `sequential` and point +at a folder). There is no redefinition and no behavioural change to the +sweep itself. + +### 4. Tidy the `sequential` data-source configuration + +The `sequential_fit` category keeps `data_dir`, `file_pattern`, +`max_workers`, `chunk_size`, and `reverse`, with these refinements: + +- **`file_pattern` default derived from the template.** Default the glob + to the loaded template experiment's own data-file extension (load + `.xye` → default `*.xye`); fall back to `*` only when the extension is + unknown. Zero-config for the common case. +- **No smart default for `data_dir`.** It stays unset by default; a + silent auto-pickup of files from a guessed folder would be surprising. +- **`copy_data` (new boolean, default `False`).** When `False` + (default), matched files are referenced in place; when `True`, the + matched files are copied into the project so it is self-contained. + Default-off avoids surprising large copies for thousand-file series, + while letting users opt into a portable, archived project. + +### 5. Close issue 85 by removing `single`-with-N + +With `single` restricted to one experiment, the multi-experiment loop +that overwrote the shared structure no longer exists, so issue 85 cannot +occur. The `_parameter_snapshots` in-memory store and +`plot_param_series_from_snapshots` fallback — fed **only** by +`single`-with-N — lose their producer and are removed as dead code. +Parameter-evolution plotting remains served by `sequential`'s +`results.csv` path (`_plot_param_series_from_csv`). + +### 6. Validate at fit time with clear errors; never switch modes silently + +- Selecting a mode whose preconditions the project does not meet (e.g. a + persisted `single` after a second dataset is loaded, or `joint` with + one dataset) → a clear `ValueError` naming the valid modes. +- `sequential` with an unset/unresolvable `data_dir` or no matching + files → a clear `ValueError` recommending the user check/set + `data_dir` and `file_pattern`. This is an **error**, not a warning: + the user explicitly asked to fit, and there is nothing to fit. +- The mode is never silently auto-switched behind the user's back. + +### 7. Hide irrelevant mode categories from display; never mutate the attribute set + +`joint_fit`, `sequential_fit`, and `sequential_fit_extract` remain +**eagerly instantiated** and always present as attributes. Visibility in +`analysis.help()` / display and inclusion in CIF follow the active mode +via the existing `_help_filter` and `_serializable_categories` filters. +The attribute set is never dynamically added to or removed from based on +project state, per the "eager, explicit `__init__`, no runtime class +mutation" architecture in §Architecture. + +## Consequences + +### Positive + +- The offered mode list reflects what can actually run on the loaded + project — far less confusing than a static three-mode list. +- The `single`/`sequential` overload is gone; issue 85 is closed by + construction rather than patched. +- `sequential` — a substantial, tested feature — is left untouched, so + this change is low risk. +- The dead `_parameter_snapshots` fallback is removed. +- Precondition-based detection extends cleanly to future data sources. +- `copy_data` enables self-contained projects when wanted, without + forcing copies on large series. + +### Trade-offs + +- There is no built-in way to fit two or more **separately loaded** + datasets _independently_; that is served by separate projects or by a + folder-based `sequential` series. Accepted by the project owner + ("compare independent results → separate projects"). +- Availability now depends on mutable project state (experiment count + and measured-data presence), so the offered list changes as data is + loaded — intended, but a shift from the previous static listing. +- `copy_data` adds one configuration field and a copy step to maintain. + +### Compatibility + +- Project is in beta: no shims. Tutorials, tests, and CLI that relied on + `single`-with-N are updated to use `joint`, `sequential`, or separate + projects as appropriate. +- CIF restore: a persisted `fitting_mode.type` that is invalid for the + restored project is kept as stored but rejected at fit time with a + clear error (Decision 6); it is not silently rewritten. + +## Alternatives Considered + +### Redefine `sequential` to fit the loaded datasets in turn + +The earlier draft of this ADR redefined `sequential` as "fit each of the +≥2 loaded experiments in turn, carrying parameters forward, retaining +per-dataset results," making it the ≥2 mode and resolving issue 85 by +its construction. Rejected: it is a risky behavioural change to a tested +feature, and it required a carry-forward design, a plot-replay contract +to avoid corrupting the shared live structure, explicit series +preconditions, and a resolution of the `sequential_fit` folder-surface +conflict (park vs split into a `scan` mode). Keeping `sequential` as the +existing folder sweep and restricting `single` achieves the same goals +with far less surface area and risk. + +### Keep `single`-with-N and fix issue 85 with snapshot-restore + +Retain the multi-dataset `single` loop and fix issue 85 by storing each +experiment's fitted parameters and re-applying them (in a scoped, +self-restoring context) before plotting. Rejected: it keeps and hardens +a path the owner does not want, and adds replay machinery; removing +`single`-with-N dissolves the bug instead. + +### Static mode list or a central count switch + +Keep listing all modes always, or gate them with a single +`if count >= 2` block. Rejected in favour of per-mode precondition +predicates, which are more honest about _why_ a mode is unavailable and +extend to future input sources. + +### Auto-default `data_dir` to a project folder + +Default `sequential_fit.data_dir` to a conventional in-project folder. +Rejected: silently picking up files from a guessed location is +surprising; an explicit clear error when no source is configured is +safer and more discoverable. + +## Open Questions + +- **`copy_data` mechanics.** When the copy happens (at config time vs at + fit time), what is stored after a copy (the in-project path vs the + original reference), and the overwrite/dedup policy. The field and its + default-off behaviour are decided here; the copy mechanism may be a + small follow-up. +- **Resume.** Resume is currently "single mode only" + (`_validate_fit_request`). Confirm `single` (one dataset) keeps resume + as today; any per-point resume for `sequential` is out of scope. + +## Deferred Work + +- **Remote / online data source for `sequential`.** This ADR only + requires that the data-source configuration **not preclude** it: + `sequential`'s input is framed conceptually as a "data source" whose + first concrete form is a local folder (`data_dir` + `file_pattern`). A + future ADR can add a URL / online-resource source as another way to + satisfy the `sequential` "resolvable data source" precondition, + reusing the same mode and `results.csv` evolution output without + reopening the mode design. +- The `copy_data` copy mechanism, if not implemented in the first step. +- Detailed result-file/export layout remains governed by + [`fit-output-files-and-data-exports`](suggestions/fit-output-files-and-data-exports.md). diff --git a/docs/dev/adrs/suggestions/dataset-driven-fit-modes_reply-1.md b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_reply-1.md new file mode 100644 index 000000000..af5464cab --- /dev/null +++ b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_reply-1.md @@ -0,0 +1,80 @@ +# Reply 1: Dataset-Driven Fit Modes and Sequential Redefinition + +## P1 — Resolve the `sequential_fit` category before redefining `sequential` + +**Verdict:** Agree. + +The redefinition and the deferred folder sweep genuinely cannot share +the `sequential_fit` / `sequential_fit_extract` surface — and the two +input models cannot live under one count-gated mode, since the folder +sweep needs _exactly one_ template while loaded-dataset `sequential` +needs _≥2_ (opposite preconditions). The ADR now commits to a first-step +contract instead of leaving the surface ambiguous. + +**Action taken:** + +- Added **Decision 5a — "The folder-of-files sweep is parked for the + first step"**: loaded-dataset `sequential` uses neither folder + category; the folder-sweep path and its categories are retained in + code but parked (not selectable, hidden from display, omitted from CIF + so stale folder settings cannot survive under a mode that no longer + reads them). Restoration is the deferred input-source ADR. +- Flagged the parking as a **temporary removal of a tested workflow + requiring owner sign-off** (per §Change Discipline), with the + no-removal alternative spelled out. +- Added **Alternatives Considered — "Split the folder sweep into a + `scan` mode now"** as the documented fallback (keeps the feature + continuously available at the cost of adding `scan` to the one-dataset + availability row). +- Rewrote the **Open Questions** folder-sweep item to separate the now- + settled first-step contract from the still-open long-term home, and + updated the **Trade-offs** bullet accordingly. + +Affected sections: `## Decision` (5a), `## Alternatives Considered`, +`## Open Questions` (long-term home of the folder sweep), +`## Consequences` (Trade-offs). + +## P1 — Define replay semantics so plotting does not corrupt live state + +**Verdict:** Agree. + +Applying a stored per-point parameter set to the single shared structure +is itself a mutation, so the issue-85 fix needed an explicit rule to +avoid replacing one correctness bug with another (plotting point A +changing point B / `save` / `undo`). + +**Action taken:** + +- Added **Decision 4a — "Replay contract"**: the live model is + authoritative and never perturbed by viewing; per-point recomputation + is a scoped, self-restoring apply (captures live values, computes, + restores on exit including on error, internal-only); plotting prefers + reading persisted/cached per-point calculated arrays over recomputing; + and `save` / `undo` operate on the live model only, independent of + whichever point was last plotted. + +Affected section: `## Decision` (4a). + +## P1 — Specify what makes loaded experiments a valid sequential series + +**Verdict:** Agree. + +"Two loaded experiments" is not the same as "a fittable series," and the +preconditions belong in the decision rather than the plan. + +**Action taken:** + +- Extended **Decision 3** to make the carry-forward scope precise + (shared structure parameters carry forward; per-experiment parameters + are fit independently per point; deterministic project-order with an + opt-in reverse). +- Added **Decision 3a — "Preconditions that make loaded experiments a + valid series"**: `show_supported()` is gated by experiment **count + only** (predictable, explainable); the richer rules — measured data on + every experiment, a shared structure model across the series, each + experiment individually fittable (valid calculator + non-empty free + set), stable order — are enforced at **fit time** with errors that + name the offending experiment and rule. Experiment/calculator types + may differ across points. + +Affected sections: `## Decision` (3, 3a). diff --git a/docs/dev/adrs/suggestions/dataset-driven-fit-modes_reply-2.md b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_reply-2.md new file mode 100644 index 000000000..a8baeb66d --- /dev/null +++ b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_reply-2.md @@ -0,0 +1,25 @@ +# Reply 2: Dataset-Driven Fit Modes and Sequential Redefinition + +## P1 — Give loaded-dataset `reverse` a public home or defer it + +**Verdict:** Agree. + +The Reply 1 edits introduced an "opt-in reverse" for loaded-dataset +`sequential` while Decision 5a simultaneously parked `sequential_fit` +(where `reverse` lives) — hidden and omitted from CIF. That left the +reverse option with no public or persisted home, and the ADR adds no +owner-level setter, so the plan would have had to invent unapproved API +surface. Inventing a loaded-series config category just to host one +ordering flag is not worth it in the first step. + +**Action taken:** + +- Edited **Decision 3** to drop configurable reverse/custom ordering + from the first step. The series order is now simply the deterministic + project collection order; the ADR explicitly states that the existing + `reverse` flag lives on the parked `sequential_fit` category, that no + new owner-level setter or category is added for it, and that ordering + control is **deferred to the input-source follow-up**. Until then, + users order the series by the order in which they add experiments. + +Affected section: `## Decision` (3). diff --git a/docs/dev/adrs/suggestions/dataset-driven-fit-modes_review-1.md b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_review-1.md new file mode 100644 index 000000000..a1d1635e5 --- /dev/null +++ b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_review-1.md @@ -0,0 +1,78 @@ +# Review 1: Dataset-Driven Fit Modes and Sequential Redefinition + +## Findings + +### P1. Resolve the `sequential_fit` category before redefining `sequential` + +The ADR redefines `sequential` to fit the already loaded experiments in +turn, but it also keeps `sequential_fit` and `sequential_fit_extract` as +mode-specific categories that remain visible and serializable when +sequential mode is relevant (`dataset-driven-fit-modes.md` lines +124-133). Those categories are not neutral today: the accepted fit-mode +ADR and persistence mapping define them around the folder sweep +(`data_dir`, `file_pattern`, `max_workers`, `chunk_size`, `reverse`, and +extraction rules), and the current code consumes those fields directly +when running sequential fits. At the same time, this ADR defers the +folder-sweep fate out of the first implementation +(`dataset-driven-fit-modes.md` lines 268-270). + +That leaves the first implementation with two incompatible meanings for +the same public and persisted surface. If `sequential_fit` remains +visible for loaded-dataset sequential fits, users will see folder-input +fields that are irrelevant to the loaded experiments. If it is omitted, +Decision 5 is wrong. If it is serialized, old folder settings can +survive under a mode that no longer reads them. Please make the ADR +choose the first-step contract explicitly: either retire or hide the +folder-specific categories until a later input-source design, split the +folder sweep into a separate mode/workflow now, or define +`sequential_fit` as an input-source category whose loaded-dataset case +has a clear no-folder representation. + +### P1. Define replay semantics so plotting does not corrupt live state + +Decision 4 says issue 85 is fixed by applying an experiment's stored +parameter set to the shared structure before recomputing or plotting +that experiment (`dataset-driven-fit-modes.md` lines 114-122). Because +the project has one live structure object shared by all loaded +experiments, applying an earlier point's fitted parameters is itself a +state mutation. The ADR does not say whether that mutation is temporary, +whether the previous live state is restored after plotting, whether the +"current" project model becomes whichever point was plotted last, or how +this interacts with save and undo. + +Without that rule, the proposed fix can replace issue 85 with a +different correctness bug: plotting experiment A can silently change the +structure values used for experiment B, subsequent calculations, and the +saved project. Please specify the replay contract in the ADR. For +example, require plot/calculation replay to apply stored per-dataset +parameters in a scoped temporary context that restores the pre-plot live +model, or choose a non-mutating storage strategy such as persisted +calculated arrays for each fitted dataset. + +### P1. Specify what makes loaded experiments a valid sequential series + +The availability table makes `sequential` available for any project with +at least two loaded experiments (`dataset-driven-fit-modes.md` lines +71-92), while fit-time validation only says "`sequential` with no +fittable series" should raise a clear error +(`dataset-driven-fit- modes.md` lines 143-152). The ADR never defines +the boundary between "two loaded experiments" and "a fittable series." +That matters because the scientific intent is "the same sample, fit per +point" (lines 29-30), but a project can contain multiple arbitrary +experiments, possibly with different experiment types, calculators, +measured-data state, structures, free-parameter sets, or intended +ordering. + +Please make the sequential preconditions part of the decision rather +than leaving them to the plan. At minimum, the ADR should say whether +loaded-dataset sequential requires exactly one structure, measured data +on every experiment, compatible experiment/calculator types, a stable +experiment order, and a consistent carried-forward free-parameter set. +Those rules also need to feed `show_supported()` or the fit-time error +message so scientists are not offered a workflow that cannot be +explained from the loaded project state. + +## Checks + +Static review only. Per `AGENTS.md`, I did not run tests, lint, +formatters, build commands, or any `pixi` command. diff --git a/docs/dev/adrs/suggestions/dataset-driven-fit-modes_review-2.md b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_review-2.md new file mode 100644 index 000000000..4b30d09ca --- /dev/null +++ b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_review-2.md @@ -0,0 +1,29 @@ +# Review 2: Dataset-Driven Fit Modes and Sequential Redefinition + +## Findings + +### P1. Give loaded-dataset `reverse` a public home or defer it + +The revised ADR now says loaded-dataset `sequential` has deterministic +project collection order "with an opt-in reverse (mirroring the existing +`reverse` flag)" (`dataset-driven-fit-modes.md` lines 121-123). But +Decision 5a also says loaded-dataset `sequential` uses neither +`sequential_fit` nor `sequential_fit_extract`, and the folder sweep +categories are parked, hidden, and omitted from CIF +(`dataset-driven-fit-modes.md` lines 215-221). Today `reverse` lives on +`analysis.sequential_fit`, so after parking that category there is no +public or persisted surface left for this opt-in reverse setting. The +ADR also preserves the category-owned selector contract and does not add +new owner-level setters. + +Please either remove reverse ordering from the first-step loaded-dataset +contract, or define its new public/persisted home. For example, the ADR +could introduce a small loaded-series configuration category with only +settings that apply to loaded datasets, or explicitly defer reverse +until the folder/input-source follow-up. As written, the plan would have +to invent API surface that the ADR has not approved. + +## Checks + +Static review only. Per `AGENTS.md`, I did not run tests, lint, +formatters, build commands, or any `pixi` command. diff --git a/docs/dev/adrs/suggestions/dataset-driven-fit-modes_review-3.md b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_review-3.md new file mode 100644 index 000000000..cba70373d --- /dev/null +++ b/docs/dev/adrs/suggestions/dataset-driven-fit-modes_review-3.md @@ -0,0 +1,11 @@ +# Review 3: Dataset-Driven Fit Modes and Sequential Redefinition + +**No findings. Ready to commit.** + +Review 2's remaining API-surface issue is addressed: loaded-dataset +`sequential` now uses deterministic project collection order only, and +reverse/custom ordering is explicitly deferred to the input-source +follow-up rather than relying on the parked `sequential_fit` category. + +Static review only. Per `AGENTS.md`, I did not run tests, lint, +formatters, build commands, or any `pixi` command. diff --git a/docs/dev/issues/index.md b/docs/dev/issues/index.md index 7d6a5db80..764aeaf16 100644 --- a/docs/dev/issues/index.md +++ b/docs/dev/issues/index.md @@ -62,6 +62,7 @@ individual issue files** — not here. | 150 | [Bragg Powder ASCII Loader Returns Zero Points Instead of Raising](open/medium_bragg-powder-ascii-loader-returns-zero-points-instead-of-raising.md) | `[priority] medium` | Robustness | | 151 | [Replace Dead `else` Branch in `_set_calc_status` With a Real Boolean Check](open/medium_replace-dead-else-branch-in-set-calc-status-with-a-real-boolean-check.md) | `[priority] medium` | Correctness / Dead code | | 162 | [Untrack Generated Tutorial-Benchmark CSVs](open/medium_untrack-generated-tutorial-benchmark-csvs.md) | `[priority] medium` | Hygiene | +| 166 | [cryspy vs FullProf: Bérar–Baldinozzi Empirical-Asymmetry Convention Mismatch](open/medium_cryspy-fullprof-berar-baldinozzi-empirical-asymmetry-convention-mismatch.md) | `[priority] medium` | Correctness / External backend / Verification | | 9 | [Add Future Enum Extensions](open/low_add-future-enum-extensions.md) | `[priority] low` | Design improvement | | 10 | [Unify Project-Level Update Orchestration](open/low_unify-project-level-update-orchestration.md) | `[priority] low` | Maintainability | | 11 | [Document Category `_update` Contract](open/low_document-category-update-contract.md) | `[priority] low` | Maintainability | diff --git a/docs/dev/issues/open/high_rename-asym-empir-and-add-the-physical-fcj-asymmetry-model.md b/docs/dev/issues/open/high_rename-asym-empir-and-add-the-physical-fcj-asymmetry-model.md index 9644ad6e5..988612bba 100644 --- a/docs/dev/issues/open/high_rename-asym-empir-and-add-the-physical-fcj-asymmetry-model.md +++ b/docs/dev/issues/open/high_rename-asym-empir-and-add-the-physical-fcj-asymmetry-model.md @@ -4,9 +4,17 @@ **Type:** Experiment model / Peak profile / API naming -The four empirical peak-asymmetry parameters (`asym_empir_1`…`4`, the -`pd-neut-cwl_pv-asym_empir_pbso4` Verification page) are the -**Bérar–Baldinozzi** correction — FullProf's `P1`–`P4` — a +**Status (partial):** Item 1 (the rename) is **done** — the parameters +are now `asym_beba_a0`, `asym_beba_b0`, `asym_beba_a1`, `asym_beba_b1` +(class `CwlPseudoVoigtBerarBaldinozziAsymmetry`, type string +`pseudo-voigt + berar-baldinozzi asymmetry`, page renamed to +`pd-neut-cwl_pv-beba_pbso4`). This issue stays open for **item 2** (add +the physical FCJ model). The cryspy/FullProf implementation difference +is characterised in issue 166. + +The four empirical peak-asymmetry parameters (`asym_beba_*`, formerly +`asym_empir_1`…`4`, on the `pd-neut-cwl_pv-beba_pbso4` Verification +page) are the **Bérar–Baldinozzi** correction — FullProf's `P1`–`P4` — a phenomenological sum of functions in `1/tan θ` and `1/tan 2θ`. It can fit an asymmetric peak, but the parameters carry **no physical meaning**, are strongly correlated, do **not** transfer between @@ -22,18 +30,19 @@ instrument-meaningful. **Two future considerations:** -1. **Rename** the empirical parameters so the name states what they are - — e.g. `asym_berar_baldinozzi_1`…`4` (or a `berar_baldinozzi_p*` - form) — rather than the generic `asym_empir_*`, which hides their - origin and conflates "empirical asymmetry" with the specific - Bérar–Baldinozzi formula. +1. **Rename** the empirical parameters so the name states what they are. + **Done:** renamed to `asym_beba_{a0,b0,a1,b1}` (the `beba` model tag + mirrors `asym_fcj_*`; the `a0/b0/a1/b1` suffixes name the + coefficients of the `Fa`/`Fb` × `1/tan θ`/`1/tan 2θ` basis), + replacing the generic `asym_empir_*` that hid their Bérar–Baldinozzi + origin. 2. **Add the FCJ model alongside** the empirical one (not as a replacement), as a switchable asymmetry choice, so users can pick the physically-based two-parameter model when the instrument geometry is known and fall back to the empirical correction otherwise. -**Relates to:** the asymmetry discrepancy tracked on the -`pd-neut-cwl_pv-asym_empir_pbso4` Verification page (currently in +**Relates to:** the asymmetry discrepancy tracked in issue 166 and on +the `pd-neut-cwl_pv-beba_pbso4` Verification page (currently in `docs/docs/verification/ci_skip.txt`), and the TCH/FCJ work noted on the `pd-neut-cwl_tch-fcj_lab6` page. diff --git a/docs/dev/issues/open/medium_cryspy-fullprof-berar-baldinozzi-empirical-asymmetry-convention-mismatch.md b/docs/dev/issues/open/medium_cryspy-fullprof-berar-baldinozzi-empirical-asymmetry-convention-mismatch.md new file mode 100644 index 000000000..a6752377d --- /dev/null +++ b/docs/dev/issues/open/medium_cryspy-fullprof-berar-baldinozzi-empirical-asymmetry-convention-mismatch.md @@ -0,0 +1,173 @@ +# 166. cryspy vs FullProf: Bérar–Baldinozzi Empirical-Asymmetry Convention Mismatch + +**Priority:** `[priority] medium` + +**Type:** Correctness / External backend / Verification + +## Summary + +The four empirical peak-asymmetry parameters (`asym_beba_a0`, +`asym_beba_b0`, `asym_beba_a1`, `asym_beba_b1`; formerly `asym_empir_1`… +`4`) are the **Bérar–Baldinozzi (1993)** correction — FullProf's +`P1`…`P4`. When the _same_ parameter values are fed to cryspy and to +FullProf, the two codes produce **different** asymmetric profiles. A +controlled calculate-vs-calculate study pins the entire discrepancy to +exactly **two** independent causes, and — checked against the original +paper — shows that **cryspy is faithful to the published +Bérar–Baldinozzi functions while FullProf's executable departs from +them**. This is the root cause behind the long-standing "asymmetry +parameters don't agree" observation (the CI-skipped +`pd-neut-cwl_pv-beba_pbso4` Verification page) and the "refines to +opposite sign" note on the new `pd-neut-cwl_pv-beta_y2o3` page. + +This issue documents the finding and the evidence. It is primarily a +**document-and-report-upstream** item: no cryspy code lives in this +repository, and our own implementation is correct. + +## The published model (Bérar & Baldinozzi, 1993) + +Bérar, J.-F. & Baldinozzi, G. (1993). _Modeling of line-shape asymmetry +in powder diffraction._ J. Appl. Cryst. **26**, 128–129. The asymmetry +is a multiplicative correction built from **the odd derivatives of a +Gaussian** — explicitly the odd Hermite polynomials `H1 = 2z` and +`H3 = 8z³ − 12z`: + +- `Fa(z) = 2z·exp(−z²)` — eq. (12), `= H1·exp(−z²)` +- `Fb(z) = (8z³ − 12z)·exp(−z²)` — eq. (13), `= H3·exp(−z²)` +- `g(dθ) = g0(dθ)·[1 + A(θ)·Fa(z) + B(θ)·Fb(z)]` — eqs. (11)/(14) +- `A(θ) = A0/tan(θ) + A1/tan(2θ)` — eq. (15) (likewise `B(θ)`), with the + paper noting the second term may instead use `1/sin(2θ)`. +- `z = dθ/w` (deviation-to-width ratio). + +The four refinable coefficients map onto the basis as +`(A0, B0, A1, B1) = (Fa/tan θ, Fb/tan θ, Fa/tan 2θ, Fb/tan 2θ)`, which +is FullProf's `(P1, P2, P3, P4)` and our +`(asym_beba_a0, asym_beba_b0, asym_beba_a1, asym_beba_b1)`. + +## What each implementation actually uses + +| Source | `Fb(z)` | Matches paper eq. (13)? | +| -------------------------------------------------- | ---------------------------------------- | --------------------------------- | +| Paper eq. (13) | `(8z³ − 12z)·exp(−z²)` (= `H3·exp(−z²)`) | — (definition) | +| **cryspy** `func_asymmetry_f_b` = `2(2z²−3)·Fa` | `(8z³ − 12z)·exp(−z²)` | **Yes (exact)** | +| **FullProf manual** (`fp_text.htm`): `2(2z²−3)·Fa` | `(8z³ − 12z)·exp(−z²)` | **Yes (exact)** | +| **FullProf _program_** (inferred from output) | `(8z³ − 6z)·exp(−z²)` (= `(4z²−3)·Fa`) | **No** — not a Hermite polynomial | + +`Fa(z) = 2z·exp(−z²)` is identical in all of them. + +## How it was established + +FullProf 8.40 (`/home/andrewsazonov/Applications/fullprof/fp2k`) was run +on the Y₂O₃ structure used by the `pd-neut-cwl_pv-beta_y2o3` +Verification page, profile NPROF = 7 (TCH), with the empirical asymmetry +parameters set in five configurations: each of `Asy1…Asy4` isolated (= +0.2, others 0) and one combined set. Each FullProf **calculated** +profile (`.prf`, background-subtracted) was then reproduced in cryspy, +comparing calculate-vs-calculate (no experimental data, no fitting +noise). cryspy's profile machinery was reproduced inline and verified +**byte-identical** to the installed cryspy (max abs diff 0.0), so the +inline knobs faithfully represent real cryspy edits. + +Metric below is `profdiff% = 100·Σ|ref−calc| / Σ|ref|`; `0.27%` is the +numerical floor (`.prf` precision + background interpolation). + +### Attribution sweep (paper's exact `Fa`/`Fb`, toggling sign + angular term) + +| Config | combined | P1 (Fa/tanθ) | P2 (Fb/tanθ) | P3 (Fa/tan2θ) | P4 (Fb/tan2θ) | +| -------------------- | --------- | ------------ | ------------ | ------------- | ------------- | +| stock (s+, 1/tan2θ) | 8.12% | 30% | 105% | 13% | 45% | +| **sign flip only** | 8.60% | **0.27%** | 46% | **0.27%** | 19% | +| 1/sin2θ only | 5.91% | 30% | 105% | 15% | 68% | +| sign + 1/sin2θ | 15.83% | 0.27% | 46% | **9.9%** | 57% | +| sign + `Fb=(8z³−6z)` | **0.27%** | 0.27% | 0.78% | 0.27% | 0.28% | + +### Reading the sweep + +- With **only a sign flip**, the two **`Fa`** terms (P1, P3) transfer + _perfectly_ (0.27%). That proves cryspy's `Fa` **and** both angular + factors (`1/tan θ` _and_ `1/tan 2θ`) already match FullProf exactly. +- The two **`Fb`** terms (P2, P4) are the only things that break, and + they break identically whether paired with `1/tan θ` or `1/tan 2θ` — + so it is a pure `Fb`-shape problem, independent of angle. +- The **`1/sin 2θ` alternative is rejected**: it makes P3 _worse_ (0.27% + → 9.9%). FullProf uses `1/tan 2θ`, exactly as cryspy does. +- Restoring `Fb = (8z³ − 6z)` fixes P2 and P4 (→ 0.78%, 0.28%). + +A free four-parameter refit of cryspy to FullProf's combined profile +reaches **0.09%** (corr 0.999999), confirming the model is otherwise +identical; the parameter map is _not_ a simple sign flip (e.g. FullProf +`P = (0.177, 0.034, −0.05, 0.02)` → cryspy +`(−0.286, −0.035, 0.028, −0.014)`), which is precisely the +`Fb = paper + 3·Fa` admixture (`(8z³−6z) = (8z³−12z) + 3·(2z)`) plus the +sign. + +## Root-cause decomposition + +The entire discrepancy is **exactly two independent things**: + +1. **Sign of `z`** — a convention; FullProf uses the opposite sign + (equivalently, treats the published `P1…P4` as negated). Both choices + are physically admissible (the paper sets the sign by fitting); they + must merely be consistent to share parameter values. +2. **The `Fb` function** — a genuine discrepancy. The paper and cryspy + use the odd Hermite `H3 = 8z³ − 12z`; FullProf's program behaves as + `8z³ − 6z`, which is **not** a Hermite polynomial and so cannot be + what eq. (13)'s "odd Hermite polynomials" construction intends. + +Everything else — `Fa`, the `1/tan θ` first term, and the `1/tan 2θ` +second term — is identical between the codes. + +## Verdict + +- **cryspy is correct** w.r.t. Bérar–Baldinozzi: its `Fa` and `Fb` are + verbatim eqs. (12)–(13). +- **The FullProf manual is correct** too (its printed `2(2z²−3)·Fa` + equals eq. (13)). +- **FullProf's executable is the outlier** — its effective `Fb` linear + term is `−6z` where the published, Hermite-mandated value is `−12z`. + +Caveats: this is inferred from FullProf's _calculated output_, not its +(closed) source; the last ~0.5% (P2 at 0.78%) sits at `.prf` numerical +precision, so the program's `Fb` is `≈ (8z³−6z)` but not provably +exactly `−6z` vs, say, `−6.1z`. + +## Practical implications + +- Users who port FullProf `Asy1…4` into cryspy (or vice versa) get a + **wrong** asymmetric profile; refining in cryspy recovers a good fit + but with parameters that do not equal FullProf's (sign-mirrored and + `Fb`-rescaled). These parameters are non-physical and rarely transfer + between datasets in any case (see issue 133). +- A "make cryspy match FullProf" edit (`Fb: (8z³−12z) → (8z³−6z)` plus a + `z` sign flip in cryspy's `powder_diffraction_const_wavelength.py`) + would be **bug-for-bug compatibility** with FullProf, _not_ a + correctness fix — it would make cryspy disagree with the published + functions. Do **not** apply it to cryspy as a "fix" without labelling + it as a FullProf-compatibility quirk. + +## Recommended next steps + +1. **Report upstream to cryspy** (ikibalin/cryspy#50): cryspy matches + Bérar–Baldinozzi; the disagreement is with FullProf's executable + (`Fb = 8z³−6z`, opposite sign). Attach the attribution table and the + paper reference. +2. **Report upstream to FullProf** (Rodríguez-Carvajal): the executable + appears to deviate from both eq. (13) and FullProf's own manual in + the `Fb` linear term. If confirmed, this affects every FullProf user, + not just cross-engine comparisons. +3. **Keep our docs honest**: the `pd-neut-cwl_pv-beta_y2o3` page's + asymmetry note and the CI-skip on `pd-neut-cwl_pv-beba_pbso4` remain + correct and cite this issue. +4. **Done:** the rename tracked by issue 133 landed — the parameters are + now `asym_beba_{a0,b0,a1,b1}` (the `beba` model tag mirrors + `asym_fcj_*`). + +## Relations + +- **Relates to** issue 133 (rename `asym_empir_*`; add physical FCJ + model) — this issue supplies the confirmed physics/naming basis. +- **Relates to** the Verification pages `pd-neut-cwl_pv-beba_pbso4` + (CI-skipped) and `pd-neut-cwl_pv-beta_y2o3` (documents the convention + difference). +- **Upstream:** cryspy issue + [#50](https://github.com/ikibalin/cryspy/issues/50). diff --git a/docs/dev/package-structure/full.md b/docs/dev/package-structure/full.md index 80eaeaf0f..61a2cbfe1 100644 --- a/docs/dev/package-structure/full.md +++ b/docs/dev/package-structure/full.md @@ -400,11 +400,11 @@ │ │ │ │ │ └── 🏷️ class PeakBase │ │ │ │ ├── 📄 cwl.py │ │ │ │ │ ├── 🏷️ class CwlPseudoVoigt -│ │ │ │ │ ├── 🏷️ class CwlPseudoVoigtEmpiricalAsymmetry +│ │ │ │ │ ├── 🏷️ class CwlPseudoVoigtBerarBaldinozziAsymmetry │ │ │ │ │ └── 🏷️ class CwlThompsonCoxHastings │ │ │ │ ├── 📄 cwl_mixins.py │ │ │ │ │ ├── 🏷️ class CwlBroadeningMixin -│ │ │ │ │ ├── 🏷️ class EmpiricalAsymmetryMixin +│ │ │ │ │ ├── 🏷️ class BerarBaldinozziAsymmetryMixin │ │ │ │ │ └── 🏷️ class FcjAsymmetryMixin │ │ │ │ ├── 📄 factory.py │ │ │ │ │ └── 🏷️ class PeakFactory diff --git a/docs/dev/plans/bayesian-resume-and-mcmc-sidecar.md b/docs/dev/plans/bayesian-resume-and-mcmc-sidecar.md deleted file mode 100644 index ad705b89b..000000000 --- a/docs/dev/plans/bayesian-resume-and-mcmc-sidecar.md +++ /dev/null @@ -1,281 +0,0 @@ -# Implementation Plan: Bayesian Resume (DREAM) and MCMC Sidecar Naming - -This plan follows the conventions in [`AGENTS.md`](../../../AGENTS.md). -No deliberate exceptions are taken. - -## ADR - -Implements -[`bayesian-resume-and-mcmc-sidecar.md`](../adrs/accepted/bayesian-resume-and-mcmc-sidecar.md) -(Status: Accepted; promoted from `suggestions/` in Phase A). This plan -**owns** that ADR. - -Accepted ADRs this work **substantively amends** — the filename and the -single-sidecar/per-engine-groups wording: - -- [`analysis-cif-fit-state.md`](../adrs/accepted/analysis-cif-fit-state.md) -- [`minimizer-category-consolidation.md`](../adrs/accepted/minimizer-category-consolidation.md) - -The `results.h5` → `mcmc.h5` rename additionally updates **plain -references** in other accepted ADRs, the ADR index, the -`fit-output-files-and-data-exports` suggestion, user/CLI docs, and tests -— the full set is enumerated in ADR §4 and under _Concrete files_ / -P1.1. - -Accepted ADRs this work must **respect**: - -- [`minimizer-input-output-split.md`](../adrs/accepted/minimizer-input-output-split.md) - — `analysis.minimizer` (input) / `analysis.fit_result` (output) - pairing. -- [`switchable-category-owned-selectors.md`](../adrs/accepted/switchable-category-owned-selectors.md) - — the `minimizer.type` selector surface. -- [`undo-fit.md`](../adrs/accepted/undo-fit.md) — undo clears the - sidecar. - -## Branch and PR - -Flat-slug branch `bayesian-resume-and-mcmc-sidecar` off `develop` -(created by `/draft-impl-1` setup). PR targets `develop`. - -## Reference implementation - -`easyscience/core` PR #257 ("Bayesian extend/resume", branch -`bayesian_extend`) is the blueprint for the DREAM sampler mechanics: -`src/easyscience/fitting/minimizers/minimizer_bumps.py` — -`mcmc_sample(resume_state=…)`, `_resolve_population_alias`, -`save_sampler_state`/`load_sampler_state`, and the ring-buffer -docstring. - -## Decisions (already made) - -- One sidecar per fit, **renamed `results.h5` → `mcmc.h5`**; filename in - one constant + a shared path helper (no duplicated literals). -- Per-engine **HDF5 groups** hold resumable raw state: emcee's existing - `emcee_chain`, plus a new DREAM state group (`DreamFit.h5dump` + - stored fitted-parameter names). -- Unified API unchanged: `analysis.fit(resume=True, extra_steps=N)`. - DREAM translates `extra_steps=N` to `samples = current + N, burn = 0` - (ring-buffer extend); population scale recovered from `state.Npop`; - state deep-copied before fitting. -- DREAM resume validates parameter count, population, and **names** (we - persist names, so no positional-only fallback). -- Beta project: no legacy shim; regenerate fixtures/tutorials/tests that - reference `results.h5`. - -## Resolved decisions (no open questions blocking `/draft-impl-1`) - -1. **DREAM state layout is fixed in the ADR** — a top-level - `dream_state` HDF5 group holding the `MCMCDraw` (`DreamFit.h5dump`) - plus a `param_names` dataset. Not deferred; P1.2/P1.3 implement - exactly this. -2. **The `chains` alias is included** as an approved user-facing API - addition (ADR §1). P1.5 stays in scope; it is not optional. -3. **Unified `extra_steps` semantics** — emcee appends, DREAM extends - its ring buffer (`samples = current + N`, `burn = 0`); both yield the - same "added N draws". The Phase 2 cross-engine parity test enforces - this. - -## Concrete files likely to change - -- `src/easydiffraction/io/results_sidecar.py` (filename constant, path - helper; DREAM state group read/write). -- `src/easydiffraction/analysis/minimizers/bumps_dream.py` (capture - state, `_sidecar_path`, `fit()` override, resume load/validate/extend, - `chains` alias). -- `src/easydiffraction/analysis/minimizers/emcee.py` (only if shared - resume/detection helpers are factored out; otherwise untouched). -- `src/easydiffraction/analysis/minimizers/base.py` (any shared resume - validation/detection helper). -- `src/easydiffraction/analysis/fitting.py`, - `src/easydiffraction/analysis/analysis.py` (filename literal → helper; - DREAM resume-detection alongside `_has_resumable_emcee_sidecar`). -- `src/easydiffraction/__main__.py` (CLI messages naming the sidecar). -- **Rename sweep — every tracked `results.h5` reference** (from - `git grep -n 'results\.h5'`), excluding generated/transient outputs: - - Accepted ADRs: `analysis-cif-fit-state.md`, - `minimizer-category-consolidation.md`, `undo-fit.md`, - `minimizer-input-output-split.md`, `runtime-fit-results.md`, - `edstar-project-persistence.md`, and `docs/dev/adrs/index.md` rows. - - Suggestion ADR: `fit-output-files-and-data-exports.md`. - - User docs: `docs/docs/cli/index.md`, - `docs/docs/user-guide/{concept,data-format}.md`, - `docs/docs/user-guide/analysis-workflow/{analysis,project}.md`. - - Tests: `tests/unit/easydiffraction/io/test_results_sidecar*.py`, - `analysis/test_analysis_coverage.py`, - `analysis/test_fitting_coverage.py`, - `analysis/minimizers/test_emcee.py`, `test___main__*.py`, - `tests/integration/fitting/test_emcee.py`, `test_bayesian_dream.py`, - and any tracked project fixtures. -- DREAM resume tutorial + its registration artifacts: - `docs/docs/tutorials/bayesian-dream-resume-*.py` (+ regenerated - `.ipynb`), `docs/docs/tutorials/index.md`, - `docs/docs/tutorials/index.json`, `tests/tutorials/baseline.json`, - `docs/mkdocs.yml` nav, and `docs/docs/verification/ci_skip.txt` if the - page is heavy. (The emcee resume page appears in index.md, index.json, - and baseline.json — the new page must too.) -- Unit tests under `tests/unit/easydiffraction/analysis/minimizers/` and - `io/`; integration test under `tests/integration/fitting/`. - -## Implementation steps (Phase 1) - -**Commit discipline (required of any AI agent following this plan).** -Each step below is one atomic change. Complete the step, edit its -`- [ ]` checkbox to `- [x]`, stage **only** that step's files with -explicit paths (per [`AGENTS.md`](../../../AGENTS.md) §Commits — no -`git add -A`, no unrelated dirty files), and make the local commit with -the step's `Commit:` message **before** starting the next step or the -Phase 1 review gate. Do not batch multiple steps into one commit. - -- [x] **P1.1 — Rename sidecar `results.h5` → `mcmc.h5`, single-source - the name, sweep all references.** Update `SIDECAR_FILE_NAME`, - replace the duplicated literals in `fitting.py` / `analysis.py` - with the constant/helper, update `__main__.py` messages. Then run - `git grep -n 'results\.h5'` and update **every** tracked reference - — the accepted ADRs (`analysis-cif-fit-state`, - `minimizer-category-consolidation` incl. the per-engine-groups - clarification, `undo-fit`, `minimizer-input-output-split`, - `runtime-fit-results`, `edstar-project-persistence`) and index - rows, the `fit-output-files-and-data-exports` suggestion, the - user-guide and CLI docs, and the tests listed in Concrete files — - excluding generated outputs. End on zero non-historical - `results.h5` hits. Commit: - `Rename Bayesian sidecar to mcmc.h5 and single-source it`. -- [x] **P1.2 — Persist the DREAM raw sampler state.** Capture the - `MCMCDraw` in `BumpsDreamMinimizer`, add `_sidecar_path` (wired by - the existing `Fitter._set_minimizer_sidecar_path`), and write a - `dream_state` HDF5 group (`DreamFit.h5dump` + `param_names`) on - save. Commit: - `Persist bumps-dream sampler state to the mcmc sidecar`. -- [x] **P1.3 — DREAM resume: load, validate, extend.** Override `fit()`; - load + deep-copy the state; validate count/population/names; - translate `extra_steps` to `samples = current + N, burn = 0`; pass - `fit_state` to the driver; add a DREAM resume-detection helper. - Commit: `Implement bumps-dream resume via saved sampler state`. -- [x] **P1.4 — Reconcile unified resume semantics.** Ensure - `resume=True, extra_steps=N` behaves consistently for emcee and - DREAM at the `Fitter`/`analysis.fit` layer; share - validation/detection helpers where clean. Commit: - `Unify emcee and dream resume semantics`. -- [x] **P1.5 — Add `chains` alias for DREAM `population_size`.** - User-facing `chains` alias on the persisted category, sharing the - `population_size` descriptor (always value-consistent; no separate - `population` field), with "population = scale factor" - documentation. Commit: - `Add chains alias for bumps-dream population`. -- [x] **P1.6 — DREAM resume tutorial — deferred to Phase 2.** The - tutorial must be **executed** on real LBCO/HRPT data to validate - it and to fill its `tests/tutorials/baseline.json` entry - (`reduced_chi_square` + parameter values), which is a real - bumps-DREAM run — Phase-2-coupled. The implementation engine it - exercises is complete and validated (P1.1–P1.5). It is therefore - authored and executed in Phase 2 (see _Phase 2 → DREAM resume - tutorial_), as a self-contained page (fresh DREAM fit → save → - resume), avoiding a new external dataset. -- [x] **P1.7 — Regenerate sidecar-referencing fixtures/tutorials.** - No-op: `git ls-files | grep '\.h5'` shows **no tracked `.h5` - sidecar fixtures**, and committed notebooks are output-stripped, - so the rename had no binary artifacts to regenerate — the - `mcmc.h5` name is produced purely at runtime and all textual - references were swept in P1.1. -- [x] **P1.8 — Phase 1 review gate (no code).** Mark `[x]` and commit - the checklist update alone. Commit: `Reach Phase 1 review gate`. - -## Phase 2 — Verification - -Use the zsh-safe capture pattern when saving output: - -```bash -pixi run fix > /tmp/ed-fix.log 2>&1; fix_exit_code=$?; tail -n 40 /tmp/ed-fix.log; exit $fix_exit_code -pixi run check > /tmp/ed-check.log 2>&1; check_exit_code=$?; tail -n 60 /tmp/ed-check.log; exit $check_exit_code -pixi run unit-tests > /tmp/ed-unit.log 2>&1; unit_exit_code=$?; tail -n 40 /tmp/ed-unit.log; exit $unit_exit_code -pixi run integration-tests > /tmp/ed-int.log 2>&1; int_exit_code=$?; tail -n 40 /tmp/ed-int.log; exit $int_exit_code -pixi run script-tests > /tmp/ed-script.log 2>&1; script_exit_code=$?; tail -n 40 /tmp/ed-script.log; exit $script_exit_code -``` - -New tests required: - -- Unit: DREAM state round-trips through the `mcmc.h5` `dream_state` - group; resume validation rejects mismatched count/population/names; - `extra_steps` → `samples=current+N` translation; `chains` ⇄ - `population_size` value-consistency (shared descriptor). -- Unit — raw-state lifecycle (one sidecar, several engines): - - a fresh (non-resume) fit clears **all** raw sampler-state groups - (every engine), so no prior chain survives — including the - emcee→fresh-DREAM→emcee-`resume=True` path, which must **not** - resume the original emcee chain; - - resume detection and resume read **only** the active minimizer's - group; - - explicit `resume=True` with a missing or malformed `dream_state` - group raises a clear error; without `resume`, it is ignored and the - fit starts fresh; - - `undo_fit` clears the raw-state group(s). -- Integration: a small DREAM fit, `project.save()`, reload, - `fit(resume=True, extra_steps=…)`, assert the chain grew by the - expected number of draws and parity with a single longer run (mirror - `test_emcee_resume_matches_small_dream_posterior`). -- Confirm `pixi run check` (link-check) passes after the tutorial/nav - and ADR edits. - -DREAM resume tutorial + external-project regeneration (Phase 2, deferred -from P1.6 — supersedes the earlier self-contained note): - -The dream tutorial mirrors the emcee one (load a published project, then -resume), not a self-contained fresh fit. This requires regenerating the -published Bayesian projects so the saved DREAM project carries a -`dream_state` group (it was saved before P1.2 and has none today): - -1. **Regenerate both saved projects at 10000 steps** with the current - code: `proj-lbco-hrpt-emcee` (emcee, persists `emcee_chain`) and - `proj-lbco-hrpt-dream` (bumps-DREAM, now persists `dream_state` via - P1.2). Use a fixed seed for reproducible baselines. -2. **Publish to the external data repo**: zip each saved project and - push to `easyscience/diffraction`, then bump the pinned commit in - `src/easydiffraction/_data_index_ref.txt` (current `11bb1e4…`) so the - tutorials download the new projects. _(Outward-facing: confirm before - pushing; needs write access to that repo.)_ -3. **Adapt `bayesian-dream-display-lbco-hrpt.py`** to load **and** - `fit(resume=True, extra_steps=N)` — parallel to - `bayesian-emcee-resume-lbco-hrpt.py` — and rename to - `bayesian-dream-resume-lbco-hrpt` to match the emcee naming, updating - nav, `index.md`, `index.json`, and `baseline.json` (baselines from - the regenerated run). `notebook-prepare` to regenerate the notebook. -4. Verify both resume tutorials execute against the new pinned data. - -### Phase 2 status (completed) - -- New unit tests added for the DREAM state round-trip, resume validation - (count / order / population), `extra_steps` translation, `chains` ⇄ - `population_size` consistency, and the raw-state lifecycle; a new - integration test mirrors the emcee resume parity check. Four - pre-existing tests were updated to the resume-aware API. -- **Scope addition surfaced during verification:** `project.save_as` - rebuilds the derived sidecar arrays from memory but previously dropped - the raw sampler-state groups, so a resume after `load` + `save_as` - (the exact flow both resume tutorials use) found no chain — emcee only - appeared to work because the old code silently restarted a fresh fit. - The ADR already requires resume to survive a save/load round-trip, so - `save_as` now copies the `emcee_chain` / `dream_state` groups across - via `carry_over_raw_sampler_state` (covered by new unit tests and the - ADR §2 note). This fixes resume for both engines. -- Both published projects were regenerated at 10000 steps (seed 42), - pushed to `easyscience/diffraction`, and the pinned commit bumped to - `8449440`. The DREAM tutorial was renamed to - `bayesian-dream-resume-lbco-hrpt` (load + resume), nav / `index.md` / - `index.json` / `baseline.json` updated, and the stale "emcee only" - note removed from the emcee resume tutorial. -- `pixi run fix`, `check`, `unit-tests` (3628), `integration-tests` - (194), `script-tests` (34 passed, 8 skipped), and the tutorial-output - baseline checks (24 passed) all pass against the new pinned data. - -## Suggested Pull Request - -**Title:** Resume and extend Bayesian (bumps-DREAM) refinements; clearer -MCMC results file - -**Description:** You can now pause a Bayesian analysis run with the -bumps-DREAM sampler and later continue it for more steps — exactly as -already works for emcee — without losing the samples collected so far. -Saved sampling state is stored in the project's analysis folder in a -file now named `mcmc.h5` (previously `results.h5`), which better -reflects that it holds MCMC sampling output. Reloading a saved project -and asking for more steps simply extends the existing chains. diff --git a/docs/dev/plans/calculation-without-measured-data.md b/docs/dev/plans/calculation-without-measured-data.md deleted file mode 100644 index 0a1471f82..000000000 --- a/docs/dev/plans/calculation-without-measured-data.md +++ /dev/null @@ -1,342 +0,0 @@ -# Plan: Calculation Without Measured Data - -This plan follows [`AGENTS.md`](../../../AGENTS.md). No deliberate -exceptions to those instructions are taken. Where this plan touches -public API (`experiment.data_range`) and many files, it is the "propose -a plan and wait for approval" path required by -[`AGENTS.md`](../../../AGENTS.md) §Code Style. - -## ADR - -Implements -[Calculation Without Measured Data](../adrs/accepted/calculation-without-measured-data.md) -(promoted to `accepted/` in **P1.1** per -[`AGENTS.md`](../../../AGENTS.md) §Change Discipline, before the PR is -opened). - -Related accepted ADRs this plan builds on: - -- [Unified Pattern View](../adrs/accepted/pattern-display-unification.md) - — `pattern()` renders whatever project state supports; this plan adds - "calculated-only" as a supported state. -- [Switchable Category API](../adrs/accepted/switchable-category-api.md) - — `data_range` is a fixed, single-type-per-experiment category, so it - exposes **no** `type` selector. -- [Immutable Experiment Type](../adrs/accepted/immutable-experiment-type.md) - — `data_range` mirrors how `instrument`/`data` are fixed by the - experiment type at construction. -- [Guarded Public Properties](../adrs/accepted/guarded-public-properties.md) - — the writable range attributes are guarded property setters. -- [IUCr CIF Tag Alignment](../adrs/accepted/iucr-cif-tag-alignment.md) - and - [Python and CIF Category Correspondence](../adrs/accepted/python-cif-category-correspondence.md) - — CIF tag choices for the range. - -## Branch and PR - -- Branch: `calculation-without-measured-data` (flat slug off `develop`, - no `feature/` prefix). Do not push until asked. -- PR targets `develop`, not `master`. - -## Problem recap - -`ExperimentFactory.from_scratch(...)` builds a documented "experiment -without measured data", but the calculation x-grid is sourced **only** -from measured points: - -- `cryspy._cif_range_section` reads `experiment.data.x.min()/.max()` - (`src/easydiffraction/analysis/calculators/cryspy.py:1134-1136`) → - raises `ValueError: zero-size array to reduction operation minimum` on - the empty array. -- `crysfml._update_experiment_dict_from_data` passes - `experiment.data.x.tolist()` as the scan - (`src/easydiffraction/analysis/calculators/crysfml.py:372-390`) → an - empty scan. -- `data._update` builds `np.zeros_like(self.x)` over the measured grid - (`.../categories/data/bragg_pd.py:468`). - -So `project.display.pattern(expt_name=...)` fails for a never-measured -structure even though structure, instrument, peak, and background are -all present. - -## Decisions already made (from the ADR) - -1. **`data_range` category, type-determined, no `type` selector.** Flat - sibling of `data`, per-type concrete classes via a factory, exposed - uniformly as `experiment.data_range`. Mirrors the `instrument` - category exactly (per-beam-mode classes, `@Factory.register`, - `TypeInfo`/`Compatibility`). -2. **Stored truth = the natural input axis (writable):** CWL powder - `two_theta_{min,max,inc}`; TOF powder `time_of_flight_{min,max,inc}`; - single crystal `sin_theta_over_lambda_{min,max}` (no `inc`). -3. **sinθ/λ + d-spacing are derived shared views** (`sinθ/λ = 1/(2·d)`), - plus `x_{min,max,step}` aliases onto the active axis. Recalibration - keeps the stored axis window fixed and re-derives sinθ/λ. -4. **Writable, guarded by measurement.** Setter raises when a measured - scan is present (range is then observed, not input); getter returns - the measured-derived range in that case (subsuming - `experiment.measured_range`) and the stored/default range otherwise. -5. **Defaults authored in d-spacing**, projected onto each axis through - the instrument, so a `from_scratch` experiment is calculable with no - manual setup and the TOF default stays well defined. -6. **No `simulate()` method.** The grid is serialisable model state. - When no measured scan exists, the powder data grid is **generated - from `data_range`** on the calculation/update pass, and calculators - keep reading `experiment.data.x` unchanged (the data-points-define- - the-grid invariant is preserved; calculators are intentionally not - modified). -7. **Display extends the unified view:** drop the `measured_available` - requirement from the `background` and `bragg` availability gates so a - calculated-only powder shows its calculated curve + background + - Bragg row. "No measurement" = **absent** intensities (no zero-filled - phantom measured curve or residual). - -## Scope decisions for this plan (see Open questions) - -- **In scope, fully wired:** Bragg **powder** CWL and TOF — the original - failure. Generated grid → calculate → display, end to end. -- **In scope, category + persistence only:** single-crystal - `ScDataRange` (sinθ/λ bounds, CIF round-trip, `measured_range` - subsumption). The **reflection-generation wiring** (cryspy `calc_hkl`) - is **deferred** per the ADR's Deferred Work; until then a - single-crystal calculate-without-measured-data attempt raises a clear, - named "not yet supported" error rather than crashing. -- **Out of scope:** total scattering (`pdffit`, r-space PDF). The - `total-pd` path keeps requiring measured data; a clear error is raised - if a calculation is attempted without it. Recorded as deferred. - -## Concrete files likely to change - -New package -`src/easydiffraction/datablocks/experiment/categories/data_range/`: - -- `__init__.py` — explicit imports of all concrete classes - (registration). -- `base.py` — `DataRangeBase(CategoryItem)`, - `_category_code='data_range'`. -- `cwl.py` — `CwlPdDataRange` (`two_theta_{min,max,inc}`). -- `tof.py` — `TofPdDataRange` (`time_of_flight_{min,max,inc}`). -- `sc.py` — `ScDataRange` (`sin_theta_over_lambda_{min,max}`). -- `factory.py` — `DataRangeFactory(FactoryBase)` with `_default_rules` - mapping `(beam_mode, sample_form)` → tag (both SC beam modes → the one - `ScDataRange`). - -Existing files: - -- `src/easydiffraction/datablocks/experiment/item/base.py` — attach - `_data_range` in `_attach_category_parents`; subsume `measured_range` - via the `data_range` getter. -- `.../experiment/item/bragg_pd.py`, `.../item/total_pd.py`, - `.../item/bragg_sc.py` — construct `_data_range` from the experiment - type; expose `experiment.data_range`; add it to the `categories` list. -- `.../categories/data/bragg_pd.py` — generate the data-point grid from - `data_range` when no measured scan exists, at the top of the calc pass - (`_update` / `_phase_calculation_results`). -- `src/easydiffraction/analysis/calculators/cryspy.py`, - `.../calculators/crysfml.py` — **expected unchanged** (they read the - now-populated `experiment.data.x`); confirm and add the - single-crystal/total "not yet supported" guards where the calc path - has no grid source. -- `src/easydiffraction/project/display.py` — drop `measured_available` - from `background_available` and `bragg_available` gates (~lines - 837-851); keep residual measured-gated. -- `src/easydiffraction/report/data_context.py:244` — keep - `measured_range` working (now backed by the `data_range` getter). -- `docs/dev/adrs/suggestions/calculation-without-measured-data.md` → - `docs/dev/adrs/accepted/...` (P1.1) and `docs/dev/adrs/index.md`. - -## Implementation steps (Phase 1) - -> **Commit discipline (required).** When an AI agent follows this plan, -> every completed Phase 1 step below must be staged with **explicit -> paths** and committed locally (per [`AGENTS.md`](../../../AGENTS.md) -> §Commits) **before** moving to the next step or to the Phase 1 review -> gate. Keep commits atomic and aligned 1:1 with these steps. Do not -> create or run tests in Phase 1 (tests are Phase 2). Do not stage -> unrelated dirty files. - -- [x] **P1.1 — Promote the ADR to `accepted/`.** `git mv` the ADR from - `suggestions/` to `accepted/`, set its `## Status` to `Accepted`, - rewrite its internal `../accepted/…` links to same-directory - links, add an "Experiment model / Accepted" row to - `docs/dev/adrs/index.md` linking `accepted/…`, and fix any link - that pointed at the old `suggestions/` path - (`git grep -n calculation-without-measured-data`). Commit: - `Promote calculation-without-measured-data ADR to accepted` - -- [x] **P1.2 — Add the `data_range` category package (no wiring).** - Create `base.py`, `cwl.py`, `tof.py`, `sc.py`, `factory.py`, and - `__init__.py` mirroring the `instrument` category: `DataRangeBase` - with `_category_code='data_range'`; per-type classes with - `TypeInfo`, `Compatibility`, `@DataRangeFactory.register`; numeric - descriptors for the stored axis (`min`/`max`, plus `inc` for - powder) with units, display handlers, validators, and CIF handlers - (CWL reuses `_pd_meas.2theta_range_{min,max,inc}`; TOF/SC custom - tags per the ADR CIF mapping). `__init__.py` imports every - concrete class to trigger registration. Commit: - `Add data_range category package` - -- [x] **P1.3 — Attach `data_range` to experiment items.** Construct - `_data_range` from the experiment type in `PdExperimentBase`, - `ScExperimentBase`, and the total/sc items - (`DataRangeFactory.create(...)`); add `_data_range` to - `_attach_category_parents`; add it to each item's `categories` - list; expose the read-only `experiment.data_range` accessor. - Update the category package `__init__.py` registration import site - (`datablocks/experiment/categories/__init__.py` if it aggregates). - Commit: `Expose data_range on experiment items` - -- [x] **P1.4 — Derived sinθ/λ and d-spacing views, axis aliases, - defaults.** Add `sin_theta_over_lambda`, `d_spacing`, and - `x_{min,max,step}` derived views on each `data_range` class - (`sinθ/λ = 1/(2·d)`; CWL via `setup_wavelength`, TOF via - `d_to_tof_*`). Author default ranges in d-spacing and project them - onto each stored axis through the instrument so a `from_scratch` - experiment has a usable default grid. Commit: - `Add derived sinθ/λ and d-spacing views to data_range` - -- [x] **P1.5 — Measurement-guarded getter/setter; subsume - `measured_range`.** Make the axis attributes guarded writable - properties: the setter raises (clear, named error) when a measured - scan is present; the getter returns the measured-derived range - when measured data exists and the stored/default range otherwise. - Route `experiment.measured_range` through this getter (keep the - existing `report/data_context.py:244` consumer working). - Loaders/restore seed values via a private `_set_`. Commit: - `Guard data_range and subsume measured_range` - -- [x] **P1.6 — Generate the powder grid from `data_range`.** In the - Bragg powder data collection (`categories/data/bragg_pd.py`), when - `self._items` is empty and a `data_range` is available, build the - data-point grid from the stored axis (`min`/`max`/`inc`) via the - existing `_create_items_set_xcoord_and_id` path at the top of the - calc pass (`_update` / `_phase_calculation_results`), so `self.x` - is populated before `np.zeros_like(self.x)` and before the - calculator runs. Calculated-only points have `intensity_meas` - absent and `intensity_calc` filled. Commit: - `Generate powder calculation grid from data_range` - -- [x] **P1.7 — Confirm calculators need no grid change; add guards.** - Verify `cryspy._cif_range_section` and - `crysfml._update_experiment_dict_from_data` work unchanged now - that `experiment.data.x` is populated from the generated grid (the - data-points-define-the-grid invariant holds). For the - single-crystal and total-scattering - calculate-without-measured-data paths (no grid source in this - plan), add a clear, named "not yet supported without measured - data" error instead of an empty-array/empty-scan crash. Commit: - `Add calc-without-data guards for single crystal and total` - -- [x] **P1.8 — Relax display gates for calculated-only.** In - `project/display.py`, drop the `measured_available` requirement - from `background_available` and `bragg_available` so a - calculated-only powder shows calculated curve + background + - Bragg. Keep `residual_available` measured-gated. Ensure "no - measurement" is represented as absent intensities (no phantom - measured/residual drawn). Commit: - `Show background and bragg for calculated-only patterns` - -- [x] **P1.9 — Docs touch-ups.** Update any developer docs that describe - the experiment categories or the "experiment without measured - data" state to mention `data_range` (no tutorial regeneration in - Phase 1; tutorial/notebook updates, if any, are handled in Phase 2 - with `pixi run notebook-prepare`). Update `docs/dev/issues/open/` - → `closed/` if an existing issue tracks this. Commit: - `Document data_range and calculated-only workflow` - -- [x] **P1.10 — Phase 1 review gate (no code).** Mark this step `[x]` - and stop for the Phase 1 review. Commit: - `Reach Phase 1 review gate` - -## Open questions - -1. **Single-crystal reflection generation scope.** This plan defers the - cryspy `calc_hkl` wiring (per ADR Deferred Work) and raises a clear - error for SC calculate-without-data. Confirm that deferral, or expand - P1.7 to wire `calc_hkl` now. -2. **Total scattering.** This plan leaves `total-pd`/`pdffit` requiring - measured data (clear error otherwise). Confirm total scattering stays - out of scope. -3. **Default numeric ranges/steps per type** (P1.4). Proposed: author in - d-spacing (e.g. a sensible d-min/d-max window) and project; exact - numbers to be chosen during implementation. Confirm the d-spacing - default approach and whether specific default numbers are required. -4. **CIF tags for TOF / sinθ/λ / d bounds** (P1.2). CWL reuses - `_pd_meas.2theta_range_{min,max,inc}`; TOF/SC need custom tags. Final - spellings to be fixed against IUCr alignment during P1.2 — flag if a - specific convention is required. -5. **Grid-generation trigger location** (P1.6). Proposed at the top of - the data collection's calc pass (`_update`). Confirm this over a - property-getter side effect on `experiment.data.x`. - -## Verification commands (Phase 2) - -Run after Phase 1 is approved. Use the zsh-safe log-capture pattern -where saved output is needed: - -```bash -pixi run fix -pixi run test-structure-check > /tmp/easydiffraction-structure.log 2>&1; structure_exit_code=$?; tail -n 100 /tmp/easydiffraction-structure.log; exit $structure_exit_code -pixi run check > /tmp/easydiffraction-check.log 2>&1; check_exit_code=$?; tail -n 200 /tmp/easydiffraction-check.log; exit $check_exit_code -pixi run unit-tests > /tmp/easydiffraction-unit.log 2>&1; unit_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-unit.log; exit $unit_tests_exit_code -pixi run integration-tests > /tmp/easydiffraction-integration.log 2>&1; integration_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-integration.log; exit $integration_tests_exit_code -pixi run script-tests > /tmp/easydiffraction-script.log 2>&1; script_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-script.log; exit $script_tests_exit_code -``` - -Phase 2 must also add mirrored unit tests for every new module -(`test_base.py`, `test_cwl.py`, `test_tof.py`, `test_sc.py`, -`test_factory.py` under -`tests/unit/easydiffraction/datablocks/experiment/categories/data_range/`) -and extend the existing calculator/data/display tests. `pixi run fix` -regenerates `docs/dev/package-structure/{full,short}.md` — do not edit -by hand. - -Phase 2 integration tests **must** cover an end-to-end -calculate-without- measured-data run for **both** the `cryspy` and -`crysfml` engines, in **both** CWL and TOF beam modes (generated grid → -calculate → plot with calculated curve + background + Bragg). The -verification command list alone does not guarantee a calc-only case -exists in those suites, and the cryspy engine input now embeds a -finite-placeholder measured loop for generated grids (see the -`_cif_measured_data_pd` change) that static review cannot validate. -Phase 2 must also exercise the calc-only display render path -(auto-include + dispatch) wired in Phase 1, and confirm -`test_base_coverage.py` (which referenced the removed -`_measured_x_values` helper) is updated to the `data_range`-backed -`measured_range`. - -Phase 2 must add a **fully-excluded measured scan** regression test: -load measured data, add an excluded region spanning the whole scan, then -(a) `save()` and confirm the measured loop still persists (the -`data_range`/data-loop CIF skip must not fire — existence is judged on -unfiltered points), and (b) set a `data_range` bound and confirm it -**raises** the measured-data guard rather than clearing the scan. - -## Status checklist - -- [x] P1.1 Promote ADR to accepted -- [x] P1.2 Add data_range category package -- [x] P1.3 Attach data_range to experiment items -- [x] P1.4 Derived sinθ/λ + d-spacing views and defaults -- [x] P1.5 Guard data_range; subsume measured_range -- [x] P1.6 Generate powder grid from data_range -- [x] P1.7 Calculator guards (SC/total) -- [x] P1.8 Relax display gates for calculated-only -- [x] P1.9 Docs touch-ups -- [x] P1.10 Phase 1 review gate -- [x] Phase 2 verification (tests + `pixi run fix/check/*-tests`) - -## Suggested Pull Request - -**Title:** Calculate and plot a pattern without measured data - -**Description:** You can now simulate a diffraction pattern straight -from a crystal structure and instrument settings — no measured data file -required. Set the calculation range (in 2θ for constant-wavelength or -time-of-flight for TOF instruments), or just accept the sensible -defaults, and EasyDiffraction will compute the pattern and show a -two-panel view: the calculated curve with its background on the main -panel, plus a Bragg reflection-marker row. This makes it easy to preview -what a candidate structure should look like, to teach, or to generate a -synthetic pattern before any measurement exists. Fitting still requires -measured data, as before. diff --git a/docs/dev/plans/edstar-project-persistence.md b/docs/dev/plans/edstar-project-persistence.md deleted file mode 100644 index a5f4803c5..000000000 --- a/docs/dev/plans/edstar-project-persistence.md +++ /dev/null @@ -1,525 +0,0 @@ -# Edi Project Persistence Plan - -This plan follows `AGENTS.md`. There are no deliberate exceptions. - -## Status - -- [x] Draft implementation plan from the accepted local instructions and - current repository context. -- [x] Review and accept this plan. -- [x] Phase 1 - implementation commits complete. -- [x] Phase 1 review complete. -- [x] Phase 2 - tests and verification complete. -- [x] Phase 2 review complete. - -When an AI agent follows this plan, every completed Phase 1 -implementation step must be staged with explicit paths and committed -locally before moving to the next implementation step or the Phase 1 -review gate. Commits must be atomic, single-purpose, and use the commit -message rules from `AGENTS.md`. - -Phase 1 must not add or run tests. Phase 2 adds and updates tests, then -runs the verification commands listed below. - -## Related ADR - -- ADR: `docs/dev/adrs/accepted/edstar-project-persistence.md` -- Implementation branch: `edstar-project-persistence` -- Pull request target: `develop` - -This change implements one ADR. As required by `AGENTS.md`, Phase 1 must -promote the ADR from `suggestions/` to `accepted/` before opening a pull -request, update `docs/dev/adrs/index.md`, and fix links that still point -to the old suggestions path. - -## Decisions - -- Edi becomes the project persistence format: `project.edi`, - `structures/.edi`, `experiments/.edi`, and - `analysis/analysis.edi`. -- `analysis/results.csv`, `analysis/mcmc.h5`, and - `reports/.cif` keep their current locations and purposes. -- Report CIF generation stays strict IUCr/pdCIF export. Regular project - save/load must not treat report CIF as round-trippable project state. -- Saved Edi files include the schema marker `_edi.schema_version 1`. -- Project restore accepts only Edi project files. Legacy beta - EasyDiffraction CIF project files fail with an explicit migration - error. Official CIF import names remain supported by explicit CIF - import paths where supported, and read aliases remain recorded on - handlers. -- Edi files take precedence over stale CIF siblings. If both exist, load - Edi and ignore CIF for the same project section. -- Ordinary `save()` writes Edi files. It does not need to delete stale - CIF files; precedence and clear console output handle stale siblings. -- Public Python names move to the ADR's API-oriented names with no - transitional Python properties: `project.metadata`, - `experiment.experiment_type`, `linked_structures`, `linked_structure`, - `structure_id`, atom/alias `id`, `parameter_unique_name`, and the - other explicit field renames from the ADR. -- `analysis.software` becomes a role-keyed loop with - `software[role].{name, version, url}` and a closed `(str, Enum)` role - set. Fit timestamp moves to `project.metadata.timestamp`. -- Runtime descriptors expose a read-only `url` derived from Edi names - and docs version. Static docs tables use stable relative anchors, not - runtime `param.url`. -- Parameter docs remain hand-maintained. A generated CifHandler/Edi - inventory is an audit artifact, not the source used to generate docs - tables. -- No new dependency is planned. - -## Open Questions - -- Whether Edi needs an explicit public CLI format flag. This plan - assumes no new `--format` flag: `.edi` is the default project - persistence format, and CLI help/docs name it because users see the - files. -- Whether future analysis-reference fields should adopt a broader - `_id` naming convention. This plan keeps the ADR's current - decision: `parameter_unique_name` remains the persisted analysis - parameter reference field. - -## Repository Context - -Current persistence is centered in: - -- `src/easydiffraction/project/project.py` -- `src/easydiffraction/io/cif/handler.py` -- `src/easydiffraction/io/cif/serialize.py` -- `src/easydiffraction/io/cif/parse.py` -- `src/easydiffraction/datablocks/structure/collection.py` -- `src/easydiffraction/datablocks/experiment/collection.py` -- `src/easydiffraction/datablocks/experiment/item/factory.py` -- `src/easydiffraction/io/ascii.py` -- `src/easydiffraction/__main__.py` - -The main public-name changes cross these areas: - -- Structure categories: `atom_sites`, `atom_site_aniso`, and `geom`. -- Experiment categories: `experiment_type`, `linked_phases`, - `linked_crystal`, `refln`, `pref_orient`, `instrument`, `background`, - and `data`. -- Analysis categories: `aliases`, `fit_parameters`, - `fit_parameter_correlations`, and `software`. -- Project metadata: `project.metadata`, `project.project_metadata`, and - `project/categories/metadata/`. -- User-facing docs and generated notebooks under `docs/docs/`. - -The existing docs reference is a two-tab code/CIF table in -`docs/docs/user-guide/parameters.md` with per-category pages under -`docs/docs/user-guide/parameters/`. It must become the ADR's three-tab -code/Edi/CIF reference. - -## Concrete Files Likely To Change - -- ADRs and plan: `docs/dev/adrs/accepted/edstar-project-persistence.md`, - `docs/dev/adrs/index.md`, accepted ADRs that explicitly describe the - superseded CIF project layout. -- Persistence handlers: `src/easydiffraction/io/cif/handler.py`, - `src/easydiffraction/io/cif/serialize.py`, - `src/easydiffraction/io/cif/parse.py`, - `src/easydiffraction/io/cif/iucr_writer.py`, - `src/easydiffraction/io/cif/iucr_transformers.py`, plus a new - `src/easydiffraction/io/edi/` package if the implementation needs a - format-specific boundary. -- Project facade/config: `src/easydiffraction/project/project.py`, - `src/easydiffraction/project/project_config.py`, - `src/easydiffraction/project/project_metadata.py`, - `src/easydiffraction/project/categories/metadata/`, and matching - `__init__.py` files. -- Structure model: - `src/easydiffraction/datablocks/structure/categories/atom_sites/`, - `src/easydiffraction/datablocks/structure/categories/atom_site_aniso/`, - `src/easydiffraction/datablocks/structure/categories/geom/`, structure - factories/collections, and report/data-context callers that read - atom-site labels. -- Experiment model: `src/easydiffraction/datablocks/experiment/item/`, - `src/easydiffraction/datablocks/experiment/categories/experiment_type/`, - `linked_phases/`, `linked_crystal/`, `refln/`, `pref_orient/`, - `instrument/`, `background/`, `data/`, and package `__init__.py` - files. -- Analysis model: `src/easydiffraction/analysis/analysis.py`, - `src/easydiffraction/analysis/categories/aliases/`, - `src/easydiffraction/analysis/categories/fit_parameters/`, - `src/easydiffraction/analysis/categories/fit_parameter_correlations/`, - `src/easydiffraction/analysis/categories/software/`, - `src/easydiffraction/analysis/sequential.py`, and display/plotting - code that reads persisted parameter-reference names. -- Documentation and CLI: `docs/docs/user-guide/parameters.md`, - `docs/docs/user-guide/parameters/`, - `docs/docs/user-guide/analysis-workflow/`, - `docs/docs/quick-reference/index.md`, `docs/docs/tutorials/*.py`, - regenerated `docs/docs/tutorials/*.ipynb`, `docs/mkdocs.yml`, - `src/easydiffraction/__main__.py`, and - `src/easydiffraction/io/ascii.py`. -- New or updated tools: an Edi handler inventory/audit tool under - `tools/`, and a docs anchor verification tool if it is not folded into - an existing docs check. -- Tests in Phase 2: matching unit test files under - `tests/unit/easydiffraction/`, project save/load tests, CLI tests, - integration tests, script tests, and notebook regeneration checks. - -## Implementation Steps (Phase 1) - -- [x] P1.1 - Promote the ADR and mark superseded layout text. - - Move the ADR into `docs/dev/adrs/accepted/`, set status to Accepted, - update `docs/dev/adrs/index.md`, and add narrow cross-reference notes - to older accepted ADRs whose examples still describe CIF as the - regular project persistence format. Do not rewrite those historical - ADRs wholesale. - - Commit: - - ```text - Accept Edi project persistence ADR - ``` - -- [x] P1.2 - Make handler names explicit before changing tags. - - Extend `CifHandler` so each descriptor can declare: `project_name` for - Edi write tags, `import_names` for accepted read aliases, `iucr_name` - for report export, and enough category metadata for inventory/docs URL - generation. Preserve current CIF behavior while this step lands. - - Update descriptor construction only where needed to keep current CIF - output unchanged. Add the versioned docs URL resolver and a read-only - descriptor `url` property, but keep docs content changes for P1.11. - - Commit: - - ```text - Add explicit persistence names to handlers - ``` - -- [x] P1.3 - Add the generated handler inventory audit. - - Add a tool that imports the registered concrete categories and emits a - deterministic inventory of descriptor paths, Edi names, legacy CIF - import names, IUCr names, docs anchors, and ownership context. - Generate the initial inventory before any write-side tag renames so - later commits have a reviewable baseline. - - Keep this as an audit artifact. Do not use it to generate user docs - tables in this plan. - - Commit: - - ```text - Add Edi persistence inventory audit - ``` - -- [x] P1.4 - Introduce Edi project file save/load. - - Add Edi serialization and parsing boundaries, including schema marker - writing/validation and selector/body consistency checks. Update - `Project.save()` to write: - - ```text - project.edi - structures/.edi - experiments/.edi - analysis/analysis.edi - analysis/results.csv - analysis/mcmc.h5 - reports/.cif - ``` - - Update `Project.load()` and structure/experiment/analysis loaders so - Edi wins over same-section CIF files, while legacy-only beta CIF - project files fail with explicit migration errors. Keep - `project.report.save_cif()` and the IUCr writer on the CIF path. - - Commit: - - ```text - Save and load Edi project files - ``` - -- [x] P1.5 - Rename project info to project metadata. - - Move the public facade from `project.info` to `project.metadata`, - rename the project metadata module/category paths as appropriate, and - move the project timestamp field to `project.metadata.timestamp`. Keep - runtime saved path state available through the renamed metadata - surface. Do not add a `project.info` compatibility property. - - Update save/load, CLI dry-run handling, report path helpers, display - context, and docs snippets that access project info. - - Commit: - - ```text - Rename project info facade to metadata - ``` - -- [x] P1.6 - Convert analysis software to a role loop. - - Replace the wide `_software.framework_name`, - `_software.calculator_name`, and `_software.minimizer_name` style with - a role-keyed collection such as `analysis.software['framework'].name`. - Add a closed role enum for framework, calculator, and minimizer. - - Update fit-time provenance stamping, report data context, IUCr report - rendering, HTML/TeX templates, and restore logic. Move fit timestamp - reads/writes to `project.metadata.timestamp`. - - Commit: - - ```text - Persist software provenance as role rows - ``` - -- [x] P1.7 - Rename structure identity fields. - - Rename atom-site and anisotropic ADP public row identity from `label` - to `id`, and rename alias row identity from `label` to `id` where it - belongs with analysis aliases. Update collection key declarations, - constructors, display/report code, symmetry/ADP lookup code, and - examples. Keep official CIF import aliases for `_atom_site.label` and - `_atom_site_aniso.label`; write Edi with the new `id` names. - - Commit: - - ```text - Rename structure row identities to id - ``` - -- [x] P1.8 - Rename experiment type and linked-structure surfaces. - - Rename `experiment.type` to `experiment.experiment_type`. Rename - powder `linked_phases` to `linked_structures`, single-crystal - `linked_crystal` to `linked_structure`, and linked item `id` to - `structure_id`. - - Move package/module names where the public category name changes, and - update factories, owner attachment, supported-filter logic, - calculators, display/report code, docs snippets, tutorials, and - imports. Do not add stale Python aliases. - - Commit: - - ```text - Rename experiment structure link categories - ``` - -- [x] P1.9 - Rename experiment data and instrument fields. - - Apply the remaining experiment-side API/Edi renames from the ADR: - powder `refln.phase_id` to `structure_id`, preferred-orientation - `phase_id` to `structure_id`, powder data `point_id` to `id`, TOF - calibration `quad`/`recip` to `quadratic`/`reciprocal`, and - line-segment background `x`/`y` to `position`/`intensity`. - - Update Edi write names, legacy CIF import aliases, calculators, report - writers, plotting code, docs, and tutorials. Preserve strict report - CIF output names through `iucr_name`/transformers. - - Commit: - - ```text - Rename experiment Edi fields - ``` - -- [x] P1.10 - Rename analysis parameter-reference fields. - - Rename `param_unique_name` to `parameter_unique_name` for aliases and - fit-parameter state, rename fit-parameter correlation pair fields from - `param_unique_name_i`/`param_unique_name_j` to - `parameter_unique_name_i`/`parameter_unique_name_j`, and rename - `fit_bounds_uncertainty_multiplier` to - `bounds_uncertainty_multiplier`. If the ADR's open question is - resolved differently before implementation, apply that explicit - decision consistently to aliases, fit-parameter state, correlations, - docs, and tests. - - Update analysis restore, undo, sequential fitting, plotting, - results-sidecar consumers, and display code. - - Commit: - - ```text - Rename analysis parameter reference fields - ``` - -- [x] P1.11 - Rework parameter docs and runtime links. - - Update `docs/docs/user-guide/parameters.md` to use three tabs: "How to - access in the code", "Keys in Edi", and "Keys in CIF". Rename - per-category pages under `docs/docs/user-guide/parameters/` to Edi - category names, give them Edi titles and EasyDiffraction descriptions, - and keep IUCr icon links for official dictionary tags. - - Add stable anchors that match the runtime `param.url` resolver. Static - docs tables should use relative links to the same anchors rather than - embedding runtime `param.url`. - - Update `docs/mkdocs.yml`, quick reference, workflow docs, tutorials, - ZIP/project docs, and CLI help text from CIF project persistence to - Edi project persistence. Regenerate notebooks only from edited - tutorial `.py` files during the implementation step that changes - tutorials. - - Commit: - - ```text - Document Edi parameter keys - ``` - -- [x] P1.12 - Refresh report CIF boundaries and stale-name errors. - - Ensure report CIF generation still emits strict IUCr/pdCIF and does - not accidentally use Edi project names. Remove or update regular - project-save CIF assumptions in display/report helpers while keeping - `reports/.cif` intact. - - Add clear boundary errors for schema marker mismatches and legacy-only - beta CIF project directories. Do not add compatibility parameters or - properties for removed public names. - - Commit: - - ```text - Keep report CIF separate from Edi persistence - ``` - -- [x] P1.13 - Phase 1 review gate. - - Confirm all Phase 1 implementation commits are present, the plan - checklist is updated, and no tests or verification commands have been - run as part of Phase 1. Stop for review before Phase 2. - - Phase 1 review gate reached on branch `edstar-project-persistence`. - All Phase 1 implementation commits are present and no Phase 2 - verification commands were run during Phase 1. - - Commit: - - ```text - Reach Edi Phase 1 review gate - ``` - -- [x] P1.14 - Rename the space-group coordinate-system parameter. - - Record the post-review Phase 1 scope addition requested after the - original review gate: rename - `structure.space_group.it_coordinate_system_code` to - `structure.space_group.coord_system_code` and write Edi with - `_space_group.coord_system_code`. Keep official CIF import/report - names as `_space_group.IT_coordinate_system_code`, and do not preserve - the pre-release lowercase Edi spelling as a legacy alias. - - Update the accepted ADR, live ADR references, handler inventory, - source call sites, user docs, tutorials, and regenerated notebooks. - This reopened the Phase 1 review cycle after the original review-3 - sentinel; Phase 1 review is complete only after the follow-up review - accepts this additional step. - - Commit: - - ```text - Rename space-group coordinate-system parameter - ``` - -## Verification Steps (Phase 2) - -- [x] P2.1 - Add and update focused tests. - - Add or update unit tests for: - - - Edi schema marker write/read validation. - - Edi-over-CIF precedence for project, structures, experiments, and - analysis. - - Beta-window CIF import aliases for each renamed field. - - Public stale-name failures for removed Python names. - - Role-keyed `analysis.software` persistence and timestamp relocation. - - Fit-parameter and fit-parameter-correlation reference-field renames. - - `param.url` generation and docs-anchor validation. - - Report CIF continuing to use strict IUCr/pdCIF names. - - ZIP extraction and CLI help accepting Edi project archives. - - Add integration/script coverage for save/load round trips, tutorial - projects, report export, and sequential/Bayesian sidecars where those - paths are affected. - - Commit: - - ```text - Test Edi project persistence - ``` - -- [x] P2.2 - Run structure and formatting checks. - - ```bash - pixi run test-structure-check > /tmp/easydiffraction-test-structure-check.log 2>&1; test_structure_check_exit_code=$?; tail -n 200 /tmp/easydiffraction-test-structure-check.log; exit $test_structure_check_exit_code - pixi run fix > /tmp/easydiffraction-fix.log 2>&1; fix_exit_code=$?; tail -n 200 /tmp/easydiffraction-fix.log; exit $fix_exit_code - ``` - - Include regenerated `docs/dev/package-structure/full.md` and - `docs/dev/package-structure/short.md` if `pixi run fix` changes them. - - Commit: - - ```text - Apply Edi verification formatting - ``` - -- [x] P2.3 - Run static checks. - - ```bash - pixi run check > /tmp/easydiffraction-check.log 2>&1; check_exit_code=$?; tail -n 200 /tmp/easydiffraction-check.log; exit $check_exit_code - ``` - - Commit fixes only if this command identifies code or docs issues. - -- [x] P2.4 - Run unit tests. - - ```bash - pixi run unit-tests > /tmp/easydiffraction-unit-tests.log 2>&1; unit_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-unit-tests.log; exit $unit_tests_exit_code - ``` - - Commit fixes only if this command identifies unit-level issues. - -- [x] P2.5 - Run integration tests. - - ```bash - pixi run integration-tests > /tmp/easydiffraction-integration-tests.log 2>&1; integration_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-integration-tests.log; exit $integration_tests_exit_code - ``` - - If the failure is a sandbox-only multiprocessing or permission symptom - rather than a code assertion, rerun the same command with the approved - escalated permission path before changing code. - - Commit fixes only if this command identifies integration-level issues. - -- [x] P2.6 - Run script tests. - - ```bash - pixi run script-tests > /tmp/easydiffraction-script-tests.log 2>&1; script_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-script-tests.log; exit $script_tests_exit_code - ``` - - If two tutorials write to the same project directory under - `tmp/tutorials/projects/`, fix the tutorial source path, run - `pixi run notebook-prepare`, and commit the source plus regenerated - notebook. Do not include benchmark CSV files under - `docs/dev/benchmarking/` unless the user explicitly asks to update - benchmark history. - - Commit fixes only if this command identifies script-level issues. - -## Suggested Pull Request - -Title: - -```text -Add Edi project persistence -``` - -Description: - -```text -Save EasyDiffraction projects in the new Edi format while keeping -report CIF output strict for publication and exchange. The change makes -saved project files easier to read and edit, clarifies project metadata -and linked-structure names, and gives clear migration errors for older -beta CIF project directories. -``` diff --git a/docs/dev/plans/edstar-project-persistence_edi-reply-1.md b/docs/dev/plans/edstar-project-persistence_edi-reply-1.md deleted file mode 100644 index ef93d3e27..000000000 --- a/docs/dev/plans/edstar-project-persistence_edi-reply-1.md +++ /dev/null @@ -1,62 +0,0 @@ -# Edi Rename Reply 1: Edstar Project Persistence - -Reply to -[`edstar-project-persistence_edi-review-1.md`](edstar-project-persistence_edi-review-1.md). -All three findings agreed and fixed. - -## Finding 1 [high] — Stale `_edi.schema_name` in test and docs — Agree, fixed - -Verdict: agree. The marker is version-only now, so both the checked -assertion and the user-facing sample had to follow. - -Action: - -- The test assertion was already corrected before this review landed: - `test_save_writes_experiment_edi_files` now asserts - `_edi.schema_version 1` - (`tests/unit/easydiffraction/project/test_project_coverage.py:427`, - commit `56037465`). -- The user-guide project-layout sample no longer shows the - `_edi.schema_name EasyDiffraction` line; it now shows only - `_edi.schema_version 1` - (`docs/docs/user-guide/analysis-workflow/project.md:120`, commit - `117dbf7c`). - -## Finding 2 [medium] — Legacy `.edifa` files silently ignored on restore — Agree, fixed - -Verdict: agree. A stale `.edifa` section in a project directory is a -boundary input and must fail loudly, like the existing `.cif` rejection, -not be skipped. - -Action (commit `4c26f0a7`): added `_raise_legacy_edifa_error()` and -`.edifa` detection at every restore site in -`src/easydiffraction/project/project.py`: - -- `_load_edi_directory()` rejects any `*.edifa` in a section directory - before loading `*.edi` (covers `structures/` and `experiments/`). -- `_load_project_metadata()` rejects `project.edifa`. -- `_resolved_analysis_path()` rejects `analysis/analysis.edifa` and a - root `analysis.edifa`. - -In each case the `.edifa` check runs _before_ the matching `.edi` -lookup, so a directory mixing a stale `.edifa` with a valid `.edi` still -fails loudly rather than silently preferring one. The error mirrors the -`.cif` migration message and names `.edi` as the replacement. Coverage -added in `tests/unit/easydiffraction/project/test_project_coverage.py` -(`test_load_rejects_legacy_edifa_section_file`, -`test_load_rejects_legacy_edifa_analysis_file`). - -## Finding 3 [low] — `pixi.toml` comment drift — Agree, fixed - -Verdict: agree. The task reads `analysis.edi`; the comment lagged. - -Action (commit `f0217275`): updated the tutorial-output task comment in -`pixi.toml:128` from `analysis.edifa` to `analysis.edi`. - -## Verification - -`pixi run check` clean (11/11). Unit suite green (3551 passed) including -the two new `.edifa`-rejection tests; integration green (192 passed) -against the regenerated `.edi` external data. Script/functional/ -tutorial-baseline gates are running as part of the final pre-push -verification. diff --git a/docs/dev/plans/edstar-project-persistence_edi-reply-2.md b/docs/dev/plans/edstar-project-persistence_edi-reply-2.md deleted file mode 100644 index d9f72e036..000000000 --- a/docs/dev/plans/edstar-project-persistence_edi-reply-2.md +++ /dev/null @@ -1,31 +0,0 @@ -# Edi Rename Reply 2: Edstar Project Persistence - -Reply to -[`edstar-project-persistence_edi-review-2.md`](edstar-project-persistence_edi-review-2.md). -The single finding is agreed and fixed. - -## Finding 1 [low] — `project.edifa` rejection branch untested — Agree, fixed - -Verdict: agree. Restore is a boundary input and the project-level -`project.edifa` branch (`src/easydiffraction/project/project.py`, -`_load_project_metadata()`) was the one rejection path without a test; -only the section and analysis branches were covered. - -Action (commit `f392f51b`): added -`test_load_rejects_legacy_project_edifa_metadata` in -`tests/unit/easydiffraction/project/test_project_coverage.py`. It saves -a valid project, drops a stale `project.edifa` beside the new -`project.edi`, and asserts `Project.load()` raises the legacy `.edifa` -migration error. Because the `.edifa` check runs before the -`project.edi` read, the mixed-directory case fails loudly as intended. - -All three project-restore rejection paths — section files -(`structures/`, `experiments/`), `analysis.edifa`, and `project.edifa` — -now have explicit coverage. - -## Verification - -`pixi run check` clean (11/11). The new test passes; the full -script-tests (34 passed, 7 skipped) and tutorial-baseline (24 passed, 1 -platform skip) gates were green on the pushed branch before this -finding, and this change is test-only. diff --git a/docs/dev/plans/edstar-project-persistence_edi-review-1.md b/docs/dev/plans/edstar-project-persistence_edi-review-1.md deleted file mode 100644 index 498da28ac..000000000 --- a/docs/dev/plans/edstar-project-persistence_edi-review-1.md +++ /dev/null @@ -1,46 +0,0 @@ -# Edi Rename Review 1: Edstar Project Persistence - -## Findings - -1. [high] The schema-marker simplification left stale `_edi.schema_name` - expectations behind. `section_to_edi()` now writes only - `_edi.schema_version 1` (`src/easydiffraction/io/edi/serialize.py:9`, - `src/easydiffraction/io/edi/serialize.py:44`, - `src/easydiffraction/io/edi/serialize.py:47`), which matches the ADR - and plan, but `test_save_writes_experiment_edi_files` still asserts - `_edi.schema_name EasyDiffraction` - (`tests/unit/easydiffraction/project/test_project_coverage.py:427`). - The user guide project-layout sample also still shows - `_edi.schema_name` - (`docs/docs/user-guide/analysis-workflow/project.md:120`). Please - update the stale test and documentation sample to the version-only - marker so the checked behavior and user-facing docs match the new Edi - schema. - -2. [medium] Old `.edifa` section files are silently ignored in mixed - project directories. `_load_edi_directory()` loads `*.edi` files and - explicitly rejects legacy `*.cif` files - (`src/easydiffraction/project/project.py:152`, - `src/easydiffraction/project/project.py:158`), but it does not - recognize `*.edifa` as an unsupported previous project-state suffix. - A directory containing `project.edi` plus stale - `structures/lbco.edifa` or `experiments/hrpt.edifa` would restore - without those structures/experiments instead of failing loudly. The - same gap exists for root or nested `analysis.edifa`, since - `_resolved_analysis_path()` checks only `.edi` and legacy `.cif` - paths (`src/easydiffraction/project/project.py:199`, - `src/easydiffraction/project/project.py:206`). Given persisted-state - restore is a boundary input, please reject `.edifa` files explicitly - with the same migration-style error rather than silently skipping - them. - -3. [low] The tutorial-output task comment in `pixi.toml` still says it - parses `analysis.edifa` (`pixi.toml:128`). The task itself now reads - `analysis.edi`, so this is documentation drift in the developer task - list. Please update the comment to avoid sending the next verifier - looking for the old extension. - -## Checks Skipped - -Static review only. I did not run tests, lint, formatters, builds, or -any `pixi` commands. diff --git a/docs/dev/plans/edstar-project-persistence_edi-review-2.md b/docs/dev/plans/edstar-project-persistence_edi-review-2.md deleted file mode 100644 index e46ec7d06..000000000 --- a/docs/dev/plans/edstar-project-persistence_edi-review-2.md +++ /dev/null @@ -1,20 +0,0 @@ -# Edi Rename Review 2: Edstar Project Persistence - -## Findings - -1. [low] The new `project.edifa` rejection branch is untested. The - follow-up fix added explicit project-level detection before reading - `project.edi` (`src/easydiffraction/project/project.py:200`), but the - new coverage only exercises stale section and analysis files - (`tests/unit/easydiffraction/project/test_project_coverage.py:587`, - `tests/unit/easydiffraction/project/test_project_coverage.py:605`). - Persisted-state restore is a boundary input, and the local test rule - asks for every new code path to be covered. Please add a small test - that drops `project.edifa` next to, or instead of, `project.edi` and - asserts `Project.load()` fails with the legacy `.edifa` migration - error. - -## Checks Skipped - -Static review only. I did not run tests, lint, formatters, builds, or -any `pixi` commands. diff --git a/docs/dev/plans/edstar-project-persistence_edi-review-3.md b/docs/dev/plans/edstar-project-persistence_edi-review-3.md deleted file mode 100644 index bde3084d2..000000000 --- a/docs/dev/plans/edstar-project-persistence_edi-review-3.md +++ /dev/null @@ -1,12 +0,0 @@ -# Edi Rename Review 3: Edstar Project Persistence - -**No findings. Ready to commit.** - -The review-2 finding is addressed by `f392f51b`, which adds explicit -coverage for the project-level `project.edifa` rejection path. I re-read -the reply and inspected the follow-up patch statically; the stale -marker, legacy `.edifa`, and `pixi.toml` findings from earlier Edi -rename reviews are closed. - -Static review only. I did not run tests, lint, formatters, builds, or -any `pixi` commands. diff --git a/docs/dev/plans/model-sample-absorption.md b/docs/dev/plans/model-sample-absorption.md deleted file mode 100644 index 1f588fe43..000000000 --- a/docs/dev/plans/model-sample-absorption.md +++ /dev/null @@ -1,382 +0,0 @@ -# Implementation Plan: Model Sample Absorption (Debye–Scherrer, μR) - -This plan follows the conventions in [`AGENTS.md`](../../../AGENTS.md). -No deliberate exceptions are taken. - -## ADR - -Implements -[`docs/dev/adrs/accepted/model-sample-absorption.md`](../adrs/accepted/model-sample-absorption.md) -(Status: Accepted; promoted from `suggestions/` in Phase A). This plan -**owns** that ADR. - -**ADR promotion happens in `/draft-impl-1` Phase A (design-history -cleanup), at task start — not as a numbered Phase 1 step.** Before P1.1, -the Phase A setup: `git mv` the ADR `suggestions/ → accepted/`, set -`**Status:** Accepted`, flip the `docs/dev/adrs/index.md` row to -`Accepted` with the `accepted/...` link, fix any link still pointing at -`suggestions/...` (`git grep -n model-sample-absorption`), remove the -design-phase `model-sample-absorption_review-*.md` / `_reply-*.md` -siblings, and commit -(`Promote model-sample-absorption ADR to accepted`). The review-1 fixes -currently uncommitted in the worktree travel with that commit. This -aligns with [`AGENTS.md`](../../../AGENTS.md) §Change Discipline -(promote before opening the PR) and the `/draft-impl-1` Phase A -workflow, so the autonomous setup does not commit the ADR as a -suggestion and then move it later. - -Related accepted ADRs the work must respect: - -- [`switchable-category-owned-selectors.md`](../adrs/accepted/switchable-category-owned-selectors.md) - — the `category.type` / `category.show_supported()` surface and the - owner `_swap_` hook. -- [`preferred-orientation-category.md`](../adrs/accepted/preferred-orientation-category.md) - — the most recent powder-correction category (#200); its package, - owner wiring, and verification-page pattern are the closest template. -- [`factory-contracts.md`](../adrs/accepted/factory-contracts.md), - [`factory-tag-naming.md`](../adrs/accepted/factory-tag-naming.md), - [`enum-backed-closed-values.md`](../adrs/accepted/enum-backed-closed-values.md). - -## Branch and PR - -- **Branch:** `model-sample-absorption` (already created off `develop`, - in sync with `origin/develop`). PRs target `develop`. -- Do not push unless asked. -- The `/draft-impl-1` shortcut commits each Phase 1 step with explicit - paths before moving to the next, per [`AGENTS.md`](../../../AGENTS.md) - §Commits. Each `- [ ] P1.X` item below is one atomic commit. - -## Decisions (settled in the ADR) - -1. **Switchable `absorption` category** mirroring `extinction` - (`base.py` + concrete classes + factory + `__init__.py`), **not** a - flat instrument parameter. -2. **Calculator-independent application:** A(θ) is computed in - EasyDiffraction and multiplied onto the final pattern in **both** - backends via one shared helper — neither cryspy nor crysfml applies - it internally (cryspy has no slot; crysfml's Fortran routine is - unwrapped). -3. **Pointwise 2θ envelope:** `y(2θ_i) ← A(θ_i)·y(2θ_i)` (slow-envelope - approximation, validated to 4 decimals vs FullProf). -4. **Phase 1 builds only `none` + `cylinder-hewat`.** Lobanov, - flat-plate, TOF are future classes on the same factory (ADR §Deferred - Work). TOF additionally needs a separate λ-aware calculation path - (ADR §3a) — out of scope here. -5. **Owner scope = Bragg powder only:** `Compatibility(powder, bragg)`, - `CalculatorSupport(cryspy, crysfml)`. Total/pdffit experiments do not - get the category at all (ADR §1 "Owner scope"). -6. **`mu_r`:** `Parameter`, `RangeValidator(ge=0.0)`, default `0.0`, - `free=False` by default. **Out-of-range policy:** no hard ceiling, - but a single `log.warning` above `HEWAT_MAX_VALIDATED_MU_R = 1.5` - pointing to the (deferred) `cylinder-lobanov` form (ADR §4). -7. **Persistence:** project-namespaced `_absorption.type` / - `_absorption.mu_r` via the descriptors' `CifHandler`, IUCr export - `_easydiffraction_absorption.*` (ADR §7). -8. **`type` selector is enum-backed (`AbsorptionTypeEnum`).** Per - [`enum-backed-closed-values.md`](../adrs/accepted/enum-backed-closed-values.md) - (which names factory tags as a finite closed set requiring - `(str, Enum)`), the `type` selector follows the **peak** precedent — - `peak/base.py:42` validates against - `[member.value for member in PeakProfileTypeEnum]` and - `peak/cwl.py:29` sets `TypeInfo(tag=PeakProfileTypeEnum.X.value)`. - Absorption mirrors this: a new `AbsorptionTypeEnum` (`NONE = 'none'`, - `CYLINDER_HEWAT = 'cylinder-hewat'`; future members for Lobanov / - flat-plate / TOF), the concrete classes set - `TypeInfo(tag=AbsorptionTypeEnum.X.value)`, and the `type` validator - uses `[m.value for m in AbsorptionTypeEnum]`. This is the - enum-compliant path — **not** `extinction`'s raw - `Factory.supported_tags()`, which is the non-compliant outlier — so - the plan's "No deliberate exceptions" statement holds. - -## Open questions - -(Open Question 1 — `type` selector enum — is now **resolved**; see -Decision 8.) - -1. **Where to fire the out-of-range warning.** Per-iteration spam is a - risk if fired at calculation time. **Proposed:** fire from the Hewat - helper, guarded by a module-level "already-warned" set keyed on the - rounded μR value, so each distinct out-of-range value warns once. - Alternative: a custom validating descriptor on `mu_r`. -2. **IUCr export scope for Phase 1.** Round-trip of `_absorption.*` is - required; the optional standard provenance - (`_exptl_absorpt.correction_type cylinder`) can land in Phase 1 or - defer. **Proposed:** Phase 1 does round-trip + the - `_easydiffraction_absorption.*` IUCr names; standard-provenance - provenance is deferred. - -## Concrete files likely to change - -**New (Phase 1):** - -- `src/easydiffraction/datablocks/experiment/categories/absorption/__init__.py` -- `…/categories/absorption/base.py` — - `AbsorptionBase(CategoryItem, SwitchableCategoryBase)` -- `…/categories/absorption/factory.py` — `AbsorptionFactory` -- `…/categories/absorption/none.py` — `NoAbsorption` (tag `none`, A≡1) -- `…/categories/absorption/cylinder_hewat.py` — - `CylinderHewatAbsorption` (tag `cylinder-hewat`, `mu_r`) -- `src/easydiffraction/analysis/calculators/absorption.py` — shared - `factor(two_theta, absorption) → np.ndarray` + Hewat + - `HEWAT_MAX_VALIDATED_MU_R` -- `docs/docs/user-guide/parameters/absorption.md` (template: - `parameters/pref_orient.md`) - -**Phase A — design-history cleanup (in `/draft-impl-1` setup, before -P1.1; see §ADR):** - -- `docs/dev/adrs/suggestions/model-sample-absorption.md` → - `docs/dev/adrs/accepted/model-sample-absorption.md` (`git mv`, - `**Status:** Accepted`). -- `docs/dev/adrs/index.md` — flip the row `Suggestion → Accepted` with - the `accepted/...` link; fix any `suggestions/...` links - (`git grep -n model-sample-absorption`). -- Remove the design-phase `model-sample-absorption_review-*.md` / - `_reply-*.md` siblings (ADR and plan) per the Phase A cleanup. - -**Modified (Phase 1):** - -- `src/easydiffraction/datablocks/experiment/item/enums.py` — add - `AbsorptionTypeEnum` (Decision 8 / P1.1). -- `src/easydiffraction/datablocks/experiment/item/base.py` — - `_swap_absorption` / `_replace_absorption` (mirror extinction lines - ~210–241), `absorption` read-only property, parent-attach, - `_serializable_categories`. -- `src/easydiffraction/datablocks/experiment/item/bragg_pd.py` — create - `self._absorption = AbsorptionFactory.create(AbsorptionFactory.default_tag())` - alongside `_pref_orient` (line ~67); expose `absorption` property; - extend `_restore_switchable_types()` (line ~201) to restore - `_absorption.type` (P1.2). -- `src/easydiffraction/analysis/calculators/cryspy.py` — multiply A(θ) - before `return y_calc` (line ~303), guarded for the empty/no-data - path. -- `src/easydiffraction/analysis/calculators/crysfml.py` — multiply A(θ) - in `calculate_pattern` before `return np.asarray(y)` (line ~169), - guarded for the empty/no-data path. -- `src/easydiffraction/io/cif/iucr_writer.py` — absorption export - (mirror the pref_orient hook from #200), if needed. -- `docs/docs/user-guide/parameters.md` — add `absorption.type` / - `absorption.mu_r` rows + reference link to `parameters/absorption.md` - (P1.6). `docs/mkdocs.yml` is **not** changed for the leaf page (that - directory is excluded from global nav); touch it only if the #200 - `pref_orient` precedent did. - -**Phase 2 (tests / verification):** - -- Category tests **mirror the package per-module** (the parent-level - `test_.py` exception applies only to packages with just - `default.py`/`factory.py`; this package has more): - - `tests/unit/easydiffraction/datablocks/experiment/categories/absorption/test_base.py` - - `…/categories/absorption/test_factory.py` - - `…/categories/absorption/test_none.py` - - `…/categories/absorption/test_cylinder_hewat.py` Confirm with - `pixi run test-structure-check`. -- `tests/unit/easydiffraction/analysis/calculators/test_absorption.py` - (helper, including the warning and the 4-decimal FullProf check) -- `tests/unit/easydiffraction/analysis/calculators/test_cryspy.py`, - `…/test_crysfml.py` — A(θ) application, including the empty/no-data - path guard from P1.4. -- `docs/docs/verification/pd-neut-cwl_tch-fcj_lab6.py` — enable - `absorption.type='cylinder-hewat'`, `mu_r=0.7` so both engines apply - the correction. **Scoped outcome:** the page exercises the feature and - the "modelled by neither engine" docs are corrected, but a full - non-skipped agreement assertion is **deferred** — the page also drives - the cryspy comparison, which still lacks FCJ axial-divergence - asymmetry (a separate open issue, same reason `…-noabs_lab6` is - skipped). The page therefore stays in `ci_skip.txt` for the narrower - FCJ reason, and the absorption maths is instead asserted by the - unit/backend tests above (helper 4-decimal check + both backend call - sites). -- `docs/docs/verification/pd-neut-cwl_tch-fcj-nosldl_lab6.py` — a - dedicated page that **isolates** absorption against a FullProf - reference with FCJ switched off (`S_L = D_L = 0`, μR = 0.7). It - asserts **ed-cryspy vs FullProf** (`raise_on_failure=True`): enabling - `cylinder-hewat` removes a ≈ 2.9× intensity mismatch and the page - passes (profile diff 0.84 %, area ratio 1.0021, shape correlation - 1.0000), confirming the correction end-to-end. It is in `ci_skip.txt` - only because ed-cryspy's SyCos/SySin needs the unreleased cryspy PR - #46; it passes today on the develop cryspy. (crysfml has a separate - base-intensity convention difference for LaB₆, so only cryspy is - asserted.) - -## Implementation steps (Phase 1) - -> Code and docs only. No tests in Phase 1 (added in Phase 2). Commit -> each step atomically with explicit paths. - -- [x] **P1.1 — Add the `absorption` switchable-category package** First - add `AbsorptionTypeEnum` (`NONE='none'`, - `CYLINDER_HEWAT='cylinder-hewat'`) to - `datablocks/experiment/item/enums.py`, with a `description()` per - member, mirroring `PeakProfileTypeEnum` (Decision 8). Then create - `absorption/{base,factory,none,cylinder_hewat,__init__}.py`. - `AbsorptionBase` mirrors `ExtinctionBase`'s structure - (`_category_code='absorption'`, `_owner_attr_name='absorption'`, - `_swap_method_name='_swap_absorption'`) **but the `type` validator - follows peak**: - `MembershipValidator(allowed=[m.value for m in AbsorptionTypeEnum])`; - `_supported_types` via `AbsorptionFactory.supported_for(...)`. - `NoAbsorption` (`TypeInfo(tag=AbsorptionTypeEnum.NONE.value)`, no - params). `CylinderHewatAbsorption` - (`TypeInfo(tag=AbsorptionTypeEnum.CYLINDER_HEWAT.value)`, `mu_r` - Parameter per Decision 6, CIF `_absorption.mu_r` / - `_easydiffraction_absorption.mu_r`). Both: - `Compatibility(powder, bragg)`, - `CalculatorSupport(cryspy, crysfml)`. `__init__.py` imports all - concrete classes (registration). - `AbsorptionFactory._default_rules = {frozenset(): 'none'}`. - _Commit:_ `Add absorption switchable category package` - -- [x] **P1.2 — Wire `absorption` into the powder-Bragg experiment - owner** In `item/base.py` add - `_swap_absorption`/`_replace_absorption` mirroring extinction - (create via factory, reparent, set `type`), include `absorption` - in parent-attach and `_serializable_categories`. In - `item/bragg_pd.py` create `self._absorption` alongside - `_pref_orient` and expose a read-only `absorption` property. - Verify total/pdffit experiments never construct it (Compatibility - gate). **Restore the active type on load (persisted-state - boundary):** extend - `BraggPdExperiment._restore_switchable_types()` in - `item/bragg_pd.py` (line ~201, where `_background.type` is already - read) to also `read_cif_str(block, '_absorption.type')` and swap - **before** category descriptors are loaded — without this a saved - `cylinder-hewat` experiment is rebuilt as the default `none`, - leaving `_absorption.mu_r` with no descriptor to receive its - value. Mirror the existing background/peak restore exactly. - _Commit:_ `Wire absorption category into powder experiment owner` - -- [x] **P1.3 — Add the shared Hewat A(θ) helper** New - `analysis/calculators/absorption.py`: - `HEWAT_MAX_VALIDATED_MU_R = 1.5`; - `factor(two_theta, absorption) -> np.ndarray` returning all-ones - for `type='none'` and the Hewat envelope for `cylinder-hewat` - (`A = exp(-(1.7133-0.0368·sin²θ)·μR + (0.0927+0.375·sin²θ)·μR²)`, - `θ = radians(two_theta)/2`). Emit the single guarded `log.warning` - when `mu_r > HEWAT_MAX_VALIDATED_MU_R` (Open question 2). Pure - NumPy, no backend imports. _Commit:_ - `Add Hewat cylindrical absorption factor helper` - -- [x] **P1.4 — Apply A(θ) in both backends** `cryspy.py`: before - `return y_calc`, multiply by - `absorption.factor(experiment.data.x, experiment.absorption)` when - the experiment exposes `absorption`. `crysfml.py`: same, in - `calculate_pattern` before `return np.asarray(y)`, against the - same x grid. Guard on `hasattr(experiment, 'absorption')` so - single-crystal / total experiments are unaffected. Identical - helper call in both. **Preserve the existing "no calculated data" - paths:** both backends return an empty array on failure — - `crysfml.py` catches `KeyError` and sets `y = []` (line ~166–168); - `cryspy.py` has `return []` paths (lines ~289, 301). Apply the - correction **only when the pattern is non-empty and its length - equals `len(experiment.data.x)`**; otherwise return the - empty/unchanged result. This avoids a NumPy broadcast error - combining shapes `(0,)` and `(n,)` and keeps the empty-result - contract intact. (Verified by a Phase 2 no-data test.) _Commit:_ - `Apply absorption correction in cryspy and crysfml backends` - -- [x] **P1.5 — Persist the absorption category in experiment CIF** - **Verified: no source change required.** - `CategoryOwner.categories` auto-discovers every `CategoryItem` in - `vars(self)` (`core/category_owner.py:20`), so `_absorption` is in - `_serializable_categories()` automatically — `_absorption.type` - (and `_absorption.mu_r` for `cylinder-hewat`) are written via the - descriptors' `CifHandler`. The load side is already handled by the - `_absorption.type` restore added in P1.2 (the type is swapped - before descriptor loading, so `mu_r` has its descriptor when its - value is read). IUCr **report** export (`iucr_writer.py`) **is - implemented** (impl-review-1 finding 1): `_powder_extension_items` - emits `_easydiffraction_absorption.type` always and - `_easydiffraction_absorption.mu_r` for the cylindrical Hewat - class, mirroring the existing `peak`/`background` type extensions - and the `pref_orient` loop. (The earlier "deferred" note rested on - a truncated grep that missed `_write_pref_orient_loop`; - corrected.) _Commit:_ - `Confirm absorption category round-trips in experiment CIF` - - > (ADR promotion is **not** a numbered step — it is done in the - > `/draft-impl-1` Phase A design-history cleanup before P1.1; see the - > §ADR section.) - -- [x] **P1.6 — Document the sample-absorption parameters** Add - `docs/docs/user-guide/parameters/absorption.md` (template: - `parameters/pref_orient.md`): the `absorption.type` selector, - `cylinder-hewat`, `mu_r`, the Hewat range note and out-of-range - warning. **Then surface it through the parameter guide:** add - `absorption.type` and `absorption.mu_r` rows (with the reference - link to `parameters/absorption.md`) to - `docs/docs/user-guide/parameters.md` — the leaf page is **not** in - the global `docs/mkdocs.yml` nav (that directory is deliberately - excluded); it is discovered only via `parameters.md`. Mirror - exactly what #200 did for `pref_orient`. Touch `docs/mkdocs.yml` - only if that precedent did. _Commit:_ - `Document sample-absorption parameters` - -- [x] **P1.7 — Phase 1 review gate** (no code) Mark this checklist - complete and stop for Phase 1 review. _Commit:_ - `Reach Phase 1 review gate` - -## Verification (Phase 2) - -> Added after Phase 1 review approval. Tests mirror the source tree -> (`test-structure-check`). Use the zsh-safe log-capture pattern when -> saving output. - -1. **Add/extend tests** (see Phase-2 file list), including: - - helper: `none` → ones; Hewat at μR=0.7 matches FullProf to 4 - decimals; warning fires once for μR>1.5. - - category: factory tags, `show_supported()`, swap, Compatibility - gating (absent for single-crystal / total). - - both backends apply A(θ); single-crystal/total unaffected. - - CIF round-trip of `_absorption.*`. - - verification page `pd-neut-cwl_tch-fcj_lab6` **enables** - `cylinder-hewat`, `mu_r=0.7` (feature exercised; full agreement - assertion deferred — see the scoped-outcome note in the Phase-2 - file list, blocked by the separate cryspy FCJ limitation). -2. **Run the suite** (capture logs where useful): - - ```bash - pixi run fix - pixi run check > /tmp/easydiffraction-check.log 2>&1; check_exit_code=$?; tail -n 200 /tmp/easydiffraction-check.log; exit $check_exit_code - pixi run test-structure-check - pixi run unit-tests > /tmp/easydiffraction-unit.log 2>&1; unit_tests_exit_code=$?; tail -n 100 /tmp/easydiffraction-unit.log; exit $unit_tests_exit_code - pixi run integration-tests - pixi run script-tests - ``` - - Leave generated `docs/dev/benchmarking/*.csv` untracked. Do not edit - `docs/dev/package-structure/*.md` by hand (regenerated by - `pixi run fix`). - -## Status checklist - -- [ ] Phase A — Promote the ADR to accepted + clean design history (done - in `/draft-impl-1` setup, before P1.1; see §ADR) -- [x] P1.1 Add the `absorption` switchable-category package -- [x] P1.2 Wire `absorption` into the powder-Bragg experiment owner - (incl. `_absorption.type` restore on load) -- [x] P1.3 Add the shared Hewat A(θ) helper -- [x] P1.4 Apply A(θ) in both backends (incl. empty/no-data guard) -- [x] P1.5 Persist the absorption category in experiment CIF (verified - automatic; no source change) -- [x] P1.6 Document the sample-absorption parameters -- [x] P1.7 Phase 1 review gate -- [ ] Phase 2 verification complete - -## Suggested Pull Request - -**Title:** Correct for sample absorption in cylindrical powder -diffraction - -**Description:** Powder samples in a cylindrical (Debye–Scherrer) holder -absorb the beam by an amount that varies with scattering angle, slightly -distorting measured peak intensities. EasyDiffraction can now model -this: switch it on with `experiment.absorption.type = 'cylinder-hewat'` -and set the sample's `mu_r` (absorption coefficient × radius). The -correction is applied consistently for both the CrysPy and CrysFML -calculation engines and matches FullProf's cylindrical correction to -four decimal places, removing an intensity mismatch of several percent -for absorbing samples (for example the LaB₆ reference at μR = 0.7). -Values beyond the validated range are still calculated but now raise a -clear warning instead of failing silently. Time-of-flight and flat-plate -geometries are designed for but not yet enabled. diff --git a/docs/dev/plans/preferred-orientation-category.md b/docs/dev/plans/preferred-orientation-category.md deleted file mode 100644 index 351e14177..000000000 --- a/docs/dev/plans/preferred-orientation-category.md +++ /dev/null @@ -1,311 +0,0 @@ -# Implementation Plan: Preferred-Orientation Category (March–Dollase) - -This plan follows [`AGENTS.md`](../../../AGENTS.md). No deliberate -exceptions to those instructions are taken. Per §Commits and §Planning, -when an AI agent executes this plan, **every completed Phase 1 step is -staged with explicit paths and committed locally before the next step or -the Phase 1 review gate**; commits are atomic and single-purpose. - -## ADR - -Implements -[`preferred-orientation-category.md`](../adrs/accepted/preferred-orientation-category.md) -(promoted to **Accepted** in step P1.6). This plan **owns** that ADR: a -Phase 1 step moves it from `suggestions/` to `accepted/` (status flip + -index update) before the PR, per §Change Discipline. No other ADR is -created. Related accepted ADRs consulted: `iucr-cif-tag-alignment.md`, -`switchable-category-owned-selectors.md`, -`loop-category-key-identity.md`, `factory-contracts.md`. - -## Branch and PR - -- **Branch:** `preferred-orientation-category` (flat slug off - `develop`), created and checked out by `/draft-impl-1`'s setup. Do not - push unless asked. -- **PR target:** `develop` (not `master`). See the Suggested Pull - Request section at the end. - -## Decisions (settled in the ADR) - -- New **per-phase loop category `pref_orient`**, owned by the - experiment, mirroring `linked_phases`. Keyed by `phase_id`. -- Parameters per row: `march_r` (March coefficient, refinable, default - 1.0), `index_h`/`index_k`/`index_l` (fixed integer **descriptors**, - default 0/0/1), `march_random_fract` (random fraction, refinable, - default 0.0). Defaults are a mathematical no-op. -- **Scope: Bragg powder only.** Created **only in `BraggPdExperiment`**, - not the shared `PdExperimentBase`, so PDF/total-scattering and - single-crystal experiments never expose `preferred_orientation` - (`AttributeError` on access, not a silent no-op). Compatibility: - `sample_form={POWDER}, scattering_type={BRAGG}`. -- **CrysPy-only** backend support (`CalculatorSupport({CRYSPY})`). -- CIF: short `_pref_orient.*` round-trip tags + IUCr - `_pd_pref_orient_March_Dollase.*` export; `march_random_fract` - namespaced under `_easydiffraction_pref_orient.march_random_fract` and - omitted from the report when 0; `.hkl`/`.fract` excluded. -- **CrysPy convention (ADR Decision 6):** CrysPy 0.11.0's texture - function uses a reciprocal `g1 = 1/r` convention (handled by the - backend) and is not volume-normalised (absorbed by scale), so the - exposed `march_r` is the standard, portable March coefficient. The - verification notebook documents this convention and, after refining - `march_r`/`march_random_fract`/scale, **asserts agreement** with - FullProf within the closeness tolerances. - -## Open questions - -- None blocking. CrysPy's reciprocal/non-normalised convention is - documented (Decision 6) and handled by the backend mapping; a - convention note for upstream is staged in - `tmp/cryspy/preferred-orientation/`. This plan does not depend on its - resolution. - -## No new dependencies - -CrysPy is already a dependency; no `pyproject.toml`/`pixi.toml`/ -`pixi.lock` changes are required or authorised by this plan. - -## Concrete files likely to change - -**New (Phase 1):** - -- `src/easydiffraction/datablocks/experiment/categories/pref_orient/__init__.py` -- `src/easydiffraction/datablocks/experiment/categories/pref_orient/default.py` - (`PrefOrient(CategoryItem)`, `PrefOrients(CategoryCollection)`) -- `src/easydiffraction/datablocks/experiment/categories/pref_orient/factory.py` - (`PrefOrientFactory(FactoryBase)`) - -**Edited (Phase 1):** - -- `src/easydiffraction/datablocks/experiment/item/bragg_pd.py` (create - `_pref_orient`, expose `preferred_orientation` property) -- `src/easydiffraction/datablocks/experiment/item/base.py` (add - `getattr(self, '_pref_orient', None)` to the shared - `_attach_category_parents()` hook; no category creation here) -- `src/easydiffraction/analysis/calculators/cryspy.py` - (`_cif_phase_section` neighbour → texture loop emission; - `_update_experiment_in_cryspy_dict` pass-through; - `_invalidate_stale_cache` signature) -- `src/easydiffraction/io/cif/iucr_writer.py` - (`_write_pref_orient_loop`) -- `docs/dev/adrs/suggestions/preferred-orientation-category.md` → - `docs/dev/adrs/accepted/preferred-orientation-category.md` (promotion) - and `docs/dev/adrs/index.md` (status/link) - -**New/edited (Phase 2, tests + verification):** - -- `tests/unit/easydiffraction/datablocks/experiment/categories/test_pref_orient.py` - (parent-level roll-up, matching `test_linked_phases.py`) -- `tests/unit/easydiffraction/analysis/calculators/test_cryspy.py` - (texture emission + cache) and existing experiment/serialisation tests -- `docs/docs/verification/pd-neut-cwl_pv-march_lbco.py` (+ generated - `.ipynb`) and - `docs/docs/verification/fullprof/pd-neut-cwl_pv-march_lbco/` - (regenerated FullProf reference) -- `docs/dev/package-structure/full.md` / `short.md` (auto-regenerated by - `pixi run fix` — never edited by hand) - -## Implementation steps (Phase 1) - -> Phase 1 is code + ADR/plan docs only. Do **not** write or run tests, -> linters, or `pixi` commands here (those are Phase 2). Commit each step -> atomically with explicit paths and the listed message before moving -> on. - -- [x] **P1.1 — Create the `pref_orient` category package.** Add - `default.py` with `PrefOrient(CategoryItem)` - (`_category_code='pref_orient'`, - `_category_entry_name='phase_id'`) exposing: `phase_id` - (`StringDescriptor`, default `'Si'`, regex validator like - `LinkedPhase.id`, - `CifHandler(['_pref_orient.phase_id'], iucr_name='_pd_pref_orient_March_Dollase.phase_id')`); - `march_r` (`Parameter`, default 1.0, `RangeValidator(gt=0.0)`, - `iucr_name='_pd_pref_orient_March_Dollase.r'`); - `index_h`/`index_k`/`index_l` (`IntegerDescriptor`, defaults - 0/0/1, `iucr_name='_pd_pref_orient_March_Dollase.index_h/_k/_l'`); - `march_random_fract` (`Parameter`, default 0.0, - `RangeValidator(ge=0.0, le=1.0)`, - `iucr_name='_easydiffraction_pref_orient.march_random_fract'`). - Add `PrefOrients(CategoryCollection)` (`item_type=PrefOrient`, - `TypeInfo(tag='default')`, - `Compatibility(sample_form={POWDER}, scattering_type={BRAGG})`, - `CalculatorSupport({CRYSPY})`). Add `factory.py` - (`PrefOrientFactory(FactoryBase)`, default rule - `frozenset(): 'default'`) and `__init__.py` importing both classes - to trigger `@PrefOrientFactory.register`. Mirror the structure of - `categories/linked_phases/`. Files: the three new `pref_orient/*` - files. Commit: `Add pref_orient preferred-orientation category` - -- [x] **P1.2 — Wire `preferred_orientation` into Bragg powder - experiment.** Creation and public exposure stay **Bragg-only**; - only the parent-attachment hook (shared) gains an optional entry. - - In `item/bragg_pd.py` `BraggPdExperiment.__init__`, **before** the - existing final `self._attach_category_parents()` call, create - `self._pref_orient = PrefOrientFactory.create(PrefOrientFactory.default_tag())`, - and add a read-only `preferred_orientation` property returning - `self._pref_orient` (no setter, no `type` selector). - - In `item/base.py`, add `getattr(self, '_pref_orient', None)` to the - `ExperimentBase._attach_category_parents()` list. This mirrors how - `_instrument`/`_background`/`_refln` — also created only in - `BraggPdExperiment` — are already linked through the shared - `getattr(..., None)` hook: non-Bragg experiments never set - `_pref_orient`, so they yield `None` and are skipped, and - `preferred_orientation` remains absent (`AttributeError`) on them. - `PdExperimentBase` and category _creation_ are not touched. This - explicit `_parent` link is required so - `CategoryCollection.create()`/`add()` marks the experiment dirty - (`_need_categories_update`) on row changes. - - Confirm default-CIF serialisation is automatic (the owned - `CategoryCollection` is picked up by `_serializable_categories` - auto-discovery; no explicit registration needed). Files: - `item/bragg_pd.py`, `item/base.py`. Commit: - `Expose preferred_orientation on Bragg powder experiment` - -- [x] **P1.3 — Emit the CrysPy `_texture_*` loop.** In - `analysis/calculators/cryspy.py`, after the `_cif_phase_section` - call in `_convert_experiment_to_cryspy_cif`, add a - `_cif_pref_orient_section` that writes one `_texture_*` loop row - per `experiment.preferred_orientation` entry, mapping - `march_r→_texture_g_1` (inverted to `g_1 = 1/r`), - `fraction→_texture_g_2`, - `index_h/index_k/index_l→_texture_h_ax/_k_ax/_l_ax`, - `phase_id→_texture_label`. **Constant-wavelength powder only** - (guard on `sample_form == POWDER` **and** - `beam_mode == CONSTANT_WAVELENGTH`); TOF is Deferred Work and must - emit no texture, since its cached-dict pass-through is not wired. - Emit only the row matching the linked phase; a row with `r=1` is a - no-op. Files: `analysis/calculators/cryspy.py`. Commit: - `Emit texture loop in cryspy experiment CIF` - -- [x] **P1.4 — CrysPy cached-dictionary pass-through and invalidation.** - In `_update_experiment_in_cryspy_dict`, after the `offset_sysin` - block, patch `texture_g1`/`texture_g2` from - `march_r.value`/`march_random_fract.value` per row, guarded by - `if 'texture_g1' in cryspy_expt_dict`. Do **not** patch - `texture_axis` (`index_h`/`index_k`/`index_l` are fixed). In - `_invalidate_stale_cache`, add a `pref_orient` signature — a tuple - of `(phase_id, index_h, index_k, index_l)` per row, in order — - tracked per `combined_name` like `_cached_peak_types`, and **only - for constant-wavelength** experiments (matching the emission - scope); pop the cached dict when the signature changes (row - add/remove, `phase_id` or `index_h`/`index_k`/`index_l` edit). - Value-only `march_r`/`march_random_fract` edits must not - invalidate. Files: `analysis/calculators/cryspy.py`. Commit: - `Pass preferred-orientation through cryspy cache` - -- [x] **P1.5 — IUCr report-writer loop.** In `io/cif/iucr_writer.py`, - add `_write_pref_orient_loop(lines, experiment)` emitting the - official - `_pd_pref_orient_March_Dollase.{id,phase_id,index_h,index_k,index_l,r,r_su}` - columns (synthesise `.id` as a 1-based serial), called from the - powder experiment writer alongside the existing profile/refln - loops. Emit a separate - `_easydiffraction_pref_orient.march_random_fract` item only for - rows whose `fraction ≠ 0`; omit it entirely otherwise. Skip the - whole loop when the experiment has no `pref_orient` rows. Files: - `io/cif/iucr_writer.py`. Commit: - `Write preferred-orientation loop in IUCr report` - -- [x] **P1.6 — Promote the ADR to accepted.** - `git mv docs/dev/adrs/suggestions/preferred-orientation-category.md docs/dev/adrs/accepted/preferred-orientation-category.md`, - set its `**Status:**` to `Accepted`, fix its internal - `../accepted/` links to `./` as needed, and flip the - `docs/dev/adrs/index.md` row from `Suggestion`/`suggestions/...` - to `Accepted`/`accepted/...`. (The design-phase - `_review-*`/`_reply-*` siblings are removed by `/draft-impl-1`'s - Phase A cleanup, not here.) Files: the moved ADR, - `docs/dev/adrs/index.md`. Commit: - `Promote preferred-orientation-category ADR to accepted` - -- [x] **P1.7 — Phase 1 review gate (no code).** Mark P1.1–P1.6 `[x]`, - then stop for the Phase 1 review. Commit: - `Reach Phase 1 review gate` - -## Phase 2 — Verification - -> Stop after Phase 1 and wait for review approval before starting -> Phase 2. Phase 2 adds tests and the verification notebook, then runs -> the full check suite, committing fixes atomically. - -### Tests (add first) - -- Unit tests for the category package (the package has only - `default.py`/`factory.py`, so the single parent-level roll-up - `tests/unit/easydiffraction/datablocks/experiment/categories/test_pref_orient.py` - is the accepted layout per §Testing and - `tools/test_structure_check.py`, matching the existing - `test_linked_phases.py`): defaults are a no-op (`r=1`, `fraction=0`), - validators (`r>0`, `0≤fraction≤1`), `.create(...)` row construction, - CIF round-trip of `_pref_orient.*`. -- `preferred_orientation` is present on `BraggPdExperiment` and absent - (`AttributeError`) on `TotalPdExperiment`/single-crystal. -- CrysPy: texture loop emitted; cache pass-through updates `texture_g1`/ - `texture_g2`; signature change invalidates the cache. -- IUCr report writer emits the March–Dollase loop; `fraction=0` omits - the namespaced item. - -### Cross-engine verification notebook (on the LBCO base) - -1. Copy `docs/docs/verification/fullprof/pd-neut-cwl_pv_lbco/lbco.pcr`, - enable the March–Dollase model (`Nor=1`) along the phase - `Pr1 Pr2 Pr3` direction with non-zero `Pref1` **and** `Pref2` (the - reference uses `Pref1=1.2`, `Pref2=0.3`, axis `[0 0 1]`), re-run - FullProf locally (`~/Applications/fullprof`) to regenerate - `.prf`/`.bac`/`.sum` under - `docs/docs/verification/fullprof/pd-neut-cwl_pv-march_lbco/`. -2. Add `docs/docs/verification/pd-neut-cwl_pv-march_lbco.py` building - the same LBCO model, setting - `expt.preferred_orientation.create(phase_id='lbco', march_r=, march_random_fract=, index_h=, index_k=, index_l=)`, - and overlaying CrysPy vs FullProf. Compare CrysPy-only (no CrysFML - column, since PO is CrysPy-only). Add a markdown cell documenting - CrysPy's convention — it uses the reciprocal `g1 = 1/r` (the backend - inverts the standard `march_r`) and a non-volume-normalised factor - that the scale absorbs, so the as-calculated pattern shows an overall - offset. Then refine `march_r`, `march_random_fract`, and the scale: - the refined CrysPy result recovers `Pref1`/`Pref2` and agrees with - FullProf within the verification tolerances. -3. `pixi run notebook-prepare` to regenerate the `.ipynb`; commit source - `.py` + generated `.ipynb` + FullProf reference together. - -### Verification commands (zsh-safe log-capture) - -```sh -pixi run fix -pixi run check > /tmp/easydiffraction-check.log 2>&1; check_exit_code=$?; tail -n 200 /tmp/easydiffraction-check.log; exit $check_exit_code -pixi run unit-tests > /tmp/easydiffraction-unit.log 2>&1; unit_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-unit.log; exit $unit_tests_exit_code -pixi run integration-tests > /tmp/easydiffraction-integration.log 2>&1; integration_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-integration.log; exit $integration_tests_exit_code -pixi run script-tests > /tmp/easydiffraction-script.log 2>&1; script_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-script.log; exit $script_tests_exit_code -``` - -Notes: `pixi run fix` regenerates `docs/dev/package-structure/full.md` -and `short.md` automatically (commit them; never hand-edit). Leave -generated `docs/dev/benchmarking/*.csv` untracked. Do not raise lint -thresholds or add `# noqa`; refactor instead. - -## Status checklist - -- [x] P1.1 Category package -- [x] P1.2 Bragg experiment wiring -- [x] P1.3 CrysPy texture-loop emission -- [x] P1.4 CrysPy cache pass-through + invalidation -- [x] P1.5 IUCr report-writer loop -- [x] P1.6 Promote ADR to accepted -- [x] P1.7 Phase 1 review gate -- [x] Phase 2 tests -- [x] Phase 2 FullProf reference + verification notebook -- [x] Phase 2 full check suite green - -## Suggested Pull Request - -**Title:** Add preferred-orientation (March–Dollase) correction for -textured powder samples - -**Description:** Powder samples whose crystallites pack with a preferred -orientation (platy or needle-like grains) no longer have to be modelled -as ideal random powders. You can now add a March–Dollase -preferred-orientation correction to each phase in a constant-wavelength -Bragg powder experiment — set a March coefficient and a crystallographic -direction, refine the coefficient, and see the improved fit. The setting -is saved and restored in your project CIF and appears in the -IUCr-aligned report. Corrections run on the CrysPy engine; a -cross-checked verification example based on the LBCO dataset documents -how the CrysPy texture model currently compares with FullProf. diff --git a/docs/dev/plans/rename-asym-empir-to-beba.md b/docs/dev/plans/rename-asym-empir-to-beba.md new file mode 100644 index 000000000..3a6e0dbd6 --- /dev/null +++ b/docs/dev/plans/rename-asym-empir-to-beba.md @@ -0,0 +1,287 @@ +# Plan: Rename empirical asymmetry to Bérar–Baldinozzi (`asym_beba_*`) + +Follows [`AGENTS.md`](../../../AGENTS.md). No deliberate exceptions to +those instructions. + +## ADR + +No new ADR is required. This renames parameters and identifiers within +the **existing** switchable `peak` profile category (one peak-profile +type); it does not change the switchable-category mechanism, the factory +contract, or persistence design. Touches but does not alter the +decisions in +[`switchable-category-owned-selectors`](../adrs/accepted/switchable-category-owned-selectors.md) +and +[`edstar-project-persistence`](../adrs/accepted/edstar-project-persistence.md) +(the persistence handler inventory lists the renamed tags and must be +kept in sync). + +## Why + +The four `asym_empir_1…4` parameters are the **Bérar–Baldinozzi (1993)** +empirical asymmetry correction. The generic `empir` tag hides the model +and the meaningless `_1…_4` suffixes hide each coefficient's role. This +plan renames them to a model-named, coefficient-named scheme consistent +with the sibling `asym_fcj_*` set, and adds a short, neutral note to the +affected Verification pages about the cryspy/FullProf implementation +difference. Implements the **rename half** of issue 133 and surfaces the +finding documented in issue 166 (issue 133 stays open for the separate +"add the physical FCJ model" item). + +## Branch + PR + +- Planned branch: `rename-asym-empir-to-beba` (flat slug off `develop`). +- **Deliberate exception (AGENTS.md §Planning).** Phase 1 was + implemented on the **current `sequential-fix` branch** at the user's + explicit instruction ("draft-impl-1 … in the current branch") instead + of creating the planned `rename-asym-empir-to-beba` branch. The beba + Phase 1 commits therefore sit on top of pre-existing, unrelated + `sequential-fix` commits (e.g. + `d18d36b8 Use id instead of label in lab6 nosldl atom sites`), which + are **not** part of this rename and were not produced by this work. + When the PR is opened, scope the base / commit range to exclude those + unrelated commits, or land the rename via this branch as the user + directs. +- PR targets `develop`, not `master`. Do not push unless asked. + +## Naming scheme + +`asym_empir` → `asym_beba` (BÉrar–BAldinozzi), with the numeric suffixes +replaced by the paper's coefficient names. Confirmed mapping (cryspy +`asymmetry_parameters[0..3]` and the CIF maps in both calculators): + +| current | new | paper coeff | basis term | FullProf | cryspy slot | +| -------------- | -------------- | ----------- | ------------- | ----------- | ----------- | +| `asym_empir_1` | `asym_beba_a0` | `A₀` | `Fa / tan θ` | `Asy1`/`P1` | `[0]` | +| `asym_empir_2` | `asym_beba_b0` | `B₀` | `Fb / tan θ` | `Asy2`/`P2` | `[1]` | +| `asym_empir_3` | `asym_beba_a1` | `A₁` | `Fa / tan 2θ` | `Asy3`/`P3` | `[2]` | +| `asym_empir_4` | `asym_beba_b1` | `B₁` | `Fb / tan 2θ` | `Asy4`/`P4` | `[3]` | + +Companion identifiers (parallel to the `Fcj…` set): + +| kind | current | new | +| ---------------- | -------------------------------------- | ----------------------------------------------- | +| mixin | `EmpiricalAsymmetryMixin` | `BerarBaldinozziAsymmetryMixin` | +| peak class | `CwlPseudoVoigtEmpiricalAsymmetry` | `CwlPseudoVoigtBerarBaldinozziAsymmetry` | +| enum member | `CWL_PSEUDO_VOIGT_EMPIRICAL_ASYMMETRY` | `CWL_PSEUDO_VOIGT_BERAR_BALDINOZZI_ASYMMETRY` | +| enum value | `cwl-pseudo-voigt-empirical-asymmetry` | `cwl-pseudo-voigt-berar-baldinozzi-asymmetry` | +| user type string | `pseudo-voigt + empirical asymmetry` | `pseudo-voigt + berar-baldinozzi asymmetry` | +| edi tag | `_peak.asym_empir_N` | `_peak.asym_beba_{a0,b0,a1,b1}` | +| CIF tag | `_easydiffraction_peak.asym_empir_N` | `_easydiffraction_peak.asym_beba_{a0,b0,a1,b1}` | + +Each `Parameter` gains a `DisplayHandler` (matching the `broad_*` +style): display names `A₀, B₀, A₁, B₁`, LaTeX +`$A_0$, $B_0$, $A_1$, $B_1$`, and a description that states the model +and term, e.g. _"Bérar–Baldinozzi asymmetry coefficient B₀ (Fb/tan θ +term)"_. + +## Neutral mismatch note (verbatim text to add to Verification pages) + +Phrased to **not** assign correctness to either program: + +> **Note — cryspy vs FullProf.** cryspy and FullProf implement the +> Bérar–Baldinozzi empirical asymmetry with different conventions. As a +> result the four `asym_beba_*` parameters do **not** transfer +> one-to-one between cryspy and FullProf — the same numbers give +> different profiles. The refinement below frees the asymmetry so it can +> absorb this convention difference; the structural results are +> unaffected. See development issue 166 for the detailed comparison. + +## Decisions + +- Use `beba` (not `bb` or full `berar_baldinozzi`): matches the short + model-tag style of `fcj`, while the coefficient suffixes (`a0`, `b0`, + `a1`, `b1`) carry the physical meaning; full "Bérar–Baldinozzi" lives + in every `description`/docstring for discoverability. +- Beta software, **no legacy shims** (AGENTS.md): old CIF/edi tags and + the old type string are removed, not aliased. Saved projects using the + old tags will not round-trip; this is acceptable for beta. +- The Verification note assigns no correctness verdict (per request); + the detailed who-matches-the-paper analysis stays in issue 166 only. +- Rename the dedicated empirical page file + `pd-neut-cwl_pv-asym_empir_pbso4` → `pd-neut-cwl_pv-beba_pbso4` (keeps + the page slug consistent with the new parameter tag). + +## Open questions + +1. Page-file rename — confirm `pd-neut-cwl_pv-beba_pbso4` as the new + slug (vs keeping the old filename). Plan assumes the rename. +2. Display glyphs: use Unicode subscripts (`A₀`) in `display_name`, or + ASCII (`A0`)? Plan assumes Unicode to match the `deg²` precedent; + fall back to ASCII if any renderer/test objects. +3. Should issue 133 be edited to mark the rename done (leaving only the + FCJ-model item)? Plan does this in P1.8; revert if you'd rather keep + 133 untouched until the FCJ work lands. + +## Concrete files likely to change + +Source: + +- `src/easydiffraction/datablocks/experiment/categories/peak/cwl_mixins.py` +- `src/easydiffraction/datablocks/experiment/categories/peak/cwl.py` +- `src/easydiffraction/datablocks/experiment/categories/peak/__init__.py` +- `src/easydiffraction/datablocks/experiment/categories/peak/factory.py` +- `src/easydiffraction/datablocks/experiment/item/enums.py` +- `src/easydiffraction/analysis/calculators/cryspy.py` +- `src/easydiffraction/analysis/calculators/crysfml.py` + +Verification / docs / tutorials: + +- `docs/docs/verification/pd-neut-cwl_pv-asym_empir_pbso4.py` → renamed + `…/pd-neut-cwl_pv-beba_pbso4.py` (+ regenerated `.ipynb`) +- `docs/docs/verification/pd-neut-cwl_pv-beta_y2o3.py` (+ `.ipynb`) +- `docs/docs/verification/index.md`, + `docs/docs/verification/ci_skip.txt` +- `docs/mkdocs.yml` +- `docs/docs/tutorials/refine-cosio-d20.py`, + `docs/docs/tutorials/refine-hs-hrpt.py` (+ regenerated `.ipynb`) +- `docs/docs/user-guide/parameters/experiment/peak.md` +- `docs/dev/adrs/accepted/edstar-project-persistence.md`, + `docs/dev/adrs/accepted/edstar-project-persistence/handler-inventory.json`, + `docs/dev/adrs/accepted/python-cif-category-correspondence.md` +- `docs/dev/issues/open/high_rename-asym-empir-and-add-the-physical-fcj-asymmetry-model.md` + (mark rename done) +- `docs/dev/issues/open/medium_cryspy-fullprof-berar-baldinozzi-empirical-asymmetry-convention-mismatch.md` + (issue 166 — rewrite current-name references to the new tags/slug; see + P1.8) +- `docs/dev/package-structure/full.md` (regenerated by `pixi run fix` in + Phase 2 — do not hand-edit) + +Tests (existing references only — update, do not add new tests in P1): + +- `tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_cwl.py` +- `tests/.../peak/test_cwl_mixins.py`, `…/peak/test_factory.py` +- `tests/.../experiment/item/test_base.py`, `test_base_coverage.py`, + `test_factory.py` +- `tests/unit/easydiffraction/io/cif/test_parse.py` + +Use +`git grep -n "asym_empir\|empirical asymmetry\|EmpiricalAsymmetry\|empirical-asymmetry"` +to catch every occurrence before each commit. + +## Implementation steps (Phase 1) + +Each `- [ ]` is one atomic commit. Stage only the listed paths. +AGENTS.md applies: commit each completed step locally before starting +the next. + +- [x] **P1.1 — Rename model parameters and mixin.** In `cwl_mixins.py` + rename `EmpiricalAsymmetryMixin` → + `BerarBaldinozziAsymmetryMixin`; rename the four `_asym_empir_*` + parameters, properties, and setters to `asym_beba_{a0,b0,a1,b1}`; + update `name=`, `description=`, `DisplayHandler` (add `A₀…B₁`), + and `edi_names`/`cif_names` (`_peak.asym_beba_*`). Commit: + `Rename empirical asymmetry params to beba in peak mixin` + +- [x] **P1.2 — Rename peak class, enum, factory, package init.** Update + `cwl.py` (`CwlPseudoVoigtBerarBaldinozziAsymmetry`, mixin import, + docstrings), `enums.py` (member, value + `cwl-pseudo-voigt-berar-baldinozzi-asymmetry`, `description()` + text), `factory.py` (type string + `pseudo-voigt + berar-baldinozzi asymmetry`), `peak/__init__.py` + (import the renamed class). Commit: + `Rename pseudo-Voigt empirical-asymmetry peak type to beba` + +- [x] **P1.3 — Update calculators.** In `cryspy.py` update the four + `experiment.peak.asym_empir_* → asym_beba_*` reads and the CIF map + (`asym_beba_a0 → _pd_instr_reflex_asymmetry_p1`, etc., preserving + the `p1…p4` order). Same CIF map in `crysfml.py`. Commit: + `Map beba asymmetry params in cryspy and crysfml calculators` + +- [x] **P1.4 — Update existing test references.** Mechanically rename + `asym_empir_*`, the mixin/class/enum names, and the type string + across the test files listed above. No new tests (those belong to + Phase 2). Commit: `Update tests for beba asymmetry rename` + +- [x] **P1.5 — Rename and update the PbSO₄ empirical Verification + page.** `git mv` `pd-neut-cwl_pv-asym_empir_pbso4.py` → + `pd-neut-cwl_pv-beba_pbso4.py`; update parameter names; add the + neutral mismatch note (markdown cell); update its FullProf + reference folder reference if the slug is embedded. Update + `verification/index.md`, `ci_skip.txt`, and `mkdocs.yml` to the + new slug. Run `pixi run notebook-prepare`; stage the regenerated + `.ipynb`. Commit: + `Rename pbso4 empirical page to beba and add mismatch note` + +- [x] **P1.6 — Update the Y₂O₃ Verification page.** In + `pd-neut-cwl_pv-beta_y2o3.py` rename + `asym_empir_1/2 → asym_beba_a0/b0` (and the `FULLPROF_ASY_*` + constants/comments as needed); replace the existing "refines to + opposite sign (cryspy #50)" wording with the neutral mismatch + note. Run `pixi run notebook-prepare`; stage the regenerated + `.ipynb`. Commit: + `Use beba names and neutral mismatch note on y2o3 page` + +- [x] **P1.7 — Update tutorials.** Rename the parameter references in + `refine-cosio-d20.py` and `refine-hs-hrpt.py`. Run + `pixi run notebook-prepare`; stage the regenerated `.ipynb` + siblings. Commit: `Use beba asymmetry names in tutorials` + +- [x] **P1.8 — Update remaining docs, issue 133, and issue 166.** Update + `user-guide/parameters/experiment/peak.md`, the persistence ADR + + `handler-inventory.json`, and + `python-cif-category-correspondence.md` to the new tags. In issue + 133, mark the rename item done (leave the "add physical FCJ model" + item open). In **issue 166** rewrite every current-name reference + to the new terminology — `asym_empir_1…4` → + `asym_beba_a0/b0/a1/b1`, the page slug + `pd-neut-cwl_pv-asym_empir_pbso4` → `pd-neut-cwl_pv-beba_pbso4`, + and the type string / class / enum names — so the open mismatch + issue does not point readers at removed names; preserve any + deliberate historical "formerly `asym_empir_*`" context that stays + useful (e.g. the FullProf-side `P1…P4`/`Asy1…4` labels and any + "previously named" aside). Add a cross-reference to issue 166 from + the affected pages where natural. Commit: + `Update docs, issue 133, and issue 166 for beba asymmetry rename` + +- [x] **P1.9 — Phase 1 review gate.** No-code step; mark `[x]` and + commit the checklist update alone. Commit: + `Reach Phase 1 review gate` + +## Phase 2 — Verification + +Run from the repo root; capture logs with the zsh-safe pattern when +output is needed for analysis. + +- `pixi run fix` — regenerates + `docs/dev/package-structure/{full,short}.md`; commit those with the + auto-fixes. + `pixi run fix > /tmp/edi-fix.log 2>&1; fix_exit_code=$?; tail -n 80 /tmp/edi-fix.log; exit $fix_exit_code` +- `pixi run check > /tmp/edi-check.log 2>&1; check_exit_code=$?; tail -n 200 /tmp/edi-check.log; exit $check_exit_code` +- `pixi run unit-tests > /tmp/edi-unit.log 2>&1; unit_tests_exit_code=$?; tail -n 120 /tmp/edi-unit.log; exit $unit_tests_exit_code` +- `pixi run integration-tests > /tmp/edi-int.log 2>&1; integration_tests_exit_code=$?; tail -n 120 /tmp/edi-int.log; exit $integration_tests_exit_code` +- `pixi run script-tests > /tmp/edi-script.log 2>&1; script_tests_exit_code=$?; tail -n 120 /tmp/edi-script.log; exit $script_tests_exit_code` +- Confirm `pixi run test-structure-check` still passes (any renamed test + file must keep mirroring its renamed source). + +Add/adjust **new** unit tests in Phase 2 only: a parse/round-trip test +for the new `_peak.asym_beba_*` CIF tags, and a peak-factory test for +the new type string and class. + +## Status checklist + +- [x] P1.1 model params + mixin +- [x] P1.2 peak class + enum + factory + init +- [x] P1.3 calculators +- [x] P1.4 existing test references +- [x] P1.5 PbSO₄ page rename + note +- [x] P1.6 Y₂O₃ page note +- [x] P1.7 tutorials +- [x] P1.8 docs + issues 133 & 166 +- [x] P1.9 Phase 1 review gate +- [ ] Phase 2 verification green + +## Suggested Pull Request + +**Title:** Clearer names for the Bérar–Baldinozzi peak-asymmetry +settings + +**Description:** The four "empirical asymmetry" settings on a +constant-wavelength pseudo-Voigt peak are now named after the +Bérar–Baldinozzi model they implement — `asym_beba_a0`, `asym_beba_b0`, +`asym_beba_a1`, `asym_beba_b1` — so each value's role is clear instead +of an anonymous `1…4`. The relevant verification pages gain a short note +explaining that cryspy and FullProf apply this asymmetry with different +conventions, so the same parameter values are not directly +interchangeable between the two programs. No change to fitted structures +or to any other peak setting. diff --git a/docs/dev/plans/validate-joint-fit-weights.md b/docs/dev/plans/validate-joint-fit-weights.md deleted file mode 100644 index fc18c32b8..000000000 --- a/docs/dev/plans/validate-joint-fit-weights.md +++ /dev/null @@ -1,277 +0,0 @@ -# Plan: Validate Joint-Fit Weights Before Residual Normalisation - -Governed by [`AGENTS.md`](../../../AGENTS.md). No deliberate exceptions -to those instructions are taken in this plan. - -Closes issue **15 — Validate Joint-Fit Weights Before Residual -Normalisation** -([`docs/dev/issues/open/highest_validate-joint-fit-weights-before-residual-normalisation.md`](../issues/open/highest_validate-joint-fit-weights-before-residual-normalisation.md)). - -## ADR - -No new ADR is required. This is a localised correctness fix that adds -boundary-input validation (per §Project Context: "external-library -boundaries (calculator backends, samplers)" and user-producible state) -without changing any documented architecture or public contract. It -touches the fitting-execution path covered by the accepted -[`fit-mode-categories`](../adrs/accepted/fit-mode-categories.md) ADR and -is verified under the -[`test-suite-and-validation`](../adrs/accepted/test-suite-and-validation.md) -strategy, but introduces no new category, factory, or persisted state. - -## Problem - -Joint-fit weights are read from `analysis.joint_fit[].weight.value` -and passed as a NumPy array into `Fitter.fit(...)`, which forwards them -to `Fitter._residual_function` -(`src/easydiffraction/analysis/fitting.py`). There the array is -normalised and applied per experiment: - -```python -norm_weights *= num_expts / np.sum(norm_weights) # line ~440 -... -diff *= np.sqrt(weight) # line ~457 -``` - -The `weight` descriptor in -`src/easydiffraction/analysis/categories/joint_fit/default.py` uses a -bare `RangeValidator()` (no bounds), so a user can set negative, zero, -or non-finite weights via the public API. Two failure modes reach the -minimiser as corrupted residuals: - -- **All-zero (or empty-sum) set** → `np.sum(norm_weights) == 0` → - division by zero → `inf`/`nan` weights. -- **Negative weight** → `np.sqrt(weight)` of a negative number → `nan` - residuals. -- **Non-finite weight** (`nan`/`inf`) → propagates straight through. - -These slip silently into the optimiser instead of failing with a clear, -user-facing error. - -## Decisions - -1. **Validate once, at the `Fitter.fit()` chokepoint** — not inside - `_residual_function` (which the minimiser calls every iteration; the - weights are static across a fit) and not only at the descriptor - setter (a per-element setter cannot catch the _aggregate_ all-zero - case). `Fitter.fit()` is the single point every joint fit passes - through (both `Analysis._fit_joint` and any direct `Fitter.fit` - caller), so one up-front check covers all paths and runs once. - -2. **Mirror the existing `_require_measured_data` idiom.** Add a static - `Fitter._require_valid_weights(weights, experiments)` next to - `_require_measured_data` and call it from `fit()` immediately after - the measured-data guard. It raises a plain `ValueError` with a clear, - user-facing message — consistent with `_require_measured_data` and - with the existing `raise ValueError(msg)` in `Analysis._fit_joint`. - -3. **Validation rule = correct shape + non-negative + finite elements + - finite positive total** (the issue's "at minimum" option, hardened), - applied only when `weights is not None`: - - reject any non-finite value (`nan`/`inf`) — `nan` would otherwise - pass a `>= 0` test silently; - - reject any value `< 0`; - - compute the total **once** as `total = arr.sum(dtype=np.float64)` - and reject `not np.isfinite(total) or total <= 0`. The - `np.isfinite(total)` guard is essential and not implied by - per-element finiteness: a finite, non-negative public input such as - `[1e308, 1e308]` overflows to `inf` on summation, and `inf <= 0` is - false, so a `<= 0`-only check would let it through and corrupt the - `num_expts / np.sum(...)` normalisation. This catches both the - all-zero set (per-element checks miss it) and the overflow case. - When `weights is None` (single/sequential fits, or joint with equal - weights) the array is implicitly all-ones — always valid — and the - check is skipped. - -4. **Do not adopt strictly-positive-per-element here.** Requiring every - weight `> 0` would preempt issue **122 — Define `joint_fit.weight` - Bounds**, which owns the question of whether `0` means "exclude this - experiment" and whether an upper bound exists. Non-negative + total - `> 0` leaves a single `0` weight valid (that experiment contributes - zero residuals — effective exclusion), keeping issue 122's design - space open. Note this in the issue closure. - -5. **Leave `RangeValidator()` in `joint_fit/default.py` unchanged.** - Descriptor-level bounds are issue 122's territory; changing them here - would widen scope and overlap that issue. The fit-time guard fully - satisfies issue 15's "before residual normalisation" framing. - -6. **Validate the documented shape/length contract at the same gate.** - `Fitter.fit()` documents `weights` as a 1-D array whose length must - match `experiments`, and Decision 1 makes this helper the single - up-front validation chokepoint. Relying on the downstream - `zip(..., strict=True)` in `_residual_function` would surface a late, - generic NumPy/Python error only after the minimiser has entered the - objective callback, and only for some malformed shapes — not the - clear, user-facing joint-fit error this issue targets. So - `_require_valid_weights` also rejects `arr.ndim != 1` (scalar or 2-D - input) and `arr.size != len(experiments)` (short/long arrays) with - `ValueError` messages naming the joint-fit weights. This also keeps - the `experiments` parameter meaningfully used, avoiding a Ruff `ARG` - unused-argument lint breach. - -## Open questions - -None outstanding. The strictly-positive-vs-non-negative choice is -resolved in Decision 4 (defer per-element bounds to issue 122). - -## Concrete files likely to change - -Phase 1 (implementation): - -- `src/easydiffraction/analysis/fitting.py` — add - `Fitter._require_valid_weights`, call it in `Fitter.fit()`, extend the - `fit()` `Raises` docstring. -- `docs/dev/issues/open/highest_validate-joint-fit-weights-before-residual-normalisation.md` - → - `docs/dev/issues/closed/validate-joint-fit-weights-before-residual-normalisation.md` - (`git mv`, drop `highest_` prefix, rewrite body to describe the fix). -- `docs/dev/issues/index.md` — move the issue row from the open table to - the closed table. - -Phase 2 (verification — tests): - -- `tests/unit/easydiffraction/analysis/test_fitting.py` — unit tests for - `Fitter._require_valid_weights` (pure static helper; no engine). -- `tests/integration/fitting/test_powder-diffraction_joint-fit.py` — one - end-to-end test asserting the clear `ValueError` for an all-zero - weight set via the public joint-fit path. - -## Branch and PR notes - -- Branch: `validate-joint-fit-weights` (flat slug off `develop`), - created and checked out by `/draft-impl-1`'s setup. -- PR targets `develop`. Do not push unless asked. - -## Implementation steps (Phase 1) - -Per §Planning and §Commits: when an AI agent follows this plan, every -completed Phase 1 step must be staged with **explicit paths** and -committed locally (atomic, single-purpose) before moving to the next -step or the review gate. Mark each `- [ ]` as `- [x]` in the same commit -that completes it. - -- [x] **P1.1 — Add weight validation to `Fitter.fit()`.** In - `src/easydiffraction/analysis/fitting.py`: - - Add a - `@staticmethod _require_valid_weights(weights: np.ndarray | None, experiments: list[ExperimentBase]) -> None` - immediately after `_require_measured_data`, with a numpy-style - docstring (Parameters / Raises). When `weights is None`, return - immediately. Otherwise coerce to - `arr = np.asarray(weights, dtype=np.float64)` and raise `ValueError` - with a clear, user-facing message (mirroring the tone of - `_require_measured_data`, naming the joint-fit weights and the - offending condition) if any of: - - `arr.ndim != 1` — weights must be a 1-D array (rejects - scalar/2-D); - - `arr.size != len(experiments)` — one weight per experiment - (rejects short/long arrays); - - `not np.isfinite(arr).all()` — any element is `nan`/`inf`; - - `(arr < 0).any()` — any element is negative; - - computing the total **once** as - `total = arr.sum(dtype=np.float64)` and then - `not np.isfinite(total) or total <= 0` — the total must be finite - and strictly positive (rejects the all-zero set and the - finite-elements-overflow-to-`inf` case from review F1). - - Call `self._require_valid_weights(weights, experiments)` in `fit()` - right after the `self._require_measured_data(experiments)` line. - - Extend the `fit()` `Raises` section to document that a `ValueError` - is raised for invalid joint-fit weights. - - Stage: - `git add src/easydiffraction/analysis/fitting.py docs/dev/plans/validate-joint-fit-weights.md` - - Commit: `Validate joint-fit weights before residual normalisation` - -- [x] **P1.2 — Close issue 15.** - - `git mv docs/dev/issues/open/highest_validate-joint-fit-weights-before-residual-normalisation.md docs/dev/issues/closed/validate-joint-fit-weights-before-residual-normalisation.md` - - Rewrite the closed file body to describe what closed it (fit-time - `_require_valid_weights` guard; non-negative + finite + positive - total; per-element bounds deferred to issue 122). Keep the `# 15. …` - H1. - - Update `docs/dev/issues/index.md`: remove the issue 15 row from the - open table and add it to the closed table, linking the new - `closed/...` path. - - Stage: - `git add docs/dev/issues/index.md docs/dev/issues/closed/validate-joint-fit-weights-before-residual-normalisation.md docs/dev/plans/validate-joint-fit-weights.md` - (the `git mv` already stages the deletion of the open file). - - Commit: `Close joint-fit weight validation issue` - -- [x] **P1.3 — Phase 1 review gate.** No-code step. Mark this item - `[x]`, commit the checklist update alone with message - `Reach Phase 1 review gate`, then stop for Phase 1 review. - -## Verification (Phase 2) - -Added/updated tests first, then run the full verification suite. Use the -zsh-safe log-capture pattern from §Workflow whenever output must be -saved for analysis. - -Tests to add: - -- `tests/unit/easydiffraction/analysis/test_fitting.py` — call - `Fitter._require_valid_weights` directly (it is a pure static helper, - no engine, satisfying §Testing's "no real calculation engines"): - - accepts `None`; - - accepts a valid positive array (e.g. `[0.3, 0.7]`); - - accepts an array containing a single `0` with positive total (e.g. - `[0.0, 1.0]`) — confirms 0-as-exclusion stays valid; - - raises `ValueError` for a negative element (`[-1.0, 1.0]`); - - raises `ValueError` for an all-zero set (`[0.0, 0.0]`); - - raises `ValueError` for `nan` and for `inf`; - - raises `ValueError` for a finite array whose sum overflows to `inf` - (e.g. `[1e308, 1e308]`) — review F1; - - raises `ValueError` for a scalar and for a 2-D array — review F2; - - raises `ValueError` for a length mismatch vs `experiments` (both - short and long) — review F2. Pass a lightweight stub `experiments` - sequence of the expected length (the helper only reads - `len(experiments)`), keeping the test engine-free. -- `tests/integration/fitting/test_powder-diffraction_joint-fit.py` — add - a test that builds a joint fit with all-zero weights through the - public API and asserts a `ValueError` (reusing the file's existing - fixtures). - -Run, in order: - -```bash -pixi run fix -pixi run check > /tmp/easydiffraction-check.log 2>&1; check_exit_code=$?; tail -n 200 /tmp/easydiffraction-check.log; exit $check_exit_code -pixi run unit-tests > /tmp/easydiffraction-unit.log 2>&1; unit_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-unit.log; exit $unit_tests_exit_code -pixi run integration-tests > /tmp/easydiffraction-integration.log 2>&1; integration_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-integration.log; exit $integration_tests_exit_code -pixi run script-tests > /tmp/easydiffraction-script.log 2>&1; script_tests_exit_code=$?; tail -n 200 /tmp/easydiffraction-script.log; exit $script_tests_exit_code -``` - -Also confirm the test layout is accepted: - -```bash -pixi run test-structure-check -``` - -Notes: - -- `pixi run fix` regenerates `docs/dev/package-structure/full.md` and - `short.md` — include them only if that command changes them; never - edit by hand. -- Leave generated benchmark CSVs under `docs/dev/benchmarking/` and any - tutorial project artifacts untracked unless explicitly asked to update - them. -- For sandbox-only multiprocessing/process-pool failures, rerun with the - approved escalated permission path before treating as a code defect. - -## Status checklist - -- [x] P1.1 — Add weight validation to `Fitter.fit()` -- [x] P1.2 — Close issue 15 -- [x] P1.3 — Phase 1 review gate -- [x] Phase 2 — tests added and full verification suite green - -## Suggested Pull Request - -**Title:** Clear error for invalid joint-fit weights - -**Description:** When fitting several experiments together, each -experiment is given a weight. Previously, entering an invalid set of -weights — for example a negative value, or all weights set to zero — -could silently corrupt the fit, producing meaningless (`nan`) results -without any warning. EasyDiffraction now checks the weights before -fitting starts and stops with a clear, explanatory message if the -weights are negative, not-a-number, or all zero, so you can correct them -straight away instead of chasing a confusing failed fit. diff --git a/docs/docs/tutorials/index.json b/docs/docs/tutorials/index.json index e5e51f6cb..15e262e99 100644 --- a/docs/docs/tutorials/index.json +++ b/docs/docs/tutorials/index.json @@ -119,6 +119,14 @@ "description": "Resume an interrupted sequential Rietveld refinement of Co2SiO4 by reloading a saved project; the remaining temperature-scan datasets are processed and appended to analysis/results.csv", "level": "advanced" }, + "refine-yap-tscan": { + "order": 26, + "url": "https://easyscience.github.io/diffraction-lib/{version}/tutorials/refine-yap-tscan/refine-yap-tscan.ipynb", + "original_name": "", + "title": "Structure Refinement: YAlO3 + Al2O3 (Temperature scan)", + "description": "Sequential two-phase Rietveld refinement of YAlO3 with an Al2O3 corundum impurity using constant wavelength neutron powder diffraction data across a temperature scan", + "level": "advanced" + }, "refine-hs-hrpt": { "order": 7, "url": "https://easyscience.github.io/diffraction-lib/{version}/tutorials/refine-hs-hrpt/refine-hs-hrpt.ipynb", diff --git a/docs/docs/tutorials/refine-cosio-d20.ipynb b/docs/docs/tutorials/refine-cosio-d20.ipynb index 44f40405a..4e1ed6d4f 100644 --- a/docs/docs/tutorials/refine-cosio-d20.ipynb +++ b/docs/docs/tutorials/refine-cosio-d20.ipynb @@ -267,7 +267,7 @@ "metadata": {}, "outputs": [], "source": [ - "expt.peak.type = 'pseudo-voigt + empirical asymmetry'" + "expt.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry'" ] }, { @@ -508,7 +508,7 @@ "expt.peak.broad_gauss_w.free = True\n", "expt.peak.broad_lorentz_y.free = True\n", "\n", - "expt.peak.asym_empir_2.free = True\n", + "expt.peak.asym_beba_b0.free = True\n", "\n", "for point in expt.background:\n", " point.intensity.free = True" diff --git a/docs/docs/tutorials/refine-cosio-d20.py b/docs/docs/tutorials/refine-cosio-d20.py index 4da90a8b3..53c2eeb2c 100644 --- a/docs/docs/tutorials/refine-cosio-d20.py +++ b/docs/docs/tutorials/refine-cosio-d20.py @@ -127,7 +127,7 @@ expt.peak.show_supported() # %% -expt.peak.type = 'pseudo-voigt + empirical asymmetry' +expt.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry' # %% expt.peak.broad_gauss_u = 0.3 @@ -237,7 +237,7 @@ expt.peak.broad_gauss_w.free = True expt.peak.broad_lorentz_y.free = True -expt.peak.asym_empir_2.free = True +expt.peak.asym_beba_b0.free = True for point in expt.background: point.intensity.free = True diff --git a/docs/docs/tutorials/refine-hs-hrpt.ipynb b/docs/docs/tutorials/refine-hs-hrpt.ipynb index 8d0f7fb58..37ac6b03a 100644 --- a/docs/docs/tutorials/refine-hs-hrpt.ipynb +++ b/docs/docs/tutorials/refine-hs-hrpt.ipynb @@ -248,7 +248,7 @@ "outputs": [], "source": [ "expt.peak.show_supported()\n", - "expt.peak.type = 'pseudo-voigt + empirical asymmetry'\n", + "expt.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry'\n", "expt.peak.broad_gauss_u = 0.1\n", "expt.peak.broad_gauss_v = -0.2\n", "expt.peak.broad_gauss_w = 0.2\n", @@ -722,10 +722,10 @@ "structure.atom_sites['Cl'].adp_iso.free = True\n", "structure.atom_sites['H'].adp_iso.free = True\n", "\n", - "expt.peak.asym_empir_1.free = True\n", - "expt.peak.asym_empir_2.free = True\n", - "expt.peak.asym_empir_3.free = True\n", - "expt.peak.asym_empir_4.free = True" + "expt.peak.asym_beba_a0.free = True\n", + "expt.peak.asym_beba_b0.free = True\n", + "expt.peak.asym_beba_a1.free = True\n", + "expt.peak.asym_beba_b1.free = True" ] }, { diff --git a/docs/docs/tutorials/refine-hs-hrpt.py b/docs/docs/tutorials/refine-hs-hrpt.py index a735e6d69..e86e24604 100644 --- a/docs/docs/tutorials/refine-hs-hrpt.py +++ b/docs/docs/tutorials/refine-hs-hrpt.py @@ -114,7 +114,7 @@ # %% expt.peak.show_supported() -expt.peak.type = 'pseudo-voigt + empirical asymmetry' +expt.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry' expt.peak.broad_gauss_u = 0.1 expt.peak.broad_gauss_v = -0.2 expt.peak.broad_gauss_w = 0.2 @@ -299,10 +299,10 @@ structure.atom_sites['Cl'].adp_iso.free = True structure.atom_sites['H'].adp_iso.free = True -expt.peak.asym_empir_1.free = True -expt.peak.asym_empir_2.free = True -expt.peak.asym_empir_3.free = True -expt.peak.asym_empir_4.free = True +expt.peak.asym_beba_a0.free = True +expt.peak.asym_beba_b0.free = True +expt.peak.asym_beba_a1.free = True +expt.peak.asym_beba_b1.free = True # %% [markdown] # Show free parameters after selection. diff --git a/docs/docs/user-guide/parameters/experiment/peak.md b/docs/docs/user-guide/parameters/experiment/peak.md index 527343aa8..0d158b852 100644 --- a/docs/docs/user-guide/parameters/experiment/peak.md +++ b/docs/docs/user-guide/parameters/experiment/peak.md @@ -232,45 +232,45 @@ Particle diameter for spherical envelope damping correction. [pd-neut-cwl][3]{:.label-experiment} [pd-neut-tof][3]{:.label-experiment} [pd-xray][3]{:.label-experiment} -### :material-tag: asym_empir_1 { #peak-asym-empir-1 } +### :material-tag: asym_beba_a0 { #peak-asym-beba-a0 } | Access | Source | | ----------------------------------- | ------------------------- | -| peak.asym_empir_1 | [code][0]{:.label-cif} | -| \_peak.asym_empir_1 | [Edi][0]{:.label-cif} | -| \_easydiffraction_peak.asym_empir_1 | [coreCIF][0]{:.label-cif} | +| peak.asym_beba_a0 | [code][0]{:.label-cif} | +| \_peak.asym_beba_a0 | [Edi][0]{:.label-cif} | +| \_easydiffraction_peak.asym_beba_a0 | [coreCIF][0]{:.label-cif} | -Empirical asymmetry coefficient p1. +Berar-Baldinozzi asymmetry coefficient A0 (Fa/tan theta). -### :material-tag: asym_empir_2 { #peak-asym-empir-2 } +### :material-tag: asym_beba_b0 { #peak-asym-beba-b0 } | Access | Source | | ----------------------------------- | ------------------------- | -| peak.asym_empir_2 | [code][0]{:.label-cif} | -| \_peak.asym_empir_2 | [Edi][0]{:.label-cif} | -| \_easydiffraction_peak.asym_empir_2 | [coreCIF][0]{:.label-cif} | +| peak.asym_beba_b0 | [code][0]{:.label-cif} | +| \_peak.asym_beba_b0 | [Edi][0]{:.label-cif} | +| \_easydiffraction_peak.asym_beba_b0 | [coreCIF][0]{:.label-cif} | -Empirical asymmetry coefficient p2. +Berar-Baldinozzi asymmetry coefficient B0 (Fb/tan theta). -### :material-tag: asym_empir_3 { #peak-asym-empir-3 } +### :material-tag: asym_beba_a1 { #peak-asym-beba-a1 } | Access | Source | | ----------------------------------- | ------------------------- | -| peak.asym_empir_3 | [code][0]{:.label-cif} | -| \_peak.asym_empir_3 | [Edi][0]{:.label-cif} | -| \_easydiffraction_peak.asym_empir_3 | [coreCIF][0]{:.label-cif} | +| peak.asym_beba_a1 | [code][0]{:.label-cif} | +| \_peak.asym_beba_a1 | [Edi][0]{:.label-cif} | +| \_easydiffraction_peak.asym_beba_a1 | [coreCIF][0]{:.label-cif} | -Empirical asymmetry coefficient p3. +Berar-Baldinozzi asymmetry coefficient A1 (Fa/tan 2theta). -### :material-tag: asym_empir_4 { #peak-asym-empir-4 } +### :material-tag: asym_beba_b1 { #peak-asym-beba-b1 } | Access | Source | | ----------------------------------- | ------------------------- | -| peak.asym_empir_4 | [code][0]{:.label-cif} | -| \_peak.asym_empir_4 | [Edi][0]{:.label-cif} | -| \_easydiffraction_peak.asym_empir_4 | [coreCIF][0]{:.label-cif} | +| peak.asym_beba_b1 | [code][0]{:.label-cif} | +| \_peak.asym_beba_b1 | [Edi][0]{:.label-cif} | +| \_easydiffraction_peak.asym_beba_b1 | [coreCIF][0]{:.label-cif} | -Empirical asymmetry coefficient p4. +Berar-Baldinozzi asymmetry coefficient B1 (Fb/tan 2theta). ### :material-tag: asym_fcj_1 { #peak-asym-fcj-1 } @@ -381,7 +381,7 @@ Double-exp switching function r₀₃. | \_easydiffraction_peak.type | [coreCIF][0]{:.label-cif} | Active peak profile type tag. Supported values include -`cwl-pseudo-voigt`, `cwl-pseudo-voigt-empirical-asymmetry`, +`cwl-pseudo-voigt`, `cwl-pseudo-voigt-berar-baldinozzi-asymmetry`, `cwl-thompson-cox-hastings`, `tof-pseudo-voigt`, `tof-jorgensen`, `tof-jorgensen-von-dreele`, `tof-double-jorgensen-von-dreele`, and `total-gaussian-damped-sinc`. diff --git a/docs/docs/verification/ci_skip.txt b/docs/docs/verification/ci_skip.txt index 34e751fd3..ef49c84a5 100644 --- a/docs/docs/verification/ci_skip.txt +++ b/docs/docs/verification/ci_skip.txt @@ -13,7 +13,7 @@ # underlying issue is resolved. # # Example (do not leave commented examples as active entries): -pd-neut-cwl_pv-asym_empir_pbso4 # Asymmetry params are different. Empirical asymmetry is not in ed-crysfml +pd-neut-cwl_pv-beba_pbso4 # Berar-Baldinozzi asymmetry differs between cryspy/FullProf (issue 166); not in ed-crysfml pd-neut-cwl_tch-fcj-noabs-nosldl_lab6 # needs unreleased cryspy PR #46 (SyCos/SySin, cos2theta convention) pd-neut-cwl_tch-fcj-noabs_lab6 # FCJ asymmetry (S_L/D_L) not implemented in cryspy; see docs/dev/issues/index.md pd-neut-cwl_tch-fcj_lab6 # FCJ asymmetry (S_L/D_L) not implemented in cryspy; absorption (muR=0.7, HEWAT) now modelled; see docs/dev/issues/index.md diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.bac b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.bac similarity index 100% rename from docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.bac rename to docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.bac diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.dat b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.dat similarity index 100% rename from docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.dat rename to docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.dat diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.pcr b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.pcr similarity index 100% rename from docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.pcr rename to docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.pcr diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.prf b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.prf similarity index 100% rename from docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.prf rename to docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.prf diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.sum b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.sum similarity index 100% rename from docs/docs/verification/fullprof/pd-neut-cwl_pv-asym_empir_pbso4/pbso4.sum rename to docs/docs/verification/fullprof/pd-neut-cwl_pv-beba_pbso4/pbso4.sum diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.bac b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.bac new file mode 100644 index 000000000..7c3af2709 --- /dev/null +++ b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.bac @@ -0,0 +1,3061 @@ +! Background of: y2o3 + 0.9663 9864.0967 + 1.0163 9864.0967 + 1.0662 9864.0967 + 1.1163 9864.0967 + 1.1662 9864.0967 + 1.2163 9864.0967 + 1.2663 9864.0967 + 1.3162 9864.0967 + 1.3663 9864.0967 + 1.4162 9864.0967 + 1.4663 9864.0967 + 1.5163 9864.0967 + 1.5662 9864.0967 + 1.6163 9864.0967 + 1.6662 9864.0967 + 1.7163 9864.0967 + 1.7663 9864.0967 + 1.8162 9864.0967 + 1.8663 9864.0967 + 1.9162 9864.0967 + 1.9663 9864.0967 + 2.0162 9864.0967 + 2.0662 9864.0967 + 2.1162 9864.0967 + 2.1662 9864.0967 + 2.2162 9864.0967 + 2.2662 9864.0967 + 2.3162 9864.0967 + 2.3662 9864.0967 + 2.4162 9864.0967 + 2.4662 9864.0967 + 2.5162 9864.0967 + 2.5662 9864.0967 + 2.6162 9864.0967 + 2.6662 9864.0967 + 2.7162 9864.0967 + 2.7662 9864.0967 + 2.8162 9864.0967 + 2.8662 9864.0967 + 2.9162 9864.0967 + 2.9662 9864.0967 + 3.0162 9864.0967 + 3.0662 9864.0967 + 3.1162 9864.0967 + 3.1662 9864.0967 + 3.2162 9864.0967 + 3.2662 9864.0967 + 3.3162 9864.0967 + 3.3662 9864.0967 + 3.4162 9864.0967 + 3.4662 9864.0967 + 3.5162 9864.0967 + 3.5662 9864.0967 + 3.6162 9864.0967 + 3.6662 9864.0967 + 3.7162 9864.0967 + 3.7662 9864.0967 + 3.8162 9864.0967 + 3.8662 9864.0967 + 3.9162 9864.0967 + 3.9662 9864.0967 + 4.0163 9864.0967 + 4.0663 9864.0967 + 4.1163 9864.0967 + 4.1663 9864.0967 + 4.2162 9864.0967 + 4.2663 9864.0967 + 4.3163 9864.0967 + 4.3663 9864.0967 + 4.4163 9864.0967 + 4.4662 9864.0967 + 4.5163 9864.0967 + 4.5663 9864.0967 + 4.6163 9864.0967 + 4.6663 9864.0967 + 4.7162 9864.0967 + 4.7663 9864.0967 + 4.8163 9864.0967 + 4.8663 9864.0967 + 4.9163 9864.0967 + 4.9662 9864.0967 + 5.0163 9864.0967 + 5.0663 9864.0967 + 5.1163 9864.0967 + 5.1663 9864.0967 + 5.2162 9864.0967 + 5.2663 9864.0967 + 5.3163 9864.0967 + 5.3663 9864.0967 + 5.4163 9864.0967 + 5.4662 9864.0967 + 5.5163 9864.0967 + 5.5663 9864.0967 + 5.6163 9864.0967 + 5.6663 9864.0967 + 5.7162 9864.0967 + 5.7663 9864.0967 + 5.8163 9864.0967 + 5.8663 9864.0967 + 5.9163 9864.0967 + 5.9662 9864.0967 + 6.0163 9864.0967 + 6.0663 9864.0967 + 6.1163 9864.0967 + 6.1663 9864.0967 + 6.2162 9864.0967 + 6.2663 9864.0967 + 6.3163 9864.0967 + 6.3663 9864.0967 + 6.4163 9864.0967 + 6.4662 9864.0967 + 6.5163 9864.0967 + 6.5663 9864.0967 + 6.6163 9864.0967 + 6.6663 9864.0967 + 6.7162 9864.0967 + 6.7663 9864.0967 + 6.8163 9864.0967 + 6.8663 9864.0967 + 6.9163 9864.0967 + 6.9662 9864.0967 + 7.0163 9864.0967 + 7.0663 9864.0967 + 7.1163 9864.0967 + 7.1663 9864.0967 + 7.2162 9864.0967 + 7.2663 9864.0967 + 7.3163 9864.0967 + 7.3663 9864.0967 + 7.4163 9864.0967 + 7.4662 9864.0967 + 7.5163 9864.0967 + 7.5663 9864.0967 + 7.6163 9864.0967 + 7.6663 9864.0967 + 7.7162 9864.0967 + 7.7663 9864.0967 + 7.8163 9864.0967 + 7.8663 9864.0967 + 7.9163 9864.0967 + 7.9662 9864.0967 + 8.0162 9864.0967 + 8.0662 9864.0967 + 8.1163 9864.0967 + 8.1662 9864.0967 + 8.2162 9864.0967 + 8.2662 9864.0967 + 8.3162 9864.0967 + 8.3663 9864.0967 + 8.4162 9864.0967 + 8.4662 9864.0967 + 8.5162 9864.0967 + 8.5662 9864.0967 + 8.6163 9864.0967 + 8.6662 9864.0967 + 8.7162 9864.0967 + 8.7662 9864.0967 + 8.8162 9864.0967 + 8.8663 9864.0967 + 8.9162 9864.0967 + 8.9662 9864.0967 + 9.0162 9864.0967 + 9.0662 9864.0967 + 9.1163 9864.0967 + 9.1662 9864.0967 + 9.2162 9864.0967 + 9.2662 9864.0967 + 9.3162 9864.0967 + 9.3663 9864.0967 + 9.4162 9864.0967 + 9.4662 9864.0967 + 9.5162 9864.0967 + 9.5662 9864.0967 + 9.6163 9864.0967 + 9.6662 9864.0967 + 9.7162 9864.0967 + 9.7662 9864.0967 + 9.8162 9864.0967 + 9.8663 9864.0967 + 9.9162 9864.0967 + 9.9662 9864.0967 + 10.0162 9864.0967 + 10.0662 9864.0967 + 10.1163 9864.0967 + 10.1662 9864.0967 + 10.2162 9864.0967 + 10.2662 9864.0967 + 10.3162 9864.0967 + 10.3663 9864.0967 + 10.4162 9864.0967 + 10.4662 9864.0967 + 10.5162 9864.0967 + 10.5662 9864.0967 + 10.6163 9864.0967 + 10.6662 9864.0967 + 10.7162 9864.0967 + 10.7662 9864.0967 + 10.8162 9864.0967 + 10.8663 9864.0967 + 10.9162 9864.0967 + 10.9662 9864.0967 + 11.0162 9864.0967 + 11.0662 9864.0967 + 11.1163 9864.0967 + 11.1662 9864.0967 + 11.2162 9864.0967 + 11.2662 9864.0967 + 11.3162 9864.0967 + 11.3663 9864.0967 + 11.4162 9864.0967 + 11.4662 9864.0967 + 11.5162 9864.0967 + 11.5662 9864.0967 + 11.6163 9864.0967 + 11.6662 9864.0967 + 11.7162 9864.0967 + 11.7662 9864.0967 + 11.8162 9864.0967 + 11.8663 9864.0967 + 11.9162 9864.0967 + 11.9662 9864.0967 + 12.0162 9864.0967 + 12.0662 9864.0967 + 12.1163 9864.0967 + 12.1662 9864.0967 + 12.2162 9864.0967 + 12.2662 9864.0967 + 12.3162 9864.0967 + 12.3663 9864.0967 + 12.4162 9864.0967 + 12.4662 9864.0967 + 12.5162 9864.0967 + 12.5662 9866.3525 + 12.6163 9863.1846 + 12.6662 9860.0166 + 12.7162 9856.8486 + 12.7662 9853.6807 + 12.8162 9850.5117 + 12.8663 9847.3438 + 12.9162 9844.1758 + 12.9662 9841.0078 + 13.0162 9837.8398 + 13.0662 9834.6719 + 13.1163 9831.5039 + 13.1662 9828.3359 + 13.2162 9825.1680 + 13.2662 9822.0000 + 13.3162 9818.8320 + 13.3663 9815.6641 + 13.4162 9812.4961 + 13.4662 9809.3281 + 13.5162 9806.1602 + 13.5662 9802.9922 + 13.6163 9799.8242 + 13.6662 9796.6562 + 13.7162 9793.4883 + 13.7662 9790.3193 + 13.8162 9787.1514 + 13.8663 9783.9834 + 13.9162 9780.8154 + 13.9662 9777.6475 + 14.0162 9774.4795 + 14.0662 9771.3115 + 14.1163 9768.1436 + 14.1662 9764.9756 + 14.2162 9761.8076 + 14.2662 9758.6396 + 14.3162 9755.4717 + 14.3663 9752.3037 + 14.4162 9749.1357 + 14.4662 9745.9678 + 14.5162 9742.7998 + 14.5662 9739.6318 + 14.6163 9736.4639 + 14.6662 9733.2959 + 14.7162 9730.1270 + 14.7662 9726.9590 + 14.8162 9723.7910 + 14.8663 9720.6230 + 14.9162 9717.4551 + 14.9662 9714.2871 + 15.0162 9711.1191 + 15.0662 9707.9512 + 15.1163 9704.7832 + 15.1662 9701.6152 + 15.2162 9698.4473 + 15.2662 9695.2793 + 15.3162 9692.1113 + 15.3663 9688.9434 + 15.4162 9685.7754 + 15.4662 9682.6074 + 15.5162 9679.4395 + 15.5662 9676.2715 + 15.6163 9673.1025 + 15.6662 9669.9346 + 15.7162 9666.7666 + 15.7662 9663.5986 + 15.8162 9660.4307 + 15.8663 9657.2627 + 15.9162 9654.0947 + 15.9662 9650.9268 + 16.0163 9647.7588 + 16.0662 9644.5908 + 16.1163 9641.4229 + 16.1663 9638.2549 + 16.2163 9635.0869 + 16.2663 9631.9189 + 16.3162 9628.7510 + 16.3663 9625.5830 + 16.4163 9622.4150 + 16.4663 9619.2461 + 16.5163 9616.0781 + 16.5662 9612.9102 + 16.6163 9609.7422 + 16.6663 9606.5742 + 16.7163 9603.4062 + 16.7663 9600.2383 + 16.8162 9597.0703 + 16.8663 9593.9023 + 16.9163 9590.7344 + 16.9663 9587.5664 + 17.0163 9584.3984 + 17.0662 9581.2305 + 17.1163 9578.0625 + 17.1663 9574.8945 + 17.2163 9571.7266 + 17.2663 9568.5586 + 17.3162 9565.3906 + 17.3663 9562.2227 + 17.4163 9559.0547 + 17.4663 9555.8857 + 17.5163 9552.7178 + 17.5662 9549.5498 + 17.6163 9546.3818 + 17.6663 9543.2139 + 17.7163 9540.0459 + 17.7663 9536.8779 + 17.8162 9533.7100 + 17.8663 9530.5420 + 17.9163 9527.3740 + 17.9663 9524.2061 + 18.0163 9521.0381 + 18.0662 9517.8701 + 18.1163 9514.7021 + 18.1663 9511.5342 + 18.2163 9508.3662 + 18.2663 9505.1982 + 18.3162 9502.0303 + 18.3663 9498.8613 + 18.4163 9495.6934 + 18.4663 9492.5254 + 18.5163 9489.3574 + 18.5662 9486.1895 + 18.6163 9483.0215 + 18.6663 9479.8535 + 18.7163 9476.6855 + 18.7663 9473.5176 + 18.8162 9470.3496 + 18.8663 9467.1816 + 18.9163 9464.0137 + 18.9663 9460.8457 + 19.0163 9457.6777 + 19.0662 9454.5098 + 19.1163 9451.3418 + 19.1663 9448.1738 + 19.2163 9445.0059 + 19.2663 9441.8379 + 19.3162 9438.6699 + 19.3663 9435.5010 + 19.4163 9432.3330 + 19.4663 9427.7314 + 19.5163 9422.3174 + 19.5662 9416.9023 + 19.6163 9411.4873 + 19.6663 9406.0732 + 19.7163 9400.6582 + 19.7663 9395.2432 + 19.8162 9389.8291 + 19.8663 9384.4141 + 19.9163 9378.9990 + 19.9663 9373.5850 + 20.0163 9368.1699 + 20.0662 9362.7549 + 20.1163 9357.3398 + 20.1663 9351.9258 + 20.2163 9346.5107 + 20.2663 9341.0957 + 20.3162 9335.6816 + 20.3663 9330.2666 + 20.4163 9324.8516 + 20.4663 9319.4375 + 20.5163 9314.0225 + 20.5662 9308.6074 + 20.6163 9303.1934 + 20.6663 9297.7783 + 20.7163 9292.3633 + 20.7663 9286.9492 + 20.8162 9281.5342 + 20.8663 9276.1191 + 20.9163 9270.7051 + 20.9663 9265.2900 + 21.0163 9259.8750 + 21.0662 9254.4600 + 21.1163 9249.0459 + 21.1663 9243.6309 + 21.2163 9238.2158 + 21.2663 9232.8018 + 21.3162 9227.3867 + 21.3663 9221.9717 + 21.4163 9216.5576 + 21.4663 9211.1426 + 21.5163 9205.7275 + 21.5662 9200.3135 + 21.6163 9194.8984 + 21.6663 9189.4834 + 21.7163 9184.0684 + 21.7663 9178.6543 + 21.8162 9173.2393 + 21.8663 9167.8242 + 21.9163 9163.6533 + 21.9663 9160.7344 + 22.0163 9157.8154 + 22.0662 9154.8965 + 22.1163 9151.9775 + 22.1663 9149.0586 + 22.2163 9146.1396 + 22.2663 9143.2207 + 22.3162 9140.3027 + 22.3663 9137.3838 + 22.4163 9134.4648 + 22.4663 9131.5459 + 22.5163 9128.6270 + 22.5662 9125.7080 + 22.6163 9122.7891 + 22.6663 9119.8701 + 22.7163 9116.9512 + 22.7663 9114.0332 + 22.8162 9111.1143 + 22.8663 9108.1953 + 22.9163 9105.2764 + 22.9663 9102.3574 + 23.0163 9099.4385 + 23.0662 9096.5195 + 23.1163 9093.6006 + 23.1663 9090.6826 + 23.2163 9087.7637 + 23.2663 9084.8447 + 23.3162 9081.9258 + 23.3663 9079.0068 + 23.4163 9076.0879 + 23.4663 9073.1689 + 23.5163 9070.2500 + 23.5662 9067.3320 + 23.6163 9064.4131 + 23.6663 9061.4941 + 23.7163 9058.5752 + 23.7663 9055.6562 + 23.8162 9052.7373 + 23.8663 9049.8184 + 23.9163 9046.8994 + 23.9663 9043.9805 + 24.0163 9041.0625 + 24.0662 9038.1436 + 24.1163 9035.2246 + 24.1663 9032.3057 + 24.2163 9029.3867 + 24.2663 9026.4678 + 24.3162 9023.5488 + 24.3663 9020.6299 + 24.4163 9017.7119 + 24.4663 9014.7930 + 24.5163 9011.8740 + 24.5662 9008.9551 + 24.6163 9006.0361 + 24.6663 9003.1172 + 24.7163 9000.1982 + 24.7663 8997.2793 + 24.8162 8994.3613 + 24.8663 8991.4424 + 24.9163 8988.5234 + 24.9663 8985.6045 + 25.0163 8982.6855 + 25.0662 8979.7666 + 25.1163 8976.8477 + 25.1663 8973.9287 + 25.2163 8971.0098 + 25.2663 8968.0918 + 25.3162 8965.1729 + 25.3663 8962.2539 + 25.4163 8959.3350 + 25.4663 8956.4160 + 25.5163 8953.4971 + 25.5662 8950.5781 + 25.6163 8947.6592 + 25.6663 8944.7412 + 25.7163 8941.8223 + 25.7663 8938.9033 + 25.8162 8935.9844 + 25.8663 8933.0654 + 25.9163 8930.1465 + 25.9663 8927.2275 + 26.0163 8924.3086 + 26.0662 8921.3906 + 26.1163 8918.4717 + 26.1663 8915.5527 + 26.2163 8912.6338 + 26.2663 8909.7148 + 26.3162 8906.7959 + 26.3663 8903.8770 + 26.4163 8900.9580 + 26.4663 8898.0391 + 26.5163 8895.1211 + 26.5662 8892.2021 + 26.6163 8889.2832 + 26.6663 8886.3643 + 26.7163 8883.4453 + 26.7663 8880.5264 + 26.8162 8877.6074 + 26.8663 8874.6885 + 26.9163 8871.7705 + 26.9663 8868.8516 + 27.0163 8865.9326 + 27.0662 8863.0137 + 27.1163 8860.0947 + 27.1663 8857.1758 + 27.2163 8854.2568 + 27.2663 8851.3379 + 27.3162 8848.4199 + 27.3663 8845.5010 + 27.4163 8842.5820 + 27.4663 8839.6631 + 27.5163 8836.7441 + 27.5662 8833.8252 + 27.6163 8830.9062 + 27.6663 8827.9873 + 27.7163 8825.0684 + 27.7663 8822.1504 + 27.8162 8819.2314 + 27.8663 8816.3125 + 27.9163 8813.3984 + 27.9663 8811.5928 + 28.0163 8809.7881 + 28.0662 8807.9834 + 28.1163 8806.1787 + 28.1663 8804.3740 + 28.2163 8802.5684 + 28.2663 8800.7637 + 28.3162 8798.9590 + 28.3663 8797.1543 + 28.4163 8795.3496 + 28.4663 8793.5439 + 28.5163 8791.7393 + 28.5662 8789.9346 + 28.6163 8788.1299 + 28.6663 8786.3252 + 28.7163 8784.5195 + 28.7663 8782.7148 + 28.8162 8780.9102 + 28.8663 8779.1055 + 28.9163 8777.3008 + 28.9663 8775.4951 + 29.0163 8773.6904 + 29.0662 8771.8857 + 29.1163 8770.0811 + 29.1663 8768.2764 + 29.2163 8766.4707 + 29.2663 8764.6660 + 29.3162 8762.8613 + 29.3663 8761.0566 + 29.4163 8759.2520 + 29.4663 8757.4463 + 29.5163 8755.6416 + 29.5662 8753.8369 + 29.6163 8752.0322 + 29.6663 8750.2275 + 29.7163 8748.4219 + 29.7663 8746.6172 + 29.8162 8744.8125 + 29.8663 8743.0078 + 29.9163 8741.2031 + 29.9663 8739.3975 + 30.0163 8737.5928 + 30.0662 8735.7881 + 30.1163 8733.9834 + 30.1663 8732.1777 + 30.2163 8730.3730 + 30.2663 8728.5684 + 30.3162 8726.7637 + 30.3663 8724.9590 + 30.4163 8723.1533 + 30.4663 8721.3486 + 30.5163 8719.5439 + 30.5662 8717.7393 + 30.6163 8715.9346 + 30.6663 8714.1289 + 30.7163 8712.3242 + 30.7663 8710.5195 + 30.8162 8708.7148 + 30.8663 8706.9102 + 30.9163 8705.1045 + 30.9663 8703.2998 + 31.0163 8701.4951 + 31.0662 8699.6904 + 31.1163 8697.8857 + 31.1663 8696.0801 + 31.2163 8694.2754 + 31.2663 8692.4707 + 31.3162 8690.6660 + 31.3663 8688.8613 + 31.4163 8687.0557 + 31.4663 8685.2510 + 31.5163 8683.4463 + 31.5662 8681.6416 + 31.6163 8679.8369 + 31.6663 8678.0312 + 31.7163 8676.2266 + 31.7663 8674.4219 + 31.8162 8672.6172 + 31.8663 8670.8125 + 31.9163 8669.0068 + 31.9663 8667.2021 + 32.0163 8665.3975 + 32.0662 8663.5928 + 32.1162 8661.7881 + 32.1663 8659.9824 + 32.2163 8658.1777 + 32.2663 8656.3730 + 32.3162 8654.5684 + 32.3662 8652.7637 + 32.4163 8650.9580 + 32.4663 8649.1533 + 32.5163 8647.3486 + 32.5662 8645.5439 + 32.6162 8643.7393 + 32.6663 8641.9336 + 32.7163 8640.1289 + 32.7663 8638.3242 + 32.8162 8636.5195 + 32.8662 8634.7148 + 32.9163 8632.9092 + 32.9663 8630.1279 + 33.0163 8626.9395 + 33.0662 8623.7520 + 33.1162 8620.5635 + 33.1663 8617.3750 + 33.2163 8614.1865 + 33.2663 8610.9990 + 33.3162 8607.8105 + 33.3662 8604.6221 + 33.4163 8601.4336 + 33.4663 8598.2451 + 33.5163 8595.0576 + 33.5662 8591.8691 + 33.6162 8588.6807 + 33.6663 8585.4922 + 33.7163 8582.3047 + 33.7663 8579.1162 + 33.8162 8575.9277 + 33.8662 8572.7402 + 33.9163 8569.5518 + 33.9663 8566.3633 + 34.0163 8563.1748 + 34.0662 8559.9873 + 34.1162 8556.7988 + 34.1663 8553.6104 + 34.2163 8550.4219 + 34.2663 8547.2334 + 34.3162 8544.0459 + 34.3662 8540.8574 + 34.4163 8537.6689 + 34.4663 8534.4805 + 34.5163 8531.2930 + 34.5662 8528.1045 + 34.6162 8524.9160 + 34.6663 8521.7275 + 34.7163 8518.5400 + 34.7663 8515.3516 + 34.8162 8512.1631 + 34.8662 8508.9756 + 34.9163 8505.7871 + 34.9663 8502.5986 + 35.0163 8499.4102 + 35.0662 8496.2227 + 35.1162 8493.0342 + 35.1663 8489.8457 + 35.2163 8486.6572 + 35.2663 8483.4688 + 35.3162 8480.2812 + 35.3662 8477.0928 + 35.4163 8473.9043 + 35.4663 8470.7158 + 35.5163 8467.5283 + 35.5662 8464.3398 + 35.6162 8461.1514 + 35.6663 8457.9629 + 35.7163 8454.7754 + 35.7663 8451.5869 + 35.8162 8448.3984 + 35.8662 8445.2109 + 35.9163 8442.0225 + 35.9663 8438.8340 + 36.0163 8435.6455 + 36.0662 8432.4570 + 36.1162 8429.2695 + 36.1663 8426.0811 + 36.2163 8422.8926 + 36.2663 8419.7041 + 36.3162 8416.5166 + 36.3662 8413.3281 + 36.4163 8410.1396 + 36.4663 8406.9512 + 36.5163 8403.7637 + 36.5662 8400.5752 + 36.6162 8397.3867 + 36.6663 8394.1982 + 36.7163 8391.0107 + 36.7663 8387.8223 + 36.8162 8384.6338 + 36.8662 8381.4453 + 36.9163 8378.2578 + 36.9663 8375.0693 + 37.0163 8371.8809 + 37.0662 8368.6924 + 37.1162 8365.5049 + 37.1663 8362.3164 + 37.2163 8359.1279 + 37.2663 8355.9395 + 37.3162 8352.7520 + 37.3662 8349.5635 + 37.4163 8346.3750 + 37.4663 8343.1865 + 37.5163 8339.9990 + 37.5662 8336.8105 + 37.6162 8333.6221 + 37.6663 8330.4336 + 37.7163 8327.2461 + 37.7663 8324.0576 + 37.8162 8320.8691 + 37.8662 8317.6807 + 37.9163 8314.4922 + 37.9663 8311.3047 + 38.0163 8308.1162 + 38.0662 8304.9277 + 38.1162 8301.7402 + 38.1663 8298.5518 + 38.2163 8295.3633 + 38.2663 8292.1748 + 38.3162 8288.9873 + 38.3662 8285.7988 + 38.4163 8282.6104 + 38.4663 8279.4219 + 38.5163 8276.2344 + 38.5662 8273.0459 + 38.6162 8269.8574 + 38.6663 8266.6689 + 38.7163 8263.4805 + 38.7663 8260.2930 + 38.8162 8257.1045 + 38.8662 8253.9160 + 38.9163 8250.7275 + 38.9663 8247.5400 + 39.0163 8244.3516 + 39.0662 8241.1631 + 39.1162 8237.9756 + 39.1663 8235.2119 + 39.2163 8232.6348 + 39.2663 8230.0576 + 39.3162 8227.4795 + 39.3662 8224.9023 + 39.4163 8222.3252 + 39.4663 8219.7480 + 39.5163 8217.1709 + 39.5662 8214.5928 + 39.6162 8212.0156 + 39.6663 8209.4385 + 39.7163 8206.8613 + 39.7663 8204.2832 + 39.8162 8201.7061 + 39.8662 8199.1289 + 39.9163 8196.5518 + 39.9663 8193.9746 + 40.0163 8191.3970 + 40.0662 8188.8193 + 40.1162 8186.2422 + 40.1663 8183.6646 + 40.2163 8181.0874 + 40.2663 8178.5098 + 40.3162 8175.9326 + 40.3662 8173.3555 + 40.4163 8170.7778 + 40.4663 8168.2007 + 40.5163 8165.6230 + 40.5662 8163.0459 + 40.6162 8160.4683 + 40.6663 8157.8911 + 40.7163 8155.3135 + 40.7663 8152.7363 + 40.8162 8150.1592 + 40.8662 8147.5815 + 40.9163 8145.0039 + 40.9663 8142.4268 + 41.0163 8139.8496 + 41.0662 8137.2720 + 41.1162 8134.6948 + 41.1663 8132.1172 + 41.2163 8129.5400 + 41.2663 8126.9629 + 41.3162 8124.3853 + 41.3662 8121.8081 + 41.4163 8119.2305 + 41.4663 8116.6533 + 41.5163 8114.0757 + 41.5662 8111.4985 + 41.6162 8108.9214 + 41.6663 8106.3438 + 41.7163 8103.7661 + 41.7663 8101.1890 + 41.8162 8098.6118 + 41.8662 8096.0342 + 41.9163 8093.4570 + 41.9663 8090.8794 + 42.0163 8088.3022 + 42.0662 8085.7251 + 42.1162 8083.1475 + 42.1663 8080.5698 + 42.2163 8077.9927 + 42.2663 8075.4155 + 42.3162 8072.8379 + 42.3662 8070.2607 + 42.4163 8067.6831 + 42.4663 8065.1060 + 42.5163 8062.5283 + 42.5662 8059.9512 + 42.6162 8057.3740 + 42.6663 8054.7964 + 42.7163 8052.2192 + 42.7663 8049.6416 + 42.8162 8047.0645 + 42.8662 8044.4873 + 42.9163 8041.9097 + 42.9663 8039.3320 + 43.0163 8036.7549 + 43.0662 8034.1777 + 43.1162 8031.6001 + 43.1663 8029.0225 + 43.2163 8026.4453 + 43.2663 8023.8682 + 43.3162 8021.2905 + 43.3662 8018.7134 + 43.4163 8016.1357 + 43.4663 8013.5586 + 43.5163 8010.9814 + 43.5662 8008.4038 + 43.6162 8005.8267 + 43.6663 8003.2490 + 43.7163 8000.6719 + 43.7663 7998.0942 + 43.8162 7995.5171 + 43.8662 7992.9399 + 43.9163 7990.3623 + 43.9663 7987.7852 + 44.0163 7985.2075 + 44.0662 7982.6304 + 44.1162 7980.0527 + 44.1663 7977.4756 + 44.2163 7974.8979 + 44.2663 7972.3208 + 44.3162 7969.7437 + 44.3662 7967.1660 + 44.4163 7964.5884 + 44.4663 7962.0112 + 44.5163 7959.4341 + 44.5662 7956.8564 + 44.6162 7954.2793 + 44.6663 7951.7017 + 44.7163 7949.1245 + 44.7663 7946.5469 + 44.8162 7943.9697 + 44.8662 7941.3926 + 44.9163 7938.8149 + 44.9663 7936.2378 + 45.0163 7933.6602 + 45.0662 7931.0830 + 45.1162 7928.5059 + 45.1663 7925.9282 + 45.2163 7923.3506 + 45.2663 7920.7734 + 45.3162 7918.1963 + 45.3662 7915.6187 + 45.4163 7913.0410 + 45.4663 7910.4639 + 45.5163 7907.8867 + 45.5662 7905.3091 + 45.6162 7902.7319 + 45.6663 7900.1543 + 45.7163 7897.5771 + 45.7663 7896.1494 + 45.8162 7895.0850 + 45.8662 7894.0205 + 45.9163 7892.9556 + 45.9663 7891.8911 + 46.0163 7890.8267 + 46.0662 7889.7622 + 46.1162 7888.6978 + 46.1663 7887.6333 + 46.2163 7886.5684 + 46.2663 7885.5039 + 46.3162 7884.4395 + 46.3662 7883.3750 + 46.4163 7882.3105 + 46.4663 7881.2456 + 46.5163 7880.1812 + 46.5662 7879.1167 + 46.6162 7878.0522 + 46.6663 7876.9878 + 46.7163 7875.9229 + 46.7663 7874.8584 + 46.8162 7873.7939 + 46.8662 7872.7295 + 46.9163 7871.6650 + 46.9663 7870.6001 + 47.0163 7869.5356 + 47.0662 7868.4712 + 47.1162 7867.4067 + 47.1663 7866.3423 + 47.2163 7865.2778 + 47.2663 7864.2129 + 47.3162 7863.1484 + 47.3662 7862.0840 + 47.4163 7861.0195 + 47.4663 7859.9551 + 47.5163 7858.8901 + 47.5662 7857.8257 + 47.6162 7856.7612 + 47.6663 7855.6968 + 47.7163 7854.6323 + 47.7663 7853.5674 + 47.8162 7852.5029 + 47.8662 7851.4385 + 47.9163 7850.3740 + 47.9663 7849.3096 + 48.0163 7848.2451 + 48.0662 7847.1802 + 48.1162 7846.1157 + 48.1663 7845.0513 + 48.2163 7843.9868 + 48.2663 7842.9224 + 48.3162 7841.8574 + 48.3662 7840.7930 + 48.4163 7839.7285 + 48.4663 7838.6641 + 48.5163 7837.5996 + 48.5662 7836.5347 + 48.6162 7835.4702 + 48.6663 7834.4058 + 48.7163 7833.3413 + 48.7663 7832.2769 + 48.8162 7831.2119 + 48.8662 7830.1475 + 48.9163 7829.0830 + 48.9663 7828.0186 + 49.0163 7826.9541 + 49.0662 7825.8896 + 49.1162 7824.8247 + 49.1663 7823.7603 + 49.2163 7822.6958 + 49.2663 7821.6313 + 49.3162 7820.5669 + 49.3662 7819.5020 + 49.4163 7818.4375 + 49.4663 7817.3730 + 49.5163 7816.3086 + 49.5662 7815.2441 + 49.6162 7814.1792 + 49.6663 7813.1147 + 49.7163 7812.0503 + 49.7663 7810.9858 + 49.8162 7809.9214 + 49.8662 7808.8564 + 49.9163 7807.7920 + 49.9663 7806.7275 + 50.0163 7805.6631 + 50.0662 7804.5986 + 50.1162 7803.5342 + 50.1663 7802.4692 + 50.2163 7801.4048 + 50.2663 7800.3403 + 50.3162 7799.2759 + 50.3662 7798.2114 + 50.4163 7797.1465 + 50.4663 7796.0820 + 50.5163 7795.0176 + 50.5662 7793.9531 + 50.6162 7792.8887 + 50.6663 7791.8237 + 50.7163 7790.7593 + 50.7663 7789.6948 + 50.8162 7788.6304 + 50.8662 7787.5659 + 50.9163 7786.5010 + 50.9663 7785.4365 + 51.0163 7784.3721 + 51.0662 7783.3076 + 51.1162 7782.2432 + 51.1663 7781.1782 + 51.2163 7780.1138 + 51.2663 7779.0493 + 51.3162 7777.9849 + 51.3662 7776.9204 + 51.4163 7775.8555 + 51.4663 7774.7910 + 51.5163 7773.7266 + 51.5662 7772.6621 + 51.6162 7771.5977 + 51.6663 7770.5327 + 51.7163 7769.4683 + 51.7663 7768.4038 + 51.8162 7767.3394 + 51.8662 7766.2749 + 51.9163 7765.2100 + 51.9663 7764.0181 + 52.0163 7762.3887 + 52.0662 7760.7593 + 52.1162 7759.1304 + 52.1663 7757.5010 + 52.2163 7755.8716 + 52.2663 7754.2422 + 52.3162 7752.6128 + 52.3662 7750.9834 + 52.4163 7749.3540 + 52.4663 7747.7251 + 52.5163 7746.0957 + 52.5662 7744.4663 + 52.6162 7742.8369 + 52.6663 7741.2075 + 52.7163 7739.5786 + 52.7663 7737.9492 + 52.8162 7736.3198 + 52.8662 7734.6904 + 52.9163 7733.0610 + 52.9663 7731.4316 + 53.0163 7729.8027 + 53.0662 7728.1733 + 53.1162 7726.5439 + 53.1663 7724.9146 + 53.2163 7723.2852 + 53.2663 7721.6558 + 53.3162 7720.0269 + 53.3662 7718.3975 + 53.4163 7716.7681 + 53.4663 7715.1387 + 53.5163 7713.5093 + 53.5662 7711.8804 + 53.6162 7710.2510 + 53.6663 7708.6216 + 53.7163 7706.9922 + 53.7663 7705.3628 + 53.8162 7703.7334 + 53.8662 7702.1045 + 53.9163 7700.4751 + 53.9663 7698.8457 + 54.0163 7697.2163 + 54.0662 7695.5869 + 54.1162 7693.9580 + 54.1663 7692.3286 + 54.2163 7690.6992 + 54.2663 7689.0698 + 54.3162 7687.4404 + 54.3662 7685.8110 + 54.4163 7684.1816 + 54.4663 7682.5527 + 54.5163 7680.9233 + 54.5662 7679.2939 + 54.6162 7677.6646 + 54.6663 7676.0352 + 54.7163 7674.4058 + 54.7663 7672.7769 + 54.8162 7671.1475 + 54.8662 7669.5181 + 54.9163 7667.8887 + 54.9663 7666.2593 + 55.0163 7664.6304 + 55.0662 7663.0010 + 55.1162 7661.3716 + 55.1663 7659.7422 + 55.2163 7658.1128 + 55.2663 7656.4834 + 55.3162 7654.8545 + 55.3662 7653.2251 + 55.4163 7651.5957 + 55.4663 7649.9663 + 55.5163 7648.3369 + 55.5662 7646.7080 + 55.6162 7645.0786 + 55.6663 7643.4492 + 55.7163 7641.8198 + 55.7663 7640.1904 + 55.8162 7638.5610 + 55.8662 7636.9321 + 55.9163 7635.3027 + 55.9663 7633.6733 + 56.0163 7632.0439 + 56.0662 7630.4146 + 56.1162 7628.7852 + 56.1663 7627.1558 + 56.2163 7625.5269 + 56.2663 7623.8975 + 56.3162 7622.2681 + 56.3662 7620.6387 + 56.4163 7619.0093 + 56.4663 7617.3804 + 56.5163 7615.7510 + 56.5662 7614.1216 + 56.6162 7612.4922 + 56.6663 7610.8628 + 56.7163 7609.2334 + 56.7663 7607.6045 + 56.8162 7605.9751 + 56.8662 7604.3457 + 56.9163 7602.7163 + 56.9663 7601.0869 + 57.0163 7599.4580 + 57.0662 7597.8286 + 57.1162 7596.1992 + 57.1663 7594.5698 + 57.2163 7592.9404 + 57.2663 7591.3110 + 57.3162 7589.6821 + 57.3662 7588.0527 + 57.4163 7586.4233 + 57.4663 7584.7939 + 57.5163 7583.1646 + 57.5662 7581.5352 + 57.6162 7579.9062 + 57.6663 7578.2769 + 57.7163 7576.6475 + 57.7663 7575.0181 + 57.8162 7573.3887 + 57.8662 7571.7598 + 57.9163 7570.1304 + 57.9663 7568.5010 + 58.0163 7566.8716 + 58.0662 7565.2422 + 58.1162 7563.6128 + 58.1663 7561.9834 + 58.2163 7560.3545 + 58.2663 7558.7251 + 58.3162 7557.0957 + 58.3662 7555.4663 + 58.4163 7553.8369 + 58.4663 7552.2075 + 58.5163 7550.5786 + 58.5662 7548.9492 + 58.6162 7547.3198 + 58.6663 7545.6904 + 58.7163 7544.0610 + 58.7663 7542.4321 + 58.8162 7540.8027 + 58.8662 7539.1733 + 58.9163 7537.5439 + 58.9663 7535.9146 + 59.0163 7534.2852 + 59.0662 7532.6562 + 59.1162 7531.0269 + 59.1663 7529.3975 + 59.2163 7527.7681 + 59.2663 7526.1387 + 59.3162 7524.5098 + 59.3662 7522.8804 + 59.4163 7521.2510 + 59.4663 7519.6216 + 59.5163 7517.9922 + 59.5662 7516.3628 + 59.6162 7514.7339 + 59.6663 7513.1045 + 59.7163 7511.4751 + 59.7663 7509.8457 + 59.8162 7508.2163 + 59.8662 7506.5869 + 59.9163 7504.9575 + 59.9663 7503.3286 + 60.0163 7501.6992 + 60.0662 7500.0698 + 60.1162 7498.4404 + 60.1663 7496.8110 + 60.2163 7495.1821 + 60.2663 7493.5527 + 60.3162 7491.9233 + 60.3662 7490.2939 + 60.4163 7488.6646 + 60.4663 7487.0352 + 60.5163 7485.4062 + 60.5662 7483.7769 + 60.6162 7482.2915 + 60.6663 7480.8340 + 60.7163 7479.3765 + 60.7663 7477.9189 + 60.8162 7476.4609 + 60.8662 7475.0034 + 60.9163 7473.5459 + 60.9663 7472.0879 + 61.0163 7470.6304 + 61.0662 7469.1729 + 61.1162 7467.7153 + 61.1663 7466.2573 + 61.2163 7464.7998 + 61.2663 7463.3423 + 61.3162 7461.8848 + 61.3662 7460.4272 + 61.4163 7458.9692 + 61.4663 7457.5117 + 61.5163 7456.0542 + 61.5662 7454.5962 + 61.6162 7453.1387 + 61.6663 7451.6812 + 61.7163 7450.2236 + 61.7663 7448.7656 + 61.8162 7447.3081 + 61.8662 7445.8506 + 61.9163 7444.3931 + 61.9663 7442.9351 + 62.0163 7441.4775 + 62.0662 7440.0200 + 62.1162 7438.5625 + 62.1663 7437.1045 + 62.2163 7435.6470 + 62.2663 7434.1895 + 62.3162 7432.7319 + 62.3662 7431.2739 + 62.4163 7429.8164 + 62.4663 7428.3589 + 62.5163 7426.9014 + 62.5662 7425.4434 + 62.6162 7423.9858 + 62.6663 7422.5283 + 62.7163 7421.0703 + 62.7663 7419.6128 + 62.8162 7418.1553 + 62.8662 7416.6978 + 62.9163 7415.2397 + 62.9663 7413.7822 + 63.0163 7412.3247 + 63.0662 7410.8672 + 63.1162 7409.4097 + 63.1663 7407.9517 + 63.2163 7406.4941 + 63.2663 7405.0366 + 63.3162 7403.5791 + 63.3662 7402.1211 + 63.4163 7400.6636 + 63.4663 7399.2061 + 63.5163 7397.7480 + 63.5662 7396.2905 + 63.6162 7394.8330 + 63.6663 7393.3755 + 63.7163 7391.9175 + 63.7663 7390.4600 + 63.8162 7389.0024 + 63.8662 7387.5449 + 63.9163 7386.0869 + 63.9663 7384.6294 + 64.0163 7383.1719 + 64.0663 7381.7139 + 64.1162 7380.2563 + 64.1663 7378.7988 + 64.2162 7377.3413 + 64.2663 7375.8838 + 64.3163 7374.4258 + 64.3662 7372.9683 + 64.4163 7371.5107 + 64.4662 7370.0532 + 64.5163 7368.5952 + 64.5663 7367.1377 + 64.6162 7365.6802 + 64.6663 7364.2222 + 64.7162 7362.7646 + 64.7663 7361.3071 + 64.8163 7359.8496 + 64.8662 7358.3921 + 64.9163 7356.9341 + 64.9662 7355.4766 + 65.0163 7354.0190 + 65.0663 7352.5610 + 65.1162 7351.1035 + 65.1663 7349.6460 + 65.2162 7348.1885 + 65.2663 7346.7305 + 65.3163 7345.2729 + 65.3662 7343.8154 + 65.4163 7342.3579 + 65.4662 7340.9004 + 65.5163 7339.4424 + 65.5663 7337.9849 + 65.6162 7336.5273 + 65.6663 7335.0693 + 65.7162 7333.6118 + 65.7663 7332.1543 + 65.8163 7330.6963 + 65.8662 7329.2388 + 65.9163 7327.7812 + 65.9662 7326.3237 + 66.0163 7324.8662 + 66.0663 7323.4082 + 66.1162 7321.9507 + 66.1663 7320.4932 + 66.2162 7319.0356 + 66.2663 7317.5776 + 66.3163 7316.1201 + 66.3662 7314.6626 + 66.4163 7313.2046 + 66.4662 7311.7471 + 66.5163 7310.2896 + 66.5663 7308.8320 + 66.6162 7307.3745 + 66.6663 7305.9165 + 66.7162 7304.4590 + 66.7663 7303.0015 + 66.8163 7301.5435 + 66.8662 7300.0859 + 66.9163 7298.6284 + 66.9662 7297.1709 + 67.0163 7295.7129 + 67.0663 7294.2554 + 67.1162 7292.7979 + 67.1663 7291.3403 + 67.2162 7289.8828 + 67.2663 7288.4248 + 67.3163 7286.9673 + 67.3662 7285.5098 + 67.4163 7284.0518 + 67.4662 7282.5942 + 67.5163 7281.1367 + 67.5663 7279.6787 + 67.6162 7278.2217 + 67.6663 7276.7637 + 67.7162 7275.3062 + 67.7663 7273.8486 + 67.8163 7272.3906 + 67.8662 7270.9331 + 67.9163 7269.4756 + 67.9662 7268.0181 + 68.0163 7266.5601 + 68.0663 7265.1025 + 68.1162 7263.6450 + 68.1663 7262.1875 + 68.2162 7260.7617 + 68.2663 7260.1973 + 68.3163 7259.6333 + 68.3662 7259.0688 + 68.4163 7258.5044 + 68.4662 7257.9399 + 68.5163 7257.3755 + 68.5663 7256.8110 + 68.6162 7256.2471 + 68.6663 7255.6826 + 68.7162 7255.1182 + 68.7663 7254.5537 + 68.8163 7253.9893 + 68.8662 7253.4253 + 68.9163 7252.8608 + 68.9662 7252.2964 + 69.0163 7251.7319 + 69.0663 7251.1675 + 69.1162 7250.6030 + 69.1663 7250.0386 + 69.2162 7249.4746 + 69.2663 7248.9102 + 69.3163 7248.3457 + 69.3662 7247.7812 + 69.4163 7247.2168 + 69.4662 7246.6528 + 69.5163 7246.0884 + 69.5663 7245.5239 + 69.6162 7244.9595 + 69.6663 7244.3950 + 69.7162 7243.8306 + 69.7663 7243.2661 + 69.8163 7242.7021 + 69.8662 7242.1377 + 69.9163 7241.5732 + 69.9662 7241.0088 + 70.0163 7240.4443 + 70.0663 7239.8799 + 70.1162 7239.3159 + 70.1663 7238.7515 + 70.2162 7238.1870 + 70.2663 7237.6226 + 70.3163 7237.0581 + 70.3662 7236.4941 + 70.4163 7235.9297 + 70.4662 7235.3652 + 70.5163 7234.8008 + 70.5663 7234.2363 + 70.6162 7233.6719 + 70.6663 7233.1074 + 70.7162 7232.5435 + 70.7663 7231.9790 + 70.8163 7231.4146 + 70.8662 7230.8501 + 70.9163 7230.2856 + 70.9662 7229.7217 + 71.0163 7229.1572 + 71.0663 7228.5928 + 71.1162 7228.0283 + 71.1663 7227.4639 + 71.2162 7226.8994 + 71.2663 7226.3350 + 71.3163 7225.7710 + 71.3662 7225.2065 + 71.4163 7224.6421 + 71.4662 7224.0776 + 71.5163 7223.5132 + 71.5663 7222.9487 + 71.6162 7222.3848 + 71.6663 7221.8203 + 71.7162 7221.2559 + 71.7663 7220.6914 + 71.8163 7220.1270 + 71.8662 7219.5630 + 71.9163 7218.9985 + 71.9662 7218.4341 + 72.0163 7217.8696 + 72.0663 7217.3052 + 72.1162 7216.7407 + 72.1663 7216.1763 + 72.2162 7215.6123 + 72.2663 7215.0479 + 72.3163 7214.4834 + 72.3662 7213.9189 + 72.4163 7213.3545 + 72.4662 7212.7905 + 72.5163 7212.2261 + 72.5663 7211.6616 + 72.6162 7211.0972 + 72.6663 7210.5327 + 72.7162 7209.9683 + 72.7663 7209.4038 + 72.8163 7208.8398 + 72.8662 7208.2754 + 72.9163 7207.7109 + 72.9662 7207.1465 + 73.0163 7206.5820 + 73.0663 7206.0176 + 73.1162 7205.4536 + 73.1663 7204.8892 + 73.2162 7204.3247 + 73.2663 7203.7603 + 73.3163 7203.1958 + 73.3662 7202.6318 + 73.4163 7202.0674 + 73.4662 7201.5029 + 73.5163 7200.9385 + 73.5663 7200.3740 + 73.6162 7199.8096 + 73.6663 7199.2451 + 73.7162 7198.6812 + 73.7663 7198.1167 + 73.8163 7197.5522 + 73.8662 7196.9878 + 73.9163 7196.4233 + 73.9662 7195.8594 + 74.0163 7195.2949 + 74.0663 7194.7305 + 74.1162 7194.1660 + 74.1663 7193.6016 + 74.2162 7193.0371 + 74.2663 7192.4727 + 74.3163 7191.9087 + 74.3662 7191.3442 + 74.4163 7190.7798 + 74.4662 7190.2153 + 74.5163 7189.6509 + 74.5663 7189.0864 + 74.6162 7188.5225 + 74.6663 7187.9580 + 74.7162 7187.3936 + 74.7663 7186.8291 + 74.8163 7186.2646 + 74.8662 7185.7007 + 74.9163 7185.1362 + 74.9662 7184.5718 + 75.0163 7184.0073 + 75.0663 7183.4429 + 75.1162 7182.8784 + 75.1663 7182.3140 + 75.2162 7181.7500 + 75.2663 7181.1855 + 75.3163 7180.6211 + 75.3662 7180.0566 + 75.4163 7179.4922 + 75.4662 7178.9282 + 75.5163 7178.3638 + 75.5663 7177.7993 + 75.6162 7177.2349 + 75.6663 7176.6704 + 75.7162 7176.1060 + 75.7663 7175.5415 + 75.8163 7174.9775 + 75.8662 7174.4131 + 75.9163 7173.8486 + 75.9662 7173.2842 + 76.0163 7172.7197 + 76.0663 7172.1553 + 76.1162 7171.5913 + 76.1663 7171.0269 + 76.2162 7170.4624 + 76.2663 7169.8979 + 76.3163 7169.3335 + 76.3662 7168.7695 + 76.4163 7168.2051 + 76.4662 7167.6406 + 76.5163 7167.0762 + 76.5663 7166.5117 + 76.6162 7165.9473 + 76.6663 7165.3828 + 76.7162 7164.8188 + 76.7663 7164.2544 + 76.8163 7163.6899 + 76.8662 7163.1255 + 76.9163 7162.5610 + 76.9662 7161.9971 + 77.0163 7161.4326 + 77.0663 7160.8682 + 77.1162 7160.3037 + 77.1663 7159.7393 + 77.2162 7159.1748 + 77.2663 7158.6104 + 77.3163 7158.0464 + 77.3662 7157.4819 + 77.4163 7156.9175 + 77.4662 7156.3530 + 77.5163 7155.7886 + 77.5663 7155.2241 + 77.6162 7154.6602 + 77.6663 7154.0957 + 77.7162 7153.5312 + 77.7663 7152.9668 + 77.8163 7152.4023 + 77.8662 7151.8384 + 77.9163 7151.2739 + 77.9662 7150.7095 + 78.0163 7150.1450 + 78.0663 7149.5806 + 78.1162 7149.0161 + 78.1663 7148.4517 + 78.2162 7147.8877 + 78.2663 7147.3232 + 78.3163 7146.7588 + 78.3662 7146.1943 + 78.4163 7145.6299 + 78.4662 7145.0659 + 78.5163 7144.5015 + 78.5663 7143.9370 + 78.6162 7143.3726 + 78.6663 7142.8081 + 78.7162 7142.2437 + 78.7663 7141.6792 + 78.8163 7141.1152 + 78.8662 7140.5508 + 78.9163 7139.9863 + 78.9662 7139.4219 + 79.0163 7138.8574 + 79.0663 7138.2930 + 79.1162 7137.7290 + 79.1663 7137.1646 + 79.2162 7136.6001 + 79.2663 7136.0356 + 79.3163 7135.4712 + 79.3662 7134.9072 + 79.4163 7134.3428 + 79.4662 7133.7783 + 79.5163 7133.2139 + 79.5663 7132.6494 + 79.6162 7132.0850 + 79.6663 7131.5205 + 79.7162 7130.9565 + 79.7663 7130.3921 + 79.8163 7129.8276 + 79.8662 7129.2632 + 79.9163 7128.6987 + 79.9662 7128.1348 + 80.0163 7127.5703 + 80.0663 7127.0059 + 80.1162 7126.4414 + 80.1663 7125.8770 + 80.2162 7125.3125 + 80.2663 7124.7480 + 80.3163 7124.1841 + 80.3662 7123.6196 + 80.4163 7123.0552 + 80.4662 7122.4907 + 80.5163 7121.9263 + 80.5663 7121.3618 + 80.6162 7120.7979 + 80.6663 7120.2334 + 80.7162 7119.6689 + 80.7663 7119.1045 + 80.8163 7118.5400 + 80.8662 7117.9761 + 80.9163 7117.4116 + 80.9662 7116.8472 + 81.0163 7116.2827 + 81.0663 7115.7183 + 81.1162 7115.1538 + 81.1663 7114.5894 + 81.2162 7114.0254 + 81.2663 7113.4609 + 81.3163 7112.8965 + 81.3662 7111.7900 + 81.4163 7110.0146 + 81.4662 7108.2402 + 81.5163 7106.4648 + 81.5663 7104.6899 + 81.6162 7102.9150 + 81.6663 7101.1401 + 81.7162 7099.3652 + 81.7663 7097.5903 + 81.8163 7095.8154 + 81.8662 7094.0405 + 81.9163 7092.2656 + 81.9662 7090.4907 + 82.0163 7088.7158 + 82.0663 7086.9409 + 82.1162 7085.1660 + 82.1663 7083.3911 + 82.2162 7081.6162 + 82.2663 7079.8413 + 82.3163 7078.0664 + 82.3662 7076.2915 + 82.4163 7074.5166 + 82.4662 7072.7417 + 82.5163 7070.9668 + 82.5663 7069.1914 + 82.6162 7067.4170 + 82.6663 7065.6416 + 82.7162 7063.8672 + 82.7663 7062.0923 + 82.8163 7060.3169 + 82.8662 7058.5425 + 82.9163 7056.7671 + 82.9662 7054.9927 + 83.0163 7053.2173 + 83.0663 7051.4424 + 83.1162 7049.6675 + 83.1663 7047.8926 + 83.2162 7046.1177 + 83.2663 7044.3428 + 83.3163 7042.5679 + 83.3662 7040.7930 + 83.4163 7039.0181 + 83.4662 7037.2432 + 83.5163 7035.4683 + 83.5663 7033.6934 + 83.6162 7031.9185 + 83.6663 7030.1436 + 83.7162 7028.3687 + 83.7663 7026.5938 + 83.8163 7024.8188 + 83.8662 7023.0439 + 83.9163 7021.2690 + 83.9662 7019.4941 + 84.0163 7017.7192 + 84.0663 7015.9443 + 84.1162 7014.1694 + 84.1663 7012.3945 + 84.2162 7010.6196 + 84.2663 7008.8447 + 84.3163 7007.0693 + 84.3662 7005.2949 + 84.4163 7003.5195 + 84.4662 7001.7451 + 84.5163 6999.9697 + 84.5663 6998.1948 + 84.6162 6996.4199 + 84.6663 6994.6450 + 84.7162 6992.8706 + 84.7663 6991.0952 + 84.8163 6989.3203 + 84.8662 6987.5454 + 84.9163 6985.7705 + 84.9662 6983.9956 + 85.0163 6982.2207 + 85.0663 6980.4458 + 85.1162 6978.6709 + 85.1663 6976.8960 + 85.2162 6975.1211 + 85.2663 6973.3462 + 85.3163 6971.5713 + 85.3662 6969.7964 + 85.4163 6968.0215 + 85.4662 6966.2466 + 85.5163 6964.4717 + 85.5663 6962.6968 + 85.6162 6960.9219 + 85.6663 6959.1470 + 85.7162 6957.3721 + 85.7663 6955.5972 + 85.8163 6953.8218 + 85.8662 6952.0474 + 85.9163 6950.2720 + 85.9662 6948.4976 + 86.0163 6946.7227 + 86.0663 6944.9473 + 86.1162 6943.1729 + 86.1663 6941.3975 + 86.2162 6939.6230 + 86.2663 6937.8477 + 86.3163 6936.0728 + 86.3662 6934.2979 + 86.4163 6932.5229 + 86.4662 6930.7480 + 86.5163 6928.9731 + 86.5663 6927.1982 + 86.6162 6925.4233 + 86.6663 6923.6484 + 86.7162 6921.8735 + 86.7663 6920.0986 + 86.8163 6918.3237 + 86.8662 6916.5488 + 86.9163 6914.7739 + 86.9662 6912.9990 + 87.0163 6911.2241 + 87.0663 6909.4492 + 87.1162 6907.6743 + 87.1663 6905.8994 + 87.2162 6904.1245 + 87.2663 6902.3496 + 87.3163 6900.5742 + 87.3662 6898.7998 + 87.4163 6897.0249 + 87.4662 6895.2500 + 87.5163 6893.4751 + 87.5663 6891.6997 + 87.6162 6889.9253 + 87.6663 6888.1499 + 87.7162 6886.3755 + 87.7663 6884.6001 + 87.8163 6882.8252 + 87.8662 6881.0508 + 87.9163 6879.2754 + 87.9662 6877.5010 + 88.0163 6875.7256 + 88.0663 6873.9507 + 88.1162 6872.1758 + 88.1663 6870.4009 + 88.2162 6868.6260 + 88.2663 6866.8511 + 88.3163 6865.0762 + 88.3662 6863.3013 + 88.4163 6861.5264 + 88.4662 6859.7515 + 88.5163 6857.9766 + 88.5663 6856.2017 + 88.6162 6854.4268 + 88.6663 6852.6519 + 88.7162 6850.8770 + 88.7663 6849.1021 + 88.8163 6847.3359 + 88.8662 6846.6533 + 88.9163 6845.9707 + 88.9662 6845.2881 + 89.0163 6844.6055 + 89.0663 6843.9224 + 89.1162 6843.2397 + 89.1663 6842.5571 + 89.2162 6841.8745 + 89.2663 6841.1919 + 89.3163 6840.5093 + 89.3662 6839.8267 + 89.4163 6839.1440 + 89.4662 6838.4614 + 89.5163 6837.7788 + 89.5663 6837.0962 + 89.6162 6836.4136 + 89.6663 6835.7310 + 89.7162 6835.0483 + 89.7663 6834.3657 + 89.8163 6833.6826 + 89.8662 6833.0005 + 89.9163 6832.3174 + 89.9662 6831.6348 + 90.0163 6830.9521 + 90.0663 6830.2695 + 90.1162 6829.5869 + 90.1663 6828.9043 + 90.2162 6828.2217 + 90.2663 6827.5391 + 90.3163 6826.8564 + 90.3662 6826.1738 + 90.4163 6825.4912 + 90.4662 6824.8086 + 90.5163 6824.1260 + 90.5663 6823.4434 + 90.6162 6822.7607 + 90.6663 6822.0781 + 90.7162 6821.3955 + 90.7663 6820.7124 + 90.8163 6820.0298 + 90.8662 6819.3472 + 90.9163 6818.6646 + 90.9662 6817.9819 + 91.0163 6817.2993 + 91.0663 6816.6167 + 91.1162 6815.9341 + 91.1663 6815.2515 + 91.2162 6814.5688 + 91.2663 6813.8862 + 91.3163 6813.2036 + 91.3662 6812.5210 + 91.4163 6811.8384 + 91.4662 6811.1558 + 91.5163 6810.4731 + 91.5663 6809.7900 + 91.6162 6809.1074 + 91.6663 6808.4248 + 91.7162 6807.7422 + 91.7663 6807.0596 + 91.8163 6806.3770 + 91.8662 6805.6943 + 91.9163 6805.0117 + 91.9662 6804.3291 + 92.0163 6803.6465 + 92.0663 6802.9639 + 92.1162 6802.2812 + 92.1663 6801.5986 + 92.2162 6800.9160 + 92.2663 6800.2334 + 92.3163 6799.5503 + 92.3662 6798.8682 + 92.4163 6798.1851 + 92.4662 6797.5024 + 92.5163 6796.8198 + 92.5663 6796.1372 + 92.6162 6795.4546 + 92.6663 6794.7720 + 92.7162 6794.0894 + 92.7663 6793.4067 + 92.8163 6792.7241 + 92.8662 6792.0415 + 92.9163 6791.3589 + 92.9662 6790.6763 + 93.0163 6789.9937 + 93.0663 6789.3110 + 93.1162 6788.6284 + 93.1663 6787.9453 + 93.2162 6787.2632 + 93.2663 6786.5801 + 93.3163 6785.8975 + 93.3662 6785.2148 + 93.4163 6784.5322 + 93.4662 6783.8496 + 93.5163 6783.1670 + 93.5663 6782.4844 + 93.6162 6781.8018 + 93.6663 6781.1191 + 93.7162 6780.4365 + 93.7663 6779.7539 + 93.8163 6779.0713 + 93.8662 6778.3887 + 93.9163 6777.7061 + 93.9662 6777.0234 + 94.0163 6776.3408 + 94.0663 6775.6577 + 94.1162 6774.9751 + 94.1663 6774.2925 + 94.2162 6773.6099 + 94.2663 6772.9272 + 94.3163 6772.2446 + 94.3662 6770.7563 + 94.4163 6768.8496 + 94.4662 6766.9429 + 94.5163 6765.0356 + 94.5663 6763.1284 + 94.6162 6761.2217 + 94.6663 6759.3145 + 94.7162 6757.4077 + 94.7663 6755.5005 + 94.8163 6753.5938 + 94.8662 6751.6870 + 94.9163 6749.7798 + 94.9662 6747.8730 + 95.0163 6745.9658 + 95.0663 6744.0586 + 95.1162 6742.1519 + 95.1663 6740.2451 + 95.2162 6738.3379 + 95.2663 6736.4312 + 95.3163 6734.5239 + 95.3662 6732.6172 + 95.4163 6730.7100 + 95.4662 6728.8032 + 95.5163 6726.8960 + 95.5663 6724.9893 + 95.6162 6723.0820 + 95.6663 6721.1753 + 95.7162 6719.2686 + 95.7663 6717.3613 + 95.8163 6715.4541 + 95.8662 6713.5474 + 95.9163 6711.6401 + 95.9662 6709.7334 + 96.0163 6707.8267 + 96.0663 6705.9194 + 96.1162 6704.0127 + 96.1663 6702.1055 + 96.2162 6700.1987 + 96.2663 6698.2915 + 96.3163 6696.3843 + 96.3662 6694.4775 + 96.4163 6692.5708 + 96.4662 6690.6641 + 96.5163 6688.7568 + 96.5663 6686.8496 + 96.6162 6684.9429 + 96.6663 6683.0356 + 96.7162 6681.1289 + 96.7663 6679.2217 + 96.8163 6677.3149 + 96.8662 6675.4082 + 96.9163 6673.5010 + 96.9662 6671.5942 + 97.0163 6669.6870 + 97.0663 6667.7798 + 97.1162 6665.8730 + 97.1663 6663.9663 + 97.2162 6662.0591 + 97.2663 6660.1523 + 97.3163 6658.2451 + 97.3662 6656.3384 + 97.4163 6654.4312 + 97.4662 6652.5244 + 97.5163 6650.6172 + 97.5663 6648.7104 + 97.6162 6646.8032 + 97.6663 6644.8965 + 97.7162 6642.9897 + 97.7663 6641.0825 + 97.8163 6639.1753 + 97.8662 6637.2686 + 97.9163 6635.3613 + 97.9662 6633.4546 + 98.0163 6631.5479 + 98.0663 6629.6406 + 98.1162 6627.7339 + 98.1663 6625.8267 + 98.2162 6625.0273 + 98.2663 6624.3271 + 98.3163 6623.6265 + 98.3662 6622.9263 + 98.4163 6622.2256 + 98.4662 6621.5254 + 98.5163 6620.8247 + 98.5663 6620.1245 + 98.6162 6619.4238 + 98.6663 6618.7236 + 98.7162 6618.0229 + 98.7663 6617.3228 + 98.8163 6616.6221 + 98.8662 6615.9219 + 98.9163 6615.2212 + 98.9662 6614.5210 + 99.0163 6613.8203 + 99.0663 6613.1201 + 99.1162 6612.4194 + 99.1663 6611.7192 + 99.2162 6611.0186 + 99.2663 6610.3184 + 99.3163 6609.6177 + 99.3662 6608.9175 + 99.4163 6608.2168 + 99.4662 6607.5166 + 99.5163 6606.8159 + 99.5663 6606.1157 + 99.6162 6605.4150 + 99.6663 6604.7148 + 99.7162 6604.0142 + 99.7663 6603.3140 + 99.8163 6602.6133 + 99.8662 6601.9131 + 99.9163 6601.2124 + 99.9662 6600.5122 + 100.0163 6599.8115 + 100.0663 6599.1113 + 100.1162 6598.4106 + 100.1663 6597.7104 + 100.2162 6597.0098 + 100.2663 6596.3096 + 100.3163 6595.6089 + 100.3662 6594.9087 + 100.4163 6594.2080 + 100.4662 6593.5078 + 100.5163 6592.8071 + 100.5663 6592.1069 + 100.6162 6591.4062 + 100.6663 6590.7061 + 100.7162 6590.0059 + 100.7663 6589.3052 + 100.8163 6588.6045 + 100.8662 6587.9043 + 100.9163 6587.2036 + 100.9662 6586.5034 + 101.0163 6585.5967 + 101.0663 6584.3452 + 101.1162 6583.0933 + 101.1663 6581.8413 + 101.2162 6580.5898 + 101.2663 6579.3379 + 101.3163 6578.0864 + 101.3662 6576.8345 + 101.4163 6575.5830 + 101.4662 6574.3311 + 101.5163 6573.0791 + 101.5663 6571.8276 + 101.6162 6570.5757 + 101.6663 6569.3242 + 101.7162 6568.0723 + 101.7663 6566.8208 + 101.8163 6565.5688 + 101.8662 6564.3169 + 101.9163 6563.0654 + 101.9662 6561.8135 + 102.0163 6560.5620 + 102.0663 6559.3101 + 102.1162 6558.0586 + 102.1663 6556.8066 + 102.2162 6555.5552 + 102.2663 6554.3032 + 102.3163 6553.0513 + 102.3662 6551.7998 + 102.4163 6550.5479 + 102.4662 6549.2964 + 102.5163 6548.0444 + 102.5663 6546.7925 + 102.6162 6545.5410 + 102.6663 6544.2891 + 102.7162 6543.0376 + 102.7663 6541.7856 + 102.8163 6540.5337 + 102.8662 6539.2822 + 102.9163 6538.0303 + 102.9662 6536.7788 + 103.0163 6535.5269 + 103.0663 6534.2749 + 103.1162 6533.0234 + 103.1663 6531.7715 + 103.2162 6530.5200 + 103.2663 6529.2681 + 103.3163 6528.0161 + 103.3662 6526.7646 + 103.4163 6525.5127 + 103.4662 6524.2612 + 103.5163 6523.0093 + 103.5663 6521.7578 + 103.6162 6520.5059 + 103.6663 6519.2539 + 103.7162 6518.0024 + 103.7663 6516.7505 + 103.8163 6515.4990 + 103.8662 6514.2471 + 103.9163 6512.9956 + 103.9662 6511.7437 + 104.0163 6510.4922 + 104.0663 6509.2402 + 104.1162 6507.9883 + 104.1663 6506.7368 + 104.2162 6505.4849 + 104.2663 6504.2334 + 104.3163 6502.9814 + 104.3662 6501.8350 + 104.4163 6500.7271 + 104.4662 6499.6196 + 104.5163 6498.5117 + 104.5663 6497.4038 + 104.6162 6496.2959 + 104.6663 6495.1880 + 104.7162 6494.0801 + 104.7663 6492.9722 + 104.8163 6491.8643 + 104.8662 6490.7563 + 104.9163 6489.6484 + 104.9662 6488.5410 + 105.0163 6487.4331 + 105.0663 6486.3252 + 105.1162 6485.2173 + 105.1663 6484.1094 + 105.2162 6483.0015 + 105.2663 6481.8936 + 105.3163 6480.7856 + 105.3662 6479.6782 + 105.4163 6478.5703 + 105.4662 6477.4624 + 105.5163 6476.3545 + 105.5663 6475.2466 + 105.6162 6474.1387 + 105.6663 6473.0308 + 105.7162 6471.9229 + 105.7663 6470.8149 + 105.8163 6469.7070 + 105.8662 6468.5996 + 105.9163 6467.4917 + 105.9662 6466.3838 + 106.0163 6465.2759 + 106.0663 6464.1680 + 106.1162 6463.0601 + 106.1663 6461.9521 + 106.2162 6460.8447 + 106.2663 6459.7368 + 106.3163 6458.6289 + 106.3662 6457.5210 + 106.4163 6456.4131 + 106.4662 6455.3052 + 106.5163 6454.1973 + 106.5663 6453.0894 + 106.6162 6451.9814 + 106.6663 6450.8735 + 106.7162 6449.7661 + 106.7663 6448.6582 + 106.8163 6447.5503 + 106.8662 6446.4424 + 106.9163 6445.3345 + 106.9662 6444.2266 + 107.0163 6443.1187 + 107.0663 6442.0107 + 107.1162 6440.9033 + 107.1663 6439.7954 + 107.2162 6438.6875 + 107.2663 6437.5796 + 107.3163 6436.4717 + 107.3662 6435.3638 + 107.4163 6434.2559 + 107.4662 6433.1479 + 107.5163 6432.0400 + 107.5663 6430.9321 + 107.6162 6429.8247 + 107.6663 6428.7168 + 107.7162 6427.6089 + 107.7663 6426.5010 + 107.8163 6425.3931 + 107.8662 6424.2852 + 107.9163 6423.1772 + 107.9662 6422.0698 + 108.0163 6420.9619 + 108.0663 6419.8540 + 108.1162 6418.7461 + 108.1663 6417.6382 + 108.2162 6416.5303 + 108.2663 6415.4224 + 108.3163 6414.3145 + 108.3662 6413.2065 + 108.4163 6412.0986 + 108.4662 6410.9912 + 108.5163 6409.8833 + 108.5663 6408.7754 + 108.6162 6407.6675 + 108.6663 6406.5596 + 108.7162 6405.4517 + 108.7663 6405.2930 + 108.8163 6405.9111 + 108.8662 6406.5293 + 108.9163 6407.1475 + 108.9662 6407.7651 + 109.0163 6408.3833 + 109.0663 6409.0015 + 109.1162 6409.6196 + 109.1663 6410.2378 + 109.2162 6410.8560 + 109.2663 6411.4736 + 109.3163 6412.0918 + 109.3662 6412.7100 + 109.4163 6413.3281 + 109.4662 6413.9463 + 109.5163 6414.5645 + 109.5663 6415.1826 + 109.6162 6415.8003 + 109.6663 6416.4185 + 109.7162 6417.0366 + 109.7663 6417.6548 + 109.8163 6418.2729 + 109.8662 6418.8906 + 109.9163 6419.5088 + 109.9662 6420.1270 + 110.0163 6420.7451 + 110.0663 6421.3633 + 110.1162 6421.9814 + 110.1663 6422.5996 + 110.2162 6423.2173 + 110.2663 6423.8354 + 110.3163 6424.4536 + 110.3662 6425.0718 + 110.4163 6425.6899 + 110.4662 6426.3076 + 110.5163 6426.9258 + 110.5663 6427.5439 + 110.6162 6428.1621 + 110.6663 6428.7803 + 110.7162 6429.3984 + 110.7663 6430.0166 + 110.8163 6430.6343 + 110.8662 6431.2524 + 110.9163 6431.8706 + 110.9662 6432.4888 + 111.0163 6433.1069 + 111.0663 6433.7251 + 111.1162 6434.3428 + 111.1663 6434.9609 + 111.2162 6435.5791 + 111.2663 6436.1973 + 111.3163 6436.8154 + 111.3662 6437.4336 + 111.4163 6438.0513 + 111.4662 6438.6694 + 111.5163 6439.2876 + 111.5663 6439.9058 + 111.6162 6440.5239 + 111.6663 6441.1421 + 111.7162 6441.7598 + 111.7663 6442.3779 + 111.8163 6442.9961 + 111.8662 6443.6143 + 111.9163 6444.2324 + 111.9662 6444.8501 + 112.0163 6445.4683 + 112.0663 6446.0864 + 112.1162 6446.7046 + 112.1663 6447.3228 + 112.2162 6447.9409 + 112.2663 6448.5591 + 112.3163 6449.1768 + 112.3662 6449.7949 + 112.4163 6450.4131 + 112.4662 6451.0312 + 112.5163 6451.6494 + 112.5663 6452.2676 + 112.6162 6452.8853 + 112.6663 6453.5034 + 112.7162 6454.1216 + 112.7663 6454.7397 + 112.8163 6455.3579 + 112.8662 6455.9761 + 112.9163 6456.5938 + 112.9662 6457.2119 + 113.0163 6457.8301 + 113.0663 6458.4482 + 113.1162 6459.0664 + 113.1663 6459.6846 + 113.2162 6460.3022 + 113.2663 6460.9204 + 113.3163 6461.5386 + 113.3662 6462.1567 + 113.4163 6462.7749 + 113.4662 6463.3931 + 113.5163 6464.0107 + 113.5663 6464.6289 + 113.6162 6465.2471 + 113.6663 6465.8652 + 113.7162 6466.4834 + 113.7663 6467.1016 + 113.8163 6467.7197 + 113.8662 6468.3374 + 113.9163 6468.9556 + 113.9662 6469.5737 + 114.0163 6470.1919 + 114.0663 6470.8101 + 114.1162 6471.4277 + 114.1663 6472.0459 + 114.2162 6472.6641 + 114.2663 6473.2822 + 114.3163 6473.9004 + 114.3662 6474.5186 + 114.4163 6475.1367 + 114.4662 6475.7544 + 114.5163 6476.3726 + 114.5663 6476.9907 + 114.6162 6477.6089 + 114.6663 6478.2271 + 114.7162 6478.8447 + 114.7663 6479.4629 + 114.8163 6480.0811 + 114.8662 6480.6992 + 114.9163 6481.3174 + 114.9662 6481.9355 + 115.0163 6482.5537 + 115.0663 6483.1714 + 115.1162 6483.7896 + 115.1663 6484.4077 + 115.2162 6485.0259 + 115.2663 6485.6440 + 115.3163 6486.2622 + 115.3662 6486.8799 + 115.4163 6487.4980 + 115.4662 6488.1162 + 115.5163 6488.7344 + 115.5663 6489.3525 + 115.6162 6489.9707 + 115.6663 6490.5884 + 115.7162 6491.2065 + 115.7663 6491.8247 + 115.8163 6492.4429 + 115.8662 6493.0610 + 115.9163 6493.6792 + 115.9662 6494.2969 + 116.0163 6494.9150 + 116.0663 6495.5332 + 116.1162 6494.4331 + 116.1663 6492.4233 + 116.2162 6490.4146 + 116.2663 6488.4048 + 116.3163 6486.3955 + 116.3662 6484.3862 + 116.4163 6482.3770 + 116.4662 6480.3677 + 116.5163 6478.3579 + 116.5663 6476.3486 + 116.6162 6474.3394 + 116.6663 6472.3301 + 116.7162 6470.3208 + 116.7663 6468.3115 + 116.8163 6466.3018 + 116.8662 6464.2930 + 116.9163 6462.2832 + 116.9662 6460.2739 + 117.0163 6458.2646 + 117.0663 6456.2554 + 117.1162 6454.2461 + 117.1663 6452.2363 + 117.2162 6450.2275 + 117.2663 6448.2178 + 117.3163 6446.2085 + 117.3662 6444.1992 + 117.4163 6442.1899 + 117.4662 6440.1807 + 117.5163 6438.1714 + 117.5663 6436.1616 + 117.6162 6434.1523 + 117.6663 6432.1431 + 117.7162 6430.1338 + 117.7663 6428.1245 + 117.8163 6426.1147 + 117.8662 6424.1060 + 117.9163 6422.0962 + 117.9662 6420.0874 + 118.0163 6418.0776 + 118.0663 6416.0684 + 118.1162 6414.0591 + 118.1663 6412.0498 + 118.2162 6410.0405 + 118.2663 6408.0308 + 118.3163 6406.0215 + 118.3662 6404.0122 + 118.4163 6402.0029 + 118.4662 6399.9937 + 118.5163 6397.9844 + 118.5663 6395.9746 + 118.6162 6393.9658 + 118.6663 6391.9561 + 118.7162 6389.9468 + 118.7663 6387.9375 + 118.8163 6385.9282 + 118.8662 6383.9189 + 118.9163 6381.9092 + 118.9662 6379.9004 + 119.0163 6377.8906 + 119.0663 6375.8813 + 119.1162 6373.8721 + 119.1663 6371.8628 + 119.2162 6369.8535 + 119.2663 6367.8442 + 119.3163 6365.8345 + 119.3662 6363.8252 + 119.4163 6361.8159 + 119.4662 6359.8066 + 119.5163 6357.7974 + 119.5663 6355.7876 + 119.6162 6353.7788 + 119.6663 6351.7690 + 119.7162 6349.7598 + 119.7663 6347.7505 + 119.8163 6345.7412 + 119.8662 6343.7319 + 119.9163 6341.7227 + 119.9662 6339.7134 + 120.0163 6337.7036 + 120.0663 6335.6943 + 120.1162 6333.6851 + 120.1663 6331.6758 + 120.2162 6329.6665 + 120.2663 6327.6572 + 120.3163 6325.6475 + 120.3662 6323.6387 + 120.4163 6321.6289 + 120.4662 6319.6196 + 120.5163 6317.6104 + 120.5663 6315.6011 + 120.6162 6313.5918 + 120.6663 6311.5820 + 120.7162 6309.5732 + 120.7663 6307.5635 + 120.8163 6305.5542 + 120.8662 6303.5449 + 120.9163 6301.5356 + 120.9662 6299.5264 + 121.0163 6297.5171 + 121.0663 6295.5073 + 121.1162 6293.4980 + 121.1663 6291.4888 + 121.2162 6289.4795 + 121.2663 6287.4702 + 121.3163 6285.4604 + 121.3662 6283.4517 + 121.4163 6281.4419 + 121.4662 6279.4326 + 121.5163 6278.0298 + 121.5663 6278.2173 + 121.6162 6278.4043 + 121.6663 6278.5918 + 121.7162 6278.7788 + 121.7663 6278.9663 + 121.8163 6279.1538 + 121.8662 6279.3408 + 121.9163 6279.5283 + 121.9662 6279.7153 + 122.0163 6279.9028 + 122.0663 6280.0903 + 122.1162 6280.2773 + 122.1663 6280.4648 + 122.2162 6280.6519 + 122.2663 6280.8394 + 122.3163 6281.0269 + 122.3662 6281.2139 + 122.4163 6281.4014 + 122.4662 6281.5889 + 122.5163 6281.7759 + 122.5663 6281.9634 + 122.6162 6282.1504 + 122.6663 6282.3379 + 122.7162 6282.5254 + 122.7663 6282.7124 + 122.8163 6282.8999 + 122.8662 6283.0874 + 122.9163 6283.2744 + 122.9662 6283.4619 + 123.0163 6283.6489 + 123.0663 6283.8364 + 123.1162 6284.0239 + 123.1663 6284.2109 + 123.2162 6284.3984 + 123.2663 6284.5854 + 123.3163 6284.7729 + 123.3662 6284.9604 + 123.4163 6285.1475 + 123.4662 6285.3350 + 123.5163 6285.5225 + 123.5663 6285.7095 + 123.6162 6285.8970 + 123.6663 6286.0840 + 123.7162 6286.2715 + 123.7663 6286.4590 + 123.8163 6286.6460 + 123.8662 6286.8335 + 123.9163 6287.0205 + 123.9662 6287.2080 + 124.0163 6287.3955 + 124.0663 6287.5825 + 124.1162 6287.7700 + 124.1663 6287.9575 + 124.2162 6288.1445 + 124.2663 6288.3320 + 124.3163 6288.5190 + 124.3662 6288.7065 + 124.4163 6288.8940 + 124.4662 6289.0811 + 124.5163 6289.2686 + 124.5663 6289.4556 + 124.6162 6289.6431 + 124.6663 6289.8306 + 124.7162 6290.0176 + 124.7663 6290.2051 + 124.8163 6290.3926 + 124.8662 6290.5796 + 124.9163 6290.7671 + 124.9662 6290.9541 + 125.0163 6291.1416 + 125.0663 6291.3291 + 125.1162 6291.5161 + 125.1663 6291.7036 + 125.2162 6291.8906 + 125.2663 6292.0781 + 125.3163 6292.2656 + 125.3662 6292.4526 + 125.4163 6292.6401 + 125.4662 6292.8276 + 125.5163 6293.0146 + 125.5663 6293.2021 + 125.6162 6293.3892 + 125.6663 6293.5767 + 125.7162 6293.7642 + 125.7663 6293.9512 + 125.8163 6294.1387 + 125.8662 6294.3257 + 125.9163 6294.5132 + 125.9662 6294.7007 + 126.0163 6294.8877 + 126.0663 6295.0752 + 126.1162 6295.2627 + 126.1663 6295.4497 + 126.2162 6295.6372 + 126.2663 6295.8242 + 126.3163 6296.0117 + 126.3662 6296.1992 + 126.4163 6296.3862 + 126.4662 6296.5737 + 126.5163 6296.7607 + 126.5663 6296.9482 + 126.6162 6297.1357 + 126.6663 6297.3228 + 126.7162 6297.5103 + 126.7663 6297.6978 + 126.8163 6297.8848 + 126.8662 6298.0723 + 126.9163 6298.2593 + 126.9662 6298.4468 + 127.0163 6298.6343 + 127.0663 6298.8213 + 127.1162 6299.0088 + 127.1663 6299.1958 + 127.2162 6299.3833 + 127.2663 6299.5708 + 127.3163 6299.7578 + 127.3662 6299.9453 + 127.4163 6300.1328 + 127.4662 6300.3198 + 127.5163 6300.5073 + 127.5663 6300.6943 + 127.6162 6300.8818 + 127.6663 6301.0693 + 127.7162 6301.2563 + 127.7663 6301.4438 + 127.8163 6301.6313 + 127.8662 6301.8184 + 127.9163 6302.0059 + 127.9662 6302.1929 + 128.0163 6302.3804 + 128.0663 6302.5679 + 128.1163 6302.7549 + 128.1662 6302.9424 + 128.2162 6303.1294 + 128.2663 6303.3169 + 128.3163 6303.5044 + 128.3663 6303.6914 + 128.4162 6303.8789 + 128.4662 6304.0659 + 128.5163 6304.2534 + 128.5663 6304.4409 + 128.6163 6304.6279 + 128.6662 6304.8154 + 128.7162 6305.0029 + 128.7663 6305.1899 + 128.8163 6305.3774 + 128.8663 6305.5645 + 128.9162 6305.7520 + 128.9662 6305.9395 + 129.0163 6306.1265 + 129.0663 6306.3140 + 129.1163 6306.5015 + 129.1662 6306.6885 + 129.2162 6306.8760 + 129.2663 6307.0630 + 129.3163 6307.2505 + 129.3663 6307.4380 + 129.4162 6307.6250 + 129.4662 6307.8125 + 129.5163 6307.9995 + 129.5663 6308.1870 + 129.6163 6308.3745 + 129.6662 6308.5615 + 129.7162 6308.7490 + 129.7663 6308.9365 + 129.8163 6309.1235 + 129.8663 6309.3110 + 129.9162 6309.4980 + 129.9662 6309.6855 + 130.0163 6309.8730 + 130.0663 6310.0601 + 130.1163 6310.2476 + 130.1662 6310.4346 + 130.2162 6310.6221 + 130.2663 6310.8096 + 130.3163 6310.9966 + 130.3663 6311.1841 + 130.4162 6311.3711 + 130.4662 6311.5586 + 130.5163 6311.7461 + 130.5663 6311.9331 + 130.6163 6312.1206 + 130.6662 6312.3081 + 130.7162 6312.4951 + 130.7663 6312.6826 + 130.8163 6312.8696 + 130.8663 6313.0571 + 130.9162 6313.2446 + 130.9662 6313.4316 + 131.0163 6313.6191 + 131.0663 6313.8066 + 131.1163 6313.9937 + 131.1662 6314.1812 + 131.2162 6314.3682 + 131.2663 6314.5557 + 131.3163 6315.4883 + 131.3663 6317.5869 + 131.4162 6319.6851 + 131.4662 6321.7837 + 131.5163 6323.8823 + 131.5663 6325.9810 + 131.6163 6328.0801 + 131.6662 6330.1777 + 131.7162 6332.2769 + 131.7663 6334.3755 + 131.8163 6336.4741 + 131.8663 6338.5728 + 131.9162 6340.6709 + 131.9662 6342.7695 + 132.0163 6344.8682 + 132.0663 6346.9668 + 132.1163 6349.0654 + 132.1662 6351.1636 + 132.2162 6353.2622 + 132.2663 6355.3608 + 132.3163 6357.4595 + 132.3663 6359.5581 + 132.4162 6361.6562 + 132.4662 6363.7549 + 132.5163 6365.8535 + 132.5663 6367.9526 + 132.6163 6370.0513 + 132.6662 6372.1489 + 132.7162 6374.2480 + 132.7663 6376.3467 + 132.8163 6378.4453 + 132.8663 6380.5439 + 132.9162 6382.6421 + 132.9662 6384.7407 + 133.0163 6386.8394 + 133.0663 6388.9380 + 133.1163 6391.0366 + 133.1662 6393.1348 + 133.2162 6395.2334 + 133.2663 6397.3320 + 133.3163 6399.4307 + 133.3663 6401.5293 + 133.4162 6403.6274 + 133.4662 6405.7261 + 133.5163 6407.8252 + 133.5663 6409.9238 + 133.6163 6412.0225 + 133.6662 6414.1206 + 133.7162 6416.2192 + 133.7663 6418.3179 + 133.8163 6420.4165 + 133.8663 6422.5151 + 133.9162 6424.6133 + 133.9662 6426.7119 + 134.0163 6428.8105 + 134.0663 6430.9092 + 134.1163 6433.0078 + 134.1662 6435.1060 + 134.2162 6437.2046 + 134.2663 6439.3032 + 134.3163 6441.4019 + 134.3663 6443.5010 + 134.4162 6445.5986 + 134.4662 6447.6973 + 134.5163 6449.7964 + 134.5663 6451.8950 + 134.6163 6453.9937 + 134.6662 6456.0918 + 134.7162 6458.1904 + 134.7663 6460.2891 + 134.8163 6462.3877 + 134.8663 6464.4863 + 134.9162 6466.5845 + 134.9662 6468.6831 + 135.0163 6470.7817 + 135.0663 6472.8804 + 135.1163 6474.9790 + 135.1662 6477.0771 + 135.2162 6479.1758 + 135.2663 6481.2744 + 135.3163 6483.3735 + 135.3663 6485.4722 + 135.4162 6487.5698 + 135.4662 6489.6689 + 135.5163 6491.7676 + 135.5663 6493.8662 + 135.6163 6495.9648 + 135.6662 6498.0630 + 135.7162 6500.1616 + 135.7663 6502.2603 + 135.8163 6504.0566 + 135.8663 6504.0566 + 135.9162 6504.0566 + 135.9662 6504.0566 + 136.0163 6504.0566 + 136.0663 6504.0566 + 136.1163 6504.0566 + 136.1662 6504.0566 + 136.2162 6504.0566 + 136.2663 6504.0566 + 136.3163 6504.0566 + 136.3663 6504.0566 + 136.4162 6504.0566 + 136.4662 6504.0566 + 136.5163 6504.0566 + 136.5663 6504.0566 + 136.6163 6504.0566 + 136.6662 6504.0566 + 136.7162 6504.0566 + 136.7663 6504.0566 + 136.8163 6504.0566 + 136.8663 6504.0566 + 136.9162 6504.0566 + 136.9662 6504.0566 + 137.0163 6504.0566 + 137.0663 6504.0566 + 137.1163 6504.0566 + 137.1662 6504.0566 + 137.2162 6504.0566 + 137.2663 6504.0566 + 137.3163 6504.0566 + 137.3663 6504.0566 + 137.4162 6504.0566 + 137.4662 6504.0566 + 137.5163 6504.0566 + 137.5663 6504.0566 + 137.6163 6504.0566 + 137.6662 6504.0566 + 137.7162 6504.0566 + 137.7663 6504.0566 + 137.8163 6504.0566 + 137.8663 6504.0566 + 137.9162 6504.0566 + 137.9662 6504.0566 + 138.0163 6504.0566 + 138.0663 6504.0566 + 138.1163 6504.0566 + 138.1662 6504.0566 + 138.2162 6504.0566 + 138.2663 6504.0566 + 138.3163 6504.0566 + 138.3663 6504.0566 + 138.4162 6504.0566 + 138.4662 6504.0566 + 138.5163 6504.0566 + 138.5663 6504.0566 + 138.6163 6504.0566 + 138.6662 6504.0566 + 138.7162 6504.0566 + 138.7663 6504.0566 + 138.8163 6504.0566 + 138.8663 6504.0566 + 138.9162 6504.0566 + 138.9662 6504.0566 + 139.0163 6504.0566 + 139.0663 6504.0566 + 139.1163 6504.0566 + 139.1662 6504.0566 + 139.2162 6504.0566 + 139.2663 6504.0566 + 139.3163 6504.0566 + 139.3663 6504.0566 + 139.4162 6504.0566 + 139.4662 6504.0566 + 139.5163 6504.0566 + 139.5663 6504.0566 + 139.6163 6504.0566 + 139.6662 6504.0566 + 139.7162 6504.0566 + 139.7663 6504.0566 + 139.8163 6504.0566 + 139.8663 6504.0566 + 139.9162 6504.0566 + 139.9662 6504.0566 + 140.0163 6504.0566 + 140.0663 6504.0566 + 140.1163 6504.0566 + 140.1662 6504.0566 + 140.2162 6504.0566 + 140.2663 6504.0566 + 140.3163 6504.0566 + 140.3663 6504.0566 + 140.4162 6504.0566 + 140.4662 6504.0566 + 140.5163 6504.0566 + 140.5663 6504.0566 + 140.6163 6504.0566 + 140.6662 6504.0566 + 140.7162 6504.0566 + 140.7663 6504.0566 + 140.8163 6504.0566 + 140.8663 6504.0566 + 140.9162 6504.0566 + 140.9662 6504.0566 + 141.0163 6504.0566 + 141.0663 6504.0566 + 141.1163 6504.0566 + 141.1662 6504.0566 + 141.2162 6504.0566 + 141.2663 6504.0566 + 141.3163 6504.0566 + 141.3663 6504.0566 + 141.4162 6504.0566 + 141.4662 6504.0566 + 141.5163 6504.0566 + 141.5663 6504.0566 + 141.6163 6504.0566 + 141.6662 6504.0566 + 141.7162 6504.0566 + 141.7663 6504.0566 + 141.8163 6504.0566 + 141.8663 6504.0566 + 141.9162 6504.0566 + 141.9662 6504.0566 + 142.0163 6504.0566 + 142.0663 6504.0566 + 142.1163 6504.0566 + 142.1662 6504.0566 + 142.2162 6504.0566 + 142.2663 6504.0566 + 142.3163 6504.0566 + 142.3663 6504.0566 + 142.4162 6504.0566 + 142.4662 6504.0566 + 142.5163 6504.0566 + 142.5663 6504.0566 + 142.6163 6504.0566 + 142.6662 6504.0566 + 142.7162 6504.0566 + 142.7663 6504.0566 + 142.8163 6504.0566 + 142.8663 6504.0566 + 142.9162 6504.0566 + 142.9662 6504.0566 + 143.0163 6504.0566 + 143.0663 6504.0566 + 143.1163 6504.0566 + 143.1662 6504.0566 + 143.2162 6504.0566 + 143.2663 6504.0566 + 143.3163 6504.0566 + 143.3663 6504.0566 + 143.4162 6504.0566 + 143.4662 6504.0566 + 143.5163 6504.0566 + 143.5663 6504.0566 + 143.6163 6504.0566 + 143.6662 6504.0566 + 143.7162 6504.0566 + 143.7663 6504.0566 + 143.8163 6504.0566 + 143.8663 6504.0566 + 143.9162 6504.0566 + 143.9662 6504.0566 + 144.0163 6504.0566 + 144.0663 6504.0566 + 144.1163 6504.0566 + 144.1662 6504.0566 + 144.2162 6504.0566 + 144.2663 6504.0566 + 144.3163 6504.0566 + 144.3663 6504.0566 + 144.4162 6504.0566 + 144.4662 6504.0566 + 144.5163 6504.0566 + 144.5663 6504.0566 + 144.6163 6504.0566 + 144.6662 6504.0566 + 144.7162 6504.0566 + 144.7663 6504.0566 + 144.8163 6504.0566 + 144.8663 6504.0566 + 144.9162 6504.0566 + 144.9662 6504.0566 + 145.0163 6504.0566 + 145.0663 6504.0566 + 145.1163 6504.0566 + 145.1662 6504.0566 + 145.2162 6504.0566 + 145.2663 6504.0566 + 145.3163 6504.0566 + 145.3663 6504.0566 + 145.4162 6504.0566 + 145.4662 6504.0566 + 145.5163 6504.0566 + 145.5663 6504.0566 + 145.6163 6504.0566 + 145.6662 6504.0566 + 145.7162 6504.0566 + 145.7663 6504.0566 + 145.8163 6504.0566 + 145.8663 6504.0566 + 145.9162 6504.0566 + 145.9662 6504.0566 + 146.0163 6504.0566 + 146.0663 6504.0566 + 146.1163 6504.0566 + 146.1662 6504.0566 + 146.2162 6504.0566 + 146.2663 6504.0566 + 146.3163 6504.0566 + 146.3663 6504.0566 + 146.4162 6504.0566 + 146.4662 6504.0566 + 146.5163 6504.0566 + 146.5663 6504.0566 + 146.6163 6504.0566 + 146.6662 6504.0566 + 146.7162 6504.0566 + 146.7663 6504.0566 + 146.8163 6504.0566 + 146.8663 6504.0566 + 146.9162 6504.0566 + 146.9662 6504.0566 + 147.0163 6504.0566 + 147.0663 6504.0566 + 147.1163 6504.0566 + 147.1662 6504.0566 + 147.2162 6504.0566 + 147.2663 6504.0566 + 147.3163 6504.0566 + 147.3663 6504.0566 + 147.4162 6504.0566 + 147.4662 6504.0566 + 147.5163 6504.0566 + 147.5663 6504.0566 + 147.6163 6504.0566 + 147.6662 6504.0566 + 147.7162 6504.0566 + 147.7663 6504.0566 + 147.8163 6504.0566 + 147.8663 6504.0566 + 147.9162 6504.0566 + 147.9662 6504.0566 + 148.0163 6504.0566 + 148.0663 6504.0566 + 148.1163 6504.0566 + 148.1662 6504.0566 + 148.2162 6504.0566 + 148.2663 6504.0566 + 148.3163 6504.0566 + 148.3663 6504.0566 + 148.4162 6504.0566 + 148.4662 6504.0566 + 148.5163 6504.0566 + 148.5663 6504.0566 + 148.6163 6504.0566 + 148.6662 6504.0566 + 148.7162 6504.0566 + 148.7663 6504.0566 + 148.8163 6504.0566 + 148.8663 6504.0566 + 148.9162 6504.0566 + 148.9662 6504.0566 + 149.0163 6504.0566 + 149.0663 6504.0566 + 149.1163 6504.0566 + 149.1662 6504.0566 + 149.2162 6504.0566 + 149.2663 6504.0566 + 149.3163 6504.0566 + 149.3663 6504.0566 + 149.4162 6504.0566 + 149.4662 6504.0566 + 149.5163 6504.0566 + 149.5663 6504.0566 + 149.6163 6504.0566 + 149.6662 6504.0566 + 149.7162 6504.0566 + 149.7663 6504.0566 + 149.8163 6504.0566 + 149.8663 6504.0566 + 149.9162 6504.0566 + 149.9662 6504.0566 + 150.0163 6504.0566 + 150.0663 6504.0566 + 150.1163 6504.0566 + 150.1662 6504.0566 + 150.2162 6504.0566 + 150.2663 6504.0566 + 150.3163 6504.0566 + 150.3663 6504.0566 + 150.4162 6504.0566 + 150.4662 6504.0566 + 150.5163 6504.0566 + 150.5663 6504.0566 + 150.6163 6504.0566 + 150.6662 6504.0566 + 150.7162 6504.0566 + 150.7663 6504.0566 + 150.8163 6504.0566 + 150.8663 6504.0566 + 150.9162 6504.0566 + 150.9662 6504.0566 + 151.0163 6504.0566 + 151.0663 6504.0566 + 151.1163 6504.0566 + 151.1662 6504.0566 + 151.2162 6504.0566 + 151.2663 6504.0566 + 151.3163 6504.0566 + 151.3663 6504.0566 + 151.4162 6504.0566 + 151.4662 6504.0566 + 151.5163 6504.0566 + 151.5663 6504.0566 + 151.6163 6504.0566 + 151.6662 6504.0566 + 151.7162 6504.0566 + 151.7663 6504.0566 + 151.8163 6504.0566 + 151.8663 6504.0566 + 151.9162 6504.0566 + 151.9662 6504.0566 + 152.0163 6504.0566 + 152.0663 6504.0566 + 152.1163 6504.0566 + 152.1662 6504.0566 + 152.2162 6504.0566 + 152.2663 6504.0566 + 152.3163 6504.0566 + 152.3663 6504.0566 + 152.4162 6504.0566 + 152.4662 6504.0566 + 152.5163 6504.0566 + 152.5663 6504.0566 + 152.6163 6504.0566 + 152.6662 6504.0566 + 152.7162 6504.0566 + 152.7663 6504.0566 + 152.8163 6504.0566 + 152.8663 6504.0566 + 152.9162 6504.0566 + 152.9662 6504.0566 + 153.0163 6504.0566 + 153.0663 6504.0566 + 153.1163 6504.0566 + 153.1662 6504.0566 + 153.2162 6504.0566 + 153.2663 6504.0566 + 153.3163 6504.0566 + 153.3663 6504.0566 + 153.4162 6504.0566 + 153.4662 6504.0566 + 153.5163 6504.0566 + 153.5663 6504.0566 + 153.6163 6504.0566 + 153.6662 6504.0566 + 153.7162 6504.0566 + 153.7663 6504.0566 + 153.8163 6504.0566 + 153.8663 6504.0566 + 153.9162 6504.0566 diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.dat b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.dat new file mode 100644 index 000000000..1b24618a1 --- /dev/null +++ b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.dat @@ -0,0 +1,3066 @@ +#Diffraction patterns were obtained by summation of runs: +#run051675.ctxt +#run051676.ctxt +#run051677.ctxt +#run051678.ctxt +#For details see data in separate runs + 0.950 1229 302 + 1.000 1229 299 + 1.050 1190 293 + 1.100 1096 279 + 1.150 1142 283 + 1.200 961 257 + 1.250 975 257 + 1.300 993 258 + 1.350 974 254 + 1.400 1099 268 + 1.450 1036 258 + 1.500 974 248 + 1.550 968 246 + 1.600 1012 250 + 1.650 1050 253 + 1.700 928 236 + 1.750 988 242 + 1.800 882 227 + 1.850 962 236 + 1.900 1055 245 + 1.950 909 226 + 2.000 1026 239 + 2.050 1319 269 + 2.100 1446 280 + 2.150 1360 270 + 2.200 1264 259 + 2.250 1265 257 + 2.300 1319 261 + 2.350 1259 254 + 2.400 1074 233 + 2.450 1056 229 + 2.500 1040 226 + 2.550 1241 246 + 2.600 1279 248 + 2.650 1261 245 + 2.700 1334 250 + 2.750 1356 251 + 2.800 1392 253 + 2.850 1799 286 + 2.900 1984 298 + 2.950 2125 307 + 3.000 2576 336 + 3.050 2837 351 + 3.100 2784 346 + 3.150 3023 358 + 3.200 3458 381 + 3.250 3913 403 + 3.300 3808 396 + 3.350 4084 407 + 3.400 4701 435 + 3.450 4491 423 + 3.500 5117 449 + 3.550 5752 473 + 3.600 5792 473 + 3.650 6356 492 + 3.700 6042 478 + 3.750 6433 490 + 3.800 6674 497 + 3.850 7080 509 + 3.900 7902 535 + 3.950 7803 529 + 4.000 7870 529 + 4.050 8478 546 + 4.100 9152 564 + 4.150 8855 552 + 4.200 9042 555 + 4.250 9770 574 + 4.300 9596 567 + 4.350 9972 575 + 4.400 10452 585 + 4.450 10258 577 + 4.500 10462 580 + 4.550 10813 587 + 4.600 9978 561 + 4.650 10598 576 + 4.700 10353 566 + 4.750 10303 562 + 4.800 11228 584 + 4.850 10653 566 + 4.900 10745 566 + 4.950 10961 569 + 5.000 10615 557 + 5.050 10150 543 + 5.100 10021 537 + 5.150 9824 529 + 5.200 9982 531 + 5.250 10218 535 + 5.300 11076 554 + 5.350 10348 533 + 5.400 10792 542 + 5.450 10333 528 + 5.500 10383 527 + 5.550 10320 523 + 5.600 10057 514 + 5.650 9721 503 + 5.700 10249 514 + 5.750 10635 522 + 5.800 10679 521 + 5.850 10430 512 + 5.900 10189 504 + 5.950 10001 497 + 6.000 10006 495 + 6.050 10298 500 + 6.100 10220 496 + 6.150 10085 491 + 6.200 10659 503 + 6.250 10707 502 + 6.300 10540 496 + 6.350 10414 491 + 6.400 10386 488 + 6.450 10500 489 + 6.500 10434 485 + 6.550 10515 485 + 6.600 10102 474 + 6.650 10314 477 + 6.700 10281 474 + 6.750 10241 471 + 6.800 10259 470 + 6.850 10600 476 + 6.900 10066 462 + 6.950 10253 464 + 7.000 10119 459 + 7.050 10369 463 + 7.100 10388 462 + 7.150 10445 461 + 7.200 10204 454 + 7.250 10061 449 + 7.300 10116 449 + 7.350 10219 449 + 7.400 10382 451 + 7.450 10096 443 + 7.500 9899 437 + 7.550 9677 430 + 7.600 10218 441 + 7.650 10074 436 + 7.700 10529 444 + 7.750 10445 441 + 7.800 10111 432 + 7.850 10248 433 + 7.900 9773 421 + 7.950 9820 421 + 8.000 9797 419 + 8.050 10509 432 + 8.100 10336 427 + 8.150 10300 425 + 8.200 10333 424 + 8.250 10015 416 + 8.300 10325 421 + 8.350 10061 414 + 8.400 9856 408 + 8.450 9999 410 + 8.500 10258 413 + 8.550 10605 419 + 8.600 10331 412 + 8.650 9978 404 + 8.700 9951 402 + 8.750 9932 400 + 8.800 10030 400 + 8.850 10280 404 + 8.900 10115 399 + 8.950 10250 401 + 9.000 10364 401 + 9.050 10298 399 + 9.100 10390 399 + 9.150 10050 391 + 9.200 10061 390 + 9.250 9915 386 + 9.300 10171 390 + 9.350 10289 391 + 9.400 10254 389 + 9.450 10520 392 + 9.500 10399 389 + 9.550 10184 383 + 9.600 10436 387 + 9.650 10196 381 + 9.700 10250 381 + 9.750 10071 376 + 9.800 9992 374 + 9.850 10319 378 + 9.900 10249 376 + 9.950 10285 375 +10.000 10231 373 +10.050 10143 370 +10.100 9833 364 +10.150 10072 367 +10.200 9836 361 +10.250 9778 359 +10.300 10201 366 +10.350 10258 365 +10.400 10360 366 +10.450 10125 361 +10.500 9965 357 +10.550 10054 357 +10.600 9885 353 +10.650 10068 355 +10.700 9884 351 +10.750 10219 356 +10.800 10259 355 +10.850 10321 355 +10.900 10531 358 +10.950 10285 353 +11.000 10044 347 +11.050 9930 344 +11.100 9983 344 +11.150 9903 342 +11.200 9850 340 +11.250 9850 339 +11.300 10008 340 +11.350 9805 336 +11.400 9678 333 +11.450 10087 339 +11.500 10239 340 +11.550 9994 335 +11.600 9730 330 +11.650 9901 332 +11.700 10288 337 +11.750 10052 332 +11.800 10039 331 +11.850 9792 326 +11.900 10201 332 +11.950 10036 328 +12.000 9774 323 +12.050 9520 318 +12.100 10155 327 +12.150 10130 326 +12.200 10084 324 +12.250 9960 321 +12.300 9903 319 +12.350 10042 321 +12.400 10016 319 +12.450 9918 317 +12.500 9860 315 +12.550 10053 317 +12.600 10040 316 +12.650 10097 316 +12.700 9810 311 +12.750 9511 305 +12.800 10075 313 +12.850 10051 312 +12.900 9975 310 +12.950 9649 304 +13.000 9709 304 +13.050 9911 306 +13.100 9846 305 +13.150 10034 307 +13.200 9822 303 +13.250 9572 298 +13.300 9877 302 +13.350 9682 298 +13.400 9704 298 +13.450 9887 299 +13.500 10049 301 +13.550 9986 299 +13.600 9619 293 +13.650 9927 297 +13.700 9606 291 +13.750 9317 286 +13.800 9544 289 +13.850 9889 293 +13.900 10002 294 +13.950 9571 287 +14.000 9671 288 +14.050 9728 288 +14.100 9810 288 +14.150 9866 288 +14.200 9791 286 +14.250 9768 285 +14.300 9871 286 +14.350 9908 286 +14.400 9789 283 +14.450 9621 280 +14.500 9844 283 +14.550 9419 276 +14.600 9411 275 +14.650 9679 278 +14.700 9784 279 +14.750 9757 278 +14.800 9671 276 +14.850 9809 277 +14.900 9838 277 +14.950 9782 275 +15.000 9539 271 +15.050 9540 271 +15.100 9637 271 +15.150 9870 274 +15.200 9862 273 +15.250 9673 270 +15.300 9862 272 +15.350 9520 266 +15.400 9821 270 +15.450 9764 268 +15.500 9716 267 +15.550 9573 264 +15.600 9828 267 +15.650 9900 268 +15.700 9683 264 +15.750 9660 263 +15.800 9733 263 +15.850 9831 264 +15.900 9485 259 +15.950 9541 259 +16.000 9571 259 +16.050 9564 258 +16.100 9972 263 +16.150 9819 260 +16.200 9410 254 +16.250 9186 250 +16.300 9585 255 +16.350 9606 255 +16.400 9600 254 +16.450 9541 253 +16.500 9421 251 +16.550 9701 254 +16.600 9823 255 +16.650 9671 252 +16.700 9786 253 +16.750 9762 252 +16.800 9512 248 +16.850 9556 248 +16.900 9692 249 +16.950 9462 246 +17.000 9386 244 +17.050 9310 243 +17.100 9291 242 +17.150 9020 238 +17.200 9469 243 +17.250 9694 245 +17.300 9639 244 +17.350 9434 241 +17.400 9635 243 +17.450 9672 243 +17.500 9821 244 +17.550 9476 239 +17.600 9433 238 +17.650 9564 239 +17.700 9713 241 +17.750 9700 240 +17.800 9233 233 +17.850 9630 238 +17.900 9713 238 +17.950 9343 233 +18.000 9390 233 +18.050 9275 231 +18.100 9639 235 +18.150 9601 234 +18.200 9558 233 +18.250 9588 233 +18.300 9806 235 +18.350 9674 233 +18.400 9674 233 +18.450 9493 230 +18.500 9393 228 +18.550 9428 228 +18.600 9571 229 +18.650 9431 227 +18.700 9288 225 +18.750 9435 226 +18.800 9431 226 +18.850 9297 224 +18.900 9504 226 +18.950 9245 222 +19.000 9725 227 +19.050 9385 223 +19.100 9308 221 +19.150 9476 223 +19.200 9563 223 +19.250 9558 223 +19.300 9436 221 +19.350 9289 219 +19.400 9280 218 +19.450 9641 222 +19.500 9393 218 +19.550 9519 219 +19.600 9392 217 +19.650 9364 217 +19.700 9270 215 +19.750 9286 215 +19.800 9204 213 +19.850 9563 217 +19.900 9531 216 +19.950 9488 215 +20.000 9710 217 +20.050 9593 216 +20.100 9276 212 +20.150 9415 213 +20.200 9242 210 +20.250 9730 215 +20.300 9966 217 +20.350 10338 221 +20.400 10703 224 +20.450 11004 227 +20.500 11327 230 +20.550 11203 228 +20.600 11000 226 +20.650 10805 223 +20.700 10163 216 +20.750 9960 213 +20.800 9712 210 +20.850 9502 208 +20.900 9461 207 +20.950 9169 203 +21.000 9148 202 +21.050 9114 202 +21.100 9339 204 +21.150 9286 203 +21.200 9166 201 +21.250 9101 200 +21.300 9070 199 +21.350 9117 199 +21.400 9177 199 +21.450 9244 200 +21.500 9166 198 +21.550 9513 202 +21.600 9258 199 +21.650 9403 200 +21.700 9538 201 +21.750 9239 197 +21.800 9089 195 +21.850 9033 194 +21.900 9467 198 +21.950 9301 196 +22.000 9177 195 +22.050 9169 194 +22.100 9180 194 +22.150 9236 194 +22.200 9147 193 +22.250 8999 191 +22.300 9318 194 +22.350 8939 189 +22.400 9264 192 +22.450 9107 190 +22.500 8994 189 +22.550 9356 192 +22.600 9094 189 +22.650 9284 191 +22.700 9053 188 +22.750 9004 187 +22.800 8809 185 +22.850 8851 185 +22.900 9055 187 +22.950 8983 185 +23.000 9028 186 +23.050 9222 187 +23.100 9021 185 +23.150 8838 182 +23.200 8755 181 +23.250 9056 184 +23.300 8853 182 +23.350 9189 185 +23.400 8996 182 +23.450 8988 182 +23.500 9016 182 +23.550 8859 180 +23.600 8972 181 +23.650 9178 182 +23.700 9288 183 +23.750 9099 181 +23.800 8830 178 +23.850 9143 181 +23.900 9010 179 +23.950 9028 179 +24.000 9144 180 +24.050 9442 182 +24.100 9152 179 +24.150 8839 176 +24.200 9002 177 +24.250 9120 178 +24.300 9087 177 +24.350 9147 177 +24.400 9025 176 +24.450 8864 174 +24.500 8667 172 +24.550 9097 175 +24.600 8938 174 +24.650 9095 175 +24.700 8966 173 +24.750 8976 173 +24.800 8897 172 +24.850 9077 173 +24.900 9059 173 +24.950 9135 173 +25.000 9214 174 +25.050 9015 171 +25.100 9143 172 +25.150 9053 171 +25.200 9129 172 +25.250 9121 171 +25.300 8803 168 +25.350 9041 170 +25.400 8952 169 +25.450 9103 170 +25.500 8966 168 +25.550 9064 169 +25.600 8813 166 +25.650 8930 167 +25.700 9095 168 +25.750 8718 164 +25.800 8901 166 +25.850 8817 165 +25.900 8776 164 +25.950 8877 165 +26.000 8949 165 +26.050 8895 164 +26.100 8951 164 +26.150 8747 162 +26.200 8973 164 +26.250 9134 165 +26.300 9002 164 +26.350 8658 160 +26.400 8693 160 +26.450 8594 159 +26.500 8727 160 +26.550 9237 164 +26.600 8927 161 +26.650 9099 162 +26.700 8715 159 +26.750 9056 161 +26.800 8928 160 +26.850 8854 159 +26.900 8880 159 +26.950 8636 156 +27.000 9010 160 +27.050 8742 157 +27.100 9031 159 +27.150 9091 159 +27.200 8735 156 +27.250 8866 157 +27.300 8940 157 +27.350 8922 157 +27.400 8779 155 +27.450 8944 156 +27.500 8946 156 +27.550 8889 155 +27.600 8809 154 +27.650 8956 155 +27.700 9148 157 +27.750 8802 154 +27.800 8726 153 +27.850 8861 153 +27.900 8797 153 +27.950 8696 152 +28.000 8928 153 +28.050 8904 153 +28.100 8928 153 +28.150 8854 152 +28.200 8827 151 +28.250 8925 152 +28.300 8696 150 +28.350 8891 151 +28.400 8760 150 +28.450 8905 151 +28.500 8717 149 +28.550 8673 148 +28.600 8810 149 +28.650 8692 148 +28.700 8797 148 +28.750 8802 148 +28.800 8951 149 +28.850 9192 151 +28.900 9431 153 +28.950 10213 159 +29.000 11294 166 +29.050 12854 177 +29.100 14764 190 +29.150 16826 202 +29.200 18020 209 +29.250 18385 211 +29.300 17673 206 +29.350 16007 196 +29.400 13695 181 +29.450 11861 168 +29.500 10298 156 +29.550 9578 150 +29.600 9210 147 +29.650 8856 144 +29.700 8642 142 +29.750 8679 142 +29.800 8755 143 +29.850 8831 143 +29.900 8635 141 +29.950 8926 143 +30.000 8880 143 +30.050 8481 139 +30.100 8648 140 +30.150 8662 140 +30.200 8641 140 +30.250 8733 140 +30.300 8780 140 +30.350 8952 141 +30.400 8924 141 +30.450 8665 139 +30.500 8724 139 +30.550 8712 139 +30.600 8737 139 +30.650 8627 137 +30.700 8830 139 +30.750 8841 139 +30.800 8773 138 +30.850 8894 139 +30.900 8583 136 +30.950 8854 138 +31.000 8726 137 +31.050 8535 135 +31.100 8526 135 +31.150 8610 135 +31.200 8561 134 +31.250 8708 135 +31.300 8591 134 +31.350 8911 136 +31.400 9002 137 +31.450 9313 139 +31.500 10043 144 +31.550 10289 146 +31.600 10283 145 +31.650 10315 145 +31.700 10351 145 +31.750 10008 143 +31.800 9587 139 +31.850 9293 137 +31.900 9014 135 +31.950 9039 135 +32.000 8884 133 +32.050 8556 131 +32.100 8612 131 +32.150 8596 130 +32.200 8566 130 +32.250 8657 130 +32.300 8693 130 +32.350 8707 130 +32.400 8458 128 +32.450 8463 128 +32.500 8565 129 +32.550 8609 129 +32.600 8670 129 +32.650 8579 128 +32.700 8550 128 +32.750 8641 128 +32.800 8622 128 +32.850 8762 129 +32.900 8598 127 +32.950 8574 127 +33.000 8742 128 +33.050 8712 127 +33.100 8666 127 +33.150 8679 127 +33.200 8625 126 +33.250 8659 126 +33.300 8715 126 +33.350 8883 127 +33.400 8741 126 +33.450 8477 124 +33.500 8518 124 +33.550 8542 124 +33.600 8645 125 +33.650 8511 123 +33.700 8435 123 +33.750 8573 124 +33.800 8732 124 +33.850 8472 122 +33.900 8642 123 +33.950 8755 124 +34.000 8538 122 +34.050 8576 122 +34.100 8639 123 +34.150 8695 123 +34.200 8662 122 +34.250 8710 122 +34.300 8703 122 +34.350 8559 121 +34.400 8404 120 +34.450 8712 122 +34.500 8576 121 +34.550 8592 120 +34.600 8628 121 +34.650 8441 119 +34.700 8499 119 +34.750 8531 119 +34.800 8493 119 +34.850 8564 119 +34.900 8604 119 +34.950 8536 118 +35.000 8282 117 +35.050 8324 117 +35.100 8353 117 +35.150 8543 118 +35.200 8594 118 +35.250 8589 118 +35.300 8358 116 +35.350 8344 116 +35.400 8411 116 +35.450 8529 117 +35.500 8588 117 +35.550 8533 116 +35.600 8322 115 +35.650 8262 114 +35.700 8579 116 +35.750 8617 116 +35.800 8365 114 +35.850 8571 115 +35.900 8618 115 +35.950 8608 115 +36.000 8692 116 +36.050 8555 114 +36.100 8692 115 +36.150 8699 115 +36.200 8515 114 +36.250 8512 113 +36.300 8449 113 +36.350 8511 113 +36.400 8442 112 +36.450 8418 112 +36.500 8467 112 +36.550 8641 113 +36.600 8426 112 +36.650 8370 111 +36.700 8306 110 +36.750 8439 111 +36.800 8552 112 +36.850 8351 110 +36.900 8258 109 +36.950 8396 110 +37.000 8543 111 +37.050 8500 110 +37.100 8486 110 +37.150 8342 109 +37.200 8352 109 +37.250 8409 109 +37.300 8412 109 +37.350 8216 108 +37.400 8340 108 +37.450 8417 109 +37.500 8570 109 +37.550 8381 108 +37.600 8418 108 +37.650 8461 108 +37.700 8353 107 +37.750 8213 106 +37.800 8268 106 +37.850 8329 107 +37.900 8333 106 +37.950 8304 106 +38.000 8541 107 +38.050 8519 107 +38.100 8404 106 +38.150 8447 106 +38.200 8611 107 +38.250 8230 105 +38.300 8356 105 +38.350 8129 104 +38.400 8264 104 +38.450 8208 104 +38.500 8240 104 +38.550 8160 103 +38.600 8040 102 +38.650 8109 103 +38.700 8335 104 +38.750 8213 103 +38.800 8130 102 +38.850 8269 103 +38.900 8243 103 +38.950 8371 103 +39.000 8285 103 +39.050 8225 102 +39.100 8441 103 +39.150 8146 101 +39.200 8177 101 +39.250 8453 103 +39.300 8254 101 +39.350 8176 101 +39.400 8118 100 +39.450 8164 100 +39.500 8123 100 +39.550 8157 100 +39.600 8456 102 +39.650 8643 103 +39.700 8710 103 +39.750 9392 107 +39.800 10187 111 +39.850 11058 115 +39.900 12033 120 +39.950 12788 124 +40.000 13099 125 +40.050 12683 123 +40.100 12144 120 +40.150 10940 114 +40.200 9812 107 +40.250 9120 103 +40.300 8622 100 +40.350 8453 99 +40.400 8458 99 +40.450 8161 97 +40.500 8132 97 +40.550 8329 98 +40.600 8305 98 +40.650 8141 96 +40.700 8114 96 +40.750 8260 97 +40.800 8225 96 +40.850 8204 96 +40.900 8295 97 +40.950 8278 96 +41.000 8204 96 +41.050 8140 95 +41.100 8069 95 +41.150 8286 96 +41.200 8102 95 +41.250 8139 95 +41.300 8104 94 +41.350 8281 95 +41.400 8235 95 +41.450 8315 95 +41.500 8199 94 +41.550 8097 93 +41.600 8026 93 +41.650 8205 94 +41.700 8314 94 +41.750 8207 93 +41.800 8106 93 +41.850 8260 94 +41.900 8442 94 +41.950 8271 93 +42.000 8169 93 +42.050 8041 92 +42.100 7892 91 +42.150 8119 92 +42.200 8200 92 +42.250 8253 92 +42.300 8286 92 +42.350 8101 91 +42.400 7930 90 +42.450 7916 90 +42.500 8012 90 +42.550 7975 90 +42.600 8126 91 +42.650 8154 91 +42.700 8124 90 +42.750 7923 89 +42.800 7957 89 +42.850 7910 89 +42.900 7982 89 +42.950 7849 88 +43.000 7932 89 +43.050 8027 89 +43.100 8094 89 +43.150 7974 89 +43.200 8129 90 +43.250 8198 90 +43.300 8034 89 +43.350 8173 90 +43.400 8397 91 +43.450 8491 92 +43.500 8904 94 +43.550 9408 96 +43.600 9684 98 +43.650 9762 98 +43.700 9523 97 +43.750 9289 96 +43.800 9015 94 +43.850 8748 93 +43.900 8415 91 +43.950 8209 90 +44.000 8107 90 +44.050 8066 89 +44.100 7911 88 +44.150 7750 88 +44.200 8032 89 +44.250 7912 88 +44.300 7943 89 +44.350 7890 88 +44.400 7932 89 +44.450 8011 89 +44.500 8034 89 +44.550 8108 90 +44.600 8104 90 +44.650 8021 89 +44.700 7977 89 +44.750 8073 89 +44.800 8126 90 +44.850 7883 88 +44.900 7974 89 +44.950 7947 89 +45.000 7991 89 +45.050 7953 89 +45.100 7820 88 +45.150 8118 90 +45.200 8208 90 +45.250 7887 88 +45.300 8016 89 +45.350 7859 88 +45.400 7927 89 +45.450 8020 89 +45.500 8022 89 +45.550 7861 88 +45.600 7759 88 +45.650 7826 88 +45.700 7903 88 +45.750 7758 88 +45.800 7951 89 +45.850 7893 88 +45.900 7963 89 +45.950 7948 89 +46.000 7865 88 +46.050 7927 89 +46.100 7920 88 +46.150 7942 89 +46.200 7862 88 +46.250 7931 89 +46.300 8008 89 +46.350 7846 88 +46.400 7866 88 +46.450 7900 88 +46.500 7912 88 +46.550 7778 88 +46.600 7679 87 +46.650 7981 89 +46.700 7857 88 +46.750 8082 89 +46.800 8179 90 +46.850 8262 90 +46.900 8322 91 +46.950 8482 92 +47.000 8685 93 +47.050 8971 94 +47.100 9054 95 +47.150 9044 95 +47.200 8941 94 +47.250 8540 92 +47.300 8036 89 +47.350 7980 89 +47.400 8025 89 +47.450 8137 90 +47.500 8076 89 +47.550 7932 89 +47.600 8057 89 +47.650 7883 88 +47.700 7912 88 +47.750 7932 89 +47.800 8034 89 +47.850 8008 89 +47.900 7941 89 +47.950 7920 88 +48.000 7908 88 +48.050 7894 88 +48.100 7884 88 +48.150 7982 89 +48.200 7696 87 +48.250 7879 88 +48.300 8216 90 +48.350 8436 91 +48.400 9053 95 +48.450 10442 102 +48.500 12610 112 +48.550 15833 125 +48.600 19815 140 +48.650 23750 154 +48.700 26358 162 +48.750 26911 164 +48.800 25283 159 +48.850 21610 147 +48.900 17504 132 +48.950 13616 116 +49.000 10967 104 +49.050 9225 96 +49.100 8494 92 +49.150 8128 90 +49.200 7868 88 +49.250 7746 88 +49.300 7824 88 +49.350 7894 88 +49.400 7864 88 +49.450 8066 89 +49.500 7869 88 +49.550 7952 89 +49.600 7849 88 +49.650 7890 88 +49.700 7834 88 +49.750 7801 88 +49.800 7912 88 +49.850 7985 89 +49.900 7874 88 +49.950 7837 88 +50.000 7786 88 +50.050 7855 88 +50.100 8028 89 +50.150 7941 89 +50.200 7962 89 +50.250 7965 89 +50.300 8047 89 +50.350 8135 90 +50.400 8038 89 +50.450 8021 89 +50.500 7970 89 +50.550 8077 89 +50.600 7900 88 +50.650 7835 88 +50.700 7815 88 +50.750 7731 87 +50.800 7746 88 +50.850 7681 87 +50.900 7696 87 +50.950 7825 88 +51.000 7826 88 +51.050 7609 87 +51.100 7723 87 +51.150 7874 88 +51.200 7718 87 +51.250 7687 87 +51.300 7753 88 +51.350 7799 88 +51.400 7724 87 +51.450 7775 88 +51.500 7963 89 +51.550 7847 88 +51.600 7729 87 +51.650 7766 88 +51.700 7890 88 +51.750 7684 87 +51.800 7648 87 +51.850 7791 88 +51.900 7799 88 +51.950 7793 88 +52.000 8040 89 +52.050 7875 88 +52.100 7863 88 +52.150 7703 87 +52.200 7642 87 +52.250 7764 88 +52.300 7715 87 +52.350 7670 87 +52.400 7741 87 +52.450 7571 87 +52.500 7675 87 +52.550 7640 87 +52.600 7765 88 +52.650 7859 88 +52.700 7840 88 +52.750 7721 87 +52.800 7709 87 +52.850 7796 88 +52.900 7863 88 +52.950 7699 87 +53.000 7726 87 +53.050 7575 87 +53.100 7928 89 +53.150 8052 89 +53.200 8318 91 +53.250 8250 90 +53.300 8585 92 +53.350 9041 95 +53.400 9461 97 +53.450 9483 97 +53.500 9282 96 +53.550 8970 94 +53.600 8645 92 +53.650 8241 90 +53.700 8006 89 +53.750 7903 88 +53.800 7772 88 +53.850 7584 87 +53.900 7734 87 +53.950 7633 87 +54.000 7638 87 +54.050 7643 87 +54.100 7713 87 +54.150 7736 87 +54.200 7630 87 +54.250 7861 88 +54.300 7896 88 +54.350 7797 88 +54.400 7826 88 +54.450 7626 87 +54.500 7809 88 +54.550 7762 88 +54.600 7733 87 +54.650 7759 88 +54.700 7784 88 +54.750 7838 88 +54.800 7961 89 +54.850 8012 89 +54.900 7765 88 +54.950 7848 88 +55.000 7880 88 +55.050 7995 89 +55.100 7783 88 +55.150 7827 88 +55.200 7696 87 +55.250 7540 86 +55.300 7640 87 +55.350 7714 87 +55.400 7552 86 +55.450 7637 87 +55.500 7593 87 +55.550 7588 87 +55.600 7710 87 +55.650 7546 86 +55.700 7590 87 +55.750 7718 87 +55.800 7680 87 +55.850 7733 87 +55.900 7825 88 +55.950 7807 88 +56.000 7821 88 +56.050 7804 88 +56.100 7771 88 +56.150 7969 89 +56.200 8249 90 +56.250 8418 91 +56.300 8941 94 +56.350 9207 95 +56.400 9365 96 +56.450 9359 96 +56.500 9173 95 +56.550 8796 93 +56.600 8341 91 +56.650 8111 90 +56.700 7889 88 +56.750 7620 87 +56.800 7748 88 +56.850 7814 88 +56.900 7678 87 +56.950 7737 87 +57.000 7668 87 +57.050 7699 87 +57.100 7742 87 +57.150 7781 88 +57.200 7746 88 +57.250 7575 87 +57.300 7662 87 +57.350 7697 87 +57.400 7624 87 +57.450 7750 88 +57.500 7706 87 +57.550 7784 88 +57.600 8419 91 +57.650 8996 94 +57.700 10073 100 +57.750 11439 106 +57.800 12666 112 +57.850 13675 116 +57.900 13505 116 +57.950 12708 112 +58.000 11481 107 +58.050 10507 102 +58.100 9337 96 +58.150 8414 91 +58.200 7930 89 +58.250 7629 87 +58.300 7685 87 +58.350 7610 87 +58.400 7641 87 +58.450 7558 86 +58.500 7625 87 +58.550 7630 87 +58.600 7607 87 +58.650 7552 86 +58.700 7558 86 +58.750 7535 86 +58.800 7428 86 +58.850 7468 86 +58.900 7579 87 +58.950 7558 86 +59.000 7759 88 +59.050 7998 89 +59.100 8317 91 +59.150 9051 95 +59.200 9587 97 +59.250 10370 101 +59.300 10441 102 +59.350 10387 101 +59.400 9863 99 +59.450 9167 95 +59.500 8724 93 +59.550 8321 91 +59.600 7953 89 +59.650 7590 87 +59.700 7617 87 +59.750 7631 87 +59.800 7550 86 +59.850 7495 86 +59.900 7532 86 +59.950 7591 87 +60.000 7659 87 +60.050 7552 86 +60.100 7427 86 +60.150 7377 85 +60.200 7396 86 +60.250 7447 86 +60.300 7637 87 +60.350 7583 87 +60.400 7442 86 +60.450 7564 86 +60.500 7684 87 +60.550 7526 86 +60.600 7575 87 +60.650 7608 87 +60.700 7507 86 +60.750 7518 86 +60.800 7538 86 +60.850 7679 87 +60.900 7593 87 +60.950 7372 85 +61.000 7539 86 +61.050 7549 86 +61.100 7414 86 +61.150 7421 86 +61.200 7442 86 +61.250 7472 86 +61.300 7552 86 +61.350 7413 86 +61.400 7387 85 +61.450 7469 86 +61.500 7547 86 +61.550 7324 85 +61.600 7430 86 +61.650 7447 86 +61.700 7634 87 +61.750 7729 87 +61.800 7434 86 +61.850 7567 86 +61.900 7783 88 +61.950 7626 87 +62.000 7684 87 +62.050 7837 88 +62.100 7877 88 +62.150 7771 88 +62.200 7622 87 +62.250 7559 86 +62.300 7552 86 +62.350 7353 85 +62.400 7370 85 +62.450 7357 85 +62.500 7358 85 +62.550 7460 86 +62.600 7352 85 +62.650 7316 85 +62.700 7324 85 +62.750 7387 85 +62.800 7400 86 +62.850 7538 86 +62.900 7417 86 +62.950 7304 85 +63.000 7433 86 +63.050 7364 85 +63.100 7299 85 +63.150 7209 84 +63.200 7404 86 +63.250 7411 86 +63.300 7542 86 +63.350 7581 87 +63.400 7670 87 +63.450 7570 87 +63.500 7697 87 +63.550 7727 87 +63.600 7573 87 +63.650 7573 87 +63.700 7527 86 +63.750 7318 85 +63.800 7282 85 +63.850 7282 85 +63.900 7351 85 +63.950 7405 86 +64.000 7351 85 +64.050 7407 86 +64.100 7311 85 +64.150 7357 85 +64.200 7341 85 +64.250 7281 85 +64.300 7319 85 +64.350 7486 86 +64.400 7533 86 +64.450 7564 86 +64.500 7775 88 +64.550 7919 88 +64.600 8354 91 +64.650 9022 94 +64.700 10195 100 +64.750 11593 107 +64.800 12440 111 +64.850 12475 111 +64.900 11957 109 +64.950 11222 105 +65.000 10173 100 +65.050 9042 95 +65.100 8143 90 +65.150 7635 87 +65.200 7484 86 +65.250 7394 85 +65.300 7288 85 +65.350 7349 85 +65.400 7311 85 +65.450 7262 85 +65.500 7322 85 +65.550 7371 85 +65.600 7410 86 +65.650 7196 84 +65.700 7125 84 +65.750 7374 85 +65.800 7346 85 +65.850 7287 85 +65.900 7410 86 +65.950 7292 85 +66.000 7278 85 +66.050 7499 86 +66.100 7645 87 +66.150 7701 87 +66.200 7754 88 +66.250 7717 87 +66.300 7617 87 +66.350 7359 85 +66.400 7435 86 +66.450 7433 86 +66.500 7422 86 +66.550 7482 86 +66.600 7285 85 +66.650 7165 84 +66.700 7378 85 +66.750 7244 85 +66.800 7183 84 +66.850 7308 85 +66.900 7436 86 +66.950 7318 85 +67.000 7328 85 +67.050 7398 86 +67.100 7437 86 +67.150 7273 85 +67.200 7407 86 +67.250 7345 85 +67.300 7261 85 +67.350 7418 86 +67.400 7328 85 +67.450 7295 85 +67.500 7325 85 +67.550 7453 86 +67.600 7223 84 +67.650 7387 85 +67.700 7263 85 +67.750 7256 85 +67.800 7191 84 +67.850 7404 86 +67.900 7318 85 +67.950 7316 85 +68.000 7304 85 +68.050 7311 85 +68.100 7269 85 +68.150 7289 85 +68.200 7189 84 +68.250 7476 86 +68.300 7505 86 +68.350 7478 86 +68.400 7147 84 +68.450 7328 85 +68.500 7116 84 +68.550 7221 84 +68.600 7275 85 +68.650 7212 84 +68.700 7220 84 +68.750 7265 85 +68.800 7315 85 +68.850 7131 84 +68.900 7224 84 +68.950 7269 85 +69.000 7242 85 +69.050 7200 84 +69.100 7314 85 +69.150 7412 86 +69.200 7465 86 +69.250 7340 85 +69.300 7411 86 +69.350 7363 85 +69.400 7364 85 +69.450 7412 86 +69.500 7365 85 +69.550 7215 84 +69.600 7128 84 +69.650 7277 85 +69.700 7287 85 +69.750 7392 85 +69.800 7453 86 +69.850 7604 87 +69.900 7833 88 +69.950 8298 91 +70.000 8808 93 +70.050 9410 97 +70.100 9785 98 +70.150 9822 99 +70.200 9620 98 +70.250 9192 95 +70.300 8570 92 +70.350 7831 88 +70.400 7687 87 +70.450 7470 86 +70.500 7367 85 +70.550 7370 85 +70.600 7181 84 +70.650 7298 85 +70.700 7271 85 +70.750 7306 85 +70.800 7282 85 +70.850 7326 85 +70.900 7288 85 +70.950 7426 86 +71.000 7466 86 +71.050 7470 86 +71.100 7439 86 +71.150 7789 88 +71.200 8144 90 +71.250 8780 93 +71.300 9592 97 +71.350 10486 102 +71.400 11021 104 +71.450 10865 104 +71.500 10326 101 +71.550 9907 99 +71.600 8808 93 +71.650 8257 90 +71.700 7650 87 +71.750 7378 85 +71.800 7288 85 +71.850 7321 85 +71.900 7214 84 +71.950 7254 85 +72.000 7234 85 +72.050 7112 84 +72.100 7288 85 +72.150 7249 85 +72.200 7305 85 +72.250 7308 85 +72.300 7319 85 +72.350 7403 86 +72.400 7234 85 +72.450 7322 85 +72.500 7493 86 +72.550 7825 88 +72.600 8267 90 +72.650 8547 92 +72.700 8490 92 +72.750 8409 91 +72.800 8185 90 +72.850 7778 88 +72.900 7514 86 +72.950 7634 87 +73.000 7248 85 +73.050 7157 84 +73.100 7255 85 +73.150 7208 84 +73.200 7276 85 +73.250 7214 84 +73.300 7041 83 +73.350 7175 84 +73.400 7261 85 +73.450 7343 85 +73.500 7177 84 +73.550 7210 84 +73.600 7154 84 +73.650 7055 83 +73.700 7146 84 +73.750 7435 86 +73.800 7283 85 +73.850 7422 86 +73.900 7420 86 +73.950 7466 86 +74.000 7701 87 +74.050 7638 87 +74.100 7407 86 +74.150 7226 85 +74.200 7275 85 +74.250 7216 84 +74.300 7280 85 +74.350 7177 84 +74.400 7184 84 +74.450 7091 84 +74.500 7233 85 +74.550 7259 85 +74.600 7075 84 +74.650 7067 84 +74.700 7165 84 +74.750 7163 84 +74.800 7122 84 +74.850 7315 85 +74.900 7138 84 +74.950 7155 84 +75.000 7329 85 +75.050 7289 85 +75.100 7274 85 +75.150 7445 86 +75.200 7554 86 +75.250 7897 88 +75.300 7777 88 +75.350 7604 87 +75.400 7470 86 +75.450 7246 85 +75.500 7086 84 +75.550 7140 84 +75.600 7059 84 +75.650 7134 84 +75.700 7082 84 +75.750 7020 83 +75.800 6938 83 +75.850 7129 84 +75.900 7248 85 +75.950 7113 84 +76.000 7265 85 +76.050 7232 85 +76.100 7317 85 +76.150 7359 85 +76.200 7147 84 +76.250 7194 84 +76.300 7437 86 +76.350 7434 86 +76.400 7530 86 +76.450 7762 88 +76.500 7710 87 +76.550 7629 87 +76.600 7528 86 +76.650 7404 86 +76.700 7418 86 +76.750 7210 84 +76.800 7309 85 +76.850 7225 85 +76.900 7123 84 +76.950 7143 84 +77.000 7031 83 +77.050 7151 84 +77.100 7181 84 +77.150 7282 85 +77.200 7137 84 +77.250 7022 83 +77.300 7103 84 +77.350 7272 85 +77.400 7165 84 +77.450 7319 85 +77.500 7426 86 +77.550 7558 86 +77.600 7709 87 +77.650 7816 88 +77.700 8077 89 +77.750 8150 90 +77.800 8120 90 +77.850 7780 88 +77.900 7767 88 +77.950 7674 87 +78.000 7328 85 +78.050 7215 84 +78.100 7165 84 +78.150 7180 84 +78.200 7150 84 +78.250 7160 84 +78.300 7188 84 +78.350 7176 84 +78.400 7325 85 +78.450 7147 84 +78.500 7029 83 +78.550 7113 84 +78.600 7243 85 +78.650 7286 85 +78.700 7328 85 +78.750 7541 86 +78.800 8051 89 +78.850 8730 93 +78.900 9218 96 +78.950 9902 99 +79.000 10075 100 +79.050 9957 99 +79.100 9475 97 +79.150 8917 94 +79.200 8129 90 +79.250 7618 87 +79.300 7370 85 +79.350 7223 84 +79.400 7310 85 +79.450 7167 84 +79.500 7179 84 +79.550 7121 84 +79.600 7124 84 +79.650 7180 84 +79.700 7170 84 +79.750 7085 84 +79.800 7101 84 +79.850 7147 84 +79.900 7092 84 +79.950 7129 84 +80.000 7187 84 +80.050 7274 85 +80.100 7331 85 +80.150 7667 87 +80.200 7880 88 +80.250 7884 88 +80.300 7750 88 +80.350 7623 87 +80.400 7494 86 +80.450 7387 85 +80.500 7347 85 +80.550 7265 85 +80.600 7043 83 +80.650 7113 84 +80.700 7237 85 +80.750 7162 84 +80.800 7104 84 +80.850 7085 84 +80.900 7190 84 +80.950 7213 84 +81.000 7083 84 +81.050 7118 84 +81.100 7228 85 +81.150 7134 84 +81.200 7160 84 +81.250 7001 83 +81.300 7204 84 +81.350 7046 83 +81.400 7056 84 +81.450 7220 84 +81.500 7094 84 +81.550 7140 84 +81.600 6994 83 +81.650 6949 83 +81.700 7127 84 +81.750 7001 83 +81.800 7149 84 +81.850 7174 84 +81.900 6971 83 +81.950 7105 84 +82.000 7150 84 +82.050 7130 84 +82.100 7238 85 +82.150 7160 84 +82.200 7055 83 +82.250 7150 84 +82.300 7052 83 +82.350 6964 83 +82.400 7048 83 +82.450 7137 84 +82.500 7105 84 +82.550 7307 85 +82.600 7322 85 +82.650 7273 85 +82.700 7511 86 +82.750 7590 87 +82.800 7466 86 +82.850 7447 86 +82.900 7277 85 +82.950 7094 84 +83.000 7060 84 +83.050 7042 83 +83.100 7099 84 +83.150 7080 84 +83.200 6994 83 +83.250 7089 84 +83.300 7072 84 +83.350 7100 84 +83.400 7202 84 +83.450 7116 84 +83.500 7281 85 +83.550 7079 84 +83.600 7109 84 +83.650 7089 84 +83.700 7016 83 +83.750 7193 84 +83.800 7348 85 +83.850 7528 86 +83.900 7477 86 +83.950 7514 86 +84.000 7526 86 +84.050 7571 87 +84.100 7310 85 +84.150 7138 84 +84.200 7070 84 +84.250 7081 84 +84.300 7085 84 +84.350 7089 84 +84.400 7194 84 +84.450 7201 84 +84.500 7115 84 +84.550 7023 83 +84.600 6919 83 +84.650 6822 82 +84.700 7145 84 +84.750 7079 84 +84.800 7146 84 +84.850 7139 84 +84.900 7211 84 +84.950 7525 86 +85.000 7891 88 +85.050 8310 91 +85.100 8963 94 +85.150 9077 95 +85.200 8925 94 +85.250 8774 93 +85.300 8275 90 +85.350 7977 89 +85.400 7446 86 +85.450 7135 84 +85.500 7077 84 +85.550 7095 84 +85.600 7070 84 +85.650 6983 83 +85.700 7117 84 +85.750 6930 83 +85.800 6926 83 +85.850 6860 82 +85.900 6920 83 +85.950 7020 83 +86.000 7005 83 +86.050 7050 83 +86.100 6953 83 +86.150 7042 83 +86.200 7270 85 +86.250 7138 84 +86.300 7269 85 +86.350 7359 85 +86.400 7295 85 +86.450 7475 86 +86.500 7345 85 +86.550 7168 84 +86.600 6999 83 +86.650 6934 83 +86.700 7009 83 +86.750 7035 83 +86.800 6934 83 +86.850 6848 82 +86.900 6859 82 +86.950 6842 82 +87.000 6863 82 +87.050 6789 82 +87.100 6939 83 +87.150 7022 83 +87.200 7038 83 +87.250 7117 84 +87.300 7054 83 +87.350 7158 84 +87.400 7232 85 +87.450 7318 85 +87.500 7690 87 +87.550 7963 89 +87.600 7878 88 +87.650 7979 89 +87.700 7678 87 +87.750 7492 86 +87.800 7409 86 +87.850 7206 84 +87.900 6994 83 +87.950 6939 83 +88.000 6868 82 +88.050 6748 82 +88.100 6825 82 +88.150 6880 82 +88.200 6814 82 +88.250 6880 82 +88.300 6809 82 +88.350 6912 83 +88.400 6979 83 +88.450 6865 82 +88.500 6881 82 +88.550 6905 83 +88.600 6896 83 +88.650 6849 82 +88.700 6677 81 +88.750 6797 82 +88.800 6852 82 +88.850 6887 82 +88.900 6884 82 +88.950 6896 83 +89.000 6819 82 +89.050 6815 82 +89.100 6888 82 +89.150 6867 82 +89.200 6835 82 +89.250 6680 81 +89.300 6640 81 +89.350 6851 82 +89.400 6899 83 +89.450 6883 82 +89.500 6905 83 +89.550 6890 83 +89.600 6849 82 +89.650 6925 83 +89.700 6940 83 +89.750 7142 84 +89.800 7359 85 +89.850 8003 89 +89.900 8767 93 +89.950 9790 98 +90.000 10504 102 +90.050 10876 104 +90.100 11034 105 +90.150 10370 101 +90.200 9450 97 +90.250 8637 92 +90.300 7784 88 +90.350 7339 85 +90.400 7051 83 +90.450 6913 83 +90.500 6811 82 +90.550 6971 83 +90.600 6872 82 +90.650 6807 82 +90.700 6756 82 +90.750 6950 83 +90.800 6963 83 +90.850 6939 83 +90.900 7008 83 +90.950 7272 85 +91.000 7706 87 +91.050 8285 91 +91.100 9643 98 +91.150 11098 105 +91.200 12329 111 +91.250 13244 115 +91.300 13320 115 +91.350 12644 112 +91.400 11355 106 +91.450 9760 98 +91.500 8662 93 +91.550 7805 88 +91.600 7146 84 +91.650 7013 83 +91.700 6895 83 +91.750 6893 83 +91.800 6833 82 +91.850 6918 83 +91.900 6818 82 +91.950 6915 83 +92.000 6825 82 +92.050 6797 82 +92.100 6747 82 +92.150 6958 83 +92.200 6960 83 +92.250 7109 84 +92.300 7522 86 +92.350 7721 87 +92.400 8359 91 +92.450 8762 93 +92.500 8870 94 +92.550 8632 92 +92.600 8294 91 +92.650 7916 88 +92.700 7554 86 +92.750 7191 84 +92.800 6983 83 +92.850 6870 82 +92.900 6802 82 +92.950 6731 82 +93.000 6848 82 +93.050 6883 82 +93.100 6870 82 +93.150 6704 81 +93.200 6652 81 +93.250 6698 81 +93.300 6632 81 +93.350 6782 82 +93.400 6948 83 +93.450 6819 82 +93.500 6861 82 +93.550 7020 83 +93.600 7248 85 +93.650 7550 86 +93.700 7466 86 +93.750 7697 87 +93.800 7565 86 +93.850 7398 86 +93.900 7035 83 +93.950 7101 84 +94.000 6913 83 +94.050 6850 82 +94.100 6906 83 +94.150 6893 83 +94.200 6791 82 +94.250 6741 82 +94.300 6716 81 +94.350 6713 81 +94.400 6821 82 +94.450 6821 82 +94.500 6814 82 +94.550 6790 82 +94.600 6851 82 +94.650 6741 82 +94.700 7023 83 +94.750 7310 85 +94.800 7733 87 +94.850 8114 90 +94.900 8351 91 +94.950 8533 92 +95.000 8488 92 +95.050 8200 90 +95.100 7778 88 +95.150 7502 86 +95.200 7295 85 +95.250 6986 83 +95.300 6949 83 +95.350 6702 81 +95.400 6757 82 +95.450 6782 82 +95.500 6919 83 +95.550 6825 82 +95.600 6769 82 +95.650 6672 81 +95.700 6775 82 +95.750 6771 82 +95.800 6841 82 +95.850 6904 83 +95.900 7108 84 +95.950 7235 85 +96.000 7567 86 +96.050 7955 89 +96.100 8399 91 +96.150 8847 94 +96.200 8783 93 +96.250 8593 92 +96.300 8216 90 +96.350 7640 87 +96.400 7259 85 +96.450 7013 83 +96.500 6879 82 +96.550 6821 82 +96.600 6698 81 +96.650 6732 82 +96.700 6624 81 +96.750 6774 82 +96.800 6916 83 +96.850 6840 82 +96.900 6717 81 +96.950 6778 82 +97.000 6776 82 +97.050 6689 81 +97.100 6801 82 +97.150 6886 82 +97.200 6978 83 +97.250 7216 84 +97.300 7584 87 +97.350 7780 88 +97.400 7739 87 +97.450 7696 87 +97.500 7558 86 +97.550 7346 85 +97.600 7193 84 +97.650 6801 82 +97.700 6645 81 +97.750 6677 81 +97.800 6563 81 +97.850 6642 81 +97.900 6680 81 +97.950 6610 81 +98.000 6682 81 +98.050 6475 80 +98.100 6701 81 +98.150 6662 81 +98.200 6588 81 +98.250 6556 80 +98.300 6780 82 +98.350 7010 83 +98.400 7027 83 +98.450 7386 85 +98.500 7876 88 +98.550 8248 90 +98.600 8740 93 +98.650 8739 93 +98.700 8704 93 +98.750 8156 90 +98.800 7733 87 +98.850 7373 85 +98.900 6919 83 +98.950 6713 81 +99.000 6742 82 +99.050 6663 81 +99.100 6686 81 +99.150 6642 81 +99.200 6584 81 +99.250 6574 81 +99.300 6524 80 +99.350 6450 80 +99.400 6581 81 +99.450 6648 81 +99.500 6802 82 +99.550 6962 83 +99.600 7227 85 +99.650 7636 87 +99.700 8325 91 +99.750 9406 96 +99.800 10464 102 +99.850 11219 105 +99.900 11306 106 +99.950 10811 103 +100.000 10033 100 +100.050 8829 93 +100.100 7830 88 +100.150 7237 85 +100.200 6907 83 +100.250 6644 81 +100.300 6628 81 +100.350 6684 81 +100.400 6727 82 +100.450 6688 81 +100.500 6622 81 +100.550 6592 81 +100.600 6539 80 +100.650 6623 81 +100.700 6646 81 +100.750 6756 82 +100.800 6709 81 +100.850 6551 80 +100.900 6831 82 +100.950 6555 80 +101.000 6723 81 +101.050 6614 81 +101.100 6564 81 +101.150 6673 81 +101.200 6604 81 +101.250 6635 81 +101.300 6720 81 +101.350 6447 80 +101.400 6644 81 +101.450 6532 80 +101.500 6458 80 +101.550 6442 80 +101.600 6546 80 +101.650 6440 80 +101.700 6538 80 +101.750 6553 80 +101.800 6591 81 +101.850 6716 81 +101.900 6561 81 +101.950 6535 80 +102.000 6586 81 +102.050 6680 81 +102.100 6831 82 +102.150 7148 84 +102.200 7401 86 +102.250 7942 89 +102.300 8278 90 +102.350 8399 91 +102.400 8541 92 +102.450 8195 90 +102.500 7783 88 +102.550 7375 85 +102.600 7078 84 +102.650 6930 83 +102.700 6795 82 +102.750 6683 81 +102.800 6557 80 +102.850 6482 80 +102.900 6459 80 +102.950 6499 80 +103.000 6618 81 +103.050 6585 81 +103.100 6486 80 +103.150 6525 80 +103.200 6763 82 +103.250 6708 81 +103.300 6716 81 +103.350 6762 82 +103.400 7061 84 +103.450 7385 85 +103.500 7725 87 +103.550 7856 88 +103.600 8141 90 +103.650 8012 89 +103.700 7856 88 +103.750 7674 87 +103.800 7151 84 +103.850 6853 82 +103.900 6628 81 +103.950 6581 81 +104.000 6479 80 +104.050 6520 80 +104.100 6546 80 +104.150 6619 81 +104.200 6681 81 +104.250 6529 80 +104.300 6402 80 +104.350 6436 80 +104.400 6401 80 +104.450 6474 80 +104.500 6614 81 +104.550 6826 82 +104.600 6901 83 +104.650 7014 83 +104.700 7646 87 +104.750 8185 90 +104.800 8563 92 +104.850 8974 94 +104.900 9196 95 +104.950 8913 94 +105.000 8399 91 +105.050 7815 88 +105.100 7257 85 +105.150 6831 82 +105.200 6531 80 +105.250 6582 81 +105.300 6560 80 +105.350 6534 80 +105.400 6594 81 +105.450 6480 80 +105.500 6506 80 +105.550 6508 80 +105.600 6503 80 +105.650 6489 80 +105.700 6438 80 +105.750 6571 81 +105.800 6521 80 +105.850 6598 81 +105.900 6765 82 +105.950 7008 83 +106.000 7324 85 +106.050 7656 87 +106.100 7755 88 +106.150 7873 88 +106.200 7747 88 +106.250 7552 86 +106.300 7238 85 +106.350 6994 83 +106.400 6918 83 +106.450 6681 81 +106.500 6646 81 +106.550 6520 80 +106.600 6430 80 +106.650 6572 81 +106.700 6467 80 +106.750 6621 81 +106.800 6384 79 +106.850 6371 79 +106.900 6524 80 +106.950 6538 80 +107.000 6396 79 +107.050 6366 79 +107.100 6534 80 +107.150 6596 81 +107.200 6621 81 +107.250 6858 82 +107.300 7430 86 +107.350 7753 88 +107.400 7919 88 +107.450 8024 89 +107.500 7608 87 +107.550 7331 85 +107.600 7144 84 +107.650 7006 83 +107.700 6822 82 +107.750 6670 81 +107.800 6463 80 +107.850 6459 80 +107.900 6505 80 +107.950 6563 81 +108.000 6436 80 +108.050 6381 79 +108.100 6363 79 +108.150 6569 81 +108.200 6568 81 +108.250 6327 79 +108.300 6301 79 +108.350 6517 80 +108.400 6330 79 +108.450 6365 79 +108.500 6327 79 +108.550 6305 79 +108.600 6327 79 +108.650 6322 79 +108.700 6388 79 +108.750 6401 80 +108.800 6453 80 +108.850 6554 80 +108.900 6475 80 +108.950 6506 80 +109.000 6486 80 +109.050 6332 79 +109.100 6378 79 +109.150 6332 79 +109.200 6306 79 +109.250 6262 79 +109.300 6440 80 +109.350 6347 79 +109.400 6380 79 +109.450 6499 80 +109.500 6360 79 +109.550 6444 80 +109.600 6516 80 +109.650 6723 81 +109.700 6920 83 +109.750 7152 84 +109.800 7828 88 +109.850 8625 92 +109.900 9542 97 +109.950 10351 101 +110.000 10767 103 +110.050 10631 103 +110.100 9950 99 +110.150 9014 94 +110.200 8288 91 +110.250 7573 87 +110.300 7122 84 +110.350 6870 82 +110.400 6716 81 +110.450 6558 80 +110.500 6486 80 +110.550 6584 81 +110.600 6496 80 +110.650 6575 81 +110.700 6558 80 +110.750 6591 81 +110.800 6541 80 +110.850 6494 80 +110.900 6538 80 +110.950 6469 80 +111.000 6628 81 +111.050 6881 82 +111.100 6980 83 +111.150 7298 85 +111.200 7620 87 +111.250 7818 88 +111.300 8201 90 +111.350 8211 90 +111.400 7773 88 +111.450 7438 86 +111.500 6973 83 +111.550 6767 82 +111.600 6706 81 +111.650 6676 81 +111.700 6417 80 +111.750 6589 81 +111.800 6534 80 +111.850 6366 79 +111.900 6409 80 +111.950 6493 80 +112.000 6383 79 +112.050 6398 79 +112.100 6423 80 +112.150 6313 79 +112.200 6508 80 +112.250 6360 79 +112.300 6348 79 +112.350 6465 80 +112.400 6354 79 +112.450 6465 80 +112.500 6541 80 +112.550 6435 80 +112.600 6380 79 +112.650 6420 80 +112.700 6314 79 +112.750 6393 79 +112.800 6228 78 +112.850 6475 80 +112.900 6354 79 +112.950 6410 80 +113.000 6216 78 +113.050 6351 79 +113.100 6487 80 +113.150 6470 80 +113.200 6362 79 +113.250 6453 80 +113.300 6249 79 +113.350 6381 79 +113.400 6454 80 +113.450 6316 79 +113.500 6428 80 +113.550 6425 80 +113.600 6316 79 +113.650 6465 80 +113.700 6581 81 +113.750 6775 82 +113.800 6851 82 +113.850 6849 82 +113.900 7129 84 +113.950 7218 84 +114.000 7014 83 +114.050 7128 84 +114.100 6929 83 +114.150 6792 82 +114.200 6736 82 +114.250 6845 82 +114.300 6529 80 +114.350 6618 81 +114.400 6556 80 +114.450 6692 81 +114.500 6600 81 +114.550 6302 79 +114.600 6423 80 +114.650 6538 80 +114.700 6375 79 +114.750 6242 79 +114.800 6619 81 +114.850 6638 81 +114.900 6752 82 +114.950 6898 83 +115.000 7189 84 +115.050 7549 86 +115.100 8336 91 +115.150 9170 95 +115.200 9980 99 +115.250 10682 103 +115.300 10939 104 +115.350 10662 103 +115.400 9998 99 +115.450 9114 95 +115.500 8145 90 +115.550 7421 86 +115.600 7012 83 +115.650 6906 83 +115.700 6784 82 +115.750 6702 81 +115.800 6598 81 +115.850 6589 81 +115.900 6470 80 +115.950 6348 79 +116.000 6670 81 +116.050 6563 81 +116.100 6477 80 +116.150 6474 80 +116.200 6444 80 +116.250 6411 80 +116.300 6280 79 +116.350 6442 80 +116.400 6684 81 +116.450 6566 81 +116.500 6643 81 +116.550 6879 82 +116.600 7000 83 +116.650 6925 83 +116.700 6944 83 +116.750 6702 81 +116.800 6787 82 +116.850 6663 81 +116.900 6478 80 +116.950 6586 81 +117.000 6575 81 +117.050 6462 80 +117.100 6608 81 +117.150 6552 80 +117.200 6446 80 +117.250 6508 80 +117.300 6514 80 +117.350 6348 79 +117.400 6377 79 +117.450 6415 80 +117.500 6416 80 +117.550 6380 79 +117.600 6625 81 +117.650 6572 81 +117.700 6472 80 +117.750 6528 80 +117.800 6629 81 +117.850 6791 82 +117.900 7075 84 +117.950 7098 84 +118.000 7292 85 +118.050 7379 85 +118.100 7207 84 +118.150 6995 83 +118.200 6863 82 +118.250 6732 82 +118.300 6684 81 +118.350 6595 81 +118.400 6397 79 +118.450 6364 79 +118.500 6489 80 +118.550 6383 79 +118.600 6327 79 +118.650 6471 80 +118.700 6317 79 +118.750 6380 79 +118.800 6229 78 +118.850 6297 79 +118.900 6428 80 +118.950 6557 80 +119.000 6568 81 +119.050 6612 81 +119.100 6583 81 +119.150 6754 82 +119.200 6815 82 +119.250 7006 83 +119.300 7322 85 +119.350 7629 87 +119.400 7796 88 +119.450 7859 88 +119.500 7600 87 +119.550 7320 85 +119.600 6956 83 +119.650 6751 82 +119.700 6706 81 +119.750 6509 80 +119.800 6551 80 +119.850 6651 81 +119.900 6365 79 +119.950 6401 80 +120.000 6380 79 +120.050 6389 79 +120.100 6315 79 +120.150 6277 79 +120.200 6226 78 +120.250 6168 78 +120.300 6275 79 +120.350 6413 80 +120.400 6341 79 +120.450 6266 79 +120.500 6283 79 +120.550 6166 78 +120.600 6403 80 +120.650 6407 80 +120.700 6496 80 +120.750 6494 80 +120.800 6500 80 +120.850 6372 79 +120.900 6468 80 +120.950 6482 80 +121.000 6204 78 +121.050 6291 79 +121.100 6317 79 +121.150 6333 79 +121.200 6280 79 +121.250 6400 80 +121.300 6399 79 +121.350 6471 80 +121.400 6320 79 +121.450 6256 79 +121.500 6296 79 +121.550 6384 79 +121.600 6508 80 +121.650 6248 79 +121.700 6269 79 +121.750 6325 79 +121.800 6193 78 +121.850 6322 79 +121.900 6072 77 +121.950 6217 78 +122.000 6128 78 +122.050 6320 79 +122.100 6351 79 +122.150 6269 79 +122.200 6358 79 +122.250 6474 80 +122.300 6381 79 +122.350 6309 79 +122.400 6418 80 +122.450 6440 80 +122.500 6223 78 +122.550 6133 78 +122.600 6355 79 +122.650 6437 80 +122.700 6286 79 +122.750 6296 79 +122.800 6343 79 +122.850 6209 78 +122.900 6332 79 +122.950 6371 79 +123.000 6306 79 +123.050 6291 79 +123.100 6343 79 +123.150 6362 79 +123.200 6231 78 +123.250 6305 79 +123.300 6585 81 +123.350 6371 79 +123.400 6635 81 +123.450 6747 82 +123.500 7009 83 +123.550 7486 86 +123.600 8011 89 +123.650 8779 93 +123.700 8945 94 +123.750 8816 93 +123.800 8594 92 +123.850 8194 90 +123.900 7685 87 +123.950 7303 85 +124.000 6922 83 +124.050 6624 81 +124.100 6592 81 +124.150 6489 80 +124.200 6459 80 +124.250 6413 80 +124.300 6376 79 +124.350 6346 79 +124.400 6187 78 +124.450 6185 78 +124.500 6204 78 +124.550 6216 78 +124.600 6196 78 +124.650 6164 78 +124.700 6265 79 +124.750 6343 79 +124.800 6155 78 +124.850 6278 79 +124.900 6365 79 +124.950 6481 80 +125.000 6588 81 +125.050 6881 82 +125.100 7188 84 +125.150 7355 85 +125.200 7588 87 +125.250 7432 86 +125.300 7340 85 +125.350 6945 83 +125.400 6794 82 +125.450 6590 81 +125.500 6597 81 +125.550 6458 80 +125.600 6406 80 +125.650 6311 79 +125.700 6292 79 +125.750 6293 79 +125.800 6356 79 +125.850 6217 78 +125.900 6321 79 +125.950 6348 79 +126.000 6219 78 +126.050 6533 80 +126.100 6387 79 +126.150 6520 80 +126.200 6544 80 +126.250 6486 80 +126.300 6655 81 +126.350 6710 81 +126.400 6806 82 +126.450 7056 84 +126.500 7559 86 +126.550 8184 90 +126.600 8836 94 +126.650 9551 97 +126.700 9949 99 +126.750 9719 98 +126.800 9393 96 +126.850 8862 94 +126.900 8069 89 +126.950 7456 86 +127.000 7300 85 +127.050 6987 83 +127.100 6486 80 +127.150 6521 80 +127.200 6553 80 +127.250 6448 80 +127.300 6341 79 +127.350 6424 80 +127.400 6378 79 +127.450 6336 79 +127.500 6243 79 +127.550 6271 79 +127.600 6239 78 +127.650 6362 79 +127.700 6262 79 +127.750 6339 79 +127.800 6473 80 +127.850 6483 80 +127.900 6439 80 +127.950 6407 80 +128.000 6718 81 +128.050 6908 83 +128.100 7315 85 +128.150 7639 87 +128.200 7794 88 +128.250 7883 88 +128.300 7731 87 +128.350 7654 87 +128.400 7409 86 +128.450 7125 84 +128.500 6884 82 +128.550 6669 81 +128.600 6359 79 +128.650 6411 80 +128.700 6510 80 +128.750 6452 80 +128.800 6476 80 +128.850 6422 80 +128.900 6384 79 +128.950 6188 78 +129.000 6263 79 +129.050 6411 80 +129.100 6459 80 +129.150 6353 79 +129.200 6353 79 +129.250 6356 79 +129.300 6268 79 +129.350 6373 79 +129.400 6248 79 +129.450 6272 79 +129.500 6521 80 +129.550 6570 81 +129.600 6495 80 +129.650 6970 83 +129.700 7047 83 +129.750 7132 84 +129.800 7421 86 +129.850 7372 85 +129.900 7392 85 +129.950 7100 84 +130.000 6871 82 +130.050 6583 81 +130.100 6600 81 +130.150 6721 81 +130.200 6312 79 +130.250 6450 80 +130.300 6418 80 +130.350 6493 80 +130.400 6354 79 +130.450 6263 79 +130.500 6366 79 +130.550 6183 78 +130.600 6322 79 +130.650 6305 79 +130.700 6349 79 +130.750 6319 79 +130.800 6474 80 +130.850 6187 78 +130.900 6219 78 +130.950 6313 79 +131.000 6243 79 +131.050 6336 79 +131.100 6304 79 +131.150 6301 79 +131.200 6247 79 +131.250 6246 79 +131.300 6311 79 +131.350 6451 80 +131.400 6379 80 +131.450 6180 78 +131.500 6263 79 +131.550 6263 79 +131.600 6229 79 +131.650 6354 80 +131.700 6395 81 +131.750 6371 81 +131.800 6319 80 +131.850 6349 81 +131.900 6335 81 +131.950 6275 81 +132.000 6390 82 +132.050 6378 82 +132.100 6427 82 +132.150 6354 82 +132.200 6400 82 +132.250 6289 82 +132.300 6322 82 +132.350 6343 82 +132.400 6451 83 +132.450 6535 84 +132.500 6480 84 +132.550 6467 84 +132.600 6580 85 +132.650 6544 85 +132.700 6754 86 +132.750 7085 88 +132.800 7217 89 +132.850 7701 93 +132.900 8170 96 +132.950 8754 99 +133.000 9614 104 +133.050 9976 106 +133.100 10155 107 +133.150 9828 106 +133.200 9250 103 +133.250 8535 99 +133.300 7982 96 +133.350 7578 94 +133.400 7154 91 +133.450 7028 90 +133.500 6810 89 +133.550 6582 88 +133.600 6416 87 +133.650 6470 87 +133.700 6424 87 +133.750 6367 87 +133.800 6469 88 +133.850 6450 88 +133.900 6432 88 +133.950 6400 88 +134.000 6373 88 +134.050 6517 89 +134.100 6577 90 +134.150 6362 88 +134.200 6487 89 +134.250 6584 90 +134.300 6681 91 +134.350 6602 91 +134.400 6444 90 +134.450 6826 93 +134.500 6942 94 +134.550 7325 96 +134.600 7718 99 +134.650 8028 101 +134.700 8417 104 +134.750 8686 106 +134.800 8725 106 +134.850 8653 106 +134.900 8453 105 +134.950 8104 103 +135.000 7474 99 +135.050 7265 98 +135.100 7077 97 +135.150 7031 97 +135.200 6914 96 +135.250 6648 94 +135.300 6571 94 +135.350 6498 94 +135.400 6505 94 +135.450 6583 95 +135.500 6699 96 +135.550 6490 94 +135.600 6515 95 +135.650 6460 94 +135.700 6302 94 +135.750 6581 96 +135.800 6550 96 +135.850 6440 95 +135.900 6491 96 +135.950 6517 96 +136.000 6643 97 +136.050 6559 97 +136.100 6508 97 +136.150 6614 98 +136.200 6665 98 +136.250 6545 97 +136.300 6411 97 +136.350 6574 98 +136.400 6951 101 +136.450 7127 102 +136.500 7091 102 +136.550 7273 104 +136.600 7113 103 +136.650 7046 103 +136.700 6852 101 +136.750 6829 101 +136.800 6907 102 +136.850 6695 101 +136.900 6619 100 +136.950 6447 99 +137.000 6527 100 +137.050 6737 102 +137.100 6590 101 +137.150 6502 101 +137.200 6411 100 +137.250 6576 102 +137.300 6492 101 +137.350 6502 101 +137.400 6534 102 +137.450 6517 102 +137.500 6394 101 +137.550 6448 102 +137.600 6428 102 +137.650 6468 102 +137.700 6534 103 +137.750 6437 102 +137.800 6612 104 +137.850 6651 105 +137.900 6763 106 +137.950 6939 107 +138.000 6760 106 +138.050 6941 108 +138.100 7126 109 +138.150 7620 113 +138.200 7948 116 +138.250 8294 119 +138.300 8389 120 +138.350 8337 120 +138.400 8080 118 +138.450 7754 116 +138.500 7603 115 +138.550 7338 113 +138.600 7185 112 +138.650 7035 111 +138.700 6965 111 +138.750 6758 109 +138.800 6551 108 +138.850 6685 109 +138.900 6550 108 +138.950 6613 109 +139.000 6636 109 +139.050 6523 109 +139.100 6567 109 +139.150 6474 109 +139.200 6476 109 +139.250 6652 111 +139.300 6503 110 +139.350 6367 109 +139.400 6445 110 +139.450 6442 110 +139.500 6534 111 +139.550 6618 112 +139.600 6529 111 +139.650 6539 111 +139.700 6537 112 +139.750 6521 112 +139.800 6689 113 +139.850 6539 112 +139.900 6792 115 +139.950 6749 115 +140.000 6886 116 +140.050 7209 119 +140.100 7357 120 +140.150 7393 121 +140.200 7689 124 +140.250 7460 122 +140.300 7349 121 +140.350 7210 120 +140.400 7046 119 +140.450 6680 116 +140.500 6664 116 +140.550 6535 116 +140.600 6666 117 +140.650 6603 117 +140.700 6588 117 +140.750 6416 115 +140.800 6555 117 +140.850 6546 117 +140.900 6510 117 +140.950 6699 119 +141.000 6477 117 +141.050 6512 118 +141.100 6791 121 +141.150 6519 118 +141.200 6429 118 +141.250 6380 118 +141.300 6456 118 +141.350 6484 119 +141.400 6452 119 +141.450 6517 120 +141.500 6579 121 +141.550 6565 121 +141.600 6724 122 +141.650 6780 123 +141.700 6622 122 +141.750 6699 123 +141.800 6784 124 +141.850 6603 123 +141.900 6768 124 +141.950 7209 129 +142.000 7441 131 +142.050 7739 134 +142.100 7706 134 +142.150 7905 136 +142.200 7814 135 +142.250 7631 134 +142.300 7485 133 +142.350 7238 131 +142.400 6982 129 +142.450 6814 128 +142.500 6730 127 +142.550 6697 127 +142.600 6570 126 +142.650 6593 127 +142.700 6499 126 +142.750 6430 126 +142.800 6475 126 +142.850 6471 127 +142.900 6477 127 +142.950 6251 125 +143.000 6333 126 +143.050 6441 127 +143.100 6236 126 +143.150 6382 127 +143.200 6296 127 +143.250 6279 127 +143.300 6372 128 +143.350 6543 130 +143.400 6355 128 +143.450 6362 129 +143.500 6326 129 +143.550 6404 130 +143.600 6561 132 +143.650 6317 129 +143.700 6604 133 +143.750 6606 133 +143.800 6568 133 +143.850 6555 133 +143.900 6607 134 +143.950 6770 136 +144.000 7197 140 +144.050 7449 143 +144.100 7713 146 +144.150 7774 147 +144.200 7823 147 +144.250 7875 148 +144.300 7642 146 +144.350 7217 142 +144.400 7051 141 +144.450 6838 139 +144.500 6752 139 +144.550 6773 139 +144.600 6588 138 +144.650 6589 138 +144.700 6731 140 +144.750 6551 138 +144.800 6543 138 +144.850 6505 138 +144.900 6427 138 +144.950 6393 138 +145.000 6274 137 +145.050 6491 139 +145.100 6351 138 +145.150 6319 138 +145.200 6449 140 +145.250 6504 141 +145.300 6509 141 +145.350 6336 139 +145.400 6337 140 +145.450 6299 140 +145.500 6386 141 +145.550 6443 142 +145.600 6386 142 +145.650 6313 141 +145.700 6355 142 +145.750 6496 144 +145.800 6514 144 +145.850 6493 144 +145.900 6675 147 +145.950 6528 145 +146.000 6698 148 +146.050 6855 150 +146.100 7096 153 +146.150 7087 153 +146.200 7224 155 +146.250 7208 155 +146.300 7485 158 +146.350 7495 159 +146.400 7232 156 +146.450 7222 156 +146.500 6971 154 +146.550 7041 155 +146.600 7037 155 +146.650 6863 154 +146.700 6623 151 +146.750 6508 150 +146.800 6501 151 +146.850 6656 153 +146.900 6588 152 +146.950 6453 151 +147.000 6718 155 +147.050 6455 152 +147.100 6609 154 +147.150 6406 152 +147.200 6352 152 +147.250 6531 154 +147.300 6519 154 +147.350 6472 154 +147.400 6564 156 +147.450 6490 155 +147.500 6487 155 +147.550 6638 158 +147.600 6512 156 +147.650 6457 156 +147.700 6715 160 +147.750 6515 158 +147.800 6571 159 +147.850 6513 158 +147.900 6480 158 +147.950 6705 161 +148.000 6869 164 +148.050 6529 160 +148.100 6458 159 +148.150 6753 163 +148.200 6695 163 +148.250 6819 165 +148.300 7304 171 +148.350 7381 173 +148.400 7626 176 +148.450 7868 179 +148.500 8659 188 +148.550 8605 188 +148.600 8547 188 +148.650 8336 186 +148.700 8030 183 +148.750 7981 183 +148.800 7759 181 +148.850 7409 177 +148.900 7227 175 +148.950 7015 173 +149.000 6965 173 +149.050 6635 169 +149.100 6689 170 +149.150 6890 173 +149.200 6691 171 +149.250 6548 170 +149.300 6539 170 +149.350 6554 170 +149.400 6463 170 +149.450 6488 170 +149.500 6756 174 +149.550 6576 172 +149.600 6391 170 +149.650 6505 172 +149.700 6566 174 +149.750 6260 170 +149.800 6381 172 +149.850 6520 174 +149.900 6558 175 +149.950 6697 177 +150.000 6788 179 +150.050 6412 174 +150.100 6473 176 +150.150 6363 175 +150.200 6632 179 +150.250 6764 181 +150.300 6713 181 +150.350 6691 181 +150.400 6661 181 +150.450 6554 180 +150.500 6497 180 +150.550 6647 182 +150.600 6671 183 +150.650 6595 182 +150.700 6593 183 +150.750 6638 184 +150.800 6650 184 +150.850 6836 188 +150.900 6633 185 +150.950 6726 187 +151.000 6689 187 +151.050 6790 189 +151.100 6761 189 +151.150 6789 190 +151.200 6827 191 +151.250 6667 189 +151.300 6881 192 +151.350 6659 190 +151.400 6646 190 +151.450 6577 190 +151.500 6651 191 +151.550 6551 190 +151.600 6525 190 +151.650 6628 192 +151.700 6678 194 +151.750 6655 194 +151.800 6469 191 +151.850 6666 195 +151.900 6713 196 +151.950 6819 198 +152.000 6740 198 +152.050 6659 197 +152.100 6779 199 +152.150 6743 199 +152.200 6780 200 +152.250 6602 198 +152.300 6468 197 +152.350 6696 201 +152.400 6626 200 +152.450 6430 198 +152.500 6386 197 +152.550 6744 203 +152.600 6804 205 +152.650 6396 199 +152.700 6407 200 +152.750 6616 204 +152.800 6652 205 +152.850 6924 209 +152.900 6779 208 +152.950 6637 206 +153.000 6719 208 +153.050 6591 207 +153.100 6766 210 +153.150 6780 211 +153.200 6676 210 +153.250 6783 212 +153.300 6933 215 +153.350 6641 211 +153.400 6672 212 +153.450 6734 213 +153.500 6688 213 +153.550 6937 218 +153.600 7236 223 +153.650 7054 221 +153.700 7095 222 +153.750 7100 223 +153.800 6870 220 +153.850 6638 217 +153.900 6702 218 diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.pcr b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.pcr new file mode 100644 index 000000000..2c92a2d2d --- /dev/null +++ b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.pcr @@ -0,0 +1,86 @@ +COMM Y2O3 Ge(551) 300mm_varH 15/10/13 +! Current global Chi2 (Bragg contrib.) = 1.263 +! Files => DAT-file: y2o3.dat, PCR-file: y2o3 +!Job Npr Nph Nba Nex Nsc Nor Dum Iwg Ilo Ias Res Ste Nre Cry Uni Cor Opt Aut + 1 7 1 21 2 0 0 0 0 0 0 0 0 0 0 0 0 1 1 +! +!Ipr Ppl Ioc Mat Pcr Ls1 Ls2 Ls3 NLI Prf Ins Rpa Sym Hkl Fou Sho Ana + 0 2 1 0 1 0 4 0 0 2 10 0 1 0 0 1 1 +! +! Lambda1 Lambda2 Ratio Bkpos Wdt Cthm muR AsyLim Rpolarz 2nd-muR -> Patt# 1 + 1.548220 1.548220 0.00000 10.000 20.000 0.0000 1.5000 160.00 0.0000 0.0000 +! +!NCY Eps R_at R_an R_pr R_gl Thmin Step Thmax PSD Sent0 + 1 0.10 1.00 1.00 1.00 1.00 0.9500 0.050019 153.9000 0.000 0.000 +! +!2Theta/TOF/E(Kev) Background for Pattern# 1 + 12.5856 9864.0967 0.00 + 19.4181 9431.1865 0.00 + 21.8751 9165.1064 0.00 + 27.8998 8813.4053 0.00 + 32.9147 8632.3789 0.00 + 39.1152 8237.0059 0.00 + 45.7120 7896.9585 0.00 + 51.9387 7764.3862 0.00 + 60.5580 7483.5161 0.00 + 68.1982 7260.7822 0.00 + 81.3276 7112.5850 0.00 + 88.7996 6847.3413 0.00 + 94.3171 6772.0112 0.00 + 98.1541 6625.6704 0.00 + 100.9813 6586.0649 0.00 + 104.3134 6502.6460 0.00 + 108.7225 6404.9531 0.00 + 116.0673 6495.7471 0.00 + 121.4862 6277.9780 0.00 + 131.2805 6314.6699 0.00 + 135.7928 6504.0566 0.00 +! +! Excluded regions (LowT HighT) for Pattern# 1 + 0.00 12.00 + 137.50 180.00 +! +! + 0 !Number of refined parameters +! +! Zero Code SyCos Code SySin Code Lambda Code MORE ->Patt# 1 + -0.01625 0.0 0.00000 0.0 0.00000 0.0 0.000000 0.00 0 +!------------------------------------------------------------------------------- +! Data for PHASE number: 1 ==> Current R_Bragg for Pattern# 1: 0.0000 +!------------------------------------------------------------------------------- +Y2O3 +! +!Nat Dis Ang Pr1 Pr2 Pr3 Jbt Irf Isy Str Furth ATZ Nvk Npr More + 3 0 0 0.0 0.0 1.0 0 0 0 0 0 3612.974 0 7 0 +! +! +I a -3 <--Space group symbol +!Atom Typ X Y Z Biso Occ In Fin N_t Spc /Codes +! beta11 beta22 beta33 beta12 beta13 beta23 /Codes +Y1 Y -0.03236 0.00000 0.25000 0.00000 0.50000 0 0 2 0 + 0.00 0.00 0.00 0.00 0.00 + 0.00303 0.00272 0.00295 0.00000 0.00000 -0.00025 + 0.00 0.00 0.00 0.00 0.00 0.00 +Y2 Y 0.25000 0.25000 0.25000 0.00000 0.16667 0 0 2 0 + 0.00 0.00 0.00 0.00 0.00 + 0.00304 0.00304 0.00304 -0.00013 -0.00013 -0.00013 + 0.00 0.00 0.00 0.00 0.00 0.00 +O1 O 0.39072 0.15204 0.38030 0.00000 1.00000 0 0 2 0 + 0.00 0.00 0.00 0.00 0.00 + 0.00299 0.00310 0.00273 -0.00007 -0.00020 -0.00001 + 0.00 0.00 0.00 0.00 0.00 0.00 +!-------> Profile Parameters for Pattern # 1 ----> Phase # 1 +! Scale Shape1 Bov Str1 Str2 Str3 Strain-Model + 1.060200 0.00000 0.00000 0.00000 0.00000 0.00000 0 + 0.00000 0.000 0.000 0.000 0.000 0.000 +! U V W X Y GauSiz LorSiz Size-Model + 0.036631 -0.068345 0.131426 0.000000 0.000000 0.000000 0.000000 0 + 0.00 0.00 0.00 0.00 0.00 0.00 0.00 +! a b c alpha beta gamma # Cell Info + 10.605744 10.605744 10.605744 90.000000 90.000000 90.000000 + 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 +! Pref1 Pref2 Asy1 Asy2 Asy3 Asy4 S_L D_L + 0.00000 0.00000 0.17694 0.03411 0.00000 0.00000 0.00000 0.00000 + 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 +! 2Th1/TOF1 2Th2/TOF2 Pattern to plot + 12.000 137.500 1 diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.prf b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.prf new file mode 100644 index 000000000..e2343ae1e --- /dev/null +++ b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.prf @@ -0,0 +1,3333 @@ +IGOR +WAVES TwoTheta, Iobs, Icalc, Diff +BEGIN + 0.950 1229.00 9864.10 -8635.10 + 1.000 1229.00 9864.10 -8635.10 + 1.050 1190.00 9864.10 -8674.10 + 1.100 1096.00 9864.10 -8768.10 + 1.150 1142.00 9864.10 -8722.10 + 1.200 961.00 9864.10 -8903.10 + 1.250 975.00 9864.10 -8889.10 + 1.300 993.00 9864.10 -8871.10 + 1.350 974.00 9864.10 -8890.10 + 1.400 1099.00 9864.10 -8765.10 + 1.450 1036.00 9864.10 -8828.10 + 1.500 974.00 9864.10 -8890.10 + 1.550 968.00 9864.10 -8896.10 + 1.600 1012.00 9864.10 -8852.10 + 1.650 1050.00 9864.10 -8814.10 + 1.700 928.00 9864.10 -8936.10 + 1.750 988.00 9864.10 -8876.10 + 1.800 882.00 9864.10 -8982.10 + 1.850 962.00 9864.10 -8902.10 + 1.900 1055.00 9864.10 -8809.10 + 1.950 909.00 9864.10 -8955.10 + 2.000 1026.00 9864.10 -8838.10 + 2.050 1319.00 9864.10 -8545.10 + 2.100 1446.00 9864.10 -8418.10 + 2.150 1360.00 9864.10 -8504.10 + 2.200 1264.00 9864.10 -8600.10 + 2.250 1265.00 9864.10 -8599.10 + 2.300 1319.00 9864.10 -8545.10 + 2.350 1259.00 9864.10 -8605.10 + 2.400 1074.00 9864.10 -8790.10 + 2.450 1056.00 9864.10 -8808.10 + 2.500 1040.00 9864.10 -8824.10 + 2.550 1241.00 9864.10 -8623.10 + 2.600 1279.00 9864.10 -8585.10 + 2.650 1261.00 9864.10 -8603.10 + 2.700 1334.00 9864.10 -8530.10 + 2.750 1356.00 9864.10 -8508.10 + 2.800 1392.00 9864.10 -8472.10 + 2.850 1799.00 9864.10 -8065.10 + 2.900 1984.00 9864.10 -7880.10 + 2.950 2125.00 9864.10 -7739.10 + 3.000 2576.00 9864.10 -7288.10 + 3.050 2837.00 9864.10 -7027.10 + 3.100 2784.00 9864.10 -7080.10 + 3.150 3023.00 9864.10 -6841.10 + 3.200 3458.00 9864.10 -6406.10 + 3.250 3913.00 9864.10 -5951.10 + 3.300 3808.00 9864.10 -6056.10 + 3.350 4084.00 9864.10 -5780.10 + 3.400 4701.00 9864.10 -5163.10 + 3.450 4491.00 9864.10 -5373.10 + 3.500 5117.00 9864.10 -4747.10 + 3.550 5752.00 9864.10 -4112.10 + 3.600 5792.00 9864.10 -4072.10 + 3.650 6356.00 9864.10 -3508.10 + 3.700 6042.00 9864.10 -3822.10 + 3.750 6433.00 9864.10 -3431.10 + 3.800 6674.00 9864.10 -3190.10 + 3.850 7080.00 9864.10 -2784.10 + 3.900 7902.00 9864.10 -1962.10 + 3.950 7803.00 9864.10 -2061.10 + 4.000 7870.00 9864.10 -1994.10 + 4.050 8478.00 9864.10 -1386.10 + 4.100 9152.00 9864.10 -712.10 + 4.150 8855.00 9864.10 -1009.10 + 4.200 9042.00 9864.10 -822.10 + 4.250 9770.00 9864.10 -94.10 + 4.300 9596.00 9864.10 -268.10 + 4.350 9972.00 9864.10 107.90 + 4.400 10452.00 9864.10 587.90 + 4.450 10258.00 9864.10 393.90 + 4.500 10462.00 9864.10 597.90 + 4.550 10813.00 9864.10 948.90 + 4.600 9978.00 9864.10 113.90 + 4.650 10598.00 9864.10 733.90 + 4.700 10353.00 9864.10 488.90 + 4.750 10303.00 9864.10 438.90 + 4.800 11228.00 9864.10 1363.90 + 4.850 10653.00 9864.10 788.90 + 4.900 10745.00 9864.10 880.90 + 4.950 10961.00 9864.10 1096.90 + 5.000 10615.00 9864.10 750.90 + 5.050 10150.00 9864.10 285.90 + 5.100 10021.00 9864.10 156.90 + 5.150 9824.00 9864.10 -40.10 + 5.200 9982.00 9864.10 117.90 + 5.250 10218.00 9864.10 353.90 + 5.300 11076.00 9864.10 1211.90 + 5.350 10348.00 9864.10 483.90 + 5.400 10792.00 9864.10 927.90 + 5.450 10333.00 9864.10 468.90 + 5.500 10383.00 9864.10 518.90 + 5.550 10320.00 9864.10 455.90 + 5.600 10057.00 9864.10 192.90 + 5.650 9721.00 9864.10 -143.10 + 5.700 10249.00 9864.10 384.90 + 5.750 10635.00 9864.10 770.90 + 5.800 10679.00 9864.10 814.90 + 5.850 10430.00 9864.10 565.90 + 5.900 10189.00 9864.10 324.90 + 5.950 10001.00 9864.10 136.90 + 6.000 10006.00 9864.10 141.90 + 6.050 10298.00 9864.10 433.90 + 6.100 10220.00 9864.10 355.90 + 6.150 10085.00 9864.10 220.90 + 6.200 10659.00 9864.10 794.90 + 6.250 10707.00 9864.10 842.90 + 6.300 10540.00 9864.10 675.90 + 6.350 10414.00 9864.10 549.90 + 6.400 10386.00 9864.10 521.90 + 6.450 10500.00 9864.10 635.90 + 6.500 10434.00 9864.10 569.90 + 6.550 10515.00 9864.10 650.90 + 6.600 10102.00 9864.10 237.90 + 6.650 10314.00 9864.10 449.90 + 6.700 10281.00 9864.10 416.90 + 6.750 10241.00 9864.10 376.90 + 6.800 10259.00 9864.10 394.90 + 6.850 10600.00 9864.10 735.90 + 6.900 10066.00 9864.10 201.90 + 6.950 10253.00 9864.10 388.90 + 7.000 10119.00 9864.10 254.90 + 7.050 10369.00 9864.10 504.90 + 7.100 10388.00 9864.10 523.90 + 7.150 10445.00 9864.10 580.90 + 7.200 10204.00 9864.10 339.90 + 7.250 10061.00 9864.10 196.90 + 7.300 10116.00 9864.10 251.90 + 7.350 10219.00 9864.10 354.90 + 7.400 10382.00 9864.10 517.90 + 7.450 10096.00 9864.10 231.90 + 7.500 9899.00 9864.10 34.90 + 7.550 9677.00 9864.10 -187.10 + 7.600 10218.00 9864.10 353.90 + 7.650 10074.00 9864.10 209.90 + 7.700 10529.00 9864.10 664.90 + 7.750 10445.00 9864.10 580.90 + 7.800 10111.00 9864.10 246.90 + 7.850 10248.00 9864.10 383.90 + 7.900 9773.00 9864.10 -91.10 + 7.950 9820.00 9864.10 -44.10 + 8.000 9797.00 9864.10 -67.10 + 8.050 10509.00 9864.10 644.90 + 8.100 10336.00 9864.10 471.90 + 8.150 10300.00 9864.10 435.90 + 8.200 10333.00 9864.10 468.90 + 8.250 10015.00 9864.10 150.90 + 8.300 10325.00 9864.10 460.90 + 8.350 10061.00 9864.10 196.90 + 8.400 9856.00 9864.10 -8.10 + 8.450 9999.00 9864.10 134.90 + 8.500 10258.00 9864.10 393.90 + 8.550 10605.00 9864.10 740.90 + 8.600 10331.00 9864.10 466.90 + 8.650 9978.00 9864.10 113.90 + 8.700 9951.00 9864.10 86.90 + 8.750 9932.00 9864.10 67.90 + 8.800 10030.00 9864.10 165.90 + 8.850 10280.00 9864.10 415.90 + 8.900 10115.00 9864.10 250.90 + 8.950 10250.00 9864.10 385.90 + 9.000 10364.00 9864.10 499.90 + 9.050 10298.00 9864.10 433.90 + 9.100 10390.00 9864.10 525.90 + 9.150 10050.00 9864.10 185.90 + 9.200 10061.00 9864.10 196.90 + 9.250 9915.00 9864.10 50.90 + 9.300 10171.00 9864.10 306.90 + 9.350 10289.00 9864.10 424.90 + 9.400 10254.00 9864.10 389.90 + 9.450 10520.00 9864.10 655.90 + 9.500 10399.00 9864.10 534.90 + 9.550 10184.00 9864.10 319.90 + 9.600 10436.00 9864.10 571.90 + 9.650 10196.00 9864.10 331.90 + 9.700 10250.00 9864.10 385.90 + 9.750 10071.00 9864.10 206.90 + 9.800 9992.00 9864.10 127.90 + 9.850 10319.00 9864.10 454.90 + 9.900 10249.00 9864.10 384.90 + 9.950 10285.00 9864.10 420.90 + 10.000 10231.00 9864.10 366.90 + 10.050 10143.00 9864.10 278.90 + 10.100 9833.00 9864.10 -31.10 + 10.150 10072.00 9864.10 207.90 + 10.200 9836.00 9864.10 -28.10 + 10.250 9778.00 9864.10 -86.10 + 10.300 10201.00 9864.10 336.90 + 10.350 10258.00 9864.10 393.90 + 10.400 10360.00 9864.10 495.90 + 10.450 10125.00 9864.10 260.90 + 10.500 9965.00 9864.10 100.90 + 10.550 10054.00 9864.10 189.90 + 10.600 9885.00 9864.10 20.90 + 10.650 10068.00 9864.10 203.90 + 10.700 9884.00 9864.10 19.90 + 10.750 10219.00 9864.10 354.90 + 10.800 10259.00 9864.10 394.90 + 10.850 10321.00 9864.10 456.90 + 10.900 10531.00 9864.10 666.90 + 10.950 10285.00 9864.10 420.90 + 11.000 10044.00 9864.10 179.90 + 11.050 9930.00 9864.10 65.90 + 11.100 9983.00 9864.10 118.90 + 11.150 9903.00 9864.10 38.90 + 11.200 9850.00 9864.10 -14.10 + 11.250 9850.00 9864.10 -14.10 + 11.300 10008.00 9864.10 143.90 + 11.350 9805.00 9864.10 -59.10 + 11.400 9678.00 9864.10 -186.10 + 11.450 10087.00 9864.10 222.90 + 11.500 10239.00 9864.10 374.90 + 11.550 9994.00 9864.10 129.90 + 11.600 9730.00 9864.10 -134.10 + 11.650 9901.00 9864.10 36.90 + 11.700 10288.00 9864.10 423.90 + 11.750 10052.00 9864.10 187.90 + 11.800 10039.00 9864.10 174.90 + 11.850 9792.00 9864.10 -72.10 + 11.900 10201.00 9864.10 336.90 + 11.950 10036.00 9864.10 171.90 + 12.000 9774.00 9864.10 -90.10 + 12.050 9520.00 9864.10 -344.10 + 12.100 10155.00 9864.10 290.90 + 12.150 10130.00 9864.10 265.90 + 12.200 10084.00 9864.10 219.90 + 12.250 9960.00 9864.10 95.90 + 12.300 9903.00 9864.10 38.90 + 12.350 10042.00 9864.10 177.90 + 12.400 10016.00 9864.10 151.90 + 12.450 9918.00 9864.10 53.90 + 12.500 9860.00 9864.10 -4.10 + 12.550 10053.00 9866.35 186.65 + 12.600 10040.00 9863.18 176.82 + 12.650 10097.00 9860.02 236.98 + 12.700 9810.00 9856.85 -46.85 + 12.750 9511.00 9853.68 -342.68 + 12.800 10075.00 9850.51 224.49 + 12.850 10051.00 9847.34 203.66 + 12.900 9975.00 9844.18 130.82 + 12.950 9649.00 9841.01 -192.01 + 13.000 9709.00 9837.84 -128.84 + 13.050 9911.00 9834.67 76.33 + 13.100 9846.00 9831.50 14.50 + 13.150 10034.00 9828.34 205.66 + 13.200 9822.00 9825.17 -3.17 + 13.250 9572.00 9822.00 -250.00 + 13.300 9877.00 9818.83 58.17 + 13.350 9682.00 9815.66 -133.66 + 13.400 9704.00 9812.50 -108.50 + 13.450 9887.00 9809.33 77.67 + 13.500 10049.00 9806.16 242.84 + 13.550 9986.00 9802.99 183.01 + 13.600 9619.00 9799.82 -180.82 + 13.650 9927.00 9796.66 130.34 + 13.700 9606.00 9793.49 -187.49 + 13.750 9317.00 9790.32 -473.32 + 13.800 9544.00 9787.15 -243.15 + 13.850 9889.00 9783.98 105.02 + 13.900 10002.00 9780.82 221.18 + 13.950 9571.00 9777.65 -206.65 + 14.000 9671.00 9774.48 -103.48 + 14.050 9728.00 9771.31 -43.31 + 14.100 9810.00 9768.14 41.86 + 14.150 9866.00 9764.98 101.02 + 14.200 9791.00 9761.81 29.19 + 14.250 9768.00 9758.64 9.36 + 14.300 9871.00 9755.47 115.53 + 14.350 9908.00 9752.30 155.70 + 14.400 9789.00 9749.14 39.86 + 14.450 9621.00 9745.97 -124.97 + 14.500 9844.00 9742.80 101.20 + 14.550 9419.00 9739.63 -320.63 + 14.600 9411.00 9736.46 -325.46 + 14.650 9679.00 9733.30 -54.30 + 14.700 9784.00 9730.13 53.87 + 14.750 9757.00 9726.96 30.04 + 14.800 9671.00 9723.79 -52.79 + 14.850 9809.00 9720.62 88.38 + 14.900 9838.00 9717.46 120.54 + 14.950 9782.00 9714.29 67.71 + 15.000 9539.00 9711.12 -172.12 + 15.050 9540.00 9707.95 -167.95 + 15.100 9637.00 9704.78 -67.78 + 15.150 9870.00 9701.62 168.38 + 15.200 9862.00 9698.45 163.55 + 15.250 9673.00 9695.28 -22.28 + 15.300 9862.00 9692.11 169.89 + 15.350 9520.00 9688.94 -168.94 + 15.400 9821.00 9685.78 135.22 + 15.450 9764.00 9682.61 81.39 + 15.500 9716.00 9679.44 36.56 + 15.550 9573.00 9676.27 -103.27 + 15.600 9828.00 9673.10 154.90 + 15.650 9900.00 9669.93 230.07 + 15.700 9683.00 9666.77 16.23 + 15.750 9660.00 9663.60 -3.60 + 15.800 9733.00 9660.43 72.57 + 15.850 9831.00 9657.26 173.74 + 15.900 9485.00 9654.09 -169.09 + 15.950 9541.00 9650.93 -109.93 + 16.000 9571.00 9647.76 -76.76 + 16.050 9564.00 9644.59 -80.59 + 16.100 9972.00 9641.43 330.57 + 16.150 9819.00 9638.27 180.73 + 16.200 9410.00 9635.14 -225.14 + 16.250 9186.00 9632.11 -446.11 + 16.300 9585.00 9629.38 -44.38 + 16.350 9606.00 9627.40 -21.40 + 16.400 9600.00 9626.94 -26.94 + 16.450 9541.00 9628.96 -87.96 + 16.500 9421.00 9634.08 -213.08 + 16.550 9701.00 9641.78 59.22 + 16.600 9823.00 9650.15 172.85 + 16.650 9671.00 9656.41 14.59 + 16.700 9786.00 9657.98 128.02 + 16.750 9762.00 9653.37 108.63 + 16.800 9512.00 9642.60 -130.60 + 16.850 9556.00 9627.52 -71.52 + 16.900 9692.00 9611.45 80.55 + 16.950 9462.00 9597.71 -135.71 + 17.000 9386.00 9588.00 -202.00 + 17.050 9310.00 9581.91 -271.91 + 17.100 9291.00 9578.06 -287.06 + 17.150 9020.00 9574.89 -554.89 + 17.200 9469.00 9571.73 -102.73 + 17.250 9694.00 9568.58 125.42 + 17.300 9639.00 9565.41 73.59 + 17.350 9434.00 9562.23 -128.23 + 17.400 9635.00 9559.06 75.94 + 17.450 9672.00 9555.89 116.11 + 17.500 9821.00 9552.72 268.28 + 17.550 9476.00 9549.55 -73.55 + 17.600 9433.00 9546.38 -113.38 + 17.650 9564.00 9543.21 20.79 + 17.700 9713.00 9540.05 172.95 + 17.750 9700.00 9536.88 163.12 + 17.800 9233.00 9533.71 -300.71 + 17.850 9630.00 9530.54 99.46 + 17.900 9713.00 9527.37 185.63 + 17.950 9343.00 9524.21 -181.21 + 18.000 9390.00 9521.04 -131.04 + 18.050 9275.00 9517.87 -242.87 + 18.100 9639.00 9514.70 124.30 + 18.150 9601.00 9511.53 89.47 + 18.200 9558.00 9508.37 49.63 + 18.250 9588.00 9505.20 82.80 + 18.300 9806.00 9502.03 303.97 + 18.350 9674.00 9498.86 175.14 + 18.400 9674.00 9495.69 178.31 + 18.450 9493.00 9492.53 0.47 + 18.500 9393.00 9489.36 -96.36 + 18.550 9428.00 9486.19 -58.19 + 18.600 9571.00 9483.02 87.98 + 18.650 9431.00 9479.85 -48.85 + 18.700 9288.00 9476.69 -188.69 + 18.750 9435.00 9473.52 -38.52 + 18.800 9431.00 9470.35 -39.35 + 18.850 9297.00 9467.18 -170.18 + 18.900 9504.00 9464.01 39.99 + 18.950 9245.00 9460.85 -215.85 + 19.000 9725.00 9457.68 267.32 + 19.050 9385.00 9454.51 -69.51 + 19.100 9308.00 9451.34 -143.34 + 19.150 9476.00 9448.17 27.83 + 19.200 9563.00 9445.01 117.99 + 19.250 9558.00 9441.84 116.16 + 19.300 9436.00 9438.67 -2.67 + 19.350 9289.00 9435.50 -146.50 + 19.400 9280.00 9432.33 -152.33 + 19.450 9641.00 9427.73 213.27 + 19.500 9393.00 9422.32 -29.32 + 19.550 9519.00 9416.90 102.10 + 19.600 9392.00 9411.49 -19.49 + 19.650 9364.00 9406.07 -42.07 + 19.700 9270.00 9400.66 -130.66 + 19.750 9286.00 9395.24 -109.24 + 19.800 9204.00 9389.83 -185.83 + 19.850 9563.00 9384.42 178.58 + 19.900 9531.00 9379.05 151.95 + 19.950 9488.00 9373.84 114.16 + 20.000 9710.00 9369.29 340.71 + 20.050 9593.00 9367.16 225.84 + 20.100 9276.00 9372.52 -96.52 + 20.150 9415.00 9397.54 17.46 + 20.200 9242.00 9465.29 -223.29 + 20.250 9730.00 9608.24 121.76 + 20.300 9966.00 9854.55 111.45 + 20.350 10338.00 10203.43 134.57 + 20.400 10703.00 10606.54 96.46 + 20.450 11004.00 10975.47 28.53 + 20.500 11327.00 11213.10 113.90 + 20.550 11203.00 11247.49 -44.49 + 20.600 11000.00 11055.85 -55.85 + 20.650 10805.00 10680.93 124.07 + 20.700 10163.00 10226.95 -63.95 + 20.750 9960.00 9816.55 143.45 + 20.800 9712.00 9528.80 183.20 + 20.850 9502.00 9370.93 131.07 + 20.900 9461.00 9302.18 158.82 + 20.950 9169.00 9276.29 -107.29 + 21.000 9148.00 9264.91 -116.91 + 21.050 9114.00 9257.10 -143.10 + 21.100 9339.00 9250.30 88.70 + 21.150 9286.00 9244.13 41.87 + 21.200 9166.00 9238.38 -72.38 + 21.250 9101.00 9232.85 -131.85 + 21.300 9070.00 9227.40 -157.40 + 21.350 9117.00 9221.97 -104.97 + 21.400 9177.00 9216.56 -39.56 + 21.450 9244.00 9211.14 32.86 + 21.500 9166.00 9205.73 -39.73 + 21.550 9513.00 9200.31 312.69 + 21.600 9258.00 9194.90 63.10 + 21.650 9403.00 9189.48 213.52 + 21.700 9538.00 9184.07 353.93 + 21.750 9239.00 9178.65 60.35 + 21.800 9089.00 9173.24 -84.24 + 21.850 9033.00 9167.82 -134.82 + 21.900 9467.00 9163.65 303.35 + 21.950 9301.00 9160.73 140.27 + 22.000 9177.00 9157.82 19.18 + 22.050 9169.00 9154.90 14.10 + 22.100 9180.00 9151.98 28.02 + 22.150 9236.00 9149.06 86.94 + 22.200 9147.00 9146.14 0.86 + 22.250 8999.00 9143.22 -144.22 + 22.300 9318.00 9140.30 177.70 + 22.350 8939.00 9137.38 -198.38 + 22.400 9264.00 9134.46 129.54 + 22.450 9107.00 9131.55 -24.55 + 22.500 8994.00 9128.63 -134.63 + 22.550 9356.00 9125.71 230.29 + 22.600 9094.00 9122.79 -28.79 + 22.650 9284.00 9119.87 164.13 + 22.700 9053.00 9116.95 -63.95 + 22.750 9004.00 9114.03 -110.03 + 22.800 8809.00 9111.11 -302.11 + 22.850 8851.00 9108.20 -257.20 + 22.900 9055.00 9105.28 -50.28 + 22.950 8983.00 9102.36 -119.36 + 23.000 9028.00 9099.44 -71.44 + 23.050 9222.00 9096.52 125.48 + 23.100 9021.00 9093.60 -72.60 + 23.150 8838.00 9090.68 -252.68 + 23.200 8755.00 9087.77 -332.77 + 23.250 9056.00 9084.86 -28.86 + 23.300 8853.00 9081.99 -228.99 + 23.350 9189.00 9079.23 109.77 + 23.400 8996.00 9076.72 -80.72 + 23.450 8988.00 9074.75 -86.75 + 23.500 9016.00 9073.64 -57.64 + 23.550 8859.00 9073.63 -214.63 + 23.600 8972.00 9074.59 -102.59 + 23.650 9178.00 9075.89 102.11 + 23.700 9288.00 9076.56 211.44 + 23.750 9099.00 9075.65 23.35 + 23.800 8830.00 9072.50 -242.50 + 23.850 9143.00 9067.05 75.95 + 23.900 9010.00 9059.99 -49.99 + 23.950 9028.00 9052.51 -24.51 + 24.000 9144.00 9045.79 98.21 + 24.050 9442.00 9040.37 401.63 + 24.100 9152.00 9036.15 115.85 + 24.150 8839.00 9032.67 -193.67 + 24.200 9002.00 9029.53 -27.53 + 24.250 9120.00 9026.53 93.47 + 24.300 9087.00 9023.58 63.42 + 24.350 9147.00 9020.64 126.36 + 24.400 9025.00 9017.72 7.28 + 24.450 8864.00 9014.79 -150.79 + 24.500 8667.00 9011.87 -344.87 + 24.550 9097.00 9008.96 88.04 + 24.600 8938.00 9006.04 -68.04 + 24.650 9095.00 9003.12 91.88 + 24.700 8966.00 9000.20 -34.20 + 24.750 8976.00 8997.28 -21.28 + 24.800 8897.00 8994.36 -97.36 + 24.850 9077.00 8991.44 85.56 + 24.900 9059.00 8988.52 70.48 + 24.950 9135.00 8985.60 149.40 + 25.000 9214.00 8982.69 231.31 + 25.050 9015.00 8979.77 35.23 + 25.100 9143.00 8976.85 166.15 + 25.150 9053.00 8973.93 79.07 + 25.200 9129.00 8971.01 157.99 + 25.250 9121.00 8968.09 152.91 + 25.300 8803.00 8965.17 -162.17 + 25.350 9041.00 8962.25 78.75 + 25.400 8952.00 8959.33 -7.33 + 25.450 9103.00 8956.42 146.58 + 25.500 8966.00 8953.50 12.50 + 25.550 9064.00 8950.58 113.42 + 25.600 8813.00 8947.66 -134.66 + 25.650 8930.00 8944.74 -14.74 + 25.700 9095.00 8941.82 153.18 + 25.750 8718.00 8938.90 -220.90 + 25.800 8901.00 8935.98 -34.98 + 25.850 8817.00 8933.07 -116.07 + 25.900 8776.00 8930.15 -154.15 + 25.950 8877.00 8927.23 -50.23 + 26.000 8949.00 8924.31 24.69 + 26.050 8895.00 8921.39 -26.39 + 26.100 8951.00 8918.47 32.53 + 26.150 8747.00 8915.55 -168.55 + 26.200 8973.00 8912.63 60.37 + 26.250 9134.00 8909.71 224.29 + 26.300 9002.00 8906.80 95.20 + 26.350 8658.00 8903.88 -245.88 + 26.400 8693.00 8900.96 -207.96 + 26.450 8594.00 8898.04 -304.04 + 26.500 8727.00 8895.12 -168.12 + 26.550 9237.00 8892.20 344.80 + 26.600 8927.00 8889.28 37.72 + 26.650 9099.00 8886.36 212.64 + 26.700 8715.00 8883.45 -168.45 + 26.750 9056.00 8880.53 175.47 + 26.800 8928.00 8877.61 50.39 + 26.850 8854.00 8874.69 -20.69 + 26.900 8880.00 8871.77 8.23 + 26.950 8636.00 8868.85 -232.85 + 27.000 9010.00 8865.93 144.07 + 27.050 8742.00 8863.01 -121.01 + 27.100 9031.00 8860.09 170.91 + 27.150 9091.00 8857.18 233.82 + 27.200 8735.00 8854.26 -119.26 + 27.250 8866.00 8851.34 14.66 + 27.300 8940.00 8848.42 91.58 + 27.350 8922.00 8845.50 76.50 + 27.400 8779.00 8842.58 -63.58 + 27.450 8944.00 8839.66 104.34 + 27.500 8946.00 8836.74 109.26 + 27.550 8889.00 8833.83 55.17 + 27.600 8809.00 8830.91 -21.91 + 27.650 8956.00 8827.99 128.01 + 27.700 9148.00 8825.07 322.93 + 27.750 8802.00 8822.15 -20.15 + 27.800 8726.00 8819.23 -93.23 + 27.850 8861.00 8816.31 44.69 + 27.900 8797.00 8813.40 -16.40 + 27.950 8696.00 8811.59 -115.59 + 28.000 8928.00 8809.79 118.21 + 28.050 8904.00 8807.98 96.02 + 28.100 8928.00 8806.18 121.82 + 28.150 8854.00 8804.37 49.63 + 28.200 8827.00 8802.57 24.43 + 28.250 8925.00 8800.76 124.24 + 28.300 8696.00 8798.96 -102.96 + 28.350 8891.00 8797.15 93.85 + 28.400 8760.00 8795.35 -35.35 + 28.450 8905.00 8793.54 111.46 + 28.500 8717.00 8791.75 -74.75 + 28.550 8673.00 8789.97 -116.97 + 28.600 8810.00 8788.34 21.66 + 28.650 8692.00 8787.38 -95.38 + 28.700 8797.00 8789.27 7.73 + 28.750 8802.00 8801.61 0.39 + 28.800 8951.00 8846.92 104.08 + 28.850 9192.00 8980.26 211.74 + 28.900 9431.00 9308.90 122.10 + 28.950 10213.00 9990.21 222.79 + 29.000 11294.00 11173.46 120.54 + 29.050 12854.00 12885.44 -31.44 + 29.100 14764.00 14929.44 -165.44 + 29.150 16826.00 16891.86 -65.86 + 29.200 18020.00 18270.50 -250.50 + 29.250 18385.00 18648.59 -263.59 + 29.300 17673.00 17858.86 -185.86 + 29.350 16007.00 16098.16 -91.16 + 29.400 13695.00 13894.12 -199.12 + 29.450 11861.00 11858.17 2.83 + 29.500 10298.00 10379.53 -81.53 + 29.550 9578.00 9507.90 70.10 + 29.600 9210.00 9075.63 134.37 + 29.650 8856.00 8884.57 -28.57 + 29.700 8642.00 8803.20 -161.20 + 29.750 8679.00 8767.93 -88.93 + 29.800 8755.00 8752.37 2.63 + 29.850 8831.00 8745.37 85.63 + 29.900 8635.00 8741.84 -106.84 + 29.950 8926.00 8739.55 186.45 + 30.000 8880.00 8737.62 142.38 + 30.050 8481.00 8735.79 -254.79 + 30.100 8648.00 8733.98 -85.98 + 30.150 8662.00 8732.18 -70.18 + 30.200 8641.00 8730.37 -89.37 + 30.250 8733.00 8728.57 4.43 + 30.300 8780.00 8726.76 53.24 + 30.350 8952.00 8724.96 227.04 + 30.400 8924.00 8723.15 200.85 + 30.450 8665.00 8721.35 -56.35 + 30.500 8724.00 8719.54 4.46 + 30.550 8712.00 8717.74 -5.74 + 30.600 8737.00 8715.93 21.07 + 30.650 8627.00 8714.13 -87.13 + 30.700 8830.00 8712.32 117.68 + 30.750 8841.00 8710.52 130.48 + 30.800 8773.00 8708.71 64.29 + 30.850 8894.00 8706.91 187.09 + 30.900 8583.00 8705.11 -122.11 + 30.950 8854.00 8703.30 150.70 + 31.000 8726.00 8701.52 24.48 + 31.050 8535.00 8699.84 -164.84 + 31.100 8526.00 8698.57 -172.57 + 31.150 8610.00 8698.87 -88.87 + 31.200 8561.00 8704.27 -143.27 + 31.250 8708.00 8723.73 -15.73 + 31.300 8591.00 8775.56 -184.56 + 31.350 8911.00 8888.24 22.76 + 31.400 9002.00 9091.82 -89.82 + 31.450 9313.00 9397.72 -84.72 + 31.500 10043.00 9777.51 265.49 + 31.550 10289.00 10159.24 129.76 + 31.600 10283.00 10447.55 -164.55 + 31.650 10315.00 10556.57 -241.57 + 31.700 10351.00 10443.48 -92.48 + 31.750 10008.00 10133.99 -125.99 + 31.800 9587.00 9721.20 -134.20 + 31.850 9293.00 9322.87 -29.87 + 31.900 9014.00 9021.61 -7.61 + 31.950 9039.00 8836.17 202.83 + 32.000 8884.00 8739.64 144.36 + 32.050 8556.00 8694.63 -138.63 + 32.100 8612.00 8674.31 -62.31 + 32.150 8596.00 8664.76 -68.76 + 32.200 8566.00 8659.84 -93.84 + 32.250 8657.00 8656.89 0.11 + 32.300 8693.00 8654.71 38.29 + 32.350 8707.00 8652.80 54.20 + 32.400 8458.00 8650.96 -192.96 + 32.450 8463.00 8649.15 -186.15 + 32.500 8565.00 8647.35 -82.35 + 32.550 8609.00 8645.54 -36.54 + 32.600 8670.00 8643.74 26.26 + 32.650 8579.00 8641.93 -62.93 + 32.700 8550.00 8640.13 -90.13 + 32.750 8641.00 8638.32 2.68 + 32.800 8622.00 8636.52 -14.52 + 32.850 8762.00 8634.71 127.29 + 32.900 8598.00 8632.91 -34.91 + 32.950 8574.00 8630.13 -56.13 + 33.000 8742.00 8626.94 115.06 + 33.050 8712.00 8623.75 88.25 + 33.100 8666.00 8620.56 45.44 + 33.150 8679.00 8617.38 61.62 + 33.200 8625.00 8614.19 10.81 + 33.250 8659.00 8611.00 48.00 + 33.300 8715.00 8607.81 107.19 + 33.350 8883.00 8604.64 278.36 + 33.400 8741.00 8601.49 139.51 + 33.450 8477.00 8598.46 -121.46 + 33.500 8518.00 8595.75 -77.75 + 33.550 8542.00 8593.78 -51.78 + 33.600 8645.00 8593.24 51.76 + 33.650 8511.00 8594.90 -83.90 + 33.700 8435.00 8599.12 -164.12 + 33.750 8573.00 8605.32 -32.32 + 33.800 8732.00 8611.82 120.18 + 33.850 8472.00 8616.23 -144.23 + 33.900 8642.00 8616.33 25.67 + 33.950 8755.00 8610.89 144.11 + 34.000 8538.00 8600.40 -62.40 + 34.050 8576.00 8587.09 -11.09 + 34.100 8639.00 8573.92 65.08 + 34.150 8695.00 8563.03 131.97 + 34.200 8662.00 8555.02 106.98 + 34.250 8710.00 8549.28 160.72 + 34.300 8703.00 8544.90 158.10 + 34.350 8559.00 8541.20 17.80 + 34.400 8404.00 8537.80 -133.80 + 34.450 8712.00 8534.52 177.48 + 34.500 8576.00 8531.31 44.69 + 34.550 8592.00 8528.11 63.89 + 34.600 8628.00 8524.92 103.08 + 34.650 8441.00 8521.73 -80.73 + 34.700 8499.00 8518.54 -19.54 + 34.750 8531.00 8515.35 15.65 + 34.800 8493.00 8512.16 -19.16 + 34.850 8564.00 8508.98 55.02 + 34.900 8604.00 8505.79 98.21 + 34.950 8536.00 8502.60 33.40 + 35.000 8282.00 8499.41 -217.41 + 35.050 8324.00 8496.22 -172.22 + 35.100 8353.00 8493.03 -140.03 + 35.150 8543.00 8489.85 53.15 + 35.200 8594.00 8486.66 107.34 + 35.250 8589.00 8483.47 105.53 + 35.300 8358.00 8480.28 -122.28 + 35.350 8344.00 8477.09 -133.09 + 35.400 8411.00 8473.91 -62.91 + 35.450 8529.00 8470.74 58.26 + 35.500 8588.00 8467.65 120.35 + 35.550 8533.00 8464.81 68.19 + 35.600 8322.00 8462.79 -140.79 + 35.650 8262.00 8462.89 -200.89 + 35.700 8579.00 8467.63 111.37 + 35.750 8617.00 8480.60 136.40 + 35.800 8365.00 8505.00 -140.00 + 35.850 8571.00 8541.11 29.89 + 35.900 8618.00 8584.09 33.91 + 35.950 8608.00 8624.25 -16.25 + 36.000 8692.00 8650.03 41.97 + 36.050 8555.00 8652.18 -97.18 + 36.100 8692.00 8627.88 64.12 + 36.150 8699.00 8583.16 115.84 + 36.200 8515.00 8530.90 -15.90 + 36.250 8512.00 8484.25 27.75 + 36.300 8449.00 8450.38 -1.38 + 36.350 8511.00 8429.26 81.74 + 36.400 8442.00 8417.06 24.94 + 36.450 8418.00 8409.78 8.22 + 36.500 8467.00 8404.85 62.15 + 36.550 8641.00 8400.96 240.04 + 36.600 8426.00 8397.51 28.49 + 36.650 8370.00 8394.23 -24.23 + 36.700 8306.00 8391.02 -85.02 + 36.750 8439.00 8387.82 51.18 + 36.800 8552.00 8384.63 167.37 + 36.850 8351.00 8381.45 -30.45 + 36.900 8258.00 8378.26 -120.26 + 36.950 8396.00 8375.07 20.93 + 37.000 8543.00 8371.88 171.12 + 37.050 8500.00 8368.69 131.31 + 37.100 8486.00 8365.50 120.50 + 37.150 8342.00 8362.32 -20.32 + 37.200 8352.00 8359.13 -7.13 + 37.250 8409.00 8355.94 53.06 + 37.300 8412.00 8352.75 59.25 + 37.350 8216.00 8349.56 -133.56 + 37.400 8340.00 8346.38 -6.38 + 37.450 8417.00 8343.20 73.80 + 37.500 8570.00 8340.04 229.96 + 37.550 8381.00 8336.98 44.02 + 37.600 8418.00 8334.27 83.73 + 37.650 8461.00 8332.53 128.47 + 37.700 8353.00 8333.17 19.83 + 37.750 8213.00 8338.54 -125.54 + 37.800 8268.00 8351.45 -83.45 + 37.850 8329.00 8373.58 -44.58 + 37.900 8333.00 8403.47 -70.47 + 37.950 8304.00 8435.55 -131.55 + 38.000 8541.00 8461.36 79.64 + 38.050 8519.00 8472.41 46.59 + 38.100 8404.00 8463.56 -59.56 + 38.150 8447.00 8435.86 11.14 + 38.200 8611.00 8396.96 214.04 + 38.250 8230.00 8357.50 -127.50 + 38.300 8356.00 8325.66 30.34 + 38.350 8129.00 8304.05 -175.05 + 38.400 8264.00 8290.86 -26.86 + 38.450 8208.00 8282.89 -74.89 + 38.500 8240.00 8277.60 -37.60 + 38.550 8160.00 8273.54 -113.54 + 38.600 8040.00 8270.02 -230.02 + 38.650 8109.00 8266.72 -157.72 + 38.700 8335.00 8263.49 71.51 + 38.750 8213.00 8260.30 -47.30 + 38.800 8130.00 8257.11 -127.11 + 38.850 8269.00 8253.92 15.08 + 38.900 8243.00 8250.73 -7.73 + 38.950 8371.00 8247.54 123.46 + 39.000 8285.00 8244.35 40.65 + 39.050 8225.00 8241.16 -16.16 + 39.100 8441.00 8237.98 203.02 + 39.150 8146.00 8235.21 -89.21 + 39.200 8177.00 8232.63 -55.63 + 39.250 8453.00 8230.06 222.94 + 39.300 8254.00 8227.49 26.51 + 39.350 8176.00 8224.97 -48.97 + 39.400 8118.00 8222.69 -104.69 + 39.450 8164.00 8221.45 -57.45 + 39.500 8123.00 8224.20 -101.20 + 39.550 8157.00 8240.12 -83.12 + 39.600 8456.00 8292.76 163.24 + 39.650 8643.00 8430.94 212.06 + 39.700 8710.00 8731.89 -21.89 + 39.750 9392.00 9279.47 112.53 + 39.800 10187.00 10109.99 77.01 + 39.850 11058.00 11152.23 -94.23 + 39.900 12033.00 12210.99 -177.99 + 39.950 12788.00 13016.56 -228.56 + 40.000 13099.00 13320.40 -221.40 + 40.050 12683.00 13001.46 -318.46 + 40.100 12144.00 12143.34 0.66 + 40.150 10940.00 11017.16 -77.16 + 40.200 9812.00 9946.00 -134.00 + 40.250 9120.00 9141.72 -21.72 + 40.300 8622.00 8644.41 -22.41 + 40.350 8453.00 8381.13 71.87 + 40.400 8458.00 8256.36 201.64 + 40.450 8161.00 8201.02 -40.02 + 40.500 8132.00 8177.16 -45.16 + 40.550 8329.00 8166.69 162.31 + 40.600 8305.00 8161.48 143.52 + 40.650 8141.00 8158.14 -17.14 + 40.700 8114.00 8155.37 -41.37 + 40.750 8260.00 8152.75 107.25 + 40.800 8225.00 8150.16 74.84 + 40.850 8204.00 8147.58 56.42 + 40.900 8295.00 8145.00 150.00 + 40.950 8278.00 8142.43 135.57 + 41.000 8204.00 8139.85 64.15 + 41.050 8140.00 8137.27 2.73 + 41.100 8069.00 8134.69 -65.69 + 41.150 8286.00 8132.12 153.88 + 41.200 8102.00 8129.54 -27.54 + 41.250 8139.00 8126.97 12.03 + 41.300 8104.00 8124.43 -20.43 + 41.350 8281.00 8121.99 159.01 + 41.400 8235.00 8119.90 115.10 + 41.450 8315.00 8118.87 196.13 + 41.500 8199.00 8120.41 78.59 + 41.550 8097.00 8127.17 -30.17 + 41.600 8026.00 8142.39 -116.39 + 41.650 8205.00 8168.21 36.79 + 41.700 8314.00 8203.27 110.73 + 41.750 8207.00 8241.43 -34.43 + 41.800 8106.00 8272.95 -166.95 + 41.850 8260.00 8287.77 -27.77 + 41.900 8442.00 8279.60 162.40 + 41.950 8271.00 8249.45 21.55 + 42.000 8169.00 8206.09 -37.09 + 42.050 8041.00 8161.82 -120.82 + 42.100 7892.00 8126.13 -234.13 + 42.150 8119.00 8102.09 16.91 + 42.200 8200.00 8087.75 112.25 + 42.250 8253.00 8079.49 173.51 + 42.300 8286.00 8074.42 211.58 + 42.350 8101.00 8070.82 30.18 + 42.400 7930.00 8067.86 -137.86 + 42.450 7916.00 8065.16 -149.16 + 42.500 8012.00 8062.54 -50.54 + 42.550 7975.00 8059.95 -84.95 + 42.600 8126.00 8057.37 68.63 + 42.650 8154.00 8054.80 99.20 + 42.700 8124.00 8052.22 71.78 + 42.750 7923.00 8049.64 -126.64 + 42.800 7957.00 8047.06 -90.06 + 42.850 7910.00 8044.49 -134.49 + 42.900 7982.00 8041.91 -59.91 + 42.950 7849.00 8039.33 -190.33 + 43.000 7932.00 8036.77 -104.77 + 43.050 8027.00 8034.26 -7.26 + 43.100 8094.00 8032.02 61.98 + 43.150 7974.00 8030.81 -56.81 + 43.200 8129.00 8033.17 95.83 + 43.250 8198.00 8046.02 151.98 + 43.300 8034.00 8084.55 -50.55 + 43.350 8173.00 8174.83 -1.83 + 43.400 8397.00 8348.76 48.24 + 43.450 8491.00 8626.80 -135.80 + 43.500 8904.00 8994.66 -90.66 + 43.550 9408.00 9390.89 17.11 + 43.600 9684.00 9718.92 -34.92 + 43.650 9762.00 9879.76 -117.76 + 43.700 9523.00 9813.47 -290.47 + 43.750 9289.00 9533.48 -244.48 + 43.800 9015.00 9128.96 -113.96 + 43.850 8748.00 8720.93 27.07 + 43.900 8415.00 8399.43 15.57 + 43.950 8209.00 8191.74 17.26 + 44.000 8107.00 8077.21 29.79 + 44.050 8066.00 8020.80 45.20 + 44.100 7911.00 7994.67 -83.67 + 44.150 7750.00 7982.59 -232.59 + 44.200 8032.00 7976.50 55.50 + 44.250 7912.00 7972.76 -60.76 + 44.300 7943.00 7969.85 -26.85 + 44.350 7890.00 7967.19 -77.19 + 44.400 7932.00 7964.59 -32.59 + 44.450 8011.00 7962.01 48.99 + 44.500 8034.00 7959.43 74.57 + 44.550 8108.00 7956.86 151.14 + 44.600 8104.00 7954.28 149.72 + 44.650 8021.00 7951.70 69.30 + 44.700 7977.00 7949.12 27.88 + 44.750 8073.00 7946.55 126.45 + 44.800 8126.00 7943.97 182.03 + 44.850 7883.00 7941.39 -58.39 + 44.900 7974.00 7938.81 35.19 + 44.950 7947.00 7936.24 10.76 + 45.000 7991.00 7933.66 57.34 + 45.050 7953.00 7931.08 21.92 + 45.100 7820.00 7928.51 -108.51 + 45.150 8118.00 7925.93 192.07 + 45.200 8208.00 7923.35 284.65 + 45.250 7887.00 7920.77 -33.77 + 45.300 8016.00 7918.20 97.80 + 45.350 7859.00 7915.62 -56.62 + 45.400 7927.00 7913.04 13.96 + 45.450 8020.00 7910.46 109.54 + 45.500 8022.00 7907.89 114.11 + 45.550 7861.00 7905.31 -44.31 + 45.600 7759.00 7902.73 -143.73 + 45.650 7826.00 7900.15 -74.15 + 45.700 7903.00 7897.58 5.42 + 45.750 7758.00 7896.15 -138.15 + 45.800 7951.00 7895.08 55.92 + 45.850 7893.00 7894.02 -1.02 + 45.900 7963.00 7892.96 70.04 + 45.950 7948.00 7891.89 56.11 + 46.000 7865.00 7890.83 -25.83 + 46.050 7927.00 7889.76 37.24 + 46.100 7920.00 7888.70 31.30 + 46.150 7942.00 7887.63 54.37 + 46.200 7862.00 7886.57 -24.57 + 46.250 7931.00 7885.50 45.50 + 46.300 8008.00 7884.44 123.56 + 46.350 7846.00 7883.38 -37.38 + 46.400 7866.00 7882.31 -16.31 + 46.450 7900.00 7881.26 18.74 + 46.500 7912.00 7880.28 31.72 + 46.550 7778.00 7879.56 -101.56 + 46.600 7679.00 7879.87 -200.87 + 46.650 7981.00 7883.57 97.43 + 46.700 7857.00 7896.63 -39.63 + 46.750 8082.00 7931.21 150.79 + 46.800 8179.00 8006.16 172.84 + 46.850 8262.00 8141.14 120.86 + 46.900 8322.00 8343.23 -21.23 + 46.950 8482.00 8592.70 -110.70 + 47.000 8685.00 8839.90 -154.90 + 47.050 8971.00 9018.40 -47.40 + 47.100 9054.00 9069.83 -15.83 + 47.150 9044.00 8971.46 72.54 + 47.200 8941.00 8752.77 188.23 + 47.250 8540.00 8484.44 55.56 + 47.300 8036.00 8240.82 -204.82 + 47.350 7980.00 8064.23 -84.23 + 47.400 8025.00 7957.59 67.41 + 47.450 8137.00 7901.84 235.16 + 47.500 8076.00 7875.55 200.45 + 47.550 7932.00 7863.88 68.12 + 47.600 8057.00 7858.75 198.25 + 47.650 7883.00 7856.28 26.72 + 47.700 7912.00 7854.78 57.22 + 47.750 7932.00 7853.60 78.40 + 47.800 8034.00 7852.51 181.49 + 47.850 8008.00 7851.44 156.56 + 47.900 7941.00 7850.38 90.62 + 47.950 7920.00 7849.31 70.69 + 48.000 7908.00 7848.25 59.75 + 48.050 7894.00 7847.24 46.76 + 48.100 7884.00 7846.45 37.55 + 48.150 7982.00 7846.83 135.17 + 48.200 7696.00 7852.26 -156.26 + 48.250 7879.00 7876.82 2.18 + 48.300 8216.00 7963.29 252.71 + 48.350 8436.00 8218.76 217.24 + 48.400 9053.00 8857.25 195.75 + 48.450 10442.00 10201.71 240.29 + 48.500 12610.00 12575.01 34.99 + 48.550 15833.00 16066.22 -233.22 + 48.600 19815.00 20299.91 -484.91 + 48.650 23750.00 24403.29 -653.29 + 48.700 26358.00 27247.79 -889.79 + 48.750 26911.00 27886.25 -975.25 + 48.800 25283.00 26016.75 -733.75 + 48.850 21610.00 22226.00 -616.00 + 48.900 17504.00 17742.61 -238.61 + 48.950 13616.00 13779.88 -163.88 + 49.000 10967.00 10971.62 -4.62 + 49.050 9225.00 9310.51 -85.51 + 49.100 8494.00 8460.92 33.08 + 49.150 8128.00 8073.02 54.98 + 49.200 7868.00 7911.64 -43.64 + 49.250 7746.00 7850.15 -104.15 + 49.300 7824.00 7828.66 -4.66 + 49.350 7894.00 7821.51 72.49 + 49.400 7864.00 7818.87 45.13 + 49.450 8066.00 7817.46 248.54 + 49.500 7869.00 7816.32 52.68 + 49.550 7952.00 7815.25 136.75 + 49.600 7849.00 7814.18 34.82 + 49.650 7890.00 7813.12 76.88 + 49.700 7834.00 7812.05 21.95 + 49.750 7801.00 7811.01 -10.01 + 49.800 7912.00 7810.02 101.98 + 49.850 7985.00 7809.27 175.73 + 49.900 7874.00 7809.28 64.72 + 49.950 7837.00 7811.44 25.56 + 50.000 7786.00 7818.57 -32.57 + 50.050 7855.00 7835.08 19.92 + 50.100 8028.00 7865.66 162.34 + 50.150 7941.00 7912.10 28.90 + 50.200 7962.00 7969.90 -7.90 + 50.250 7965.00 8027.37 -62.37 + 50.300 8047.00 8068.69 -21.69 + 50.350 8135.00 8079.90 55.10 + 50.400 8038.00 8055.67 -17.67 + 50.450 8021.00 8003.21 17.79 + 50.500 7970.00 7939.38 30.62 + 50.550 8077.00 7881.62 195.38 + 50.600 7900.00 7839.68 60.32 + 50.650 7835.00 7814.09 20.91 + 50.700 7815.00 7800.35 14.65 + 50.750 7731.00 7793.46 -62.46 + 50.800 7746.00 7789.98 -43.98 + 50.850 7681.00 7788.00 -107.00 + 50.900 7696.00 7786.62 -90.62 + 50.950 7825.00 7785.47 39.53 + 51.000 7826.00 7784.38 41.62 + 51.050 7609.00 7783.31 -174.31 + 51.100 7723.00 7782.24 -59.24 + 51.150 7874.00 7781.18 92.82 + 51.200 7718.00 7780.11 -62.11 + 51.250 7687.00 7779.05 -92.05 + 51.300 7753.00 7777.99 -24.99 + 51.350 7799.00 7776.94 22.06 + 51.400 7724.00 7775.93 -51.93 + 51.450 7775.00 7775.08 -0.08 + 51.500 7963.00 7774.71 188.29 + 51.550 7847.00 7775.51 71.49 + 51.600 7729.00 7778.71 -49.71 + 51.650 7766.00 7785.88 -19.88 + 51.700 7890.00 7798.06 91.94 + 51.750 7684.00 7814.69 -130.69 + 51.800 7648.00 7832.84 -184.84 + 51.850 7791.00 7847.77 -56.77 + 51.900 7799.00 7854.52 -55.52 + 51.950 7793.00 7850.02 -57.02 + 52.000 8040.00 7834.79 205.21 + 52.050 7875.00 7813.81 61.19 + 52.100 7863.00 7792.95 70.05 + 52.150 7703.00 7776.38 -73.38 + 52.200 7642.00 7765.21 -123.21 + 52.250 7764.00 7758.39 5.61 + 52.300 7715.00 7754.29 -39.29 + 52.350 7670.00 7751.60 -81.60 + 52.400 7741.00 7749.56 -8.56 + 52.450 7571.00 7747.79 -176.79 + 52.500 7675.00 7746.11 -71.11 + 52.550 7640.00 7744.47 -104.47 + 52.600 7765.00 7742.84 22.16 + 52.650 7859.00 7741.21 117.79 + 52.700 7840.00 7739.58 100.42 + 52.750 7721.00 7737.95 -16.95 + 52.800 7709.00 7736.34 -27.34 + 52.850 7796.00 7734.80 61.20 + 52.900 7863.00 7733.59 129.41 + 52.950 7699.00 7733.68 -34.68 + 53.000 7726.00 7738.16 -12.16 + 53.050 7575.00 7755.09 -180.09 + 53.100 7928.00 7801.52 126.48 + 53.150 8052.00 7905.01 146.99 + 53.200 8318.00 8096.26 221.74 + 53.250 8250.00 8389.79 -139.79 + 53.300 8585.00 8761.17 -176.17 + 53.350 9041.00 9138.72 -97.72 + 53.400 9461.00 9420.82 40.18 + 53.450 9483.00 9514.23 -31.23 + 53.500 9282.00 9379.34 -97.34 + 53.550 8970.00 9057.67 -87.67 + 53.600 8645.00 8655.68 -10.68 + 53.650 8241.00 8287.03 -46.03 + 53.700 8006.00 8017.64 -11.64 + 53.750 7903.00 7853.77 49.23 + 53.800 7772.00 7767.65 4.35 + 53.850 7584.00 7727.10 -143.10 + 53.900 7734.00 7709.32 24.68 + 53.950 7633.00 7701.65 -68.65 + 54.000 7638.00 7698.00 -60.00 + 54.050 7643.00 7695.78 -52.78 + 54.100 7713.00 7694.00 19.00 + 54.150 7736.00 7692.34 43.66 + 54.200 7630.00 7690.70 -60.70 + 54.250 7861.00 7689.07 171.93 + 54.300 7896.00 7687.44 208.56 + 54.350 7797.00 7685.83 111.17 + 54.400 7826.00 7684.25 141.75 + 54.450 7626.00 7682.85 -56.85 + 54.500 7809.00 7682.06 126.94 + 54.550 7762.00 7683.04 78.96 + 54.600 7733.00 7688.29 44.71 + 54.650 7759.00 7702.06 56.94 + 54.700 7784.00 7729.32 54.68 + 54.750 7838.00 7772.92 65.08 + 54.800 7961.00 7829.84 131.16 + 54.850 8012.00 7889.44 122.56 + 54.900 7765.00 7935.67 -170.67 + 54.950 7848.00 7953.05 -105.05 + 55.000 7880.00 7933.97 -53.97 + 55.050 7995.00 7883.72 111.28 + 55.100 7783.00 7818.64 -35.64 + 55.150 7827.00 7757.27 69.73 + 55.200 7696.00 7711.14 -15.14 + 55.250 7540.00 7682.07 -142.07 + 55.300 7640.00 7665.96 -25.96 + 55.350 7714.00 7657.59 56.41 + 55.400 7552.00 7653.15 -101.15 + 55.450 7637.00 7650.46 -13.46 + 55.500 7593.00 7648.48 -55.48 + 55.550 7588.00 7646.74 -58.74 + 55.600 7710.00 7645.09 64.91 + 55.650 7546.00 7643.45 -97.45 + 55.700 7590.00 7641.82 -51.82 + 55.750 7718.00 7640.20 77.80 + 55.800 7680.00 7638.59 41.41 + 55.850 7733.00 7637.11 95.89 + 55.900 7825.00 7636.11 188.89 + 55.950 7807.00 7636.99 170.01 + 56.000 7821.00 7643.90 177.10 + 56.050 7804.00 7667.09 136.91 + 56.100 7771.00 7726.73 44.27 + 56.150 7969.00 7852.48 116.52 + 56.200 8249.00 8072.53 176.47 + 56.250 8418.00 8391.73 26.27 + 56.300 8941.00 8771.08 169.92 + 56.350 9207.00 9126.59 80.41 + 56.400 9365.00 9354.23 10.77 + 56.450 9359.00 9373.31 -14.31 + 56.500 9173.00 9169.81 3.19 + 56.550 8796.00 8811.48 -15.48 + 56.600 8341.00 8414.24 -73.24 + 56.650 8111.00 8079.13 31.87 + 56.700 7889.00 7850.11 38.89 + 56.750 7620.00 7718.14 -98.14 + 56.800 7748.00 7651.72 96.28 + 56.850 7814.00 7621.47 192.53 + 56.900 7678.00 7608.48 69.52 + 56.950 7737.00 7602.81 134.19 + 57.000 7668.00 7599.91 68.09 + 57.050 7699.00 7597.93 101.07 + 57.100 7742.00 7596.22 145.78 + 57.150 7781.00 7594.58 186.42 + 57.200 7746.00 7592.96 153.04 + 57.250 7575.00 7591.41 -16.41 + 57.300 7662.00 7590.21 71.79 + 57.350 7697.00 7590.54 106.46 + 57.400 7624.00 7596.73 27.27 + 57.450 7750.00 7622.06 127.94 + 57.500 7706.00 7699.96 6.04 + 57.550 7784.00 7897.42 -113.42 + 57.600 8419.00 8315.78 103.22 + 57.650 8996.00 9056.04 -60.04 + 57.700 10073.00 10144.33 -71.33 + 57.750 11439.00 11457.92 -18.92 + 57.800 12666.00 12713.67 -47.67 + 57.850 13675.00 13549.10 125.90 + 57.900 13505.00 13671.92 -166.92 + 57.950 12708.00 13015.09 -307.09 + 58.000 11481.00 11798.72 -317.72 + 58.050 10507.00 10422.01 84.99 + 58.100 9337.00 9244.80 92.20 + 58.150 8414.00 8432.28 -18.28 + 58.200 7930.00 7961.64 -31.64 + 58.250 7629.00 7725.27 -96.27 + 58.300 7685.00 7619.51 65.49 + 58.350 7610.00 7576.47 33.53 + 58.400 7641.00 7560.11 80.89 + 58.450 7558.00 7553.86 4.14 + 58.500 7625.00 7550.96 74.04 + 58.550 7630.00 7549.02 80.98 + 58.600 7607.00 7547.34 59.66 + 58.650 7552.00 7545.71 6.29 + 58.700 7558.00 7544.15 13.85 + 58.750 7535.00 7542.91 -7.91 + 58.800 7428.00 7542.94 -114.94 + 58.850 7468.00 7547.63 -79.63 + 58.900 7579.00 7566.57 12.43 + 58.950 7558.00 7622.11 -64.11 + 59.000 7759.00 7754.88 4.12 + 59.050 7998.00 8018.78 -20.78 + 59.100 8317.00 8455.27 -138.27 + 59.150 9051.00 9052.63 -1.63 + 59.200 9587.00 9716.90 -129.90 + 59.250 10370.00 10283.68 86.32 + 59.300 10441.00 10574.67 -133.67 + 59.350 10387.00 10479.28 -92.28 + 59.400 9863.00 10020.98 -157.98 + 59.450 9167.00 9356.60 -189.60 + 59.500 8724.00 8691.35 32.65 + 59.550 8321.00 8171.47 149.53 + 59.600 7953.00 7837.84 115.16 + 59.650 7590.00 7655.55 -65.55 + 59.700 7617.00 7568.05 48.95 + 59.750 7631.00 7530.08 100.92 + 59.800 7550.00 7514.68 35.32 + 59.850 7495.00 7508.41 -13.41 + 59.900 7532.00 7505.41 26.59 + 59.950 7591.00 7503.43 87.57 + 60.000 7659.00 7501.72 157.28 + 60.050 7552.00 7500.07 51.93 + 60.100 7427.00 7498.44 -71.44 + 60.150 7377.00 7496.81 -119.81 + 60.200 7396.00 7495.18 -99.18 + 60.250 7447.00 7493.56 -46.56 + 60.300 7637.00 7491.95 145.05 + 60.350 7583.00 7490.37 92.63 + 60.400 7442.00 7488.87 -46.87 + 60.450 7564.00 7487.50 76.50 + 60.500 7684.00 7486.32 197.68 + 60.550 7526.00 7485.32 40.68 + 60.600 7575.00 7484.58 90.42 + 60.650 7608.00 7483.79 124.21 + 60.700 7507.00 7482.73 24.27 + 60.750 7518.00 7481.26 36.74 + 60.800 7538.00 7479.36 58.64 + 60.850 7679.00 7477.19 201.81 + 60.900 7593.00 7474.98 118.02 + 60.950 7372.00 7472.91 -100.91 + 61.000 7539.00 7471.04 67.96 + 61.050 7549.00 7469.36 79.64 + 61.100 7414.00 7467.79 -53.79 + 61.150 7421.00 7466.28 -45.28 + 61.200 7442.00 7464.81 -22.81 + 61.250 7472.00 7463.34 8.66 + 61.300 7552.00 7461.89 90.11 + 61.350 7413.00 7460.43 -47.43 + 61.400 7387.00 7458.97 -71.97 + 61.450 7469.00 7457.51 11.49 + 61.500 7547.00 7456.06 90.94 + 61.550 7324.00 7454.65 -130.65 + 61.600 7430.00 7453.38 -23.38 + 61.650 7447.00 7452.63 -5.63 + 61.700 7634.00 7453.49 180.51 + 61.750 7729.00 7458.54 270.46 + 61.800 7434.00 7472.46 -38.46 + 61.850 7567.00 7501.56 65.44 + 61.900 7783.00 7550.81 232.19 + 61.950 7626.00 7619.03 6.97 + 62.000 7684.00 7695.37 -11.37 + 62.050 7837.00 7760.55 76.45 + 62.100 7877.00 7793.51 83.49 + 62.150 7771.00 7781.16 -10.16 + 62.200 7622.00 7726.33 -104.33 + 62.250 7559.00 7647.50 -88.50 + 62.300 7552.00 7568.73 -16.73 + 62.350 7353.00 7507.03 -154.03 + 62.400 7370.00 7467.05 -97.05 + 62.450 7357.00 7444.69 -87.69 + 62.500 7358.00 7433.34 -75.34 + 62.550 7460.00 7427.72 32.28 + 62.600 7352.00 7424.70 -72.70 + 62.650 7316.00 7422.73 -106.73 + 62.700 7324.00 7421.12 -97.12 + 62.750 7387.00 7419.62 -32.62 + 62.800 7400.00 7418.16 -18.16 + 62.850 7538.00 7416.70 121.30 + 62.900 7417.00 7415.27 1.73 + 62.950 7304.00 7413.92 -109.92 + 63.000 7433.00 7412.93 20.07 + 63.050 7364.00 7413.10 -49.10 + 63.100 7299.00 7416.58 -117.58 + 63.150 7209.00 7427.76 -218.76 + 63.200 7404.00 7453.61 -49.61 + 63.250 7411.00 7501.50 -90.50 + 63.300 7542.00 7574.23 -32.23 + 63.350 7581.00 7664.38 -83.38 + 63.400 7670.00 7752.74 -82.74 + 63.450 7570.00 7813.42 -243.42 + 63.500 7697.00 7824.69 -127.69 + 63.550 7727.00 7780.45 -53.45 + 63.600 7573.00 7695.35 -122.35 + 63.650 7573.00 7597.42 -24.42 + 63.700 7527.00 7512.55 14.45 + 63.750 7318.00 7453.06 -135.06 + 63.800 7282.00 7417.82 -135.82 + 63.850 7282.00 7399.43 -117.43 + 63.900 7351.00 7390.48 -39.48 + 63.950 7405.00 7386.08 18.92 + 64.000 7351.00 7383.60 -32.60 + 64.050 7407.00 7381.82 25.18 + 64.100 7311.00 7380.28 -69.28 + 64.150 7357.00 7378.81 -21.81 + 64.200 7341.00 7377.39 -36.39 + 64.250 7281.00 7376.17 -95.17 + 64.300 7319.00 7375.85 -56.85 + 64.350 7486.00 7379.13 106.87 + 64.400 7533.00 7394.82 138.18 + 64.450 7564.00 7446.42 117.58 + 64.500 7775.00 7584.41 190.59 + 64.550 7919.00 7891.97 27.03 + 64.600 8354.00 8463.98 -109.98 + 64.650 9022.00 9348.50 -326.50 + 64.700 10195.00 10473.35 -278.35 + 64.750 11593.00 11616.51 -23.51 + 64.800 12440.00 12457.69 -17.69 + 64.850 12475.00 12707.48 -232.48 + 64.900 11957.00 12257.33 -300.33 + 64.950 11222.00 11259.02 -37.02 + 65.000 10173.00 10052.14 120.86 + 65.050 9042.00 8974.76 67.24 + 65.100 8143.00 8205.88 -62.88 + 65.150 7635.00 7748.43 -113.43 + 65.200 7484.00 7514.45 -30.45 + 65.250 7394.00 7408.87 -14.87 + 65.300 7288.00 7366.01 -78.01 + 65.350 7349.00 7349.94 -0.94 + 65.400 7311.00 7343.94 -32.94 + 65.450 7262.00 7341.26 -79.26 + 65.500 7322.00 7339.51 -17.51 + 65.550 7371.00 7338.00 33.00 + 65.600 7410.00 7336.55 73.45 + 65.650 7196.00 7335.19 -139.19 + 65.700 7125.00 7334.12 -209.12 + 65.750 7374.00 7334.03 39.97 + 65.800 7346.00 7336.70 9.30 + 65.850 7287.00 7345.82 -58.82 + 65.900 7410.00 7367.20 42.80 + 65.950 7292.00 7406.97 -114.97 + 66.000 7278.00 7467.39 -189.39 + 66.050 7499.00 7542.09 -43.09 + 66.100 7645.00 7614.84 30.16 + 66.150 7701.00 7663.99 37.01 + 66.200 7754.00 7671.58 82.42 + 66.250 7717.00 7633.13 83.87 + 66.300 7617.00 7561.49 55.51 + 66.350 7359.00 7480.20 -121.20 + 66.400 7435.00 7410.41 24.59 + 66.450 7433.00 7361.83 71.17 + 66.500 7422.00 7333.17 88.83 + 66.550 7482.00 7318.17 163.83 + 66.600 7285.00 7310.79 -25.79 + 66.650 7165.00 7307.03 -142.03 + 66.700 7378.00 7304.78 73.22 + 66.750 7244.00 7303.08 -59.08 + 66.800 7183.00 7301.56 -118.56 + 66.850 7308.00 7300.09 7.91 + 66.900 7436.00 7298.63 137.37 + 66.950 7318.00 7297.17 20.83 + 67.000 7328.00 7295.71 32.29 + 67.050 7398.00 7294.26 103.74 + 67.100 7437.00 7292.80 144.20 + 67.150 7273.00 7291.34 -18.34 + 67.200 7407.00 7289.88 117.12 + 67.250 7345.00 7288.42 56.58 + 67.300 7261.00 7286.97 -25.97 + 67.350 7418.00 7285.51 132.49 + 67.400 7328.00 7284.05 43.95 + 67.450 7295.00 7282.59 12.41 + 67.500 7325.00 7281.14 43.86 + 67.550 7453.00 7279.68 173.32 + 67.600 7223.00 7278.22 -55.22 + 67.650 7387.00 7276.76 110.24 + 67.700 7263.00 7275.31 -12.31 + 67.750 7256.00 7273.85 -17.85 + 67.800 7191.00 7272.39 -81.39 + 67.850 7404.00 7270.93 133.07 + 67.900 7318.00 7269.48 48.52 + 67.950 7316.00 7268.02 47.98 + 68.000 7304.00 7266.56 37.44 + 68.050 7311.00 7265.10 45.90 + 68.100 7269.00 7263.65 5.35 + 68.150 7289.00 7262.19 26.81 + 68.200 7189.00 7260.76 -71.76 + 68.250 7476.00 7260.20 215.80 + 68.300 7505.00 7259.63 245.37 + 68.350 7478.00 7259.07 218.93 + 68.400 7147.00 7258.50 -111.50 + 68.450 7328.00 7257.94 70.06 + 68.500 7116.00 7257.38 -141.38 + 68.550 7221.00 7256.81 -35.81 + 68.600 7275.00 7256.25 18.75 + 68.650 7212.00 7255.68 -43.68 + 68.700 7220.00 7255.12 -35.12 + 68.750 7265.00 7254.55 10.45 + 68.800 7315.00 7253.99 61.01 + 68.850 7131.00 7253.43 -122.43 + 68.900 7224.00 7252.86 -28.86 + 68.950 7269.00 7252.30 16.70 + 69.000 7242.00 7251.73 -9.73 + 69.050 7200.00 7251.17 -51.17 + 69.100 7314.00 7250.60 63.40 + 69.150 7412.00 7250.04 161.96 + 69.200 7465.00 7249.47 215.53 + 69.250 7340.00 7248.91 91.09 + 69.300 7411.00 7248.35 162.65 + 69.350 7363.00 7247.78 115.22 + 69.400 7364.00 7247.22 116.78 + 69.450 7412.00 7246.66 165.34 + 69.500 7365.00 7246.12 118.88 + 69.550 7215.00 7245.71 -30.71 + 69.600 7128.00 7245.88 -117.88 + 69.650 7277.00 7248.34 28.66 + 69.700 7287.00 7258.43 28.57 + 69.750 7392.00 7290.00 102.00 + 69.800 7453.00 7371.58 81.42 + 69.850 7604.00 7547.66 56.34 + 69.900 7833.00 7864.81 -31.81 + 69.950 8298.00 8338.54 -40.54 + 70.000 8808.00 8917.88 -109.88 + 70.050 9410.00 9475.89 -65.89 + 70.100 9785.00 9845.88 -60.88 + 70.150 9822.00 9894.05 -72.05 + 70.200 9620.00 9593.99 26.01 + 70.250 9192.00 9051.47 140.53 + 70.300 8570.00 8448.02 121.98 + 70.350 7831.00 7940.07 -109.07 + 70.400 7687.00 7594.38 92.62 + 70.450 7470.00 7397.03 72.97 + 70.500 7367.00 7299.77 67.23 + 70.550 7370.00 7257.53 112.47 + 70.600 7181.00 7241.08 -60.08 + 70.650 7298.00 7235.18 62.82 + 70.700 7271.00 7233.05 37.95 + 70.750 7306.00 7232.10 73.90 + 70.800 7282.00 7231.50 50.50 + 70.850 7326.00 7231.19 94.81 + 70.900 7288.00 7231.89 56.11 + 70.950 7426.00 7236.45 189.55 + 71.000 7466.00 7253.65 212.35 + 71.050 7470.00 7305.60 164.40 + 71.100 7439.00 7436.43 2.57 + 71.150 7789.00 7712.30 76.70 + 71.200 8144.00 8197.45 -53.45 + 71.250 8780.00 8904.60 -124.60 + 71.300 9592.00 9745.41 -153.41 + 71.350 10486.00 10525.05 -39.05 + 71.400 11021.00 11003.09 17.91 + 71.450 10865.00 11002.01 -137.01 + 71.500 10326.00 10510.44 -184.44 + 71.550 9907.00 9703.36 203.64 + 71.600 8808.00 8845.58 -37.58 + 71.650 8257.00 8146.70 110.30 + 71.700 7650.00 7683.85 -33.85 + 71.750 7378.00 7425.58 -47.58 + 71.800 7288.00 7300.97 -12.97 + 71.850 7321.00 7247.98 73.02 + 71.900 7214.00 7227.85 -13.85 + 71.950 7254.00 7220.85 33.15 + 72.000 7234.00 7218.45 15.55 + 72.050 7112.00 7217.43 -105.43 + 72.100 7288.00 7216.80 71.20 + 72.150 7249.00 7216.38 32.62 + 72.200 7305.00 7216.53 88.47 + 72.250 7308.00 7218.74 89.26 + 72.300 7319.00 7227.31 91.69 + 72.350 7403.00 7252.35 150.65 + 72.400 7234.00 7312.46 -78.46 + 72.450 7322.00 7432.43 -110.43 + 72.500 7493.00 7631.50 -138.50 + 72.550 7825.00 7903.95 -78.95 + 72.600 8267.00 8204.96 62.04 + 72.650 8547.00 8456.22 90.78 + 72.700 8490.00 8574.40 -84.40 + 72.750 8409.00 8512.65 -103.65 + 72.800 8185.00 8290.36 -105.36 + 72.850 7778.00 7986.24 -208.24 + 72.900 7514.00 7693.29 -179.29 + 72.950 7634.00 7471.63 162.37 + 73.000 7248.00 7333.34 -85.34 + 73.050 7157.00 7259.92 -102.92 + 73.100 7255.00 7225.87 29.13 + 73.150 7208.00 7211.76 -3.76 + 73.200 7276.00 7206.37 69.63 + 73.250 7214.00 7204.29 9.71 + 73.300 7041.00 7203.32 -162.32 + 73.350 7175.00 7202.66 -27.66 + 73.400 7261.00 7202.10 58.90 + 73.450 7343.00 7201.65 141.35 + 73.500 7177.00 7201.56 -24.56 + 73.550 7210.00 7202.71 7.29 + 73.600 7154.00 7207.35 -53.35 + 73.650 7055.00 7220.23 -165.23 + 73.700 7146.00 7248.84 -102.84 + 73.750 7435.00 7301.25 133.75 + 73.800 7283.00 7380.52 -97.52 + 73.850 7422.00 7478.44 -56.44 + 73.900 7420.00 7573.66 -153.66 + 73.950 7466.00 7637.55 -171.55 + 74.000 7701.00 7646.74 54.26 + 74.050 7638.00 7596.23 41.77 + 74.100 7407.00 7503.88 -96.88 + 74.150 7226.00 7400.65 -174.65 + 74.200 7275.00 7313.41 -38.41 + 74.250 7216.00 7253.77 -37.77 + 74.300 7280.00 7219.48 60.52 + 74.350 7177.00 7202.37 -25.37 + 74.400 7184.00 7194.70 -10.70 + 74.450 7091.00 7191.45 -100.45 + 74.500 7233.00 7189.99 43.01 + 74.550 7259.00 7189.17 69.83 + 74.600 7075.00 7188.54 -113.54 + 74.650 7067.00 7187.98 -120.98 + 74.700 7165.00 7187.50 -22.50 + 74.750 7163.00 7187.30 -24.30 + 74.800 7122.00 7188.13 -66.13 + 74.850 7315.00 7192.04 122.96 + 74.900 7138.00 7203.69 -65.69 + 74.950 7155.00 7231.25 -76.25 + 75.000 7329.00 7284.97 44.03 + 75.050 7289.00 7371.61 -82.61 + 75.100 7274.00 7486.37 -212.37 + 75.150 7445.00 7608.12 -163.12 + 75.200 7554.00 7703.20 -149.20 + 75.250 7897.00 7738.78 158.22 + 75.300 7777.00 7699.91 77.09 + 75.350 7604.00 7599.82 4.18 + 75.400 7470.00 7473.46 -3.46 + 75.450 7246.00 7357.65 -111.65 + 75.500 7086.00 7273.26 -187.26 + 75.550 7140.00 7222.17 -82.17 + 75.600 7059.00 7195.64 -136.64 + 75.650 7134.00 7183.45 -49.45 + 75.700 7082.00 7178.32 -96.32 + 75.750 7020.00 7176.18 -156.18 + 75.800 6938.00 7175.14 -237.14 + 75.850 7129.00 7174.45 -45.45 + 75.900 7248.00 7173.87 74.13 + 75.950 7113.00 7173.35 -60.35 + 76.000 7265.00 7173.04 91.96 + 76.050 7232.00 7173.45 58.55 + 76.100 7317.00 7176.12 140.88 + 76.150 7359.00 7184.67 174.33 + 76.200 7147.00 7205.80 -58.80 + 76.250 7194.00 7248.57 -54.57 + 76.300 7437.00 7320.12 116.88 + 76.350 7434.00 7418.63 15.37 + 76.400 7530.00 7527.99 2.01 + 76.450 7762.00 7619.50 142.50 + 76.500 7710.00 7662.56 47.44 + 76.550 7629.00 7639.86 -10.86 + 76.600 7528.00 7558.59 -30.59 + 76.650 7404.00 7447.55 -43.55 + 76.700 7418.00 7340.72 77.28 + 76.750 7210.00 7259.86 -49.86 + 76.800 7309.00 7209.37 99.63 + 76.850 7225.00 7182.45 42.55 + 76.900 7123.00 7169.82 -46.82 + 76.950 7143.00 7164.42 -21.42 + 77.000 7031.00 7162.14 -131.14 + 77.050 7151.00 7161.05 -10.05 + 77.100 7181.00 7160.35 20.65 + 77.150 7282.00 7159.77 122.23 + 77.200 7137.00 7159.30 -22.30 + 77.250 7022.00 7159.20 -137.20 + 77.300 7103.00 7160.43 -57.43 + 77.350 7272.00 7165.88 106.12 + 77.400 7165.00 7182.43 -17.43 + 77.450 7319.00 7223.02 95.98 + 77.500 7426.00 7305.48 120.52 + 77.550 7558.00 7444.60 113.40 + 77.600 7709.00 7638.09 70.91 + 77.650 7816.00 7855.62 -39.62 + 77.700 8077.00 8041.11 35.89 + 77.750 8150.00 8133.18 16.82 + 77.800 8120.00 8095.45 24.55 + 77.850 7780.00 7939.61 -159.61 + 77.900 7767.00 7721.34 45.66 + 77.950 7674.00 7508.47 165.53 + 78.000 7328.00 7345.82 -17.82 + 78.050 7215.00 7243.57 -28.57 + 78.100 7165.00 7188.96 -23.96 + 78.150 7180.00 7163.52 16.48 + 78.200 7150.00 7152.92 -2.92 + 78.250 7160.00 7148.81 11.19 + 78.300 7188.00 7147.14 40.86 + 78.350 7176.00 7146.29 29.71 + 78.400 7325.00 7145.73 179.27 + 78.450 7147.00 7145.50 1.50 + 78.500 7029.00 7146.49 -117.49 + 78.550 7113.00 7151.94 -38.94 + 78.600 7243.00 7171.32 71.68 + 78.650 7286.00 7226.95 59.05 + 78.700 7328.00 7360.06 -32.06 + 78.750 7541.00 7626.27 -85.27 + 78.800 8051.00 8069.37 -18.37 + 78.850 8730.00 8677.65 52.35 + 78.900 9218.00 9351.25 -133.25 + 78.950 9902.00 9912.83 -10.83 + 79.000 10075.00 10174.23 -99.23 + 79.050 9957.00 10031.12 -74.12 + 79.100 9475.00 9530.68 -55.68 + 79.150 8917.00 8851.69 65.31 + 79.200 8129.00 8202.13 -73.13 + 79.250 7618.00 7713.30 -95.30 + 79.300 7370.00 7410.18 -40.18 + 79.350 7223.00 7250.55 -27.55 + 79.400 7310.00 7177.53 132.47 + 79.450 7167.00 7148.05 18.95 + 79.500 7179.00 7137.36 41.64 + 79.550 7121.00 7133.70 -12.70 + 79.600 7124.00 7132.32 -8.32 + 79.650 7180.00 7131.59 48.41 + 79.700 7170.00 7131.09 38.91 + 79.750 7085.00 7130.96 -45.96 + 79.800 7101.00 7132.05 -31.05 + 79.850 7147.00 7136.82 10.18 + 79.900 7092.00 7150.87 -58.87 + 79.950 7129.00 7184.10 -55.10 + 80.000 7187.00 7248.97 -61.97 + 80.050 7274.00 7353.88 -79.88 + 80.100 7331.00 7493.24 -162.24 + 80.150 7667.00 7641.42 25.58 + 80.200 7880.00 7757.16 122.84 + 80.250 7884.00 7800.22 83.78 + 80.300 7750.00 7752.54 -2.54 + 80.350 7623.00 7630.66 -7.66 + 80.400 7494.00 7477.41 16.59 + 80.450 7387.00 7337.42 49.58 + 80.500 7347.00 7235.68 111.32 + 80.550 7265.00 7174.30 90.70 + 80.600 7043.00 7142.60 -99.60 + 80.650 7113.00 7128.19 -15.19 + 80.700 7237.00 7122.24 114.76 + 80.750 7162.00 7119.83 42.17 + 80.800 7104.00 7118.72 -14.72 + 80.850 7085.00 7118.01 -33.01 + 80.900 7190.00 7117.42 72.58 + 80.950 7213.00 7116.85 96.15 + 81.000 7083.00 7116.30 -33.30 + 81.050 7118.00 7115.77 2.23 + 81.100 7228.00 7115.32 112.68 + 81.150 7134.00 7115.06 18.94 + 81.200 7160.00 7115.17 44.83 + 81.250 7001.00 7115.86 -114.86 + 81.300 7204.00 7117.21 86.79 + 81.350 7046.00 7118.51 -72.51 + 81.400 7056.00 7119.13 -63.13 + 81.450 7220.00 7119.02 100.98 + 81.500 7094.00 7117.57 -23.57 + 81.550 7140.00 7114.64 25.36 + 81.600 6994.00 7110.65 -116.65 + 81.650 6949.00 7106.34 -157.34 + 81.700 7127.00 7102.41 24.59 + 81.750 7001.00 7099.14 -98.14 + 81.800 7149.00 7096.51 52.49 + 81.850 7174.00 7094.32 79.68 + 81.900 6971.00 7092.36 -121.36 + 81.950 7105.00 7090.52 14.48 + 82.000 7150.00 7088.72 61.28 + 82.050 7130.00 7086.94 43.06 + 82.100 7238.00 7085.17 152.83 + 82.150 7160.00 7083.44 76.56 + 82.200 7055.00 7081.83 -26.83 + 82.250 7150.00 7080.71 69.29 + 82.300 7052.00 7081.21 -29.21 + 82.350 6964.00 7086.07 -122.07 + 82.400 7048.00 7100.74 -52.74 + 82.450 7137.00 7133.13 3.87 + 82.500 7105.00 7190.68 -85.68 + 82.550 7307.00 7274.16 32.84 + 82.600 7322.00 7371.87 -49.87 + 82.650 7273.00 7459.55 -186.55 + 82.700 7511.00 7508.36 2.64 + 82.750 7590.00 7498.94 91.06 + 82.800 7466.00 7433.09 32.91 + 82.850 7447.00 7334.12 112.88 + 82.900 7277.00 7233.33 43.67 + 82.950 7094.00 7153.46 -59.46 + 83.000 7060.00 7101.33 -41.33 + 83.050 7042.00 7072.18 -30.18 + 83.100 7099.00 7057.58 41.42 + 83.150 7080.00 7050.56 29.44 + 83.200 6994.00 7046.91 -52.91 + 83.250 7089.00 7044.55 44.45 + 83.300 7072.00 7042.62 29.38 + 83.350 7100.00 7040.82 59.18 + 83.400 7202.00 7039.13 162.87 + 83.450 7116.00 7037.73 78.27 + 83.500 7281.00 7037.40 243.60 + 83.550 7079.00 7040.26 38.74 + 83.600 7109.00 7051.13 57.87 + 83.650 7089.00 7078.54 10.46 + 83.700 7016.00 7133.15 -117.15 + 83.750 7193.00 7222.11 -29.11 + 83.800 7348.00 7340.50 7.50 + 83.850 7528.00 7466.04 61.96 + 83.900 7477.00 7563.19 -86.19 + 83.950 7514.00 7597.47 -83.47 + 84.000 7526.00 7553.91 -27.91 + 84.050 7571.00 7447.33 123.67 + 84.100 7310.00 7314.80 -4.80 + 84.150 7138.00 7194.21 -56.21 + 84.200 7070.00 7106.57 -36.57 + 84.250 7081.00 7053.33 27.67 + 84.300 7085.00 7025.29 59.71 + 84.350 7089.00 7011.90 77.10 + 84.400 7194.00 7005.63 188.37 + 84.450 7201.00 7002.34 198.66 + 84.500 7115.00 7000.12 114.88 + 84.550 7023.00 6998.26 24.74 + 84.600 6919.00 6996.60 -77.60 + 84.650 6822.00 6995.49 -173.49 + 84.700 7145.00 6996.46 148.54 + 84.750 7079.00 7004.25 74.75 + 84.800 7146.00 7031.03 114.97 + 84.850 7139.00 7101.35 37.65 + 84.900 7211.00 7252.78 -41.78 + 84.950 7525.00 7523.10 1.90 + 85.000 7891.00 7922.06 -31.06 + 85.050 8310.00 8401.31 -91.31 + 85.100 8963.00 8848.63 114.37 + 85.150 9077.00 9123.04 -46.04 + 85.200 8925.00 9120.60 -195.60 + 85.250 8774.00 8836.25 -62.25 + 85.300 8275.00 8373.16 -98.16 + 85.350 7977.00 7883.71 93.29 + 85.400 7446.00 7486.29 -40.29 + 85.450 7135.00 7223.51 -88.51 + 85.500 7077.00 7076.95 0.05 + 85.550 7095.00 7006.19 88.81 + 85.600 7070.00 6975.79 94.21 + 85.650 6983.00 6963.62 19.38 + 85.700 7117.00 6958.55 158.45 + 85.750 6930.00 6955.87 -25.87 + 85.800 6926.00 6953.89 -27.89 + 85.850 6860.00 6952.14 -92.14 + 85.900 6920.00 6950.66 -30.66 + 85.950 7020.00 6950.00 70.00 + 86.000 7005.00 6951.85 53.15 + 86.050 7050.00 6959.99 90.01 + 86.100 6953.00 6981.16 -28.16 + 86.150 7042.00 7023.90 18.10 + 86.200 7270.00 7094.05 175.95 + 86.250 7138.00 7188.05 -50.05 + 86.300 7269.00 7288.37 -19.37 + 86.350 7359.00 7366.65 -7.65 + 86.400 7295.00 7395.09 -100.09 + 86.450 7475.00 7361.24 113.76 + 86.500 7345.00 7276.48 68.52 + 86.550 7168.00 7170.21 -2.21 + 86.600 6999.00 7072.93 -73.93 + 86.650 6934.00 7001.75 -67.75 + 86.700 7009.00 6958.19 50.81 + 86.750 7035.00 6935.00 100.00 + 86.800 6934.00 6923.73 10.27 + 86.850 6848.00 6918.28 -70.28 + 86.900 6859.00 6915.26 -56.26 + 86.950 6842.00 6913.12 -71.12 + 87.000 6863.00 6911.27 -48.27 + 87.050 6789.00 6909.55 -120.55 + 87.100 6939.00 6908.13 30.87 + 87.150 7022.00 6907.81 114.19 + 87.200 7038.00 6911.06 126.94 + 87.250 7117.00 6924.10 192.90 + 87.300 7054.00 6959.37 94.63 + 87.350 7158.00 7035.47 122.53 + 87.400 7232.00 7170.61 61.39 + 87.450 7318.00 7368.33 -50.33 + 87.500 7690.00 7603.25 86.75 + 87.550 7963.00 7818.96 144.04 + 87.600 7878.00 7946.23 -68.23 + 87.650 7979.00 7936.16 42.84 + 87.700 7678.00 7789.46 -111.46 + 87.750 7492.00 7559.01 -67.01 + 87.800 7409.00 7319.44 89.56 + 87.850 7206.00 7127.02 78.98 + 87.900 6994.00 7000.57 -6.57 + 87.950 6939.00 6930.19 8.81 + 88.000 6868.00 6895.95 -27.95 + 88.050 6748.00 6880.80 -132.80 + 88.100 6825.00 6874.22 -49.22 + 88.150 6880.00 6870.93 9.07 + 88.200 6814.00 6868.75 -54.75 + 88.250 6880.00 6866.87 13.13 + 88.300 6809.00 6865.08 -56.08 + 88.350 6912.00 6863.30 48.70 + 88.400 6979.00 6861.53 117.47 + 88.450 6865.00 6859.75 5.25 + 88.500 6881.00 6857.98 23.02 + 88.550 6905.00 6856.20 48.80 + 88.600 6896.00 6854.43 41.57 + 88.650 6849.00 6852.65 -3.65 + 88.700 6677.00 6850.88 -173.88 + 88.750 6797.00 6849.10 -52.10 + 88.800 6852.00 6847.34 4.66 + 88.850 6887.00 6846.65 40.35 + 88.900 6884.00 6845.97 38.03 + 88.950 6896.00 6845.29 50.71 + 89.000 6819.00 6844.61 -25.61 + 89.050 6815.00 6843.92 -28.92 + 89.100 6888.00 6843.24 44.76 + 89.150 6867.00 6842.56 24.44 + 89.200 6835.00 6841.87 -6.87 + 89.250 6680.00 6841.19 -161.19 + 89.300 6640.00 6840.51 -200.51 + 89.350 6851.00 6839.83 11.17 + 89.400 6899.00 6839.16 59.84 + 89.450 6883.00 6838.55 44.45 + 89.500 6905.00 6838.28 66.72 + 89.550 6890.00 6839.46 50.54 + 89.600 6849.00 6846.06 2.94 + 89.650 6925.00 6869.97 55.03 + 89.700 6940.00 6939.94 0.06 + 89.750 7142.00 7111.20 30.80 + 89.800 7359.00 7462.51 -103.51 + 89.850 8003.00 8064.05 -61.05 + 89.900 8767.00 8916.74 -149.74 + 89.950 9790.00 9896.40 -106.40 + 90.000 10504.00 10757.18 -253.18 + 90.050 10876.00 11216.73 -340.73 + 90.100 11034.00 11097.01 -63.01 + 90.150 10370.00 10434.34 -64.34 + 90.200 9450.00 9468.98 -18.98 + 90.250 8637.00 8505.51 131.49 + 90.300 7784.00 7755.47 28.53 + 90.350 7339.00 7276.47 62.53 + 90.400 7051.00 7017.84 33.16 + 90.450 6913.00 6897.39 15.61 + 90.500 6811.00 6848.28 -37.28 + 90.550 6971.00 6830.51 140.49 + 90.600 6872.00 6824.57 47.43 + 90.650 6807.00 6822.55 -15.55 + 90.700 6756.00 6821.87 -65.87 + 90.750 6950.00 6822.68 127.32 + 90.800 6963.00 6828.51 134.49 + 90.850 6939.00 6851.24 87.76 + 90.900 7008.00 6922.48 85.52 + 90.950 7272.00 7109.37 162.63 + 91.000 7706.00 7521.69 184.31 + 91.050 8285.00 8283.51 1.49 + 91.100 9643.00 9454.27 188.73 + 91.150 11098.00 10930.44 167.56 + 91.200 12329.00 12401.21 -72.21 + 91.250 13244.00 13428.80 -184.80 + 91.300 13320.00 13640.58 -320.58 + 91.350 12644.00 12940.59 -296.59 + 91.400 11355.00 11583.69 -228.69 + 91.450 9760.00 10033.63 -273.63 + 91.500 8662.00 8702.36 -40.36 + 91.550 7805.00 7780.44 24.56 + 91.600 7146.00 7246.93 -100.93 + 91.650 7013.00 6982.70 30.30 + 91.700 6895.00 6868.99 26.01 + 91.750 6893.00 6826.00 67.00 + 91.800 6833.00 6811.51 21.49 + 91.850 6918.00 6806.91 111.09 + 91.900 6818.00 6805.32 12.68 + 91.950 6915.00 6804.68 110.32 + 92.000 6825.00 6805.08 19.92 + 92.050 6797.00 6808.67 -11.67 + 92.100 6747.00 6822.01 -75.01 + 92.150 6958.00 6860.54 97.46 + 92.200 6960.00 6952.69 7.31 + 92.250 7109.00 7136.96 -27.96 + 92.300 7522.00 7444.20 77.80 + 92.350 7721.00 7867.46 -146.46 + 92.400 8359.00 8338.21 20.79 + 92.450 8762.00 8732.42 29.58 + 92.500 8870.00 8917.57 -47.57 + 92.550 8632.00 8820.29 -188.29 + 92.600 8294.00 8473.59 -179.59 + 92.650 7916.00 8001.46 -85.46 + 92.700 7554.00 7547.62 6.38 + 92.750 7191.00 7203.67 -12.67 + 92.800 6983.00 6988.60 -5.60 + 92.850 6870.00 6874.47 -4.47 + 92.900 6802.00 6821.98 -19.98 + 92.950 6731.00 6800.71 -69.71 + 93.000 6848.00 6792.88 55.12 + 93.050 6883.00 6790.04 92.96 + 93.100 6870.00 6788.80 81.20 + 93.150 6704.00 6788.04 -84.04 + 93.200 6652.00 6787.57 -135.57 + 93.250 6698.00 6787.85 -89.85 + 93.300 6632.00 6790.57 -158.57 + 93.350 6782.00 6800.12 -18.12 + 93.400 6948.00 6825.52 122.48 + 93.450 6819.00 6881.00 -62.00 + 93.500 6861.00 6981.81 -120.81 + 93.550 7020.00 7133.73 -113.73 + 93.600 7248.00 7320.94 -72.94 + 93.650 7550.00 7502.10 47.90 + 93.700 7466.00 7621.73 -155.73 + 93.750 7697.00 7635.73 61.27 + 93.800 7565.00 7536.65 28.35 + 93.850 7398.00 7360.41 37.59 + 93.900 7035.00 7165.78 -130.78 + 93.950 7101.00 7002.24 98.76 + 94.000 6913.00 6890.66 22.34 + 94.050 6850.00 6826.69 23.31 + 94.100 6906.00 6795.08 110.92 + 94.150 6893.00 6781.28 111.72 + 94.200 6791.00 6775.75 15.25 + 94.250 6741.00 6773.50 -32.50 + 94.300 6716.00 6772.39 -56.39 + 94.350 6713.00 6770.84 -57.84 + 94.400 6821.00 6769.17 51.83 + 94.450 6821.00 6768.35 52.65 + 94.500 6814.00 6770.57 43.43 + 94.550 6790.00 6782.00 8.00 + 94.600 6851.00 6816.87 34.13 + 94.650 6741.00 6900.90 -159.90 + 94.700 7023.00 7068.04 -45.04 + 94.750 7310.00 7344.35 -34.35 + 94.800 7733.00 7721.22 11.78 + 94.850 8114.00 8135.19 -21.19 + 94.900 8351.00 8475.65 -124.65 + 94.950 8533.00 8626.89 -93.89 + 95.000 8488.00 8528.39 -40.39 + 95.050 8200.00 8213.61 -13.61 + 95.100 7778.00 7793.94 -15.94 + 95.150 7502.00 7394.52 107.48 + 95.200 7295.00 7093.53 201.47 + 95.250 6986.00 6905.59 80.41 + 95.300 6949.00 6805.53 143.47 + 95.350 6702.00 6758.94 -56.94 + 95.400 6757.00 6739.31 17.69 + 95.450 6782.00 6731.27 50.73 + 95.500 6919.00 6727.52 191.48 + 95.550 6825.00 6725.15 99.85 + 95.600 6769.00 6723.26 45.74 + 95.650 6672.00 6721.92 -49.92 + 95.700 6775.00 6722.40 52.60 + 95.750 6771.00 6728.83 42.17 + 95.800 6841.00 6751.91 89.09 + 95.850 6904.00 6813.63 90.37 + 95.900 7108.00 6948.78 159.22 + 95.950 7235.00 7194.85 40.15 + 96.000 7567.00 7567.02 -0.02 + 96.050 7955.00 8028.06 -73.06 + 96.100 8399.00 8477.58 -78.58 + 96.150 8847.00 8779.60 67.40 + 96.200 8783.00 8823.63 -40.63 + 96.250 8593.00 8587.94 5.06 + 96.300 8216.00 8157.45 58.55 + 96.350 7640.00 7675.89 -35.89 + 96.400 7259.00 7266.65 -7.65 + 96.450 7013.00 6984.53 28.47 + 96.500 6879.00 6821.05 57.95 + 96.550 6821.00 6739.41 81.59 + 96.600 6698.00 6703.38 -5.38 + 96.650 6732.00 6688.72 43.28 + 96.700 6624.00 6682.67 -58.67 + 96.750 6774.00 6679.59 94.41 + 96.800 6916.00 6677.42 238.58 + 96.850 6840.00 6675.58 164.42 + 96.900 6717.00 6674.24 42.76 + 96.950 6778.00 6674.52 103.48 + 97.000 6776.00 6679.75 96.25 + 97.050 6689.00 6697.82 -8.82 + 97.100 6801.00 6743.30 57.70 + 97.150 6886.00 6836.31 49.69 + 97.200 6978.00 6993.77 -15.77 + 97.250 7216.00 7214.03 1.97 + 97.300 7584.00 7463.44 120.56 + 97.350 7780.00 7678.16 101.84 + 97.400 7739.00 7787.22 -48.22 + 97.450 7696.00 7747.97 -51.97 + 97.500 7558.00 7572.51 -14.51 + 97.550 7346.00 7322.93 23.07 + 97.600 7193.00 7075.71 117.29 + 97.650 6801.00 6883.01 -82.01 + 97.700 6645.00 6758.96 -113.96 + 97.750 6677.00 6690.85 -13.85 + 97.800 6563.00 6658.03 -95.03 + 97.850 6642.00 6643.57 -1.57 + 97.900 6680.00 6637.21 42.79 + 97.950 6610.00 6633.93 -23.93 + 98.000 6682.00 6631.67 50.33 + 98.050 6475.00 6629.78 -154.78 + 98.100 6701.00 6628.30 72.70 + 98.150 6662.00 6628.26 33.74 + 98.200 6588.00 6634.19 -46.19 + 98.250 6556.00 6654.26 -98.26 + 98.300 6780.00 6708.30 71.70 + 98.350 7010.00 6829.88 180.12 + 98.400 7027.00 7059.51 -32.51 + 98.450 7386.00 7421.82 -35.82 + 98.500 7876.00 7893.89 -17.89 + 98.550 8248.00 8386.15 -138.15 + 98.600 8740.00 8760.17 -20.17 + 98.650 8739.00 8886.13 -147.13 + 98.700 8704.00 8712.46 -8.46 + 98.750 8156.00 8300.91 -144.91 + 98.800 7733.00 7793.44 -60.44 + 98.850 7373.00 7332.49 40.51 + 98.900 6919.00 6996.79 -77.79 + 98.950 6713.00 6793.12 -80.12 + 99.000 6742.00 6687.56 54.44 + 99.050 6663.00 6640.01 22.99 + 99.100 6686.00 6621.06 64.94 + 99.150 6642.00 6614.16 27.84 + 99.200 6584.00 6611.63 -27.63 + 99.250 6574.00 6610.52 -36.52 + 99.300 6524.00 6610.03 -86.03 + 99.350 6450.00 6610.78 -160.78 + 99.400 6581.00 6615.91 -34.91 + 99.450 6648.00 6635.28 12.72 + 99.500 6802.00 6693.80 108.20 + 99.550 6962.00 6842.04 119.96 + 99.600 7227.00 7158.75 68.25 + 99.650 7636.00 7728.03 -92.03 + 99.700 8325.00 8582.28 -257.28 + 99.750 9406.00 9636.50 -230.50 + 99.800 10464.00 10663.68 -199.68 + 99.850 11219.00 11356.73 -137.73 + 99.900 11306.00 11466.65 -160.65 + 99.950 10811.00 10942.74 -131.74 + 100.000 10033.00 9973.22 59.78 + 100.050 8829.00 8880.05 -51.05 + 100.100 7830.00 7943.90 -113.90 + 100.150 7237.00 7292.98 -55.98 + 100.200 6907.00 6913.29 -6.29 + 100.250 6644.00 6723.33 -79.33 + 100.300 6628.00 6640.66 -12.66 + 100.350 6684.00 6608.99 75.01 + 100.400 6727.00 6598.07 128.93 + 100.450 6688.00 6594.43 93.57 + 100.500 6622.00 6593.00 29.00 + 100.550 6592.00 6592.14 -0.14 + 100.600 6539.00 6591.41 -52.41 + 100.650 6623.00 6590.71 32.29 + 100.700 6646.00 6590.01 55.99 + 100.750 6756.00 6589.31 166.69 + 100.800 6709.00 6588.60 120.40 + 100.850 6551.00 6587.90 -36.90 + 100.900 6831.00 6587.20 243.80 + 100.950 6555.00 6586.50 -31.50 + 101.000 6723.00 6585.60 137.40 + 101.050 6614.00 6584.35 29.65 + 101.100 6564.00 6583.09 -19.09 + 101.150 6673.00 6581.84 91.16 + 101.200 6604.00 6580.59 23.41 + 101.250 6635.00 6579.34 55.66 + 101.300 6720.00 6578.09 141.91 + 101.350 6447.00 6576.83 -129.83 + 101.400 6644.00 6575.58 68.42 + 101.450 6532.00 6574.33 -42.33 + 101.500 6458.00 6573.08 -115.08 + 101.550 6442.00 6571.83 -129.83 + 101.600 6546.00 6570.58 -24.58 + 101.650 6440.00 6569.33 -129.33 + 101.700 6538.00 6568.08 -30.08 + 101.750 6553.00 6566.87 -13.87 + 101.800 6591.00 6565.82 25.18 + 101.850 6716.00 6565.44 150.56 + 101.900 6561.00 6567.52 -6.52 + 101.950 6535.00 6577.18 -42.18 + 102.000 6586.00 6606.64 -20.64 + 102.050 6680.00 6679.09 0.91 + 102.100 6831.00 6827.84 3.16 + 102.150 7148.00 7083.99 64.01 + 102.200 7401.00 7451.50 -50.50 + 102.250 7942.00 7883.17 58.83 + 102.300 8278.00 8277.54 0.46 + 102.350 8399.00 8511.62 -112.62 + 102.400 8541.00 8499.18 41.82 + 102.450 8195.00 8240.98 -45.98 + 102.500 7783.00 7828.30 -45.30 + 102.550 7375.00 7391.67 -16.67 + 102.600 7078.00 7033.05 44.95 + 102.650 6930.00 6791.24 138.76 + 102.700 6795.00 6653.35 141.65 + 102.750 6683.00 6585.34 97.66 + 102.800 6557.00 6555.73 1.27 + 102.850 6482.00 6543.95 -61.95 + 102.900 6459.00 6539.29 -80.29 + 102.950 6499.00 6537.08 -38.08 + 103.000 6618.00 6535.63 82.37 + 103.050 6585.00 6534.49 50.51 + 103.100 6486.00 6533.96 -47.96 + 103.150 6525.00 6535.48 -10.48 + 103.200 6763.00 6543.32 219.68 + 103.250 6708.00 6567.70 140.30 + 103.300 6716.00 6628.21 87.79 + 103.350 6762.00 6753.31 8.69 + 103.400 7061.00 6970.37 90.63 + 103.450 7385.00 7284.62 100.38 + 103.500 7725.00 7658.10 66.90 + 103.550 7856.00 8005.47 -149.47 + 103.600 8141.00 8220.34 -79.34 + 103.650 8012.00 8224.69 -212.69 + 103.700 7856.00 8013.54 -157.54 + 103.750 7674.00 7661.17 12.83 + 103.800 7151.00 7279.81 -128.81 + 103.850 6853.00 6960.84 -107.84 + 103.900 6628.00 6742.18 -114.18 + 103.950 6581.00 6615.49 -34.49 + 104.000 6479.00 6552.02 -73.02 + 104.050 6520.00 6523.94 -3.94 + 104.100 6546.00 6512.58 33.42 + 104.150 6619.00 6508.00 111.00 + 104.200 6681.00 6505.80 175.20 + 104.250 6529.00 6504.35 24.65 + 104.300 6402.00 6503.25 -101.25 + 104.350 6436.00 6503.02 -67.02 + 104.400 6401.00 6505.49 -104.49 + 104.450 6474.00 6516.36 -42.36 + 104.500 6614.00 6549.77 64.23 + 104.550 6826.00 6633.82 192.18 + 104.600 6901.00 6811.60 89.40 + 104.650 7014.00 7128.64 -114.64 + 104.700 7646.00 7602.48 43.52 + 104.750 8185.00 8187.65 -2.65 + 104.800 8563.00 8761.89 -198.89 + 104.850 8974.00 9158.21 -184.21 + 104.900 9196.00 9238.03 -42.03 + 104.950 8913.00 8967.05 -54.05 + 105.000 8399.00 8440.36 -41.36 + 105.050 7815.00 7830.46 -15.46 + 105.100 7257.00 7294.88 -37.88 + 105.150 6831.00 6912.43 -81.43 + 105.200 6531.00 6682.86 -151.86 + 105.250 6582.00 6564.37 17.63 + 105.300 6560.00 6510.91 49.09 + 105.350 6534.00 6489.40 44.60 + 105.400 6594.00 6481.33 112.67 + 105.450 6480.00 6478.15 1.85 + 105.500 6506.00 6476.52 29.48 + 105.550 6508.00 6475.36 32.64 + 105.600 6503.00 6474.54 28.46 + 105.650 6489.00 6474.66 14.34 + 105.700 6438.00 6477.87 -39.87 + 105.750 6571.00 6489.74 81.26 + 105.800 6521.00 6522.14 -1.14 + 105.850 6598.00 6594.94 3.06 + 105.900 6765.00 6732.33 32.67 + 105.950 7008.00 6950.09 57.91 + 106.000 7324.00 7237.34 86.66 + 106.050 7656.00 7544.12 111.88 + 106.100 7755.00 7789.30 -34.30 + 106.150 7873.00 7892.05 -19.05 + 106.200 7747.00 7812.93 -65.93 + 106.250 7552.00 7578.48 -26.48 + 106.300 7238.00 7268.04 -30.04 + 106.350 6994.00 6970.15 23.85 + 106.400 6918.00 6741.43 176.57 + 106.450 6681.00 6595.00 86.00 + 106.500 6646.00 6514.75 131.25 + 106.550 6520.00 6476.33 43.67 + 106.600 6430.00 6459.88 -29.88 + 106.650 6572.00 6453.24 118.76 + 106.700 6467.00 6450.39 16.61 + 106.750 6621.00 6448.81 172.19 + 106.800 6384.00 6447.62 -63.62 + 106.850 6371.00 6446.65 -75.65 + 106.900 6524.00 6446.23 77.77 + 106.950 6538.00 6447.66 90.34 + 107.000 6396.00 6454.69 -58.69 + 107.050 6366.00 6476.09 -110.09 + 107.100 6534.00 6528.32 5.68 + 107.150 6596.00 6635.09 -39.09 + 107.200 6621.00 6818.97 -197.97 + 107.250 6858.00 7084.64 -226.64 + 107.300 7430.00 7401.21 28.79 + 107.350 7753.00 7698.74 54.26 + 107.400 7919.00 7888.89 30.11 + 107.450 8024.00 7904.59 119.41 + 107.500 7608.00 7737.44 -129.44 + 107.550 7331.00 7445.11 -114.11 + 107.600 7144.00 7119.86 24.14 + 107.650 7006.00 6840.65 165.35 + 107.700 6822.00 6644.15 177.85 + 107.750 6670.00 6527.10 142.90 + 107.800 6463.00 6466.80 -3.80 + 107.850 6459.00 6439.39 19.61 + 107.900 6505.00 6428.05 76.95 + 107.950 6563.00 6423.46 139.54 + 108.000 6436.00 6421.31 14.69 + 108.050 6381.00 6419.93 -38.93 + 108.100 6363.00 6418.76 -55.76 + 108.150 6569.00 6417.64 151.36 + 108.200 6568.00 6416.53 151.47 + 108.250 6327.00 6415.42 -88.42 + 108.300 6301.00 6414.31 -113.31 + 108.350 6517.00 6413.21 103.79 + 108.400 6330.00 6412.10 -82.10 + 108.450 6365.00 6410.99 -45.99 + 108.500 6327.00 6409.88 -82.88 + 108.550 6305.00 6408.78 -103.78 + 108.600 6327.00 6407.67 -80.67 + 108.650 6322.00 6406.56 -84.56 + 108.700 6388.00 6405.45 -17.45 + 108.750 6401.00 6405.29 -4.29 + 108.800 6453.00 6405.91 47.09 + 108.850 6554.00 6406.53 147.47 + 108.900 6475.00 6407.15 67.85 + 108.950 6506.00 6407.77 98.23 + 109.000 6486.00 6408.38 77.62 + 109.050 6332.00 6409.00 -77.00 + 109.100 6378.00 6409.62 -31.62 + 109.150 6332.00 6410.24 -78.24 + 109.200 6306.00 6410.86 -104.86 + 109.250 6262.00 6411.48 -149.48 + 109.300 6440.00 6412.10 27.90 + 109.350 6347.00 6412.77 -65.77 + 109.400 6380.00 6413.63 -33.63 + 109.450 6499.00 6415.33 83.67 + 109.500 6360.00 6420.16 -60.16 + 109.550 6444.00 6435.03 8.97 + 109.600 6516.00 6477.46 38.54 + 109.650 6723.00 6584.01 138.99 + 109.700 6920.00 6815.01 104.99 + 109.750 7152.00 7243.57 -91.57 + 109.800 7828.00 7918.45 -90.45 + 109.850 8625.00 8809.67 -184.67 + 109.900 9542.00 9771.65 -229.65 + 109.950 10351.00 10561.90 -210.90 + 110.000 10767.00 10931.29 -164.29 + 110.050 10631.00 10745.61 -114.61 + 110.100 9950.00 10065.53 -115.53 + 110.150 9014.00 9118.19 -104.19 + 110.200 8288.00 8175.67 112.33 + 110.250 7573.00 7427.30 145.70 + 110.300 7122.00 6932.33 189.67 + 110.350 6870.00 6653.03 216.97 + 110.400 6716.00 6516.55 199.45 + 110.450 6558.00 6458.46 99.54 + 110.500 6486.00 6437.00 49.00 + 110.550 6584.00 6430.33 153.67 + 110.600 6496.00 6428.84 67.16 + 110.650 6575.00 6428.95 146.05 + 110.700 6558.00 6429.54 128.46 + 110.750 6591.00 6430.53 160.47 + 110.800 6541.00 6432.67 108.33 + 110.850 6494.00 6438.44 55.56 + 110.900 6538.00 6454.19 83.81 + 110.950 6469.00 6493.23 -24.23 + 111.000 6628.00 6577.79 50.21 + 111.050 6881.00 6735.40 145.60 + 111.100 6980.00 6985.72 -5.72 + 111.150 7298.00 7320.58 -22.58 + 111.200 7620.00 7688.66 -68.66 + 111.250 7818.00 8000.93 -182.93 + 111.300 8201.00 8161.60 39.40 + 111.350 8211.00 8113.95 97.05 + 111.400 7773.00 7872.76 -99.76 + 111.450 7438.00 7518.58 -80.58 + 111.500 6973.00 7154.52 -181.52 + 111.550 6767.00 6857.64 -90.64 + 111.600 6706.00 6656.40 49.60 + 111.650 6676.00 6540.15 135.85 + 111.700 6417.00 6482.14 -65.14 + 111.750 6589.00 6457.01 131.99 + 111.800 6534.00 6447.70 86.30 + 111.850 6366.00 6444.95 -78.95 + 111.900 6409.00 6444.57 -35.57 + 111.950 6493.00 6444.92 48.08 + 112.000 6383.00 6445.48 -62.48 + 112.050 6398.00 6446.09 -48.09 + 112.100 6423.00 6446.71 -23.71 + 112.150 6313.00 6447.32 -134.32 + 112.200 6508.00 6447.94 60.06 + 112.250 6360.00 6448.56 -88.56 + 112.300 6348.00 6449.18 -101.18 + 112.350 6465.00 6449.79 15.21 + 112.400 6354.00 6450.41 -96.41 + 112.450 6465.00 6451.03 13.97 + 112.500 6541.00 6451.65 89.35 + 112.550 6435.00 6452.27 -17.27 + 112.600 6380.00 6452.89 -72.89 + 112.650 6420.00 6453.50 -33.50 + 112.700 6314.00 6454.12 -140.12 + 112.750 6393.00 6454.74 -61.74 + 112.800 6228.00 6455.36 -227.36 + 112.850 6475.00 6455.98 19.02 + 112.900 6354.00 6456.59 -102.59 + 112.950 6410.00 6457.21 -47.21 + 113.000 6216.00 6457.83 -241.83 + 113.050 6351.00 6458.45 -107.45 + 113.100 6487.00 6459.07 27.93 + 113.150 6470.00 6459.68 10.32 + 113.200 6362.00 6460.30 -98.30 + 113.250 6453.00 6460.92 -7.92 + 113.300 6249.00 6461.55 -212.55 + 113.350 6381.00 6462.22 -81.22 + 113.400 6454.00 6463.03 -9.03 + 113.450 6316.00 6464.36 -148.36 + 113.500 6428.00 6467.28 -39.28 + 113.550 6425.00 6474.38 -49.38 + 113.600 6316.00 6490.79 -174.79 + 113.650 6465.00 6524.69 -59.69 + 113.700 6581.00 6585.54 -4.54 + 113.750 6775.00 6679.22 95.78 + 113.800 6851.00 6801.16 49.84 + 113.850 6849.00 6931.83 -82.83 + 113.900 7129.00 7039.55 89.45 + 113.950 7218.00 7091.74 126.26 + 114.000 7014.00 7070.44 -56.44 + 114.050 7128.00 6982.45 145.55 + 114.100 6929.00 6856.42 72.58 + 114.150 6792.00 6727.89 64.11 + 114.200 6736.00 6623.14 112.86 + 114.250 6845.00 6551.83 293.17 + 114.300 6529.00 6510.40 18.60 + 114.350 6618.00 6489.64 128.36 + 114.400 6556.00 6480.72 75.28 + 114.450 6692.00 6477.59 214.41 + 114.500 6600.00 6476.91 123.09 + 114.550 6302.00 6477.13 -175.13 + 114.600 6423.00 6477.67 -54.67 + 114.650 6538.00 6478.36 59.64 + 114.700 6375.00 6479.46 -104.46 + 114.750 6242.00 6482.00 -240.00 + 114.800 6619.00 6489.45 129.55 + 114.850 6638.00 6511.23 126.77 + 114.900 6752.00 6569.21 182.79 + 114.950 6898.00 6704.85 193.15 + 115.000 7189.00 6980.52 208.48 + 115.050 7549.00 7463.30 85.70 + 115.100 8336.00 8186.13 149.87 + 115.150 9170.00 9099.76 70.24 + 115.200 9980.00 10046.16 -66.16 + 115.250 10682.00 10788.84 -106.84 + 115.300 10939.00 11100.35 -161.35 + 115.350 10662.00 10872.20 -210.20 + 115.400 9998.00 10176.74 -178.74 + 115.450 9114.00 9233.61 -119.61 + 115.500 8145.00 8297.12 -152.12 + 115.550 7421.00 7545.81 -124.81 + 115.600 7012.00 7038.99 -26.99 + 115.650 6906.00 6745.01 160.99 + 115.700 6784.00 6596.52 187.48 + 115.750 6702.00 6530.75 171.25 + 115.800 6598.00 6505.26 92.74 + 115.850 6589.00 6496.82 92.18 + 115.900 6470.00 6494.65 -24.65 + 115.950 6348.00 6494.52 -146.52 + 116.000 6670.00 6494.97 175.03 + 116.050 6563.00 6495.60 67.40 + 116.100 6477.00 6494.67 -17.67 + 116.150 6474.00 6493.30 -19.30 + 116.200 6444.00 6493.26 -49.26 + 116.250 6411.00 6496.61 -85.61 + 116.300 6280.00 6507.31 -227.31 + 116.350 6442.00 6531.41 -89.41 + 116.400 6684.00 6575.78 108.22 + 116.450 6566.00 6644.42 -78.42 + 116.500 6643.00 6733.72 -90.72 + 116.550 6879.00 6829.32 49.68 + 116.600 7000.00 6908.14 91.86 + 116.650 6925.00 6946.47 -21.47 + 116.700 6944.00 6930.75 13.25 + 116.750 6702.00 6865.03 -163.03 + 116.800 6787.00 6769.34 17.66 + 116.850 6663.00 6669.61 -6.61 + 116.900 6478.00 6585.85 -107.85 + 116.950 6586.00 6526.52 59.48 + 117.000 6575.00 6489.98 85.02 + 117.050 6462.00 6469.84 -7.84 + 117.100 6608.00 6459.45 148.55 + 117.150 6552.00 6454.02 97.98 + 117.200 6446.00 6450.77 -4.77 + 117.250 6508.00 6448.37 59.63 + 117.300 6514.00 6446.25 67.75 + 117.350 6348.00 6444.22 -96.22 + 117.400 6377.00 6442.25 -65.25 + 117.450 6415.00 6440.45 -25.45 + 117.500 6416.00 6439.18 -23.18 + 117.550 6380.00 6439.56 -59.56 + 117.600 6625.00 6444.33 180.67 + 117.650 6572.00 6459.20 112.80 + 117.700 6472.00 6493.76 -21.76 + 117.750 6528.00 6560.61 -32.61 + 117.800 6629.00 6670.49 -41.49 + 117.850 6791.00 6824.11 -33.11 + 117.900 7075.00 7004.42 70.58 + 117.950 7098.00 7175.20 -77.20 + 118.000 7292.00 7290.92 1.08 + 118.050 7379.00 7314.99 64.01 + 118.100 7207.00 7237.95 -30.95 + 118.150 6995.00 7083.31 -88.31 + 118.200 6863.00 6896.08 -33.08 + 118.250 6732.00 6721.07 10.93 + 118.300 6684.00 6585.74 98.26 + 118.350 6595.00 6496.23 98.77 + 118.400 6397.00 6444.38 -47.38 + 118.450 6364.00 6417.45 -53.45 + 118.500 6489.00 6404.43 84.57 + 118.550 6383.00 6398.10 -15.10 + 118.600 6327.00 6394.59 -67.59 + 118.650 6471.00 6392.12 78.88 + 118.700 6317.00 6389.99 -72.99 + 118.750 6380.00 6387.98 -7.98 + 118.800 6229.00 6386.09 -157.09 + 118.850 6297.00 6384.55 -87.55 + 118.900 6428.00 6384.21 43.79 + 118.950 6557.00 6387.36 169.64 + 119.000 6568.00 6399.36 168.64 + 119.050 6612.00 6430.77 181.23 + 119.100 6583.00 6498.42 84.58 + 119.150 6754.00 6622.74 131.26 + 119.200 6815.00 6818.85 -3.85 + 119.250 7006.00 7083.19 -77.19 + 119.300 7322.00 7382.29 -60.29 + 119.350 7629.00 7653.73 -24.73 + 119.400 7796.00 7824.53 -28.53 + 119.450 7859.00 7841.05 17.95 + 119.500 7600.00 7695.82 -95.82 + 119.550 7320.00 7432.84 -112.84 + 119.600 6956.00 7126.31 -170.31 + 119.650 6751.00 6845.97 -94.97 + 119.700 6706.00 6632.34 73.66 + 119.750 6509.00 6492.50 16.50 + 119.800 6551.00 6412.31 138.69 + 119.850 6651.00 6371.24 279.76 + 119.900 6365.00 6351.93 13.07 + 119.950 6401.00 6343.11 57.89 + 120.000 6380.00 6338.71 41.29 + 120.050 6389.00 6335.96 53.04 + 120.100 6315.00 6333.75 -18.75 + 120.150 6277.00 6331.69 -54.69 + 120.200 6226.00 6329.68 -103.68 + 120.250 6168.00 6327.72 -159.72 + 120.300 6275.00 6325.87 -50.87 + 120.350 6413.00 6324.35 88.65 + 120.400 6341.00 6323.68 17.32 + 120.450 6266.00 6324.88 -58.88 + 120.500 6283.00 6329.66 -46.66 + 120.550 6166.00 6340.15 -174.15 + 120.600 6403.00 6358.15 44.85 + 120.650 6407.00 6383.76 23.24 + 120.700 6496.00 6414.09 81.91 + 120.750 6494.00 6443.07 50.93 + 120.800 6500.00 6462.96 37.04 + 120.850 6372.00 6467.28 -95.28 + 120.900 6468.00 6453.92 14.08 + 120.950 6482.00 6426.28 55.72 + 121.000 6204.00 6391.71 -187.71 + 121.050 6291.00 6358.08 -67.08 + 121.100 6317.00 6330.73 -13.73 + 121.150 6333.00 6311.37 21.63 + 121.200 6280.00 6299.03 -19.03 + 121.250 6400.00 6291.60 108.40 + 121.300 6399.00 6287.07 111.93 + 121.350 6471.00 6284.01 186.99 + 121.400 6320.00 6281.62 38.38 + 121.450 6256.00 6279.48 -23.48 + 121.500 6296.00 6278.04 17.96 + 121.550 6384.00 6278.22 105.78 + 121.600 6508.00 6278.41 229.59 + 121.650 6248.00 6278.61 -30.61 + 121.700 6269.00 6278.84 -9.84 + 121.750 6325.00 6279.17 45.83 + 121.800 6193.00 6279.77 -86.77 + 121.850 6322.00 6281.01 40.99 + 121.900 6072.00 6283.56 -211.56 + 121.950 6217.00 6288.40 -71.40 + 122.000 6128.00 6296.62 -168.62 + 122.050 6320.00 6308.89 11.11 + 122.100 6351.00 6324.69 26.31 + 122.150 6269.00 6341.92 -72.92 + 122.200 6358.00 6357.03 0.97 + 122.250 6474.00 6366.12 107.88 + 122.300 6381.00 6366.51 14.49 + 122.350 6309.00 6358.08 -49.08 + 122.400 6418.00 6343.33 74.67 + 122.450 6440.00 6326.31 113.69 + 122.500 6223.00 6310.74 -87.74 + 122.550 6133.00 6298.82 -165.82 + 122.600 6355.00 6290.98 64.02 + 122.650 6437.00 6286.51 150.49 + 122.700 6286.00 6284.31 1.69 + 122.750 6296.00 6283.40 12.60 + 122.800 6343.00 6283.14 59.86 + 122.850 6209.00 6283.16 -74.16 + 122.900 6332.00 6283.30 48.70 + 122.950 6371.00 6283.47 87.53 + 123.000 6306.00 6283.68 22.32 + 123.050 6291.00 6283.97 7.03 + 123.100 6343.00 6284.57 58.43 + 123.150 6362.00 6286.23 75.77 + 123.200 6231.00 6291.06 -60.06 + 123.250 6305.00 6304.35 0.65 + 123.300 6585.00 6337.42 247.58 + 123.350 6371.00 6410.63 -39.63 + 123.400 6635.00 6553.90 81.10 + 123.450 6747.00 6800.31 -53.31 + 123.500 7009.00 7170.80 -161.80 + 123.550 7486.00 7652.94 -166.94 + 123.600 8011.00 8185.80 -174.80 + 123.650 8779.00 8664.40 114.60 + 123.700 8945.00 8968.95 -23.95 + 123.750 8816.00 9011.88 -195.88 + 123.800 8594.00 8778.09 -184.09 + 123.850 8194.00 8334.57 -140.57 + 123.900 7685.00 7799.86 -114.86 + 123.950 7303.00 7292.64 10.36 + 124.000 6922.00 6889.36 32.64 + 124.050 6624.00 6612.91 11.09 + 124.100 6592.00 6446.78 145.22 + 124.150 6489.00 6358.30 130.70 + 124.200 6459.00 6316.31 142.69 + 124.250 6413.00 6298.53 114.47 + 124.300 6376.00 6291.85 84.15 + 124.350 6346.00 6289.69 56.31 + 124.400 6187.00 6289.16 -102.16 + 124.450 6185.00 6289.15 -104.15 + 124.500 6204.00 6289.31 -85.31 + 124.550 6216.00 6289.59 -73.59 + 124.600 6196.00 6290.15 -94.15 + 124.650 6164.00 6291.56 -127.56 + 124.700 6265.00 6295.31 -30.31 + 124.750 6343.00 6304.82 38.18 + 124.800 6155.00 6326.67 -171.67 + 124.850 6278.00 6371.55 -93.55 + 124.900 6365.00 6453.29 -88.29 + 124.950 6481.00 6584.38 -103.38 + 125.000 6588.00 6768.36 -180.36 + 125.050 6881.00 6991.43 -110.43 + 125.100 7188.00 7219.19 -31.19 + 125.150 7355.00 7402.87 -47.87 + 125.200 7588.00 7494.93 93.07 + 125.250 7432.00 7468.64 -36.64 + 125.300 7340.00 7330.74 9.26 + 125.350 6945.00 7119.20 -174.20 + 125.400 6794.00 6886.32 -92.32 + 125.450 6590.00 6677.76 -87.76 + 125.500 6597.00 6518.70 78.30 + 125.550 6458.00 6413.08 44.92 + 125.600 6406.00 6351.16 54.84 + 125.650 6311.00 6318.85 -7.85 + 125.700 6292.00 6303.80 -11.80 + 125.750 6293.00 6297.56 -4.56 + 125.800 6356.00 6295.32 60.68 + 125.850 6217.00 6294.67 -77.67 + 125.900 6321.00 6294.61 26.39 + 125.950 6348.00 6294.75 53.25 + 126.000 6219.00 6295.00 -76.00 + 126.050 6533.00 6295.52 237.48 + 126.100 6387.00 6296.88 90.12 + 126.150 6520.00 6300.79 219.21 + 126.200 6544.00 6311.67 232.33 + 126.250 6486.00 6339.31 146.69 + 126.300 6655.00 6402.54 252.46 + 126.350 6710.00 6531.75 178.25 + 126.400 6806.00 6766.46 39.54 + 126.450 7056.00 7143.56 -87.56 + 126.500 7559.00 7676.35 -117.35 + 126.550 8184.00 8330.90 -146.90 + 126.600 8836.00 9014.68 -178.68 + 126.650 9551.00 9590.60 -39.60 + 126.700 9949.00 9917.50 31.50 + 126.750 9719.00 9905.11 -186.11 + 126.800 9393.00 9554.21 -161.21 + 126.850 8862.00 8959.04 -97.04 + 126.900 8069.00 8266.46 -197.46 + 126.950 7456.00 7617.17 -161.17 + 127.000 7300.00 7099.98 200.02 + 127.050 6987.00 6741.22 245.78 + 127.100 6486.00 6521.25 -35.25 + 127.150 6521.00 6400.85 120.15 + 127.200 6553.00 6341.73 211.27 + 127.250 6448.00 6315.62 132.38 + 127.300 6341.00 6305.28 35.72 + 127.350 6424.00 6301.67 122.33 + 127.400 6378.00 6300.62 77.38 + 127.450 6336.00 6300.45 35.55 + 127.500 6243.00 6300.56 -57.56 + 127.550 6271.00 6300.80 -29.80 + 127.600 6239.00 6301.25 -62.25 + 127.650 6362.00 6302.31 59.69 + 127.700 6262.00 6305.12 -43.12 + 127.750 6339.00 6312.32 26.68 + 127.800 6473.00 6329.44 143.56 + 127.850 6483.00 6366.27 116.73 + 127.900 6439.00 6437.37 1.63 + 127.950 6407.00 6559.78 -152.78 + 128.000 6718.00 6746.89 -28.89 + 128.050 6908.00 6998.92 -90.92 + 128.100 7315.00 7294.28 20.72 + 128.150 7639.00 7587.45 51.55 + 128.200 7794.00 7818.19 -24.19 + 128.250 7883.00 7930.03 -47.03 + 128.300 7731.00 7892.50 -161.50 + 128.350 7654.00 7714.74 -60.74 + 128.400 7409.00 7442.50 -33.50 + 128.450 7125.00 7138.90 -13.90 + 128.500 6884.00 6860.84 23.16 + 128.550 6669.00 6642.30 26.70 + 128.600 6359.00 6491.65 -132.65 + 128.650 6411.00 6399.36 11.64 + 128.700 6510.00 6348.66 161.34 + 128.750 6452.00 6323.61 128.39 + 128.800 6476.00 6312.47 163.53 + 128.850 6422.00 6308.06 113.94 + 128.900 6384.00 6306.55 77.45 + 128.950 6188.00 6306.17 -118.17 + 129.000 6263.00 6306.19 -43.19 + 129.050 6411.00 6306.34 104.66 + 129.100 6459.00 6306.56 152.44 + 129.150 6353.00 6306.89 46.11 + 129.200 6353.00 6307.55 45.45 + 129.250 6356.00 6309.14 46.86 + 129.300 6268.00 6313.09 -45.09 + 129.350 6373.00 6322.41 50.59 + 129.400 6248.00 6342.57 -94.57 + 129.450 6272.00 6382.05 -110.05 + 129.500 6521.00 6451.50 69.50 + 129.550 6570.00 6560.71 9.29 + 129.600 6495.00 6713.26 -218.26 + 129.650 6970.00 6900.68 69.32 + 129.700 7047.00 7099.59 -52.59 + 129.750 7132.00 7274.14 -142.14 + 129.800 7421.00 7385.77 35.23 + 129.850 7372.00 7406.50 -34.50 + 129.900 7392.00 7330.40 61.60 + 129.950 7100.00 7176.43 -76.43 + 130.000 6871.00 6981.15 -110.15 + 130.050 6583.00 6784.49 -201.49 + 130.100 6600.00 6616.51 -16.51 + 130.150 6721.00 6491.28 229.72 + 130.200 6312.00 6408.41 -96.41 + 130.250 6450.00 6359.28 90.72 + 130.300 6418.00 6333.03 84.97 + 130.350 6493.00 6320.37 172.63 + 130.400 6354.00 6314.88 39.12 + 130.450 6263.00 6312.78 -49.78 + 130.500 6366.00 6312.14 53.86 + 130.550 6183.00 6312.05 -129.05 + 130.600 6322.00 6312.15 9.85 + 130.650 6305.00 6312.32 -7.32 + 130.700 6349.00 6312.50 36.50 + 130.750 6319.00 6312.68 6.32 + 130.800 6474.00 6312.87 161.13 + 130.850 6187.00 6313.06 -126.06 + 130.900 6219.00 6313.24 -94.24 + 130.950 6313.00 6313.43 -0.43 + 131.000 6243.00 6313.62 -70.62 + 131.050 6336.00 6313.81 22.19 + 131.100 6304.00 6313.99 -9.99 + 131.150 6301.00 6314.18 -13.18 + 131.200 6247.00 6314.37 -67.37 + 131.250 6246.00 6314.56 -68.56 + 131.300 6311.00 6315.49 -4.49 + 131.350 6451.00 6317.59 133.41 + 131.400 6379.00 6319.69 59.31 + 131.450 6180.00 6321.78 -141.78 + 131.500 6263.00 6323.88 -60.88 + 131.550 6263.00 6325.98 -62.98 + 131.600 6229.00 6328.08 -99.08 + 131.650 6354.00 6330.18 23.82 + 131.700 6395.00 6332.28 62.72 + 131.750 6371.00 6334.38 36.62 + 131.800 6319.00 6336.47 -17.47 + 131.850 6349.00 6338.57 10.43 + 131.900 6335.00 6340.67 -5.67 + 131.950 6275.00 6342.77 -67.77 + 132.000 6390.00 6344.87 45.13 + 132.050 6378.00 6346.97 31.03 + 132.100 6427.00 6349.07 77.93 + 132.150 6354.00 6351.17 2.83 + 132.200 6400.00 6353.27 46.73 + 132.250 6289.00 6355.39 -66.39 + 132.300 6322.00 6357.56 -35.56 + 132.350 6343.00 6359.92 -16.92 + 132.400 6451.00 6362.85 88.15 + 132.450 6535.00 6367.40 167.60 + 132.500 6480.00 6376.13 103.87 + 132.550 6467.00 6394.60 72.40 + 132.600 6580.00 6433.57 146.43 + 132.650 6544.00 6511.18 32.82 + 132.700 6754.00 6653.79 100.21 + 132.750 7085.00 6892.48 192.52 + 132.800 7217.00 7253.93 -36.93 + 132.850 7701.00 7745.93 -44.93 + 132.900 8170.00 8342.05 -172.05 + 132.950 8754.00 8974.92 -220.92 + 133.000 9614.00 9542.28 71.72 + 133.050 9976.00 9932.08 43.92 + 133.100 10155.00 10057.14 97.86 + 133.150 9828.00 9886.98 -58.98 + 133.200 9250.00 9460.32 -210.32 + 133.250 8535.00 8871.88 -336.88 + 133.300 7982.00 8238.15 -256.15 + 133.350 7578.00 7659.72 -81.72 + 133.400 7154.00 7197.35 -43.35 + 133.450 7028.00 6867.71 160.29 + 133.500 6810.00 6656.20 153.80 + 133.550 6582.00 6533.33 48.67 + 133.600 6416.00 6468.70 -52.70 + 133.650 6470.00 6438.18 31.82 + 133.700 6424.00 6425.64 -1.64 + 133.750 6367.00 6421.72 -54.72 + 133.800 6469.00 6421.55 47.45 + 133.850 6450.00 6422.86 27.14 + 133.900 6432.00 6424.72 7.28 + 133.950 6400.00 6426.77 -26.77 + 134.000 6373.00 6428.94 -55.94 + 134.050 6517.00 6431.34 85.66 + 134.100 6577.00 6434.32 142.68 + 134.150 6362.00 6438.87 -76.87 + 134.200 6487.00 6447.14 39.86 + 134.250 6584.00 6463.57 120.43 + 134.300 6681.00 6496.12 184.88 + 134.350 6602.00 6557.37 44.63 + 134.400 6444.00 6664.23 -220.23 + 134.450 6826.00 6835.20 -9.20 + 134.500 6942.00 7083.96 -141.96 + 134.550 7325.00 7410.89 -85.89 + 134.600 7718.00 7795.11 -77.11 + 134.650 8028.00 8191.66 -163.66 + 134.700 8417.00 8537.88 -120.88 + 134.750 8686.00 8767.77 -81.77 + 134.800 8725.00 8832.39 -107.39 + 134.850 8653.00 8716.82 -63.82 + 134.900 8453.00 8446.35 6.65 + 134.950 8104.00 8077.65 26.35 + 135.000 7474.00 7679.97 -205.97 + 135.050 7265.00 7313.62 -48.62 + 135.100 7077.00 7016.24 60.76 + 135.150 7031.00 6800.09 230.91 + 135.200 6914.00 6657.96 256.04 + 135.250 6648.00 6573.12 74.88 + 135.300 6571.00 6527.18 43.82 + 135.350 6498.00 6504.86 -6.86 + 135.400 6505.00 6495.53 9.47 + 135.450 6583.00 6492.70 90.30 + 135.500 6699.00 6492.83 206.17 + 135.550 6490.00 6494.21 -4.21 + 135.600 6515.00 6496.07 18.93 + 135.650 6460.00 6498.10 -38.10 + 135.700 6302.00 6500.19 -198.19 + 135.750 6581.00 6502.33 78.67 + 135.800 6550.00 6504.25 45.75 + 135.850 6440.00 6504.62 -64.62 + 135.900 6491.00 6505.57 -14.57 + 135.950 6517.00 6507.80 9.20 + 136.000 6643.00 6512.66 130.34 + 136.050 6559.00 6522.41 36.59 + 136.100 6508.00 6540.38 -32.38 + 136.150 6614.00 6570.74 43.26 + 136.200 6665.00 6617.66 47.34 + 136.250 6545.00 6683.69 -138.69 + 136.300 6411.00 6767.89 -356.89 + 136.350 6574.00 6864.23 -290.23 + 136.400 6951.00 6961.33 -10.33 + 136.450 7127.00 7044.22 82.78 + 136.500 7091.00 7097.72 -6.72 + 136.550 7273.00 7110.95 162.05 + 136.600 7113.00 7080.92 32.08 + 136.650 7046.00 7013.71 32.29 + 136.700 6852.00 6922.44 -70.44 + 136.750 6829.00 6823.23 5.77 + 136.800 6907.00 6730.42 176.58 + 136.850 6695.00 6653.41 41.59 + 136.900 6619.00 6595.82 23.18 + 136.950 6447.00 6556.59 -109.59 + 137.000 6527.00 6532.09 -5.09 + 137.050 6737.00 6518.01 218.99 + 137.100 6590.00 6510.53 79.47 + 137.150 6502.00 6506.86 -4.86 + 137.200 6411.00 6505.18 -94.18 + 137.250 6576.00 6504.48 71.52 + 137.300 6492.00 6504.20 -12.20 + 137.350 6502.00 6504.11 -2.11 + 137.400 6534.00 6504.08 29.92 + 137.450 6517.00 6504.06 12.94 + 137.500 6394.00 6504.06 -110.06 + 137.550 6448.00 6504.06 -56.06 + 137.600 6428.00 6504.06 -76.06 + 137.650 6468.00 6504.06 -36.06 + 137.700 6534.00 6504.06 29.94 + 137.750 6437.00 6504.06 -67.06 + 137.800 6612.00 6504.06 107.94 + 137.850 6651.00 6504.06 146.94 + 137.900 6763.00 6504.06 258.94 + 137.950 6939.00 6504.06 434.94 + 138.000 6760.00 6504.06 255.94 + 138.050 6941.00 6504.06 436.94 + 138.100 7126.00 6504.06 621.94 + 138.150 7620.00 6504.06 1115.94 + 138.200 7948.00 6504.06 1443.94 + 138.250 8294.00 6504.06 1789.94 + 138.300 8389.00 6504.06 1884.94 + 138.350 8337.00 6504.06 1832.94 + 138.400 8080.00 6504.06 1575.94 + 138.450 7754.00 6504.06 1249.94 + 138.500 7603.00 6504.06 1098.94 + 138.550 7338.00 6504.06 833.94 + 138.600 7185.00 6504.06 680.94 + 138.650 7035.00 6504.06 530.94 + 138.700 6965.00 6504.06 460.94 + 138.750 6758.00 6504.06 253.94 + 138.800 6551.00 6504.06 46.94 + 138.850 6685.00 6504.06 180.94 + 138.900 6550.00 6504.06 45.94 + 138.950 6613.00 6504.06 108.94 + 139.000 6636.00 6504.06 131.94 + 139.050 6523.00 6504.06 18.94 + 139.100 6567.00 6504.06 62.94 + 139.150 6474.00 6504.06 -30.06 + 139.200 6476.00 6504.06 -28.06 + 139.250 6652.00 6504.06 147.94 + 139.300 6503.00 6504.06 -1.06 + 139.350 6367.00 6504.06 -137.06 + 139.400 6445.00 6504.06 -59.06 + 139.450 6442.00 6504.06 -62.06 + 139.500 6534.00 6504.06 29.94 + 139.550 6618.00 6504.06 113.94 + 139.600 6529.00 6504.06 24.94 + 139.650 6539.00 6504.06 34.94 + 139.700 6537.00 6504.06 32.94 + 139.750 6521.00 6504.06 16.94 + 139.800 6689.00 6504.06 184.94 + 139.850 6539.00 6504.06 34.94 + 139.900 6792.00 6504.06 287.94 + 139.950 6749.00 6504.06 244.94 + 140.000 6886.00 6504.06 381.94 + 140.050 7209.00 6504.06 704.94 + 140.100 7357.00 6504.06 852.94 + 140.150 7393.00 6504.06 888.94 + 140.200 7689.00 6504.06 1184.94 + 140.250 7460.00 6504.06 955.94 + 140.300 7349.00 6504.06 844.94 + 140.350 7210.00 6504.06 705.94 + 140.400 7046.00 6504.06 541.94 + 140.450 6680.00 6504.06 175.94 + 140.500 6664.00 6504.06 159.94 + 140.550 6535.00 6504.06 30.94 + 140.600 6666.00 6504.06 161.94 + 140.650 6603.00 6504.06 98.94 + 140.700 6588.00 6504.06 83.94 + 140.750 6416.00 6504.06 -88.06 + 140.800 6555.00 6504.06 50.94 + 140.850 6546.00 6504.06 41.94 + 140.900 6510.00 6504.06 5.94 + 140.950 6699.00 6504.06 194.94 + 141.000 6477.00 6504.06 -27.06 + 141.050 6512.00 6504.06 7.94 + 141.100 6791.00 6504.06 286.94 + 141.150 6519.00 6504.06 14.94 + 141.200 6429.00 6504.06 -75.06 + 141.250 6380.00 6504.06 -124.06 + 141.300 6456.00 6504.06 -48.06 + 141.350 6484.00 6504.06 -20.06 + 141.400 6452.00 6504.06 -52.06 + 141.450 6517.00 6504.06 12.94 + 141.500 6579.00 6504.06 74.94 + 141.550 6565.00 6504.06 60.94 + 141.600 6724.00 6504.06 219.94 + 141.650 6780.00 6504.06 275.94 + 141.700 6622.00 6504.06 117.94 + 141.750 6699.00 6504.06 194.94 + 141.800 6784.00 6504.06 279.94 + 141.850 6603.00 6504.06 98.94 + 141.900 6768.00 6504.06 263.94 + 141.950 7209.00 6504.06 704.94 + 142.000 7441.00 6504.06 936.94 + 142.050 7739.00 6504.06 1234.94 + 142.100 7706.00 6504.06 1201.94 + 142.150 7905.00 6504.06 1400.94 + 142.200 7814.00 6504.06 1309.94 + 142.250 7631.00 6504.06 1126.94 + 142.300 7485.00 6504.06 980.94 + 142.350 7238.00 6504.06 733.94 + 142.400 6982.00 6504.06 477.94 + 142.450 6814.00 6504.06 309.94 + 142.500 6730.00 6504.06 225.94 + 142.550 6697.00 6504.06 192.94 + 142.600 6570.00 6504.06 65.94 + 142.650 6593.00 6504.06 88.94 + 142.700 6499.00 6504.06 -5.06 + 142.750 6430.00 6504.06 -74.06 + 142.800 6475.00 6504.06 -29.06 + 142.850 6471.00 6504.06 -33.06 + 142.900 6477.00 6504.06 -27.06 + 142.950 6251.00 6504.06 -253.06 + 143.000 6333.00 6504.06 -171.06 + 143.050 6441.00 6504.06 -63.06 + 143.100 6236.00 6504.06 -268.06 + 143.150 6382.00 6504.06 -122.06 + 143.200 6296.00 6504.06 -208.06 + 143.250 6279.00 6504.06 -225.06 + 143.300 6372.00 6504.06 -132.06 + 143.350 6543.00 6504.06 38.94 + 143.400 6355.00 6504.06 -149.06 + 143.450 6362.00 6504.06 -142.06 + 143.500 6326.00 6504.06 -178.06 + 143.550 6404.00 6504.06 -100.06 + 143.600 6561.00 6504.06 56.94 + 143.650 6317.00 6504.06 -187.06 + 143.700 6604.00 6504.06 99.94 + 143.750 6606.00 6504.06 101.94 + 143.800 6568.00 6504.06 63.94 + 143.850 6555.00 6504.06 50.94 + 143.900 6607.00 6504.06 102.94 + 143.950 6770.00 6504.06 265.94 + 144.000 7197.00 6504.06 692.94 + 144.050 7449.00 6504.06 944.94 + 144.100 7713.00 6504.06 1208.94 + 144.150 7774.00 6504.06 1269.94 + 144.200 7823.00 6504.06 1318.94 + 144.250 7875.00 6504.06 1370.94 + 144.300 7642.00 6504.06 1137.94 + 144.350 7217.00 6504.06 712.94 + 144.400 7051.00 6504.06 546.94 + 144.450 6838.00 6504.06 333.94 + 144.500 6752.00 6504.06 247.94 + 144.550 6773.00 6504.06 268.94 + 144.600 6588.00 6504.06 83.94 + 144.650 6589.00 6504.06 84.94 + 144.700 6731.00 6504.06 226.94 + 144.750 6551.00 6504.06 46.94 + 144.800 6543.00 6504.06 38.94 + 144.850 6505.00 6504.06 0.94 + 144.900 6427.00 6504.06 -77.06 + 144.950 6393.00 6504.06 -111.06 + 145.000 6274.00 6504.06 -230.06 + 145.050 6491.00 6504.06 -13.06 + 145.100 6351.00 6504.06 -153.06 + 145.150 6319.00 6504.06 -185.06 + 145.200 6449.00 6504.06 -55.06 + 145.250 6504.00 6504.06 -0.06 + 145.300 6509.00 6504.06 4.94 + 145.350 6336.00 6504.06 -168.06 + 145.400 6337.00 6504.06 -167.06 + 145.450 6299.00 6504.06 -205.06 + 145.500 6386.00 6504.06 -118.06 + 145.550 6443.00 6504.06 -61.06 + 145.600 6386.00 6504.06 -118.06 + 145.650 6313.00 6504.06 -191.06 + 145.700 6355.00 6504.06 -149.06 + 145.750 6496.00 6504.06 -8.06 + 145.800 6514.00 6504.06 9.94 + 145.850 6493.00 6504.06 -11.06 + 145.900 6675.00 6504.06 170.94 + 145.950 6528.00 6504.06 23.94 + 146.000 6698.00 6504.06 193.94 + 146.050 6855.00 6504.06 350.94 + 146.100 7096.00 6504.06 591.94 + 146.150 7087.00 6504.06 582.94 + 146.200 7224.00 6504.06 719.94 + 146.250 7208.00 6504.06 703.94 + 146.300 7485.00 6504.06 980.94 + 146.350 7495.00 6504.06 990.94 + 146.400 7232.00 6504.06 727.94 + 146.450 7222.00 6504.06 717.94 + 146.500 6971.00 6504.06 466.94 + 146.550 7041.00 6504.06 536.94 + 146.600 7037.00 6504.06 532.94 + 146.650 6863.00 6504.06 358.94 + 146.700 6623.00 6504.06 118.94 + 146.750 6508.00 6504.06 3.94 + 146.800 6501.00 6504.06 -3.06 + 146.850 6656.00 6504.06 151.94 + 146.900 6588.00 6504.06 83.94 + 146.950 6453.00 6504.06 -51.06 + 147.000 6718.00 6504.06 213.94 + 147.050 6455.00 6504.06 -49.06 + 147.100 6609.00 6504.06 104.94 + 147.150 6406.00 6504.06 -98.06 + 147.200 6352.00 6504.06 -152.06 + 147.250 6531.00 6504.06 26.94 + 147.300 6519.00 6504.06 14.94 + 147.350 6472.00 6504.06 -32.06 + 147.400 6564.00 6504.06 59.94 + 147.450 6490.00 6504.06 -14.06 + 147.500 6487.00 6504.06 -17.06 + 147.550 6638.00 6504.06 133.94 + 147.600 6512.00 6504.06 7.94 + 147.650 6457.00 6504.06 -47.06 + 147.700 6715.00 6504.06 210.94 + 147.750 6515.00 6504.06 10.94 + 147.800 6571.00 6504.06 66.94 + 147.850 6513.00 6504.06 8.94 + 147.900 6480.00 6504.06 -24.06 + 147.950 6705.00 6504.06 200.94 + 148.000 6869.00 6504.06 364.94 + 148.050 6529.00 6504.06 24.94 + 148.100 6458.00 6504.06 -46.06 + 148.150 6753.00 6504.06 248.94 + 148.200 6695.00 6504.06 190.94 + 148.250 6819.00 6504.06 314.94 + 148.300 7304.00 6504.06 799.94 + 148.350 7381.00 6504.06 876.94 + 148.400 7626.00 6504.06 1121.94 + 148.450 7868.00 6504.06 1363.94 + 148.500 8659.00 6504.06 2154.94 + 148.550 8605.00 6504.06 2100.94 + 148.600 8547.00 6504.06 2042.94 + 148.650 8336.00 6504.06 1831.94 + 148.700 8030.00 6504.06 1525.94 + 148.750 7981.00 6504.06 1476.94 + 148.800 7759.00 6504.06 1254.94 + 148.850 7409.00 6504.06 904.94 + 148.900 7227.00 6504.06 722.94 + 148.950 7015.00 6504.06 510.94 + 149.000 6965.00 6504.06 460.94 + 149.050 6635.00 6504.06 130.94 + 149.100 6689.00 6504.06 184.94 + 149.150 6890.00 6504.06 385.94 + 149.200 6691.00 6504.06 186.94 + 149.250 6548.00 6504.06 43.94 + 149.300 6539.00 6504.06 34.94 + 149.350 6554.00 6504.06 49.94 + 149.400 6463.00 6504.06 -41.06 + 149.450 6488.00 6504.06 -16.06 + 149.500 6756.00 6504.06 251.94 + 149.550 6576.00 6504.06 71.94 + 149.600 6391.00 6504.06 -113.06 + 149.650 6505.00 6504.06 0.94 + 149.700 6566.00 6504.06 61.94 + 149.750 6260.00 6504.06 -244.06 + 149.800 6381.00 6504.06 -123.06 + 149.850 6520.00 6504.06 15.94 + 149.900 6558.00 6504.06 53.94 + 149.950 6697.00 6504.06 192.94 + 150.000 6788.00 6504.06 283.94 + 150.050 6412.00 6504.06 -92.06 + 150.100 6473.00 6504.06 -31.06 + 150.150 6363.00 6504.06 -141.06 + 150.200 6632.00 6504.06 127.94 + 150.250 6764.00 6504.06 259.94 + 150.300 6713.00 6504.06 208.94 + 150.350 6691.00 6504.06 186.94 + 150.400 6661.00 6504.06 156.94 + 150.450 6554.00 6504.06 49.94 + 150.500 6497.00 6504.06 -7.06 + 150.550 6647.00 6504.06 142.94 + 150.600 6671.00 6504.06 166.94 + 150.650 6595.00 6504.06 90.94 + 150.700 6593.00 6504.06 88.94 + 150.750 6638.00 6504.06 133.94 + 150.800 6650.00 6504.06 145.94 + 150.850 6836.00 6504.06 331.94 + 150.900 6633.00 6504.06 128.94 + 150.950 6726.00 6504.06 221.94 + 151.000 6689.00 6504.06 184.94 + 151.050 6790.00 6504.06 285.94 + 151.100 6761.00 6504.06 256.94 + 151.150 6789.00 6504.06 284.94 + 151.200 6827.00 6504.06 322.94 + 151.250 6667.00 6504.06 162.94 + 151.300 6881.00 6504.06 376.94 + 151.350 6659.00 6504.06 154.94 + 151.400 6646.00 6504.06 141.94 + 151.450 6577.00 6504.06 72.94 + 151.500 6651.00 6504.06 146.94 + 151.550 6551.00 6504.06 46.94 + 151.600 6525.00 6504.06 20.94 + 151.650 6628.00 6504.06 123.94 + 151.700 6678.00 6504.06 173.94 + 151.750 6655.00 6504.06 150.94 + 151.800 6469.00 6504.06 -35.06 + 151.850 6666.00 6504.06 161.94 + 151.900 6713.00 6504.06 208.94 + 151.950 6819.00 6504.06 314.94 + 152.000 6740.00 6504.06 235.94 + 152.050 6659.00 6504.06 154.94 + 152.100 6779.00 6504.06 274.94 + 152.150 6743.00 6504.06 238.94 + 152.200 6780.00 6504.06 275.94 + 152.250 6602.00 6504.06 97.94 + 152.300 6468.00 6504.06 -36.06 + 152.350 6696.00 6504.06 191.94 + 152.400 6626.00 6504.06 121.94 + 152.450 6430.00 6504.06 -74.06 + 152.500 6386.00 6504.06 -118.06 + 152.550 6744.00 6504.06 239.94 + 152.600 6804.00 6504.06 299.94 + 152.650 6396.00 6504.06 -108.06 + 152.700 6407.00 6504.06 -97.06 + 152.750 6616.00 6504.06 111.94 + 152.800 6652.00 6504.06 147.94 + 152.850 6924.00 6504.06 419.94 + 152.900 6779.00 6504.06 274.94 + 152.950 6637.00 6504.06 132.94 + 153.000 6719.00 6504.06 214.94 + 153.050 6591.00 6504.06 86.94 + 153.100 6766.00 6504.06 261.94 + 153.150 6780.00 6504.06 275.94 + 153.200 6676.00 6504.06 171.94 + 153.250 6783.00 6504.06 278.94 + 153.300 6933.00 6504.06 428.94 + 153.350 6641.00 6504.06 136.94 + 153.400 6672.00 6504.06 167.94 + 153.450 6734.00 6504.06 229.94 + 153.500 6688.00 6504.06 183.94 + 153.550 6937.00 6504.06 432.94 + 153.600 7236.00 6504.06 731.94 + 153.650 7054.00 6504.06 549.94 + 153.700 7095.00 6504.06 590.94 + 153.750 7100.00 6504.06 595.94 + 153.800 6870.00 6504.06 365.94 + 153.850 6638.00 6504.06 133.94 + 153.900 6702.00 6504.06 197.94 +END +WAVES Phase1, tik1 +BEGIN + 16.772 -929 + 20.582 -929 + 23.812 -929 + 29.275 -929 + 31.682 -929 + 31.682 -929 + 33.934 -929 + 36.062 -929 + 38.087 -929 + 38.087 -929 + 40.024 -929 + 41.886 -929 + 43.683 -929 + 43.683 -929 + 47.113 -929 + 47.113 -929 + 48.757 -929 + 50.361 -929 + 51.929 -929 + 51.929 -929 + 53.463 -929 + 53.463 -929 + 53.463 -929 + 54.968 -929 + 54.968 -929 + 56.446 -929 + 56.446 -929 + 57.898 -929 + 59.329 -929 + 59.329 -929 + 60.738 -929 + 62.128 -929 + 62.128 -929 + 63.500 -929 + 63.500 -929 + 64.856 -929 + 64.856 -929 + 64.856 -929 + 64.856 -929 + 66.198 -929 + 66.198 -929 + 70.144 -929 + 70.144 -929 + 70.144 -929 + 70.144 -929 + 71.437 -929 + 72.720 -929 + 72.720 -929 + 72.720 -929 + 72.720 -929 + 73.994 -929 + 73.994 -929 + 73.994 -929 + 75.260 -929 + 75.260 -929 + 76.519 -929 + 76.519 -929 + 77.772 -929 + 77.772 -929 + 77.772 -929 + 77.772 -929 + 79.018 -929 + 80.259 -929 + 80.259 -929 + 81.496 -929 + 81.496 -929 + 82.728 -929 + 83.958 -929 + 83.958 -929 + 85.184 -929 + 85.184 -929 + 85.184 -929 + 85.184 -929 + 85.184 -929 + 86.408 -929 + 87.631 -929 + 87.631 -929 + 87.631 -929 + 87.631 -929 + 90.074 -929 + 90.074 -929 + 90.074 -929 + 90.074 -929 + 91.295 -929 + 92.516 -929 + 92.516 -929 + 92.516 -929 + 92.516 -929 + 93.739 -929 + 93.739 -929 + 93.739 -929 + 94.964 -929 + 94.964 -929 + 96.191 -929 + 96.191 -929 + 96.191 -929 + 96.191 -929 + 97.420 -929 + 97.420 -929 + 98.653 -929 + 98.653 -929 + 99.891 -929 + 99.891 -929 + 99.891 -929 + 99.891 -929 + 99.891 -929 + 99.891 -929 + 102.380 -929 + 102.380 -929 + 102.380 -929 + 102.380 -929 + 103.633 -929 + 103.633 -929 + 103.633 -929 + 103.633 -929 + 104.893 -929 + 104.893 -929 + 104.893 -929 + 106.160 -929 + 106.160 -929 + 107.436 -929 + 107.436 -929 + 107.436 -929 + 107.436 -929 + 110.015 -929 + 110.015 -929 + 110.015 -929 + 110.015 -929 + 110.015 -929 + 110.015 -929 + 111.320 -929 + 113.966 -929 + 113.966 -929 + 115.310 -929 + 115.310 -929 + 115.310 -929 + 115.310 -929 + 115.310 -929 + 115.310 -929 + 115.310 -929 + 116.668 -929 + 116.668 -929 + 116.668 -929 + 118.043 -929 + 118.043 -929 + 118.043 -929 + 118.043 -929 + 119.436 -929 + 119.436 -929 + 120.848 -929 + 120.848 -929 + 122.281 -929 + 122.281 -929 + 123.738 -929 + 123.738 -929 + 123.738 -929 + 123.738 -929 + 123.738 -929 + 123.738 -929 + 123.738 -929 + 125.219 -929 + 125.219 -929 + 126.728 -929 + 126.728 -929 + 126.728 -929 + 126.728 -929 + 126.728 -929 + 128.268 -929 + 128.268 -929 + 128.268 -929 + 129.840 -929 + 129.840 -929 + 129.840 -929 + 129.840 -929 + 133.101 -929 + 133.101 -929 + 133.101 -929 + 133.101 -929 + 134.797 -929 + 134.797 -929 + 136.545 -929 + 136.545 -929 + 136.545 -929 + 136.545 -929 + 138.351 -929 + 138.351 -929 + 138.351 -929 + 138.351 -929 + 138.351 -929 + 140.224 -929 + 140.224 -929 + 140.224 -929 + 140.224 -929 + 140.224 -929 + 142.173 -929 + 142.173 -929 + 144.212 -929 + 144.212 -929 + 144.212 -929 + 144.212 -929 + 146.357 -929 + 148.630 -929 + 148.630 -929 + 148.630 -929 + 148.630 -929 + 148.630 -929 + 148.630 -929 + 151.062 -929 + 153.697 -929 + 153.697 -929 + 153.697 -929 + 156.604 -929 + 156.604 -929 + 156.604 -929 + 156.604 -929 + 159.903 -929 + 159.903 -929 + 159.903 -929 + 159.903 -929 + 159.903 -929 + 159.903 -929 + 163.830 -929 + 163.830 -929 + 169.044 -929 + 169.044 -929 + 169.044 -929 + 169.044 -929 + 169.044 -929 + 169.044 -929 +END +WAVES Excrg1, excl1 +BEGIN + 0.95 -929 + 12.00 -929 +END +WAVES Excrg2, excl2 +BEGIN + 137.50 -929 + 153.90 -929 +END +X Silent 1 +X DefaultFont Times +X Display Iobs, Icalc, Diff vs TwoTheta +X Modify mode(Iobs)=2, rgb(Iobs)=(0,0,0), rgb(Diff)=(3800,44400,4000) +X SetAxis bottom 0.95, 153.90 +X Modify lsize(Iobs)=2 +X Modify offset(Diff)={0, -3315} +X Modify wbRGB=(48483,64909,65535), gbRGB=(64612,65535,49415) +X Modify mirror(left)=2, mirror(bottom)=2 +X Modify gfSize=12 +X Append excl1 vs Excrg1 +X Modify mode(excl1)=7, hbFill(excl1)=4 +X Modify rgb(excl1)=(6421,62320,64794) +X Append excl2 vs Excrg2 +X Modify mode(excl2)=7, hbFill(excl2)=4 +X Modify rgb(excl2)=(6421,62320,64794) +X Append tik1 vs Phase1 +X Modify mode(tik1)=1 +X TextBox /F=2/S=3/A=RT "Files: y2o3\rDate of fit: \Z09 16/06/2026/ 17:50:46.1\Z12\rY2O3\rChi2 = 1.26" +X Label left "\Z14Intensity" +X Label bottom "\Z142-Theta (in degrees)" +X TileWindows/O=1/C +X ShowInfo +X | Title of data set: Y2O3 Ge(551) 300mm_varH 15/10/13 +X | Date of run: 16/06/2026 / 17:50:46.1 +X Beep +X Beep diff --git a/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.sum b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.sum new file mode 100644 index 000000000..386993457 --- /dev/null +++ b/docs/docs/verification/fullprof/pd-neut-cwl_pv-beta_y2o3/y2o3.sum @@ -0,0 +1,249 @@ + + + ********************************************************** + ** PROGRAM FullProf.2k (Version 8.40 - Feb2026-ILL JRC) ** + ********************************************************** + M U L T I -- P A T T E R N + Rietveld, Profile Matching & Integrated Intensity + Refinement of X-ray and/or Neutron Data + + + Date: 16/06/2026 Time: 17:50:46.024 + + => PCR file code: y2o3 + => DAT file code: y2o3 -> Relative contribution: 1.0000 + => Title: Y2O3 Ge(551) 300mm_varH 15/10/13 + + ==> CONDITIONS OF THIS RUN FOR PATTERN No.: 1 + + => Global Refinement of neutron powder data + => The 7th default profile function was selected + + => X-Y type of data: 2theta/TOF/E(Kev) Intens sigma for pattern: 1 + => Analysis of refinement at the end + => Wavelengths: 1.54822 1.54822 + => Cos(Monochromator angle)= 0.0000 + => Absorption correction (AC), muR-eff = 1.5000 0.0000 + => AC : Cylinder Debye-Scherrer (Hewat formula) + => Base of peaks: 2.0*HW* 20.00 + ==> Angular range, step and number of points: + 2Thmin: 0.950000 2Thmax: 153.899994 Step: 0.050019 No. of points: 3060 + =>-------> Pattern# 1 + => Crystal Structure Refinement for phase: 1 + => The density (volumic mass) of phase 1 is: 5.029 g/cm3 + => Scor: 1.5035 + + ==> RESULTS OF REFINEMENT: + + + => No. of fitted parameters: 0 + + +------------------------------------------------------------------------------ + => Phase No. 1 Y2O3 I a -3 +------------------------------------------------------------------------------ + + => No. of reflections for pattern#: 1: 229 + + + ==> ATOM PARAMETERS: + + Name x sx y sy z sz B sB occ. socc. Mult + Y1 -0.03236( 0) 0.00000( 0) 0.25000( 0) 0.000( 0) 0.500( 0) 24 + Y2 0.25000( 0) 0.25000( 0) 0.25000( 0) 0.000( 0) 0.167( 0) 8 + O1 0.39072( 0) 0.15204( 0) 0.38030( 0) 0.000( 0) 1.000( 0) 48 + + => Anisotropic Betas*1E04 + + Name B11 B22 B33 B12 B13 B23 + sB11 sB22 sB33 sB12 sB13 sB23 + + Y1 30.3 27.2 29.5 0.0 0.0 -2.5 + 0.0 0.0 0.0 0.0 0.0 0.0 + Y2 30.4 30.4 30.4 -1.3 -1.3 -1.3 + 0.0 0.0 0.0 0.0 0.0 0.0 + O1 29.9 31.0 27.3 -0.7 -2.0 -0.1 + 0.0 0.0 0.0 0.0 0.0 0.0 + + ==> PROFILE PARAMETERS FOR PATTERN# 1 + + => Cell parameters : + 10.60574 0.00000 + 10.60574 0.00000 + 10.60574 0.00000 + 90.00000 0.00000 + 90.00000 0.00000 + 90.00000 0.00000 + + => overall scale factor : 1.060200 0.000000 + => Eta(p-v) or m(p-vii) : 0.00000 0.00000 + => Overall tem. factor : 0.00000 0.00000 + => Halfwidth parameters : 0.03663 0.00000 + -0.06835 0.00000 + 0.13143 0.00000 + => Preferred orientation: 0.00000 0.00000 + 0.00000 0.00000 + => Asymmetry parameters : 0.17694 0.00000 + 0.03411 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 + => X and y parameters : 0.00000 0.00000 + 0.00000 0.00000 + => Strain parameters : 0.00000 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 + => Size parameters (G,L): 0.00000 0.00000 + 0.00000 0.00000 + + => Add. shape parameters: + 0.00000 0.00000 + 0.00000 0.00000 + + + + ==> GLOBAL PARAMETERS FOR PATTERN# 1 + + + => Zero-point: -0.0162 0.0000 + => Cos(2theta)-shift parameter : 0.0000 0.0000 + => Sin(2theta)-shift parameter : 0.0000 0.0000 + + ==> RELIABILITY FACTORS WITH ALL NON-EXCLUDED POINTS FOR PATTERN: 1 + + => Cycle: 1 => MaxCycle: 1 + => N-P+C: 2509 + => R-factors (not corrected for background) for Pattern: 1 + => Rp: 1.15 Rwp: 1.39 Rexp: 1.24 Chi2: 1.26 L.S. refinement + => Conventional Rietveld R-factors for Pattern: 1 + => Rp: 21.5 Rwp: 10.8 Rexp: 9.60 Chi2: 1.26 + => Deviance: 0.401E+04 Dev* : 1.599 + => DW-Stat.: 1.1897 DW-exp: 1.8759 + => N-sigma of the GoF: 9.306 + + ==> RELIABILITY FACTORS FOR POINTS WITH BRAGG CONTRIBUTIONS FOR PATTERN: 1 + + => N-P+C: 2509 + => R-factors (not corrected for background) for Pattern: 1 + => Rp: 1.15 Rwp: 1.39 Rexp: 1.24 Chi2: 1.26 L.S. refinement + => Conventional Rietveld R-factors for Pattern: 1 + => Rp: 21.5 Rwp: 10.8 Rexp: 9.60 Chi2: 1.26 + => Deviance: 0.401E+04 Dev* : 1.599 + => DW-Stat.: 1.1897 DW-exp: 1.8759 + => N-sigma of the GoF: 9.306 + + => Global user-weigthed Chi2 (Bragg contrib.): 1.26 + => Scor: 1.5035 + + ==> RESULTS OF REFINEMENT: + + + => No. of fitted parameters: 0 + + +------------------------------------------------------------------------------ + => Phase No. 1 Y2O3 I a -3 +------------------------------------------------------------------------------ + + => No. of reflections for pattern#: 1: 229 + + + ==> ATOM PARAMETERS: + + Name x sx y sy z sz B sB occ. socc. Mult + Y1 -0.03236( 0) 0.00000( 0) 0.25000( 0) 0.000( 0) 0.500( 0) 24 + Y2 0.25000( 0) 0.25000( 0) 0.25000( 0) 0.000( 0) 0.167( 0) 8 + O1 0.39072( 0) 0.15204( 0) 0.38030( 0) 0.000( 0) 1.000( 0) 48 + + => Anisotropic Betas*1E04 + + Name B11 B22 B33 B12 B13 B23 + sB11 sB22 sB33 sB12 sB13 sB23 + + Y1 30.3 27.2 29.5 0.0 0.0 -2.5 + 0.0 0.0 0.0 0.0 0.0 0.0 + Y2 30.4 30.4 30.4 -1.3 -1.3 -1.3 + 0.0 0.0 0.0 0.0 0.0 0.0 + O1 29.9 31.0 27.3 -0.7 -2.0 -0.1 + 0.0 0.0 0.0 0.0 0.0 0.0 + + ==> PROFILE PARAMETERS FOR PATTERN# 1 + + => Cell parameters : + 10.60574 0.00000 + 10.60574 0.00000 + 10.60574 0.00000 + 90.00000 0.00000 + 90.00000 0.00000 + 90.00000 0.00000 + + => overall scale factor : 1.060200 0.000000 + => Eta(p-v) or m(p-vii) : 0.00000 0.00000 + => Overall tem. factor : 0.00000 0.00000 + => Halfwidth parameters : 0.03663 0.00000 + -0.06835 0.00000 + 0.13143 0.00000 + => Preferred orientation: 0.00000 0.00000 + 0.00000 0.00000 + => Asymmetry parameters : 0.17694 0.00000 + 0.03411 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 + => X and y parameters : 0.00000 0.00000 + 0.00000 0.00000 + => Strain parameters : 0.00000 0.00000 + 0.00000 0.00000 + 0.00000 0.00000 + => Size parameters (G,L): 0.00000 0.00000 + 0.00000 0.00000 + + => Add. shape parameters: + 0.00000 0.00000 + 0.00000 0.00000 + + + + ==> GLOBAL PARAMETERS FOR PATTERN# 1 + + + => Zero-point: -0.0162 0.0000 + => Cos(2theta)-shift parameter : 0.0000 0.0000 + => Sin(2theta)-shift parameter : 0.0000 0.0000 + + ==> RELIABILITY FACTORS WITH ALL NON-EXCLUDED POINTS FOR PATTERN: 1 + + => Cycle: 1 => MaxCycle: 1 + => N-P+C: 2509 + => R-factors (not corrected for background) for Pattern: 1 + => Rp: 1.15 Rwp: 1.39 Rexp: 1.24 Chi2: 1.26 L.S. refinement + => Conventional Rietveld R-factors for Pattern: 1 + => Rp: 21.5 Rwp: 10.8 Rexp: 9.60 Chi2: 1.26 + => Deviance: 0.401E+04 Dev* : 1.599 + => DW-Stat.: 1.1897 DW-exp: 1.8759 + => N-sigma of the GoF: 9.306 + + ==> RELIABILITY FACTORS FOR POINTS WITH BRAGG CONTRIBUTIONS FOR PATTERN: 1 + + => N-P+C: 2509 + => R-factors (not corrected for background) for Pattern: 1 + => Rp: 1.15 Rwp: 1.39 Rexp: 1.24 Chi2: 1.26 L.S. refinement + => Conventional Rietveld R-factors for Pattern: 1 + => Rp: 21.5 Rwp: 10.8 Rexp: 9.60 Chi2: 1.26 + => Deviance: 0.401E+04 Dev* : 1.599 + => DW-Stat.: 1.1897 DW-exp: 1.8759 + => N-sigma of the GoF: 9.306 + + => Global user-weigthed Chi2 (Bragg contrib.): 1.26 + + ----------------------------------------------------- + BRAGG R-Factors and weight fractions for Pattern # 1 + ----------------------------------------------------- + + => Phase: 1 Y2O3 + => Bragg R-factor: 3.80 Vol: 1192.953( 0.000) Fract(%): 100.00( 0.00) + => Rf-factor= 3.74 ATZ: 3612.974 Brindley: 1.0000 + + + CPU Time: 0.156 seconds + 0.003 minutes + + => Run finished at: Date: 16/06/2026 Time: 17:50:46.180 diff --git a/docs/docs/verification/index.md b/docs/docs/verification/index.md index a308d3ed4..dd7bb370b 100644 --- a/docs/docs/verification/index.md +++ b/docs/docs/verification/index.md @@ -44,11 +44,11 @@ and so on. The list below notes only what is specific to each page. reciprocal, non-normalised texture convention. - [PbSO₄ `pd-neut-cwl` (pseudo-Voigt)](pd-neut-cwl_pv_pbso4.ipynb) – Anglesite (PbSO₄, _Pnma_); pseudo-Voigt, no asymmetry. -- [PbSO₄ `pd-neut-cwl` (empirical asymmetry)](pd-neut-cwl_pv-asym_empir_pbso4.ipynb) - – Anglesite (PbSO₄, _Pnma_); pseudo-Voigt with empirical - (FullProf-style) axial-divergence asymmetry. Skipped in CI: cryspy and - FullProf parameterise the empirical asymmetry differently, and crysfml - has no empirical-asymmetry model. +- [PbSO₄ `pd-neut-cwl` (Bérar–Baldinozzi asymmetry)](pd-neut-cwl_pv-beba_pbso4.ipynb) + – Anglesite (PbSO₄, _Pnma_); pseudo-Voigt with Bérar–Baldinozzi + (FullProf-style) axial-divergence asymmetry (`asym_beba_*`). Skipped + in CI: cryspy and FullProf implement this asymmetry with different + conventions (issue 166), and crysfml has no empirical-asymmetry model. - [LaB₆ `pd-neut-cwl` (SyCos/SySin)](pd-neut-cwl_tch-fcj-noabs-nosldl_lab6.ipynb) – Lanthanum hexaboride (LaB₆, _Pm-3m_); pseudo-Voigt with SyCos/SySin sample-displacement and transparency corrections. Skipped in CI: @@ -66,6 +66,15 @@ and so on. The list below notes only what is specific to each page. absorption (μR = 0.7) with FCJ asymmetry switched off, isolating the absorption correction. ed-cryspy matches FullProf (enabling the correction removes a ≈ 2.9× intensity mismatch). +- [Y₂O₃ `pd-neut-cwl` (anisotropic β-tensor ADPs)](pd-neut-cwl_pv-beta_y2o3.ipynb) + – Yttria (Y₂O₃, bixbyite, _Ia-3_); dimensionless β-tensor anisotropic + ADPs (`adp_type='beta'`) on the three sites, with cylindrical + Debye–Scherrer absorption (μR = 1.5) and the Thompson–Cox–Hastings + profile. cryspy only. Refining every parameter recovers the FullProf + values; the Bérar–Baldinozzi asymmetry (`asym_beba_*`) is implemented + with different conventions in cryspy and FullProf (issue 166), so + those coefficients do not transfer one-to-one, but all closeness + metrics stay within tolerance. ## Powder, neutron, time-of-flight diff --git a/docs/docs/verification/pd-neut-cwl_pv-asym_empir_pbso4.ipynb b/docs/docs/verification/pd-neut-cwl_pv-beba_pbso4.ipynb similarity index 85% rename from docs/docs/verification/pd-neut-cwl_pv-asym_empir_pbso4.ipynb rename to docs/docs/verification/pd-neut-cwl_pv-beba_pbso4.ipynb index 4822c611e..697bf539f 100644 --- a/docs/docs/verification/pd-neut-cwl_pv-asym_empir_pbso4.ipynb +++ b/docs/docs/verification/pd-neut-cwl_pv-beba_pbso4.ipynb @@ -24,7 +24,16 @@ "id": "1", "metadata": {}, "source": [ - "# PbSO₄ — neutron powder, constant wavelength, empirical asymmetry" + "# PbSO₄ — neutron powder, constant wavelength, Bérar–Baldinozzi asymmetry\n", + "\n", + "**Note — cryspy vs FullProf.** cryspy and FullProf implement the\n", + "Bérar–Baldinozzi empirical asymmetry with different conventions: an\n", + "overall sign and a coefficient inside the `F_b` term differ between the\n", + "two programs. As a result the four `asym_beba_*` parameters do **not**\n", + "transfer one-to-one between cryspy and FullProf — the same numbers give\n", + "different profiles. The refinement below frees the asymmetry so it can\n", + "absorb this convention difference; the structural results are\n", + "unaffected. See development issue 166 for the detailed comparison." ] }, { @@ -145,7 +154,7 @@ "metadata": {}, "outputs": [], "source": [ - "FULLPROF_PROJECT_DIR = 'pd-neut-cwl_pv-asym_empir_pbso4'\n", + "FULLPROF_PROJECT_DIR = 'pd-neut-cwl_pv-beba_pbso4'\n", "FULLPROF_PRF_FILE = 'pbso4.prf'\n", "FULLPROF_BAC_FILE = 'pbso4.bac'\n", "FULLPROF_ZERO = -0.08424 # FullProf Zero\n", @@ -204,8 +213,8 @@ "experiment.peak.broad_gauss_w = FULLPROF_W\n", "experiment.peak.broad_lorentz_x = FULLPROF_X\n", "experiment.peak.broad_lorentz_y = FULLPROF_Y\n", - "# The empirical-asymmetry coefficients (cryspy only) are set in the\n", - "# cryspy section below; crysfml has no empirical-asymmetry model.\n", + "# The Berar-Baldinozzi asymmetry coefficients (cryspy only) are set in\n", + "# the cryspy section below; crysfml has no empirical-asymmetry model.\n", "\n", "project.experiments.add(experiment)" ] @@ -225,16 +234,16 @@ "metadata": {}, "outputs": [], "source": [ - "experiment.peak.type = 'pseudo-voigt + empirical asymmetry'\n", + "experiment.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry'\n", "experiment.peak.broad_gauss_u = FULLPROF_U\n", "experiment.peak.broad_gauss_v = FULLPROF_V\n", "experiment.peak.broad_gauss_w = FULLPROF_W\n", "experiment.peak.broad_lorentz_x = FULLPROF_X\n", "experiment.peak.broad_lorentz_y = FULLPROF_Y\n", - "experiment.peak.asym_empir_1 = FULLPROF_ASY_1\n", - "experiment.peak.asym_empir_2 = FULLPROF_ASY_2\n", - "experiment.peak.asym_empir_3 = FULLPROF_ASY_3\n", - "experiment.peak.asym_empir_4 = FULLPROF_ASY_4\n", + "experiment.peak.asym_beba_a0 = FULLPROF_ASY_1\n", + "experiment.peak.asym_beba_b0 = FULLPROF_ASY_2\n", + "experiment.peak.asym_beba_a1 = FULLPROF_ASY_3\n", + "experiment.peak.asym_beba_b1 = FULLPROF_ASY_4\n", "\n", "experiment.calculator.type = 'cryspy'\n", "\n", @@ -265,17 +274,18 @@ "metadata": {}, "outputs": [], "source": [ - "# cryspy and FullProf parameterise the empirical asymmetry differently, so\n", - "# the FullProf coefficients do not transfer 1-to-1. Freeing cryspy's own\n", - "# coefficients recovers the FullProf profile, confirming the structure and\n", - "# the symmetric profile are correct.\n", + "# cryspy and FullProf implement the Berar-Baldinozzi asymmetry with\n", + "# different conventions, so the FullProf coefficients do not transfer\n", + "# 1-to-1. Freeing cryspy's own coefficients recovers the FullProf\n", + "# profile, confirming the structure and the symmetric profile are\n", + "# correct.\n", "experiment.calculator.type = 'cryspy'\n", "\n", "experiment.linked_structures['pbso4'].scale.free = True\n", - "experiment.peak.asym_empir_1.free = True\n", - "experiment.peak.asym_empir_2.free = True\n", - "experiment.peak.asym_empir_3.free = True\n", - "experiment.peak.asym_empir_4.free = True\n", + "experiment.peak.asym_beba_a0.free = True\n", + "experiment.peak.asym_beba_b0.free = True\n", + "experiment.peak.asym_beba_a1.free = True\n", + "experiment.peak.asym_beba_b1.free = True\n", "\n", "project.analysis.fit()\n", "project.display.fit.results()\n", diff --git a/docs/docs/verification/pd-neut-cwl_pv-asym_empir_pbso4.py b/docs/docs/verification/pd-neut-cwl_pv-beba_pbso4.py similarity index 68% rename from docs/docs/verification/pd-neut-cwl_pv-asym_empir_pbso4.py rename to docs/docs/verification/pd-neut-cwl_pv-beba_pbso4.py index d04f04526..52088c518 100644 --- a/docs/docs/verification/pd-neut-cwl_pv-asym_empir_pbso4.py +++ b/docs/docs/verification/pd-neut-cwl_pv-beba_pbso4.py @@ -1,5 +1,16 @@ # %% [markdown] -# # PbSO₄ — neutron powder, constant wavelength, empirical asymmetry +# # PbSO₄ — neutron powder, constant wavelength, Bérar–Baldinozzi asymmetry +# +# **Note — cryspy vs FullProf.** +# +# cryspy and FullProf implement the +# Bérar–Baldinozzi empirical asymmetry with different conventions: an +# overall sign and a coefficient inside the `F_b` term differ between the +# two software. As a result the four `asym_beba_*` parameters do **not** +# transfer one-to-one between cryspy and FullProf — the same numbers give +# different profiles. The refinement below frees the asymmetry so it can +# absorb this convention difference; the structural results are +# unaffected. # %% import easydiffraction as edi @@ -77,7 +88,7 @@ # ## Load the FullProf reference # %% -FULLPROF_PROJECT_DIR = 'pd-neut-cwl_pv-asym_empir_pbso4' +FULLPROF_PROJECT_DIR = 'pd-neut-cwl_pv-beba_pbso4' FULLPROF_PRF_FILE = 'pbso4.prf' FULLPROF_BAC_FILE = 'pbso4.bac' FULLPROF_ZERO = -0.08424 # FullProf Zero @@ -124,8 +135,8 @@ experiment.peak.broad_gauss_w = FULLPROF_W experiment.peak.broad_lorentz_x = FULLPROF_X experiment.peak.broad_lorentz_y = FULLPROF_Y -# The empirical-asymmetry coefficients (cryspy only) are set in the -# cryspy section below; crysfml has no empirical-asymmetry model. +# The Berar-Baldinozzi asymmetry coefficients (cryspy only) are set in +# the cryspy section below; crysfml has no empirical-asymmetry model. project.experiments.add(experiment) @@ -133,16 +144,16 @@ # ## edi-cryspy VS FullProf # %% -experiment.peak.type = 'pseudo-voigt + empirical asymmetry' +experiment.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry' experiment.peak.broad_gauss_u = FULLPROF_U experiment.peak.broad_gauss_v = FULLPROF_V experiment.peak.broad_gauss_w = FULLPROF_W experiment.peak.broad_lorentz_x = FULLPROF_X experiment.peak.broad_lorentz_y = FULLPROF_Y -experiment.peak.asym_empir_1 = FULLPROF_ASY_1 -experiment.peak.asym_empir_2 = FULLPROF_ASY_2 -experiment.peak.asym_empir_3 = FULLPROF_ASY_3 -experiment.peak.asym_empir_4 = FULLPROF_ASY_4 +experiment.peak.asym_beba_a0 = FULLPROF_ASY_1 +experiment.peak.asym_beba_b0 = FULLPROF_ASY_2 +experiment.peak.asym_beba_a1 = FULLPROF_ASY_3 +experiment.peak.asym_beba_b1 = FULLPROF_ASY_4 experiment.calculator.type = 'cryspy' @@ -161,17 +172,18 @@ # ## Fit edi-cryspy to FullProf # %% -# cryspy and FullProf parameterise the empirical asymmetry differently, so -# the FullProf coefficients do not transfer 1-to-1. Freeing cryspy's own -# coefficients recovers the FullProf profile, confirming the structure and -# the symmetric profile are correct. +# cryspy and FullProf implement the Berar-Baldinozzi asymmetry with +# different conventions, so the FullProf coefficients do not transfer +# 1-to-1. Freeing cryspy's own coefficients recovers the FullProf +# profile, confirming the structure and the symmetric profile are +# correct. experiment.calculator.type = 'cryspy' experiment.linked_structures['pbso4'].scale.free = True -experiment.peak.asym_empir_1.free = True -experiment.peak.asym_empir_2.free = True -experiment.peak.asym_empir_3.free = True -experiment.peak.asym_empir_4.free = True +experiment.peak.asym_beba_a0.free = True +experiment.peak.asym_beba_b0.free = True +experiment.peak.asym_beba_a1.free = True +experiment.peak.asym_beba_b1.free = True project.analysis.fit() project.display.fit.results() @@ -187,53 +199,6 @@ candidate_label='edi-cryspy (refined)', ) -# %% [markdown] -# ## edi-crysfml VS FullProf - -# %% -experiment.calculator.type = 'crysfml' - -experiment.linked_structures['pbso4'].scale = FULLPROF_SCALE - -experiment.peak.type = 'pseudo-voigt' -experiment.peak.broad_gauss_u = FULLPROF_U -experiment.peak.broad_gauss_v = FULLPROF_V -experiment.peak.broad_gauss_w = FULLPROF_W -experiment.peak.broad_lorentz_x = FULLPROF_X -experiment.peak.broad_lorentz_y = FULLPROF_Y - -project.analysis.calculate() -calc_ed_crysfml = experiment.data.intensity_calc - -project.display.pattern_comparison( - 'pbso4', - reference=calc_fullprof, - candidate=calc_ed_crysfml, - reference_label='FullProf', - candidate_label='edi-crysfml', -) - -# %% [markdown] -# ## Fit edi-crysfml to FullProf - -# %% -experiment.linked_structures['pbso4'].scale.free = True -experiment.instrument.calib_twotheta_offset.free = True - -project.analysis.fit() -project.display.fit.results() - -project.analysis.calculate() -calc_ed_crysfml_refined = experiment.data.intensity_calc - -project.display.pattern_comparison( - 'pbso4', - reference=calc_fullprof, - candidate=calc_ed_crysfml_refined, - reference_label='FullProf', - candidate_label='edi-crysfml (refined)', -) - # %% [markdown] # ## Agreement check @@ -241,7 +206,6 @@ verify.assert_patterns_agree( [ ('cryspy vs FullProf', calc_fullprof, calc_ed_cryspy_refined), - ('crysfml vs FullProf', calc_fullprof, calc_ed_crysfml_refined), ], raise_on_failure=False, ) diff --git a/docs/docs/verification/pd-neut-cwl_pv-beta_y2o3.ipynb b/docs/docs/verification/pd-neut-cwl_pv-beta_y2o3.ipynb new file mode 100644 index 000000000..a1307e3a5 --- /dev/null +++ b/docs/docs/verification/pd-neut-cwl_pv-beta_y2o3.ipynb @@ -0,0 +1,328 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "0", + "metadata": { + "tags": [ + "hide-in-docs" + ] + }, + "outputs": [], + "source": [ + "# Check whether easydiffraction is installed; install it if needed.\n", + "# Required for remote environments such as Google Colab.\n", + "import importlib.util\n", + "\n", + "if importlib.util.find_spec('easydiffraction') is None:\n", + " %pip install easydiffraction" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "# Y2O3 — neutron powder, constant wavelength, anisotropic β-tensor ADPs\n", + "\n", + "Cross-engine check of the **dimensionless β-tensor** anisotropic ADP\n", + "convention (`adp_type='beta'`) and the cylindrical Debye–Scherrer\n", + "sample-absorption correction on a powder pattern.\n", + "\n", + "The **only** parameter that does not match is the Bérar–Baldinozzi\n", + "axial-divergence asymmetry: cryspy and FullProf implement it with\n", + "different conventions (an overall sign and a coefficient inside the\n", + "`F_b` term differ), so the `asym_beba_*` coefficients do not transfer\n", + "one-to-one between the two programs. Freeing them in the fit absorbs\n", + "the difference; the structural results are unaffected. See development\n", + "issue 166 for the detailed comparison." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import easydiffraction as edi\n", + "from easydiffraction import ExperimentFactory\n", + "from easydiffraction import StructureFactory\n", + "from easydiffraction.analysis import verification as verify" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## Build the project" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "project = edi.Project()" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "## Define the structure\n", + "\n", + "Occupancies are the crystallographic site fractions (all fully\n", + "occupied). FullProf's `.pcr` lists the multiplicity-weighted values\n", + "(0.5, 0.16667, 1.0 for the 24d, 8b and 48e sites); cryspy derives the\n", + "site multiplicity from the symmetry, so the fractions are 1.0 here." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "structure = StructureFactory.from_scratch(name='y2o3')\n", + "\n", + "structure.space_group.name_h_m = 'I a -3' # FullProf Space group symbol\n", + "\n", + "structure.cell.length_a = 10.605744 # FullProf a\n", + "\n", + "structure.atom_sites.create(\n", + " id='Y1', # FullProf Atom\n", + " type_symbol='Y', # FullProf Typ\n", + " fract_x=-0.03236, # FullProf X\n", + " fract_y=0.0, # FullProf Y\n", + " fract_z=0.25, # FullProf Z\n", + " occupancy=1.0, # FullProf Occ 0.50000 (24d site)\n", + " adp_type='beta', # FullProf N_t = 2 (anisotropic β)\n", + ")\n", + "structure.atom_sites.create(\n", + " id='Y2', # FullProf Atom\n", + " type_symbol='Y', # FullProf Typ\n", + " fract_x=0.25, # FullProf X\n", + " fract_y=0.25, # FullProf Y\n", + " fract_z=0.25, # FullProf Z\n", + " occupancy=1.0, # FullProf Occ 0.16667 (8b site)\n", + " adp_type='beta', # FullProf N_t = 2 (anisotropic β)\n", + ")\n", + "structure.atom_sites.create(\n", + " id='O1', # FullProf Atom\n", + " type_symbol='O', # FullProf Typ\n", + " fract_x=0.39072, # FullProf X\n", + " fract_y=0.15204, # FullProf Y\n", + " fract_z=0.38030, # FullProf Z\n", + " occupancy=1.0, # FullProf Occ 1.00000 (48e site)\n", + " adp_type='beta', # FullProf N_t = 2 (anisotropic β)\n", + ")\n", + "\n", + "# β tensor components (FullProf Betas), dimensionless.\n", + "structure.atom_site_aniso['Y1'].adp_11 = 0.00303 # FullProf beta11\n", + "structure.atom_site_aniso['Y1'].adp_22 = 0.00272 # FullProf beta22\n", + "structure.atom_site_aniso['Y1'].adp_33 = 0.00295 # FullProf beta33\n", + "structure.atom_site_aniso['Y1'].adp_23 = -0.00025 # FullProf beta23\n", + "\n", + "structure.atom_site_aniso['Y2'].adp_11 = 0.00304 # FullProf beta11\n", + "structure.atom_site_aniso['Y2'].adp_12 = -0.00013 # FullProf beta12\n", + "\n", + "structure.atom_site_aniso['O1'].adp_11 = 0.00299 # FullProf beta11\n", + "structure.atom_site_aniso['O1'].adp_22 = 0.00310 # FullProf beta22\n", + "structure.atom_site_aniso['O1'].adp_33 = 0.00273 # FullProf beta33\n", + "structure.atom_site_aniso['O1'].adp_12 = -0.00007 # FullProf beta12\n", + "structure.atom_site_aniso['O1'].adp_13 = -0.00020 # FullProf beta13\n", + "structure.atom_site_aniso['O1'].adp_23 = -0.00001 # FullProf beta23\n", + "\n", + "project.structures.add(structure)" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "## Load the FullProf reference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "FULLPROF_PROJECT_DIR = 'pd-neut-cwl_pv-beta_y2o3'\n", + "FULLPROF_PRF_FILE = 'y2o3.prf'\n", + "FULLPROF_BAC_FILE = 'y2o3.bac'\n", + "FULLPROF_SUM_FILE = 'y2o3.sum'\n", + "FULLPROF_LABEL = verify.fullprof_label(FULLPROF_PROJECT_DIR, FULLPROF_SUM_FILE)\n", + "FULLPROF_ZERO = -0.01625 # FullProf Zero\n", + "FULLPROF_SCALE = 1.0602 # FullProf Scale\n", + "FULLPROF_WAVELENGTH = 1.54822 # FullProf Lambda\n", + "FULLPROF_U = 0.036631 # FullProf U\n", + "FULLPROF_V = -0.068345 # FullProf V\n", + "FULLPROF_W = 0.131426 # FullProf W\n", + "FULLPROF_ASY_1 = 0.17694 # FullProf Asy1\n", + "FULLPROF_ASY_2 = 0.03411 # FullProf Asy2\n", + "FULLPROF_MU_R = 1.5 # FullProf muR\n", + "\n", + "x, calc_fullprof = verify.load_fullprof_calc_profile(\n", + " FULLPROF_PROJECT_DIR,\n", + " FULLPROF_PRF_FILE,\n", + " FULLPROF_BAC_FILE,\n", + " FULLPROF_ZERO,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "## Create the experiment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "experiment = ExperimentFactory.from_scratch(\n", + " name='y2o3',\n", + " sample_form='powder',\n", + " beam_mode='constant wavelength',\n", + " radiation_probe='neutron',\n", + " scattering_type='bragg',\n", + ")\n", + "verify.set_reference_as_measured(experiment, x, calc_fullprof)\n", + "\n", + "experiment.linked_structures.create(structure_id='y2o3', scale=FULLPROF_SCALE)\n", + "\n", + "experiment.instrument.setup_wavelength = FULLPROF_WAVELENGTH\n", + "experiment.instrument.calib_twotheta_offset = FULLPROF_ZERO\n", + "\n", + "experiment.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry'\n", + "experiment.peak.broad_gauss_u = FULLPROF_U\n", + "experiment.peak.broad_gauss_v = FULLPROF_V\n", + "experiment.peak.broad_gauss_w = FULLPROF_W\n", + "experiment.peak.asym_beba_a0 = FULLPROF_ASY_1\n", + "experiment.peak.asym_beba_b0 = FULLPROF_ASY_2\n", + "\n", + "experiment.absorption.type = 'cylinder-hewat'\n", + "experiment.absorption.mu_r = FULLPROF_MU_R\n", + "\n", + "# FullProf excluded the 0–12° and 137.5–180° regions (.pcr).\n", + "experiment.excluded_regions.create(id='1', start=0.0, end=12.0)\n", + "experiment.excluded_regions.create(id='2', start=137.5, end=180.0)\n", + "\n", + "project.experiments.add(experiment)" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "## edi-cryspy VS FullProf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "experiment.calculator.type = 'cryspy'\n", + "\n", + "project.analysis.calculate()\n", + "calc_ed_cryspy = experiment.data.intensity_calc\n", + "\n", + "project.display.pattern_comparison(\n", + " 'y2o3',\n", + " reference=verify.restrict_to_included(experiment, calc_fullprof),\n", + " candidate=calc_ed_cryspy,\n", + " reference_label=FULLPROF_LABEL,\n", + " candidate_label='edi-cryspy',\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "## Fit edi-cryspy to FullProf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "experiment.peak.asym_beba_a0.free = True\n", + "experiment.peak.asym_beba_b0.free = True\n", + "\n", + "project.analysis.fit()\n", + "project.display.fit.results()\n", + "\n", + "project.analysis.calculate()\n", + "calc_ed_cryspy_refined = experiment.data.intensity_calc\n", + "\n", + "project.display.pattern_comparison(\n", + " 'y2o3',\n", + " reference=verify.restrict_to_included(experiment, calc_fullprof),\n", + " candidate=calc_ed_cryspy_refined,\n", + " reference_label=FULLPROF_LABEL,\n", + " candidate_label='edi-cryspy (refined)',\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "## Agreement check" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "verify.assert_patterns_agree(\n", + " [\n", + " (\n", + " 'cryspy vs FullProf',\n", + " verify.restrict_to_included(experiment, calc_fullprof),\n", + " calc_ed_cryspy_refined,\n", + " ),\n", + " ],\n", + ")" + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/docs/verification/pd-neut-cwl_pv-beta_y2o3.py b/docs/docs/verification/pd-neut-cwl_pv-beta_y2o3.py new file mode 100644 index 000000000..cac979fbf --- /dev/null +++ b/docs/docs/verification/pd-neut-cwl_pv-beta_y2o3.py @@ -0,0 +1,199 @@ +# %% [markdown] +# # Y2O3 — neutron powder, constant wavelength, anisotropic β-tensor ADPs +# +# Cross-engine check of the **dimensionless β-tensor** anisotropic ADP +# convention (`adp_type='beta'`) and the cylindrical Debye–Scherrer +# sample-absorption correction on a powder pattern. +# +# The **only** parameter that does not match is the Bérar–Baldinozzi +# axial-divergence asymmetry: cryspy and FullProf implement it with +# different conventions (an overall sign and a coefficient inside the +# `F_b` term differ), so the `asym_beba_*` coefficients do not transfer +# one-to-one between the two programs. Freeing them in the fit absorbs +# the difference; the structural results are unaffected. See development +# issue 166 for the detailed comparison. + +# %% +import easydiffraction as edi +from easydiffraction import ExperimentFactory +from easydiffraction import StructureFactory +from easydiffraction.analysis import verification as verify + +# %% [markdown] +# ## Build the project + +# %% +project = edi.Project() + +# %% [markdown] +# ## Define the structure +# +# Occupancies are the crystallographic site fractions (all fully +# occupied). FullProf's `.pcr` lists the multiplicity-weighted values +# (0.5, 0.16667, 1.0 for the 24d, 8b and 48e sites); cryspy derives the +# site multiplicity from the symmetry, so the fractions are 1.0 here. + +# %% +structure = StructureFactory.from_scratch(name='y2o3') + +structure.space_group.name_h_m = 'I a -3' # FullProf Space group symbol + +structure.cell.length_a = 10.605744 # FullProf a + +structure.atom_sites.create( + id='Y1', # FullProf Atom + type_symbol='Y', # FullProf Typ + fract_x=-0.03236, # FullProf X + fract_y=0.0, # FullProf Y + fract_z=0.25, # FullProf Z + occupancy=1.0, # FullProf Occ 0.50000 (24d site) + adp_type='beta', # FullProf N_t = 2 (anisotropic β) +) +structure.atom_sites.create( + id='Y2', # FullProf Atom + type_symbol='Y', # FullProf Typ + fract_x=0.25, # FullProf X + fract_y=0.25, # FullProf Y + fract_z=0.25, # FullProf Z + occupancy=1.0, # FullProf Occ 0.16667 (8b site) + adp_type='beta', # FullProf N_t = 2 (anisotropic β) +) +structure.atom_sites.create( + id='O1', # FullProf Atom + type_symbol='O', # FullProf Typ + fract_x=0.39072, # FullProf X + fract_y=0.15204, # FullProf Y + fract_z=0.38030, # FullProf Z + occupancy=1.0, # FullProf Occ 1.00000 (48e site) + adp_type='beta', # FullProf N_t = 2 (anisotropic β) +) + +# β tensor components (FullProf Betas), dimensionless. +structure.atom_site_aniso['Y1'].adp_11 = 0.00303 # FullProf beta11 +structure.atom_site_aniso['Y1'].adp_22 = 0.00272 # FullProf beta22 +structure.atom_site_aniso['Y1'].adp_33 = 0.00295 # FullProf beta33 +structure.atom_site_aniso['Y1'].adp_23 = -0.00025 # FullProf beta23 + +structure.atom_site_aniso['Y2'].adp_11 = 0.00304 # FullProf beta11 +structure.atom_site_aniso['Y2'].adp_12 = -0.00013 # FullProf beta12 + +structure.atom_site_aniso['O1'].adp_11 = 0.00299 # FullProf beta11 +structure.atom_site_aniso['O1'].adp_22 = 0.00310 # FullProf beta22 +structure.atom_site_aniso['O1'].adp_33 = 0.00273 # FullProf beta33 +structure.atom_site_aniso['O1'].adp_12 = -0.00007 # FullProf beta12 +structure.atom_site_aniso['O1'].adp_13 = -0.00020 # FullProf beta13 +structure.atom_site_aniso['O1'].adp_23 = -0.00001 # FullProf beta23 + +project.structures.add(structure) + +# %% [markdown] +# ## Load the FullProf reference + +# %% +FULLPROF_PROJECT_DIR = 'pd-neut-cwl_pv-beta_y2o3' +FULLPROF_PRF_FILE = 'y2o3.prf' +FULLPROF_BAC_FILE = 'y2o3.bac' +FULLPROF_SUM_FILE = 'y2o3.sum' +FULLPROF_LABEL = verify.fullprof_label(FULLPROF_PROJECT_DIR, FULLPROF_SUM_FILE) +FULLPROF_ZERO = -0.01625 # FullProf Zero +FULLPROF_SCALE = 1.0602 # FullProf Scale +FULLPROF_WAVELENGTH = 1.54822 # FullProf Lambda +FULLPROF_U = 0.036631 # FullProf U +FULLPROF_V = -0.068345 # FullProf V +FULLPROF_W = 0.131426 # FullProf W +FULLPROF_ASY_1 = 0.17694 # FullProf Asy1 +FULLPROF_ASY_2 = 0.03411 # FullProf Asy2 +FULLPROF_MU_R = 1.5 # FullProf muR + +x, calc_fullprof = verify.load_fullprof_calc_profile( + FULLPROF_PROJECT_DIR, + FULLPROF_PRF_FILE, + FULLPROF_BAC_FILE, + FULLPROF_ZERO, +) + +# %% [markdown] +# ## Create the experiment + +# %% +experiment = ExperimentFactory.from_scratch( + name='y2o3', + sample_form='powder', + beam_mode='constant wavelength', + radiation_probe='neutron', + scattering_type='bragg', +) +verify.set_reference_as_measured(experiment, x, calc_fullprof) + +experiment.linked_structures.create(structure_id='y2o3', scale=FULLPROF_SCALE) + +experiment.instrument.setup_wavelength = FULLPROF_WAVELENGTH +experiment.instrument.calib_twotheta_offset = FULLPROF_ZERO + +experiment.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry' +experiment.peak.broad_gauss_u = FULLPROF_U +experiment.peak.broad_gauss_v = FULLPROF_V +experiment.peak.broad_gauss_w = FULLPROF_W +experiment.peak.asym_beba_a0 = FULLPROF_ASY_1 +experiment.peak.asym_beba_b0 = FULLPROF_ASY_2 + +experiment.absorption.type = 'cylinder-hewat' +experiment.absorption.mu_r = FULLPROF_MU_R + +# FullProf excluded the 0–12° and 137.5–180° regions (.pcr). +experiment.excluded_regions.create(id='1', start=0.0, end=12.0) +experiment.excluded_regions.create(id='2', start=137.5, end=180.0) + +project.experiments.add(experiment) + +# %% [markdown] +# ## edi-cryspy VS FullProf + +# %% +experiment.calculator.type = 'cryspy' + +project.analysis.calculate() +calc_ed_cryspy = experiment.data.intensity_calc + +project.display.pattern_comparison( + 'y2o3', + reference=verify.restrict_to_included(experiment, calc_fullprof), + candidate=calc_ed_cryspy, + reference_label=FULLPROF_LABEL, + candidate_label='edi-cryspy', +) + +# %% [markdown] +# ## Fit edi-cryspy to FullProf + +# %% +experiment.peak.asym_beba_a0.free = True +experiment.peak.asym_beba_b0.free = True + +project.analysis.fit() +project.display.fit.results() + +project.analysis.calculate() +calc_ed_cryspy_refined = experiment.data.intensity_calc + +project.display.pattern_comparison( + 'y2o3', + reference=verify.restrict_to_included(experiment, calc_fullprof), + candidate=calc_ed_cryspy_refined, + reference_label=FULLPROF_LABEL, + candidate_label='edi-cryspy (refined)', +) + +# %% [markdown] +# ## Agreement check + +# %% +verify.assert_patterns_agree( + [ + ( + 'cryspy vs FullProf', + verify.restrict_to_included(experiment, calc_fullprof), + calc_ed_cryspy_refined, + ), + ], +) diff --git a/docs/docs/verification/pd-neut-cwl_tch-fcj-nosldl_lab6.ipynb b/docs/docs/verification/pd-neut-cwl_tch-fcj-nosldl_lab6.ipynb index 142be0afa..f5f393545 100644 --- a/docs/docs/verification/pd-neut-cwl_tch-fcj-nosldl_lab6.ipynb +++ b/docs/docs/verification/pd-neut-cwl_tch-fcj-nosldl_lab6.ipynb @@ -97,7 +97,7 @@ "structure.space_group.name_h_m = 'P m -3 m' # FullProf Space group symbol\n", "structure.cell.length_a = 4.156885 # FullProf a\n", "structure.atom_sites.create(\n", - " label='La', # FullProf Atom\n", + " id='La', # FullProf Atom\n", " type_symbol='La', # FullProf Typ\n", " fract_x=0.0, # FullProf X\n", " fract_y=0.0, # FullProf Y\n", @@ -106,7 +106,7 @@ " adp_iso=0.59951, # FullProf Biso\n", ")\n", "structure.atom_sites.create(\n", - " label='B', # FullProf Atom\n", + " id='B', # FullProf Atom\n", " type_symbol='11B', # FullProf \"B11\"\n", " fract_x=0.19978, # FullProf X\n", " fract_y=0.5, # FullProf Y\n", diff --git a/docs/docs/verification/pd-neut-cwl_tch-fcj-nosldl_lab6.py b/docs/docs/verification/pd-neut-cwl_tch-fcj-nosldl_lab6.py index cff6b852b..f2ec6e84e 100644 --- a/docs/docs/verification/pd-neut-cwl_tch-fcj-nosldl_lab6.py +++ b/docs/docs/verification/pd-neut-cwl_tch-fcj-nosldl_lab6.py @@ -36,7 +36,7 @@ structure.space_group.name_h_m = 'P m -3 m' # FullProf Space group symbol structure.cell.length_a = 4.156885 # FullProf a structure.atom_sites.create( - label='La', # FullProf Atom + id='La', # FullProf Atom type_symbol='La', # FullProf Typ fract_x=0.0, # FullProf X fract_y=0.0, # FullProf Y @@ -45,7 +45,7 @@ adp_iso=0.59951, # FullProf Biso ) structure.atom_sites.create( - label='B', # FullProf Atom + id='B', # FullProf Atom type_symbol='11B', # FullProf "B11" fract_x=0.19978, # FullProf X fract_y=0.5, # FullProf Y @@ -95,7 +95,7 @@ ) verify.set_reference_as_measured(experiment, x, calc_fullprof) -experiment.linked_phases.create(id='lab6', scale=FULLPROF_SCALE) +experiment.linked_structures.create(structure_id='lab6', scale=FULLPROF_SCALE) experiment.instrument.setup_wavelength = FULLPROF_WAVELENGTH experiment.instrument.calib_twotheta_offset = FULLPROF_ZERO diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 937ff5cfc..2ab01a9d1 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -259,11 +259,12 @@ nav: - LBCO: verification/pd-neut-cwl_pv_lbco.ipynb - LBCO (preferred orientation): verification/pd-neut-cwl_pv-march_lbco.ipynb - PbSO4 (pseudo-Voigt): verification/pd-neut-cwl_pv_pbso4.ipynb - - PbSO4 (empirical asymmetry): verification/pd-neut-cwl_pv-asym_empir_pbso4.ipynb + - PbSO4 (Bérar–Baldinozzi asymmetry): verification/pd-neut-cwl_pv-beba_pbso4.ipynb - LaB6 (SyCos/SySin): verification/pd-neut-cwl_tch-fcj-noabs-nosldl_lab6.ipynb - LaB6 (FCJ asymmetry): verification/pd-neut-cwl_tch-fcj-noabs_lab6.ipynb - LaB6 (absorption): verification/pd-neut-cwl_tch-fcj_lab6.ipynb - LaB6 (absorption, no FCJ): verification/pd-neut-cwl_tch-fcj-nosldl_lab6.ipynb + - Y2O3 (anisotropic β-tensor ADPs): verification/pd-neut-cwl_pv-beta_y2o3.ipynb - Powder, neutron, time-of-flight: - Si (Jorgensen): verification/pd-neut-tof_j_si.ipynb - Si (Jorgensen–Von Dreele): verification/pd-neut-tof_jvd_si.ipynb diff --git a/src/easydiffraction/analysis/calculators/crysfml.py b/src/easydiffraction/analysis/calculators/crysfml.py index 41aafc52f..67414f4af 100644 --- a/src/easydiffraction/analysis/calculators/crysfml.py +++ b/src/easydiffraction/analysis/calculators/crysfml.py @@ -56,10 +56,10 @@ ('broad_lorentz_y', '_pd_instr_resolution_y'), ('asym_fcj_1', '_pd_instr_reflex_s_l'), ('asym_fcj_2', '_pd_instr_reflex_d_l'), - ('asym_empir_1', '_pd_instr_reflex_asymmetry_p1'), - ('asym_empir_2', '_pd_instr_reflex_asymmetry_p2'), - ('asym_empir_3', '_pd_instr_reflex_asymmetry_p3'), - ('asym_empir_4', '_pd_instr_reflex_asymmetry_p4'), + ('asym_beba_a0', '_pd_instr_reflex_asymmetry_p1'), + ('asym_beba_b0', '_pd_instr_reflex_asymmetry_p2'), + ('asym_beba_a1', '_pd_instr_reflex_asymmetry_p3'), + ('asym_beba_b1', '_pd_instr_reflex_asymmetry_p4'), ('broad_gauss_sigma_0', '_pd_jorg_vondreele_sigma0'), ('broad_gauss_sigma_1', '_pd_jorg_vondreele_sigma1'), ('broad_gauss_sigma_2', '_pd_jorg_vondreele_sigma2'), diff --git a/src/easydiffraction/analysis/calculators/cryspy.py b/src/easydiffraction/analysis/calculators/cryspy.py index cc912764d..20f11ad13 100644 --- a/src/easydiffraction/analysis/calculators/cryspy.py +++ b/src/easydiffraction/analysis/calculators/cryspy.py @@ -722,10 +722,10 @@ def _update_experiment_in_cryspy_dict( if 'asymmetry_parameters' in cryspy_expt_dict: cryspy_asymmetry = cryspy_expt_dict['asymmetry_parameters'] - cryspy_asymmetry[0] = experiment.peak.asym_empir_1.value - cryspy_asymmetry[1] = experiment.peak.asym_empir_2.value - cryspy_asymmetry[2] = experiment.peak.asym_empir_3.value - cryspy_asymmetry[3] = experiment.peak.asym_empir_4.value + cryspy_asymmetry[0] = experiment.peak.asym_beba_a0.value + cryspy_asymmetry[1] = experiment.peak.asym_beba_b0.value + cryspy_asymmetry[2] = experiment.peak.asym_beba_a1.value + cryspy_asymmetry[3] = experiment.peak.asym_beba_b1.value # Preferred orientation (March-Dollase): patch the # refinable coefficient (g_1) and random fraction (g_2) @@ -1216,10 +1216,10 @@ def _cif_peak_section( 'broad_gauss_w': '_pd_instr_resolution_W', 'broad_lorentz_x': '_pd_instr_resolution_X', 'broad_lorentz_y': '_pd_instr_resolution_Y', - 'asym_empir_1': '_pd_instr_reflex_asymmetry_p1', - 'asym_empir_2': '_pd_instr_reflex_asymmetry_p2', - 'asym_empir_3': '_pd_instr_reflex_asymmetry_p3', - 'asym_empir_4': '_pd_instr_reflex_asymmetry_p4', + 'asym_beba_a0': '_pd_instr_reflex_asymmetry_p1', + 'asym_beba_b0': '_pd_instr_reflex_asymmetry_p2', + 'asym_beba_a1': '_pd_instr_reflex_asymmetry_p3', + 'asym_beba_b1': '_pd_instr_reflex_asymmetry_p4', } elif expt_type.beam_mode.value == BeamModeEnum.TIME_OF_FLIGHT: peak_mapping = { diff --git a/src/easydiffraction/analysis/sequential.py b/src/easydiffraction/analysis/sequential.py index 4d07d7ea5..faa19e954 100644 --- a/src/easydiffraction/analysis/sequential.py +++ b/src/easydiffraction/analysis/sequential.py @@ -52,7 +52,7 @@ class SequentialFitTemplate: template can be pickled for ``ProcessPoolExecutor``. """ - structure_cif: str + structure_cifs: list[str] experiment_cif: str initial_params: dict[str, float] free_parameter_unique_names: list[str] @@ -126,7 +126,8 @@ def _fit_worker_success( finally: Project._loading = False - project.structures.add_from_cif_str(template.structure_cif) + for structure_cif in template.structure_cifs: + project.structures.add_from_cif_str(structure_cif) project.experiments.add_from_cif_str(template.experiment_cif) expt = next(iter(project.experiments.values())) expt._load_ascii_data_to_experiment(data_path) @@ -568,8 +569,8 @@ def _build_template(project: object) -> SequentialFitTemplate: Parameters ---------- project : object - The main project instance (must have exactly 1 structure and 1 - experiment). + The main project instance (must have at least 1 structure and + exactly 1 experiment). Returns ------- @@ -585,7 +586,6 @@ def _build_template(project: object) -> SequentialFitTemplate: from easydiffraction.core.variable import NumericDescriptor # noqa: PLC0415 from easydiffraction.core.variable import Parameter # noqa: PLC0415 - structure = next(iter(project.structures.values())) experiment = next(iter(project.experiments.values())) # Collect free parameter unique_names and initial values @@ -638,7 +638,7 @@ def _build_template(project: object) -> SequentialFitTemplate: diffrn_field_names.append(field_name) return SequentialFitTemplate( - structure_cif=structure.as_cif, + structure_cifs=[structure.as_cif for structure in project.structures.values()], experiment_cif=experiment.as_cif, initial_params=initial_params, free_parameter_unique_names=free_names, @@ -1042,8 +1042,8 @@ def _check_seq_preconditions(project: object) -> list[str]: ValueError If preconditions are not met. """ - if len(project.structures) != 1: - msg = f'Sequential fitting requires exactly 1 structure, found {len(project.structures)}.' + if len(project.structures) < 1: + msg = 'Sequential fitting requires at least 1 structure, found none.' raise ValueError(msg) if len(project.experiments) != 1: diff --git a/src/easydiffraction/datablocks/experiment/categories/background/line_segment.py b/src/easydiffraction/datablocks/experiment/categories/background/line_segment.py index 457fc84bd..6c0eef66a 100644 --- a/src/easydiffraction/datablocks/experiment/categories/background/line_segment.py +++ b/src/easydiffraction/datablocks/experiment/categories/background/line_segment.py @@ -371,8 +371,8 @@ def auto_estimate( log.info(summary) def show(self) -> None: - """Print a table of control points (x, intensity).""" - columns_headers: list[str] = ['X', 'Intensity'] + """Print a table of control points (position, intensity).""" + columns_headers: list[str] = ['Position', 'Intensity'] columns_alignment = ['left', 'left'] columns_data: list[list[float]] = [ [p.position.value, p.intensity.value] for p in self._items diff --git a/src/easydiffraction/datablocks/experiment/categories/peak/__init__.py b/src/easydiffraction/datablocks/experiment/categories/peak/__init__.py index 7b44e4c12..aa88c3576 100644 --- a/src/easydiffraction/datablocks/experiment/categories/peak/__init__.py +++ b/src/easydiffraction/datablocks/experiment/categories/peak/__init__.py @@ -4,7 +4,7 @@ from easydiffraction.datablocks.experiment.categories.peak.cwl import CwlPseudoVoigt from easydiffraction.datablocks.experiment.categories.peak.cwl import ( - CwlPseudoVoigtEmpiricalAsymmetry, + CwlPseudoVoigtBerarBaldinozziAsymmetry, ) from easydiffraction.datablocks.experiment.categories.peak.cwl import CwlThompsonCoxHastings from easydiffraction.datablocks.experiment.categories.peak.tof import TofDoubleJorgensenVonDreele diff --git a/src/easydiffraction/datablocks/experiment/categories/peak/cwl.py b/src/easydiffraction/datablocks/experiment/categories/peak/cwl.py index bb48fdbb1..84f5ab212 100644 --- a/src/easydiffraction/datablocks/experiment/categories/peak/cwl.py +++ b/src/easydiffraction/datablocks/experiment/categories/peak/cwl.py @@ -6,10 +6,10 @@ from easydiffraction.core.metadata import Compatibility from easydiffraction.core.metadata import TypeInfo from easydiffraction.datablocks.experiment.categories.peak.base import PeakBase -from easydiffraction.datablocks.experiment.categories.peak.cwl_mixins import CwlBroadeningMixin from easydiffraction.datablocks.experiment.categories.peak.cwl_mixins import ( - EmpiricalAsymmetryMixin, + BerarBaldinozziAsymmetryMixin, ) +from easydiffraction.datablocks.experiment.categories.peak.cwl_mixins import CwlBroadeningMixin from easydiffraction.datablocks.experiment.categories.peak.cwl_mixins import FcjAsymmetryMixin from easydiffraction.datablocks.experiment.categories.peak.factory import PeakFactory from easydiffraction.datablocks.experiment.item.enums import BeamModeEnum @@ -43,16 +43,18 @@ def __init__(self) -> None: @PeakFactory.register -class CwlPseudoVoigtEmpiricalAsymmetry( +class CwlPseudoVoigtBerarBaldinozziAsymmetry( PeakBase, CwlBroadeningMixin, - EmpiricalAsymmetryMixin, + BerarBaldinozziAsymmetryMixin, ): - """Pseudo-Voigt with empirical asymmetry correction for CWL mode.""" + """Pseudo-Voigt with Berar-Baldinozzi asymmetry for CWL mode.""" type_info = TypeInfo( - tag=PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_EMPIRICAL_ASYMMETRY.value, - description=(PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_EMPIRICAL_ASYMMETRY.description()), + tag=PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_BERAR_BALDINOZZI_ASYMMETRY.value, + description=( + PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_BERAR_BALDINOZZI_ASYMMETRY.description() + ), ) compatibility = Compatibility( scattering_type=frozenset({ScatteringTypeEnum.BRAGG}), @@ -63,7 +65,9 @@ class CwlPseudoVoigtEmpiricalAsymmetry( ) def __init__(self) -> None: - """Initialize the pseudo-Voigt with empirical asymmetry.""" + """ + Initialize the pseudo-Voigt with Berar-Baldinozzi asymmetry. + """ super().__init__() diff --git a/src/easydiffraction/datablocks/experiment/categories/peak/cwl_mixins.py b/src/easydiffraction/datablocks/experiment/categories/peak/cwl_mixins.py index 95f110b5d..4bb023f8a 100644 --- a/src/easydiffraction/datablocks/experiment/categories/peak/cwl_mixins.py +++ b/src/easydiffraction/datablocks/experiment/categories/peak/cwl_mixins.py @@ -198,59 +198,79 @@ def broad_lorentz_y(self, value: float) -> None: self._broad_lorentz_y.value = value -class EmpiricalAsymmetryMixin: - """Empirical CWL peak asymmetry parameters.""" +class BerarBaldinozziAsymmetryMixin: + """Berar-Baldinozzi empirical CWL peak asymmetry parameters.""" def __init__(self) -> None: - """Initialize the empirical CWL peak asymmetry parameters.""" + """Initialize the Berar-Baldinozzi peak asymmetry parameters.""" super().__init__() - self._asym_empir_1: Parameter = Parameter( - name='asym_empir_1', - description='Empirical asymmetry coefficient p1', + self._asym_beba_a0: Parameter = Parameter( + name='asym_beba_a0', + description='Berar-Baldinozzi asymmetry coefficient A0 (Fa/tan theta)', units='none', + display_handler=DisplayHandler( + display_name='A₀', + latex_name=r'$A_0$', + ), value_spec=AttributeSpec( default=0.0, validator=RangeValidator(), ), tags=TagSpec( - edi_names=['_peak.asym_empir_1'], cif_names=['_easydiffraction_peak.asym_empir_1'] + edi_names=['_peak.asym_beba_a0'], + cif_names=['_easydiffraction_peak.asym_beba_a0'], ), ) - self._asym_empir_2: Parameter = Parameter( - name='asym_empir_2', - description='Empirical asymmetry coefficient p2', + self._asym_beba_b0: Parameter = Parameter( + name='asym_beba_b0', + description='Berar-Baldinozzi asymmetry coefficient B0 (Fb/tan theta)', units='none', + display_handler=DisplayHandler( + display_name='B₀', + latex_name=r'$B_0$', + ), value_spec=AttributeSpec( default=0.0, validator=RangeValidator(), ), tags=TagSpec( - edi_names=['_peak.asym_empir_2'], cif_names=['_easydiffraction_peak.asym_empir_2'] + edi_names=['_peak.asym_beba_b0'], + cif_names=['_easydiffraction_peak.asym_beba_b0'], ), ) - self._asym_empir_3: Parameter = Parameter( - name='asym_empir_3', - description='Empirical asymmetry coefficient p3', + self._asym_beba_a1: Parameter = Parameter( + name='asym_beba_a1', + description='Berar-Baldinozzi asymmetry coefficient A1 (Fa/tan 2theta)', units='none', + display_handler=DisplayHandler( + display_name='A₁', + latex_name=r'$A_1$', + ), value_spec=AttributeSpec( default=0.0, validator=RangeValidator(), ), tags=TagSpec( - edi_names=['_peak.asym_empir_3'], cif_names=['_easydiffraction_peak.asym_empir_3'] + edi_names=['_peak.asym_beba_a1'], + cif_names=['_easydiffraction_peak.asym_beba_a1'], ), ) - self._asym_empir_4: Parameter = Parameter( - name='asym_empir_4', - description='Empirical asymmetry coefficient p4', + self._asym_beba_b1: Parameter = Parameter( + name='asym_beba_b1', + description='Berar-Baldinozzi asymmetry coefficient B1 (Fb/tan 2theta)', units='none', + display_handler=DisplayHandler( + display_name='B₁', + latex_name=r'$B_1$', + ), value_spec=AttributeSpec( default=0.0, validator=RangeValidator(), ), tags=TagSpec( - edi_names=['_peak.asym_empir_4'], cif_names=['_easydiffraction_peak.asym_empir_4'] + edi_names=['_peak.asym_beba_b1'], + cif_names=['_easydiffraction_peak.asym_beba_b1'], ), ) @@ -259,64 +279,64 @@ def __init__(self) -> None: # ------------------------------------------------------------------ @property - def asym_empir_1(self) -> Parameter: + def asym_beba_a0(self) -> Parameter: """ - Empirical asymmetry coefficient p1. + Berar-Baldinozzi asymmetry coefficient A0 (Fa/tan theta). Reading this property returns the underlying ``Parameter`` object. Assigning to it updates the parameter value. """ - return self._asym_empir_1 + return self._asym_beba_a0 - @asym_empir_1.setter - def asym_empir_1(self, value: float) -> None: - """Set the empirical asymmetry coefficient p1.""" - self._asym_empir_1.value = value + @asym_beba_a0.setter + def asym_beba_a0(self, value: float) -> None: + """Set Berar-Baldinozzi asymmetry coefficient A0.""" + self._asym_beba_a0.value = value @property - def asym_empir_2(self) -> Parameter: + def asym_beba_b0(self) -> Parameter: """ - Empirical asymmetry coefficient p2. + Berar-Baldinozzi asymmetry coefficient B0 (Fb/tan theta). Reading this property returns the underlying ``Parameter`` object. Assigning to it updates the parameter value. """ - return self._asym_empir_2 + return self._asym_beba_b0 - @asym_empir_2.setter - def asym_empir_2(self, value: float) -> None: - """Set the empirical asymmetry coefficient p2.""" - self._asym_empir_2.value = value + @asym_beba_b0.setter + def asym_beba_b0(self, value: float) -> None: + """Set Berar-Baldinozzi asymmetry coefficient B0.""" + self._asym_beba_b0.value = value @property - def asym_empir_3(self) -> Parameter: + def asym_beba_a1(self) -> Parameter: """ - Empirical asymmetry coefficient p3. + Berar-Baldinozzi asymmetry coefficient A1 (Fa/tan 2theta). Reading this property returns the underlying ``Parameter`` object. Assigning to it updates the parameter value. """ - return self._asym_empir_3 + return self._asym_beba_a1 - @asym_empir_3.setter - def asym_empir_3(self, value: float) -> None: - """Set the empirical asymmetry coefficient p3.""" - self._asym_empir_3.value = value + @asym_beba_a1.setter + def asym_beba_a1(self, value: float) -> None: + """Set Berar-Baldinozzi asymmetry coefficient A1.""" + self._asym_beba_a1.value = value @property - def asym_empir_4(self) -> Parameter: + def asym_beba_b1(self) -> Parameter: """ - Empirical asymmetry coefficient p4. + Berar-Baldinozzi asymmetry coefficient B1 (Fb/tan 2theta). Reading this property returns the underlying ``Parameter`` object. Assigning to it updates the parameter value. """ - return self._asym_empir_4 + return self._asym_beba_b1 - @asym_empir_4.setter - def asym_empir_4(self, value: float) -> None: - """Set the empirical asymmetry coefficient p4.""" - self._asym_empir_4.value = value + @asym_beba_b1.setter + def asym_beba_b1(self, value: float) -> None: + """Set Berar-Baldinozzi asymmetry coefficient B1.""" + self._asym_beba_b1.value = value class FcjAsymmetryMixin: diff --git a/src/easydiffraction/datablocks/experiment/categories/peak/factory.py b/src/easydiffraction/datablocks/experiment/categories/peak/factory.py index 41b6b42e2..d085bb5c1 100644 --- a/src/easydiffraction/datablocks/experiment/categories/peak/factory.py +++ b/src/easydiffraction/datablocks/experiment/categories/peak/factory.py @@ -37,8 +37,8 @@ class PeakFactory(FactoryBase): ('beam_mode', BeamModeEnum.CONSTANT_WAVELENGTH), }): { 'pseudo-voigt': PeakProfileTypeEnum.CWL_PSEUDO_VOIGT, - 'pseudo-voigt + empirical asymmetry': ( - PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_EMPIRICAL_ASYMMETRY + 'pseudo-voigt + berar-baldinozzi asymmetry': ( + PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_BERAR_BALDINOZZI_ASYMMETRY ), 'thompson-cox-hastings': PeakProfileTypeEnum.CWL_THOMPSON_COX_HASTINGS, }, diff --git a/src/easydiffraction/datablocks/experiment/item/enums.py b/src/easydiffraction/datablocks/experiment/item/enums.py index 6963b5e9b..a548a0ec3 100644 --- a/src/easydiffraction/datablocks/experiment/item/enums.py +++ b/src/easydiffraction/datablocks/experiment/item/enums.py @@ -160,7 +160,7 @@ class PeakProfileTypeEnum(StrEnum): """Available peak profile types per scattering and beam mode.""" CWL_PSEUDO_VOIGT = 'cwl-pseudo-voigt' - CWL_PSEUDO_VOIGT_EMPIRICAL_ASYMMETRY = 'cwl-pseudo-voigt-empirical-asymmetry' + CWL_PSEUDO_VOIGT_BERAR_BALDINOZZI_ASYMMETRY = 'cwl-pseudo-voigt-berar-baldinozzi-asymmetry' CWL_THOMPSON_COX_HASTINGS = 'cwl-thompson-cox-hastings' TOF_PSEUDO_VOIGT = 'tof-pseudo-voigt' TOF_JORGENSEN = 'tof-jorgensen' @@ -220,8 +220,8 @@ def description(self) -> str: # noqa: PLR0911 """ if self is PeakProfileTypeEnum.CWL_PSEUDO_VOIGT: return 'CWL pseudo-Voigt profile' - if self is PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_EMPIRICAL_ASYMMETRY: - return 'CWL pseudo-Voigt profile with empirical asymmetry correction.' + if self is PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_BERAR_BALDINOZZI_ASYMMETRY: + return 'CWL pseudo-Voigt profile with Berar-Baldinozzi asymmetry correction.' if self is PeakProfileTypeEnum.CWL_THOMPSON_COX_HASTINGS: return 'CWL Thompson-Cox-Hastings profile with FCJ asymmetry correction.' if self is PeakProfileTypeEnum.TOF_PSEUDO_VOIGT: diff --git a/src/easydiffraction/display/plotting.py b/src/easydiffraction/display/plotting.py index 2a53f252a..bc642e1db 100644 --- a/src/easydiffraction/display/plotting.py +++ b/src/easydiffraction/display/plotting.py @@ -978,6 +978,38 @@ def _series_column_names(param: object) -> list[str]: return names + @staticmethod + def _order_series_by_x( + x: list, + y: list, + sy: list, + ) -> tuple[list, list, list]: + """ + Order series points by their x value. + + Sequential results are recorded in file-processing order, which + is not necessarily ascending in the x quantity (for example a + temperature scan whose files sort lexicographically). Reordering + by x leaves the markers unchanged but makes the connecting line + follow the series. Non-numeric x values are placed last. + + Parameters + ---------- + x : list + x values. + y : list + y values. + sy : list + y uncertainties. + + Returns + ------- + tuple[list, list, list] + The three lists reordered by ascending x. + """ + order = np.argsort(np.asarray(x, dtype=float), kind='stable').tolist() + return [x[i] for i in order], [y[i] for i in order], [sy[i] for i in order] + @staticmethod def _numeric_series_values(values: object) -> list[float]: """Return one CSV column normalized to numeric plot values.""" @@ -6154,6 +6186,8 @@ def _plot_param_series_from_csv( title = f"Parameter '{column_name}' across fit results" + x, y, sy = self._order_series_by_x(x, y, sy) + self._backend.plot_scatter( x=x, y=y, @@ -6226,6 +6260,8 @@ def plot_param_series_from_snapshots( title = f"Parameter '{unique_name}' across fit results" + x, y, sy = self._order_series_by_x(x, y, sy) + self._backend.plot_scatter( x=x, y=y, diff --git a/tests/integration/fitting/test_sequential.py b/tests/integration/fitting/test_sequential.py index 95cce8696..08648c2aa 100644 --- a/tests/integration/fitting/test_sequential.py +++ b/tests/integration/fitting/test_sequential.py @@ -284,12 +284,12 @@ def test_fit_sequential_requires_saved_project(tmp_path) -> None: _run_sequential_fit(project, str(tmp_path)) -def test_fit_sequential_requires_one_structure(tmp_path) -> None: +def test_fit_sequential_requires_at_least_one_structure(tmp_path) -> None: """fit_sequential raises if no structures exist.""" project = Project(name='no_struct') project.save_as(str(tmp_path / 'proj')) - with pytest.raises(ValueError, match='exactly 1 structure'): + with pytest.raises(ValueError, match='at least 1 structure'): _run_sequential_fit(project, str(tmp_path)) diff --git a/tests/unit/easydiffraction/analysis/test_sequential.py b/tests/unit/easydiffraction/analysis/test_sequential.py index 7f45a04f4..d6414fe58 100644 --- a/tests/unit/easydiffraction/analysis/test_sequential.py +++ b/tests/unit/easydiffraction/analysis/test_sequential.py @@ -39,7 +39,7 @@ def _minimal_template( if diffrn_fields is None: diffrn_fields = [] return SequentialFitTemplate( - structure_cif='', + structure_cifs=[], experiment_cif='', initial_params={}, free_parameter_unique_names=free_names, diff --git a/tests/unit/easydiffraction/analysis/test_sequential_coverage.py b/tests/unit/easydiffraction/analysis/test_sequential_coverage.py index 3c8b40870..82dd87fb0 100644 --- a/tests/unit/easydiffraction/analysis/test_sequential_coverage.py +++ b/tests/unit/easydiffraction/analysis/test_sequential_coverage.py @@ -88,7 +88,7 @@ def _patch_variable_types(monkeypatch): def _minimal_template(**overrides): base = { - 'structure_cif': 'struct', + 'structure_cifs': ['struct'], 'experiment_cif': 'expt', 'initial_params': {}, 'free_parameter_unique_names': ['cell.a'], @@ -642,7 +642,7 @@ def test_builds_snapshot_from_project(self, monkeypatch): template = _build_template(project) - assert template.structure_cif == 'STRUCT_CIF' + assert template.structure_cifs == ['STRUCT_CIF'] assert template.experiment_cif == 'EXPT_CIF' # Only the free, non-user-constrained parameter is collected. assert template.free_parameter_unique_names == ['cell.a'] @@ -814,10 +814,16 @@ def test_passes_with_valid_project(self, monkeypatch): # No exception means success. assert _check_seq_preconditions(project) is None - def test_rejects_multiple_structures(self, monkeypatch): + def test_accepts_multiple_structures(self, monkeypatch): _patch_variable_types(monkeypatch) project = _precondition_project(n_structures=2) - with pytest.raises(ValueError, match=r'exactly 1 structure'): + # Multiple structures are now supported; no exception means success. + assert _check_seq_preconditions(project) is None + + def test_rejects_no_structures(self, monkeypatch): + _patch_variable_types(monkeypatch) + project = _precondition_project(n_structures=0) + with pytest.raises(ValueError, match=r'at least 1 structure'): _check_seq_preconditions(project) def test_rejects_multiple_experiments(self, monkeypatch): diff --git a/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_cwl.py b/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_cwl.py index f3ae93a55..52bab52c0 100644 --- a/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_cwl.py +++ b/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_cwl.py @@ -5,12 +5,12 @@ def test_cwl_peak_classes_expose_expected_parameters_and_category(): from easydiffraction.datablocks.experiment.categories.peak.cwl import CwlPseudoVoigt from easydiffraction.datablocks.experiment.categories.peak.cwl import ( - CwlPseudoVoigtEmpiricalAsymmetry, + CwlPseudoVoigtBerarBaldinozziAsymmetry, ) from easydiffraction.datablocks.experiment.categories.peak.cwl import CwlThompsonCoxHastings pv = CwlPseudoVoigt() - spv = CwlPseudoVoigtEmpiricalAsymmetry() + spv = CwlPseudoVoigtBerarBaldinozziAsymmetry() tch = CwlThompsonCoxHastings() # Category code set by PeakBase @@ -28,9 +28,9 @@ def test_cwl_peak_classes_expose_expected_parameters_and_category(): 'broad_lorentz_y', }.issubset(names) - # EmpiricalAsymmetry added only for split PV + # BerarBaldinozziAsymmetry added only for split PV names_spv = {p.name for p in spv.parameters} - assert {'asym_empir_1', 'asym_empir_2', 'asym_empir_3', 'asym_empir_4'}.issubset(names_spv) + assert {'asym_beba_a0', 'asym_beba_b0', 'asym_beba_a1', 'asym_beba_b1'}.issubset(names_spv) # FCJ asymmetry for TCH names_tch = {p.name for p in tch.parameters} diff --git a/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_cwl_mixins.py b/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_cwl_mixins.py index cc7201052..ff450ff2c 100644 --- a/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_cwl_mixins.py +++ b/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_cwl_mixins.py @@ -3,7 +3,7 @@ from easydiffraction.datablocks.experiment.categories.peak.cwl import CwlPseudoVoigt from easydiffraction.datablocks.experiment.categories.peak.cwl import ( - CwlPseudoVoigtEmpiricalAsymmetry, + CwlPseudoVoigtBerarBaldinozziAsymmetry, ) from easydiffraction.datablocks.experiment.categories.peak.cwl import CwlThompsonCoxHastings @@ -19,12 +19,12 @@ def test_cwl_pseudo_voigt_params_exist_and_settable(): def test_cwl_split_pseudo_voigt_adds_empirical_asymmetry(): - peak = CwlPseudoVoigtEmpiricalAsymmetry() - # Has broadening and empirical asymmetry params + peak = CwlPseudoVoigtBerarBaldinozziAsymmetry() + # Has broadening and Berar-Baldinozzi asymmetry params assert peak.broad_gauss_w.name == 'broad_gauss_w' - assert peak.asym_empir_1.name == 'asym_empir_1' - peak.asym_empir_2 = 0.345 - assert peak.asym_empir_2.value == 0.345 + assert peak.asym_beba_a0.name == 'asym_beba_a0' + peak.asym_beba_b0 = 0.345 + assert peak.asym_beba_b0.value == 0.345 def test_cwl_tch_adds_fcj_asymmetry(): diff --git a/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_factory.py b/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_factory.py index 75dc2bf4c..75f36f969 100644 --- a/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_factory.py +++ b/tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_factory.py @@ -54,6 +54,17 @@ def test_peak_factory_default_and_combinations_and_errors(): ) assert cwl_alias == PeakProfileTypeEnum.CWL_PSEUDO_VOIGT + # The Berar-Baldinozzi user type string resolves to the renamed tag + # and class in the constant-wavelength Bragg context. + beba_alias = PeakFactory._canonical_tag_for( + 'pseudo-voigt + berar-baldinozzi asymmetry', + scattering_type=ScatteringTypeEnum.BRAGG, + beam_mode=BeamModeEnum.CONSTANT_WAVELENGTH, + ) + assert beba_alias == PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_BERAR_BALDINOZZI_ASYMMETRY + beba_peak = PeakFactory.create(beba_alias) + assert beba_peak.__class__.__name__ == 'CwlPseudoVoigtBerarBaldinozziAsymmetry' + tof_alias = PeakFactory._canonical_tag_for( 'pseudo-voigt', scattering_type=ScatteringTypeEnum.BRAGG, @@ -70,7 +81,7 @@ def test_peak_factory_default_and_combinations_and_errors(): assert all(k.type_info.tag for k in cwl_profiles) assert [k.__name__ for k in cwl_profiles] == [ 'CwlPseudoVoigt', - 'CwlPseudoVoigtEmpiricalAsymmetry', + 'CwlPseudoVoigtBerarBaldinozziAsymmetry', 'CwlThompsonCoxHastings', ] diff --git a/tests/unit/easydiffraction/datablocks/experiment/item/test_base.py b/tests/unit/easydiffraction/datablocks/experiment/item/test_base.py index 50d4ee527..96d4c402e 100644 --- a/tests/unit/easydiffraction/datablocks/experiment/item/test_base.py +++ b/tests/unit/easydiffraction/datablocks/experiment/item/test_base.py @@ -63,15 +63,15 @@ def _load_ascii_data_to_experiment(self, data_path: str) -> int: monkeypatch.setattr(item_base.log, 'warning', warnings.append) ex = ConcretePd(name='ex1', experiment_type=et) - ex.peak.type = 'pseudo-voigt + empirical asymmetry' + ex.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry' assert warnings == [ ( 'Switching peak profile type adds these settings with defaults:\n' - '• asym_empir_1=0.0\n' - '• asym_empir_2=0.0\n' - '• asym_empir_3=0.0\n' - '• asym_empir_4=0.0' + '• asym_beba_a0=0.0\n' + '• asym_beba_a1=0.0\n' + '• asym_beba_b0=0.0\n' + '• asym_beba_b1=0.0' ) ] @@ -100,7 +100,7 @@ def _load_ascii_data_to_experiment(self, data_path: str) -> int: ex = ConcretePd(name='ex1', experiment_type=et) ex.peak.broad_gauss_u = 0.05 - ex.peak.type = 'pseudo-voigt + empirical asymmetry' + ex.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry' assert warnings[1] == ( 'Switching peak profile type resets these settings to defaults:\n' @@ -130,7 +130,7 @@ def _load_ascii_data_to_experiment(self, data_path: str) -> int: warnings: list[str] = [] monkeypatch.setattr(item_base.log, 'warning', warnings.append) ex = ConcretePd(name='ex1', experiment_type=et) - ex.peak.type = 'pseudo-voigt + empirical asymmetry' + ex.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry' warnings.clear() ex.peak.type = 'pseudo-voigt' @@ -138,10 +138,10 @@ def _load_ascii_data_to_experiment(self, data_path: str) -> int: assert warnings == [ ( 'Switching peak profile type removes these settings:\n' - '• asym_empir_1\n' - '• asym_empir_2\n' - '• asym_empir_3\n' - '• asym_empir_4' + '• asym_beba_a0\n' + '• asym_beba_a1\n' + '• asym_beba_b0\n' + '• asym_beba_b1' ) ] @@ -166,11 +166,11 @@ def _load_ascii_data_to_experiment(self, data_path: str) -> int: et._set_scattering_type(ScatteringTypeEnum.BRAGG.value) ex = ConcretePd(name='ex1', experiment_type=et) - ex._set_peak_profile_type('pseudo-voigt + empirical asymmetry') + ex._set_peak_profile_type('pseudo-voigt + berar-baldinozzi asymmetry') # Profile type was switched - assert ex.peak.type == 'cwl-pseudo-voigt-empirical-asymmetry' - assert ex.peak.__class__.__name__ == 'CwlPseudoVoigtEmpiricalAsymmetry' + assert ex.peak.type == 'cwl-pseudo-voigt-berar-baldinozzi-asymmetry' + assert ex.peak.__class__.__name__ == 'CwlPseudoVoigtBerarBaldinozziAsymmetry' # No console output was emitted captured = capsys.readouterr().out @@ -227,14 +227,14 @@ def _load_ascii_data_to_experiment(self, data_path: str) -> int: ex = ConcretePd(name='ex1', experiment_type=et) - cif = 'data_ex1\n_peak.type "pseudo-voigt + empirical asymmetry"\n' + cif = 'data_ex1\n_peak.type "pseudo-voigt + berar-baldinozzi asymmetry"\n' doc = gemmi.cif.read_string(cif) block = doc.sole_block() ex._restore_switchable_types(block) - assert ex.peak.type == 'cwl-pseudo-voigt-empirical-asymmetry' - assert ex.peak.__class__.__name__ == 'CwlPseudoVoigtEmpiricalAsymmetry' + assert ex.peak.type == 'cwl-pseudo-voigt-berar-baldinozzi-asymmetry' + assert ex.peak.__class__.__name__ == 'CwlPseudoVoigtBerarBaldinozziAsymmetry' def test_base_experiment_restore_switchable_types_is_noop(): @@ -260,7 +260,7 @@ def _load_ascii_data_to_experiment(self, data_path: str) -> None: ex = ConcreteBase(name='ex1', experiment_type=et) - cif = 'data_ex1\n_peak.type "pseudo-voigt + empirical asymmetry"\n' + cif = 'data_ex1\n_peak.type "pseudo-voigt + berar-baldinozzi asymmetry"\n' doc = gemmi.cif.read_string(cif) block = doc.sole_block() diff --git a/tests/unit/easydiffraction/datablocks/experiment/item/test_base_coverage.py b/tests/unit/easydiffraction/datablocks/experiment/item/test_base_coverage.py index ccf27e60f..60b18d71f 100644 --- a/tests/unit/easydiffraction/datablocks/experiment/item/test_base_coverage.py +++ b/tests/unit/easydiffraction/datablocks/experiment/item/test_base_coverage.py @@ -152,7 +152,7 @@ def test_show_peak_profile_types_uses_context_aliases(self, capsys): assert 'Alias' not in out assert 'cwl-pseudo-voigt' not in out assert 'pseudo-voigt' in out - assert 'pseudo-voigt + empirical asymmetry' in out + assert 'pseudo-voigt + berar-baldinozzi asymmetry' in out # ------------------------------------------------------------------ diff --git a/tests/unit/easydiffraction/datablocks/experiment/item/test_enums_coverage.py b/tests/unit/easydiffraction/datablocks/experiment/item/test_enums_coverage.py index 6bcd7842f..cd82f5775 100644 --- a/tests/unit/easydiffraction/datablocks/experiment/item/test_enums_coverage.py +++ b/tests/unit/easydiffraction/datablocks/experiment/item/test_enums_coverage.py @@ -158,7 +158,7 @@ def test_description_pseudo_voigt(self): assert 'pseudo-voigt' in desc.lower() def test_description_pseudo_voigt_empirical_asymmetry(self): - desc = PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_EMPIRICAL_ASYMMETRY.description() + desc = PeakProfileTypeEnum.CWL_PSEUDO_VOIGT_BERAR_BALDINOZZI_ASYMMETRY.description() assert isinstance(desc, str) assert 'asymmetry' in desc.lower() diff --git a/tests/unit/easydiffraction/datablocks/experiment/item/test_factory.py b/tests/unit/easydiffraction/datablocks/experiment/item/test_factory.py index 654c5f26c..f58b117f7 100644 --- a/tests/unit/easydiffraction/datablocks/experiment/item/test_factory.py +++ b/tests/unit/easydiffraction/datablocks/experiment/item/test_factory.py @@ -43,17 +43,30 @@ def test_from_cif_str_restores_non_default_peak_profile_type(): radiation_probe='xray', scattering_type='bragg', ) - expt.peak.type = 'pseudo-voigt + empirical asymmetry' - expt.peak.asym_empir_1 = -0.005 - expt.peak.asym_empir_2 = 0.067 + expt.peak.type = 'pseudo-voigt + berar-baldinozzi asymmetry' + expt.peak.asym_beba_a0 = -0.005 + expt.peak.asym_beba_b0 = 0.067 + expt.peak.asym_beba_a1 = -0.011 + expt.peak.asym_beba_b1 = 0.023 expt.peak.broad_gauss_u = 0.039 cif_str = expt.as_cif + # All four Berar-Baldinozzi coefficient tags must serialise. + for tag in ( + '_peak.asym_beba_a0', + '_peak.asym_beba_b0', + '_peak.asym_beba_a1', + '_peak.asym_beba_b1', + ): + assert tag in cif_str + loaded = ExperimentFactory.from_cif_str(cif_str) - assert loaded.peak.type == 'cwl-pseudo-voigt-empirical-asymmetry' - assert loaded.peak.__class__.__name__ == 'CwlPseudoVoigtEmpiricalAsymmetry' - assert abs(loaded.peak.asym_empir_1.value - (-0.005)) < 1e-6 - assert abs(loaded.peak.asym_empir_2.value - 0.067) < 1e-6 + assert loaded.peak.type == 'cwl-pseudo-voigt-berar-baldinozzi-asymmetry' + assert loaded.peak.__class__.__name__ == 'CwlPseudoVoigtBerarBaldinozziAsymmetry' + assert abs(loaded.peak.asym_beba_a0.value - (-0.005)) < 1e-6 + assert abs(loaded.peak.asym_beba_b0.value - 0.067) < 1e-6 + assert abs(loaded.peak.asym_beba_a1.value - (-0.011)) < 1e-6 + assert abs(loaded.peak.asym_beba_b1.value - 0.023) < 1e-6 assert abs(loaded.peak.broad_gauss_u.value - 0.039) < 1e-6 diff --git a/tests/unit/easydiffraction/io/cif/test_parse.py b/tests/unit/easydiffraction/io/cif/test_parse.py index 35d3b3461..f1d37bbe1 100644 --- a/tests/unit/easydiffraction/io/cif/test_parse.py +++ b/tests/unit/easydiffraction/io/cif/test_parse.py @@ -76,11 +76,17 @@ def test_unquoted_value(self): def test_double_quoted_value(self): from easydiffraction.io.cif.parse import read_cif_str - block = self._block('_peak.profile_type "pseudo-voigt + empirical asymmetry"\n') - assert read_cif_str(block, '_peak.profile_type') == 'pseudo-voigt + empirical asymmetry' + block = self._block('_peak.profile_type "pseudo-voigt + berar-baldinozzi asymmetry"\n') + assert ( + read_cif_str(block, '_peak.profile_type') + == 'pseudo-voigt + berar-baldinozzi asymmetry' + ) def test_single_quoted_value(self): from easydiffraction.io.cif.parse import read_cif_str - block = self._block("_peak.profile_type 'pseudo-voigt + empirical asymmetry'\n") - assert read_cif_str(block, '_peak.profile_type') == 'pseudo-voigt + empirical asymmetry' + block = self._block("_peak.profile_type 'pseudo-voigt + berar-baldinozzi asymmetry'\n") + assert ( + read_cif_str(block, '_peak.profile_type') + == 'pseudo-voigt + berar-baldinozzi asymmetry' + )