///|
/// SV 长读长检测演示.
///
/// 展示基于 minimap 比对的 SV 检出流程:
/// 1. 解析 CIGAR 字符串
/// 2. 从 CIGAR 提取 SV 候选(DEL/INS)
/// 3. 合并相同位置的 SV
/// 4. 输出检测结果
///|
/// 主函数: 演示 SV 检测流程.
fn main {
println("=== SV 长读长检测演示 ===")
// 示例 CIGAR 字符串: 10M50D20M 表示 10bp 匹配, 50bp 缺失, 20bp 匹配
let cigar_str = "10M50D20M"
println("\nCIGAR 字符串: " + cigar_str)
let cigar = @src.parse_cigar(cigar_str)
println("解析结果: " + cigar.length().to_string() + " 个 CIGAR 元素")
// 检测 SV
let params = @src.SvParams::default()
println(
"\n检测参数: min_support=" +
params.min_support.to_string() +
", min_sv_len=" +
params.min_sv_len.to_string(),
)
let calls = @src.sv_candidates_from_sam("chr1", 100, cigar, params)
println("\n检测到的 SV 候选数: " + calls.length().to_string())
for c in calls {
println(
" - " +
@src.sv_type_label(c.sv_type()) +
" at chr1:" +
c.start().to_string() +
"-" +
c.end().to_string() +
" (support=" +
c.support_reads().to_string() +
")",
)
}
// 插入检测示例
let ins_cigar = @src.parse_cigar("10M100I20M")
println("\n插入检测示例: 10M100I20M")
let ins_calls = @src.sv_candidates_from_sam("chr1", 100, ins_cigar, params)
for c in ins_calls {
println(
" - " +
@src.sv_type_label(c.sv_type()) +
" at chr1:" +
c.start().to_string() +
" (support=" +
c.support_reads().to_string() +
")",
)
}
// 合并示例
println("\n合并相同位置 SV 示例:")
let all_calls : Array[@src.SvCall] = []
for c in calls {
all_calls.push(c)
}
for c in calls {
all_calls.push(c)
}
let merged = @src.merge_sv_candidates(all_calls)
println(" 合并前: " + all_calls.length().to_string() + " 个候选")
println(" 合并后: " + merged.length().to_string() + " 个候选")
if merged.length() > 0 {
println(" 支持读数: " + merged[0].support_reads().to_string())
}
// SA tag 检出 DUP/INV/BND
println("\nSA tag 检出 DUP/INV/BND:")
let sa_cases : Array[(String, String, Int32)] = [
("倒位 INV", "chr1,100,-,50M,60,0;", 300),
("串联重复 DUP", "chr1,50,+,50M,60,0;", 300),
("易位 BND", "chr2,100,+,50M,60,0;", 300),
]
for case in sa_cases {
let (label, sa_tag, read_pos) = case
let sa_calls = @src.sv_candidates_from_sa(
"chr1", read_pos, 0, sa_tag, params,
)
for c in sa_calls {
println(
" - " +
label +
": " +
@src.sv_type_label(c.sv_type()) +
" at chr1:" +
c.start().to_string() +
"-" +
c.end().to_string(),
)
}
}
println("\n演示完成")
}