///|
/// MAF (Multiple Alignment Format) Demo.
/// Demonstrates parsing, writing, and analyzing MAF alignment data.
fn main {
println("=== MAF (Multiple Alignment Format) Demo ===\n")
println("1. Parsing a MAF string with sequences...")
let maf_content = "##maf version=1 score=100\n\n" +
"a score=80\n" +
"s human.chr1 0 10 + 10000 ACGTACGTAC\n" +
"s mouse.chr1 0 10 + 8000 ACGTACGTAC\n" +
"s rat.chr1 0 10 + 6000 AC--ACGTAC\n\n" +
"a score=50\n" +
"s human.chr1 100 14 + 10000 TTTTAAAACCCCCC\n" +
"s mouse.chr1 100 14 + 8000 TTTTAAAACCCCCC\n" +
"s rat.chr1 100 14 - 6000 GGGAATTCCGGGGG\n\n" +
"a score=60\n" +
"s human.chr1 5000 400 + 250000000\n" +
"s mouse.chr1 5200 380 + 240000000\n" +
"s rat.chr1 5100 360 + 230000000\n\n"
let ali = @src.parse_maf(maf_content)
println(" Version: \{ali.version}")
println(" Number of blocks: \{@src.maf_num_blocks(ali)}")
println(" Total alignment length: \{@src.maf_total_length(ali)} columns")
let seq_names = @src.maf_all_seq_names(ali)
println(" Sequences: \{Repr(seq_names)}")
println("\n2. Calculating percent identity per block...")
let mut i = 0
while i < ali.blocks.length() {
let block = ali.blocks[i]
let identity = @src.maf_block_percent_identity(block)
let n_seqs = @src.maf_block_num_seqs(block)
let aln_len = @src.maf_block_alignment_length(block)
println(
" Block \{i}: %identity = \{identity}%, seqs = \{n_seqs}, columns = \{aln_len}",
)
i = i + 1
}
println("\n3. Computing alignment statistics...")
let stats = @src.maf_compute_stats(ali)
let stats_str = @src.maf_stats_to_string(stats)
println("\{stats_str}")
println("4. Selecting sequences (human.chr1 and mouse.chr1 only)...")
let selected = @src.maf_select_seqs(ali, ["human.chr1", "mouse.chr1"])
println(" Selected blocks: \{@src.maf_num_blocks(selected)}")
let sel_names = @src.maf_all_seq_names(selected)
println(" Selected sequences: \{Repr(sel_names)}")
let avg_id_sel = @src.maf_average_percent_identity(selected)
println(" Average percent identity (selected): \{avg_id_sel}%")
println("\n5. Filtering by minimum alignment length...")
let filtered = @src.maf_filter_by_length(ali, 10)
println(" Original blocks: \{@src.maf_num_blocks(ali)}")
println(
" Filtered blocks (min length 10): \{@src.maf_num_blocks(filtered)}",
)
let mut j = 0
while j < filtered.blocks.length() {
let block = filtered.blocks[j]
let len = @src.maf_block_alignment_length(block)
println(" Block \{j}: length = \{len}")
j = j + 1
}
println("\n6. Writing MAF alignment back to string...")
let output = @src.write_maf(ali)
let lines = output.split("\n").to_array()
println(" Output has \{lines.length()} lines")
println(" First line: \{lines[0]}")
let has_human = output.contains("human.chr1")
let has_mouse = output.contains("mouse.chr1")
println(" Contains human.chr1: \{has_human}")
println(" Contains mouse.chr1: \{has_mouse}")
println("\n7. Block-level operations...")
let block0 = ali.blocks[0]
let coverage0 = @src.maf_block_coverage(block0)
println(" Block 0 coverage: \{coverage0}")
let seq_cov = @src.maf_sequence_coverage(ali)
let keys = seq_cov.keys().collect()
let mut k = 0
while k < keys.length() {
let key = keys[k]
println(" Sequence '\{key}' coverage: \{seq_cov[key]}%")
k = k + 1
}
println("\n=== MAF Demo Complete ===")
}