///|
/// bamsignals Demo - Signal Extraction and Normalization from BAM files.
/// Inspired by Bioconductor bamsignals package.
fn main {
println("=== bamsignals Demo ===")
// 1. Create example regions
println("")
println("1. Create example regions:")
let regions = @bio.bamsig_create_example_regions()
let mut i = 0
while i < regions.length() {
let r = regions[i]
println(
" " +
r.bamsig_id() +
": " +
r.bamsig_chrom() +
":" +
r.bamsig_start().to_string() +
"-" +
r.bamsig_end().to_string() +
" (width=" +
r.bamsig_width().to_string() +
")",
)
i = i + 1
}
// 2. Create example records
println("")
println("2. Create example records:")
let records = @bio.bamsig_create_example_records()
let mut j = 0
while j < records.length() {
let rec = records[j]
println(
" " +
rec.chrom +
":" +
rec.pos.to_string() +
" " +
rec.cigar +
" mapq=" +
rec.mapq.to_string() +
" strand=" +
rec.strand.to_string(),
)
j = j + 1
}
// 3. Build Map of records by chromosome
println("")
println("3. Build records-by-chromosome map:")
let chr1_records : Array[@bio.BamsigRecord] = Array(capacity=0)
let chr2_records : Array[@bio.BamsigRecord] = Array(capacity=0)
let mut k = 0
while k < records.length() {
let rec = records[k]
if rec.chrom == "chr1" {
chr1_records.push(rec)
} else {
chr2_records.push(rec)
}
k = k + 1
}
let records_map : Map[String, Array[@bio.BamsigRecord]] = Map(
[("chr1", chr1_records), ("chr2", chr2_records)],
capacity=2,
)
println(" Chromosomes in map: " + records_map.length().to_string())
// 4. Create params and count signals
println("")
println("4. Count signals in regions:")
let params = @bio.BamsigParams::new()
println(" Params: count_mode=All, filter_dup=false, min_mapq=10")
let counts = @bio.bamsig_count_signals(regions, records_map, params)
println(" Signal counts:")
let mut r = 0
while r < counts.length() {
let row = counts[r]
let region_id = regions[r].bamsig_id()
println(" " + region_id + ": " + row[0].to_string())
r = r + 1
}
// 5. Create example signal (includes RPM normalization internally)
println("")
println("5. Create example signal (with RPM normalization):")
let signal = @bio.bamsig_create_example_signal()
println(" Regions: " + signal.bamsig_n_regions().to_string())
println(" Samples: " + signal.bamsig_n_samples().to_string())
println(" Signal details (counts and RPM-normalized values):")
let mut s = 0
while s < signal.bamsig_n_regions() {
let region_id = signal.bamsig_get_region_id(s)
let count = signal.bamsig_get_count(s, 0)
let norm = signal.bamsig_get_norm_count(s, 0)
println(
" " +
region_id +
": count=" +
count.to_string() +
", norm(RPM)=" +
norm.to_string(),
)
s = s + 1
}
// 6. Filter signal by count threshold
println("")
println("6. Filter signal (min_count=10, min_samples=1):")
let filtered = signal.bamsig_filter(10.0, 1)
println(" Regions before: " + signal.bamsig_n_regions().to_string())
println(" Regions after: " + filtered.bamsig_n_regions().to_string())
// 7. Row and column sums
println("")
println("7. Signal statistics:")
let mut t = 0
while t < signal.bamsig_n_regions() {
let region_id = signal.bamsig_get_region_id(t)
let row_sum = signal.bamsig_row_sum(t)
println(" " + region_id + " row_sum=" + row_sum.to_string())
t = t + 1
}
let col_sum = signal.bamsig_col_sum(0)
println(" Sample 0 col_sum=" + col_sum.to_string())
println("")
println("=== bamsignals Demo Completed ===")
}