///|
/// 密码子优化演示: 宿主 CAI 权重 + GC/motif/均聚物约束.
fn main raise {
println("=== 密码子优化 (宿主偏好 + 序列约束, 本地完成) ===")
let protein = "MKKAVLAGGGEEEKKK*"
// 模拟高表达基因参考集, 用于估计宿主密码子偏好.
let reference = [
"ATGAAAAAAGCGGTGCTGGCGGGTGGTGGTGAAGAAGAAAAAAAATAA", "ATGAAAAAAGCGGTGCTGGCGGGCGGCGGTGAAGAAGAAAAAAAATAA",
]
let weights = @src.cai_weights(reference, table=1)
let forbidden = @src.codon_optimizer_sites_for_enzymes(["EcoRI", "BamHI"])
let config = @src.codon_optimizer_config(
table=1,
gc_min=0.45,
gc_max=0.6,
max_run=4,
avoid_cpg=true,
forbidden_motifs=forbidden,
seed=2026UL,
)
println("\n蛋白序列: \{protein}")
let dna = @src.codon_optimize(protein, weights, config~)
println("优化后 DNA (长度 \{dna.length()}):")
println(" \{dna}")
// 回译验证.
let table = @src.codon_table(1)
let sb = StringBuilder()
for i = 0; i + 3 <= dna.length(); i = i + 3 {
sb.write_string(table.get(dna[i:i + 3].to_owned()).unwrap_or("X"))
}
println("\n回译验证: \{sb.to_string()}")
println("与输入一致: \{sb.to_string() == protein}")
let report = @src.analyze_codon_optimization(
dna,
weights,
table=1,
forbidden_motifs=forbidden,
)
println("\n质量报告:")
println(" GC = \{report.gc}")
println(" CAI = \{report.cai}")
println(" 最长均聚物 = \{report.max_run}")
println(" 禁止 motif 命中 = \{report.forbidden_count}")
println("\n完成: 密码子设计全程本地完成, 数据不出本机.")
}