///|
/// conservation_demo — GERP/phastCons-lite 进化约束打分演示:
/// 合成 5 物种 MSA(保守-可变-保守三段) -> GERP-lite 逐列拒绝打分 ->
/// 保守后验 -> 两状态 Viterbi 保守区段 -> GenomicScores 容器闭环.
///|
fn csd_msa() -> Array[String] {
[
"ACGTACGT" + "TTTTGGGG" + "TGCA",
"ACGTACGT" + "CCCCAAAA" + "TGCA",
"ACGTACGT" + "TTTTGGGG" + "TGCA",
"ACGTACGT" + "CCCCAAAA" + "TGCA",
"ACGTACGT" + "ACGTACGT" + "TGCA",
]
}
///|
fn main raise {
println(
"1. GERP/phastCons-lite 进化约束打分演示(熵代理 + 两状态 HMM)",
)
let msa = csd_msa()
println(
"2. 合成 MSA: \{msa.length()} 物种 x \{msa[0].length()} 列(保守 0-7 / 可变 8-15 / 保守 16-19)",
)
// 3. GERP-lite
let gerp = @src.conservation_gerp(msa, tree_length=2.0)
println("3. GERP-lite 逐列拒绝打分(树长 2.0):")
let mut row = " "
for i = 0; i < 20; i = i + 1 {
let v = gerp[i]
let tag = if v > 1.5 { "H" } else if v > 0.5 { "m" } else { "." }
row = row + tag
}
println("\{row} (H=高约束 m=中 .=低)")
println(" 列 0 = \{gerp[0]}, 列 8 = \{gerp[8]}, 列 16 = \{gerp[16]}")
// 4. 后验 + Viterbi
let post = @src.conservation_posterior(msa)
let segs = @src.conservation_viterbi_segments(msa, posterior=Some(post))
println("4. 保守后验与 Viterbi 区段:")
for s in segs {
println(
" 保守区段 [\{s.start}, \{s.end_}) 平均后验=\{s.mean_posterior}",
)
}
// 5. GenomicScores 闭环
let gs = @src.GScores::new("GERP-lite", "demo")
@src.conservation_to_gscores(gs, "chr1", gerp)
gs.set_default_population("gerp_lite")
let v = gs.score_at("chr1", 1)
println("5. GenomicScores 容器闭环: chr1:1 分数 = \{v}")
// 6. 导出
let tsv = @src.conservation_tsv("chr1", gerp, post)
let json = @src.conservation_json(gerp, post, segs)
println("6. TSV \{tsv.length()} 字节, JSON \{json.length()} 字节")
println(@src.conservation_summary_line(gerp, segs))
println(
"演示完成: MSA -> GERP-lite -> 后验 -> 保守区段 -> 打分容器闭环",
)
}