Skip to content

Commit a7414c8

Browse files
jspaezplazear
authored andcommitted
feat: ion mobility model
added mobility to outputs and model details simplified model removed redundant logging changed feature engineering removed old comments removed resolved comment
1 parent d1a06c3 commit a7414c8

File tree

9 files changed

+349
-1
lines changed

9 files changed

+349
-1
lines changed

crates/sage-cli/src/main.rs

+2
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,8 @@ impl Runner {
275275
self.parameters.mzml_paths.len(),
276276
);
277277
let _ = sage_core::ml::retention_model::predict(&self.database, &mut outputs.features);
278+
let _ =
279+
sage_core::ml::mobility_model::predict(&self.database, &mut outputs.features);
278280
Some(alignments)
279281
} else {
280282
None

crates/sage-cli/src/output.rs

+20
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ impl Runner {
5858
record.push_field(ryu::Buffer::new().format(feature.aligned_rt).as_bytes());
5959
record.push_field(ryu::Buffer::new().format(feature.predicted_rt).as_bytes());
6060
record.push_field(ryu::Buffer::new().format(feature.delta_rt_model).as_bytes());
61+
record.push_field(ryu::Buffer::new().format(feature.ims).as_bytes());
62+
record.push_field(ryu::Buffer::new().format(feature.predicted_ims).as_bytes());
63+
record.push_field(
64+
ryu::Buffer::new()
65+
.format(feature.delta_ims_model)
66+
.as_bytes(),
67+
);
6168
record.push_field(itoa::Buffer::new().format(feature.matched_peaks).as_bytes());
6269
record.push_field(itoa::Buffer::new().format(feature.longest_b).as_bytes());
6370
record.push_field(itoa::Buffer::new().format(feature.longest_y).as_bytes());
@@ -174,6 +181,9 @@ impl Runner {
174181
"aligned_rt",
175182
"predicted_rt",
176183
"delta_rt_model",
184+
"ion_mobility",
185+
"predicted_mobility",
186+
"delta_mobility",
177187
"matched_peaks",
178188
"longest_b",
179189
"longest_y",
@@ -261,6 +271,7 @@ impl Runner {
261271
record.push_field(ryu::Buffer::new().format(feature.calcmass).as_bytes());
262272
record.push_field(filenames[feature.file_id].as_bytes());
263273
record.push_field(ryu::Buffer::new().format(feature.rt).as_bytes());
274+
record.push_field(ryu::Buffer::new().format(feature.ims).as_bytes());
264275
record.push_field(itoa::Buffer::new().format(feature.rank).as_bytes());
265276
record.push_field(
266277
itoa::Buffer::new()
@@ -336,6 +347,12 @@ impl Runner {
336347
.format(feature.delta_rt_model.clamp(0.001, 1.0).sqrt())
337348
.as_bytes(),
338349
);
350+
record.push_field(ryu::Buffer::new().format(feature.predicted_ims).as_bytes());
351+
record.push_field(
352+
ryu::Buffer::new()
353+
.format(feature.delta_ims_model)
354+
.as_bytes(),
355+
);
339356
record.push_field(itoa::Buffer::new().format(feature.matched_peaks).as_bytes());
340357
record.push_field(itoa::Buffer::new().format(feature.longest_b).as_bytes());
341358
record.push_field(itoa::Buffer::new().format(feature.longest_y).as_bytes());
@@ -384,6 +401,7 @@ impl Runner {
384401
"CalcMass",
385402
"FileName",
386403
"retentiontime",
404+
"ion_mobility",
387405
"rank",
388406
"z=2",
389407
"z=3",
@@ -403,6 +421,8 @@ impl Runner {
403421
"aligned_rt",
404422
"predicted_rt",
405423
"sqrt(delta_rt_model)",
424+
"predicted_mobility",
425+
"sqrt(delta_mobility)",
406426
"matched_peaks",
407427
"longest_b",
408428
"longest_y",

crates/sage-cloudpath/src/mzml.rs

+10
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ const SELECTED_ION_CHARGE: &[u8] = b"MS:1000041";
5959
const ISO_WINDOW_LOWER: &[u8] = b"MS:1000828";
6060
const ISO_WINDOW_UPPER: &[u8] = b"MS:1000829";
6161

62+
const INVERSE_ION_MOBILITY: &[u8] = b"MS:1002815";
63+
6264
pub struct MzMLReader {
6365
ms_level: Option<u8>,
6466
// If set to Some(level) and noise intensities are present in the MzML file,
@@ -236,6 +238,9 @@ impl MzMLReader {
236238
SELECTED_ION_INT => {
237239
precursor.intensity = Some(extract_value!(ev));
238240
}
241+
INVERSE_ION_MOBILITY => {
242+
precursor.inverse_ion_mobility = Some(extract_value!(ev));
243+
}
239244
_ => {}
240245
}
241246
}
@@ -448,6 +453,7 @@ mod test {
448453
<selectedIon>
449454
<cvParam cvRef="MS" accession="MS:1000744" name="selected ion m/z" value="457.723968505859" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
450455
<cvParam cvRef="MS" accession="MS:1000041" name="charge state" value="2" />
456+
<cvParam cvRef="MS" accession="MS:1002815" name="inverse reduced ion mobility" value="1.078628" unitAccession="MS:1002814" unitName="volt-second per square centimeter"/>
451457
</selectedIon>
452458
</selectedIonList>
453459
<activation>
@@ -483,6 +489,10 @@ mod test {
483489
assert_eq!(s.precursors.len(), 1);
484490
assert_eq!(s.precursors[0].charge, Some(2));
485491
assert!((s.precursors[0].mz - 457.723968) < 0.0001);
492+
assert!(match s.precursors[0].inverse_ion_mobility {
493+
Some(x) => (x - 1.0786) < 0.0001,
494+
None => false,
495+
});
486496
assert_eq!(
487497
s.precursors[0].isolation_window,
488498
Some(Tolerance::Da(-1.5, 0.75))

crates/sage-cloudpath/src/tdf.rs

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ impl TdfReader {
2323
// precursor.ion_mobility = Option::from(dda_precursor.im as f32);
2424
precursor.intensity = Option::from(dda_precursor.intensity as f32);
2525
precursor.spectrum_ref = Option::from(dda_precursor.frame_index.to_string());
26+
precursor.inverse_ion_mobility = Option::from(dda_precursor.im as f32);
2627
let spectrum: RawSpectrum = RawSpectrum {
2728
file_id,
2829
precursors: vec![precursor],

crates/sage/src/ml/linear_discriminant.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::mass::Tolerance;
1616
use crate::scoring::Feature;
1717

1818
// Declare, so that we have compile time checking of matrix dimensions
19-
const FEATURES: usize = 18;
19+
const FEATURES: usize = 20;
2020
const FEATURE_NAMES: [&str; FEATURES] = [
2121
"rank",
2222
"charge",
@@ -35,7 +35,9 @@ const FEATURE_NAMES: [&str; FEATURES] = [
3535
"ln1p(peptide_len)",
3636
"missed_cleavages",
3737
"rt",
38+
"ims",
3839
"sqrt(delta_rt_model)",
40+
"sqrt(delta_ims_model)",
3941
];
4042

4143
struct Features<'a>(&'a [f64]);
@@ -174,7 +176,9 @@ pub fn score_psms(scores: &mut [Feature], precursor_tol: Tolerance) -> Option<()
174176
(perc.peptide_len as f64).ln_1p(),
175177
(perc.missed_cleavages as f64),
176178
(perc.aligned_rt as f64),
179+
(perc.ims as f64),
177180
(perc.delta_rt_model as f64).clamp(0.001, 0.999).sqrt(),
181+
(perc.delta_ims_model as f64).clamp(0.001, 0.999).sqrt(),
178182
];
179183
x
180184
})

0 commit comments

Comments
 (0)