///|
/// Bioconductor SeqArray Demo - GDS-style variant data container.
///
/// Demonstrates the port of the Bioconductor `SeqArray` package
/// (Zheng et al.): VCF import via seqVCF2GDS, the hierarchical GDS
/// node tree, sample/variant filters (seqSetFilter semantics) and
/// dosage / allele-frequency / missing-rate summaries.
///|
/// A small multi-sample VCF with a haploid call, a multi-allelic site
/// and a missing genotype.
fn demo_vcf() -> String {
"##fileformat=VCFv4.2\n" +
"#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tS1\tS2\tS3\n" +
"1\t100\trs1\tA\tG\t.\tPASS\t.\tGT\t0/0\t0/1\t1/1\n" +
"1\t200\t.\tC\tA,T\t.\tPASS\t.\tGT\t0/1\t./.\t2/2\n" +
"2\t150\trs3\tG\tC\t.\tPASS\t.\tGT\t1\t0/0\t0|1\n" +
"2\t300\trs4\tT\tA\t.\tPASS\t.\tGT\t0/1\t1/1\t0/0\n"
}
///|
fn mean(values : Array[Double]) -> Double {
let mut total = 0.0
for v in values {
total = total + v
}
total / values.length().to_double()
}
///|
fn mean_int(values : Array[Int32]) -> Double {
let mut total = 0
for v in values {
total = total + v
}
total.to_double() / values.length().to_double()
}
///|
fn main raise {
println("=== SeqArray: VCF -> GDS import (seqVCF2GDS) ===")
let vcf = @src.parse_vcf(demo_vcf())
let data = @src.seq_vcf2gds(vcf)
println("samples : \{Repr(data.sample_ids())}")
println("variants : \{Repr(data.variant_ids())}")
println("chroms : \{Repr(data.chromosomes())}")
println("positions: \{Repr(data.positions())}")
println("alleles : \{Repr(data.alleles())}")
println("\n=== GDS node tree ===")
let file = @src.gds_file_new()
let _ = file.add_node(
"",
@src.GdsNode::leaf(
"sample.id",
"sample identifiers",
@src.GdsValue::GdsStringArray(["S1", "S2", "S3"]),
),
)
let _ = file.add_node(
"annotation/info/DP",
@src.GdsNode::leaf(
"DP",
"read depth",
@src.GdsValue::GdsIntArray([10, 20, 30]),
),
)
println("has annotation/info/DP : \{file.has_node("annotation/info/DP")}")
println("has sample.id : \{file.has_node("sample.id")}")
println("has annotation/missing : \{file.has_node("annotation/missing")}")
println("\n=== Genotype dosages (filtered view) ===")
let dosages = data.genotype_dosages()
for v in 0..