///|
/// InteractionSet Demo - Chromatin interaction data analysis.
fn main {
println("=== InteractionSet Demo ===\n")
println("1. Creating anchors...")
let a1 = @src.Anchor::new(chrom="chr1", start=10000, end=20000)
let a2 = @src.Anchor::new(chrom="chr1", start=50000, end=60000)
let a3 = @src.Anchor::new(chrom="chr2", start=10000, end=20000)
println(
" Anchor1: \{a1.chrom}:\{a1.start}-\{a1.end} (width=\{@src.Anchor::width(a1)})",
)
println(" Anchor2: \{a2.chrom}:\{a2.start}-\{a2.end}")
println("\n2. Checking anchor overlaps...")
let ov1 = @src.anchors_overlap(a1, a2)
let ov2 = @src.anchors_overlap(a1, a3)
println(" Anchor1 vs Anchor2 overlap: \{ov1}")
println(" Anchor1 vs Anchor3 overlap: \{ov2}")
println("\n3. Creating genomic interactions...")
let i1 = @src.GInteraction::new(anchor1=a1, anchor2=a2, count=25)
let i2 = @src.GInteraction::new(anchor1=a1, anchor2=a3, count=10)
let i3 = @src.GInteraction::new(anchor1=a2, anchor2=a3, count=5)
let interactions = [i1, i2, i3]
let iset = @src.InteractionSet::new(interactions~)
println(" \{@src.InteractionSet::summary(iset)}")
println("\n4. Computing interaction distances...")
match @src.GInteraction::distance(i1) {
Some(d) => println(" Interaction1 distance: \{d} bp")
None => println(" No distance (inter-chromosomal)")
}
match @src.GInteraction::distance(i2) {
Some(d) => println(" Interaction2 distance: \{d} bp")
None => println(" Interaction2: No distance (inter-chromosomal)")
}
println("\n5. Filtering by count (min_count=8)...")
let filtered = @src.InteractionSet::filter_by_count(iset, 8)
println(
" \{@src.InteractionSet::num_interactions(filtered)} interactions remaining",
)
println("\n6. Intra vs inter-chromosomal interactions...")
let intra = @src.InteractionSet::intra_chromosomal(iset)
let inter = @src.InteractionSet::inter_chromosomal(iset)
println(
" Intra-chromosomal: \{@src.InteractionSet::num_interactions(intra)}",
)
println(
" Inter-chromosomal: \{@src.InteractionSet::num_interactions(inter)}",
)
println(" Inter fraction: \{@src.InteractionSet::inter_fraction(iset)}")
println("\n7. Interactions on specific chromosome...")
let on_chr1 = @src.InteractionSet::interactions_on_chrom(iset, "chr1")
let on_chr2 = @src.InteractionSet::interactions_on_chrom(iset, "chr2")
println(" On chr1: \{@src.InteractionSet::num_interactions(on_chr1)}")
println(" On chr2: \{@src.InteractionSet::num_interactions(on_chr2)}")
println("\n8. Building interaction matrix...")
let matrix = @src.InteractionSet::interaction_matrix(iset, ["chr1", "chr2"])
println(" chr1 x chr1: \{matrix[0][0]}")
println(" chr1 x chr2: \{matrix[0][1]}")
println(" chr2 x chr1: \{matrix[1][0]}")
println(" chr2 x chr2: \{matrix[1][1]}")
println("\n9. Top interactions...")
let top = @src.InteractionSet::top_interactions(iset, 2)
let mut i = 0
while i < top.length() {
let t = top[i]
println(
" #\{i + 1}: count=\{t.count}, \{t.anchor1.chrom}:\{t.anchor1.start} <-> \{t.anchor2.chrom}:\{t.anchor2.start}",
)
i = i + 1
}
println("\n10. Creating binned interactions from Hi-C matrix...")
let bins = [(0, 1000), (1000, 2000), (2000, 3000), (3000, 4000)]
let counts = [
[50, 30, 10, 5],
[30, 80, 25, 8],
[10, 25, 60, 15],
[5, 8, 15, 40],
]
let binned = @src.create_binned_interactions("chr1", bins, counts)
println(" \{@src.InteractionSet::num_interactions(binned)} interactions")
println(" Total count: \{@src.InteractionSet::total_count(binned)}")
println("\n11. Distance distribution...")
let dist = @src.InteractionSet::distance_distribution(binned, 500)
let mut j = 0
while j < dist.length() {
println(" \{dist[j].0}-\{dist[j].0 + 500} bp: \{dist[j].1} interactions")
j = j + 1
}
println("\n=== InteractionSet Demo Complete ===")
}