msn_kit/io/mzml_parser/
binary_conversion.rs1use flate2::read::ZlibDecoder;
5use std::io::prelude::*;
6
7use crate::io::mzml_parser::types::{Binary, CompressionType, DataType};
8
9use byteorder::{LittleEndian, ReadBytesExt};
10use std::io::Cursor;
11
12pub fn decode_binary_array(b: &Binary, ct: &CompressionType, dt: &DataType) -> Vec<f64> {
14 let decoded = base64::decode(&b.content).expect("Unable to decode binary.");
15
16 match (ct, dt) {
17 (CompressionType::NoCompression, DataType::Float32Bit) => {
18 binary_string_to_array_f32(decoded)
19 }
20 (CompressionType::NoCompression, DataType::Float64Bit) => {
21 binary_string_to_array_f64(decoded)
22 }
23 (CompressionType::ZlibCompression, DataType::Float64Bit) => {
24 let mut decoded_bytes = Vec::<u8>::new();
25
26 let rdr = Cursor::new(decoded);
27
28 let mut d = ZlibDecoder::new(rdr);
29 d.read_to_end(&mut decoded_bytes).unwrap();
30
31 binary_string_to_array_f64(decoded_bytes)
32 }
33 (CompressionType::ZlibCompression, DataType::Float32Bit) => {
34 let mut decoded_bytes = Vec::<u8>::new();
35
36 let rdr = Cursor::new(decoded);
37
38 let mut d = ZlibDecoder::new(rdr);
39 d.read_to_end(&mut decoded_bytes).unwrap();
40
41 binary_string_to_array_f32(decoded_bytes)
42 }
43 }
44}
45
46pub fn binary_string_to_array_f32(decoded: Vec<u8>) -> Vec<f64> {
47 let mut rdr = Cursor::new(decoded);
48
49 let mut peaks = Vec::<f64>::new();
50 while let Ok(fl) = rdr.read_f32::<LittleEndian>() {
51 peaks.push(f64::from(fl));
52 }
53
54 peaks
55}
56
57pub fn binary_string_to_array_f64(decoded: Vec<u8>) -> Vec<f64> {
58 let mut rdr = Cursor::new(decoded);
59
60 let mut peaks = Vec::<f64>::new();
61 while let Ok(fl) = rdr.read_f64::<LittleEndian>() {
62 peaks.push(fl);
63 }
64
65 peaks
66}
67
68#[cfg(test)]
69mod tests {
70 use super::*;
71
72 use crate::io::mzml_parser::types::Binary;
73 use crate::io::mzml_parser::types::DataType;
74
75 #[test]
76 fn parse_mzml_test() {
77 struct TestData {
78 binary: Binary,
79 compression_type: CompressionType,
80 data_type: DataType,
81 expected_array: Vec<f64>,
82 }
83
84 impl TestData {
85 pub fn new(
86 binary: Binary,
87 compression_type: CompressionType,
88 data_type: DataType,
89 expected_array: Vec<f64>,
90 ) -> Self {
91 Self {
92 binary,
93 compression_type,
94 data_type,
95 expected_array,
96 }
97 }
98 }
99
100 let tests = vec![
101 TestData::new(Binary::new(String::from("AAAAAAAALkAAAAAAAAAsQAAAAAAAACpAAAAAAAAAKEAAAAAAAAAmQAAAAAAAACRAAAAAAAAAIkAAAAAAAAAgQAAAAAAAABxAAAAAAAAAGEAAAAAAAAAUQAAAAAAAABBAAAAAAAAACEAAAAAAAAAAQAAAAAAAAPA/")), CompressionType::NoCompression, DataType::Float64Bit, vec![15.0, 14.0, 13.0, 12.0, 11.0, 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0]),
102 TestData::new(Binary::new(String::from("eJxjYEABDhBKAEpLQGkFKK0CpTWgtA6UNoDSRg4AZlQDYw==")), CompressionType::ZlibCompression, DataType::Float64Bit, vec![0.0, 2.0, 4.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0])
103 ];
104
105 for test in tests.iter() {
106 let array = decode_binary_array(&test.binary, &test.compression_type, &test.data_type);
107 assert_eq!(array, test.expected_array);
108 }
109 }
110}