///|
/// seqLogo demo - Sequence logo computation and rendering.
///
/// Demonstrates PWM construction, information content, logo computation,
/// consensus extraction, and ASCII/table rendering.
///
/// Reference: Bembom O (2007) seqLogo: Sequence logos for DNA sequence
/// alignments. R package.
/// Run: moon run examples/seqlogo_demo
fn main {
println("=== seqLogo Demo ===")
println("Sequence logo computation and rendering")
println("")
// ------------------------------------------------------------------
// 1. Load sample PWM
// ------------------------------------------------------------------
println("=== 1. Load sample PWM ===")
let pwm = @bio.seqlogo_sample_pwm()
println("Loaded sample PWM (4 bases x \{pwm.width()} positions)")
println("")
// ------------------------------------------------------------------
// 2. Print PWM info (width, to_string first few positions)
// ------------------------------------------------------------------
println("=== 2. PWM info ===")
println("Width: \{pwm.width()}")
println("Alphabet size: \{pwm.alphabet_size()}")
let alphabet = pwm.alphabet()
println("Alphabet: \{alphabet[0]}\{alphabet[1]}\{alphabet[2]}\{alphabet[3]}")
println("First 3 positions (A, C, G, T):")
let pos_limit = if pwm.width() < 3 { pwm.width() } else { 3 }
for pos in 0.. 0 {
buf.write_string(", ")
}
buf.write_char(letters[i].letter())
buf.write_string("=")
buf.write_string(letters[i].height().to_string())
}
println(buf.to_string())
}
println("")
// ------------------------------------------------------------------
// 6. Show consensus sequence
// ------------------------------------------------------------------
println("=== 6. Consensus sequence ===")
let consensus = @bio.seqlogo_consensus_sequence(pwm)
println("Consensus: \{consensus}")
println("")
// ------------------------------------------------------------------
// 7. Render ASCII art logo
// ------------------------------------------------------------------
println("=== 7. ASCII art logo ===")
let ascii = @bio.seqlogo_to_ascii(logo, 10)
println(ascii)
// ------------------------------------------------------------------
// 8. Show text table (position, base, height, IC)
// ------------------------------------------------------------------
println("=== 8. Text table ===")
let table = @bio.seqlogo_to_text_table(logo)
println(table)
// ------------------------------------------------------------------
// 9. Build PWM from sample sequences, compare with sample PWM
// ------------------------------------------------------------------
println("=== 9. Build PWM from sample sequences ===")
let seqs = @bio.seqlogo_sample_sequences()
println(
"Loaded \{seqs.length()} aligned sequences of length \{seqs[0].length()}",
)
let built_pwm = @bio.SeqLogoPwm::from_sequences(seqs)
let built_consensus = @bio.seqlogo_consensus_sequence(built_pwm)
let built_total_ic = @bio.seqlogo_total_information_content(built_pwm)
println("Built PWM width: \{built_pwm.width()}")
println("Built PWM total IC: \{built_total_ic} bits")
println("Built consensus: \{built_consensus}")
println("Sample consensus: \{consensus}")
// Compare consensus bases position-by-position between the two PWMs.
let mut n_match = 0
for pos in 0.. built_max {
built_max = f
built_top = base
}
}
let mut sample_top = 0
let mut sample_max = -1.0
for base in 0.. sample_max {
sample_max = f
sample_top = base
}
}
if built_top == sample_top {
n_match = n_match + 1
}
}
println("Consensus positions matching: \{n_match} / \{built_pwm.width()}")
println("")
// ------------------------------------------------------------------
// 10. Show logo summary
// ------------------------------------------------------------------
println("=== 10. Logo summary ===")
println(@bio.seqlogo_logo_summary(logo))
println("=== seqLogo Demo complete ===")
}