///|
/// Phylo NeXML Demo - NeXML format creation and serialization.
///
/// Run: moon run examples/phylo_nexml_demo/main.mbt
fn main {
println("=== Phylo NeXML Demo ===\n")
// 1. Create OTUs
println("1. Creating OTUs block:")
let otu1 = @bio.NeXMLOTU::new("otu1", "Homo_sapiens")
let otu2 = @bio.NeXMLOTU::new("otu2", "Pan_troglodytes")
let otu3 = @bio.NeXMLOTU::new("otu3", "Gorilla_gorilla")
let otus = [otu1, otu2, otu3]
let otus_block = @bio.NeXMLOTUs::new("otus1", otus)
println(" OTUs block ID: \{otus_block.id}")
println(" Number of OTUs: \{otus_block.otus.length()}")
// 2. Create a tree
println("\n2. Creating a phylogenetic tree:")
let node1 = @bio.NeXMLNode::new("n1", "root", "")
let node2 = @bio.NeXMLNode::new("n2", "Human", "otu1")
let node3 = @bio.NeXMLNode::new("n3", "Chimp", "otu2")
let node4 = @bio.NeXMLNode::new("n4", "Gorilla", "otu3")
let nodes = [node1, node2, node3, node4]
let edge1 = @bio.NeXMLEdge::new("e1", "n1", "n2", length=Some(0.1))
let edge2 = @bio.NeXMLEdge::new("e2", "n1", "n3", length=Some(0.15))
let edge3 = @bio.NeXMLEdge::new("e3", "n1", "n4", length=Some(0.2))
let edges = [edge1, edge2, edge3]
let tree = @bio.NeXMLTree::new(
"tree1", "Primates Tree", "FloatTree", true, nodes, edges,
)
println(" Tree ID: \{tree.id}")
println(" Tree name: \{tree.name}")
println(" Number of nodes: \{tree.nodes.length()}")
println(" Number of edges: \{tree.edges.length()}")
// 3. Create trees block
let trees = [tree]
let trees_block = @bio.NeXMLTrees::new("trees1", "otus1", trees)
println(" Trees block ID: \{trees_block.id}")
// 4. Create full NeXML document
println("\n3. Creating NeXML document:")
let doc = @bio.NeXMLDocument::new(version="0.9", generator="BioSeqs")
println(" Version: \{doc.version}")
println(" Generator: \{doc.generator}")
println(" OTU blocks: \{doc.otus_blocks.length()}")
println(" Tree blocks: \{doc.trees_blocks.length()}")
// 5. Convert tree to Newick format
println("\n4. Converting tree to Newick format:")
let newick = @bio.nexml_tree_to_newick(tree)
println(" Newick: \{newick}")
// 6. Serialize to XML
println("\n5. Serializing to NeXML format:")
let xml = @bio.nexml_to_xml(doc)
println(" XML length: \{xml.length()} characters")
println(" First 200 chars:")
let preview = if xml.length() > 200 {
xml[0:200].to_owned() + "..."
} else {
xml
}
println(" \{preview}")
// 7. Utility functions
println("\n6. Utility functions:")
println(" Total OTU count: \{@bio.nexml_get_otu_count(doc)}")
println(" Total tree count: \{@bio.nexml_get_tree_count(doc)}")
let labels = @bio.nexml_get_all_otu_labels(doc)
println(" All OTU labels: \{labels.join(", ")}")
println("\n=== Demo Complete ===")
}