mscore/timstof/
collision.rs

1use 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        // hashmap from frame to window group
22        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}