#![warn(missing_docs)]
pub mod average;
pub mod box_centroid;
pub mod codec;
#[cfg(feature = "config")]
pub mod config;
pub mod crop;
pub mod dia_ms1;
pub mod dia_window;
pub mod error;
pub mod filter;
pub mod frame;
pub mod halo;
pub mod mobility;
pub mod msms;
mod neighbor;
pub mod overlap;
pub mod params;
pub mod polygon;
pub mod smooth;
pub mod watershed;
pub mod writer;
#[cfg(feature = "config")]
pub mod batch;
pub mod output;
pub mod provenance;
mod tdf;
pub mod validation;
pub use error::{DecodeError, DnoiseError, Result};
pub use mobility::MobilityScale;
pub use params::{
BoxCentroidParams, CropParams, DdaWindowParams, DiaMs1WindowParams, DiaWindowParams,
FilterParams, HaloParams, Ms1PolygonParams, MsmsFilterParams, NeighborParams, SmoothParams,
Stages, WatershedParams,
};
pub use writer::{
Calibration, DecodedFrame, DenoiseStats, FrameCtx, Progress, RunContext, RunOptions,
SampleSpec, denoise, denoise_in_place, denoise_with_options, denoise_with_progress,
process_frame_decoded,
};
pub use crop::CropGate;
use std::path::Path;
use timsrust::converters::ConvertableDomain;
use timsrust::readers::MetadataReader;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Acquisition {
DdaPasef,
DiaPasef,
PrmPasef,
Mixed,
Ms1Only,
Unknown,
}
impl std::fmt::Display for Acquisition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
Self::DdaPasef => "ddaPASEF",
Self::DiaPasef => "diaPASEF",
Self::PrmPasef => "prm-PASEF",
Self::Mixed => "mixed acquisition",
Self::Ms1Only => "MS1-only",
Self::Unknown => "unknown acquisition",
})
}
}
pub fn detect_acquisition(input: &Path) -> Result<Acquisition> {
let path = input.join("analysis.tdf");
let meta = tdf::read_frame_meta(&path)?;
tdf::detect_acquisition(&path, &meta)
}
pub fn tof_half_width_for_ppm(input: &Path, ppm: f64, ref_mz: Option<f64>) -> Result<u32> {
let in_tdf = input.join("analysis.tdf");
let md = MetadataReader::new(&in_tdf).map_err(|e| DnoiseError::Metadata(e.to_string()))?;
let mz = match ref_mz {
Some(m) => m,
None => match tdf::read_mz_acq_range(&in_tdf)? {
Some((lo, hi)) => 0.5 * (lo + hi),
None => 800.0,
},
};
let t_center = md.mz_converter.invert(mz);
let t_edge = md.mz_converter.invert(mz * (1.0 + ppm * 1e-6));
let half = (t_edge - t_center).abs().round() as u32;
Ok(half.max(1))
}
pub use average::running_average;
pub use box_centroid::box_centroid;
pub use dia_ms1::{DiaMs1Gate, TofScanBox};
pub use dia_window::{filter_per_window, in_window_mask};
pub use filter::{filter_iterated, filter_once};
pub use frame::FlatFrame;
pub use halo::horizontal_halo_keep_mask;
pub use msms::combine_and_filter;
pub use polygon::PolygonGate;
pub use smooth::box_average;
pub use watershed::watershed_centroid;