echtvar.rs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. use std::{process::{Command, Stdio}, io::{BufReader, BufRead}};
  2. use anyhow::{Context, Ok, Result};
  3. use log::{info, warn};
  4. use super::{cosmic::Cosmic, gnomad::GnomAD};
  5. // /data/tools/echtvar anno -e /data/ref/hs1/CosmicCodingMuts.echtvar.zip -e /data/ref/hs1/gnomAD_4-2022_10-gnomad.echtvar.zip BENGUIRAT_diag_clairs_PASSED.vcf.gz test.bcf
  6. pub fn run_echtvar(in_path: &str, out_path: &str) -> Result<()> {
  7. let bin_dir = "/data/tools";
  8. let annot_sources: Vec<&str> = vec![
  9. "/data/ref/hs1/CosmicCodingMuts.echtvar.zip",
  10. "/data/ref/hs1/gnomAD_4-2022_10-gnomad.echtvar.zip",
  11. ]
  12. .iter()
  13. .flat_map(|e| vec!["-e", e])
  14. .collect();
  15. // info!("Running echtvar anno for {}", in_path);
  16. let mut cmd = Command::new(format!("{}/echtvar", bin_dir))
  17. .arg("anno")
  18. .args(annot_sources)
  19. .arg(in_path)
  20. .arg(out_path)
  21. .stderr(Stdio::piped())
  22. .spawn()
  23. .context("echtvar anno failed to start")?;
  24. let stderr = cmd.stderr.take().unwrap();
  25. let reader = BufReader::new(stderr);
  26. reader
  27. .lines()
  28. .filter_map(|line| line.ok())
  29. .filter(|line| line.find("error").is_some())
  30. .for_each(|line| warn!("{}", line));
  31. cmd.wait()?;
  32. Ok(())
  33. }
  34. pub fn parse_echtvar_val(s: &str) -> Result<(Option<Cosmic>, Option<GnomAD>)> {
  35. let mi: Vec<_> = s.match_indices(r";gnomad").collect();
  36. let (i, _) = mi[0];
  37. let str_cosmic = &s[..i];
  38. let str_gnomad = &s[i + 1..];
  39. let cosmic = if str_cosmic.contains("MISSING") {
  40. None
  41. } else {
  42. Some(str_cosmic.parse::<Cosmic>()?)
  43. };
  44. let gnomad = if str_gnomad.contains("-1") {
  45. None
  46. } else {
  47. Some(str_gnomad.parse::<GnomAD>()?)
  48. };
  49. Ok((cosmic, gnomad))
  50. }