mscore/timstof/
collision.rs1use std::collections::HashMap;
2
3pub trait TimsTofCollisionEnergy {
4 fn get_collision_energy(&self, frame_id: i32, scan_id: i32) -> f64;
5}
6
7pub struct TimsTofCollisionEnergyDIA {
8 frame_to_window_group: HashMap<i32, i32>,
9 window_group_settings: HashMap<(i32, i32), f64>,
10}
11
12impl TimsTofCollisionEnergyDIA {
13 pub fn new(
14 frame: Vec<i32>,
15 frame_window_group: Vec<i32>,
16 window_group: Vec<i32>,
17 scan_start: Vec<i32>,
18 scan_end: Vec<i32>,
19 collision_energy: Vec<f64>,
20 ) -> Self {
21 let frame_to_window_group = frame.iter().zip(frame_window_group.iter()).map(|(&f, &wg)| (f, wg)).collect::<HashMap<i32, i32>>();
23 let mut window_group_settings: HashMap<(i32, i32), f64> = HashMap::new();
24
25 for (index, &wg) in window_group.iter().enumerate() {
26 let scan_start = scan_start[index];
27 let scan_end = scan_end[index];
28 let collision_energy = collision_energy[index];
29
30 for scan in scan_start..scan_end + 1 {
31 let key = (wg, scan);
32 window_group_settings.insert(key, collision_energy);
33 }
34 }
35
36 Self {
37 frame_to_window_group,
38 window_group_settings,
39 }
40 }
41}
42
43impl TimsTofCollisionEnergy for TimsTofCollisionEnergyDIA {
44 fn get_collision_energy(&self, frame_id: i32, scan_id: i32) -> f64 {
45 let window_group = self.frame_to_window_group.get(&frame_id);
46 match window_group {
47 Some(&wg) => {
48 let setting = self.window_group_settings.get(&(wg, scan_id));
49 match setting {
50 Some(&s) => s,
51 None => 0.0,
52 }
53 },
54 None => 0.0,
55 }
56 }
57}