///|
/// SCnorm Single-cell RNA-seq Normalization Demo.
fn main {
println("=== SCnorm Single-cell RNA-seq Normalization Demo ===\n")
// Create simulated single-cell data
println("1. Creating simulated scRNA-seq count matrix...")
let genes = ["Gene_A", "Gene_B", "Gene_C", "Gene_D", "Gene_E"]
let cell_ids = ["cell_1", "cell_2", "cell_3"]
// Counts: genes (rows) x cells (columns)
let counts : Array[Array[Double]] = [
[10.0, 20.0, 30.0], // Gene_A
[5.0, 15.0, 25.0], // Gene_B
[100.0, 200.0, 300.0], // Gene_C (highly expressed)
[50.0, 80.0, 120.0], // Gene_D
[1.0, 2.0, 3.0], // Gene_E
]
println(" Genes: \{genes.length()}, Cells: \{cell_ids.length()}")
// Compute library sizes
println("\n2. Computing library sizes per cell...")
let lib_sizes = @src.sc_norm_library_sizes(counts)
let mut s = 0
while s < lib_sizes.length() {
let ls = lib_sizes[s].to_string()
println(" \{cell_ids[s]}: library_size=\{ls}")
s = s + 1
}
// Normalize a single gene
println("\n3. Normalizing Gene_C with SCnorm...")
let params = @src.SCnormParams::new()
let gene_id = "Gene_C"
let gene_counts = counts[2]
let norm_result = @src.sc_norm_normalize_gene(
gene_id, gene_counts, lib_sizes, params,
)
println(" Gene: \{norm_result.gene_id}")
println(" Passed filter: \{norm_result.passed_filter}")
println(" Normalized counts:")
let mut n = 0
while n < gene_counts.length() {
let orig = gene_counts[n].to_string()
let norm = norm_result.norm_counts[n].to_string()
println(" \{cell_ids[n]}: original=\{orig}, normalized=\{norm}")
n = n + 1
}
// Run full normalization pipeline
println("\n4. Running full SCnorm normalization pipeline...")
let full_result = @src.sc_norm_run(counts, genes, cell_ids, params)
println(" Gene results: \{full_result.gene_results.length()}")
println(" Filtered genes: \{full_result.gene_ids.length()}")
// Print some gene results
println("\n5. Normalization results for each gene:")
let mut g = 0
while g < full_result.gene_results.length() && g < 3 {
let fit = full_result.gene_results[g]
let slope_fit = fit.quant_fit.slope.to_string()
let intercept_fit = fit.quant_fit.intercept.to_string()
println(" \{fit.gene_id}: slope=\{slope_fit}, intercept=\{intercept_fit}")
g = g + 1
}
println("\n=== SCnorm Demo Complete ===")
}