///|
fn main {
println("=== Biopython Bio.Align.a2m Demo ===")
let alignment = @src.a2m_parse(@src.a2m_example_text()) catch {
_ => abort("failed to parse A2M sample")
}
println("\n1. State-aware A2M parsing")
println(" " + alignment.summary())
println(" Column states: " + alignment.states)
println(" Reference sequence: " + alignment.sequences[0].sequence)
println("\n2. Insertion slots and match consensus")
for insertion in alignment.insertion_runs() {
println(
" Slot " +
insertion.slot.to_string() +
": columns [" +
insertion.start_column.to_string() +
", " +
insertion.end_column.to_string() +
"), width " +
insertion.width.to_string(),
)
}
let consensus = alignment.consensus(include_insertions=false) catch {
_ => abort("failed to calculate A2M consensus")
}
println(" Match-state consensus: " + consensus)
println("\n3. Coordinate mapping")
match alignment.map_position(0, 1, 5) {
Some(position) =>
println(
" Reference residue 5 maps to query_one residue " +
position.to_string() +
" (zero-based)",
)
None => println(" Reference residue 5 maps to a query_one gap")
}
println("\n4. Pairwise alignment statistics")
let counts = alignment.pair_counts(0, 1) catch {
_ => abort("failed to calculate A2M pair counts")
}
println(
" Aligned/identity/mismatch: " +
counts.aligned.to_string() +
"/" +
counts.identities.to_string() +
"/" +
counts.mismatches.to_string(),
)
println(" Identity fraction: " + counts.identity().to_string())
println("\n5. Match-only projection")
let projected = alignment.match_projection() catch {
_ => abort("failed to project A2M match columns")
}
println(" " + projected.summary())
println(" Projected states: " + projected.states)
println("\n6. Wrapped canonical serialization")
let serialized = @src.a2m_write(alignment, line_width=6) catch {
_ => abort("failed to write A2M alignment")
}
let reparsed = @src.a2m_parse(serialized) catch {
_ => abort("failed to reparse A2M alignment")
}
println(" Serialized bytes: " + serialized.length().to_string())
println(
" Round trip preserved alignment: " + (alignment == reparsed).to_string(),
)
println("\n=== Demo Complete ===")
}