Skip to content

Allow plotting parameters against Q^2 - #271

Merged
henrikjacobsenfys merged 2 commits into
developfrom
feature/plot-parameters-q-squared
Oct 20, 2026
Merged

henrikjacobsenfys merged 2 commits into
developfrom
feature/plot-parameters-q-squared

Conversation

@henrikjacobsenfys

@henrikjacobsenfys henrikjacobsenfys commented Oct 19, 2026 •

Copy link
Copy Markdown
Member

Closes #205.

Diffusion models are usually read off a plot of the widths against Q², where Fickian diffusion (Γ = D·Q²) is a straight line. Both parameter plots now take an x_axis argument:

analysis.plot_parameters(names='Lorentzian width', x_axis='Q^2')
parameter_analysis.plot(x_axis='Q^2')

The default is 'Q', so existing calls are unchanged.

How it works

  • Nothing is recomputed. Data and model values at each Q stay as they are; only the coordinate they are plotted against changes. A Q² coordinate is added to the Dataset, and plopp is told to use it with coords=[x_axis]. The axis label and unit follow from scipp (Q^2 [1/Å^2]).
  • The logic is shared in easydynamics.utils.plotting:
    • Q_AXIS_TRANSFORMS maps each axis name to a function of Q.
    • add_x_axis_coord(data, x_axis) checks the name and returns a copy of the Dataset with that coordinate added.
  • Adding another axis, such as '1/Q', is one entry in Q_AXIS_TRANSFORMS. Both plot methods pick it up automatically.

Tutorial 1 now plots the Lorentzian width against Q² before fitting the Brownian diffusion model.

Notes for review

  • x_axis is placed after names, so positional calls that already passed names still work.
  • test_plot_parameters in test_analysis.py used placeholder objects instead of data. It now uses a real sc.Dataset, since the method reads its Q coordinate.
  • plot_parameters' docstring said kwargs go to plopp.slicer; it now says plopp.plot, which is where they go.
  • Checked with an unmocked ParameterAnalysis.plot of a D·Q² model: data points and model line both land at x = Q² and form a straight line.

🤖 Generated with Claude Code

Analysis.plot_parameters and ParameterAnalysis.plot take an x_axis
argument ('Q' or 'Q^2'). The values at each Q are unchanged; only the
plotted coordinate is transformed, via the shared add_x_axis_coord
helper and its Q_AXIS_TRANSFORMS table, so further axes are one entry.

Closes #205

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@henrikjacobsenfys henrikjacobsenfys added [scope] enhancement Adds/improves features (major.MINOR.patch) [priority] medium Normal/default priority labels Oct 19, 2026
@codecov

codecov Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.15%. Comparing base (762b081) to head (58814d1).
⚠️ Report is 6 commits behind head on develop.

Additional details and impacted files

Impacted file tree graph

@@           Coverage Diff            @@
##           develop     #271   +/-   ##
========================================
  Coverage    98.15%   98.15%           
========================================
  Files           60       60           
  Lines         6066     6074    +8     
  Branches      1022     1023    +1     
========================================
+ Hits          5954     5962    +8     
  Misses          58       58           
  Partials        54       54           
Flag Coverage Δ
unittests 98.15% <100.00%> (+<0.01%) ⬆️

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

Files with missing lines Coverage Δ
src/easydynamics/analysis/analysis.py 97.68% <100.00%> (+<0.01%) ⬆️
src/easydynamics/analysis/parameter_analysis.py 99.27% <100.00%> (+<0.01%) ⬆️
src/easydynamics/utils/plotting.py 89.74% <100.00%> (+1.86%) ⬆️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@henrikjacobsenfys
henrikjacobsenfys merged commit 6d51c0b into develop Oct 20, 2026
33 checks passed
henrikjacobsenfys added a commit that referenced this pull request Oct 20, 2026
* update pixi (#266)

* Adding Chudley-Elliott Jump Diffusion Model (#246)

* Add ChudleyElliotJumpDiffusion model and corresponding tests

* Enhance ChudleyElliotJumpDiffusion model documentation and tests; all checks passed

* Fix: replace Chudley-Elliot with Chudley-Elliott (propegated from spelling mistake in Mantid documentation)

* Fix: Add missing ChudleyElliottJumpDiffusion to public API and module exports

* Fix: Improve test clarity and update unit handling in ChudleyElliottJumpDiffusion tests

* Fix: Implement minimum width for residence time in ChudleyElliottJumpDiffusion model and update tests

* Fix: Update error handling in ChudleyElliottJumpDiffusion model and improve test assertions

* chore: pixi update and linting

* Add jump diffusion tutorials and Chudley-Elliott citation

- Add Jump Translational and Chudley-Elliott sections to
  diffusion_model.ipynb, with subheaders for each model
- Name the models in the Diffusion model entry of the tutorials index
- Add the Chudley and Elliott (1961) reference and "See also the
  tutorials" to the ChudleyElliottJumpDiffusion docstring
- Remove the tutorials TODO (#273)

* Speed up StretchedExponential evaluation (#268)

* Speed up StretchedExponential quadrature 3-4x

Evaluate the exp-sinh quadrature in cache-sized blocks with in-place
temporaries, and drop nodes whose decaying exponent provably underflows
exp to exactly zero. Results are unchanged to rounding and stay bitwise
independent of block boundaries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Interpolate the StretchedExponential profile by default

Add an interpolate flag (default True) that evaluates G_beta from a
cached cubic-spline table of log(G / G(0)) on y = asinh(w / w_ref)
instead of running the quadrature at every energy. Tables are cached
per beta and grow on a fixed lattice, so fits stay smooth under
finite-difference Jacobian steps. Accuracy is ~1e-7 of the peak for all
beta; interpolate=False keeps the ~1e-11 quadrature.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Add example, run pixi update

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Allow plotting parameters against Q^2 (#271)

* Allow plotting parameters against Q^2

Analysis.plot_parameters and ParameterAnalysis.plot take an x_axis
argument ('Q' or 'Q^2'). The values at each Q are unchanged; only the
plotted coordinate is transformed, via the shared add_x_axis_coord
helper and its Q_AXIS_TRANSFORMS table, so further axes are one entry.

Closes #205

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Show the Lorentzian width against Q^2 in tutorial 1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Align the data and residuals axes in plots with residuals (#270)

slicerplot_with_residuals drew the residuals in a second Matplotlib
figure below the main one. Each figure was tight_layout'ed on its own,
so the axes' left edges depended on each panel's y tick label and y
label widths and did not line up.

Draw both panels as two axes of one figure with a shared x axis, so
they are laid out together and share x limits, scale and zoom. figsize
now sizes the whole figure, and the residuals panel hides its log
buttons, since logX is shared and logY does not suit residuals.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: easyscience[bot] <2476259+easyscience[bot]@users.noreply.github.com>
Co-authored-by: Henrik Jacobsen <henrik.jacobsen.fys@gmail.com>
Co-authored-by: mark <191927387+markbujehein@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[priority] medium Normal/default priority [scope] enhancement Adds/improves features (major.MINOR.patch)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant