Skip to content

(feature) re-parametrized splitting to 1/k0 terms #24

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/io/readers/precursor_reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use tdf::{TDFPrecursorReader, TDFPrecursorReaderError};

use crate::ms_data::Precursor;

use super::quad_settings_reader::FrameWindowSplittingStrategy;
use super::FrameWindowSplittingConfiguration;

pub struct PrecursorReader {
precursor_reader: Box<dyn PrecursorReaderTrait>,
Expand Down Expand Up @@ -42,7 +42,7 @@ impl PrecursorReader {
#[derive(Debug, Default, Clone)]
pub struct PrecursorReaderBuilder {
path: PathBuf,
config: FrameWindowSplittingStrategy,
config: FrameWindowSplittingConfiguration,
}

impl PrecursorReaderBuilder {
Expand All @@ -53,7 +53,10 @@ impl PrecursorReaderBuilder {
}
}

pub fn with_config(&self, config: FrameWindowSplittingStrategy) -> Self {
pub fn with_config(
&self,
config: FrameWindowSplittingConfiguration,
) -> Self {
Self {
config: config,
..self.clone()
Expand Down
4 changes: 2 additions & 2 deletions src/io/readers/precursor_reader/tdf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use dia::{DIATDFPrecursorReader, DIATDFPrecursorReaderError};
use crate::{
io::readers::{
file_readers::sql_reader::{SqlError, SqlReader},
quad_settings_reader::FrameWindowSplittingStrategy,
FrameWindowSplittingConfiguration,
},
ms_data::{AcquisitionType, Precursor},
};
Expand All @@ -23,7 +23,7 @@ pub struct TDFPrecursorReader {
impl TDFPrecursorReader {
pub fn new(
path: impl AsRef<Path>,
splitting_strategy: FrameWindowSplittingStrategy,
splitting_strategy: FrameWindowSplittingConfiguration,
) -> Result<Self, TDFPrecursorReaderError> {
let sql_path = path.as_ref();
let tdf_sql_reader = SqlReader::open(sql_path)?;
Expand Down
7 changes: 4 additions & 3 deletions src/io/readers/precursor_reader/tdf/dia.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::path::Path;

use crate::io::readers::quad_settings_reader::FrameWindowSplittingStrategy;
use crate::io::readers::FrameWindowSplittingConfiguration;
use crate::{
domain_converters::{
ConvertableDomain, Frame2RtConverter, Scan2ImConverter,
Expand All @@ -25,16 +25,17 @@ pub struct DIATDFPrecursorReader {
impl DIATDFPrecursorReader {
pub fn new(
path: impl AsRef<Path>,
splitting_strategy: FrameWindowSplittingStrategy,
splitting_config: FrameWindowSplittingConfiguration,
) -> Result<Self, DIATDFPrecursorReaderError> {
let sql_path = path.as_ref();
let tdf_sql_reader = SqlReader::open(sql_path)?;
let metadata = MetadataReader::new(&path)?;
let rt_converter: Frame2RtConverter = metadata.rt_converter;
let im_converter: Scan2ImConverter = metadata.im_converter;
let splitting_strategy = splitting_config.finalize(im_converter);
let expanded_quadrupole_settings =
QuadrupoleSettingsReader::from_splitting(
tdf_sql_reader.get_path(),
&tdf_sql_reader,
splitting_strategy,
)?;
let reader = Self {
Expand Down
144 changes: 122 additions & 22 deletions src/io/readers/quad_settings_reader.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
use std::path::Path;

use crate::{ms_data::QuadrupoleSettings, utils::vec_utils::argsort};
use crate::{
domain_converters::{ConvertableDomain, Scan2ImConverter},
ms_data::QuadrupoleSettings,
utils::vec_utils::argsort,
};

use super::file_readers::sql_reader::{
frame_groups::SqlWindowGroup, quad_settings::SqlQuadSettings,
Expand Down Expand Up @@ -48,11 +52,9 @@ impl QuadrupoleSettingsReader {
}

pub fn from_splitting(
path: impl AsRef<Path>,
tdf_sql_reader: &SqlReader,
splitting_strat: FrameWindowSplittingStrategy,
) -> Result<Vec<QuadrupoleSettings>, QuadrupoleSettingsReaderError> {
let sql_path = path.as_ref();
let tdf_sql_reader = SqlReader::open(&sql_path)?;
let quadrupole_settings = Self::from_sql_settings(&tdf_sql_reader)?;
let window_groups = SqlWindowGroup::from_sql_reader(&tdf_sql_reader)?;
let expanded_quadrupole_settings = match splitting_strat {
Expand Down Expand Up @@ -120,7 +122,8 @@ pub enum QuadrupoleSettingsReaderError {
SqlError(#[from] SqlError),
}

type SpanStep = (usize, usize);
type MobilitySpanStep = (f64, f64);
type ScanSpanStep = (usize, usize);

/// Strategy for expanding quadrupole settings
///
Expand All @@ -135,16 +138,62 @@ type SpanStep = (usize, usize);
/// * `Even(usize)` - Split the quadrupole settings into `usize` evenly spaced
/// subwindows; e.g. if `usize` is 2, the window will be split into 2 subwindows
/// of equal width.
/// * `Uniform(SpanStep)` - Split the quadrupole settings into subwindows of
/// width `SpanStep.0` and step `SpanStep.1`; e.g. if `SpanStep` is (100, 50),
/// the window will be split into subwindows of width 100 and step 50 between their
/// scan start and end.
/// * `UniformMobility(SpanStep)` - Split the quadrupole settings into subwindows of
/// width `SpanStep.0` and step `SpanStep.1` in ion mobility space.
/// e.g. if `SpanStep` is (0.05, 0.02),
/// the window will be split into subwindows of width 0.05 and step 0.02 between their
/// in the mobility dimension.
/// * `UniformScan(SpanStep)` - Split the quadrupole settings into subwindows of
/// width `SpanStep.0` and step `SpanStep.1` in scan number space.
/// e.g. if `SpanStep` is (100, 80),
/// the window will be split into subwindows of width
/// 100 and step 80 between their in the scan number.
///
#[derive(Debug, Copy, Clone)]
pub enum QuadWindowExpansionStrategy {
None,
Even(usize),
Uniform(SpanStep),
UniformMobility(MobilitySpanStep, Scan2ImConverter),
UniformScan(ScanSpanStep),
}

#[derive(Debug, Copy, Clone)]
pub enum QuadWindowExpansionConfiguration {
None,
Even(usize),
UniformMobility(MobilitySpanStep),
UniformScan(ScanSpanStep),
}

impl Default for QuadWindowExpansionConfiguration {
fn default() -> Self {
Self::Even(1)
}
}

impl QuadWindowExpansionConfiguration {
pub fn finalize(
self,
scan_converter: Scan2ImConverter,
) -> QuadWindowExpansionStrategy {
match self {
QuadWindowExpansionConfiguration::None => {
QuadWindowExpansionStrategy::None
},
QuadWindowExpansionConfiguration::Even(x) => {
QuadWindowExpansionStrategy::Even(x)
},
QuadWindowExpansionConfiguration::UniformMobility((span, step)) => {
QuadWindowExpansionStrategy::UniformMobility(
(span, step),
scan_converter,
)
},
QuadWindowExpansionConfiguration::UniformScan((span, step)) => {
QuadWindowExpansionStrategy::UniformScan((span, step))
},
}
}
}

#[derive(Debug, Clone, Copy)]
Expand All @@ -153,9 +202,33 @@ pub enum FrameWindowSplittingStrategy {
Window(QuadWindowExpansionStrategy),
}

impl Default for FrameWindowSplittingStrategy {
#[derive(Debug, Clone, Copy)]
pub enum FrameWindowSplittingConfiguration {
Quadrupole(QuadWindowExpansionConfiguration),
Window(QuadWindowExpansionConfiguration),
}

impl Default for FrameWindowSplittingConfiguration {
fn default() -> Self {
Self::Quadrupole(QuadWindowExpansionStrategy::Even(1))
Self::Quadrupole(QuadWindowExpansionConfiguration::Even(1))
}
}

impl FrameWindowSplittingConfiguration {
pub fn finalize(
self,
scan_converter: Scan2ImConverter,
) -> FrameWindowSplittingStrategy {
match self {
FrameWindowSplittingConfiguration::Quadrupole(x) => {
FrameWindowSplittingStrategy::Quadrupole(
x.finalize(scan_converter),
)
},
FrameWindowSplittingConfiguration::Window(x) => {
FrameWindowSplittingStrategy::Window(x.finalize(scan_converter))
},
}
}
}

Expand All @@ -164,7 +237,7 @@ fn scan_range_subsplit(
end: usize,
strategy: &QuadWindowExpansionStrategy,
) -> Vec<(usize, usize)> {
let out = match strategy {
let out: Vec<(usize, usize)> = match strategy {
QuadWindowExpansionStrategy::None => {
vec![(start, end)]
},
Expand All @@ -181,17 +254,44 @@ fn scan_range_subsplit(
}
out
},
QuadWindowExpansionStrategy::Uniform((span, step)) => {
let mut curr_start = start.clone();
let mut curr_end = start + span;
QuadWindowExpansionStrategy::UniformMobility(
(span, step),
converter,
) => {
// Since scan start < scan end but low scans are high IMs, we need to
// subtract instead of adding.
let mut curr_start_offset = start.clone();
let mut curr_start_im = converter.convert(curr_start_offset as f64);

let mut curr_end_im = curr_start_im - span;
let mut curr_end_offset = converter.invert(curr_end_im) as usize;
let mut out = Vec::new();
while curr_end_offset < end {
out.push((curr_start_offset, curr_end_offset));

curr_start_im = curr_start_im - step;
curr_start_offset = converter.invert(curr_start_im) as usize;

curr_end_im = curr_start_im - span;
curr_end_offset = converter.invert(curr_end_im) as usize;
}
if curr_start_offset < end {
out.push((curr_start_offset, end));
}
out
},
QuadWindowExpansionStrategy::UniformScan((span, step)) => {
let mut curr_start_offset = start;
let mut curr_end_offset = start + span;
let mut out = Vec::new();
while curr_end < end {
out.push((curr_start, curr_end));
curr_start += step;
curr_end += step;

while curr_end_offset < end {
out.push((curr_start_offset, curr_end_offset));
curr_start_offset += step;
curr_end_offset += step;
}
if curr_start < end {
out.push((curr_start, end));
if curr_start_offset < end {
out.push((curr_start_offset, end));
}
out
},
Expand Down
4 changes: 2 additions & 2 deletions src/io/readers/spectrum_reader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use tdf::{TDFSpectrumReader, TDFSpectrumReaderError};

use crate::ms_data::Spectrum;

use super::FrameWindowSplittingStrategy;
use super::FrameWindowSplittingConfiguration;

pub struct SpectrumReader {
spectrum_reader: Box<dyn SpectrumReaderTrait>,
Expand Down Expand Up @@ -147,5 +147,5 @@ impl Default for SpectrumProcessingParams {
#[derive(Debug, Default, Clone)]
pub struct SpectrumReaderConfig {
pub spectrum_processing_params: SpectrumProcessingParams,
pub frame_splitting_params: FrameWindowSplittingStrategy,
pub frame_splitting_params: FrameWindowSplittingConfiguration,
}
5 changes: 4 additions & 1 deletion src/io/readers/spectrum_reader/tdf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,14 @@ impl TDFSpectrumReader {
.with_config(config.frame_splitting_params)
.finalize()?;
let acquisition_type = frame_reader.get_acquisition();
let splitting_strategy = config
.frame_splitting_params
.finalize(metadata.im_converter);
let raw_spectrum_reader = RawSpectrumReader::new(
&tdf_sql_reader,
frame_reader,
acquisition_type,
config.frame_splitting_params,
splitting_strategy,
)?;
let reader = Self {
path: path_name.as_ref().to_path_buf(),
Expand Down
2 changes: 1 addition & 1 deletion src/io/readers/spectrum_reader/tdf/dia.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ impl DIARawSpectrumReader {
) -> Result<Self, DIARawSpectrumReaderError> {
let expanded_quadrupole_settings =
QuadrupoleSettingsReader::from_splitting(
tdf_sql_reader.get_path(),
&tdf_sql_reader,
splitting_strategy,
)?;
let reader = Self {
Expand Down
Loading
Loading