///|
/// EnhancedVolcano module example - Volcano plots for differential expression.
///
/// Run: moon run examples/enhanced_volcano_demo
fn main {
println("=== EnhancedVolcano Module Demo ===")
println("")
// Basic volcano plot creation
println("=== Basic Volcano Plot ===")
let ids = ["TP53", "BRCA1", "BRCA2", "MYC", "KRAS", "EGFR", "PTEN", "APC"]
let lfcs = [2.5, -3.0, 1.8, 3.2, -1.5, 0.8, -2.2, 0.3]
let pvals = [0.001, 0.005, 0.02, 0.0005, 0.01, 0.08, 0.002, 0.06]
let result = @bio.volcano_plot(
ids,
lfcs,
pvals,
p_cutoff=0.05,
fc_cutoff=1.0,
title="Cancer DE Genes",
x_label="log2FC",
y_label="-log10(p)",
)
println("Total genes: \{result.get_n_genes()}")
println("Up-regulated: \{result.get_n_up()}")
println("Down-regulated: \{result.get_n_down()}")
println("Non-significant: \{result.get_n_nonsig()}")
println("")
// Classification
println("=== Gene Classifications ===")
let up_genes = result.get_up_genes()
let mut i = 0
while i < up_genes.length() {
println(
" UP: \{up_genes[i].label} (log2FC=@{up_genes[i].log2fc}, p=@{up_genes[i].p_val})",
)
i = i + 1
}
let down_genes = result.get_down_genes()
let mut j = 0
while j < down_genes.length() {
println(
" DOWN: \{down_genes[j].label} (log2FC=@{down_genes[j].log2fc}, p=@{down_genes[j].p_val})",
)
j = j + 1
}
println("")
// Top genes
println("=== Top 5 Significant Genes ===")
let top = result.get_top_genes(5)
let mut k = 0
while k < top.length() {
let g = top[k]
println(" \{g.label}: log2FC=@{g.log2fc}, p=@{g.p_val}")
k = k + 1
}
println("")
// Significance thresholds
println("=== Significance Thresholds ===")
println("P-value cutoff: @{result.get_p_cutoff()}")
println("Fold-change cutoff: |log2FC| >= @{result.get_fc_cutoff()}")
println("")
// -log10(p-value) calculation
println("=== -log10(p-value) Calculations ===")
println("p=0.05 -> -log10 = @{@bio.neg_log10_p(0.05)}")
println("p=0.01 -> -log10 = @{@bio.neg_log10_p(0.01)}")
println("p=0.001 -> -log10 = @{@bio.neg_log10_p(0.001)}")
println("p=1e-10 -> -log10 = @{@bio.neg_log10_p(1e-10)}")
println("")
// Summary
println("=== Summary ===")
println(result.summary())
// Sample data
println("=== Sample Dataset ===")
let sample = @bio.volcano_sample(50)
println("Sample size: \{sample.get_n_genes()}")
println("Significant: @{sample.get_n_up() + sample.get_n_down()}")
println(" Up: \{sample.get_n_up()}, Down: \{sample.get_n_down()}")
// Render ASCII
println("")
println("=== ASCII Volcano Plot ===")
let ascii = sample.to_ascii(width=70, height=15)
println(ascii)
println("=== Done ===")
}