qens.models¶
Top-level imports¶
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.
Submodules¶
qens.models.lineshapes¶
Normalised lineshape primitives.
- qens.models.lineshapes.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.lineshapes.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.lineshapes.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.translation¶
Translational diffusion HWHM models.
qens.models.rotation¶
Rotational structure-factor models for axially symmetric molecules.
- qens.models.rotation.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.rotation.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.rotation.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.forward¶
Full forward model for QENS line shape inference.
- qens.models.forward.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.forward.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.registry¶
Forward-model registry.
- qens.models.registry.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.