Skip to content
This repository was archived by the owner on Jun 5, 2025. It is now read-only.

Commit d5a3d91

Browse files
committed
chore(timsrust)!: (wip) updated timsrust versioncargo
1 parent 6bf5b65 commit d5a3d91

File tree

14 files changed

+497
-1981
lines changed

14 files changed

+497
-1981
lines changed

Cargo.lock

Lines changed: 69 additions & 1208 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ license = "Apache-2.0"
77
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
88

99
[dependencies]
10-
timsrust = "= 0.2.2"
10+
timsrust = "= 0.4.1"
1111

1212
# Serialization
1313
serde = { version = "1.0.193", features = ["derive"] }
@@ -22,10 +22,6 @@ clap = {version = "4.4.17", features = ["derive"]}
2222
csv = "1.3.0"
2323
rand = "0.8.5"
2424

25-
sqlx = { version = "0.7.2", features = ["runtime-tokio-native-tls", "sqlite"]}
26-
libsqlite3-sys = "^0.26.0"
27-
tokio = {version="1.38.0", features = ["rt", "rt-multi-thread"]}
28-
2925
# Sage
3026
sage-core = { git = "https://github.com/lazear/sage.git", rev = "9e870429889b341c4773df32b65e553283301a93" }
3127
toml = "0.8.8"

src/aggregation/dbscan/denseframe_dbscan.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
use timsrust::{
2+
AcquisitionType,
3+
MSLevel,
4+
QuadrupoleSettings,
5+
};
6+
17
use crate::aggregation::aggregators::TimsPeakAggregator;
28
use crate::aggregation::converters::{
39
BypassDenseFrameBackConverter,
@@ -6,6 +12,7 @@ use crate::aggregation::converters::{
612
use crate::aggregation::dbscan::dbscan::dbscan_generic;
713
use crate::ms::frames::{
814
DenseFrame,
15+
SingleQuadrupoleSettings,
916
TimsPeak,
1017
};
1118
use crate::space::space_generics::{
@@ -25,9 +32,12 @@ pub fn dbscan_denseframe(
2532
min_n: usize,
2633
min_intensity: u64,
2734
) -> DenseFrame {
28-
let out_frame_type: timsrust::FrameType = denseframe.frame_type;
35+
let out_acq_type: timsrust::AcquisitionType = denseframe.acquisition_type;
2936
let out_rt: f64 = denseframe.rt;
3037
let out_index: usize = denseframe.index;
38+
let out_ms_level: MSLevel = denseframe.ms_level;
39+
let out_window_group_id = denseframe.window_group_id;
40+
let out_correction_factor = denseframe.intensity_correction_factor;
3141

3242
let prefiltered_peaks = {
3343
denseframe.sort_by_mz();
@@ -72,8 +82,11 @@ pub fn dbscan_denseframe(
7282
raw_peaks: peak_vec,
7383
index: out_index,
7484
rt: out_rt,
75-
frame_type: out_frame_type,
85+
acquisition_type: out_acq_type,
7686
sorted: None,
87+
ms_level: out_ms_level,
88+
window_group_id: out_window_group_id,
89+
intensity_correction_factor: out_correction_factor,
7790
}
7891
}
7992

src/aggregation/ms_denoise.rs

Lines changed: 83 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use core::fmt::Debug;
22
use core::panic;
3+
use std::path::Path;
34

45
use indicatif::ParallelProgressIterator;
56
use log::{
@@ -13,7 +14,17 @@ use serde::{
1314
Deserialize,
1415
Serialize,
1516
};
16-
use timsrust::Frame;
17+
use timsrust::converters::{
18+
Scan2ImConverter,
19+
Tof2MzConverter,
20+
};
21+
use timsrust::{
22+
AcquisitionType,
23+
Frame,
24+
MSLevel,
25+
QuadrupoleSettings,
26+
TimsRustError,
27+
};
1728

1829
use super::aggregators::aggregate_clusters;
1930
use super::dbscan::runner::dbscan_label_clusters;
@@ -28,11 +39,9 @@ use crate::ms::frames::{
2839
DenseFrameWindow,
2940
ExpandedFrameSlice,
3041
FrameSlice,
31-
MsMsFrameSliceWindowInfo,
42+
SingleQuadrupoleSettings,
3243
TimsPeak,
3344
};
34-
use crate::ms::tdf;
35-
use crate::ms::tdf::DIAFrameInfo;
3645
use crate::space::space_generics::{
3746
AsNDPointsAtIndex,
3847
IntenseAtIndex,
@@ -167,9 +176,8 @@ fn _denoise_denseframe(
167176

168177
fn denoise_frame_slice_window(
169178
frameslice_window: &[ExpandedFrameSlice],
170-
ims_converter: &timsrust::Scan2ImConverter,
171-
mz_converter: &timsrust::Tof2MzConverter,
172-
_dia_frame_info: &DIAFrameInfo,
179+
ims_converter: &Scan2ImConverter,
180+
mz_converter: &Tof2MzConverter,
173181
min_n: usize,
174182
min_intensity: u64,
175183
_mz_scaling: f64,
@@ -224,23 +232,7 @@ fn denoise_frame_slice_window(
224232
);
225233

226234
let ref_frame = &frameslice_window[frameslice_window.len() / 2];
227-
if ref_frame.slice_window_info.is_none() {
228-
panic!("No slice window info found");
229-
}
230-
231-
let slice_info = ref_frame.slice_window_info.as_ref().unwrap();
232-
let quad_group_id = match slice_info {
233-
MsMsFrameSliceWindowInfo::WindowGroup(x) => *x,
234-
MsMsFrameSliceWindowInfo::SingleWindow(x) => x.global_quad_row_id,
235-
};
236-
let min_mz = match slice_info {
237-
MsMsFrameSliceWindowInfo::WindowGroup(_x) => 0.0,
238-
MsMsFrameSliceWindowInfo::SingleWindow(x) => x.mz_start,
239-
};
240-
let max_mz = match slice_info {
241-
MsMsFrameSliceWindowInfo::WindowGroup(_x) => 0.0,
242-
MsMsFrameSliceWindowInfo::SingleWindow(x) => x.mz_end,
243-
};
235+
let quad_settings = ref_frame.quadrupole_settings.clone();
244236

245237
let mut raw_peaks: Vec<TimsPeak> = centroids
246238
.into_iter()
@@ -266,15 +258,16 @@ fn denoise_frame_slice_window(
266258
raw_peaks,
267259
index: ref_frame.parent_frame_index,
268260
rt: ref_frame.rt,
269-
frame_type: timsrust::FrameType::MS2(timsrust::AcquisitionType::DIAPASEF),
261+
acquisition_type: ref_frame.acquisition_type,
262+
ms_level: ref_frame.ms_level,
270263
sorted: None,
264+
window_group_id: ref_frame.window_group_id,
265+
intensity_correction_factor: ref_frame.intensity_correction_factor,
271266
},
272267
ims_max: max_ims,
273268
ims_min: min_ims,
274-
mz_start: min_mz as f64,
275-
mz_end: max_mz as f64,
276-
group_id: quad_group_id,
277-
quad_group_id,
269+
group_id: ref_frame.window_group_id.into(),
270+
quadrupole_setting: quad_settings,
278271
};
279272
maybe_save_json_if_debugging(
280273
&out,
@@ -287,22 +280,17 @@ fn denoise_frame_slice_window(
287280

288281
fn denoise_frame_slice(
289282
frame_window: &FrameSlice,
290-
ims_converter: &timsrust::Scan2ImConverter,
291-
mz_converter: &timsrust::Tof2MzConverter,
292-
dia_frame_info: &DIAFrameInfo,
283+
ims_converter: &Scan2ImConverter,
284+
mz_converter: &Tof2MzConverter,
293285
min_n: usize,
294286
min_intensity: u64,
295287
mz_scaling: f64,
296288
max_mz_extension: f64,
297289
ims_scaling: f32,
298290
max_ims_extension: f32,
299291
) -> DenseFrameWindow {
300-
let denseframe_window = DenseFrameWindow::from_frame_window(
301-
frame_window,
302-
ims_converter,
303-
mz_converter,
304-
dia_frame_info,
305-
);
292+
let denseframe_window =
293+
DenseFrameWindow::from_frame_window(frame_window, ims_converter, mz_converter);
306294
let denoised_frame = _denoise_denseframe(
307295
denseframe_window.frame,
308296
min_n,
@@ -317,10 +305,8 @@ fn denoise_frame_slice(
317305
frame: denoised_frame,
318306
ims_min: denseframe_window.ims_min,
319307
ims_max: denseframe_window.ims_max,
320-
mz_start: denseframe_window.mz_start,
321-
mz_end: denseframe_window.mz_end,
322308
group_id: denseframe_window.group_id,
323-
quad_group_id: denseframe_window.quad_group_id,
309+
quadrupole_setting: denseframe_window.quadrupole_setting,
324310
}
325311
}
326312

@@ -365,8 +351,8 @@ struct FrameDenoiser {
365351
ims_scaling: f32,
366352
max_mz_extension: f64,
367353
max_ims_extension: f32,
368-
ims_converter: timsrust::Scan2ImConverter,
369-
mz_converter: timsrust::Tof2MzConverter,
354+
ims_converter: Scan2ImConverter,
355+
mz_converter: Tof2MzConverter,
370356
}
371357

372358
impl<'a> Denoiser<'a, Frame, DenseFrame, Converters, Option<usize>> for FrameDenoiser {
@@ -394,9 +380,8 @@ struct DIAFrameDenoiser {
394380
max_mz_extension: f64,
395381
ims_scaling: f32,
396382
max_ims_extension: f32,
397-
dia_frame_info: DIAFrameInfo,
398-
ims_converter: timsrust::Scan2ImConverter,
399-
mz_converter: timsrust::Tof2MzConverter,
383+
ims_converter: Scan2ImConverter,
384+
mz_converter: Tof2MzConverter,
400385
}
401386

402387
// impl DIAFrameDenoiser {
@@ -433,15 +418,32 @@ impl<'a> Denoiser<'a, Frame, Vec<DenseFrameWindow>, Converters, Option<usize>>
433418
{
434419
info!("Denoising (centroiding) {} frames", elems.len());
435420

436-
let mut frame_window_slices = self.dia_frame_info.split_frame_windows(&elems);
421+
let mut flat_windows: Vec<FrameSlice<'_>> = elems
422+
.par_iter()
423+
.flat_map(|x: &Frame| FrameSlice::from_frame(x))
424+
.collect();
425+
426+
flat_windows.par_sort_unstable_by(|a, b| {
427+
a.quadrupole_settings
428+
.partial_cmp(&b.quadrupole_settings)
429+
.unwrap()
430+
});
431+
432+
let mut break_points = vec![0];
433+
for i in 1..flat_windows.len() {
434+
if flat_windows[i].quadrupole_settings != flat_windows[i - 1].quadrupole_settings {
435+
break_points.push(i);
436+
}
437+
}
437438

438439
// If profiling and having the "IONMESH_PROFILE_NUM_WINDOWS" env variable set
439440
// then only process the first N slices of windows.
440441
// This is useful for profiling the code.
441442
if let Ok(num_windows) = std::env::var("IONMESH_PROFILE_NUM_WINDOWS") {
442443
let num_windows: usize = num_windows.parse().unwrap();
443444
log::warn!("Profiling: Only processing {} windows", num_windows);
444-
frame_window_slices.truncate(num_windows);
445+
flat_windows.truncate(break_points[num_windows]);
446+
break_points.truncate(num_windows);
445447
}
446448

447449
// This warning reders to denoise_frame_slice_window.
@@ -450,9 +452,12 @@ impl<'a> Denoiser<'a, Frame, Vec<DenseFrameWindow>, Converters, Option<usize>>
450452
// by timsrust ...
451453
warn!("Using prototype function for denoising, scalings are hard-coded");
452454

453-
let mut out = Vec::with_capacity(frame_window_slices.len());
454-
let num_windows = frame_window_slices.len();
455-
for (i, sv) in frame_window_slices.iter().enumerate() {
455+
let num_windows = break_points.len() - 1;
456+
let mut out = Vec::with_capacity(num_windows);
457+
let frame_window_slices: Vec<(usize, &[FrameSlice])> = (0..num_windows)
458+
.map(|i| (i, &flat_windows[break_points[i]..break_points[i + 1]]))
459+
.collect();
460+
for (i, sv) in frame_window_slices.iter() {
456461
info!("Denoising window {}/{}", i + 1, num_windows);
457462
let start_tot_peaks = sv.iter().map(|x| x.num_ndpoints() as u64).sum::<u64>();
458463
let progbar = indicatif::ProgressBar::new(sv.len() as u64);
@@ -462,7 +467,6 @@ impl<'a> Denoiser<'a, Frame, Vec<DenseFrameWindow>, Converters, Option<usize>>
462467
x,
463468
&self.ims_converter,
464469
&self.mz_converter,
465-
&self.dia_frame_info,
466470
self.min_n,
467471
self.min_intensity,
468472
self.mz_scaling,
@@ -481,7 +485,7 @@ impl<'a> Denoiser<'a, Frame, Vec<DenseFrameWindow>, Converters, Option<usize>>
481485
.map(lambda_denoise)
482486
.collect::<Vec<_>>()
483487
} else {
484-
sv.into_par_iter()
488+
sv.par_iter()
485489
.map(|x| ExpandedFrameSlice::from_frame_slice(x))
486490
.collect::<Vec<ExpandedFrameSlice>>()
487491
.par_windows(3)
@@ -518,18 +522,22 @@ pub fn read_all_ms1_denoising(
518522
max_mz_extension: f64,
519523
ims_scaling: f32,
520524
max_ims_extension: f32,
521-
) -> Vec<DenseFrame> {
522-
let reader = timsrust::FileReader::new(path).unwrap();
525+
) -> Result<Vec<DenseFrame>, TimsRustError> {
526+
let metadata_path = Path::new(&path.clone()).join("analysis.tdf");
527+
let reader = timsrust::readers::FrameReader::new(path).unwrap();
528+
let metadata = timsrust::readers::MetadataReader::new(metadata_path).unwrap();
523529

524530
let mut timer = utils::ContextTimer::new("Reading all MS1 frames", true, utils::LogLevel::INFO);
525531

526-
let mut frames = reader.read_all_ms1_frames();
532+
let frames: Result<Vec<Frame>, _> = reader.get_all_ms1().into_iter().collect();
527533
timer.stop(true);
528534

529-
let ims_converter = reader.get_scan_converter().unwrap();
530-
let mz_converter = reader.get_tof_converter().unwrap();
535+
let mut frames = frames?;
536+
537+
let ims_converter = metadata.im_converter;
538+
let mz_converter = metadata.mz_converter;
531539

532-
frames.retain(|frame| matches!(frame.frame_type, timsrust::FrameType::MS1));
540+
frames.retain(|frame| matches!(frame.ms_level, MSLevel::MS1));
533541

534542
// let min_intensity = 100u64;
535543
// let min_n: usize = 3;
@@ -548,29 +556,32 @@ pub fn read_all_ms1_denoising(
548556
utils::ContextTimer::new("Denoising all MS1 frames", true, utils::LogLevel::INFO);
549557
let out = ms1_denoiser.par_denoise_slice(frames);
550558
timer.stop(true);
551-
out
559+
Ok(out)
552560
}
553561

554562
// This could probably be a macro ...
555563
pub fn read_all_dia_denoising(
556564
path: String,
557565
config: DenoiseConfig,
558-
) -> (Vec<Vec<DenseFrameWindow>>, DIAFrameInfo) {
566+
) -> Result<(Vec<Vec<DenseFrameWindow>>, Vec<QuadrupoleSettings>), TimsRustError> {
559567
let mut timer = utils::ContextTimer::new("Reading all DIA frames", true, utils::LogLevel::INFO);
560-
let reader = timsrust::FileReader::new(path.clone()).unwrap();
568+
let metadata_path = Path::new(&path.clone()).join("analysis.tdf");
569+
let reader = timsrust::readers::FrameReader::new(path)?;
570+
let metadata = timsrust::readers::MetadataReader::new(metadata_path.clone())?;
571+
let quad_settings = timsrust::readers::QuadrupoleSettingsReader::new(metadata_path)?;
561572

562-
let dia_info = tdf::read_dia_frame_info(path.clone()).unwrap();
563-
let mut frames = reader.read_all_ms2_frames();
573+
let frames: Result<Vec<Frame>, _> = reader.get_all_ms2().into_iter().collect();
564574

565-
let ims_converter = reader.get_scan_converter().unwrap();
566-
let mz_converter = reader.get_tof_converter().unwrap();
575+
let ims_converter = metadata.im_converter;
576+
let mz_converter = metadata.mz_converter;
567577
timer.stop(true);
568578

569-
frames.retain(|frame| {
570-
matches!(
571-
frame.frame_type,
572-
timsrust::FrameType::MS2(timsrust::AcquisitionType::DIAPASEF)
573-
)
579+
let mut frames = frames?;
580+
581+
frames.retain(|frame| match (frame.ms_level, frame.acquisition_type) {
582+
(MSLevel::MS2, AcquisitionType::DIAPASEF) => true,
583+
(MSLevel::MS2, AcquisitionType::DiagonalDIAPASEF) => true,
584+
_ => false,
574585
});
575586

576587
let denoiser = DIAFrameDenoiser {
@@ -580,7 +591,6 @@ pub fn read_all_dia_denoising(
580591
max_mz_extension: config.max_mz_expansion_ratio.into(),
581592
ims_scaling: config.ims_scaling,
582593
max_ims_extension: config.max_ims_expansion_ratio,
583-
dia_frame_info: dia_info.clone(),
584594
ims_converter,
585595
mz_converter,
586596
};
@@ -589,5 +599,5 @@ pub fn read_all_dia_denoising(
589599
let split_frames = denoiser.par_denoise_slice(frames);
590600
timer.stop(true);
591601

592-
(split_frames, dia_info)
602+
Ok((split_frames, quad_settings))
593603
}

0 commit comments

Comments
 (0)