///|
/// treeio demo - Phylogenetic tree I/O parsers and utilities.
/// Inspired by Bioconductor treeio package.
fn main {
println("=== treeio Demo: Phylogenetic Tree I/O ===")
println("")
// Step 1: Newick parsing
println("--- Step 1: Newick Format Parsing ---")
let newick = "((A:0.1,B:0.2):0.3,(C:0.4,D:0.5):0.6);"
println("Input: " + newick)
let tree = @src.treeio_parse_newick(newick)
let (n_total, n_tips, n_internal) = @src.treeio_tree_stats(tree)
println(
"Nodes: " +
n_total.to_string() +
" (tips=" +
n_tips.to_string() +
", internal=" +
n_internal.to_string() +
")",
)
println("Rooted: " + @src.treeio_is_rooted(tree).to_string())
println("Binary: " + @src.treeio_is_binary(tree).to_string())
println("Total branch length: " + @src.treeio_total_length(tree).to_string())
println("Max depth: " + @src.treeio_max_depth(tree).to_string())
println("Tip labels: " + repr(tree.tip_labels))
println("")
// Step 2: Round-trip write
println("--- Step 2: Newick Round-trip ---")
let rewritten = @src.treeio_write_newick(tree)
println("Rewritten: " + rewritten)
println("")
// Step 3: Beast annotated tree
println("--- Step 3: Beast Annotated Tree ---")
let beast_newick = "((A:1.0[&height=1.0],B:1.0[&height=1.0]):2.0[&height=3.0],C:3.0[&height=3.0]);"
println("Input: " + beast_newick)
let beast_tree = @src.treeio_parse_beast(beast_newick)
let (bt_total, bt_tips, _) = @src.treeio_tree_stats(beast_tree)
println(
"Parsed Beast tree: " +
bt_total.to_string() +
" nodes, " +
bt_tips.to_string() +
" tips",
)
println("")
// Step 4: jplace format
println("--- Step 4: jplace Format ---")
let jplace = "{\"tree\":\"((A:0.1,B:0.2):0.3,C:0.4);\",\"placements\":[{\"p\":[[1,0.5,0.01,0.02,0.03]],\"n\":[\"seq1\"]}],\"fields\":[\"edge_num\",\"likelihood\",\"like_weight_ratio\",\"pendant_length\",\"distal_length\"]}"
let jp = @src.treeio_parse_jplace(jplace)
println(
"Parsed jplace: " +
jp.placements.length().to_string() +
" placements, " +
jp.n_places.to_string() +
" places",
)
println("")
// Step 5: r8s format
println("--- Step 5: r8s Format ---")
let r8s = "tree1 = ((A:0.1,B:0.2):0.3,C:0.4);"
let r8s_trees = @src.treeio_parse_r8s(r8s)
println("Parsed r8s: " + r8s_trees.length().to_string() + " trees")
println("")
// Step 6: Phylip format
println("--- Step 6: Phylip Format ---")
let phylip = "4\nA 0.1\nB 0.2\nC 0.3\nD 0.4"
let phylip_tree = @src.treeio_parse_phylip(phylip)
let (pt_total, pt_tips, _) = @src.treeio_tree_stats(phylip_tree)
println(
"Parsed phylip: " +
pt_total.to_string() +
" nodes, " +
pt_tips.to_string() +
" tips",
)
println("")
// Step 7: Example tree
println("--- Step 7: Example Tree ---")
let ex = @src.treeio_example_tree()
let (ex_total, ex_tips, ex_internal) = @src.treeio_tree_stats(ex)
println(
"Example tree: " +
ex_total.to_string() +
" nodes (tips=" +
ex_tips.to_string() +
", internal=" +
ex_internal.to_string() +
")",
)
println("Newick: " + @src.treeio_write_newick(ex))
println("")
println("=== treeio Demo Complete ===")
}