API Reference¶
Config¶
Configuration dataclass - runtime parameters for the QENS analysis pipeline.
Holds every tunable knob in one place: file lists, Q range, energy window, binning, MCMC settings and output directory.
Save/restore as JSON for reuse.
- class qens.config.Config(files_to_fit=<factory>, primary_file='', resolution_file=None, frozen_temp_threshold=270, q_min=0.3, q_max=2.5, energy_window=1.25, n_q_bins=12, n_walkers=32, n_warmup=500, n_keep=2000, thin=5, n_map_starts=30, random_seed=42, save_dir='qens_results')[source]¶
Bases:
objectRuntime parameters for the analysis pipeline.
- Parameters:
- files_to_fit¶
Filenames to load (relative to
data_dirpassed toqens.io.load_dataset()).
- resolution_file¶
Frozen-sample file used as resolution function. If None, the loader auto-picks any T ≤
frozen_temp_thresholdincoherent file.- Type:
str | None
- q_min, q_max
Q range in Å⁻¹ over which the fit is performed.
- Type:
- energy_window¶
Half-width of the ω window in meV used for the joint fit (paper found ±1.25 meV needed for benzene anisotropy).
- Type:
- n_warmup, n_keep
Burn-in and production steps per walker.
- Type:
Fitting¶
Inference primitives: likelihood, prior, MAP search, plus utilities to bin the data and build per Q bin resolution kernels.
- qens.fitting.build_data_bins(d, cfg=None)[source]¶
Bin a dataset into “n_q_bins “ equal occupancy Q-bins.
- Parameters:
- Return type:
- Returns:
list of “(omega, spec, errs, q_centre) “ tuples — one per Q-bin —
where “omega “ is restricted to ±cfg.energy_window and “q_centre “
is the mean Q of the detectors in the bin.
- qens.fitting.build_resolution_bins(d_ref, cfg=None, q_centres=None)[source]¶
Build a measured per Q bin resolution kernel from a frozen sample.
For each Q bin in the data, average the frozen sample spectra at detectors with similar Q to produce a measured resolution function. Use this kernel inside the forward model, it captures the Lorentzian wings of the real instrument that a pure Gaussian fit misses.
- Parameters:
d_ref (dict) – Resolution reference dataset (typically the frozen low T inc file). Must already have “e “, “good “, “q “, “data “.
cfg (Config)
q_centres (array, optional) – If given, build kernels at these Q centres instead of percentile bins. Useful when matching the binning of a different (target) dataset.
- Return type:
- Returns:
list of 1D arrays, one per Q-bin, on the same ω grid as
- qens.fitting.extract_hwhm(d, cfg=None)[source]¶
Fit “elastic + Lorentzian + bg “ independently in each Q-bin.
- qens.fitting.save_hwhm_csv(q_centres, hwhm, hwhm_err, eisf, save_dir)[source]¶
Write the HWHM table to “<save_dir>/hwhm_table.csv “.
- qens.fitting.log_likelihood(params, data_bins, sigma_res, model='anisotropic_rotor', **extras)[source]¶
Joint X^2 log-likelihood across all Q-bins.
For each bin a 2 column NNLS fits “[overall_amp, flat_bg] “, so the physics determined Bessel weight ratios inside the forward model are preserved as a global Q-constraint.
- Parameters:
params (array) – Parameter vector matching the registered model.
data_bins (list of (omega, spec, errs, q)) – From
build_data_bins().sigma_res (float | array | list[array]) – Resolution: scalar Gaussian , single measured kernel, or one kernel per Q-bin (list of arrays).
model (str) – Name of a registered forward model. Default “”anisotropic_rotor” “.
extras – Forwarded to the model’s “predict “ callable.
- Return type:
- qens.fitting.log_prior(params, model='anisotropic_rotor')[source]¶
Log-prior: 0 inside the registered model’s prior box, “-inf “ outside.
- qens.fitting.log_posterior(params, data_bins, sigma_res, model='anisotropic_rotor', **extras)[source]¶
Convenience wrapper: prior + likelihood.
Models¶
Physical models for QENS line shape analysis.
This subpackage is structured so that:
qens.models.lineshapesprovides the building blocks(Lorentzian, Gaussian).
qens.models.translationcontains models for translationaldiffusion (Fickian, Chudley-Elliott, Singwi-Sjölander).
qens.models.rotationcontains models for rotational diffusion(isotropic and anisotropic axial rotor).
qens.models.forwardassembles a full forward model
S(Q,ω) = exp(-Q²<u²>/3) · [translation x rotation] x resolution.qens.models.registrylets users register their own forwardmodels without touching the core code.
For a typical user, from qens.models import predict_sqw is enough.
- qens.models.lorentz(omega, gamma)[source]¶
Area normalised Lorentzian, half-width-at-half-maximum
gamma.\[L(\omega; \Gamma) = \frac{1}{\pi} \frac{\Gamma}{\omega^2 + \Gamma^2}\]
- qens.models.gnorm(omega, sigma)[source]¶
Area-normalised Gaussian with standard deviation
sigma.\[G(\omega; \sigma) = \frac{1}{\sigma\sqrt{2\pi}} \exp\!\left( -\frac{\omega^2}{2\sigma^2} \right)\]For FWHM use
sigma = FWHM / 2.355.
- qens.models.lorentz_sum(omega, weights, gammas)[source]¶
Weighted sum of Lorentzians:
Σ w_i L(ω; Γ_i).Vectorised — useful for evaluating multi-channel rotational models on a Q-grid efficiently.
- Parameters:
omega (array, shape (N,))
weights (array, shape (M,))
gammas (array, shape (M,))
- Return type:
- Returns:
array, shape (N,)
- qens.models.rot_widths_isotropic(d_r)[source]¶
HWHMs for the isotropic axial-rotor model.
Returns “(Γ_1, Γ_2)” in meV, the widths of the l = 1 and l = 2 Lorentzian channels:
\[\Gamma_1 = 2 \hbar D_r,\quad \Gamma_2 = 6 \hbar D_r\]
- qens.models.rot_widths_anisotropic(d_t, d_s)[source]¶
HWHMs for the anisotropic axial-rotor model (oblate top, e.g. benzene).
Returns (Γ_1, Γ_2, Γ_3)” in meV
- qens.models.bessel_weights(q, R=2.48)[source]¶
Spherical-Bessel weights “(j₀², j₁², j₂²)” at this Q.
These weight the l = 0, 1, 2 channels of the rotational structure factor. “j₀²(QR)” is the elastic-rotational weight (the EISF in the rotation-only limit). At low Q, j₀² → 1; at high Q it falls off and j₂² dominates.
- qens.models.predict_sqw(omega, q, *, d_translation, u2, rotation, rotation_model='anisotropic', sigma_res, radius=2.48)[source]¶
Predict the resolution-convolved S_inc(Q, ω) for one Q-bin.
- Parameters:
omega (array, shape (N,)) – Energy grid in meV. Must be uniformly spaced.
q (float) – Momentum transfer in Å⁻¹.
d_translation (float) – Translational self-diffusion coefficient D* in Ų/ps.
u2 (float) – Mean-square displacement ⟨u²⟩ in Ų (Debye-Waller factor).
rotation (tuple) – “(D_r,)” for isotropic, “(D_t, D_s)” for anisotropic. Both in ps⁻¹.
rotation_model (str) – “”isotropic”” or “”anisotropic””.
sigma_res (float or array) – Resolution: Gaussian sigma in meV (scalar) or measured kernel (1-d array same length as “omega”).
radius (float) – Radius of gyration in Å. Default 2.48 (benzene).
- Return type:
- Returns:
array, shape (N,) – Predicted shape, unscaled — the inference layer fits an overall amplitude and a flat background per Q-bin via NNLS, so this function only encodes the physics.
- class qens.models.ForwardModel(name, param_names, prior_lo, prior_hi, predict, extras=None)[source]¶
Bases:
objectEncapsulates a forward-model definition for the inference layer.
A ForwardModel knows:
its name (for logging) the parameter names (in order) the prior box (uniform, “[lo, hi]” per parameter) how to predict S(Q,ω) for one Q-bin given a parameter vector
Custom forward models register here (see
qens.models.registry).- Parameters:
- qens.models.register_model(name, *, param_names, prior_lo, prior_hi, predict, extras=None, overwrite=False)[source]¶
Add a new forward model to the registry, or replace an existing one.
- Parameters:
name (str) – Identifier used everywhere (in
qens.fitting.find_map(),qens.sampling.run_mcmc(), etc.).param_names (tuples) – Same length. Defines a uniform prior box.
prior_lo (tuples) – Same length. Defines a uniform prior box.
prior_hi (tuples) – Same length. Defines a uniform prior box.
predict (callable) –
predict(omega, q, params, sigma_res, **extras) -> array.extras (dict, optional) – Extra kwargs passed to
predict(e.g.radiusfor a rotor).overwrite (bool) – Required to overwrite an existing model.
- Return type:
- Returns:
The registered
ForwardModelinstance.