diff --git a/crates/timsrust/src/converters.rs b/crates/timsrust/src/converters.rs index f51c5f5..9cc67d2 100644 --- a/crates/timsrust/src/converters.rs +++ b/crates/timsrust/src/converters.rs @@ -21,28 +21,32 @@ impl MzConverter { let timstof = TimsTofPath::new(path.as_ref()).ok()?; #[allow(unreachable_code)] match timstof.file_type() { + #[cfg(feature = "patched")] + TimsTofFileType::Patched(_) => { + Some(Self::Bit(timsrust_core::BitConverter())) + }, TimsTofFileType::Tdf(tdf_path) => { #[cfg(feature = "sdk")] - return Some(MzConverter::Sdk( + return Some(Self::Sdk( timsrust_sdk::WrappedTof2MzConverterSDK::new( tdf_path.tdf().as_ref(), )?, )); #[cfg(feature = "patched")] - return Some(MzConverter::Bps( + return Some(Self::Bps( timsrust_patched::Tof2MzConverter::from_tdf( tdf_path.tdf().as_ref(), )?, )); - Some(MzConverter::Tdf(timsrust_tdf::Tof2MzConverter::new( + Some(Self::Tdf(timsrust_tdf::Tof2MzConverter::new( tdf_path.tdf().as_ref(), ))) }, - TimsTofFileType::MiniTdf(_) => Some(MzConverter::MiniTdf), + TimsTofFileType::MiniTdf(_) => Some(Self::MiniTdf), TimsTofFileType::Parquet(_) => { - Some(MzConverter::Bit(timsrust_core::BitConverter())) + Some(Self::Bit(timsrust_core::BitConverter())) }, - TimsTofFileType::Tsf(_) => Some(MzConverter::TSF( + TimsTofFileType::Tsf(_) => Some(Self::TSF( timsrust_tsf::Tof2MzConverter::new(timstof.as_ref()), )), } @@ -95,29 +99,33 @@ impl ImConverter { let timstof = TimsTofPath::new(path.as_ref()).ok()?; #[allow(unreachable_code)] match timstof.file_type() { + #[cfg(feature = "patched")] + TimsTofFileType::Patched(_) => { + Some(Self::Bit(timsrust_core::BitConverter())) + }, TimsTofFileType::Tdf(tdf_path) => { #[cfg(feature = "sdk")] - return Some(ImConverter::Sdk( + return Some(Self::Sdk( timsrust_sdk::WrappedScan2ImConverterSDK::new( tdf_path.tdf().as_ref(), )?, )); #[cfg(feature = "patched")] - return Some(ImConverter::Bps( + return Some(Self::Bps( timsrust_patched::Scan2ImConverter::from_tdf( tdf_path.tdf().as_ref(), )?, )); - Some(ImConverter::Tdf(timsrust_tdf::Scan2ImConverter::new( + Some(Self::Tdf(timsrust_tdf::Scan2ImConverter::new( tdf_path.tdf().as_ref(), ))) }, - TimsTofFileType::MiniTdf(_) => Some(ImConverter::MiniTdf), + TimsTofFileType::MiniTdf(_) => Some(Self::MiniTdf), TimsTofFileType::Parquet(_) => { - Some(ImConverter::Bit(timsrust_core::BitConverter())) + Some(Self::Bit(timsrust_core::BitConverter())) }, TimsTofFileType::Tsf(_) => { - Some(ImConverter::Bit(timsrust_core::BitConverter())) + Some(Self::Bit(timsrust_core::BitConverter())) }, } } @@ -162,15 +170,19 @@ impl RtConverter { pub fn new(path: impl AsRef) -> Option { let timstof = TimsTofPath::new(path.as_ref()).ok()?; match timstof.file_type() { - TimsTofFileType::Tdf(tdf_path) => Some(RtConverter::Tdf( + #[cfg(feature = "patched")] + TimsTofFileType::Patched(_) => { + Some(Self::Bit(timsrust_core::BitConverter())) + }, + TimsTofFileType::Tdf(tdf_path) => Some(Self::Tdf( timsrust_tdf::Frame2RtConverter::new(tdf_path.tdf().as_ref()), )), - TimsTofFileType::MiniTdf(_) => Some(RtConverter::MiniTdf), + TimsTofFileType::MiniTdf(_) => Some(Self::MiniTdf), TimsTofFileType::Parquet(_) => { - Some(RtConverter::Bit(timsrust_core::BitConverter())) + Some(Self::Bit(timsrust_core::BitConverter())) }, TimsTofFileType::Tsf(_) => { - Some(RtConverter::Bit(timsrust_core::BitConverter())) + Some(Self::Bit(timsrust_core::BitConverter())) }, } } diff --git a/crates/timsrust/src/precursor_reader.rs b/crates/timsrust/src/precursor_reader.rs index ee433ea..e305620 100644 --- a/crates/timsrust/src/precursor_reader.rs +++ b/crates/timsrust/src/precursor_reader.rs @@ -103,6 +103,10 @@ impl PrecursorReaderBuilder { Some(path) => path, }; let precursor_reader = match path.file_type() { + #[cfg(feature = "patched")] + TimsTofFileType::Patched(_) => { + return Err(PrecursorReaderError::PatchedNotSupported); + }, TimsTofFileType::MiniTdf(mini_path) => { Inner::MiniTDF(mini_path.precursor_reader()?) }, @@ -142,4 +146,7 @@ pub enum PrecursorReaderError { TimsTofPathError(#[from] TimsTofPathError), #[error("TSF datasets do not provide precursor information")] TsfNotSupported, + #[cfg(feature = "patched")] + #[error("Patched datasets are not supported")] + PatchedNotSupported, } diff --git a/crates/timsrust/src/spectrum_reader.rs b/crates/timsrust/src/spectrum_reader.rs index 2b525bc..15e0656 100644 --- a/crates/timsrust/src/spectrum_reader.rs +++ b/crates/timsrust/src/spectrum_reader.rs @@ -32,6 +32,8 @@ enum Inner { timsrust_parquet_spectra::spectrum_reader::ParquetSpectrumReader, ), Tsf(TSFSpectrumReader), + #[cfg(feature = "patched")] + Patched(timsrust_patched::PatchedSpectrumReader), } impl Inner { @@ -47,6 +49,10 @@ impl Inner { Inner::MiniTdf(reader) => Ok(reader.get(index)?), Inner::ParquetSpectra(reader) => Ok(reader.get(index)?), Inner::Tsf(reader) => Ok(reader.get(index)?), + #[cfg(feature = "patched")] + Inner::Patched(_) => { + Err(SpectrumReaderError::PatchedRandomAccessNotSupported) + }, } } @@ -57,6 +63,8 @@ impl Inner { Inner::Centroider(reader) => reader.len(), Inner::ParquetSpectra(reader) => reader.len(), Inner::Tsf(reader) => reader.len(), + #[cfg(feature = "patched")] + Inner::Patched(reader) => reader.len(), } } @@ -75,6 +83,8 @@ impl Inner { Inner::MiniTdf(reader) => A::MiniTdf(reader), Inner::ParquetSpectra(reader) => A::ParquetSpectra(reader), Inner::Tsf(reader) => A::Tsf(reader), + #[cfg(feature = "patched")] + Inner::Patched(reader) => A::Patched(reader), } } } @@ -94,6 +104,8 @@ enum A<'a> { &'a timsrust_parquet_spectra::spectrum_reader::ParquetSpectrumReader, ), Tsf(&'a TSFSpectrumReader), + #[cfg(feature = "patched")] + Patched(&'a timsrust_patched::PatchedSpectrumReader), } impl<'a> ParallelIterator for A<'a> { @@ -130,6 +142,12 @@ impl<'a> ParallelIterator for A<'a> { |s| s.ok(), ) .drive_unindexed(consumer), + #[cfg(feature = "patched")] + Self::Patched(reader) => rayon::iter::ParallelIterator::filter_map( + reader.par_iter(), + |s| s.ok(), + ) + .drive_unindexed(consumer), } } } @@ -251,6 +269,9 @@ pub enum SpectrumReaderError { NoPath, #[error("Centroider is not supported")] CentroiderNotSupported, + #[cfg(feature = "patched")] + #[error("Random access is not supported for patched datasets")] + PatchedRandomAccessNotSupported, } #[derive(Debug, Default, Clone)] @@ -285,6 +306,20 @@ impl SpectrumReaderBuilder { Some(path) => path, }; let spectrum_reader = match path.file_type() { + #[cfg(feature = "patched")] + TimsTofFileType::Patched(_) => { + if let Ok(reader) = timsrust_patched::PatchedSpectrumReader::from_file(path.as_ref()) { + let spectrum_reader = Inner::Patched(reader); + let mz_converter = + Arc::new(MzConverter::Bit(timsrust_core::BitConverter())); + return Ok(SpectrumReader { + spectrum_reader, + mz_converter, + }); + } else { + return Err(SpectrumReaderError::PatchedRandomAccessNotSupported); + } + }, TimsTofFileType::Tdf(tdf_path) => { if Metadata::new(tdf_path.as_ref()).unwrap().acquisition_type() == AcquisitionType::DIAPASEF diff --git a/crates/timsrust/src/timstof.rs b/crates/timsrust/src/timstof.rs index c1e970e..6e3deaf 100644 --- a/crates/timsrust/src/timstof.rs +++ b/crates/timsrust/src/timstof.rs @@ -22,6 +22,8 @@ pub(crate) enum TimsTofFileType { Tdf(TDFPath), Parquet(ParquetSpectrumPath), Tsf(TSFPath), + #[cfg(feature = "patched")] + Patched(timsrust_patched::PatchedTimsTofPath), } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -34,6 +36,15 @@ impl TimsTofPath { pub fn new(path: impl AsRef) -> Result { let uri = Uri::from(path.as_ref()).local_representation(); for path in [uri.as_ref(), path.as_ref()] { + #[cfg(feature = "patched")] + if let Ok(patched_path) = + timsrust_patched::PatchedTimsTofPath::new(path) + { + return Ok(Self { + uri: uri.clone(), + file_type: TimsTofFileType::Patched(patched_path), + }); + } if let Ok(tdf) = TDFPath::new(path) { return Ok(Self { uri: tdf.uri().clone(),