///|
/// fasta_search_io module demo - FASTA -m8/-m9 search output parsing.
///
/// Demonstrates parsing of `fasta36` `-m 8` (compact tabular) and
/// `-m 9` (tabular with comment header) output, including metadata
/// extraction and query/hit/HSP aggregation.
///
/// Reference: Biopython Bio.SearchIO.FastaIO
/// Run: moon run examples/fasta_search_io_demo
fn main {
println("=== fasta_search_io Module Demo ===")
println("FASTA -m8/-m9 search output parsing")
println("Reference: Biopython Bio.SearchIO.FastaIO")
println("")
// ------------------------------------------------------------------
// 1. Parse -m 8 (compact tabular) sample
// ------------------------------------------------------------------
println("=== 1. Parse -m 8 Sample ===")
let m8 = @bio.fasta_m8_sample()
let m8_results = @bio.parse_fasta_m8(m8)
println("Number of queries: " + m8_results.length().to_string())
let mut qi = 0
while qi < m8_results.length() {
let qr = m8_results[qi]
println("Query: " + qr.id + " hits: " + qr.hits.length().to_string())
let mut hi = 0
while hi < qr.hits.length() {
let h = qr.hits[hi]
println(
" Hit: " +
h.id +
" bitscore=" +
h.bitscore.to_string() +
" evalue=" +
h.evalue.to_string() +
" hsps=" +
h.hsps.length().to_string(),
)
let mut si = 0
while si < h.hsps.length() {
let frag = h.hsps[si].fragments[0]
println(
" HSP: query=" +
frag.query_start.to_string() +
"-" +
frag.query_end.to_string() +
" subject=" +
frag.hit_start.to_string() +
"-" +
frag.hit_end.to_string() +
" aln_len=" +
frag.aln_span.to_string(),
)
si = si + 1
}
hi = hi + 1
}
qi = qi + 1
}
println("")
// ------------------------------------------------------------------
// 2. Parse -m 9 (tabular with comments) sample
// ------------------------------------------------------------------
println("=== 2. Parse -m 9 Sample ===")
let m9 = @bio.fasta_m9_sample()
let m9_result = @bio.parse_fasta_m9(m9)
let meta = m9_result.meta
println("Metadata:")
println(" Program: " + meta.program)
println(" Version: " + meta.version)
println(" Database: " + meta.database)
println(" Comment lines: " + meta.comments.length().to_string())
println("Queries parsed: " + m9_result.queries.length().to_string())
println("")
// ------------------------------------------------------------------
// 3. Custom -m 8 input
// ------------------------------------------------------------------
println("=== 3. Custom -m 8 Input ===")
let custom = "q1\ts1\t95.0\t100\t5\t0\t1\t100\t1\t100\t1e-50\t200.3\n" +
"q1\ts2\t80.0\t80\t16\t2\t1\t80\t1\t80\t1e-30\t150.0\n"
let custom_results = @bio.parse_fasta_m8(custom)
println("Queries: " + custom_results.length().to_string())
println("First query hits: " + custom_results[0].hits.length().to_string())
println(
"First hit id: " +
custom_results[0].hits[0].id +
" bitscore=" +
custom_results[0].hits[0].bitscore.to_string(),
)
println("")
println("=== Demo Complete ===")
}