pub fn project_mobility_ion(
ion: &IonScalar,
geometry: &SamplingGeometry,
env: &MobilityEnv,
target_p: f64,
step_size: f64,
) -> Vec<(i32, f64)>Expand description
Mobility projection for a single ion: (scan_index, abundance) over the
geometry’s scan grid, scan indices being positions into the ascending
geometry.inv_mobility (per the SamplingGeometry contract).
Each occupied scan’s abundance is the mobility Gaussian’s CDF over that scan’s own bin — the midpoints to its neighbours on the (possibly non-uniform) calibrated grid — so dense/sparse regions are integrated correctly (a single mean spacing would overlap/gap them).
Intensity-contract note: for MobilityModality::None the result is the full
marginal [(0, 1.0)] by definition (no mobility axis, complete integration).
For Tims the per-scan abundances sum to the captured mass, which is <= 1
(grid clipping + target_p truncation) — the two cases are intentionally
different and downstream normalisation must account for it.