///|
/// Codon alignment and dN/dS analysis demo inspired by Biopython Bio.codonalign.
///
/// Run: moon run examples/codon_align_demo/main.mbt
fn main {
println("=== Bio.codonalign Demo ===")
let seq1 = "ATGTCTGAAGTGGAA"
let seq2 = "ATGTCTGAAGTGGAA"
let seq3 = "ATGTCCGAAGTGGAA"
println("\n1. Input sequences:")
println(" Seq1: \{seq1}")
println(" Seq2: \{seq2}")
println(" Seq3: \{seq3}")
println("\n2. Translate codons:")
println(" ATG -> \{@bio.codon_to_aa("ATG")}")
println(" TCT -> \{@bio.codon_to_aa("TCT")}")
println(" GAA -> \{@bio.codon_to_aa("GAA")}")
println("\n3. Classify codon substitution:")
println(
" TCT vs TCC: " +
@bio.classify_codon_substitution("TCT", "TCC").to_string(),
)
println(
" TCT vs TTT: " +
@bio.classify_codon_substitution("TCT", "TTT").to_string(),
)
println("\n4. Count codon substitutions:")
let counts = @bio.count_codon_substitutions(seq1, seq3)
println(" Synonymous: \{counts.synonymous}")
println(" Non-synonymous: \{counts.nonsynonymous}")
println(" Total: \{counts.total}")
println("\n5. dN/dS ratio (Nei-Gojobori):")
let dnds = @bio.calc_dnds_nei_gojobori(seq1, seq3)
println(" dN: \{dnds.dn}")
println(" dS: \{dnds.ds}")
println(" dN/dS: \{dnds.dnds}")
println("\n6. Codon usage bias (RSCU):")
let bias = @bio.codon_usage_bias(seq1)
for kv in bias {
println(" \{kv.0}: \{kv.1}")
}
println("\n7. Total codon sites:")
let sites = @bio.total_codon_sites(seq1)
println(" Synonymous sites: \{sites.0}")
println(" Non-synonymous sites: \{sites.1}")
println("\n8. Effective number of codons (ENC):")
let enc = @bio.effective_number_of_codons(seq1)
println(" ENC: \{enc}")
println("\n9. Jukes-Cantor correction:")
println(" p=0.1 -> d=\{@bio.jukes_cantor_correction(0.1)}")
println(" p=0.3 -> d=\{@bio.jukes_cantor_correction(0.3)}")
}