///|
/// Overlap-Layout-Consensus Demo - Sequence Assembly
///
/// This demo shows how to use the OLC algorithm for sequence assembly,
/// including overlap detection, layout path finding, and consensus generation.
fn main {
println("=== Overlap-Layout-Consensus Demo ===")
println("")
println("1. Basic overlap detection:")
let overlap = @src.compute_overlap("ABCDEF", "DEFXYZ", 2)
println(" Overlap between \"ABCDEF\" and \"DEFXYZ\": \{overlap}")
println("")
println("2. Simple sequence assembly:")
let simple_reads = ["ABCDEF", "DEFXYZ", "XYZ123"]
println(" Reads:")
for i = 0; i < simple_reads.length(); i = i + 1 {
println(" \{i}: \{simple_reads[i]}")
}
let simple_assembly = @src.olc_assemble(simple_reads, 2)
println(" Assembled: \{simple_assembly}")
println("")
println("3. DNA sequence assembly:")
let dna_reads = ["ACGTACGTCCG", "CGTCCGATGCA", "ATGCATGCTGA", "TGCTGACGTTT"]
println(" Reads:")
for i = 0; i < dna_reads.length(); i = i + 1 {
println(" \{i}: \{dna_reads[i]}")
}
let dna_assembly = @src.olc_assemble(dna_reads, 5)
println(" Assembled: \{dna_assembly}")
println("")
println("4. Banana example:")
let banana_reads = ["ban", "ana", "nan", "ana"]
println(" Reads:")
for i = 0; i < banana_reads.length(); i = i + 1 {
println(" \{i}: \{banana_reads[i]}")
}
let banana_assembly = @src.olc_assemble(banana_reads, 2)
println(" Assembled: \{banana_assembly}")
println("")
println("5. Find all overlaps:")
let overlaps = @src.compute_all_overlaps(dna_reads, 5)
println(" Number of overlaps found: \{overlaps.length()}")
for i = 0; i < overlaps.length(); i = i + 1 {
let o = overlaps[i]
println(
" Read \{o.from()} -> Read \{o.to()}: overlap length = \{o.overlap_len()}",
)
}
println("")
println("6. Overlap graph visualization (Graphviz DOT):")
let dot = @src.overlap_graph_to_dot(simple_reads, 2)
println(dot)
println("7. Layout path finding:")
let path = @src.find_layout_path(simple_reads, 2)
println(" Layout path:")
let path_str = StringBuilder()
for i = 0; i < path.length(); i = i + 1 {
path_str.write_string(path[i].to_string())
if i < path.length() - 1 {
path_str.write_string(" -> ")
}
}
println(" \{path_str.to_string()}")
println("")
println("8. Consensus generation from path:")
let consensus = @src.generate_consensus(simple_reads, path)
println(" Consensus: \{consensus}")
println("")
println("=== Demo Complete ===")
}