timsrust 0.4.2

A crate to read Bruker timsTOF data
Documentation
use crate::{
    domain_converters::{
        ConvertableDomain, Frame2RtConverter, Scan2ImConverter,
    },
    io::readers::{
        file_readers::sql_reader::{
            precursors::SqlPrecursor, ReadableSqlTable, SqlReader,
            SqlReaderError,
        },
        MetadataReader, MetadataReaderError,
    },
    ms_data::Precursor,
    readers::TimsTofPathLike,
};

use super::PrecursorReaderTrait;

#[derive(Debug)]
pub struct DDATDFPrecursorReader {
    sql_precursors: Vec<SqlPrecursor>,
    rt_converter: Frame2RtConverter,
    im_converter: Scan2ImConverter,
}

impl DDATDFPrecursorReader {
    pub fn new(
        path: impl TimsTofPathLike,
    ) -> Result<Self, DDATDFPrecursorReaderError> {
        let tdf_sql_reader = SqlReader::open(&path)?;
        let metadata = MetadataReader::new(&path)?;
        let rt_converter: Frame2RtConverter = metadata.rt_converter;
        let im_converter: Scan2ImConverter = metadata.im_converter;
        let sql_precursors = SqlPrecursor::from_sql_reader(&tdf_sql_reader)?;
        let reader = Self {
            sql_precursors,
            rt_converter,
            im_converter,
        };
        Ok(reader)
    }
}

impl PrecursorReaderTrait for DDATDFPrecursorReader {
    fn get(&self, index: usize) -> Option<Precursor> {
        let sql_precursor = &self.sql_precursors.get(index)?;
        let frame_id: usize = sql_precursor.precursor_frame;
        let scan_id: f64 = sql_precursor.scan_average;
        let precursor = Precursor {
            mz: sql_precursor.mz,
            rt: self.rt_converter.convert(frame_id as u32),
            im: self.im_converter.convert(scan_id),
            charge: Some(sql_precursor.charge),
            intensity: Some(sql_precursor.intensity),
            index: index + 1,
            frame_index: frame_id,
        };
        Some(precursor)
    }

    fn len(&self) -> usize {
        self.sql_precursors.len()
    }
}

#[derive(Debug, thiserror::Error)]
pub enum DDATDFPrecursorReaderError {
    #[error("{0}")]
    SqlReaderError(#[from] SqlReaderError),
    #[error("{0}")]
    MetadataReaderError(#[from] MetadataReaderError),
}