///|
/// Stockholm format parsing example.
///
/// Run: moon run examples/stockholm_demo/main.mbt
fn main {
println("=== Stockholm Format Parser Demo ===")
println("")
let stockholm_content = "# STOCKHOLM 1.0\n" +
"#=GF ID TestFamily\n" +
"#=GF AC PF00001.20\n" +
"#=GF DE A test protein family with secondary structure\n" +
"#=GC SS_cons ........((((...)))).....\n" +
"seq1/1-50 ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT\n" +
"seq2/1-50 ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT\n" +
"seq3/1-50 ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT\n" +
"seq4/1-50 ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT\n" +
"#=GR seq1 ........((((...)))).....\n" +
"//\n"
println("1. Parsing Stockholm alignment...")
let ali = @bio.stockholm_parse(stockholm_content)
println(" Version: \{ali.version}")
println(" Blocks: \{ali.blocks.length()}")
println(" GF annotations: \{ali.gf_annotations.keys().count()}")
println("")
println("2. GF Annotations:")
let gf_keys = ali.gf_annotations.keys().collect()
let mut gi = 0
while gi < gf_keys.length() {
println(" \{gf_keys[gi]}: \{ali.gf_annotations[gf_keys[gi]]}")
gi = gi + 1
}
println("")
println("3. Sequences in first block:")
if ali.blocks.length() > 0 {
let block = ali.blocks[0]
let mut si = 0
while si < block.sequences.length() {
let seq = block.sequences[si]
println(
" \{seq.name}/\{seq.start}-\{seq.end} (\{seq.aligned_seq.length()} chars)",
)
si = si + 1
}
println("")
println("4. Secondary structure: \{block.secondary_structure}")
println("")
println("5. Percent identity: \{@bio.stockholm_percent_identity(block)}")
println("")
println("6. Per-column conservation (first 10 columns):")
let cons = @bio.stockholm_conservation(block)
let mut ci = 0
while ci < 10 && ci < cons.length() {
println(" Column \{ci}: \{cons[ci]}")
ci = ci + 1
}
}
println("")
println("7. Converting to FASTA...")
let fasta = @bio.stockholm_to_fasta(ali)
println(fasta)
println("8. Writing Stockholm format...")
let output = @bio.stockholm_write(ali)
println(output)
println("9. Merging blocks...")
let merged = @bio.stockholm_merge_blocks(ali)
println(" Merged blocks: \{merged.blocks.length()}")
if merged.blocks.length() > 0 {
println(
" Sequences in merged block: \{merged.blocks[0].sequences.length()}",
)
}
println("")
println("=== Done ===")
}