///|
/// 读段模拟器演示: 参考序列 -> 双端 FASTQ.
fn main raise {
println(
"=== 本地读段模拟器 (参考 -> 双端 FASTQ, wgsim 风格) ===",
)
// 构造 300bp 模拟参考.
let sb = StringBuilder()
for i = 0; i < 300; i = i + 1 {
sb.write_char(['A', 'C', 'G', 'T'][(i * 5 + 1) % 4])
}
let reference = sb.to_string()
let config = @src.read_simulator_config(
read_length=100,
coverage=20.0,
paired_end=true,
insert_mean=250,
insert_sd=30,
error_rate=0.005,
quality_max=40,
quality_min=2,
quality_decay=12.0,
snp_rate=0.005,
indel_rate=0.001,
adapter="AGATCGGAAGAG",
adapter_rate=0.0,
seed=2026UL,
)
let result = @src.simulate_reads(reference, config~)
println(
"\n参考长度: \{reference.length()}bp, 目标覆盖度: \{config.coverage}x",
)
println("生成 pairs = \{result.n_pairs}, reads = \{result.n_reads}")
println("实际覆盖度 = \{result.achieved_coverage}x")
println(
"注入变异事件 = \{result.n_variants}, 碱基错误 = \{result.n_errors}",
)
println("\nFASTQ 前 2 条记录:")
let lines = result.fastq.split("\n").to_array()
for i = 0; i < 8 && i < lines.length(); i = i + 1 {
println(" \{lines[i].to_owned()}")
}
println("\n完成: 读段模拟全程本地完成, 数据不出本机.")
}