Skip to main content

export_quant_digest/
export_quant_digest.rs

1//! Export the actual target digest for fixed quantitative protein grouping.
2//! Usage: export_quant_digest FASTA DIGEST_CONFIG_JSON OUTPUT_TSV
3use anyhow::{ensure, Result};
4use std::io::Write;
5use uno_core::{DigestConfig, PeptideDb};
6fn main() -> Result<()> {
7    let args: Vec<_> = std::env::args().skip(1).collect();
8    ensure!(
9        args.len() == 3,
10        "usage: export_quant_digest FASTA DIGEST_CONFIG_JSON OUTPUT_TSV"
11    );
12    let mut config: DigestConfig = serde_json::from_str(&std::fs::read_to_string(&args[1])?)?;
13    config.generate_decoys = false;
14    let db = PeptideDb::build(&args[0], &config)?;
15    let mut peptides: Vec<_> = db.peptides.iter().filter(|p| !p.decoy).collect();
16    peptides.sort_by(|a, b| {
17        a.sequence
18            .cmp(&b.sequence)
19            .then_with(|| a.mass.total_cmp(&b.mass))
20    });
21    let file = std::fs::OpenOptions::new()
22        .write(true)
23        .create_new(true)
24        .open(&args[2])?;
25    let mut out = std::io::BufWriter::new(file);
26    writeln!(out, "sequence\tmass\tproteins")?;
27    for p in &peptides {
28        let mut proteins: Vec<_> = p.proteins.iter().map(|x| x.as_ref()).collect();
29        proteins.sort();
30        proteins.dedup();
31        writeln!(out, "{}\t{}\t{}", p.sequence, p.mass, proteins.join(";"))?;
32    }
33    out.flush()?;
34    eprintln!("{} target peptide entries", peptides.len());
35    Ok(())
36}