Przeglądaj źródła

is file older now remove dir if so// DeepSomatic passed vcf path was wronggly pointing into DeepVariant mrd folder // nanomonsv is file older now check mrd and passed diag if older of respective bam

Thomas 5 miesięcy temu
rodzic
commit
929c95c2d3
4 zmienionych plików z 37 dodań i 29 usunięć
  1. 10 2
      src/callers/nanomonsv.rs
  2. 1 3
      src/config.rs
  3. 8 8
      src/helpers.rs
  4. 18 16
      src/lib.rs

+ 10 - 2
src/callers/nanomonsv.rs

@@ -73,8 +73,16 @@ impl ShouldRun for NanomonSV {
     /// `true` if the passed VCF does not exist or is older than any input BAM.
     fn should_run(&self) -> bool {
         let passed_vcf = self.config.nanomonsv_passed_vcf(&self.id);
-        let result = is_file_older(&passed_vcf, &self.config.normal_bam(&self.id), true).unwrap_or(true)
-            || is_file_older(&passed_vcf, &self.config.tumoral_bam(&self.id), true).unwrap_or(true);
+        let mrd_out_dir = self.config.nanomonsv_output_dir(&self.id, "mrd");
+        let mrd_out_prefix = format!("{}/{}_mrd", mrd_out_dir, self.id);
+        let mrd_info_vcf = format!("{mrd_out_prefix}.bp_info.sorted.bed.gz");
+
+        let result = [
+            is_file_older(&mrd_info_vcf , &self.config.normal_bam(&self.id), true).unwrap_or(true),
+            is_file_older(&passed_vcf, &self.config.tumoral_bam(&self.id), true).unwrap_or(true),
+        ]
+        .iter()
+        .any(|r| *r);
         if result {
             warn!("NanomonSV should run for id: {}.", self.id);
         }

+ 1 - 3
src/config.rs

@@ -400,9 +400,7 @@ impl Config {
     pub fn deepsomatic_passed_vcf(&self, id: &str) -> String {
         format!(
             "{}/{}_{}_DeepSomatic_PASSED.vcf.gz",
-            // ERROR replace but before rename actually misplaced 
-            // self.deepsomatic_output_dir(id),
-            self.deepvariant_normal_output_dir(id),
+            self.deepsomatic_output_dir(id),
             id,
             self.tumoral_name
         )

+ 8 - 8
src/helpers.rs

@@ -451,11 +451,11 @@ pub fn get_dir_size(path: &Path) -> std::io::Result<u64> {
 pub fn find_files(pattern: &str) -> anyhow::Result<Vec<PathBuf>> {
     let mut result = Vec::new();
 
-    let entries = glob(pattern)
-        .with_context(|| format!("Invalid glob pattern: '{}'", pattern))?;
+    let entries = glob(pattern).with_context(|| format!("Invalid glob pattern: '{}'", pattern))?;
 
     for entry in entries {
-        let path = entry.with_context(|| format!("Failed to resolve path for pattern '{}'", pattern))?;
+        let path =
+            entry.with_context(|| format!("Failed to resolve path for pattern '{}'", pattern))?;
         result.push(path);
     }
 
@@ -511,6 +511,7 @@ pub fn list_directories(dir_path: &str) -> std::io::Result<Vec<String>> {
 /// - (if `rm == true`) Directory removal fails (if uncommented).
 ///
 pub fn is_file_older(file1: &str, file2: &str, rm: bool) -> anyhow::Result<bool> {
+    debug!("is_file_older {file1} {file2}, {rm:?}");
     let mtime1 = fs::metadata(file1)
         .with_context(|| format!("Failed to read metadata for '{}'", file1))?
         .modified()
@@ -524,7 +525,10 @@ pub fn is_file_older(file1: &str, file2: &str, rm: bool) -> anyhow::Result<bool>
     if mtime1 < mtime2 && rm {
         if let Some(file1_dir) = Path::new(file1).parent() {
             warn!("Removing old directory: {}", file1_dir.display());
-            // fs::remove_dir(file1_dir)?;
+            fs::remove_dir_all(file1_dir).map_err(|e| {
+                warn!("Failed to remove {}: {}", file1_dir.display(), e);
+                e
+            })?;
         }
     }
 
@@ -626,7 +630,6 @@ where
     })
 }
 
-
 /// Represents a string made of either:
 /// - one character repeated N times,
 /// - a two-character block repeated N times,
@@ -670,6 +673,3 @@ pub fn detect_repetition(s: &str) -> Repeat {
 
     Repeat::None
 }
-
-
-

+ 18 - 16
src/lib.rs

@@ -179,7 +179,7 @@ mod tests {
 
     use self::{collection::pod5::{FlowCellCase, Pod5Collection}, commands::dorado, config::Config};
     use super::*;
-    use crate::{annotation::Annotation, callers::{clairs::ClairS, deep_variant::DeepVariant, nanomonsv::{NanomonSV, NanomonSVSolo}, savana::SavanaCN}, collection::{bam::{self, nt_pileup_new}, flowcells::{scan_archive, FlowCells}, run_tasks, vcf::VcfCollection, Collections, CollectionsConfig, ShouldRun}, commands::dorado::Dorado, helpers::find_files, io::{bed::bedrow_overlaps_par, dict::read_dict, gff::features_ranges}, pipes::somatic::const_stats, positions::{merge_overlapping_genome_ranges, range_intersection_par, sort_ranges}, scan::scan::somatic_scan, variant::{variant::{AlterationCategory, BNDDesc, BNDGraph, GroupByThreshold, ToBNDGraph}, variant_collection::{group_variants_by_bnd_desc, group_variants_by_bnd_rc, Variant, VariantCollection}, variants_stats::{self, somatic_depth_quality_ranges, VariantsStats}}};
+    use crate::{annotation::Annotation, callers::{clairs::ClairS, deep_somatic::DeepSomatic, deep_variant::DeepVariant, nanomonsv::{NanomonSV, NanomonSVSolo}, savana::SavanaCN}, collection::{bam::{self, nt_pileup_new}, flowcells::{scan_archive, FlowCells}, run_tasks, vcf::VcfCollection, Collections, CollectionsConfig, ShouldRun}, commands::dorado::Dorado, helpers::find_files, io::{bed::bedrow_overlaps_par, dict::read_dict, gff::features_ranges}, pipes::somatic::const_stats, positions::{merge_overlapping_genome_ranges, range_intersection_par, sort_ranges}, scan::scan::somatic_scan, variant::{variant::{AlterationCategory, BNDDesc, BNDGraph, GroupByThreshold, ToBNDGraph}, variant_collection::{group_variants_by_bnd_desc, group_variants_by_bnd_rc, Variant, VariantCollection}, variants_stats::{self, somatic_depth_quality_ranges, VariantsStats}}};
 
     // export RUST_LOG="debug"
     fn init() {
@@ -884,11 +884,13 @@ let variant: VcfVariant = row.parse()?;
     #[test]
     fn variant_load_clairs() -> anyhow::Result<()> {   
         init();
-        let id = "ADJAGBA";
-        let clairs = ClairS::initialize(id, Config::default())?;
-        let annotations = Annotations::default();
-        let variant_collection = clairs.variants(&annotations)?;
-        println!("ClairS for {id}: variants {} {}", variant_collection.variants.len(), variant_collection.vcf.n_variants);
+        let id = "ELKLIFI";
+        let clairs = NanomonSV::initialize(id, Config::default())?;
+        let u = clairs.should_run();
+        info!("should_run {u:?}");
+        // let annotations = Annotations::default();
+        // let variant_collection = clairs.variants(&annotations)?;
+        // println!("ClairS for {id}: variants {} {}", variant_collection.variants.len(), variant_collection.vcf.n_variants);
         Ok(())
     }
 
@@ -904,16 +906,16 @@ let variant: VcfVariant = row.parse()?;
         Ok(())
     }
 
-    #[test]
-    fn variant_load_clairs_germline() -> anyhow::Result<()> {   
-        init();
-        let id = "ADJAGBA";
-        let clairs = ClairS::initialize(id, Config::default())?;
-        let annotations = Annotations::default();
-        let germline_variant_collection = clairs.germline(&annotations)?;
-        println!("ClairS for {id}: variants {} {}", germline_variant_collection.variants.len(), germline_variant_collection.vcf.n_variants);
-        Ok(())
-    }
+    // #[test]
+    // fn variant_load_clairs_germline() -> anyhow::Result<()> {   
+    //     init();
+    //     let id = "ADJAGBA";
+    //     let clairs = ClairS::initialize(id, Config::default())?;
+    //     let annotations = Annotations::default();
+    //     let germline_variant_collection = clairs.germline(&annotations)?;
+    //     println!("ClairS for {id}: variants {} {}", germline_variant_collection.variants.len(), germline_variant_collection.vcf.n_variants);
+    //     Ok(())
+    // }
 
     #[test]
     fn pipe_somatic() -> anyhow::Result<()> {