///|
/// sgseq module demo - Splice variant detection from RNA-seq data.
///
/// Demonstrates splice graph construction, junction parsing, and
/// detection of five alternative splicing event types (SE, A5SS,
/// A3SS, MXE, RI) from RNA-seq junction reads.
///
/// Reference: Goldstein LD et al. (2016) SGSeq. Bioinformatics 32:1188-1195.
/// Run: moon run examples/sgseq_demo
fn main {
println("=== sgseq Module Demo ===")
println("Splice variant detection from RNA-seq data")
println("Reference: Bioconductor SGSeq")
println("")
// ------------------------------------------------------------------
// 1. Load sample junction data
// ------------------------------------------------------------------
println("=== 1. Load Sample Junction Data ===")
let junctions = @bio.sgseq_sample_junctions()
println("Total junctions: " + junctions.length().to_string())
for j in junctions {
println(
" " +
j.chr +
":" +
j.start.to_string() +
"-" +
j.end.to_string() +
" (" +
j.strand +
") count=" +
j.count.to_string() +
" intron_len=" +
j.intron_length().to_string(),
)
}
println("")
// ------------------------------------------------------------------
// 2. Load sample exons
// ------------------------------------------------------------------
println("=== 2. Sample Exons ===")
let exons = @bio.sgseq_sample_exons()
println("Total exons: " + exons.length().to_string())
for e in exons {
println(
" " +
e.chr +
":" +
e.start.to_string() +
"-" +
e.end.to_string() +
" (" +
e.strand +
") length=" +
e.length().to_string(),
)
}
println("")
// ------------------------------------------------------------------
// 3. Build splice graph
// ------------------------------------------------------------------
println("=== 3. Build Splice Graph ===")
let graph_exons = @bio.sgseq_build_splice_graph(junctions)
println("Splice graph exons: " + graph_exons.length().to_string())
for e in graph_exons {
println(
" " +
e.chr +
":" +
e.start.to_string() +
"-" +
e.end.to_string() +
" length=" +
e.length().to_string(),
)
}
println("")
// ------------------------------------------------------------------
// 4. Convert to features
// ------------------------------------------------------------------
println("=== 4. Splice Graph Features ===")
let features = @bio.sgseq_to_features(junctions, graph_exons)
println("Total features: " + features.length().to_string())
let mut n_exon = 0
let mut n_junc = 0
for f in features {
if f.type_ == "E" {
n_exon = n_exon + 1
} else {
n_junc = n_junc + 1
}
}
println(" Exon features: " + n_exon.to_string())
println(" Junction features: " + n_junc.to_string())
println("")
// ------------------------------------------------------------------
// 5. Detect all splice variants
// ------------------------------------------------------------------
println("=== 5. Detect Splice Variants ===")
let variants = @bio.sgseq_detect_variants(junctions, exons)
println("Total variants detected: " + variants.length().to_string())
for v in variants {
println(" " + @bio.sgseq_variant_to_string(v))
}
println("")
// ------------------------------------------------------------------
// 6. Variant summary by type
// ------------------------------------------------------------------
println("=== 6. Variant Summary ===")
let summary = @bio.sgseq_summary(variants)
for key in summary.keys() {
println(" " + key + ": " + summary[key].to_string())
}
println("")
// ------------------------------------------------------------------
// 7. Parse junctions from text
// ------------------------------------------------------------------
println("=== 7. Parse Junctions from Text ===")
let text = "chr1\t100\t200\t+\t50\nchr1\t300\t400\t+\t30\nchr1\t100\t350\t+\t10"
let parsed = @bio.sgseq_parse_junctions(text)
println("Parsed " + parsed.length().to_string() + " junctions from text:")
for j in parsed {
println(
" " +
j.chr +
":" +
j.start.to_string() +
"-" +
j.end.to_string() +
" count=" +
j.count.to_string(),
)
}
println("")
// ------------------------------------------------------------------
// 8. Filter variants by read support
// ------------------------------------------------------------------
println("=== 8. Filter Variants ===")
let filtered = @bio.sgseq_filter_variants(variants, min_reads=10)
println(
"Variants with >= 10 reads: " +
filtered.length().to_string() +
" (out of " +
variants.length().to_string() +
")",
)
println("")
// ------------------------------------------------------------------
// 9. Specific variant type detection
// ------------------------------------------------------------------
println("=== 9. Individual Variant Type Detection ===")
let se_variants = @bio.sgseq_detect_se(junctions, exons)
println("SE variants: " + se_variants.length().to_string())
let a5ss_variants = @bio.sgseq_detect_a5ss(junctions)
println("A5SS variants: " + a5ss_variants.length().to_string())
let a3ss_variants = @bio.sgseq_detect_a3ss(junctions)
println("A3SS variants: " + a3ss_variants.length().to_string())
let mxe_variants = @bio.sgseq_detect_mxe(junctions, exons)
println("MXE variants: " + mxe_variants.length().to_string())
let ri_variants = @bio.sgseq_detect_ri(junctions, exons)
println("RI variants: " + ri_variants.length().to_string())
println("")
println("=== Demo complete ===")
}