///|
fn main {
println("=== Single Cell Analysis Demo ===")
let counts = [
[100.0, 200.0, 50.0, 150.0, 300.0],
[120.0, 180.0, 60.0, 140.0, 280.0],
[80.0, 220.0, 40.0, 160.0, 320.0],
[90.0, 210.0, 45.0, 155.0, 310.0],
[110.0, 190.0, 55.0, 145.0, 290.0],
]
let gene_names = ["GeneA", "MT-CO1", "GeneB", "MT-ATP6", "GeneC"]
println("\n1. Calculate QC Metrics:")
let qc = @bio.calculate_qc_metrics(counts, gene_names)
let mut i = 0
while i < qc.n_umi.length() {
println(
"Cell " +
(i + 1).to_string() +
": nUMI=" +
qc.n_umi[i].to_string() +
", nGenes=" +
qc.n_genes[i].to_string() +
", mito%=" +
qc.mito_percent[i].to_string(),
)
i = i + 1
}
println("\n2. Filter Cells:")
let filtered = @bio.filter_cells(counts, qc, 500, 1000, 3, 20.0)
println("Filtered cells: " + filtered.length().to_string())
let working_data = if filtered.length() > 0 { filtered } else { counts }
println("\n3. Log Normalization:")
let normalized = @bio.log_normalize(working_data, None)
println(
"Normalized matrix shape: " +
normalized.length().to_string() +
"x" +
normalized[0].length().to_string(),
)
println("\n4. Find Variable Genes:")
let top_genes = @bio.find_variable_genes(normalized, 3)
println("Top variable gene indices: " + top_genes.length().to_string())
let mut j = 0
while j < top_genes.length() {
println(top_genes[j].to_string() + " ")
j = j + 1
}
println("")
println("\n5. PCA Analysis:")
let (pca_result, eigenvalues) = @bio.pca_power_iteration(normalized, 2)
println("Eigenvalues:")
j = 0
while j < eigenvalues.length() {
println("PC" + (j + 1).to_string() + ": " + eigenvalues[j].to_string())
j = j + 1
}
println("\nPCA coordinates:")
j = 0
while j < pca_result.length() {
println("Cell " + (j + 1).to_string() + ": [")
let mut k = 0
while k < pca_result[j].length() {
println(pca_result[j][k].to_string())
if k < pca_result[j].length() - 1 {
println(", ")
}
k = k + 1
}
println("]")
j = j + 1
}
println("\n6. SimpleSCE:")
let assays = [normalized]
let col_data = [["Cell1"], ["Cell2"], ["Cell3"], ["Cell4"], ["Cell5"]]
let row_data = [["GeneA"], ["MT-CO1"], ["GeneB"], ["MT-ATP6"], ["GeneC"]]
let sce = @bio.SimpleSCE::new(assays, col_data, row_data)
println("Assays: " + sce.assays.length().to_string())
println("Cells: " + sce.col_data.length().to_string())
println("Genes: " + sce.row_data.length().to_string())
println("\n=== Demo Complete ===")
}