diff --git a/Cargo.lock b/Cargo.lock index f9c1b71..612b5a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1139,7 +1139,7 @@ checksum = "7f4423059b0eec2a116d2b8e4b40d4faaad1b72ae17df8718c66520e0e876885" [[package]] name = "timsrust" -version = "0.4.2" +version = "0.4.3" dependencies = [ "bytemuck", "criterion", diff --git a/Cargo.toml b/Cargo.toml index c40b783..1923f06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "timsrust" -version = "0.4.2" +version = "0.4.3" edition = "2021" description = "A crate to read Bruker timsTOF data" license = "Apache-2.0" @@ -18,7 +18,7 @@ zstd = "0.13.2" rayon = "1.10.0" linreg = "0.2.0" bytemuck = "1.18.0" -thiserror = "1.0.0" +thiserror = "2.0.3" memmap2 = "0.9.3" rusqlite = { version = "0.32.0", features = ["bundled"], optional = true } parquet = { version = "53.0.0", optional = true } diff --git a/README.md b/README.md index be2aef5..1a1384a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -![Crates.io](https://img.shields.io/crates/v/timsrust?link=https%3A%2F%2Fcrates.io%2Fcrates%2Ftimsrust) -![docs.rs](https://img.shields.io/docsrs/timsrust?link=https%3A%2F%2Fdocs.rs%2Ftimsrust%2F0.2.1%2Ftimsrust%2F) +[![Crates.io](https://img.shields.io/crates/v/timsrust?link=https%3A%2F%2Fcrates.io%2Fcrates%2Ftimsrust)](https://crates.io/crates/timsrust) +[![docs.rs](https://img.shields.io/docsrs/timsrust?link=https%3A%2F%2Fdocs.rs%2Ftimsrust%2F0.2.1%2Ftimsrust%2F)](https://docs.rs/timsrust/0.4.2/timsrust/) # TimsRust diff --git a/src/io/readers/file_readers/tdf_blob_reader.rs b/src/io/readers/file_readers/tdf_blob_reader.rs index f5aa4df..b4d2e81 100644 --- a/src/io/readers/file_readers/tdf_blob_reader.rs +++ b/src/io/readers/file_readers/tdf_blob_reader.rs @@ -33,6 +33,9 @@ impl TdfBlobReader { .bin_file_reader .get_data(offset, byte_count) .ok_or(TdfBlobReaderError::CorruptData)?; + if data.len() == 0 { + return Err(TdfBlobReaderError::EmptyData); + } let bytes = decode_all(data).map_err(|_| TdfBlobReaderError::Decompression)?; let blob = TdfBlob::new(bytes)?; @@ -130,6 +133,8 @@ pub enum TdfBlobReaderError { IO(#[from] io::Error), #[error("{0}")] TdfBlob(#[from] TdfBlobError), + #[error("No binary data")] + EmptyData, #[error("Data is corrupt")] CorruptData, #[error("Decompression fails")] diff --git a/src/io/readers/frame_reader.rs b/src/io/readers/frame_reader.rs index 6a0767a..8417f3c 100644 --- a/src/io/readers/frame_reader.rs +++ b/src/io/readers/frame_reader.rs @@ -50,8 +50,10 @@ impl FrameReader { let sql_frames = SqlFrame::from_sql_reader(&tdf_sql_reader)?; let tdf_bin_reader = TdfBlobReader::new(&path)?; #[cfg(feature = "timscompress")] - let compressed_reader = CompressedTdfBlobReader::new(&path) - .ok_or_else(|| FrameReaderError::TimscompressError)?; + let compressed_reader = CompressedTdfBlobReader::new( + &path.as_ref().to_path_buf().join("analysis.tdf_bin"), + ) + .ok_or_else(|| FrameReaderError::TimscompressError)?; let acquisition = if sql_frames.iter().any(|x| x.msms_type == 8) { AcquisitionType::DDAPASEF } else if sql_frames.iter().any(|x| x.msms_type == 9) { @@ -165,7 +167,7 @@ impl FrameReader { let offset = self.get_binary_offset(index); let blob = self.tdf_bin_reader.get(offset)?; let scan_count: usize = - blob.get(0).ok_or(FrameReaderError::CorruptFrame)? as usize; + blob.get(0).expect("Blob cannot be empty") as usize; let peak_count: usize = (blob.len() - scan_count) / 2; frame.scan_offsets = read_scan_offsets(scan_count, peak_count, &blob)?; frame.intensities = read_intensities(scan_count, peak_count, &blob)?; @@ -189,7 +191,8 @@ impl FrameReader { let offset = self.get_binary_offset(index); let raw_frame = self .compressed_reader - .get_raw_frame_data(offset, self.scan_count); + .get_raw_frame_data(offset, self.scan_count) + .ok_or_else(|| FrameReaderError::TimscompressError)?; frame.tof_indices = raw_frame.tof_indices; frame.intensities = raw_frame.intensities; frame.scan_offsets = raw_frame.scan_offsets;