pub struct TransmissionFitModel { /* private fields */ }Expand description
Forward model for fitting isotopic areal densities from transmission data.
The model computes T(E) for a set of isotopes with variable areal densities. Each isotope’s resonance data and the energy grid are fixed; only the areal densities are adjusted during fitting.
Optionally, the sample temperature can also be fitted by setting
temperature_index to the parameter slot holding the temperature value.
When temperature_index is Some(idx), the Doppler broadening kernel
is recomputed at params[idx] when the temperature changes (cached
across calls at the same temperature), and the analytical Jacobian
provides density columns directly plus a single FD column for temperature.
instrument uses Arc so that parallel pixel loops can share one copy
of a potentially large tabulated resolution kernel via cheap
reference-count increments instead of deep-cloning per pixel.
Implementations§
Source§impl TransmissionFitModel
impl TransmissionFitModel
Sourcepub fn new(
energies: Vec<f64>,
resonance_data: Vec<ResonanceData>,
temperature_k: f64,
instrument: Option<Arc<InstrumentParams>>,
density_mapping: (Vec<usize>, Vec<f64>),
temperature_index: Option<usize>,
external_base_xs: Option<Arc<Vec<Vec<f64>>>>,
) -> Result<Self, FittingError>
pub fn new( energies: Vec<f64>, resonance_data: Vec<ResonanceData>, temperature_k: f64, instrument: Option<Arc<InstrumentParams>>, density_mapping: (Vec<usize>, Vec<f64>), temperature_index: Option<usize>, external_base_xs: Option<Arc<Vec<Vec<f64>>>>, ) -> Result<Self, FittingError>
Create a validated TransmissionFitModel.
When external_base_xs is Some, uses those precomputed unbroadened
cross-sections instead of computing them (expensive Reich-Moore).
spatial_map precomputes once for all pixels and passes them here.
§Errors
Returns FittingError::InvalidConfig if temperature_index overlaps
with density_indices, or if external_base_xs has a mismatched shape.
Trait Implementations§
Source§impl FitModel for TransmissionFitModel
impl FitModel for TransmissionFitModel
Source§fn analytical_jacobian(
&self,
params: &[f64],
free_param_indices: &[usize],
y_current: &[f64],
) -> Option<FlatMatrix>
fn analytical_jacobian( &self, params: &[f64], free_param_indices: &[usize], y_current: &[f64], ) -> Option<FlatMatrix>
Analytical Jacobian for the transmission model with temperature fitting.
When base_xs is available (temperature fitting path):
- Density columns:
∂T/∂nᵢ = -σᵢ(E)·T(E)using cached broadened XS from the most recentevaluate()call. Same formula asPrecomputedTransmissionModel, zero extra broadening calls. - Temperature column: analytical chain rule via on-demand
∂σ/∂T.∂T/∂T_temp = -T(E) · Σᵢ nᵢ·rᵢ·∂σᵢ/∂T. The derivative is computed once per temperature viabroadened_cross_sections_with_analytical_derivative_from_base()and cached until temperature changes. Costs one broadening call per Jacobian (same as the old FD approach, but exact).
Returns None for the no-base_xs path (full forward model), which
falls back to finite-difference in the LM solver.
Analytical Jacobian for density and temperature fitting.
Without resolution: ∂T/∂N_g = -(Σ_{i∈g} rᵢ σᵢ) · T ∂T/∂Temp = -T · Σᵢ nᵢ rᵢ ∂σᵢ/∂T
With resolution (R is a linear operator): ∂T_obs/∂N_g = R[-(Σ_{i∈g} rᵢ σᵢ) · T] ∂T_obs/∂Temp = R[-T · Σᵢ nᵢ rᵢ ∂σᵢ/∂T]
Returns None only when base_xs is not available (full forward
model path falls back to FD) or when the temperature cache is stale.
Source§impl ForwardModel for TransmissionFitModel
impl ForwardModel for TransmissionFitModel
Source§fn predict(&self, params: &[f64]) -> Result<Vec<f64>, FittingError>
fn predict(&self, params: &[f64]) -> Result<Vec<f64>, FittingError>
Auto Trait Implementations§
impl !Freeze for TransmissionFitModel
impl !RefUnwindSafe for TransmissionFitModel
impl !Send for TransmissionFitModel
impl !Sync for TransmissionFitModel
impl Unpin for TransmissionFitModel
impl UnsafeUnpin for TransmissionFitModel
impl UnwindSafe for TransmissionFitModel
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more