1
1
use core:: fmt:: Debug ;
2
2
use core:: panic;
3
+ use std:: path:: Path ;
3
4
4
5
use indicatif:: ParallelProgressIterator ;
5
6
use log:: {
@@ -13,7 +14,17 @@ use serde::{
13
14
Deserialize ,
14
15
Serialize ,
15
16
} ;
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
+ } ;
17
28
18
29
use super :: aggregators:: aggregate_clusters;
19
30
use super :: dbscan:: runner:: dbscan_label_clusters;
@@ -28,11 +39,9 @@ use crate::ms::frames::{
28
39
DenseFrameWindow ,
29
40
ExpandedFrameSlice ,
30
41
FrameSlice ,
31
- MsMsFrameSliceWindowInfo ,
42
+ SingleQuadrupoleSettings ,
32
43
TimsPeak ,
33
44
} ;
34
- use crate :: ms:: tdf;
35
- use crate :: ms:: tdf:: DIAFrameInfo ;
36
45
use crate :: space:: space_generics:: {
37
46
AsNDPointsAtIndex ,
38
47
IntenseAtIndex ,
@@ -167,9 +176,8 @@ fn _denoise_denseframe(
167
176
168
177
fn denoise_frame_slice_window (
169
178
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 ,
173
181
min_n : usize ,
174
182
min_intensity : u64 ,
175
183
_mz_scaling : f64 ,
@@ -224,23 +232,7 @@ fn denoise_frame_slice_window(
224
232
) ;
225
233
226
234
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 ( ) ;
244
236
245
237
let mut raw_peaks: Vec < TimsPeak > = centroids
246
238
. into_iter ( )
@@ -266,15 +258,16 @@ fn denoise_frame_slice_window(
266
258
raw_peaks,
267
259
index : ref_frame. parent_frame_index ,
268
260
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 ,
270
263
sorted : None ,
264
+ window_group_id : ref_frame. window_group_id ,
265
+ intensity_correction_factor : ref_frame. intensity_correction_factor ,
271
266
} ,
272
267
ims_max : max_ims,
273
268
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,
278
271
} ;
279
272
maybe_save_json_if_debugging (
280
273
& out,
@@ -287,22 +280,17 @@ fn denoise_frame_slice_window(
287
280
288
281
fn denoise_frame_slice (
289
282
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 ,
293
285
min_n : usize ,
294
286
min_intensity : u64 ,
295
287
mz_scaling : f64 ,
296
288
max_mz_extension : f64 ,
297
289
ims_scaling : f32 ,
298
290
max_ims_extension : f32 ,
299
291
) -> 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) ;
306
294
let denoised_frame = _denoise_denseframe (
307
295
denseframe_window. frame ,
308
296
min_n,
@@ -317,10 +305,8 @@ fn denoise_frame_slice(
317
305
frame : denoised_frame,
318
306
ims_min : denseframe_window. ims_min ,
319
307
ims_max : denseframe_window. ims_max ,
320
- mz_start : denseframe_window. mz_start ,
321
- mz_end : denseframe_window. mz_end ,
322
308
group_id : denseframe_window. group_id ,
323
- quad_group_id : denseframe_window. quad_group_id ,
309
+ quadrupole_setting : denseframe_window. quadrupole_setting ,
324
310
}
325
311
}
326
312
@@ -365,8 +351,8 @@ struct FrameDenoiser {
365
351
ims_scaling : f32 ,
366
352
max_mz_extension : f64 ,
367
353
max_ims_extension : f32 ,
368
- ims_converter : timsrust :: Scan2ImConverter ,
369
- mz_converter : timsrust :: Tof2MzConverter ,
354
+ ims_converter : Scan2ImConverter ,
355
+ mz_converter : Tof2MzConverter ,
370
356
}
371
357
372
358
impl < ' a > Denoiser < ' a , Frame , DenseFrame , Converters , Option < usize > > for FrameDenoiser {
@@ -394,9 +380,8 @@ struct DIAFrameDenoiser {
394
380
max_mz_extension : f64 ,
395
381
ims_scaling : f32 ,
396
382
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 ,
400
385
}
401
386
402
387
// impl DIAFrameDenoiser {
@@ -433,15 +418,32 @@ impl<'a> Denoiser<'a, Frame, Vec<DenseFrameWindow>, Converters, Option<usize>>
433
418
{
434
419
info ! ( "Denoising (centroiding) {} frames" , elems. len( ) ) ;
435
420
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
+ }
437
438
438
439
// If profiling and having the "IONMESH_PROFILE_NUM_WINDOWS" env variable set
439
440
// then only process the first N slices of windows.
440
441
// This is useful for profiling the code.
441
442
if let Ok ( num_windows) = std:: env:: var ( "IONMESH_PROFILE_NUM_WINDOWS" ) {
442
443
let num_windows: usize = num_windows. parse ( ) . unwrap ( ) ;
443
444
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) ;
445
447
}
446
448
447
449
// This warning reders to denoise_frame_slice_window.
@@ -450,9 +452,12 @@ impl<'a> Denoiser<'a, Frame, Vec<DenseFrameWindow>, Converters, Option<usize>>
450
452
// by timsrust ...
451
453
warn ! ( "Using prototype function for denoising, scalings are hard-coded" ) ;
452
454
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 ( ) {
456
461
info ! ( "Denoising window {}/{}" , i + 1 , num_windows) ;
457
462
let start_tot_peaks = sv. iter ( ) . map ( |x| x. num_ndpoints ( ) as u64 ) . sum :: < u64 > ( ) ;
458
463
let progbar = indicatif:: ProgressBar :: new ( sv. len ( ) as u64 ) ;
@@ -462,7 +467,6 @@ impl<'a> Denoiser<'a, Frame, Vec<DenseFrameWindow>, Converters, Option<usize>>
462
467
x,
463
468
& self . ims_converter ,
464
469
& self . mz_converter ,
465
- & self . dia_frame_info ,
466
470
self . min_n ,
467
471
self . min_intensity ,
468
472
self . mz_scaling ,
@@ -481,7 +485,7 @@ impl<'a> Denoiser<'a, Frame, Vec<DenseFrameWindow>, Converters, Option<usize>>
481
485
. map ( lambda_denoise)
482
486
. collect :: < Vec < _ > > ( )
483
487
} else {
484
- sv. into_par_iter ( )
488
+ sv. par_iter ( )
485
489
. map ( |x| ExpandedFrameSlice :: from_frame_slice ( x) )
486
490
. collect :: < Vec < ExpandedFrameSlice > > ( )
487
491
. par_windows ( 3 )
@@ -518,18 +522,22 @@ pub fn read_all_ms1_denoising(
518
522
max_mz_extension : f64 ,
519
523
ims_scaling : f32 ,
520
524
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 ( ) ;
523
529
524
530
let mut timer = utils:: ContextTimer :: new ( "Reading all MS1 frames" , true , utils:: LogLevel :: INFO ) ;
525
531
526
- let mut frames = reader. read_all_ms1_frames ( ) ;
532
+ let frames: Result < Vec < Frame > , _ > = reader. get_all_ms1 ( ) . into_iter ( ) . collect ( ) ;
527
533
timer. stop ( true ) ;
528
534
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 ;
531
539
532
- frames. retain ( |frame| matches ! ( frame. frame_type , timsrust :: FrameType :: MS1 ) ) ;
540
+ frames. retain ( |frame| matches ! ( frame. ms_level , MSLevel :: MS1 ) ) ;
533
541
534
542
// let min_intensity = 100u64;
535
543
// let min_n: usize = 3;
@@ -548,29 +556,32 @@ pub fn read_all_ms1_denoising(
548
556
utils:: ContextTimer :: new ( "Denoising all MS1 frames" , true , utils:: LogLevel :: INFO ) ;
549
557
let out = ms1_denoiser. par_denoise_slice ( frames) ;
550
558
timer. stop ( true ) ;
551
- out
559
+ Ok ( out)
552
560
}
553
561
554
562
// This could probably be a macro ...
555
563
pub fn read_all_dia_denoising (
556
564
path : String ,
557
565
config : DenoiseConfig ,
558
- ) -> ( Vec < Vec < DenseFrameWindow > > , DIAFrameInfo ) {
566
+ ) -> Result < ( Vec < Vec < DenseFrameWindow > > , Vec < QuadrupoleSettings > ) , TimsRustError > {
559
567
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) ?;
561
572
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 ( ) ;
564
574
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 ;
567
577
timer. stop ( true ) ;
568
578
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 ,
574
585
} ) ;
575
586
576
587
let denoiser = DIAFrameDenoiser {
@@ -580,7 +591,6 @@ pub fn read_all_dia_denoising(
580
591
max_mz_extension : config. max_mz_expansion_ratio . into ( ) ,
581
592
ims_scaling : config. ims_scaling ,
582
593
max_ims_extension : config. max_ims_expansion_ratio ,
583
- dia_frame_info : dia_info. clone ( ) ,
584
594
ims_converter,
585
595
mz_converter,
586
596
} ;
@@ -589,5 +599,5 @@ pub fn read_all_dia_denoising(
589
599
let split_frames = denoiser. par_denoise_slice ( frames) ;
590
600
timer. stop ( true ) ;
591
601
592
- ( split_frames, dia_info )
602
+ Ok ( ( split_frames, quad_settings ) )
593
603
}
0 commit comments