///|
/// CRISPR gRNA 设计演示: PAM 扫描 -> 打分 -> off-target -> JSON.
fn main {
println("=== CRISPR gRNA 设计器 (SpCas9 NGG) ===")
// 目标序列(含一处重复片段制造 off-target)
let target = "ATGCGTACCTGAGGCTAAGCTTACGGATCCGGGATCTAGAATTCCGGAAGCTTGGATCCCTAGCGGATC"
let reference = "GCTTAAGCTTACGGATCCGGGATCTAGAATTCCGGGATC" + target
println(
"目标 \{target.length()}bp / 参考基因组 \{reference.length()}bp",
)
// 1. 扫描全部候选
println("\n1. 候选扫描")
let all = @src.crispr_scan_guides(target)
println(" 共 \{all.length()} 条候选(含正/反链)")
// 2. 完整设计(打分+off-target+排序)
println("\n2. Top 5 设计结果")
let guides = @src.crispr_design_guides(target, reference~, top_n=5)
println(" spacer PAM strand on-target spec total")
for g in guides {
println(
" \{g.spacer} \{g.pam} \{g.strand} \{g.on_target} \{g.specificity} \{g.total_score}",
)
for w in g.warnings {
println(" [警告] \{w}")
}
}
// 3. off-target 明细
println("\n3. Top 1 候选 off-target 明细")
if guides.length() > 0 {
let top = guides[0]
println(
" spacer=\{top.spacer} 共 \{top.off_targets.length()} 个脱靶位点:",
)
for o in top.off_targets {
println(
" pos=\{o.pos} mismatches=\{o.mismatches} score=\{o.site_score}",
)
}
}
// 4. Cas12a 演示
println("\n4. Cas12a(TTTV PAM) 候选")
let cas12a = @src.crispr_scan_guides(
"AAAATTTGAAACCCCGGGGTTTTAAAACCCCGGGGTTTTAAA",
pam=@src.crispr_pam_cas12a(),
spacer_len=23,
)
println(" 共 \{cas12a.length()} 条候选")
// 5. JSON 输出
println("\n5. JSON 输出(parse_json 闭环)")
let json = @src.crispr_guides_json(guides)
let v = @src.parse_json(json)
println(" \{json.length()} 字符, 解析: \{v is Some(_)}")
println(
"\n完成: PAM 扫描 -> Doench 简化打分 -> FM-index 脱靶评估 -> JSON 全链路本地完成.",
)
}