pub enum ResolutionFunction {
Gaussian(ResolutionParams),
Tabulated(Arc<TabulatedResolution>),
IkedaCarpenter(Arc<IkedaCarpenter>),
}Expand description
Resolution function: analytical Gaussian, tabulated from Monte Carlo, or analytical Ikeda–Carpenter moderator model.
The Tabulated and IkedaCarpenter variants wrap an Arc so that cloning
(e.g., per-pixel in spatial mapping) is a cheap reference-count bump rather
than a deep copy.
IkedaCarpenter synthesizes a TabulatedResolution at construction and
is applied through the same per-call convolution path as Tabulated
(broaden / broaden_presorted / plan) — only the kernel source differs
(analytic IC pulse vs Monte-Carlo file). This keeps the three-way resolution
cross-validation (Gaussian | tabulated-UDR | Ikeda–Carpenter) fair on the
reference broadening path. Note: IkedaCarpenter does not opt into the
spatial-map surrogate fast-paths (the scalar/cubature plans gate on
Tabulated); it falls back to the general path, which is correct but
unoptimized — see the resolution-calibration notes for the W6 follow-up.
Variants§
Gaussian(ResolutionParams)
Analytical Gaussian resolution from instrument parameters.
Tabulated(Arc<TabulatedResolution>)
Tabulated resolution from Monte Carlo instrument simulation.
IkedaCarpenter(Arc<IkedaCarpenter>)
Analytical Ikeda–Carpenter moderator resolution model.
Implementations§
Source§impl ResolutionFunction
impl ResolutionFunction
Sourcepub fn grid_bounds_ev(&self, energies: &[f64]) -> (f64, f64)
pub fn grid_bounds_ev(&self, energies: &[f64]) -> (f64, f64)
The energies a working grid for the data window energies has to span,
as (low, high) in eV with low ≤ e_min and high ≥ e_max: SAMMY’s
Wdsint limits at the two ends for a Gaussian, the extremes of
TabulatedResolution::gather_bounds_ev over the grid for a sampled
kernel. Returns (0.0, 0.0) for an empty grid.
Sourcepub fn flight_path_m(&self) -> f64
pub fn flight_path_m(&self) -> f64
Flight path used to map true neutron energy to detector time.
Sourcepub fn with_flight_path(
&self,
flight_path_m: f64,
) -> Result<Self, ResolutionParseError>
pub fn with_flight_path( &self, flight_path_m: f64, ) -> Result<Self, ResolutionParseError>
The same resolution function read against a different flight path.
A fit that frees L_scale evaluates the theory on an energy grid built
with L·L_scale. The kernel has to be read against the same flight
path or its width is wrong by that factor — on every family, since all
three convert between energy and detector time through L. No variant
resynthesizes: the flight path is not part of what the kernel IS, only
of the map it is applied through.
§Errors
Returns ResolutionParseError::InvalidFormat if flight_path_m is
not positive and finite.
Sourcepub fn detector_bin_probabilities(
&self,
true_energy_ev: f64,
detector_time_edges_us: &[f64],
timing_offset_us: f64,
) -> Result<Vec<f64>, ResolutionParseError>
pub fn detector_bin_probabilities( &self, true_energy_ev: f64, detector_time_edges_us: &[f64], timing_offset_us: f64, ) -> Result<Vec<f64>, ResolutionParseError>
Probability that one neutron of known true energy is recorded in each supplied detector-time bin.
The tabulated and Ikeda–Carpenter variants are evaluated directly in
detector time. In particular, the analytical IC variant does not pass
through its legacy synthesized TabulatedResolution broadening
table. The older Gaussian energy-broadening model has no physical
detector-time probability law and is therefore rejected rather than
silently treated as one.
timing_offset_us is convention-dependent and NOT transferable
between variants: a mode-centred tabulated (UDR) kernel places its
pulse mode at the nominal arrival, so the offset must absorb the
calibrated moderator mean delay, while the causal Ikeda–Carpenter
pulse rises from the nominal arrival onward and its offset is a pure
clock/detector shift. Swapping response models under one calibrated
offset shifts every bin systematically.
Trait Implementations§
Source§impl Clone for ResolutionFunction
impl Clone for ResolutionFunction
Source§fn clone(&self) -> ResolutionFunction
fn clone(&self) -> ResolutionFunction
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for ResolutionFunction
impl RefUnwindSafe for ResolutionFunction
impl Send for ResolutionFunction
impl Sync for ResolutionFunction
impl Unpin for ResolutionFunction
impl UnsafeUnpin for ResolutionFunction
impl UnwindSafe for ResolutionFunction
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§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