///|
/// GWAS 可视化演示: Manhattan/QQ/λGC + 内嵌 SVG.
fn main {
println("=== GWAS 可视化数据层 (Manhattan / QQ / λGC) ===")
// 模拟 GWAS 摘要统计: 3 染色体 x 300 null 位点 + 3 显著位点
let markers : Array[@src.GwasMarker] = []
for c = 1; c <= 3; c = c + 1 {
for i = 0; i < 100; i = i + 1 {
let u = ((i * 37 + c * 101) % 100).to_double() / 100.0
let p = if u <= 0.0 { 0.01 } else { u }
markers.push({ chrom: "chr" + c.to_string(), pos: i * 1000, p_value: p, })
}
}
markers.push({ chrom: "chr2", pos: 50000, p_value: 5.0e-9, })
markers.push({ chrom: "chr1", pos: 3000, p_value: 1.0e-10, })
markers.push({ chrom: "chr3", pos: 80000, p_value: 2.0e-7, })
println("位 点 数: \{markers.length()} (303 null + 3 hit)")
// 1. Manhattan 数据
println("\n1. Manhattan 图数据")
let manhattan = @src.gwas_manhattan(markers)
println(" 数据点: \{manhattan.points.length()}")
println(" 染色体边界: \{manhattan.chrom_boundaries.length()} 条")
for b in manhattan.chrom_boundaries {
println(" chr\{b.0}: x ∈ [\{b.1}, \{b.2}]")
}
println(" y_max: \{manhattan.y_max}")
println(
" 全基因组显著线: -log10(5e-8) = \{manhattan.genome_wide_line}",
)
println(" suggestive 线: -log10(1e-6) = \{manhattan.suggestive_line}")
println(" 显著标签: \{manhattan.labels.length()} 条")
for l in manhattan.labels {
println(" \{l.0}:\{l.1.to_string()} (-log10 p = \{l.2})")
}
// 2. λGC
println("\n2. λGC 基因组膨胀因子")
let lambda = @src.gwas_lambda_gc(markers)
println(" λGC = \{lambda}")
println(" 解读: \{@src.gwas_lambda_interpretation(lambda)}")
// 3. QQ 数据
println("\n3. QQ plot 数据")
let qq = @src.gwas_qq(markers)
println(" 配对点: \{qq.points.length()}")
println(" λGC(内嵌): \{qq.lambda_gc}")
println(" 前 3 点(expected -> observed):")
for i = 0; i < 3; i = i + 1 {
let p = qq.points[i]
println(" \{p.expected} -> \{p.observed} (带 [\{p.lower}, \{p.upper}])")
}
// 4. SVG 输出
println("\n4. SVG 渲染(独立可打开的 .svg 文本)")
let svg_m = @src.gwas_manhattan_svg(manhattan)
let svg_q = @src.gwas_qq_svg(qq)
println(" Manhattan SVG: \{svg_m.length()} 字符")
println(" QQ SVG: \{svg_q.length()} 字符")
println(" Manhattan 含散点: \{svg_m.contains("