pub fn forward_model_from_base_xs(
energies: &[f64],
base_xs: &[Vec<f64>],
resonance_data: &[ResonanceData],
thicknesses: &[f64],
temperature_k: f64,
instrument: Option<&InstrumentParams>,
) -> Result<Vec<f64>, TransmissionError>Expand description
Compute a transmission spectrum from precomputed unbroadened cross-sections.
Applies Doppler broadening and Beer-Lambert using cached base XS, then
resolution broadening on the total transmission (issue #442). This skips
the expensive Reich-Moore calculation, making it suitable for use inside
TransmissionFitModel::evaluate() when temperature is a free parameter.
The full pipeline runs on the auxiliary extended grid (boundary
extension + resonance fine-structure points) so that Doppler AND resolution
broadening have adequate quadrature support and correct boundary handling;
the data-grid points are extracted LAST. This mirrors the non-cached
forward_model and broadened_cross_sections_for_transmission exactly
— previously this cached path collapsed σ to the coarse data grid before
resolution broadening, degrading the convolution near the grid edges and
around narrow resonances.
Pipeline:
- Per isotope: build σ on the extended grid (cached data-grid values + freshly-evaluated auxiliary points), Doppler-broaden on the extended grid
- Accumulate total attenuation on the extended grid: Σᵢ nᵢ·σ_{D,i}
- Beer-Lambert: T = exp(−attenuation) on the extended grid
- Resolution: T_broad = R ⊗ T on the extended grid (when instrument present)
- Extract the data-grid points