pub use dnoise_core::units::{REFERENCE_MZ, RawAxis, RunScales, UnitEquivalent, equivalents};
use crate::mobility::{self, ScanToMobility};
use crate::params::{FilterParams, Stages};
use crate::tsr::MetadataReader;
use crate::{DnoiseError, Result};
use std::path::Path;
pub fn for_run(
tdf_path: &Path,
params: &FilterParams,
stages: &Stages,
) -> Result<Vec<UnitEquivalent>> {
let md = MetadataReader::new(tdf_path).map_err(|e| DnoiseError::Metadata(e.to_string()))?;
let conn = rusqlite::Connection::open_with_flags(
tdf_path,
rusqlite::OpenFlags::SQLITE_OPEN_READ_ONLY,
)?;
let num_scans: Option<i64> =
conn.query_row("SELECT MAX(NumScans) FROM Frames", [], |r| r.get(0))?;
let num_scans = num_scans.unwrap_or(0).max(0) as u32;
if num_scans < 2 {
return Err(DnoiseError::Metadata("no mobility scans".into()));
}
let im = mobility::load(tdf_path, stages.mobility_scale, md.im_converter)
.unwrap_or(ScanToMobility::Linear(md.im_converter));
let scales = RunScales {
mz: md.mz_converter,
im,
num_scans,
};
Ok(equivalents(params, stages, &scales))
}