///|
/// acmg_demo — ACMG 2015 自动化分级 + ClinVar 摄取演示:
/// 合成 ClinVar 库 + 6 类典型变异(LoF/低频错义/高频多态/框内缺失/
/// 同义/ClinVar 致病位点) -> 证据推导 -> 五级分类 -> TSV/JSON 报告.
///|
fn acd_clinvar_tsv() -> String {
"#ClinVar simplified TSV\n" +
"chrom\tpos\tref\talt\tclnsig\tstar\n" +
"chr1\t101\tA\tG\tPathogenic\t3\n" +
"chr1\t805\tC\tT\tBenign\t2\n"
}
///|
fn main {
println("1. ACMG 2015 自动化分级演示(InterVar 风格)")
let clinvar = @src.clinvar_parse(acd_clinvar_tsv())
println("2. ClinVar 库摄取: \{clinvar.length()} 条记录")
// 3. 构造 6 类典型变异
let inputs : Array[@src.AcmgInput] = []
// (a) LoF + 低频 + 预测有害 + 功能阳性 -> PVS1+PM2+PP3+PS3
inputs.push(
@src.acmg_make_input(
"chr1",
701,
"C",
"T",
"stop_gained",
popmax_af=0.0001,
in_silico_score=Some(28.0),
functional_score=Some(1.5),
),
)
// (b) LoF + 低频 + de novo -> PVS1+PM2+PM6
inputs.push(
@src.acmg_make_input(
"chr1",
702,
"CA",
"C",
"frameshift_variant",
popmax_af=0.0002,
de_novo=true,
),
)
// (c) 高频错义 -> BA1
inputs.push(
@src.acmg_make_input(
"chr1",
703,
"A",
"G",
"missense_variant",
popmax_af=0.12,
),
)
// (d) 低频错义 missense-only 基因 + 预测有害 -> PM2+PP2+PP3
inputs.push(
@src.acmg_make_input(
"chr1",
704,
"G",
"A",
"missense_variant",
popmax_af=0.0005,
gene_missense_only=true,
in_silico_score=Some(25.0),
),
)
// (e) 同义变异 -> BP7
inputs.push(@src.acmg_make_input("chr1", 705, "T", "C", "synonymous_variant"))
// (f) ClinVar 已知致病位点(>=2星) -> PS1+PP5+PM2
inputs.push(
@src.acmg_make_input(
"chr1",
101,
"A",
"G",
"missense_variant",
popmax_af=0.0005,
),
)
println(
"3. 输入 6 类典型变异(LoF x2 / 高频 / miss-only / 同义 / ClinVar 位点)",
)
// 4. 批量解读
let results = @src.acmg_annotate(inputs, clinvar~)
println("4. 逐条解读:")
for r in results {
let mut ev = ""
for i = 0; i < r.evidence.length(); i = i + 1 {
if i > 0 {
ev = ev + "&"
}
ev = ev + r.evidence[i]
}
println(
" chr1:\{r.pos} \{r.ref_allele}>\{r.alt} [\{r.consequence}] 证据=\{ev}",
)
let cv_note = if r.clinvar_sig == "" {
""
} else {
" (ClinVar: " + r.clinvar_sig + ")"
}
println(" 分级=\{r.classification}\{cv_note}")
for reason in r.reasons {
println(" 理由: \{reason}")
}
}
// 5. 汇总与导出
println("5. \{results.length()} 条变异")
println(@src.acmg_summary_line(results))
let tsv = @src.acmg_report_tsv(results)
let json = @src.acmg_json(results)
println("6. TSV \{tsv.length()} 字节, JSON \{json.length()} 字节")
println(
"演示完成: ClinVar 摄取 -> 证据推导 -> ACMG 五级分类 -> 报告闭环",
)
}