|
|
@@ -58,18 +58,21 @@
|
|
|
|
|
|
use std::{
|
|
|
fs,
|
|
|
- io::{BufRead, BufReader},
|
|
|
+ // io::{BufRead, BufReader},
|
|
|
path::Path,
|
|
|
- process::{Command, Stdio},
|
|
|
- sync::{Arc, Mutex},
|
|
|
+ // process::{Command, Stdio},
|
|
|
+ // sync::{Arc, Mutex},
|
|
|
thread,
|
|
|
};
|
|
|
|
|
|
use log::info;
|
|
|
|
|
|
-use crate::commands::bcftools::{Bcftools, BcftoolsConfig};
|
|
|
+use crate::{
|
|
|
+ commands::bcftools::{bcftools_keep_pass, BcftoolsConfig},
|
|
|
+ runners::{run_wait, CommandRun, RunReport},
|
|
|
+};
|
|
|
|
|
|
-#[derive(Debug)]
|
|
|
+#[derive(Debug, Clone)]
|
|
|
pub struct NanomonSVConfig {
|
|
|
pub bin: String,
|
|
|
pub result_dir: String,
|
|
|
@@ -125,80 +128,86 @@ impl NanomonSV {
|
|
|
}
|
|
|
|
|
|
// Parse
|
|
|
+ info!("Nanomonsv Parse");
|
|
|
let diag_out_prefix = format!("{}/{}_diag", self.diag_out_dir, self.id);
|
|
|
let mrd_out_prefix = format!("{}/{}_mrd", self.mrd_out_dir, self.id);
|
|
|
|
|
|
let diag_info_vcf = format!("{diag_out_prefix}.bp_info.sorted.bed.gz");
|
|
|
let mrd_info_vcf = format!("{mrd_out_prefix}.bp_info.sorted.bed.gz");
|
|
|
|
|
|
- let log: Arc<Mutex<String>> = Arc::new(Mutex::new(String::default()));
|
|
|
+ // let log: Arc<Mutex<String>> = Arc::new(Mutex::new(String::default()));
|
|
|
|
|
|
let mut threads_handles = Vec::new();
|
|
|
if !Path::new(&diag_info_vcf).exists() {
|
|
|
- let bin = self.config.bin.clone();
|
|
|
- let reference = self.config.reference.clone();
|
|
|
+ // let bin = self.config.bin.clone();
|
|
|
+ // let reference = self.config.reference.clone();
|
|
|
let diag_bam = self.diag_bam.clone();
|
|
|
- let log = log.clone();
|
|
|
+ // let log = log.clone();
|
|
|
let diag_out_prefix = diag_out_prefix.clone();
|
|
|
+ let config = self.config.clone();
|
|
|
|
|
|
let handle = thread::spawn(move || {
|
|
|
- let mut child = Command::new(bin)
|
|
|
- .args([
|
|
|
- "parse",
|
|
|
- "--reference_fasta",
|
|
|
- &reference,
|
|
|
- &diag_bam,
|
|
|
- &diag_out_prefix,
|
|
|
- ])
|
|
|
- .stdout(Stdio::piped())
|
|
|
- .stderr(Stdio::inherit())
|
|
|
- .spawn()
|
|
|
- .expect("Failed to spawn NanomonSV parse");
|
|
|
-
|
|
|
- if let Some(stdout) = child.stdout.take() {
|
|
|
- let reader = BufReader::new(stdout);
|
|
|
- for line in reader.lines().map_while(Result::ok) {
|
|
|
- info!("{}", line);
|
|
|
- let mut log_lock = log.lock().unwrap();
|
|
|
- log_lock.push_str(&line);
|
|
|
- log_lock.push('\n');
|
|
|
- }
|
|
|
- }
|
|
|
+ nanomonsv_parse(&diag_bam, &diag_out_prefix, config).unwrap();
|
|
|
+ // let mut child = Command::new(bin)
|
|
|
+ // .args([
|
|
|
+ // "parse",
|
|
|
+ // "--reference_fasta",
|
|
|
+ // &reference,
|
|
|
+ // &diag_bam,
|
|
|
+ // &diag_out_prefix,
|
|
|
+ // ])
|
|
|
+ // .stdout(Stdio::piped())
|
|
|
+ // .stderr(Stdio::inherit())
|
|
|
+ // .spawn()
|
|
|
+ // .expect("Failed to spawn NanomonSV parse");
|
|
|
+ //
|
|
|
+ // if let Some(stdout) = child.stdout.take() {
|
|
|
+ // let reader = BufReader::new(stdout);
|
|
|
+ // for line in reader.lines().map_while(Result::ok) {
|
|
|
+ // info!("{}", line);
|
|
|
+ // let mut log_lock = log.lock().unwrap();
|
|
|
+ // log_lock.push_str(&line);
|
|
|
+ // log_lock.push('\n');
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // child.wait().unwrap();
|
|
|
});
|
|
|
threads_handles.push(handle);
|
|
|
}
|
|
|
|
|
|
if !Path::new(&mrd_info_vcf).exists() {
|
|
|
- let bin = self.config.bin.clone();
|
|
|
- let reference = self.config.reference.clone();
|
|
|
- let mrd_bam = self.diag_bam.clone();
|
|
|
- let log = log.clone();
|
|
|
+ // let bin = self.config.bin.clone();
|
|
|
+ // let reference = self.config.reference.clone();
|
|
|
+ // let log = log.clone();
|
|
|
let mrd_out_prefix = mrd_out_prefix.clone();
|
|
|
+ let mrd_bam = self.mrd_bam.clone();
|
|
|
+ let config = self.config.clone();
|
|
|
|
|
|
let handle = thread::spawn(move || {
|
|
|
- let mut child = Command::new(bin)
|
|
|
- .args([
|
|
|
- "parse",
|
|
|
- "--reference_fasta",
|
|
|
- &reference,
|
|
|
- &mrd_bam,
|
|
|
- &mrd_out_prefix,
|
|
|
- ])
|
|
|
- .stdout(Stdio::inherit())
|
|
|
- .stderr(Stdio::piped())
|
|
|
- .spawn()
|
|
|
- .expect("Failed to spawn NanomonSV parse");
|
|
|
-
|
|
|
- if let Some(stdout) = child.stderr.take() {
|
|
|
- let reader = BufReader::new(stdout);
|
|
|
- for line in reader.lines().map_while(Result::ok) {
|
|
|
- info!("{}", line);
|
|
|
- let mut log_lock = log.lock().unwrap();
|
|
|
- log_lock.push_str(&line);
|
|
|
- log_lock.push('\n');
|
|
|
- }
|
|
|
- }
|
|
|
- child.wait().unwrap();
|
|
|
+ nanomonsv_parse(&mrd_bam, &mrd_out_prefix, config).unwrap();
|
|
|
+ // let mut child = Command::new(bin)
|
|
|
+ // .args([
|
|
|
+ // "parse",
|
|
|
+ // "--reference_fasta",
|
|
|
+ // &reference,
|
|
|
+ // &mrd_bam,
|
|
|
+ // &mrd_out_prefix,
|
|
|
+ // ])
|
|
|
+ // .stdout(Stdio::inherit())
|
|
|
+ // .stderr(Stdio::piped())
|
|
|
+ // .spawn()
|
|
|
+ // .expect("Failed to spawn NanomonSV parse");
|
|
|
+ //
|
|
|
+ // if let Some(stdout) = child.stderr.take() {
|
|
|
+ // let reader = BufReader::new(stdout);
|
|
|
+ // for line in reader.lines().map_while(Result::ok) {
|
|
|
+ // info!("{}", line);
|
|
|
+ // let mut log_lock = log.lock().unwrap();
|
|
|
+ // log_lock.push_str(&line);
|
|
|
+ // log_lock.push('\n');
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // child.wait().unwrap();
|
|
|
});
|
|
|
threads_handles.push(handle);
|
|
|
}
|
|
|
@@ -209,72 +218,137 @@ impl NanomonSV {
|
|
|
}
|
|
|
|
|
|
// Get
|
|
|
+ info!("Nanomonsv Get");
|
|
|
let diag_result_vcf = format!("{diag_out_prefix}.nanomonsv.result.vcf");
|
|
|
let mrd_result_vcf = format!("{mrd_out_prefix}.nanomonsv.result.vcf");
|
|
|
|
|
|
if !Path::new(&mrd_result_vcf).exists() {
|
|
|
- let mut child = Command::new(&self.config.bin)
|
|
|
- .args([
|
|
|
- "get",
|
|
|
- "--process",
|
|
|
- &self.config.thread.to_string(),
|
|
|
- &mrd_out_prefix,
|
|
|
- &self.mrd_bam,
|
|
|
- &self.config.reference,
|
|
|
- ])
|
|
|
- .stdout(Stdio::inherit())
|
|
|
- .stderr(Stdio::piped())
|
|
|
- .spawn()
|
|
|
- .expect("Failed to spawn nanomonsv");
|
|
|
-
|
|
|
- if let Some(stdout) = child.stderr.take() {
|
|
|
- let reader = BufReader::new(stdout);
|
|
|
- for line in reader.lines().map_while(Result::ok) {
|
|
|
- info!("{line}");
|
|
|
- let mut log_lock = log.lock().unwrap();
|
|
|
- log_lock.push_str(&line);
|
|
|
- log_lock.push('\n');
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- child.wait().unwrap();
|
|
|
+ nanomonsv_get(
|
|
|
+ &self.mrd_bam,
|
|
|
+ &mrd_out_prefix,
|
|
|
+ None,
|
|
|
+ None,
|
|
|
+ self.config.clone(),
|
|
|
+ )
|
|
|
+ .unwrap();
|
|
|
+ // let mut child = Command::new(&self.config.bin)
|
|
|
+ // .args([
|
|
|
+ // "get",
|
|
|
+ // "--process",
|
|
|
+ // &self.config.thread.to_string(),
|
|
|
+ // &mrd_out_prefix,
|
|
|
+ // &self.mrd_bam,
|
|
|
+ // &self.config.reference,
|
|
|
+ // ])
|
|
|
+ // .stdout(Stdio::inherit())
|
|
|
+ // .stderr(Stdio::piped())
|
|
|
+ // .spawn()
|
|
|
+ // .expect("Failed to spawn nanomonsv");
|
|
|
+ //
|
|
|
+ // if let Some(stdout) = child.stderr.take() {
|
|
|
+ // let reader = BufReader::new(stdout);
|
|
|
+ // for line in reader.lines().map_while(Result::ok) {
|
|
|
+ // info!("{line}");
|
|
|
+ // let mut log_lock = log.lock().unwrap();
|
|
|
+ // log_lock.push_str(&line);
|
|
|
+ // log_lock.push('\n');
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // child.wait().unwrap();
|
|
|
}
|
|
|
|
|
|
if !Path::new(&diag_result_vcf).exists() {
|
|
|
- let mut child = Command::new(&self.config.bin)
|
|
|
- .args([
|
|
|
- "get",
|
|
|
- "--control_prefix",
|
|
|
- &mrd_out_prefix,
|
|
|
- "--control_bam",
|
|
|
- &self.mrd_bam,
|
|
|
- "--process",
|
|
|
- &self.config.thread.to_string(),
|
|
|
- &diag_out_prefix,
|
|
|
- &self.diag_bam,
|
|
|
- &self.config.reference,
|
|
|
- ])
|
|
|
- .stdout(Stdio::inherit())
|
|
|
- .stderr(Stdio::piped())
|
|
|
- .spawn()
|
|
|
- .expect("Failed to spawn nanomonsv");
|
|
|
-
|
|
|
- if let Some(stdout) = child.stderr.take() {
|
|
|
- let reader = BufReader::new(stdout);
|
|
|
- for line in reader.lines().map_while(Result::ok) {
|
|
|
- info!("{line}");
|
|
|
- let mut log_lock = log.lock().unwrap();
|
|
|
- log_lock.push_str(&line);
|
|
|
- log_lock.push('\n');
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- child.wait().unwrap();
|
|
|
+ nanomonsv_get(
|
|
|
+ &self.mrd_bam,
|
|
|
+ &diag_out_prefix,
|
|
|
+ Some(&self.mrd_bam),
|
|
|
+ Some(&mrd_out_prefix),
|
|
|
+ self.config.clone(),
|
|
|
+ )
|
|
|
+ .unwrap();
|
|
|
+ // let mut child = Command::new(&self.config.bin)
|
|
|
+ // .args([
|
|
|
+ // "get",
|
|
|
+ // "--control_prefix",
|
|
|
+ // &mrd_out_prefix,
|
|
|
+ // "--control_bam",
|
|
|
+ // &self.mrd_bam,
|
|
|
+ // "--process",
|
|
|
+ // &self.config.thread.to_string(),
|
|
|
+ // &diag_out_prefix,
|
|
|
+ // &self.diag_bam,
|
|
|
+ // &self.config.reference,
|
|
|
+ // ])
|
|
|
+ // .stdout(Stdio::inherit())
|
|
|
+ // .stderr(Stdio::piped())
|
|
|
+ // .spawn()
|
|
|
+ // .expect("Failed to spawn nanomonsv");
|
|
|
+ //
|
|
|
+ // if let Some(stdout) = child.stderr.take() {
|
|
|
+ // let reader = BufReader::new(stdout);
|
|
|
+ // for line in reader.lines().map_while(Result::ok) {
|
|
|
+ // info!("{line}");
|
|
|
+ // let mut log_lock = log.lock().unwrap();
|
|
|
+ // log_lock.push_str(&line);
|
|
|
+ // log_lock.push('\n');
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // child.wait().unwrap();
|
|
|
}
|
|
|
|
|
|
let vcf_passed = format!("{diag_out_prefix}_nanomonsv_PASSED.vcf.gz");
|
|
|
if !Path::new(&vcf_passed).exists() {
|
|
|
- Bcftools::new(&diag_result_vcf, &vcf_passed, BcftoolsConfig::default()).keep_pass();
|
|
|
+ bcftools_keep_pass(&diag_result_vcf, &vcf_passed, BcftoolsConfig::default()).unwrap();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+pub fn nanomonsv_parse(
|
|
|
+ bam: &str,
|
|
|
+ out_prefix: &str,
|
|
|
+ config: NanomonSVConfig,
|
|
|
+) -> anyhow::Result<RunReport> {
|
|
|
+ let args = vec![
|
|
|
+ "parse",
|
|
|
+ "--reference_fasta",
|
|
|
+ &config.reference,
|
|
|
+ bam,
|
|
|
+ out_prefix,
|
|
|
+ ];
|
|
|
+ let mut cmd_run = CommandRun::new(&config.bin, &args);
|
|
|
+ let res = run_wait(&mut cmd_run)?;
|
|
|
+ Ok(res)
|
|
|
+}
|
|
|
+
|
|
|
+pub fn nanomonsv_get(
|
|
|
+ bam: &str,
|
|
|
+ out_prefix: &str,
|
|
|
+ ctrl_bam: Option<&str>,
|
|
|
+ ctrl_prefix: Option<&str>,
|
|
|
+ config: NanomonSVConfig,
|
|
|
+) -> anyhow::Result<RunReport> {
|
|
|
+ let threads = config.thread.to_string();
|
|
|
+ let mut args = vec!["get"];
|
|
|
+
|
|
|
+ if let (Some(ctrl_bam), Some(ctrl_prefix)) = (ctrl_bam, ctrl_prefix) {
|
|
|
+ args.extend(vec![
|
|
|
+ "--control_prefix",
|
|
|
+ ctrl_prefix,
|
|
|
+ "--control_bam",
|
|
|
+ ctrl_bam,
|
|
|
+ ])
|
|
|
+ }
|
|
|
+
|
|
|
+ args.extend(vec![
|
|
|
+ "--process",
|
|
|
+ &threads,
|
|
|
+ out_prefix,
|
|
|
+ bam,
|
|
|
+ &config.reference,
|
|
|
+ ]);
|
|
|
+ let mut cmd_run = CommandRun::new(&config.bin, &args);
|
|
|
+ let res = run_wait(&mut cmd_run)?;
|
|
|
+ Ok(res)
|
|
|
+}
|