Parcourir la source

deletion desc n alt depth

Thomas il y a 7 mois
Parent
commit
17e88bd514
2 fichiers modifiés avec 69 ajouts et 22 suppressions
  1. 26 3
      src/lib.rs
  2. 43 19
      src/variant/variant.rs

+ 26 - 3
src/lib.rs

@@ -599,7 +599,7 @@ mod tests {
         let bnd_b = variant.bnd_desc()?;
         assert_eq!(bnd_a, bnd_b.rc());
 
-        println!("{bnd_a:#?}\n{bnd_b:#?}");
+        println!("{bnd_a}\n{bnd_b}");
 
         // Savana here each mate are in RC 
         let vcf = "chr10\t102039096\tID_35957_2\tG\t]chr10:101973386]G\t.\tPASS\tSVTYPE=BND;MATEID=ID_35957_1;TUMOUR_READ_SUPPORT=7;TUMOUR_ALN_SUPPORT=7;NORMAL_READ_SUPPORT=0;NORMAL_ALN_SUPPORT=0;SVLEN=65710;BP_NOTATION=+-;SOURCE=SUPPLEMENTARY;CLUSTERED_READS_TUMOUR=7;CLUSTERED_READS_NORMAL=0;ORIGIN_STARTS_STD_DEV=0.35;ORIGIN_MAPQ_MEAN=60;ORIGIN_EVENT_SIZE_STD_DEV=7.248;ORIGIN_EVENT_SIZE_MEDIAN=65710;ORIGIN_EVENT_SIZE_MEAN=65705.4;END_STARTS_STD_DEV=7.007;END_MAPQ_MEAN=60;END_EVENT_SIZE_STD_DEV=7.248;END_EVENT_SIZE_MEDIAN=65710;END_EVENT_SIZE_MEAN=65705.4;TUMOUR_DP_BEFORE=38,29;TUMOUR_DP_AT=44,21;TUMOUR_DP_AFTER=44,21;NORMAL_DP_BEFORE=13,15;NORMAL_DP_AT=13,15;NORMAL_DP_AFTER=13,15;TUMOUR_AF=0.159,0.333;NORMAL_AF=0,0;TUMOUR_TOTAL_HP_AT=20,16,8;NORMAL_TOTAL_HP_AT=6,7,0;TUMOUR_ALT_HP=0,1,6;TUMOUR_PS=101917152;NORMAL_ALT_HP=0,0,0;CLASS=PREDICTED_SOMATIC\tGT\t0/1";
@@ -611,8 +611,31 @@ mod tests {
         let bnd_b = variant.bnd_desc()?;
         assert_eq!(bnd_a, bnd_b);
 
-        println!("{bnd_a:#?}\n{bnd_b:#?}");
-        println!("{variant:#?}");
+        println!("{bnd_a}\n{bnd_b}");
+
+        // Deletions
+        // Severus
+        let vcf = "chr7\t143674704\tseverus_DEL7318\tN\t<DEL>\t60\tPASS≥\tPRECISE;SVTYPE=DEL;SVLEN=3642;END=143678346;STRANDS=+-;MAPQ=60\tGT:GQ:VAF:hVAF:DR:DV\t0/1:114:0.39:0.39,0,0:14:9";
+        let variant: VcfVariant = vcf.parse()?;
+
+        println!("{:?}", variant.infos);
+        println!("{:?}", variant.formats);
+        let del = variant.deletion_desc().unwrap();
+        println!("{:?}", del);
+        println!("{:?} {:?}", del.len(), variant.formats.n_alt_depth());
+
+        assert_eq!("chr7:143674704_143678346_del", variant.deletion_desc().unwrap().to_string());
+
+        println!("--\n");
+        let vcf="chr7\t144003249\tr_106\tC\t<DEL>\t.\tPASS\tEND=144142733;SVTYPE=DEL;SVLEN=-139484;SVINSLEN=4;SVINSSEQ=GCCA\tTR:VR\t12:10\t51:0";
+        let variant: VcfVariant = vcf.parse()?;
+
+        println!("{:?}", variant.infos);
+        println!("{:?}", variant.formats);
+        let del = variant.deletion_desc().unwrap();
+        println!("{:?}", del);
+        println!("{:?} {:?}", del.len(), variant.formats.n_alt_depth());
+
 
         Ok(())
     }

+ 43 - 19
src/variant/variant.rs

@@ -429,8 +429,8 @@ impl BNDDesc {
         added_nt.push_str(seq_after);
         added_nt.remove(0);
         // determine form and orientation
-        // form 1 & 2: bracket after t (open>0): local before remote
-        // form 3 & 4: bracket before t (open==0): remote before local
+        // form 1 & 2: bracket after t (open>0): t before p
+        // form 3 & 4: bracket before t (open==0): p before t
         let after_local = open > 0;
         let (t_sens, p_sens) = match (bracket, after_local) {
             ('[', true) => (true, true),   // form 1 t[p[
@@ -441,7 +441,8 @@ impl BNDDesc {
         };
 
         // assign A/B depending on form
-        let (a_contig, a_position, a_sens, b_contig, b_position, b_sens, added_nt) = if after_local {
+        let (a_contig, a_position, a_sens, b_contig, b_position, b_sens, added_nt) = if after_local
+        {
             (
                 t_chrom.into(),
                 t_pos,
@@ -449,10 +450,9 @@ impl BNDDesc {
                 p_contig.into(),
                 p_position,
                 p_sens,
-                added_nt
+                added_nt,
             )
         } else {
-            // forms 3 & 4: A is remote, B is local
             (
                 p_contig.into(),
                 p_position,
@@ -460,7 +460,7 @@ impl BNDDesc {
                 t_chrom.into(),
                 t_pos,
                 t_sens,
-                reverse_complement(&added_nt)
+                reverse_complement(&added_nt),
             )
         };
         Some(Self {
@@ -491,17 +491,21 @@ impl BNDDesc {
 pub fn reverse_complement(dna: &str) -> String {
     fn complement(base: char) -> char {
         match base {
-            'A' => 'T', 'T' => 'A', 'C' => 'G', 'G' => 'C',
-            'a' => 't', 't' => 'a', 'c' => 'g', 'g' => 'c',
-            'N' => 'N', 'n' => 'n',
+            'A' => 'T',
+            'T' => 'A',
+            'C' => 'G',
+            'G' => 'C',
+            'a' => 't',
+            't' => 'a',
+            'c' => 'g',
+            'g' => 'c',
+            'N' => 'N',
+            'n' => 'n',
             _ => 'N',
         }
     }
 
-    dna.chars()
-        .rev()
-        .map(complement)
-        .collect()
+    dna.chars().rev().map(complement).collect()
 }
 
 impl core::fmt::Display for BNDDesc {
@@ -516,14 +520,14 @@ impl core::fmt::Display for BNDDesc {
         }
         write!(
             f,
-            "({}:{}{};{}:{}{};ins={})",
+            "({}{}:{}::{}::{}:{}{})",
+            arrow(self.a_sens),
             self.a_contig,
             self.a_position,
-            arrow(self.a_sens),
+            self.added_nt,
             self.b_contig,
             self.b_position,
             arrow(self.b_sens),
-            self.added_nt
         )
     }
 }
@@ -566,7 +570,7 @@ impl<E> BNDGraph<E> {
         &self.graph
     }
 
-    /// Stringify all nodes for quick debugging.
+    /// Stringify all nodes
     pub fn nodes_as_strings(&self) -> Vec<String> {
         self.graph.node_weights().map(|n| n.to_string()).collect()
     }
@@ -812,6 +816,12 @@ pub struct DeletionDesc {
     pub end: u32,
 }
 
+impl fmt::Display for DeletionDesc {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "{}:{}_{}_del", self.contig, self.start, self.end)
+    }
+}
+
 impl DeletionDesc {
     pub fn len(&self) -> u32 {
         self.end.saturating_sub(self.start)
@@ -1635,6 +1645,7 @@ impl Formats {
     /// ```
     pub fn n_alt_depth(&self) -> Option<(u32, u32)> {
         let mut tumor_alt_depth: Option<u32> = None;
+        let mut tumor_ref_depth: Option<u32> = None;
         let mut tumor_total_depth: Option<u32> = None;
 
         for format in &self.0 {
@@ -1647,12 +1658,25 @@ impl Formats {
                 Format::DP(value) => {
                     tumor_total_depth = Some(*value);
                 }
+                Format::VR(values) => {
+                    tumor_alt_depth = Some(*values);
+                }
+                Format::TR(value) => {
+                    tumor_ref_depth = Some(*value);
+                }
+                Format::DV(values) => {
+                    tumor_alt_depth = Some(*values);
+                }
+                Format::DR(value) => {
+                    tumor_ref_depth = Some(*value);
+                }
                 _ => {}
             }
         }
 
-        match (tumor_alt_depth, tumor_total_depth) {
-            (Some(alt), Some(total)) => Some((alt, total)),
+        match (tumor_alt_depth, tumor_total_depth, tumor_ref_depth) {
+            (Some(alt), Some(total), _) => Some((alt, total)),
+            (Some(alt), _, Some(refe)) => Some((alt, alt + refe)),
             _ => None,
         }
     }