///|
/// GFF example: GFF format parsing and gene annotation operations.
///
/// Run: moon run examples/gff_demo/main.mbt
fn main {
println("=== Bio.GFF Demo ===\n")
let record = @bio.create_example_gff()
println("1. Basic Statistics:")
println(" Total features: \{record.count_features()}")
println(" GFF version: \{record.version}")
println("\n2. Unique sequence IDs:")
let seqids = record.get_unique_seqids()
for i = 0; i < seqids.length(); i = i + 1 {
println(" - \{seqids[i]}")
}
println("\n3. Unique feature types:")
let ftypes = record.get_unique_feature_types()
for i = 0; i < ftypes.length(); i = i + 1 {
println(" - \{ftypes[i]}")
}
println("\n4. Genes in record:")
let genes = record.get_genes()
for i = 0; i < genes.length(); i = i + 1 {
let gene = genes[i]
match gene.get_name() {
Some(name) =>
println(" - \{name} (chr\{gene.seqid}, \{gene.start}-\{gene.end})")
None => println(" - gene (chr\{gene.seqid}, \{gene.start}-\{gene.end})")
}
}
println("\n5. mRNAs in record:")
let mrnas = record.get_mrnas()
for i = 0; i < mrnas.length(); i = i + 1 {
let mrna = mrnas[i]
match mrna.get_id() {
Some(id) => println(" - \{id}")
None => println(" - unnamed mRNA")
}
}
println("\n6. CDS features:")
let cds = record.get_cds_features()
for i = 0; i < cds.length(); i = i + 1 {
let c = cds[i]
println(" - CDS \{i + 1}: \{c.start}-\{c.end} (length: \{c.length()})")
}
println("\n7. Exons:")
let exons = record.get_exons()
for i = 0; i < exons.length(); i = i + 1 {
let e = exons[i]
println(" - Exon \{i + 1}: \{e.start}-\{e.end} (length: \{e.length()})")
}
println("\n8. Child features of gene:ENSG00000130203")
let children = record.get_child_features("gene:ENSG00000130203")
for i = 0; i < children.length(); i = i + 1 {
let child = children[i]
println(" - \{child.feature_type}: \{child.start}-\{child.end}")
}
println("\n9. Parse GFF string:")
let gff_content = "##gff-version 3\nchr1\tEnsembl\tgene\t1000\t2000\t.\t+\t.\tID=gene001;Name=TestGene\nchr1\tEnsembl\tmRNA\t1100\t1900\t.\t+\t.\tID=mrna001;Parent=gene001\nchr1\tEnsembl\tCDS\t1100\t1200\t.\t+\t0\tID=cds001;Parent=mrna001\n"
let parsed = @bio.bio_parse_gff(gff_content)
println(" Parsed \{parsed.count_features()} features")
println("\n10. Feature in range:")
let range_features = record.get_features_in_range("chr1", 10000, 11000)
println(" Features in chr1:10000-11000: \{range_features.length()}")
println("\n11. GFFFeature operations:")
let feature = @bio.GFFFeature::new("chr1", "Ensembl", "gene", 1000, 2000, "+")
.add_attribute("ID", "test_gene")
.add_attribute("Name", "Test")
match feature.get_id() {
Some(id) => println(" Feature ID: \{id}")
None => println(" No ID")
}
match feature.get_name() {
Some(name) => println(" Feature Name: \{name}")
None => println(" No Name")
}
println(" Length: \{feature.length()}")
println(" Is coding: \{feature.is_coding()}")
println(" Forward strand: \{feature.is_on_forward_strand()}")
println("\n=== Demo Complete ===")
}