Thomas 1 an în urmă
părinte
comite
21bd1b88a8
1 a modificat fișierele cu 53 adăugiri și 3 ștergeri
  1. 53 3
      src/lib.rs

+ 53 - 3
src/lib.rs

@@ -7,7 +7,7 @@ use flate2::Compression;
 use serde::Serialize;
 use serde_json::{json, Value};
 use smart_default::SmartDefault;
-use std::io::prelude::*;
+use std::{io::prelude::*, usize};
 
 /// Compress string according to compressString from: https://github.com/igvteam/igv-utils/blob/master/src/bgzf.js#L125
 fn compress_string(input: &str) -> anyhow::Result<String> {
@@ -162,18 +162,66 @@ impl BamTrack {
 #[derive(Debug)]
 pub enum Track {
     Bam(BamTrack),
+    Genes(GenesTrack)
 }
 
 impl Track {
     pub fn to_json(&self) -> Value {
         match self {
             Track::Bam(bam) => json!(bam),
+            Track::Genes(genes) => json!(genes),
         }
     }
 
     pub fn order(&mut self, order: i16) {
         match self {
             Track::Bam(track) => track.order = order,
+            Track::Genes(track) => track.order = order,
+        }
+    }
+}
+
+#[derive(Debug, Serialize, SmartDefault)]
+pub struct GenesTrack {
+    #[default = "RefSeq Liftoff v5.1"]
+    pub id: String,
+    #[default = "Genes"]
+    pub name: String,
+    #[default = "gff3"]
+    pub format: String,
+    #[default = ""]
+    pub url: String,
+    #[default = ""]
+    #[serde(rename = "indexURL")]
+    pub index_url: String,
+    #[default = "EXPANDED"]
+    #[serde(rename = "displayMode")]
+    pub display_mode: String,
+    #[default = 100]
+    pub height: u64,
+    #[default = "-1"]
+    #[serde(rename = "visibilityWindow")]
+    pub visibility_window: String,
+    #[default = true]
+    pub searchable: bool,
+    #[default = false]
+    #[serde(rename = "supportsWholeGenome")]
+    pub supports_whole_genome: bool,
+    #[default = 0]
+    pub order: i16,
+    #[default = "annotation"]
+    #[serde(rename = "type")]
+    pub igv_type: String,
+    #[default = "rgb(0, 0, 150)"]
+    pub color: String,
+}
+
+impl GenesTrack {
+    pub fn new(gff3_url: &str) -> Self {
+        Self {
+            url: gff3_url.to_string(),
+            index_url: format!("{gff3_url}.tbi"),
+            ..Default::default()
         }
     }
 }
@@ -186,10 +234,12 @@ mod tests {
     fn it_works() -> anyhow::Result<()> {
         let sess = Session::default()
             .with_reference(ReferenceValues::default())
-            .with_locus_at(("chr1".to_string(), 47093698))?
+            .with_locus_at(("chr1".to_string(), 47_098_189))?
             .add_track(Track::Bam(BamTrack::new("ROBIN diag", "/data/longreads_basic_pipe/ROBIN/diag/ROBIN_diag_hs1.bam")))?
-            .add_track(Track::Bam(BamTrack::new("ROBIN mrd", "/data/longreads_basic_pipe/ROBIN/mrd/ROBIN_mrd_hs1.bam")))?;
+            .add_track(Track::Bam(BamTrack::new("ROBIN mrd", "/data/longreads_basic_pipe/ROBIN/mrd/ROBIN_mrd_hs1.bam")))?
+            .add_track(Track::Genes(GenesTrack::new("/data/ref/hs1/chm13v2.0_RefSeq_Liftoff_v5.1_sorted.gff3.gz")))?;
         let compressed_str = sess.link("http://store-desktop.local/igv/")?;
+// 
         println!("{compressed_str}");
         Ok(())
     }