Add sanitized Phase-0 research archive under docs/research
Research notes R1-R4, documentation-study files A-E (source of the functional spec's `src:` tags) and PGx coverage CSVs, rewritten to use neutral naming and current project decisions (plan §2).
This commit is contained in:
1 parent
180b6f160a
commit
91e97424c7
12 files changed
+7748
No files matched your search
@@ -0,0 +1,282 @@
|
||||
# SimurgArray — Phase 0 Research Report: can the reference array-analysis product be independently reimplemented?
|
||||
|
||||
Status: PHASE 0 (research only, no implementation code) · Research date: 2026-09-27 · Sanitized and brought into the
|
||||
repository afterwards (see `README.md` in this folder).
|
||||
Project: **SimurgArray**, a personal, non-commercial research toolkit. Canonical repository:
|
||||
https://gitea.yaylali.uk/kemal/SimurgArray. The roadmap and ground rules that came out of this study are in
|
||||
`SIMURGARRAY_MASTER_PLAN.md` (plan) and `SIMURGARRAY_FUNCTIONAL_SPEC.md` (spec).
|
||||
|
||||
Evidence base: `R1_reference_product.md` (product dossier), `R2_open_source_ecosystem.md` (GitHub ecosystem,
|
||||
source-level math with file:line refs), `R3_science_formats_algorithms.md` (formats + statistics), `R4_datasets.md`
|
||||
(public data), and the documentation walk-through files `A_cli_inputs.md` … `E_release_history.md`. Every claim below
|
||||
carries a tag; the URL / file:line sits in the referenced file section.
|
||||
|
||||
Tags: **[DOC]** public vendor documentation · **[LIT]** scientific literature/patents · **[OSS]** open-source
|
||||
implementation · **[OBS]** experimentally observed (none yet) · **[INF]** inferred · **[HYP]** hypothesis.
|
||||
|
||||
Naming: "the reference product" = the vendor's current Infinium array secondary-analysis software; `refcli` = its CLI
|
||||
binary; "ACLI" = the vendor's earlier array CLI (its predecessor); "the vendor cloud platform" = the vendor's hosted
|
||||
analysis and data platform.
|
||||
|
||||
---
|
||||
|
||||
## Executive verdict
|
||||
|
||||
| Question | Answer |
|
||||
|---|---|
|
||||
| Is a reference-compatible *genotyping* pipeline (IDAT → GTC → VCF + QC) feasible? | **Yes, with high confidence.** Formats are publicly specified [DOC/OSS]; the math of normalization, GenCall, BAF/LRR is reproduced in MIT-licensed open source that claims md5-identical GTCs vs ACLI [OSS: gtc2vcf]. The reference product itself does **not** cluster — it consumes Illumina EGT files [DOC]. |
|
||||
| Is numerical (bit-level) GTC compatibility achievable? | **Probably**, pending experiment. Whether the reference product's `genotype call` equals ACLI 2.1 output is **unverified [HYP]**. The practical target is the vendor-produced GTCs already published with 1000 Genomes (plan §16.2). |
|
||||
| Can PGx CNV / star alleles / cyto CNV-LOH be cloned? | **Not cloned — re-engineered as compatible alternatives.** Algorithms and `.dat` model formats are undocumented [DOC gap]. Output *schemas* are documented and can be matched; results can only be matched *semantically* (same calls), not numerically. |
|
||||
| Hardware acceleration? | The reference product is **CPU-only**, explicitly "no FPGA" [DOC]. Workload is I/O- and memory-bound linear algebra per sample; FPGA is **not justified** [INF]. GPU is optional only for large cohort re-clustering. |
|
||||
| Main risk | At study time: **legal/provenance**, not science — (1) the vendor EULA family forbids deriving "underlying ideas, algorithms" from the Software [DOC]; (2) the best open reference (gtc2vcf) states it ports Illumina's GenCall C# code [OSS]. **Resolved by the decisions below (plan §2):** no vendor binary is run or inspected, and MIT code is reused openly with attribution. |
|
||||
|
||||
---
|
||||
|
||||
## 1. What the reference product actually is
|
||||
|
||||
- The vendor's analysis suite for **Infinium BeadChip** data; CLI binary **`refcli`**, a self-contained **.NET 9**
|
||||
app for linux-x64 / win10-x64; no ARM build [DOC; INF from RIDs]. Recommended 8 cores / 32 GB RAM [DOC].
|
||||
- Lineage: AutoConvert → IAAP-CLI → ACLI (the vendor's earlier array CLI, retired 2024-12) → the reference product
|
||||
(v1.0 2023-12 … v1.4 2026-05) [DOC]. Stack traces in release notes show `ArrayAnalysis.Core.*` namespaces
|
||||
[DOC] ⇒ genotyping core is very likely inherited from ACLI [INF].
|
||||
- Deployed locally (free, offline except star-allele) and on the vendor cloud platform [DOC].
|
||||
- **Not** a clustering tool: custom EGT generation is still done in GenomeStudio [DOC].
|
||||
|
||||
## 2. Workflows
|
||||
|
||||
| Workflow | Command | Local? | Algorithm disclosed? |
|
||||
|---|---|---|---|
|
||||
| Control-probe QC | `qc call --array-type genotyping\|methylation` | yes | **Formulas fully tabulated** [DOC] |
|
||||
| QC report | `qc report` (HTML + xlsx/csv, thresholds callRate 0.98, logRDev 0.20) | yes | yes (thresholding) [DOC] |
|
||||
| Genotyping | `genotype call` (IDAT+BPM+EGT → GTC v5, cutoff 0.15) | yes | qualitatively [DOC]; quantitatively only via patents + OSS |
|
||||
| VCF export | `genotype gtc-to-vcf` (→ `*.snv.vcf.gz`, `GT:GS:BAF:LRR`) | yes | yes — mirrors Illumina/GTCtoVCF (Apache-2.0) [DOC/OSS] |
|
||||
| BedGraph | `genotype gtc-to-bedgraph` | yes | trivial |
|
||||
| PGx CN | `pgx copy-number train/call` (≥24 samples batch, `.dat` model, 7 genes/10 regions) | yes | **no** [DOC gap] |
|
||||
| PGx star alleles | `pgx star-allele call/annotate` (PharmVar/CPIC/DPWG) | yes, **paid, license-server** | **no** |
|
||||
| Cytogenetics CNV/LOH/mosaic | `cyto call/annotate` (`cyto_model.dat`, ISCN output) | yes | **no** (outputs suggest HMM/segmentation) [HYP] |
|
||||
| Methylation full QC (beta, M, detP) | cloud only | no | method named: Noob + nonlinear dye bias + negative-control detP [DOC] |
|
||||
| Final Report / Locus Summary | cloud only | no | columns documented [DOC] |
|
||||
|
||||
## 3. Inputs consumed [DOC]
|
||||
|
||||
IDAT pairs (`Barcode_RxxCxx_Grn/Red.idat`), BPM manifest, CSV manifest (SourceSeq, RefStrand), EGT cluster file,
|
||||
genome FASTA (+fai, contigs `1` not `chr1`), sample sheet (GenomeStudio-compatible), PGx CN model `.dat` + `.msk`,
|
||||
cyto model `.dat`, PGx database `.zip`, cyto annotation `.zip`, QC YAML.
|
||||
|
||||
## 4. Outputs produced [DOC]
|
||||
|
||||
Per sample: GTC v5; `*.snv.vcf.gz`+`.tbi` (VCFv4.1, FILTER always PASS, ploidy-adjusted GT, **BAF/LRR oriented to
|
||||
REF=A/ALT=B → may be 1−GenomeStudio BAF**); LRR/BAF bedgraphs; PGx `*.cnv.vcf.gz` (`CN:NR`, CN≤5, QUAL≤60);
|
||||
cyto `*.cnv.vcf.gz` (+ JSON ISCN annotation); star-allele JSON.
|
||||
Per batch: `gt_sample_summary.csv/json` (Autosomal Call Rate, Call Rate, LogRDev, Sex Estimate, TGA control),
|
||||
`controls.raw_metrics.csv`, `controls.qc_metrics.csv`, QC HTML/xlsx, `cn_batch_summary.csv`, five PGx CSVs.
|
||||
|
||||
## 5. What is publicly documented (sufficient to implement)
|
||||
|
||||
| Area | Source |
|
||||
|---|---|
|
||||
| IDAT v3 binary layout (field codes, TOC) | illuminaio/BeadArrayFiles/gtc2vcf docs & code [OSS] |
|
||||
| BPM, EGT, GTC v3–v5 layouts, incl. 52-byte normalization transform record | BeadArrayFiles + `GTC_File_Format_v5.pdf` [DOC/OSS] |
|
||||
| Application of normalization: offset→rotate→shear→scale→clamp; θ=(2/π)atan2(y,x), R=x+y | BeadArrayFiles `GenotypeCalls.py` [DOC/OSS] |
|
||||
| Normalization bins `(norm_id + 100·assay_type) mod 256` | BeadArrayFiles `BeadPoolManifest.py:118-130` [OSS] |
|
||||
| BAF / LRR from cluster centres (piecewise-linear), LRR=log2(R/R_exp) | Peiffer 2006 Genome Res [LIT] |
|
||||
| TOP/BOT, PLUS/MINUS, indel `[I/D]` strand rules | Illumina strand tech note [DOC] |
|
||||
| GenCall cutoff 0.15, GC10/GC50 definitions | tech notes [DOC] |
|
||||
| Control-probe QC formulas (all ratios, offset 3000) | reference-product output docs `[ref-docs:output-files]` [DOC] |
|
||||
| VCF conversion incl. multi-allelic merging, indel resolution | Illumina/GTCtoVCF + reference-product docs [DOC/OSS] |
|
||||
| Normalization fit & GenTrain concepts | expired patents US7035740 (2024-05), US7467117 (2024-03); GenTrain 2/3 tech notes [LIT/DOC] |
|
||||
| cnvPartition model | Illumina CNV tech note [DOC] |
|
||||
|
||||
## 6. Implementable from published science (independent of vendor code)
|
||||
|
||||
Normalization fitting (patent + Teo 2007 description of the 400-homozygote approach) · Bayesian genotype
|
||||
calling in θ/R given EGT · BAF/LRR/LogRDev · sex inference (X het + Y intensity) · CNV/LOH/mosaic
|
||||
(PennCNV HMM [public domain], MoChA [MIT], cnvPartition tech note) · contamination (BAFregress, VerifyIDintensity
|
||||
model) · relatedness (KING-robust math) · methylation Noob/dye-bias/detP (Triche 2013, sesame) · star-allele
|
||||
matching (PharmCAT/PyPGx logic) · **own** cluster training (GMM / t-mixture à la Illuminus/CRLMM).
|
||||
|
||||
## 7. Behaviours that cannot be read from documentation
|
||||
|
||||
At study time these were listed as "requires black-box characterization of the vendor binary". Per decision D2
|
||||
below, the vendor binary is **not** run; each item is instead resolved from published vendor-produced GTCs, open
|
||||
oracles and synthetic experiments, or recorded as a known unknown in `docs/known_unknowns.md`.
|
||||
|
||||
1. Is the reference product's `genotype call` GTC ≡ ACLI GTC (md5 with timestamps masked)? — *not testable without
|
||||
the binary; bit-exact target is the published vendor-produced GTCs instead.*
|
||||
2. Exact GenCall score mapping & edge cases (low bead counts, zero intensities, Omni5 normID overflow).
|
||||
3. **Sex Estimate**, **Autosomal Call Rate** locus set, **LogRDev** locus set/trimming.
|
||||
4. VCF details: REF/ALT choice for indels, ploidy rules on X/Y/MT, `GS` Phred scaling, BAF orientation flip.
|
||||
5. PGx CN: CN calls vs regions, NR distribution, QUAL calibration (targets for our *own* model).
|
||||
6. Cyto CNV/LOH: event boundaries, MF estimates, filters (targets for our own caller).
|
||||
7. Star alleles: diplotype/score behaviour on known samples.
|
||||
|
||||
## 8. Hardware-specific parts
|
||||
|
||||
None. CPU-only by vendor statement [DOC]. The product *brand* is FPGA-associated for NGS, but the array product is not
|
||||
[DOC]. ⇒ No FPGA work in scope; revisit only if profiling shows a hotspot (unlikely: per-sample work is
|
||||
~O(#probes) ≈ 1–5 M floats).
|
||||
|
||||
## 9. Open-source projects (see R2 table for ~45 entries)
|
||||
|
||||
| Project | License | Role in SimurgArray |
|
||||
|---|---|---|
|
||||
| Illumina/BeadArrayFiles | BSD-2 | format spec + oracle (GTC/BPM/EGT readers); may be ported with attribution |
|
||||
| Illumina/GTCtoVCF | Apache-2.0 (archived) | VCF conversion reference + oracle; may be ported with attribution |
|
||||
| freeseek/gtc2vcf (idat2gtc, gtc2vcf, BAFregress) | MIT | **test oracle** and algorithm reference; may be ported with attribution |
|
||||
| broadinstitute/picard `picard.arrays` | MIT | second independent format reader; QC metric definitions (WARP) |
|
||||
| freeseek/mocha | MIT | mosaic CNV reference |
|
||||
| WGLab/PennCNV | Unlicense | CNV HMM; PFB/GC model |
|
||||
| PharmGKB/PharmCAT | MPL-2.0 | star-allele oracle (subprocess) |
|
||||
| sbslee/pypgx | MIT | array-VCF star allele reference |
|
||||
| bcftools | MIT | VCF I/O oracle, `+fixref` |
|
||||
| plink2, verifyIDintensity, GenotypeHarmonizer, illuminaio | GPL | **subprocess oracles only, never linked or copied** |
|
||||
| zCall, argyle, Aldy, Cyrius | none / NC / PolyForm | **excluded** (ideas from their papers only) |
|
||||
|
||||
Gap: **no open-source GenTrain / EGT writer exists** [OSS survey].
|
||||
|
||||
## 10. Realistically cloneable (target: numerical compatibility)
|
||||
|
||||
IDAT/BPM/EGT/CSV readers · GTC v5 writer · normalization · GenCall calling+score · BAF/LRR/LogRDev · sex estimate ·
|
||||
call rates · control-probe QC · GTC→VCF · bedgraph · `gt_sample_summary` · QC report table.
|
||||
|
||||
## 11. Implement as compatible alternatives (target: semantic compatibility, same output schema)
|
||||
|
||||
Cluster-file generation (own "ArrayTrain", explicitly *not* GenTrain) · PGx CNV (own GC-corrected batch model) ·
|
||||
star alleles (PharmVar-based solver, PharmCAT/PyPGx as oracles) · cyto CNV/LOH/mosaic (HMM on LRR+BAF) ·
|
||||
methylation QC (Noob etc.) · contamination/relatedness (not in the reference product; value-add).
|
||||
|
||||
## 12. Proposed architecture (as sketched in Phase 0; the binding layout is plan §4)
|
||||
|
||||
```
|
||||
simurg/
|
||||
core/ canonical data model (Arrow schemas: Probe, Locus, SampleIntensity, Call, Provenance)
|
||||
formats/ idat/ bpm/ csv_manifest/ egt/ gtc/ samplesheet/ vcf/ plink/ bedgraph/
|
||||
signal/ raw_xy (probe→locus assembly, bead-count rules), normalization/ (fit, apply), polar
|
||||
genotype/ gencall/ (EGT-based caller), train/ (ArrayTrain: own clustering), rescue/ (optional)
|
||||
cn/ baf_lrr/, gc_wave/, cyto_hmm/, pgx_cn/
|
||||
pgx/ star_allele/ (PharmVar db builder, solver), annotate/
|
||||
qc/ controls/, sample/ (call rate, LogRDev, sex), contamination/, relatedness/, report/
|
||||
harmonize/ strand (TOP/BOT/PLUS), REF/ALT, build liftover hooks, audit log of every flip
|
||||
pipeline/ DAG runner, resumable, per-step provenance (hashes, versions, params, seed)
|
||||
cli/ `simurg qc|genotype|gtc-to-vcf|cn|cyto|pgx|pipeline` (reference-like verbs)
|
||||
compat/ reference-CLI option aliases + output-name compatibility layer
|
||||
difftest/ oracle adapters (published vendor GTCs, gtc2vcf, BeadArrayFiles, GTCtoVCF, PennCNV, PharmCAT)
|
||||
synth/ synthetic IDAT/intensity generator (ground-truth genotypes, CN, contamination, dye bias)
|
||||
bench/ tests/ docs/
|
||||
```
|
||||
Principles: science modules are pure functions over Arrow/NumPy arrays; no I/O inside algorithms; every
|
||||
transform returns data **plus** an audit record. Reference implementation in Python (NumPy/SciPy, pyarrow,
|
||||
pysam/cyvcf2); performance tier later in **Rust** (PyO3) for IDAT parsing + normalization + calling — the
|
||||
hot, embarrassingly-parallel per-sample path.
|
||||
|
||||
## 13. Phased plan (as proposed in Phase 0; the binding roadmap and gates are plan §18)
|
||||
|
||||
| Phase | Deliverable | Exit gate (measurable) |
|
||||
|---|---|---|
|
||||
| **0 Research** (this) | research docs, decisions D1–D3, dataset fetch scripts | decisions taken (below); datasets checksummed |
|
||||
| **1 Parsers** | IDAT, BPM, EGT, CSV, GTC read/write, sample sheet | 100% field equality vs BeadArrayFiles + illuminaio on ≥254-series GEO sweep + Omni2141; GTC round-trip byte-identical |
|
||||
| **2 Canonical model** | Arrow schemas, locus assembly (Inf I/II, bead count ≥2 rule) | raw X/Y identical to GTC RAW_X/RAW_Y (TOC 1000/1001) for 1000G Broad GTCs |
|
||||
| **3 Normalization** | fit + apply per bin | 13-float transforms vs Illumina GTC TOC 400: |Δ| ≤1e-5 rel on ≥99.9% bins; normalized X/Y match |
|
||||
| **4 Genotyping (EGT-based)** | GenCall-compatible caller + score, BAF/LRR, sex | vs Illumina GTCs: genotype concordance ≥99.99%, GC score |Δ|≤1e-4 |
|
||||
| **4b ArrayTrain** | own clustering → EGT | vs Illumina EGT calls on Omni2141: ≥99.5% concordance; vs 30x WGS non-ref discordance ≤ GenCall's |
|
||||
| **5 QC** | controls, sample summary, QC report | control metrics equal the documented formulas; Sex Estimate 100% on 1000G known sex |
|
||||
| **6 Outputs** | VCF (reference-compatible layout), PLINK, bedgraph, JSON/CSV summaries | `bcftools` field-level diff vs gtc2vcf/GTCtoVCF: 0 unexplained discrepancies |
|
||||
| **7 Differential testing** | automated EXACT/NEAR/DISCREPANCY/UNKNOWN dashboard | nightly on demo + Omni subsets |
|
||||
| **8 Validation** | science validation vs WGS truth, trios, replicates | concordance, Mendelian error, reproducibility reported |
|
||||
| **8b CN/Cyto/PGx** | own CN HMM, PGx CN, star alleles | CNV vs the vendor's public 1000 Genomes WGS reanalysis (AWS Open Data) & PennCNV; CYP2D6 CN vs WGS truth; star alleles vs PharmCAT-on-WGS |
|
||||
| **9 Optimization** | Rust core, mmap, multithreading | throughput at least on par with the vendor's documented figure (35 s/sample VCF claim) on a comparable x86 box |
|
||||
| **10 Packaging** | conda/pip/Docker, docs, CI | reproducible builds, provenance manifest per run |
|
||||
|
||||
## 14. Validation strategy
|
||||
|
||||
Three independent axes, never conflated:
|
||||
1. **Format compatibility** — parses/writes files other tools accept (BeadArrayFiles, bcftools, plink2).
|
||||
2. **Numerical compatibility** — field-level diff vs oracles with explicit tolerances (float32 ULP-aware).
|
||||
Oracles: (a) Illumina GTCs **already published** in the 1000G Broad set (the vendor ground truth, no licensed
|
||||
binary needed), (b) GenomeStudio FinalReport in the 1000G Sanger set, (c) gtc2vcf (MIT), (d) BeadArrayFiles /
|
||||
GTCtoVCF / Picard. Outputs of the reference product's binary are **not** an oracle (decision D2).
|
||||
3. **Scientific validity** — vs truth independent of the vendor: NYGC 30x / GIAB v4.2.1 (concordance, NRD,
|
||||
sensitivity/precision per genotype class & MAF bin), 337 Omni trios + GDA-demo trios (Mendelian error),
|
||||
GSE165845 triplicates (reproducibility), the vendor's public 1000 Genomes WGS reanalysis (AWS Open Data) + GIAB SV
|
||||
(CNV), synthetic data (exact truth).
|
||||
Reporting: EXACT / NEAR (within tolerance) / DISCREPANCY / UNKNOWN per field, per locus class (Inf I/II,
|
||||
indel, X/Y/MT, PAR, low-intensity).
|
||||
|
||||
## 15. Datasets required (all verified public, see R4)
|
||||
|
||||
| Priority | Dataset | Use |
|
||||
|---|---|---|
|
||||
| P0 | GDA v1 Demo 36 (465 MB; 3 CEU trios + replicates, incl. NA12878) | smallest end-to-end fixture |
|
||||
| P0 | GSA v4 ePGx Demo 36 (872 MB) + BPM/CSV/EGT + CN/cyto models | primary reference-compatibility target (inputs and documented schemas) |
|
||||
| P0 | Bioconductor IlluminaDataTestFiles, hapmap370k (Artistic-2.0) | only fixtures we may vendor in CI |
|
||||
| P1 | 1000G Broad Omni2.5 IDAT+**GTC** 2,141 samples (107 GB) + BPM/EGT/CSV | GenCall oracle w/o licensed software; trios; clustering training |
|
||||
| P1 | 1000G Sanger Omni2.5-8 (6.2 GB) + GenomeStudio FinalReport | GenomeStudio-output oracle |
|
||||
| P1 | GEO GSE165845 GSA 120×3 (45 GB) | reproducibility, GSA-class concordance |
|
||||
| P1 | NYGC 30x 1kGP VCFs, GIAB v4.2.1, the vendor's public 1000 Genomes WGS reanalysis (AWS Open Data) (CNV/PGx) | truth |
|
||||
| P2 | GSE96909 (NA12878 on 9 designs), GDA ePGx 480, OneK1K GSA 1,104, 254 GEO series | cross-design, scale, parser fuzzing |
|
||||
|
||||
Vendor product files/demo data: **fetch-with-checksum script only, never committed or redistributed** (site terms;
|
||||
plan §2 rule 4).
|
||||
|
||||
## 16. Experiments (each: input / variable / observable / confidence)
|
||||
|
||||
Experiments that needed the vendor binary (original E1 "GTC md5 of `refcli` vs ACLI vs gtc2vcf", and the `refcli`
|
||||
side of E4–E8, E11) are **dropped** under decision D2. The rest run against published vendor-produced GTCs, open
|
||||
oracles and synthetic data:
|
||||
|
||||
E1 *(dropped: required the vendor binary)* — replaced by E2 against published GTCs.
|
||||
E2 Normalization transform per bin: SimurgArray vs Illumina GTC (1000G Broad) — tolerance study.
|
||||
E3 Synthetic single-SNP perturbation in IDAT (shift X/Y, bead count 0/1/2, NaN, extreme) → call/score response of
|
||||
SimurgArray vs gtc2vcf.
|
||||
E4 Subset-of-samples invariance: is genotype calling strictly per-sample? (expect yes [INF]; check on published GTCs.)
|
||||
E5 Sex Estimate decision boundary: sweep X-het and Y-R in synthetic IDATs (our definition; documented thresholds).
|
||||
E6 LogRDev / Autosomal call-rate locus sets: remove chromosomes/loci classes, compare with published GTC metrics.
|
||||
E7 VCF: indel REF/ALT, duplicates, MAV merging, `--use-infI-nc-info`, ploidy on X/Y/MT/PAR — vs GTCtoVCF/gtc2vcf and
|
||||
the documented reference behaviour.
|
||||
E8 PGx CN: batch-size and batch-composition sensitivity (24→500), GC-correction on/off — our own model.
|
||||
E9 Cyto: spiked-in synthetic LRR/BAF events (size, mosaic fraction 5–100%, LOH) → detection curves.
|
||||
E10 Star alleles: known 1000G samples with WGS-derived truth (PharmCAT-on-WGS as reference).
|
||||
E11 Determinism: repeat runs, thread counts, OS/architecture (x86-64 vs aarch64) for SimurgArray itself (the vendor
|
||||
reports tiny cross-platform PGx differences [DOC]).
|
||||
|
||||
## 17. Known unknowns (tracked in `docs/known_unknowns.md`)
|
||||
|
||||
U1 reference-product GTC ≡ ACLI GTC? (not testable under D2) · U2 GenCall score mapping details beyond OSS ·
|
||||
U3 Sex Estimate algorithm · U4 LogRDev/Autosomal CR locus set · U5 PGx CN algorithm & `.dat` format · U6 cyto
|
||||
caller & `.dat` format · U7 star-allele scoring/solver · U8 GenTrain internals (NN cluster imputation, scoring
|
||||
weights, 14–15 unused EGT floats) · U9 GTC PDF says Raw X = green vs OSS red — test · U10 IDAT MidBlock int32 vs
|
||||
uint8 · U11 EGT intensity-threshold version gate (≥7 vs 9) · U12 reference-product EULA text (not public; moot under
|
||||
D2).
|
||||
|
||||
## 18. Risk register (updated to the decisions taken)
|
||||
|
||||
| # | Risk | L | I | Mitigation / status |
|
||||
|---|---|---|---|---|
|
||||
| R1 | EULA prohibits deriving algorithms from the vendor binary | — | — | **Closed by D2**: the vendor binary is never run, benchmarked, inspected or decompiled; oracles are published vendor-produced GTCs |
|
||||
| R2 | Provenance: gtc2vcf ports Illumina GenCall C# code | L | M | **D1**: MIT code may be ported with attribution in `THIRD_PARTY_NOTICES.md`; no strict clean room is required for a personal research project |
|
||||
| R3 | Research notes (R2) contain gtc2vcf-derived details | L | L | **Closed by D1**: allowed; cite sources (plan §7 tags) |
|
||||
| R4 | GenTrain can't be matched ⇒ dependence on Illumina EGT files (non-redistributable) | H | M | ArrayTrain own clusters; user supplies EGT; fetch script |
|
||||
| R5 | Illumina manifest/EGT/demo licensing (non-commercial, no redistribution) | H | M | never commit; checksum fetcher; CI on Artistic-2.0 fixtures + synthetic data |
|
||||
| R6 | PGx/cyto calls diverge from the reference product | H | M | "compatible schema, independently validated"; publish concordance vs truth, never claim equivalence |
|
||||
| R7 | Encrypted v1 IDATs (DES, only GPL illuminaio reads them) | L | L | out of scope; detect and error clearly |
|
||||
| R8 | Floating-point non-determinism across platforms/threads | M | M | deterministic reductions, fixed ordering, float32/64 policy per field, ULP tolerances |
|
||||
| R9 | Trademark misuse | M | M | project named SimurgArray; docs refer to Illumina *file formats* only and use no vendor product brand (plan §2 rule 5) |
|
||||
| R10 | Scale (100k samples) memory | M | M | per-sample streaming; only clustering needs cohort-wide data (column-chunked Arrow) |
|
||||
| R11 | Vendor binary needs x86-64; dev box is aarch64 | — | — | **Moot under D2** (the binary is not used) |
|
||||
|
||||
## Decisions taken (see plan §2)
|
||||
|
||||
- **D1 — Provenance policy: taken.** SimurgArray is a personal, non-commercial research project. MIT / BSD /
|
||||
Apache-2.0 / Unlicense code (gtc2vcf/idat2gtc/BAFregress, mocha, BeadArrayFiles, GTCtoVCF, Picard `picard.arrays`,
|
||||
PennCNV, PyPGx, bcftools) **may be ported or vendored with attribution** in `THIRD_PARTY_NOTICES.md`. GPL tools
|
||||
(plink2, illuminaio, verifyIDintensity, GenotypeHarmonizer, akt) are **external subprocess oracles only**, never
|
||||
copied or linked. Code with no licence or non-commercial/PolyForm terms (zCall, argyle, Aldy, Cyrius, Stargazer,
|
||||
QuantiSNP binaries) is not used; ideas from their papers are fine. The Phase-0 "Path B strict clean room" option
|
||||
is not needed.
|
||||
- **D2 — Black-box access: taken.** Black-box runs of the vendor binary are **not part of the plan**, and vendor
|
||||
software is never decompiled, disassembled or inspected, nor licence checks bypassed. Oracles are the **published
|
||||
vendor-produced GTCs** (1000 Genomes Omni2.5 Broad set; GenomeStudio FinalReport in the Sanger set),
|
||||
**gtc2vcf** and **BeadArrayFiles** (plus GTCtoVCF/Picard for formats). Reference-product behaviour is taken only
|
||||
from its public documentation (files A–E); what cannot be settled that way is logged as a known unknown.
|
||||
- **D3 — Scope of v1.0: taken.** Genotyping + QC + VCF/PLINK first (plan phases P0–P8, then v1.0); ArrayTrain,
|
||||
CN/LOH/mosaic, PGx and methylation control QC are v2 modules (plan §18).
|
||||
Reference in new issue
Block a user