///|
/// MCPcounter module demo - marker-based cell population counting.
///
/// Run: moon run examples/mcp_counter_demo
fn main {
println("=== MCPcounter Module Demo ===")
println("Microenvironment Cell Population counter")
println("Reference: Becht E et al. (2016) eLife 5:e18516")
println("")
// ------------------------------------------------------------------
// 1. Display built-in cell populations
// ------------------------------------------------------------------
println("=== 1. Built-in cell populations ===")
let pops = @bio.mcp_default_populations()
println("Total populations: \{pops.length()}")
for pop in pops {
println(" \{pop.name}: \{pop.markers.length()} markers")
}
println("")
// ------------------------------------------------------------------
// 2. Load sample data
// ------------------------------------------------------------------
println("=== 2. Load sample expression data ===")
let (genes, samples, matrix) = @bio.mcp_sample_data()
println("Genes: \{genes.length()}")
println("Samples: \{Repr(samples)}")
println("")
// ------------------------------------------------------------------
// 3. Run MCPcounter
// ------------------------------------------------------------------
println("=== 3. Run MCPcounter ===")
let result = @bio.mcp_run(genes, samples, matrix)
println("Populations scored: \{result.populations().length()}")
println("")
// ------------------------------------------------------------------
// 4. Display scores per population
// ------------------------------------------------------------------
println("=== 4. Per-population abundance scores ===")
let mut pi = 0
while pi < result.populations().length() {
let pop_name = result.populations()[pi]
println("--- \{pop_name} ---")
let mut si = 0
while si < result.sample_names().length() {
let score = result.scores()[pi][si]
let bar_len = if score > 0.0 { (score * 2.0).to_int() } else { 0 }
let mut bar = ""
let mut bi = 0
while bi < bar_len {
bar = bar + "#"
bi = bi + 1
}
println(" \{result.sample_names()[si]}: \{score} \{bar}")
si = si + 1
}
pi = pi + 1
}
println("")
// ------------------------------------------------------------------
// 5. Compare tumor compositions
// ------------------------------------------------------------------
println("=== 5. Tumor composition comparison ===")
let t_scores = result.get_population_scores("T cells")
let b_scores = result.get_population_scores("B lineage")
let f_scores = result.get_population_scores("Fibroblasts")
let mut i = 0
while i < samples.length() {
println(
"\{samples[i]}: T=\{t_scores[i]}, B=\{b_scores[i]}, Fibro=\{f_scores[i]}",
)
i = i + 1
}
println("")
// ------------------------------------------------------------------
// 6. Query specific score
// ------------------------------------------------------------------
println("=== 6. Query specific scores ===")
let t_a = result.get_score("T cells", "Tumor_A")
let b_a = result.get_score("B lineage", "Tumor_A")
println("Tumor_A - T cells: \{t_a}")
println("Tumor_A - B lineage: \{b_a}")
if t_a > b_a {
println("-> Tumor_A is T-cell rich (as designed)")
} else {
println("-> Tumor_A is B-cell rich (unexpected)")
}
println("")
// ------------------------------------------------------------------
// 7. Custom population example
// ------------------------------------------------------------------
println("=== 7. Custom cell population example ===")
let custom_pop = @bio.McpCellPopulation::new("Custom lineage", [
"CD3D", "CD3E", "CD2", "TRAC",
])
let custom_result = @bio.mcp_run(genes, samples, matrix, populations=[
custom_pop,
])
println("Custom population scores:")
let mut ci = 0
while ci < samples.length() {
let s = custom_result.scores()[0][ci]
println(" \{samples[ci]}: \{s}")
ci = ci + 1
}
println("")
// ------------------------------------------------------------------
// 8. Format full result table
// ------------------------------------------------------------------
println("=== 8. Full result table ===")
println(result.to_string())
println("=== Demo Complete ===")
}