Skip to content

Refactor switchable experiment, analysis, and display categories#157

Merged
AndrewSazonov merged 47 commits intodevelopfrom
redesign
Apr 27, 2026
Merged

Refactor switchable experiment, analysis, and display categories#157
AndrewSazonov merged 47 commits intodevelopfrom
redesign

Conversation

@AndrewSazonov
Copy link
Copy Markdown
Member

This PR it refactors the experiment, analysis, and project category architecture around explicit switchable categories, updates related calculator and CIF serialization behavior, and refreshes tutorials/docs to match the redesigned API.

Changes

  • Updated the analysis workflow with a clearer fit category API, replacing the old fit_mode interface.
  • Added new experiment calculation and project display settings for more explicit project configuration.
  • Improved time-of-flight support, including TOF peak profile handling and CrysFML integration.
  • Refreshed tutorials and user guide examples to match the redesigned API.
  • Added a new BEER at ESS tutorial.
  • Improved CIF output formatting for cleaner numeric values and uncertainties.
  • Updated dependencies and expanded test coverage.

@AndrewSazonov AndrewSazonov requested a review from Copilot April 27, 2026 11:30
@AndrewSazonov AndrewSazonov self-assigned this Apr 27, 2026
@AndrewSazonov AndrewSazonov added the [scope] enhancement Adds/improves features (major.MINOR.patch) label Apr 27, 2026
@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 27, 2026

Codecov Report

❌ Patch coverage is 82.00000% with 90 lines in your changes missing coverage. Please review.
✅ Project coverage is 88.30%. Comparing base (883c384) to head (59fc5b0).
⚠️ Report is 56 commits behind head on develop.

Files with missing lines Patch % Lines
...easydiffraction/analysis/categories/fit/default.py 71.26% 22 Missing and 3 partials ⚠️
...rc/easydiffraction/analysis/calculators/crysfml.py 55.81% 13 Missing and 6 partials ⚠️
...locks/experiment/categories/calculation/default.py 82.75% 6 Missing and 4 partials ⚠️
...n/datablocks/experiment/categories/peak/factory.py 76.31% 8 Missing and 1 partial ⚠️
src/easydiffraction/analysis/calculators/cryspy.py 20.00% 3 Missing and 5 partials ⚠️
...ydiffraction/project/categories/display/default.py 90.32% 3 Missing and 3 partials ⚠️
...easydiffraction/datablocks/experiment/item/base.py 92.18% 2 Missing and 3 partials ⚠️
src/easydiffraction/io/cif/serialize.py 86.48% 2 Missing and 3 partials ⚠️
...c/easydiffraction/analysis/categories/fit/enums.py 0.00% 1 Missing ⚠️
...asydiffraction/datablocks/experiment/item/enums.py 95.65% 0 Missing and 1 partial ⚠️
... and 1 more
Additional details and impacted files
@@             Coverage Diff             @@
##           develop     #157      +/-   ##
===========================================
+ Coverage    82.26%   88.30%   +6.04%     
===========================================
  Files           88      151      +63     
  Lines         5451     8698    +3247     
  Branches       454      891     +437     
===========================================
+ Hits          4484     7681    +3197     
+ Misses         802      722      -80     
- Partials       165      295     +130     
Flag Coverage Δ
integration 74.91% <75.20%> (+4.96%) ⬆️
unittests 79.24% <75.20%> (+6.80%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors EasyDiffraction’s experiment/project/analysis architecture around explicit switchable categories (notably analysis.fit, experiment calculation, and project-level display), updates CIF serialization accordingly, and refreshes tests/tutorials to match the new API surface.

Changes:

  • Replace the legacy analysis fit_mode / current_minimizer surface with a unified analysis.fit category (mode + minimizer + callable fit entry-point).
  • Introduce explicit switchable categories for experiment calculation selection (experiment.calculation) and project display configuration (project.display), persisted via CIF.
  • Update CIF numeric formatting (more readable values + uncertainty formatting) and refresh unit/integration tests + docs/tutorials to match.

Reviewed changes

Copilot reviewed 130 out of 132 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
tests/unit/easydiffraction/test___main__.py Updates CLI fit test expectations for the new display API and removed summary call.
tests/unit/easydiffraction/summary/test_summary_details.py Adapts summary tests to new analysis/experiment configuration locations.
tests/unit/easydiffraction/summary/test_summary.py Updates minimizer access pattern to analysis.fit.minimizer_type.
tests/unit/easydiffraction/project/test_project_load.py Verifies round-tripping of fit config and new display configuration.
tests/unit/easydiffraction/project/categories/display/test_factory.py Adds unit tests for the new DisplayFactory.
tests/unit/easydiffraction/project/categories/display/test_default.py Adds unit tests for default project Display category behavior and CIF restore.
tests/unit/easydiffraction/io/cif/test_serialize_more.py Adjusts serialization expectations for new numeric formatting + fit CIF keys.
tests/unit/easydiffraction/io/cif/test_serialize.py Adds/updates tests for parameter formatting, including uncertainty rendering.
tests/unit/easydiffraction/datablocks/structure/categories/test_atom_site_aniso.py Updates aniso ADP sync/CIF expectations (omit iso atoms from aniso loop).
tests/unit/easydiffraction/datablocks/experiment/test_collection.py Updates experiment dummy type to include scattering_type.
tests/unit/easydiffraction/datablocks/experiment/item/test_enums_coverage.py Updates peak-profile enum coverage for canonical tags and TOF additions.
tests/unit/easydiffraction/datablocks/experiment/item/test_bragg_sc_coverage.py Adjusts extinction “show” API naming and expectations.
tests/unit/easydiffraction/datablocks/experiment/item/test_base_coverage.py Updates calculator/peak-profile “show” API calls and calculation access.
tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_tof.py Adds enum-description consistency assertions for TOF peak classes.
tests/unit/easydiffraction/datablocks/experiment/categories/peak/test_factory.py Updates peak factory tests for canonical tags + context-local aliasing.
tests/unit/easydiffraction/datablocks/experiment/categories/instrument/test_tof.py Updates expected default TOF quadratic correction value.
tests/unit/easydiffraction/datablocks/experiment/categories/calculation/test_factory.py Adds unit tests for new experiment CalculationFactory.
tests/unit/easydiffraction/datablocks/experiment/categories/calculation/test_default.py Adds unit tests for Calculation category delegation + CIF restore.
tests/unit/easydiffraction/datablocks/experiment/categories/background/test_base.py Updates background CIF numeric formatting expectations.
tests/unit/easydiffraction/core/test_parameters.py Updates expected CIF string rendering for uncertainty formatting.
tests/unit/easydiffraction/analysis/test_analysis_coverage.py Updates coverage tests to use analysis.fit.minimizer_type.
tests/unit/easydiffraction/analysis/test_analysis.py Updates analysis tests to new analysis.fit API and help output.
tests/unit/easydiffraction/analysis/categories/test_fit_mode.py Removes tests for the deleted fit_mode category.
tests/unit/easydiffraction/analysis/categories/test_fit.py Adds unit tests for the new fit category (mode + minimizer).
tests/unit/easydiffraction/analysis/calculators/test_cryspy.py Adds a TOF pseudo-Voigt CIF-section test for Cryspy integration.
tests/integration/scipp-analysis/dream/test_package_import.py Makes version-check integration test resilient to newer upstream releases.
tests/integration/fitting/test_switch-calculator.py Updates calculator switching to the new experiment.calculation surface.
tests/integration/fitting/test_project_load.py Updates fit-config round-trip assertions to analysis.fit.
tests/integration/fitting/test_powder-diffraction_time-of-flight.py Updates minimizer configuration to analysis.fit.minimizer_type.
tests/integration/fitting/test_powder-diffraction_joint-fit.py Updates joint-fit mode/minimizer configuration to analysis.fit.
tests/integration/fitting/test_powder-diffraction_constant-wavelength.py Updates minimizer configuration to analysis.fit.minimizer_type.
tests/integration/fitting/test_plotting.py Updates plotting entry point to project.display.plotter.
tests/integration/fitting/test_multi.py Updates multi-workflow integration tests to new fit + calculation API.
tests/integration/fitting/test_exploration_help.py Updates switchable-category “show” APIs and calculation access paths.
tests/integration/fitting/test_aniso_adp_fitting.py Updates expectation: iso atoms omitted (not ?) from aniso CIF loop.
tests/integration/fitting/test_analysis_display.py Updates minimizer “show” calls to analysis.fit.show_minimizer_types.
tests/integration/fitting/conftest.py Updates fitted-project fixture to set minimizer via analysis.fit.
tests/functional/test_switchable_categories.py Updates functional expectations for analysis.fit and calculation accessor.
tests/functional/test_adp_switching.py Updates CIF expectation: mixed ADP excludes iso atoms from aniso loop.
src/easydiffraction/utils/utils.py Updates the external data index ref + hash.
src/easydiffraction/summary/summary.py Updates summary rendering to pull calculator/minimizer from new categories.
src/easydiffraction/project/project.py Introduces project-level display category and persists it in project.cif.
src/easydiffraction/project/categories/display/factory.py Adds factory for project display categories.
src/easydiffraction/project/categories/display/default.py Implements default project display category with plotter/tabler selection + CIF IO.
src/easydiffraction/project/categories/display/init.py Exposes Display and DisplayFactory for registration/import.
src/easydiffraction/project/categories/init.py Adds project categories package marker.
src/easydiffraction/io/cif/serialize.py Updates numeric formatting, adds project config CIF (incl. display), and refactors analysis CIF to _fit.*.
src/easydiffraction/datablocks/structure/item/base.py Changes aniso sync to include only anisotropic atoms and remove iso entries.
src/easydiffraction/datablocks/structure/categories/atom_sites/default.py Triggers aniso sync when switching ADP type from anisotropic to isotropic.
src/easydiffraction/datablocks/structure/categories/atom_site_aniso/default.py Removes legacy “question-mark rows for iso atoms” CIF behavior.
src/easydiffraction/datablocks/experiment/item/factory.py Normalizes switchable type descriptors after CIF loading.
src/easydiffraction/datablocks/experiment/item/enums.py Renames peak-profile enum tags to canonical, mode-specific values and adds TOF pV.
src/easydiffraction/datablocks/experiment/item/bragg_pd.py Updates background support filtering and show method to use calculation category and new table rendering.
src/easydiffraction/datablocks/experiment/item/base.py Introduces experiment calculation category, CIF restore, and updated show APIs.
src/easydiffraction/datablocks/experiment/categories/peak/total.py Aligns total-scattering peak metadata with canonical peak-profile enum tags.
src/easydiffraction/datablocks/experiment/categories/peak/tof.py Adds TOF pseudo-Voigt profile and aligns TOF peak tags/descriptions with enums.
src/easydiffraction/datablocks/experiment/categories/peak/factory.py Adds context-local aliasing and enhanced supported-type printing.
src/easydiffraction/datablocks/experiment/categories/peak/cwl_mixins.py Adjusts FCJ asymmetry defaults.
src/easydiffraction/datablocks/experiment/categories/peak/cwl.py Aligns CWL peak tags/descriptions with canonical peak-profile enum values.
src/easydiffraction/datablocks/experiment/categories/peak/init.py Exports the new TOF pseudo-Voigt peak class.
src/easydiffraction/datablocks/experiment/categories/instrument/tof.py Changes default TOF quadratic correction to 0.0.
src/easydiffraction/datablocks/experiment/categories/data/total_pd.py Updates calculator access to experiment.calculation.calculator.
src/easydiffraction/datablocks/experiment/categories/data/bragg_sc.py Updates calculator access to experiment.calculation.calculator.
src/easydiffraction/datablocks/experiment/categories/data/bragg_pd.py Updates calculator access to experiment.calculation.calculator.
src/easydiffraction/datablocks/experiment/categories/calculation/factory.py Adds factory for experiment calculation categories.
src/easydiffraction/datablocks/experiment/categories/calculation/default.py Implements calculation category (calculator type + delegation to parent).
src/easydiffraction/datablocks/experiment/categories/calculation/init.py Exposes Calculation and CalculationFactory.
src/easydiffraction/analysis/sequential.py Updates sequential fitting template to read minimizer/calculator from new categories.
src/easydiffraction/analysis/categories/fit_mode/fit_mode.py Removes legacy fit-mode category implementation.
src/easydiffraction/analysis/categories/fit_mode/init.py Removes legacy fit-mode exports.
src/easydiffraction/analysis/categories/fit/factory.py Renames/replaces fit-mode factory with FitFactory.
src/easydiffraction/analysis/categories/fit/enums.py Updates fit-mode enum behavior (returns empty string for unknown).
src/easydiffraction/analysis/categories/fit/default.py Adds Fit category: minimizer + mode + show helpers + callable run entry-point + CIF restore hook.
src/easydiffraction/analysis/categories/fit/init.py Exposes new fit category components.
src/easydiffraction/analysis/calculators/cryspy.py Updates TOF peak CIF rendering and peak-update logic; removes prior cryspy DWF monkey-patch.
src/easydiffraction/analysis/calculators/crysfml.py Adds TOF calculation path, refactors experiment dict construction and mappings.
src/easydiffraction/analysis/analysis.py Rewires analysis to use fit category and makes fit execution internal (_run_fit).
src/easydiffraction/main.py Updates CLI to use project.display.plotter and comments out summary output.
pyproject.toml Adds pytest-benchmark to dev dependencies.
docs/mkdocs.yml Reorganizes tutorial navigation and adds BEER tutorial entry.
docs/docs/user-guide/first-steps.md Updates examples to new calculation/display/minimizer APIs.
docs/docs/user-guide/analysis-workflow/project.md Updates project/experiment/analysis CIF examples for new _display + _fit + _calculation keys.
docs/docs/user-guide/analysis-workflow/analysis.md Updates analysis workflow docs for analysis.fit, calculation category, and display usage.
docs/docs/tutorials/index.md Reorganizes tutorial index and adds a Simulated Data section.
docs/docs/tutorials/index.json Adds tutorial metadata for new BEER tutorial.
docs/docs/tutorials/ed-9.py Updates tutorial to use project.display.plotter and new show methods.
docs/docs/tutorials/ed-9.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-8.py Updates tutorial to new show methods and analysis.fit API and display plotting.
docs/docs/tutorials/ed-8.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-7.py Updates tutorial plotting/show methods to new display API.
docs/docs/tutorials/ed-7.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-6.py Updates tutorial plotting/show methods to new display API.
docs/docs/tutorials/ed-6.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-5.py Updates tutorial plotting/show methods to new display API.
docs/docs/tutorials/ed-5.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-4.py Updates tutorial to analysis.fit API and display plotting.
docs/docs/tutorials/ed-4.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-3.py Updates tutorial to new show methods, analysis.fit, and display plotting.
docs/docs/tutorials/ed-20.py Adds new BEER-at-ESS tutorial (simulated TOF data workflow).
docs/docs/tutorials/ed-2.py Updates tutorial to new minimizer/show/plotting APIs.
docs/docs/tutorials/ed-2.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-18.py Updates plotting API usage to project.display.plotter.
docs/docs/tutorials/ed-18.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-17.py Updates tutorial minimizer and plotting APIs to analysis.fit/display.
docs/docs/tutorials/ed-17.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-16.py Updates tutorial to analysis.fit and display plotting API.
docs/docs/tutorials/ed-16.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-15.py Updates tutorial to analysis.fit and display plotting API.
docs/docs/tutorials/ed-15.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-14.py Updates tutorial to analysis.fit and display plotting API.
docs/docs/tutorials/ed-14.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-12.py Updates tutorial plotting/show methods to new display API.
docs/docs/tutorials/ed-12.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-11.py Updates tutorial plotting configuration to project.display.plotter.
docs/docs/tutorials/ed-11.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-10.py Updates tutorial plotting to project.display.plotter.
docs/docs/tutorials/ed-10.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/docs/tutorials/ed-1.py Updates tutorial plotting to project.display.plotter.
docs/docs/tutorials/ed-1.ipynb Regenerated notebook reflecting updated tutorial API usage.
docs/architecture/package-structure-short.md Updates documented package structure to include new categories.
docs/architecture/package-structure-full.md Updates detailed package structure listing for new categories/classes.
docs/architecture/issues_open.md Updates open-issues text to refer to new APIs and removes resolved calculator persistence item.
docs/architecture/issues_closed.md Updates closed-issues log with calculator persistence + other historical notes.

Comment thread tests/integration/fitting/test_exploration_help.py
Comment thread tests/integration/fitting/test_exploration_help.py
Comment thread tests/integration/fitting/test_exploration_help.py
Comment thread src/easydiffraction/datablocks/experiment/item/enums.py
Comment thread src/easydiffraction/analysis/calculators/cryspy.py
Comment thread src/easydiffraction/__main__.py
Comment thread docs/architecture/issues_closed.md
@AndrewSazonov AndrewSazonov merged commit 6bf3deb into develop Apr 27, 2026
2 checks passed
@AndrewSazonov AndrewSazonov deleted the redesign branch April 27, 2026 11:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[scope] enhancement Adds/improves features (major.MINOR.patch)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants