Browse Source

savana alt/depth from info, added n_alt_depth for info and above for vcf_variant

Thomas 7 months ago
parent
commit
b28a6f37b0
2 changed files with 51 additions and 3 deletions
  1. 13 0
      src/lib.rs
  2. 38 3
      src/variant/variant.rs

+ 13 - 0
src/lib.rs

@@ -733,6 +733,19 @@ let variant: VcfVariant = row.parse()?;
         Ok(())
     }
 
+    #[test]
+    fn trl_parse() -> anyhow::Result<()> {
+        init();
+
+        let row = "chr2\t207968575\tID_16420_1\ta\ta]chr11:41497080]\t.\tPASS\tSVTYPE=BND;MATEID=ID_16420_2;TUMOUR_READ_SUPPORT=4;TUMOUR_ALN_SUPPORT=4;NORMAL_READ_SUPPORT=0;NORMAL_ALN_SUPPORT=0;SVLEN=0;BP_NOTATION=++;SOURCE=SUPPLEMENTARY;CLUSTERED_READS_TUMOUR=4;CLUSTERED_READS_NORMAL=0;ORIGIN_STARTS_STD_DEV=0.433;ORIGIN_MAPQ_MEAN=56.25;ORIGIN_EVENT_SIZE_STD_DEV=0;ORIGIN_EVENT_SIZE_MEDIAN=0;ORIGIN_EVENT_SIZE_MEAN=0;END_STARTS_STD_DEV=17.754;END_MAPQ_MEAN=56.25;END_EVENT_SIZE_STD_DEV=0;END_EVENT_SIZE_MEDIAN=0;END_EVENT_SIZE_MEAN=0;TUMOUR_DP_BEFORE=8,11;TUMOUR_DP_AT=4,11;TUMOUR_DP_AFTER=4,11;NORMAL_DP_BEFORE=7,16;NORMAL_DP_AT=7,16;NORMAL_DP_AFTER=7,16;TUMOUR_AF=1,0.364;NORMAL_AF=0,0;TUMOUR_TOTAL_HP_AT=1,3,0;NORMAL_TOTAL_HP_AT=4,3,0;TUMOUR_ALT_HP=2,1,1;TUMOUR_PS=207946665;NORMAL_ALT_HP=0,0,0;CLASS=PREDICTED_SOMATIC\tGT\t0/1";
+        let variant: VcfVariant = row.parse()?;
+        let var_string = variant.into_vcf_row();
+        let u = variant.n_alt_depth();
+        println!("{u:?}");
+
+        Ok(())
+    }
+
 
     #[test]
     fn variant_parse() -> anyhow::Result<()> {

+ 38 - 3
src/variant/variant.rs

@@ -1,7 +1,7 @@
 use crate::{
     annotation::Annotations,
     collection::ShouldRun,
-    helpers::{estimate_shannon_entropy, Hash128},
+    helpers::{estimate_shannon_entropy, mean, Hash128},
     positions::{GenomePosition, GetGenomePosition, VcfPosition},
     runners::Run,
     variant::variant_collection::VariantCollection,
@@ -198,6 +198,15 @@ impl VcfVariant {
         self.infos.0.iter().any(|i| matches!(i, Info::SVTYPE(_)))
     }
 
+    pub fn n_alt_depth(&self) -> Option<(u32, u32)> {
+        let r = self.formats.n_alt_depth();
+        if r.is_some() {
+            r
+        } else {
+            self.infos.n_alt_depth()
+        }
+    }
+
     /// Retrieves the structural variation type of the variant, if present.
     ///
     /// Returns Some(SVType) if the variant has an SVTYPE info field,
@@ -397,13 +406,13 @@ impl VcfVariant {
                     return Some(DeletionDesc {
                         contig: bnd_desc.a_contig,
                         start: bnd_desc.a_position,
-                        end: bnd_desc.b_position
+                        end: bnd_desc.b_position,
                     });
                 } else {
                     return Some(DeletionDesc {
                         contig: bnd_desc.a_contig,
                         start: bnd_desc.b_position,
-                        end: bnd_desc.a_position
+                        end: bnd_desc.a_position,
                     });
                 }
             }
@@ -1067,6 +1076,32 @@ impl fmt::Display for Infos {
     }
 }
 
+impl Infos {
+    pub fn n_alt_depth(&self) -> Option<(u32, u32)> {
+        use Info::*;
+        let mut tumor_alt: Option<u32> = None;
+        let mut tumor_depth: Option<u32> = None;
+
+        for info in self.0.iter() {
+            match info {
+                TUMOUR_DP_AT(v) => {
+                    let m = mean(v);
+                    tumor_depth = Some(m.round() as u32);
+                }
+                TUMOUR_READ_SUPPORT(v) => {
+                    tumor_alt = Some(*v);
+                }
+                _ => (),
+            }
+        }
+
+        match (tumor_alt, tumor_depth) {
+            (Some(a), Some(d)) => Some((a, d)),
+            _ => None,
+        }
+    }
+}
+
 /// Enum representing a single INFO field in a VCF record.
 ///
 /// Supports both standard fields and Severus-specific structural variant annotations.