Skip to content

Commit 0f14fed

Browse files
authored
Merge pull request #3 from compomics/fix/thermo-centroiding
Fix vendor centroiding for Thermo raw data
2 parents e39702b + 1cce4e5 commit 0f14fed

File tree

4 files changed

+60
-58
lines changed

4 files changed

+60
-58
lines changed

Cargo.toml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ms2rescore-rs"
3-
version = "0.4.0-1"
3+
version = "0.4.1"
44
edition = "2021"
55

66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@@ -10,10 +10,9 @@ crate-type = ["cdylib"]
1010

1111
[features]
1212
default = ["thermo"]
13-
1413
thermo = ["mzdata/thermo"]
1514

1615
[dependencies]
17-
pyo3 = "0.20.0"
18-
mzdata = "0.33.0"
19-
timsrust = "0.3.0"
16+
pyo3 = { version = "0.23.3", features = ["anyhow"] }
17+
mzdata = "0.39.0"
18+
timsrust = "0.4.1"

src/lib.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
mod file_types;
2+
mod ms2_spectrum;
23
mod parse_mzdata;
34
mod parse_timsrust;
45
mod precursor;
5-
mod ms2_spectrum;
66

77
use std::collections::HashMap;
88

99
use pyo3::exceptions::{PyException, PyValueError};
1010
use pyo3::prelude::*;
1111

1212
use file_types::{match_file_type, SpectrumFileType};
13-
use precursor::Precursor;
1413
use ms2_spectrum::MS2Spectrum;
14+
use precursor::Precursor;
1515

1616
/// Check if spectrum path matches a supported file type.
1717
#[pyfunction]
@@ -27,9 +27,10 @@ pub fn get_precursor_info(spectrum_path: String) -> PyResult<HashMap<String, Pre
2727
let file_type = match_file_type(&spectrum_path);
2828

2929
let precursors = match file_type {
30-
SpectrumFileType::MascotGenericFormat | SpectrumFileType::MzML | SpectrumFileType::MzMLb | SpectrumFileType:: ThermoRaw => {
31-
parse_mzdata::parse_precursor_info(&spectrum_path)
32-
}
30+
SpectrumFileType::MascotGenericFormat
31+
| SpectrumFileType::MzML
32+
| SpectrumFileType::MzMLb
33+
| SpectrumFileType::ThermoRaw => parse_mzdata::parse_precursor_info(&spectrum_path),
3334
SpectrumFileType::BrukerRaw => parse_timsrust::parse_precursor_info(&spectrum_path),
3435
SpectrumFileType::Unknown => return Err(PyValueError::new_err("Unsupported file type")),
3536
};
@@ -46,9 +47,10 @@ pub fn get_ms2_spectra(spectrum_path: String) -> PyResult<Vec<ms2_spectrum::MS2S
4647
let file_type = match_file_type(&spectrum_path);
4748

4849
let spectra = match file_type {
49-
SpectrumFileType::MascotGenericFormat | SpectrumFileType::MzML | SpectrumFileType::MzMLb | SpectrumFileType:: ThermoRaw => {
50-
parse_mzdata::read_ms2_spectra(&spectrum_path)
51-
}
50+
SpectrumFileType::MascotGenericFormat
51+
| SpectrumFileType::MzML
52+
| SpectrumFileType::MzMLb
53+
| SpectrumFileType::ThermoRaw => parse_mzdata::read_ms2_spectra(&spectrum_path),
5254
SpectrumFileType::BrukerRaw => parse_timsrust::read_ms2_spectra(&spectrum_path),
5355
SpectrumFileType::Unknown => return Err(PyValueError::new_err("Unsupported file type")),
5456
};
@@ -59,10 +61,9 @@ pub fn get_ms2_spectra(spectrum_path: String) -> PyResult<Vec<ms2_spectrum::MS2S
5961
}
6062
}
6163

62-
6364
/// A Python module implemented in Rust.
6465
#[pymodule]
65-
fn ms2rescore_rs(_py: Python, m: &PyModule) -> PyResult<()> {
66+
fn ms2rescore_rs(m: &Bound<'_, PyModule>) -> PyResult<()> {
6667
m.add_class::<Precursor>()?;
6768
m.add_class::<MS2Spectrum>()?;
6869
m.add_function(wrap_pyfunction!(is_supported_file_type, m)?)?;

src/parse_mzdata.rs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::collections::HashMap;
22

3-
use mzdata::params::ParamValue;
4-
use mzdata::mz_read;
3+
use mzdata::{params::ParamValue, prelude::*, MZReader};
54

65
use crate::ms2_spectrum::MS2Spectrum;
76
use crate::precursor::Precursor;
@@ -49,25 +48,27 @@ impl From<mzdata::spectrum::MultiLayerSpectrum> for MS2Spectrum {
4948
pub fn parse_precursor_info(
5049
spectrum_path: &str,
5150
) -> Result<HashMap<String, Precursor>, std::io::Error> {
52-
mz_read!(spectrum_path.as_ref(), reader => {
53-
reader.filter(|spectrum| spectrum.description.ms_level == 2)
54-
.filter_map(|spectrum| {
55-
spectrum.description.precursor.as_ref()?;
56-
Some((spectrum.description.id.clone(), Precursor::from(&spectrum)))
57-
})
58-
.collect::<HashMap<String, Precursor>>()
59-
})
51+
let reader = MZReader::open_path(spectrum_path)?;
52+
Ok(reader
53+
.filter(|spectrum| spectrum.description.ms_level == 2)
54+
.filter_map(|spectrum| {
55+
spectrum.description.precursor.as_ref()?;
56+
Some((spectrum.description.id.clone(), Precursor::from(&spectrum)))
57+
})
58+
.collect::<HashMap<String, Precursor>>())
6059
}
6160

6261
/// Read MS2 spectra from spectrum files with mzdata
63-
pub fn read_ms2_spectra(
64-
spectrum_path: &str,
65-
) -> Result<Vec<MS2Spectrum>, std::io::Error> {
66-
mz_read!(spectrum_path.as_ref(), reader => {
67-
reader.filter(|spectrum| spectrum.description.ms_level == 2)
68-
.map(MS2Spectrum::from)
69-
.collect::<Vec<MS2Spectrum>>()
70-
})
62+
pub fn read_ms2_spectra(spectrum_path: &str) -> Result<Vec<MS2Spectrum>, std::io::Error> {
63+
let mut reader = MZReader::open_path(spectrum_path)?;
64+
if let MZReader::ThermoRaw(inner) = &mut reader {
65+
inner.set_centroiding(true);
66+
}
67+
68+
Ok(reader
69+
.filter(|spectrum| spectrum.description.ms_level == 2)
70+
.map(MS2Spectrum::from)
71+
.collect::<Vec<MS2Spectrum>>())
7172
}
7273

7374
fn get_charge_from_spectrum(spectrum: &mzdata::spectrum::MultiLayerSpectrum) -> Option<usize> {

src/parse_timsrust.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use std::collections::HashMap;
33
use crate::ms2_spectrum::MS2Spectrum;
44
use crate::precursor::Precursor;
55

6-
impl From<timsrust::ms_data::Precursor> for Precursor {
7-
fn from(precursor: timsrust::ms_data::Precursor) -> Self {
6+
impl From<timsrust::Precursor> for Precursor {
7+
fn from(precursor: timsrust::Precursor) -> Self {
88
Precursor {
99
mz: precursor.mz,
1010
rt: precursor.rt,
@@ -15,8 +15,8 @@ impl From<timsrust::ms_data::Precursor> for Precursor {
1515
}
1616
}
1717

18-
impl From<timsrust::ms_data::Spectrum> for MS2Spectrum {
19-
fn from(spectrum: timsrust::ms_data::Spectrum) -> Self {
18+
impl From<timsrust::Spectrum> for MS2Spectrum {
19+
fn from(spectrum: timsrust::Spectrum) -> Self {
2020
MS2Spectrum::new(
2121
spectrum.index.to_string(),
2222
spectrum.mz_values.iter().map(|mz| *mz as f32).collect(),
@@ -25,7 +25,7 @@ impl From<timsrust::ms_data::Spectrum> for MS2Spectrum {
2525
.iter()
2626
.map(|intensity| *intensity as f32)
2727
.collect(),
28-
Some(Precursor::from(spectrum.precursor)),
28+
spectrum.precursor.map(Precursor::from),
2929
)
3030
}
3131
}
@@ -34,35 +34,36 @@ impl From<timsrust::ms_data::Spectrum> for MS2Spectrum {
3434
pub fn parse_precursor_info(
3535
spectrum_path: &str,
3636
) -> Result<HashMap<String, Precursor>, std::io::Error> {
37-
let reader = timsrust::FileReader::new(spectrum_path)
37+
let reader = timsrust::readers::SpectrumReader::new(spectrum_path)
3838
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?;
3939

40-
Ok(reader
41-
.read_all_spectra()
40+
let spectra = reader
41+
.get_all()
4242
.into_iter()
43-
.filter(|spectrum| {
44-
matches!(
45-
spectrum.precursor,
46-
timsrust::ms_data::Precursor { .. }
47-
)
48-
})
49-
.map(|spectrum| {
50-
(
51-
spectrum.index.to_string(),
52-
Precursor::from(spectrum.precursor),
53-
)
43+
.collect::<Result<Vec<_>, _>>()
44+
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?;
45+
46+
let precursor_info = spectra
47+
.into_iter()
48+
.filter_map(|spectrum| match spectrum.precursor {
49+
Some(precursor) => Some((spectrum.index.to_string(), Precursor::from(precursor))),
50+
None => None,
5451
})
55-
.collect::<HashMap<String, Precursor>>())
52+
.collect::<HashMap<_, _>>();
53+
54+
Ok(precursor_info)
5655
}
5756

5857
/// Read MS2 spectra from spectrum files with timsrust
5958
pub fn read_ms2_spectra(spectrum_path: &str) -> Result<Vec<MS2Spectrum>, std::io::Error> {
60-
let reader = timsrust::FileReader::new(spectrum_path)
59+
let reader = timsrust::readers::SpectrumReader::new(spectrum_path)
6160
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?;
6261

63-
Ok(reader
64-
.read_all_spectra()
62+
let spectra = reader
63+
.get_all()
6564
.into_iter()
66-
.map(MS2Spectrum::from)
67-
.collect())
65+
.collect::<Result<Vec<_>, _>>()
66+
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?;
67+
68+
Ok(spectra.into_iter().map(MS2Spectrum::from).collect())
6869
}

0 commit comments

Comments
 (0)