|
@@ -7,7 +7,7 @@ use flate2::Compression;
|
|
|
use serde::Serialize;
|
|
use serde::Serialize;
|
|
|
use serde_json::{json, Value};
|
|
use serde_json::{json, Value};
|
|
|
use smart_default::SmartDefault;
|
|
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
|
|
/// 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> {
|
|
fn compress_string(input: &str) -> anyhow::Result<String> {
|
|
@@ -162,18 +162,66 @@ impl BamTrack {
|
|
|
#[derive(Debug)]
|
|
#[derive(Debug)]
|
|
|
pub enum Track {
|
|
pub enum Track {
|
|
|
Bam(BamTrack),
|
|
Bam(BamTrack),
|
|
|
|
|
+ Genes(GenesTrack)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
impl Track {
|
|
impl Track {
|
|
|
pub fn to_json(&self) -> Value {
|
|
pub fn to_json(&self) -> Value {
|
|
|
match self {
|
|
match self {
|
|
|
Track::Bam(bam) => json!(bam),
|
|
Track::Bam(bam) => json!(bam),
|
|
|
|
|
+ Track::Genes(genes) => json!(genes),
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pub fn order(&mut self, order: i16) {
|
|
pub fn order(&mut self, order: i16) {
|
|
|
match self {
|
|
match self {
|
|
|
Track::Bam(track) => track.order = order,
|
|
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<()> {
|
|
fn it_works() -> anyhow::Result<()> {
|
|
|
let sess = Session::default()
|
|
let sess = Session::default()
|
|
|
.with_reference(ReferenceValues::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 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/")?;
|
|
let compressed_str = sess.link("http://store-desktop.local/igv/")?;
|
|
|
|
|
+//
|
|
|
println!("{compressed_str}");
|
|
println!("{compressed_str}");
|
|
|
Ok(())
|
|
Ok(())
|
|
|
}
|
|
}
|