///|
/// Bumphunter module demo - methylation/signal region (bump) detection.
///
/// Run: moon run examples/bumphunter_demo
fn main {
println("=== Bumphunter Module Demo ===")
println("Differentially methylated region (DMR) detection")
println("Reference: Jaffe AE et al. (2012) Int J Epidemiol 41(1):200-9")
println("")
// ------------------------------------------------------------------
// 1. Load sample methylation data with a known bump
// ------------------------------------------------------------------
println("=== 1. Load sample methylation data ===")
let positions = @bio.bump_sample_data()
println("Positions: \{positions.length()} CpG sites on chr1")
println("Samples: \{positions[0].values().length()} (4 cases + 4 controls)")
println("Bump region: positions 10-20 (cases elevated)")
println("")
// ------------------------------------------------------------------
// 2. Compute per-position t-statistics
// ------------------------------------------------------------------
println("=== 2. Per-position t-statistics ===")
let stats = @bio.bump_compute_t_statistics_test(positions, 4)
let mut i = 0
while i < stats.length() {
let marker = if i >= 10 && i <= 20 { " [bump]" } else { "" }
if i % 5 == 0 {
println(" pos \{i}: t=\{stats[i]}\{marker}")
}
i = i + 1
}
println("")
// ------------------------------------------------------------------
// 3. Smooth the signal
// ------------------------------------------------------------------
println("=== 3. Smoothed signal (running mean, k=2) ===")
let smoothed = @bio.bump_smooth_test(stats, 2)
let mut si = 0
while si < smoothed.length() {
if si % 5 == 0 {
println(" pos \{si}: smoothed=\{smoothed[si]}")
}
si = si + 1
}
println("")
// ------------------------------------------------------------------
// 4. Find candidate bumps
// ------------------------------------------------------------------
println("=== 4. Candidate bumps (cutoff=2.0) ===")
let candidates = @bio.bump_find_candidates_test(positions, smoothed, 2.0)
println("Found \{candidates.length()} candidate bump(s)")
let mut ci = 0
while ci < candidates.length() {
let b = candidates[ci]
println(
" chr=\{b.chrom()} start=\{b.start()} end=\{b.end_()} value=\{b.value()} area=\{b.area()}",
)
ci = ci + 1
}
println("")
// ------------------------------------------------------------------
// 5. Run full bumphunter with permutation testing
// ------------------------------------------------------------------
println("=== 5. Full bumphunter analysis (20 permutations) ===")
let results = @bio.bump_hunt(positions, 4, 2.0, 2, 20)
println("Significant bumps: \{results.length()}")
let mut ri = 0
while ri < results.length() {
let r = results[ri]
println(
" chr=\{r.chrom()} start=\{r.start()} end=\{r.end_()} value=\{r.value()} p=\{r.p_value()} fdr=\{r.fdr()}",
)
ri = ri + 1
}
println("")
// ------------------------------------------------------------------
// 6. High cutoff finds nothing
// ------------------------------------------------------------------
println("=== 6. High cutoff (100.0) finds no bumps ===")
let none = @bio.bump_hunt(positions, 4, 100.0, 2, 10)
println("Bumps found: \{none.length()}")
println("")
// ------------------------------------------------------------------
// 7. Full results table
// ------------------------------------------------------------------
println("=== 7. Results table ===")
println(@bio.bump_results_to_string(results))
println("=== Demo complete ===")
}