census_proteomics/
protein.rs1#[cfg(feature = "serialization")]
2use serde::Serialize;
3
4#[cfg_attr(feature = "serde", derive(Serialize))]
5#[derive(PartialEq, PartialOrd, Clone, Default)]
6pub struct Protein {
9 pub accession: String,
11 pub description: String,
13 pub spectral_count: u16,
15 pub sequence_count: u16,
17 pub sequence_coverage: f32,
19 pub molecular_weight: u32,
21 pub peptides: Vec<Peptide>,
23
24 pub channels: u8,
25}
26
27impl Protein {
28 pub fn total(&self) -> Vec<u32> {
30 let mut v = Vec::with_capacity(self.channels as usize);
31 for c in 0..self.channels {
32 let sum = self.peptides.iter().map(|pep| pep.values[c as usize]).sum();
33 v.push(sum);
34 }
35 v
36 }
37
38 pub fn ratios(&self) -> Vec<f64> {
41 let values = self.total();
42 let total = values.iter().sum::<u32>() as f64;
43 values.iter().map(|v| *v as f64 / total).collect()
44 }
45}
46
47#[cfg_attr(feature = "serde", derive(Serialize))]
48#[derive(PartialEq, PartialOrd, Clone, Debug, Default)]
49pub struct Peptide {
51 pub sequence: String,
53 pub values: Vec<u32>,
55 pub unique: bool,
57
58 pub purity: f32,
59
60 pub scan: usize,
61}
62
63impl Peptide {
64 pub fn tryptic(&self) -> bool {
66 let cterm = self.sequence.ends_with('-');
67 let front = self.sequence.starts_with(|c| match c {
68 'K' | 'R' | '-' => true,
69 _ => false,
70 });
71 let end = self
72 .sequence
73 .split('.')
74 .skip(1)
75 .next()
76 .map(|s| {
77 s.ends_with(|c| match c {
78 'K' | 'R' => true,
79 _ => cterm,
80 })
81 })
82 .unwrap_or(false);
83 front && end
84 }
88
89 pub fn ratios(&self) -> Vec<f64> {
92 let total: f64 = self.values.iter().sum::<u32>() as f64;
93 self.values.iter().map(|v| *v as f64 / total).collect()
94 }
95
96 pub fn swap_channels(&mut self, a: usize, b: usize) {
103 self.values.swap(a, b)
104 }
105}
106
107#[cfg(test)]
108mod test {
109 use super::*;
110
111 fn gen_peptide(sequence: &str) -> Peptide {
112 Peptide {
113 sequence: sequence.into(),
114 ..Peptide::default()
115 }
116 }
117 #[test]
118 fn test_trypic() {
119 assert!(gen_peptide("-.KMDKDK.-").tryptic());
120 assert!(!gen_peptide("S.KMDKDK.-").tryptic());
121 assert!(gen_peptide("R.TLDGFK*K.F").tryptic());
122 assert!(!gen_peptide("K.KMDKDT.A").tryptic());
123 }
124}