mscore/timstof/
collision.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use std::collections::HashMap;

pub trait TimsTofCollisionEnergy {
    fn get_collision_energy(&self, frame_id: i32, scan_id: i32) -> f64;
}

pub struct TimsTofCollisionEnergyDIA {
    frame_to_window_group: HashMap<i32, i32>,
    window_group_settings: HashMap<(i32, i32), f64>,
}

impl TimsTofCollisionEnergyDIA {
    pub fn new(
        frame: Vec<i32>,
        frame_window_group: Vec<i32>,
        window_group: Vec<i32>,
        scan_start: Vec<i32>,
        scan_end: Vec<i32>,
        collision_energy: Vec<f64>,
    ) -> Self {
        // hashmap from frame to window group
        let frame_to_window_group = frame.iter().zip(frame_window_group.iter()).map(|(&f, &wg)| (f, wg)).collect::<HashMap<i32, i32>>();
        let mut window_group_settings: HashMap<(i32, i32), f64> = HashMap::new();

        for (index, &wg) in window_group.iter().enumerate() {
            let scan_start = scan_start[index];
            let scan_end = scan_end[index];
            let collision_energy = collision_energy[index];

            for scan in scan_start..scan_end + 1 {
                let key = (wg, scan);
                window_group_settings.insert(key, collision_energy);
            }
        }

        Self {
            frame_to_window_group,
            window_group_settings,
        }
    }
}

impl TimsTofCollisionEnergy for TimsTofCollisionEnergyDIA {
    fn get_collision_energy(&self, frame_id: i32, scan_id: i32) -> f64 {
        let window_group = self.frame_to_window_group.get(&frame_id);
        match window_group {
            Some(&wg) => {
                let setting = self.window_group_settings.get(&(wg, scan_id));
                match setting {
                    Some(&s) => s,
                    None => 0.0,
                }
            },
            None => 0.0,
        }
    }
}