///|
/// de novo motif 发现演示: 植入 motif -> EM/Gibbs 恢复 -> 与 motif 栈闭环.
fn main raise {
println("=== de novo motif 发现 (EM / Gibbs) ===")
// 构造含植入 motif 的序列集
let planted = "ACGTTGCA"
let rng = @src.Rng::from_int(12345)
let bg : Array[Char] = ['A', 'C', 'G', 'T']
let seqs : Array[String] = Array(capacity=0)
for i = 0; i < 10; i = i + 1 {
let sb = StringBuilder()
let left_len = 8 + rng.next_int(5)
for j = 0; j < left_len; j = j + 1 {
sb.write_char(bg[rng.next_int(4)])
}
sb.write_string(planted)
let right_len = 8 + rng.next_int(5)
for j = 0; j < right_len; j = j + 1 {
sb.write_char(bg[rng.next_int(4)])
}
ignore(i)
seqs.push(sb.to_string())
}
println("植入 motif: \{planted}, 序列 \{seqs.length()} 条")
// 1. EM 发现
println("\n1. EM 发现(MEME 风格多起点)")
let em = @src.motif_em(seqs, width=8, iterations=60)
println(" " + em.summary())
println(" 位点指认:")
for i = 0; i < em.site_positions.length(); i = i + 1 {
let p = em.site_positions[i]
println(" seq\{i}: pos=\{p.0} strand=\{p.1} site=\{em.sites[i]}")
}
// 2. Gibbs 发现
println("\n2. Gibbs 采样发现(AlignACE 风格, 确定性 RNG)")
let gibbs = @src.motif_gibbs(seqs, width=8, restarts=3, sweeps=40, seed=42)
println(" " + gibbs.summary())
// 3. 双链一致性
println("\n3. 双链一致性检查")
let cons_em = em.consensus()
let cons_gibbs = gibbs.consensus()
let rc_gibbs = @src.reverse_complement(cons_gibbs)
println(
" EM consensus=\{cons_em}, Gibbs consensus=\{cons_gibbs} (rc=\{rc_gibbs})",
)
let same = cons_em == cons_gibbs || cons_em == rc_gibbs
println(" 双算法一致性: \{same}")
// 4. 与 motif 栈闭环
println("\n4. 与 motif 栈闭环")
let m = em.to_motif()
println(
" to_motif: name=\{m.name} pwm_rows=\{m.pwm.length()} sites=\{m.sites.length()}",
)
println(
" consensus(库内 get_consensus 风格): \{@src.get_consensus(m.pwm[0], "ACGT")}",
)
// 5. 随机背景对照
println("\n5. 随机背景对照(应低 IC)")
let rng2 = @src.Rng::from_int(99)
let null_seqs : Array[String] = Array(capacity=0)
for i = 0; i < 10; i = i + 1 {
let sb = StringBuilder()
for j = 0; j < 30; j = j + 1 {
sb.write_char(bg[rng2.next_int(4)])
}
ignore(i)
null_seqs.push(sb.to_string())
}
let null_em = @src.motif_em(null_seqs, width=8, iterations=30)
println(
" null IC=\{null_em.information_content} (signal IC=\{em.information_content})",
)
println(
" 信噪分离: \{em.information_content > null_em.information_content}",
)
println(
"\n完成: 多起点 EM + Gibbs 双算法 de novo 发现本地完成.",
)
}