///|
/// 长读长深化演示: minimap 预设比对 -> medaka-lite 变异检出.
fn main {
println("=== 长读长管线: minimap 预设 + medaka-lite 变异检出 ===")
let reference = "ATCGGATTCAGCCTAGGATCAAGTTCGGATACCTAGGCATTGCAAGGTCCTAGAAGTCCATTGCAGGT"
println("参考 \{reference.length()}bp")
let refs : Array[@src.MinimapRefSeq] = [
@src.MinimapRefSeq::new("ctg1", reference),
]
// 1. 三种预设
println("\n1. 预设参数 (对齐 minimap2 -x)")
for preset in [@src.MapOnt, @src.MapPb, @src.MapSr] {
let (k, w, band, skip) = preset.params()
println(
" \{preset.to_string()}: k=\{k} w=\{w} band=\{band} chain_skip=\{skip}",
)
}
// 2. map-ont 比对
println("\n2. map-ont 长读比对")
let index = @src.minimap_index_build_preset(refs, @src.MapOnt)
let region = reference[10:50].to_owned()
// 模拟 ONT 噪声: 2 处错配
let noisy = region[0:5].to_owned() +
"T" +
region[6:12].to_owned() +
"G" +
region[13:].to_owned()
let results = @src.minimap_align_preset(
index,
noisy,
"ONT_READ_001",
@src.MapOnt,
)
for r in results {
println(
" \{r.query_name} -> \{r.ref_name}:\{r.ref_start}-\{r.ref_end} strand=\{r.strand} mapq=\{r.mapq} cigar=\{r.cigar}",
)
}
// 3. medaka-lite 变异检出
println("\n3. medaka-lite 变异检出 (ONT 错误模型)")
// 单一杂合 SNP 场景(简化共识模型不处理缺失下游的连锁错位)
let reads : Array[@src.MedakaRead] = []
for i = 0; i < 5; i = i + 1 {
let sliced = reference[0:40].to_owned()
let seq = if i < 3 {
// 杂合 SNP(位置 15: G -> A)
sliced[0:15].to_owned() + "A" + sliced[16:].to_owned()
} else {
sliced
}
reads.push({ name: "lr" + i.to_string(), seq, pos: 0, })
}
let variants = @src.medaka_call_variants("ctg1", reference, reads)
println(" " + @src.medaka_variants_summary(variants))
for v in variants {
println(
" \{v.chrom}:\{v.pos} \{v.ref_allele}>\{v.alt} GT=\{v.gt} DP=\{v.dp} AD=\{v.ad_ref},\{v.ad_alt} GQ=\{v.gq}",
)
}
// 4. HiFi 对照
println("\n4. HiFi 模型对照 (相同证据更高 GQ)")
let v_hifi = @src.medaka_call_variants(
"ctg1",
reference,
reads,
model=@src.Hifi,
)
for v in v_hifi {
println(
" \{v.chrom}:\{v.pos} \{v.ref_allele}>\{v.alt} GQ=\{v.gq} (ONT 时更低)",
)
}
// 5. VCF 输出
println("\n5. VCF 输出 (复用 gatk_write_vcf)")
let vcf_text = @src.gatk_write_vcf(
"ctg1",
reference,
variants,
sample="LONGREAD",
)
let lines = vcf_text.split("\n").to_array()
for l in lines {
let s = l.to_owned()
if s.has_prefix("ctg1") {
println(" " + s)
}
}
println(
"\n完成: 长读预设比对 -> 高错误率共识变异检出 -> VCF 全链路本地完成.",
)
}