Skip to main content

from_stdin/
from_stdin.rs

1/*!
2 * Demo how to read a data file from STDIN, and then batch collect its spectra
3 */
4use std::io::{self, Seek};
5use std::time::Instant;
6
7use mzdata::io::{
8    infer_from_stream, MassSpectrometryFormat, PreBufferedStream, RestartableGzDecoder,
9    SpectrumSource,
10};
11use mzdata::{MGFReader, MzMLReader};
12
13fn main() -> io::Result<()> {
14    env_logger::init();
15    let start = Instant::now();
16    let stream = io::stdin();
17    let mut stream = PreBufferedStream::new(stream)?;
18    let (fmt, compressed) = infer_from_stream(&mut stream)?;
19    stream.seek(io::SeekFrom::Start(0))?;
20    let groups: Vec<_> = match fmt {
21        MassSpectrometryFormat::MGF => {
22            if compressed {
23                MGFReader::new(RestartableGzDecoder::new(io::BufReader::new(stream)))
24                    .into_groups()
25                    .collect()
26            } else {
27                MGFReader::new(stream).into_groups().collect()
28            }
29        }
30        MassSpectrometryFormat::MzML => {
31            if compressed {
32                MzMLReader::new(RestartableGzDecoder::new(io::BufReader::new(stream)))
33                    .into_groups()
34                    .collect()
35            } else {
36                MzMLReader::new(stream).into_groups().collect()
37            }
38        }
39        x => {
40            panic!("Cannot identify file format ({:?})", x)
41        }
42    };
43    let spectra: Vec<_> = groups
44        .iter()
45        .flat_map(|g| g.precursor.iter().chain(g.products.iter()))
46        .collect();
47    let end = Instant::now();
48    eprintln!(
49        "Read {} groups with {} spectra in {:0.3?}",
50        groups.len(),
51        spectra.len(),
52        end - start
53    );
54    assert!(!spectra.is_empty());
55    Ok(())
56}