Files
SimurgArray/docs/validation/P2.md
T
kemal 85229fba84 P2 validated on 2141 vendor GTCs (1000 Genomes Omni2.5)
Raw X/Y and controls assembled from IDATs equal the vendor GTC arrays for
2138/2141 samples x 2.45M loci; 3 single-locus differences are recorded
as K-009 (probable per-channel missing rule in AutoCall 1.6.2.2). Channel
order X=Red confirmed (U1). `simurg ingest` processed all 2141 samples in
19 min (I/O-bound). AWS run cost ~$0.34 and left no resources.
2026-09-27 22:19:28 +01:00

2.3 KiB
Raw Permalink Blame History

Phase P2 validation report — canonical model and raw X/Y assembly

Date: 2026-09-27. Local work on the Pi; large run on a self-destructing AWS spot instance (run-20260927T195800Z, m7g.4xlarge, 77 min, ≈ $0.34). Summary: P2_omni2141_summary.json.

Delivered

Item Module
Raw X/Y + control assembly (plan §7.1), per-chip address-map cache signal/raw_xy.py
IDAT ↔ manifest address-coverage gate (IN-027) signal/raw_xy.py
Canonical Arrow schemas, deterministic Parquet (plan §5) core/schemas.py
simurg ingest (discovery, sheet, naming, overwrite/resume, workers, run manifest) pipeline/ingest.py, cli/main.py

Acceptance (plan §18 P2: raw X/Y exactly equal to vendor GTC TOC 1000/1001, 100 % loci × ≥ 50 samples)

Check Data Result
Raw X/Y and controls vs oracle GTCs 18 GSA v4 samples (gtc2vcf GTCs) EXACT, 18/18
Raw X/Y vs vendor GTCs (AutoCall 1.6.2.2) 2141 Omni2.5 samples × 2 450 000 loci 2138/2141 samples EXACT; 3 loci in 3 samples differ (below)
Controls vs vendor GTCs 2141 samples EXACT
Channel assignment (plan U1): X = Red, Y = Grn for Infinium II 5.2 × 10⁹ locus values confirmed (0 swapped loci)
ingest outputs identical across thread counts and layouts synthetic + GSA byte-identical

The gate "100 % loci × ≥ 50 samples" is met (2138 samples fully exact). The 3 remaining differences are one locus each in samples 5767788121_R01C01, 5826354152_R02C01 and 6268201099_R02C01. In each, we mark the locus missing (0, 0) but the vendor kept one channel (e.g. rs178512: vendor [7086, 0]). Hypothesis K-009: this AutoCall version zeroes each channel independently when that channel's bead count is < 2, while the modern rule (gtc2vcf, emulating current vendor software) zeroes both. Not yet confirmed (needs the bead counts of those three IDATs).

simurg ingest at scale (2141 Omni2.5 samples, 16 workers)

Metric Value
Wall time 18 min 52 s (0.53 s/sample)
CPU utilisation 397 % of 1600 % — I/O-bound: ~120 GB of IDATs read through a gp3 volume at its 125 MB/s baseline
Peak RSS (main process) 2.4 GB
Output 19 GB (≈ 9 MB/sample)
Status 2141 OK; 285 × W_IDAT_LOW_ADDRESS_COVERAGE (0.03 % of addresses absent), 4 × W_IDAT_NO_SCAN_TIME