From 91e97424c7eaa2bf35842f2c36a301366785bc12 Mon Sep 17 00:00:00 2001 From: Kemal Yaylali Date: Sun, 27 Sep 2026 16:27:34 +0100 Subject: [PATCH] Add sanitized Phase-0 research archive under docs/research MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- docs/research/00_phase0_report.md | 282 ++ docs/research/A_cli_inputs.md | 814 ++++++ docs/research/B_outputs.md | 536 ++++ docs/research/C_qc_report_features.md | 584 ++++ docs/research/D_cyto_methyl_pgx.md | 433 +++ docs/research/E_release_history.md | 736 +++++ docs/research/R1_reference_product.md | 648 +++++ docs/research/R2_open_source_ecosystem.md | 446 +++ .../research/R3_science_formats_algorithms.md | 608 +++++ docs/research/R4_datasets.md | 161 ++ docs/research/README.md | 94 + docs/research/pgx_star_allele_coverage.csv | 2406 +++++++++++++++++ 12 files changed, 7748 insertions(+) create mode 100644 docs/research/00_phase0_report.md create mode 100644 docs/research/A_cli_inputs.md create mode 100644 docs/research/B_outputs.md create mode 100644 docs/research/C_qc_report_features.md create mode 100644 docs/research/D_cyto_methyl_pgx.md create mode 100644 docs/research/E_release_history.md create mode 100644 docs/research/R1_reference_product.md create mode 100644 docs/research/R2_open_source_ecosystem.md create mode 100644 docs/research/R3_science_formats_algorithms.md create mode 100644 docs/research/R4_datasets.md create mode 100644 docs/research/README.md create mode 100644 docs/research/pgx_star_allele_coverage.csv diff --git a/docs/research/00_phase0_report.md b/docs/research/00_phase0_report.md new file mode 100644 index 0000000..e318a4c --- /dev/null +++ b/docs/research/00_phase0_report.md @@ -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). diff --git a/docs/research/A_cli_inputs.md b/docs/research/A_cli_inputs.md new file mode 100644 index 0000000..de92fb2 --- /dev/null +++ b/docs/research/A_cli_inputs.md @@ -0,0 +1,814 @@ +# A — Local CLI & Input Files: exhaustive analysis + +> **Archived Phase-0 study (sanitized copy, see `README.md`).** Written 2026-09-27, before the decisions in +> `SIMURGARRAY_MASTER_PLAN.md` §2. The analysed vendor product is called "the reference product" and its CLI +> `refcli`; its documentation URLs are replaced by `[ref-docs:…]` tokens. Where this file speaks of a clean room, +> legal clearance, or running/benchmarking the vendor binary, plan §2 supersedes it: personal research; MIT/BSD/Apache +> code may be reused with attribution; GPL tools are subprocess oracles only; vendor binaries are never run for +> comparison, inspected or decompiled; oracles are published vendor-produced GTCs, gtc2vcf and BeadArrayFiles. + +Sources (both read in full, line by line): +- `site/pages/product-guides/local-analysis.md` (647 lines, "[product] Local Analysis") +- `site/pages/product-guides/input-files.md` (205 lines, "Input Files") + +Conventions in this document: "the vendor tool" = the analysed product; executable name is `refcli`. +Line references `L:n` = local-analysis page, `I:n` = input-files page. Verbatim quotes are in `code` or "quotes". +Items marked **[DOC-INCONSISTENCY]** are contradictions/omissions in the source docs themselves. + +**Images:** neither page contains any image reference (no `![]`, ``, `.png/.jpg/.svg`, or `gitbook/assets` URLs). +Only external hyperlinks exist (listed in §8). + +--- + +## 1. Complete command reference + +### 1.1 General syntax (L:143-147) +``` +refcli [module] [sub-module (not needed for cyto)] [command] [required parameters] [optional parameters] +``` +- Command names are lowercase; **CLI options are case-sensitive** and must be typed exactly, notably mixed-case + `--threshold-callRate` and `--threshold-logRdev` (L:147, repeated L:564). +- Top-level modules (L:149-156): + +| Module | Description (verbatim) | +|---|---| +| qc | Extract control probe intensities, compute QC metrics and generate QC reports. | +| genotype | Call genotypes, single nucleotide variants, and various related file conversions. | +| pgx | Pharmacogenomics CNV, star allele calling and metabolizer status annotation. | +| cyto | Cytogenetics CNV/LOH/mosaic calling and annotation. | +| help | Display more information on a specific command. | +| version | Display version information. | + +- `refcli help` — "Displays the first-layer help information." (L:160) +- `refcli version` — "Displays current [product] Local version." (L:164). Used as installation check (L:55). +- Every module and sub-module also has its own `help` and `version` commands; every leaf command has `--help` and + (almost all) `--version` flags. + +Full command tree: +``` +refcli +├── help +├── version +├── qc +│ ├── call +│ ├── report +│ ├── help +│ └── version +├── genotype +│ ├── call +│ ├── gtc-to-bedgraph +│ ├── gtc-to-vcf +│ ├── help +│ └── version +├── pgx +│ ├── copy-number +│ │ ├── call +│ │ ├── train +│ │ ├── help +│ │ └── version +│ ├── star-allele +│ │ ├── call +│ │ ├── annotate +│ │ ├── help +│ │ └── version +│ ├── help +│ └── version +└── cyto (no sub-module) + ├── call + ├── annotate + ├── help + └── version +``` + +### 1.2 Common option semantics (apply to all leaf commands where present) +| Flag | Type | Default | Meaning | +|---|---|---|---| +| `--debug` | boolean switch | false | "Includes stack traces in logs." / "Logs will include stack traces." | +| `--json-log` | boolean switch | false | "Outputs logs in JSON format." (JSON schema not documented on these pages) | +| `--help` | switch | — | Command help screen ("Display this help screen.") | +| `--version` | switch | — | "Displays version information." (absent from `qc call` table) | +| `--output-folder` | path | CWD for qc call, qc report, pgx copy-number train, star-allele call/annotate, cyto call/annotate; **not stated** for genotype call, gtc-to-bedgraph, gtc-to-vcf, pgx copy-number call | Output directory. Re-using an output folder overwrites older files (L:87). | +| `--sample-sheet` | path (CSV) | — | Filter samples and supply metadata; see §3.9 | +| `--idat-folder` / `--gtc-folder` | directory | — | Root folder; **recursive** (includes subdirectories, stated for idat-folder). Overrides sample-sheet `RootFolder`. | + +Rule repeated for every sample-set command: **"Either --idat-folder, --sample-sheet, or both are required inputs."** +(qc call L:192, genotype call L:256) / **"Either --gtc-folder, --sample-sheet, or both are required inputs."** +(gtc-to-bedgraph L:273, gtc-to-vcf L:324). For pgx copy-number call/train and cyto call the same pattern is implied +(`--gtc-folder` not marked required) but not stated explicitly. + +### 1.3 `qc call` (L:177-192) +"Performs QC sample analysis given raw iScan data (IDAT)." / "Extracts raw control probe intensities and computes QC +metrics from IDAT files." + +| Option | Req | Type | Default | Allowed | Description | +|---|---|---|---|---|---| +| `--array-type` | **Required** | enum | — | `genotyping`, `methylation` | Array type for QC analysis | +| `--csv-manifest` | **Required** | path | — | — | CSV manifest | +| `--idat-folder` | "[Required]" in table, but see note | dir | — | — | IDAT dir incl. all subdirectories; overrides sheet RootFolder | +| `--sample-sheet` | optional | path | — | — | Sample sheet for filtering | +| `--output-folder` | optional | dir | CWD | — | Output dir | +| `--debug` | optional | bool | false | — | stack traces | +| `--help` | — | — | — | — | help | +| `--json-log` | optional | bool | false | — | JSON logs | + +Note: "Either --idat-folder, --sample-sheet, or both are required inputs." **[DOC-INCONSISTENCY]** table says +`--idat-folder` "[Required]" while the note says sheet alone suffices. No `--version`, no `--num-threads`, no BPM +(QC uses the CSV manifest's `[Controls]` section, not BPM). Outputs (from L:106-107,196): `controls.raw_metrics.csv`, +`controls.qc_metrics.csv`. + +### 1.4 `qc report` (L:194-216) +Generates QC Report (interactive HTML) + QC Table (spreadsheet) from one or more dataset folders. +Inputs per dataset folder: `controls.raw_metrics.csv` (required), `controls.qc_metrics.csv` (required), from +`qc call` **or** `genotype call`; `gt_sample_summary.csv` ("highly recommended", optional) from `genotype call` for +"functional QC". Supports "parent-folder discovery, dataset labeling, and interactive dashboards". + +| Option | Req | Type | Default | Description | +|---|---|---|---|---| +| `--data` | **Required** | `` | — | One or more dataset folders, comma-separated; **or one parent folder** → datasets auto-discovered beneath it | +| `--config` | optional | `` YAML | built-ins | Default QC thresholds. CLI thresholds override config. Built-in defaults `callRate = 0.98`, `logRDev = 0.20`; "All other thresholds are unset by default." | +| `--label` | optional | `` | dataset folder names | One label per dataset; **count must equal number of datasets** | +| `--output-folder` | optional | dir | CWD | | +| `--output-format` | optional | `` | `xlsx` | Format of sample QC table; XLSX has conditional colouring and a **"Thresholds"** sheet | +| `--threshold-callRate` | optional | `` float | `0.98` | Functional QC call-rate threshold; overrides YAML | +| `--threshold-logRdev` | optional | `` float | `0.20` | Functional QC LogRDev threshold; overrides YAML | +| `--debug` | optional | bool | `false` | | +| `--json-log` | optional | bool | `false` | | +| `--help`, `--version` | — | — | — | | + +Precedence: CLI threshold > YAML `--config` > built-in defaults (L:212). +Example (verbatim, L:109): `refcli qc report --data /user/gtc --config /user/config.yaml --output-folder /user/qc_report --label dataset_name` +Privacy warning (danger hint, L:214-216, verbatim): "If the input data for `qc report` was generated while using a +sample sheet, sample metadata such as sample names, process information, and other sample-sheet values will be +carried into the QC report outputs, including tables and HTML files. Review QC report outputs before sharing them. +If you need to remove some metadata before sharing, remove it from `gt_sample_summary.csv` and rerun the `qc report` +command." → i.e. the report reads metadata from `gt_sample_summary.csv`, and editing that CSV is the supported +redaction path. Also covers methylation arrays (L:101). Details delegated to sub-page `qc-report.md` (anchors: +`#metadata-propagation-gt_sample_summary`, `#multiple-dataset-folders`, +`#parent-folder-containing-multiple-dataset-folders`, `#configuration-file-optional`). + +### 1.5 `genotype call` (L:238-256) +"Determines genotype calls (GTC) from IDAT files." + +| Option | Req | Type | Default | Description | +|---|---|---|---|---| +| `--bpm-manifest` | **Required** | path | — | BPM manifest | +| `--cluster-file` | **Required** | path | — | EGT cluster file | +| `--idat-folder` | cond. | dir | — | recursive; overrides sheet RootFolder | +| `--sample-sheet` | cond. | path | — | filtering + metadata | +| `--debug` | opt | bool | false | | +| `--gencall-cutoff` | opt | float | **0.15** | "GenCall score cutoff to label a NoCall." | +| `--help` | — | | | | +| `--json-log` | opt | bool | false | | +| `--num-threads` | opt | int | **not documented** | "Number of parallel threads to run." (only command with a threads flag) | +| `--output-folder` | opt | dir | not stated | | +| `--version` | — | | | | + +Outputs (implied on this page): `.gtc` (GTC v5, L:277), `controls.raw_metrics.csv`, +`controls.qc_metrics.csv`, `gt_sample_summary.csv` (genotype sample summary; sample-sheet optional columns are +echoed as-is, I:104). +Example (verbatim): `refcli genotype call --bpm-manifest /user/productfiles/manifest.bpm --cluster-file /user/productfiles/clusterfile.egt --idat-folder /user/IDATs --output-folder /user/gtc` + +### 1.6 `genotype gtc-to-bedgraph` (L:258-273) +Converts GTC to BedGraph visualisation files "from the Log R Ratio and B-allele frequency data" (L:260); the module +table (L:233) says only "log R ratio data" **[DOC-INCONSISTENCY]**. + +| Option | Req | Type | Default | Description | +|---|---|---|---|---| +| `--bpm-manifest` | **Required** | path | — | BPM | +| `--gtc-folder` | cond. | dir | — | overrides RootFolder | +| `--sample-sheet` | cond. | path | — | | +| `--debug`, `--json-log` | opt | bool | false | | +| `--help`, `--version` | — | | | | +| `--output-folder` | opt | dir | not stated | | + +### 1.7 `genotype gtc-to-vcf` (L:275-325) +"Converts GTC (v5) to SNV VCF Files. The command is only applicable for Genotype Call Files produced by [product] +Array." (i.e. GTCs from other producers, e.g. older AutoConvert/GenomeStudio, are unsupported/untested). + +| Option | Req | Type | Default | Description | +|---|---|---|---|---| +| `--bpm-manifest` | **Required** | path | — | BPM | +| `--csv-manifest` | **Required** | path | — | CSV manifest "with SourceSeq column" | +| `--genome-fasta-file` | **Required** | path (.fa) | — | ".fai" must be in same directory | +| `--gtc-folder` | cond. | dir | — | overrides RootFolder | +| `--sample-sheet` | cond. | path | — | | +| `--auxiliary-loci` | opt | path (VCF) | — | "VCF file with auxiliary definitions of loci, such as for multi-nucleotide variants" | +| `--debug` | opt | bool | false | | +| `--disable-genome-cache` | opt | bool | (cache on) | "Disables the reference genome cache." | +| `--filter-loci` | opt | (path? text file) | — | "Generates a text file containing a list of probe names to be filtered." **[DOC-INCONSISTENCY/ambiguous]**: wording says "generates", but it is almost certainly an *input* list of probe names to exclude (L:419 "without filter loci" treats it as a filter applied to VCF content). | +| `--unsquash-duplicates` | opt | bool | false | "Generates unique VCF records for duplicate assays." | +| `--help` | — | | | | +| `--json-log` | opt | bool | false | | +| `--no-bgzip` | opt | bool | false | "VCFs are not bgzip compressed (.gz) and no tabix index files (.tbi) are output." | +| `--use-infI-nc-info` | opt | bool | false | "When combining loci, use Infinium I probe no-calls to constrain possible genotypes." (mixed-case `I` in flag) | +| `--output-folder` | opt | dir | not stated | | +| `--version` | — | | | | + +Example (verbatim): `refcli genotype gtc-to-vcf --bpm-manifest /user/productfiles/manifest.bpm --csv-manifest /user/productfiles/manifest.csv --genome-fasta-file /user/productfiles/genome.fa --gtc-folder /user/gtc --output-folder /user/vcf` +Output file naming (from I:181 / L:425): `*.snv.vcf.gz` (+ `.tbi`), or `.snv.vcf` with `--no-bgzip`. +Sub-behaviours: squashing duplicates, genome cache, auxiliary loci — see §2. + +### 1.8 `pgx copy-number call` (L:357-371) +"Determines copy number variants given genotypes (GTC to CNV VCF)." "A batch of 24 samples or more are required for +analysis. For a successful analysis, 22 samples must pass QC defined as having log R dev < 0.2." + +| Option | Req | Type | Default | Description | +|---|---|---|---|---| +| `--cn-model` | **Required** | path (.dat) | — | PGx CN model | +| `--gtc-folder` | cond. | dir | — | overrides RootFolder | +| `--sample-sheet` | cond. | path | — | | +| `--debug`, `--json-log` | opt | bool | false | | +| `--no-bgzip` | opt | bool | false | as above | +| `--output-folder` | "[Optional]" | dir | not stated | Recommended: same folder as SNV VCFs (star-allele call takes one VCF folder) | +| `--help`, `--version` | — | | | | + +Note: no BPM/FASTA/EGT argument — the CN model must therefore embed/locate everything else needed (and is matched to +the manifest revision; mismatch → error, I:37). Output: `*.cnv.vcf.gz`. +Example (verbatim): `refcli pgx copy-number call --cn-model /user/productfiles/manifest_pgx_model.dat --gtc-folder /user/gtc --output-folder /user/vcf` + +### 1.9 `pgx copy-number train` (L:373-396) +"Trains copy number model for a set of samples (GTC to CN Model File)." Generate a new model when using a customised +EGT. + +| Option | Req | Type | Default | Description | +|---|---|---|---|---| +| `--bpm-manifest` | **Required** | path | — | BPM; **mask file (.msk) assumed in same directory** | +| `--genome-fasta-file` | **Required** | path | — | .fai in same directory | +| `--platform` | **Required** | enum | — | `LCG` for GDA-ePGx; `EX` for GSAv4-ePGx or GCRA-ePGx. Value = `Assay Format` heading of the CSV manifest (L:587) | +| `--gtc-folder` | cond. | dir | — | overrides RootFolder | +| `--sample-sheet` | cond. | path | — | | +| `--debug`, `--json-log` | opt | bool | false | | +| `--disable-genome-cache` | opt | bool | (cache on) | | +| `--help`, `--version` | — | | | | +| `--output-folder` | opt | dir | CWD | "The location to output the CN model." | + +Example (verbatim, L:127): `refcli pgx copy-number train --bpm-manifest /user/productfiles/manifest.bpm --genome-fasta-file /user/productfiles/genome.fa --gtc-folder /user/gtc --platform LCG --output-folder /user/productfiles/cnmodelnew` +Second example (L:588, verbatim, **[DOC-INCONSISTENCY]** missing `pgx` module): `refcli copy-number train --bpm-manifest /user/productfiles/manifest.bpm --genome-fasta-file /user/productfiles/genome.fa --gtc-folder /user/new_gtcs --platform LCG --output-folder /user/productfiles/new_cnmodel` + +### 1.10 `pgx star-allele call` (L:417-431) +"Calls PGx star allele diplotypes. The SNV VCF files should be generated using the [product] gtc-to-vcf command +with unsquash-duplicates off (default) and without filter loci." + +| Option | Req | Type | Default | Description | +|---|---|---|---|---| +| `--database` | **Required** | path (.zip) | — | PGx database | +| `--license-server-url` | **Required** | URL w/ credentials | — | e.g. `https://username:password@[ref-license-server]` | +| `--vcf-folder` | **Required** | dir | — | contains `*.snv.vcf.gz` **and** `*.cnv.vcf.gz` | +| `--query-license-quota` | opt | bool | — | query and display quotas at beginning and end | +| `--debug`, `--json-log` | opt | bool | false | | +| `--output-folder` | opt | dir | CWD | | +| `--help`, `--version` | — | | | | + +No `--sample-sheet` (samples come from VCF folder). Output: `star_alleles.dat` (name from the annotate example). +Example (verbatim): `refcli pgx star-allele call --vcf-folder /user/vcf --database /user/productfiles/DAv1.4.0-rc2-pgx-mapping-sha.b164b4aa02f34cc9b72aba020c3a8735cb8e4421.zip --output-folder /user/star-alleles --license-server-url https://username:password@[ref-license-server]` +Note: database file name embeds software version + content SHA (`-pgx-mapping-sha.<40-hex>.zip`). + +### 1.11 `pgx star-allele annotate` (L:433-445) +"Annotates and summarizes the star-alleles, specifically for metabolizer statuses and outputs in a consolidated JSON +report. Metabolizer status is determined through direct lookup into public PGx guidelines CPIC or DPWG." Quick-start +text says it also summarizes into CSV files (L:124). + +| Option | Req | Type | Default | Allowed | Description | +|---|---|---|---|---|---| +| `--star-alleles` | **Required** | path (.dat) | — | — | from star-allele call | +| `--guidelines` | opt | enum | `CPIC` | `CPIC`, `DPWG` | guideline set | +| `--debug`, `--json-log` | opt | bool | false | | | +| `--output-folder` | opt | dir | CWD | | | +| `--help`, `--version` | — | | | | | + +Example (verbatim): `refcli pgx star-allele annotate --star-alleles star_alleles.dat --guidelines CPIC --output-folder /user/metabolizer-statuses` +No license needed for annotate (only `star-allele call` requires quota). + +### 1.12 `cyto call` (L:466-508) +"Determines copy number variants (CNV) and loss/absence of heterozygosity (LOH/AOH) given genotypes." Also mosaic +events. + +| Option | Req | Type | Default | Description | +|---|---|---|---|---| +| `--cn-model` | **Required** | path (.dat) | — | cyto model | +| `--gtc-folder` | cond. | dir | — | overrides RootFolder | +| `--sample-sheet` | cond. | path | — | | +| `--debug`, `--json-log` | opt | bool | false | | +| `--no-bgzip` | opt | bool | false | (must NOT be used if cyto annotate follows) | +| `--output-folder` | "[Optional]" | dir | CWD | | +| `--help`, `--version` | — | | | | +| `--min-del-probes` | opt | int | **10** | deletions reported only if ≥ N probes | +| `--min-del-size` | opt | kb | **25** | deletions ≥ size | +| `--min-dup-probes` | opt | int | **10** | | +| `--min-dup-size` | opt | kb | **50** | | +| `--min-loh-probes` | opt | int | **500** | | +| `--min-loh-size` | opt | kb | **3000** | | +| `--min-gainloh-probes` | opt | int | **300** | GAINLOH events | +| `--min-gainloh-size` | opt | kb | **500** | | +| `--min-mdel-probes` | opt | int | **10** | mosaic deletions | +| `--min-mdel-size` | opt | kb | **25** | | +| `--min-mdup-probes` | opt | int | **10** | mosaic duplications | +| `--min-mdup-size` | opt | kb | **50** | | +| `--min-mloh-probes` | opt | int | **500** | mosaic LOH | +| `--min-mloh-size` | opt | kb | **3000** | | +| `--max-mosaic-fraction` | opt | float | **1.0** | mosaic variants with fraction ≥ this are "promoted", marked INFO `HIGHFRACTION` (replaces `MOSAIC` tag), retain their mosaic fraction value | +| `--smoothing` | opt | int | **5** | LRR smoothing window: number of probes **on each side** of centre probe | + +Filter descriptions all say "will be reported in the json file" — i.e. the thresholds on `cyto call` govern what is +reported downstream (the cyto call VCF and/or a `cyto.cnv.dat` metadata file), duplicated on `cyto annotate`. +Example (verbatim): `refcli cyto call --cn-model /user/productfiles/cyto_model.dat --gtc-folder /user/gtc --output-folder /user/vcf` + +### 1.13 `cyto annotate` (L:510-545) +"Annotates samples and generates cytogenetic json reports." (gene annotations, cytogenetic bands, QC fields, variant +info from the VCFs, L:138) + +| Option | Req | Type | Default | Description | +|---|---|---|---|---| +| `--annotation-db` | **Required** | path (.zip) | — | cyto annotation database | +| `--vcf-folder` | **Required** | dir | — | contains `*.cnv.vcf.gz` (+ `cyto.cnv.dat`) | +| `--output-folder` | "[Optional]" | dir | CWD | | +| `--debug`, `--json-log` | opt | bool | false | | +| `--help`, `--version` | — | | | | +| `--min-del-probes` … `--min-mloh-size` | opt | | same 12 flags and defaults as cyto call | | +| `--min-qual` | opt | number | **20** | "Min CNV qual and LOH qual scores." | + +(no `--max-mosaic-fraction`, `--smoothing`, `--no-bgzip`, `--sample-sheet` on annotate) +Example (verbatim): `refcli cyto annotate --annotation-db /user/productfiles/CytoAnnotateData_DAv1.2.0.zip --vcf-folder user/vcf --output-folder /user/cyto-annotations` +(note the relative `user/vcf` in the original — likely a typo.) + +### 1.14 Mutually exclusive / dependent option groups +- **At-least-one-of** groups: {`--idat-folder`, `--sample-sheet`} (qc call, genotype call); + {`--gtc-folder`, `--sample-sheet`} (gtc-to-bedgraph, gtc-to-vcf, implicitly pgx cn call/train, cyto call). + When both given, folder option overrides sheet `RootFolder`. +- **Threshold precedence**: `--threshold-*` > `--config` YAML > built-in. +- **`--label` cardinality** must equal number of `--data` datasets. +- **Pipeline incompatibilities**: `--unsquash-duplicates` and `--filter-loci` must not be used when star-allele call + follows; `--no-bgzip` on cyto call must not be used if cyto annotate follows. +- No true mutually-exclusive flags are documented. + +### 1.15 Quick-start workflows (verbatim command sequences) +Genotyping: genotype call → genotype gtc-to-vcf. +QC report: genotype call (or qc call) → qc report. +PGx (L:113-127): genotype call → gtc-to-vcf → pgx copy-number call (same output folder as SNV VCF) → pgx star-allele +call → pgx star-allele annotate → [optional] pgx copy-number train. +Cytogenetics (L:129-139): genotype call → cyto call → cyto annotate. +Semi-custom PGx (L:614-623): GenomeStudio custom EGT → genotype call (semi-custom BPM/EGT) → gtc-to-vcf +(semi-custom BPM/CSV) → full commercial-product PGx pipeline separately. +``` +refcli genotype call --bpm-manifest /user/productfiles/semi_custom_manifest.bpm --cluster-file /user/productfiles/semi_custom_clusterfile.egt --idat-folder /user/IDATs --output-folder /user/semi_custom_gtcs +refcli genotype gtc-to-vcf --bpm-manifest /user/productfiles/semi_custom_manifest.bpm --csv-manifest /user/productfiles/semi_custom_manifest.csv --genome-fasta-file /user/productfiles/genome.fa --gtc-folder /user/semi_custom_gtcs --output-folder /user/semi_custom_vcfs +refcli genotype call --bpm-manifest /user/productfiles/manifest.bpm --cluster-file /user/productfiles/new_clusterfile.egt --idat-folder /user/IDATs --output-folder /user/new_gtcs +``` + +--- + +## 2. Documented behaviours + +### 2.1 Computing requirements (L:13-24) +| Category | Recommendation | +|---|---| +| CPU | 8 cores | +| Memory | 32 GB available or more | +| Disk | 30 GB or more free | +| OS | Windows 10+ (`win10-x64`); CentOS 7+, Ubuntu 20.04+ (`linux-x64`) | +- Cybersecurity: must not require admin; "We recommend you do not run with elevated permissions." +- Up to **500 GDA-ePGx samples per analysis batch** on this hardware (L:71). +- `cyto annotate` needs ≥ **5 GB** free disk (L:545). + +### 2.2 Installation (L:42-65) +1. Download platform package (Windows/Linux) from support site; move to desired folder (admin may be needed for + `/usr/local/bin`, `C:\Program Files`). +2. Unzip; executable is in the `refcli` subfolder, e.g. `/usr/local/bin/-linux-x64-DAv1.4.0//`. +3. Optionally add to PATH; verify with `refcli version` (prints version on success). +- Distributed as a **self-contained .NET application** (bundled runtime) but needs host native libraries (the .NET + DEB/RPM dependency lists: ICU, OpenSSL, zlib, libstdc++, etc.); missing libs → fails to start or runtime errors. +- Package naming convention: `--DAv` (rid = win10-x64 / linux-x64). + +### 2.3 Licensing / quota (L:26-40) — only `pgx star-allele call` +- Quota charged **per sample analysed**, including re-analysis and low-quality samples. +- Quota checked "before and after analysis but not after updating the usage"; re-run to see current usage. +- Credential from activation email passed via `--license-server-url`; logs record remaining quota at beginning and end. +- Internet required. Endpoints: v1.0/v1.1 `[ref-license-server-legacy]`; v1.2+ `[ref-license-server]` (new domain + does not work with v1.0/1.1). +- v1.1+: precomputed quota no longer checked during analysis → an over-quota run proceeds and fails only at the end: + `Error updating usage. HTTP error status code: 409`, and **results are not written to disk**. +(Irrelevant to an open reimplementation except as a UX anti-pattern: never discard computed results.) + +### 2.4 Sample minimums / batch rules +- Genotyping and cyto: **no sample minimum** (L:69). +- PGx CNV call: **≥ 24 samples**, of which **≥ 22 pass QC (LogRDev < 0.2)** (L:71, L:359). Recommended **≥ 96** + samples passing LogRDev ≤ 0.2 (L:121); "Analyze batches of 96 samples or more" (L:77). +- PGx CN train: **≥ 96 samples**, **≥ 90 passing LogRDev ≤ 0.2**; recommended ≥ 150; diminishing returns and longer + runtime beyond **3,000** (L:379, L:598). +- Batch recommendations for PGx CNV (L:73-79): same assay batch (WGA + targeted gene amplification) → same analysis + batch; don't combine different reagent lots; samples processed within a **two-week period** from multiple library + prep batches may be pooled (same reagent lots/instruments); use the standard CN model and PGx DB. +- Note boundary inconsistencies: "< 0.2" (call) vs "≤ 0.2" (train, recommendation) **[DOC-INCONSISTENCY]**. + +### 2.5 File discovery +- `--idat-folder` is searched **recursively** ("This path also includes the contents of all subdirectories"). +- **Duplicate IDAT pairs** for the same `SentrixBarcode_Position` under one `--idat-folder` are not allowed (rescans + must be removed/relocated before `genotype call`/`qc call`) (L:565). Behaviour on violation not stated (presumably + error). +- Samples identified by `<12-digit barcode>__{Grn,Red}.idat` (I:12). +- Sample sheet selects a subset of samples from the folder ("A sample sheet can be used to select specific samples out + of a folder", L:85). +- `RootFolder` in `[Header]` (absolute path) is used when no folder option; CLI folder option wins on conflict. +- star-allele call pairs `*.snv.vcf.gz` and `*.cnv.vcf.gz` in one folder; cyto annotate needs `*.cnv.vcf.gz` + the + `cyto.cnv.dat` metadata file in the same folder. +- CN train finds `.msk` next to the BPM with the **same base name** as the manifest; FASTA commands find `.fai` next + to the `.fa`. + +### 2.6 Overwrite behaviour +"[product] will overwrite older files if using the same `--output-folder` from a previous analysis. If this is not +desired, use different `--output-folder` for re-analyses." (L:87) — silent overwrite, no `--force`. + +### 2.7 Threading +Only `genotype call --num-threads` ("Number of parallel threads to run."), default undocumented. Other commands have +no thread control. + +### 2.8 Genome cache (L:302-304) +Default: whole reference genome read into memory (faster than indexed disk reads, more RAM). +`--disable-genome-cache` for low memory or small manifests (gtc-to-vcf, pgx copy-number train). + +### 2.9 Logging / exit +- `--debug`: include stack traces in logs (default off). +- `--json-log`: JSON-formatted logs (default off). Field schema not documented here (see output-files page + `#section-warningerror-messages-and-logs`). +- Logs record license quota at start/end for star-allele call. +- Cancel with Ctrl+C. Exit codes not documented. On quota failure, nothing written. +- Error on cluster/CN-model mismatch in v1.0: "produce an error and exit" (L:594). + +### 2.10 Squashing duplicates (L:298-300) +Default: multiple assays probing the same variant (same or alternate designs) are **squashed** into one VCF record +reflecting the true variant; method in output-files VCF description. `--unsquash-duplicates` → one record per assay +(for assay validation). Exception: multi-allelic loci queried with duplicated designs are **never** unsquashed. +"**DO NOT** use `--unsquash-duplicates` option if doing star allele calling downstream as that command expects squashed +variants." + +### 2.11 Infinium I no-call info +`--use-infI-nc-info`: when combining loci, Infinium I probe no-calls constrain possible genotypes (details on +output-files page `#using-infinium-i-nocall-information`). Default off. + +### 2.12 Auxiliary loci (L:306-320) +MNVs unsupported upstream; can be designed as SNP assay e.g. true `ATGC[AT/CG]GTAA` designed as `ATGC[A/C]NNNN`. +`--auxiliary-loci ` restores true alleles. Restrictions (verbatim): +- "The auxiliary definition must NOT be a multi-allelic variant." +- "The auxiliary definition must be a multi-nucleotide variant." +- "There must NOT be multiple array assays (e.g., duplicates) for the locus." + +### 2.13 Cyto call behaviours (L:498-508) +- >10 probes per region recommended for confident CNV calls. +- Any probe-min threshold < 10 is **silently reset to 10** (applies to call and annotate). +- Threshold > effective genome size → all variants filtered out. +- > 10 events (DEL/DUP/AOH) per chromosome → indication for visual inspection. +- Mosaic fraction not estimable (insufficient informative probes) → `NaN`. +- Mosaic events ≥ `--max-mosaic-fraction`: INFO `MOSAIC` replaced by `HIGHFRACTION`. +- Mosaic events < 15–20 % fraction may be missed (sensitivity limit). +- LogRDev > 0.2 → low-quality; flagged with `SampleQuality` flag in VCF. +- LogRDev > 0.3 → very noisy; only whole-chromosome-level events detected/reported. + +### 2.14 Cyto annotate behaviours (L:539-545) +- `cyto.cnv.dat` metadata file produced by cyto call must remain in the vcf-folder. +- VCFs must be bgzipped + indexed. +- ≥ 5 GB free disk. + +### 2.15 Custom cluster files and CN models (L:572-602) +- Custom EGT created in GenomeStudio 2.0; **EGT file name: only `[A-Za-z0-9_-]`**, no spaces/special chars. +- For PGx products a GenomeStudio auxiliary file (tab-delimited, Column Import) maps Infinium assays → PGx star + alleles, for reviewing cluster positions of PGx variants. +- If EGT customised, PGx CN model should be retrained with the same samples used for the EGT. +- v1.1+: CN model with a different cluster file → **warning**, proceeds. v1.0: same EGT required → error & exit. +- Training QC recommendation: remove samples with LogRDev > 0.2, call rate < 0.99, or TGA control probe < 1.0; same + reagent lots; few batches. +- Algorithm assumption: training cohort's CN distribution resembles standard population distributions. +- Validate a retrained CN model with truth data before use. + +### 2.16 Semi-custom arrays (L:604-625) +- PGx CNV and star-allele calls limited to commercial content; add-on content excluded. +- Retain all backbone content when designing semi-custom PGx arrays. +- Run pipeline twice: semi-custom files for SNV VCFs, commercial files for PGx. Semi-custom GTC/VCFs "cannot be used + for downstream PGx analysis commands". Keep in clearly labelled folders. + +### 2.17 CLI tips (L:561-570) +Quote paths with spaces; case-sensitive options; no duplicate IDAT pairs; up-arrow to edit; copy-paste paths; +Windows "Copy as Path"; Ctrl+C cancels. + +--- + +## 3. Input file types + +| # | File | Ext | Source | Commands (option) | +|---|---|---|---|---| +| 3.1 | IDAT | .idat | scanner (iScan, NextSeq550 for select arrays) | genotype call, qc call (`--idat-folder`) | +| 3.2 | CSV manifest | .csv | vendor | gtc-to-vcf, qc call (`--csv-manifest`) | +| 3.3 | BPM manifest | .bpm | vendor | cn train, genotype call, gtc-to-bedgraph, gtc-to-vcf (`--bpm-manifest`) | +| 3.4 | Cluster file | .egt | vendor or GenomeStudio | genotype call (`--cluster-file`) | +| 3.5 | PGx CN model | .dat | vendor or `pgx copy-number train` | pgx cn call (`--cn-model`) | +| 3.6 | Cyto CN model | .dat | vendor | cyto call (`--cn-model`) | +| 3.7 | Mask | .msk | vendor | cn train (implicit, next to BPM) | +| 3.8 | PGx database | .zip | vendor | star-allele call (`--database`) | +| 3.9 | Cyto database | .zip | vendor | cyto annotate (`--annotation-db`) | +| 3.10 | Genome FASTA (+.fai) | .fa | vendor | gtc-to-vcf, cn train (`--genome-fasta-file`) | +| 3.11 | YAML config | .yaml/.yml | template or user | qc report (`--config`) | +| 3.12 | Sample sheet | .csv | user | genotype call, gtc-to-bedgraph, gtc-to-vcf, cn call, cn train, cyto call, qc call (`--sample-sheet`) | +| 3.13 | GTC | .gtc | genotype call | gtc-to-bedgraph, gtc-to-vcf, cn call, cn train (`--gtc-folder`) [cyto call also] | +| 3.14 | SNV VCF / PGx CNV VCF | .snv.vcf / .cnv.vcf | gtc-to-vcf / cn call | star-allele call (`--vcf-folder`) | +| 3.15 | PGx DAT | .dat | star-allele call | star-allele annotate (`--star-alleles`) | +| 3.16 | Cyto CNV VCF | .cnv.vcf | cyto call | cyto annotate (`--vcf-folder`) | +| 3.17 | QC dataset folder CSVs | .csv | qc call / genotype call | qc report (`--data`) | +| 3.18 | Auxiliary loci VCF | .vcf | user | gtc-to-vcf (`--auxiliary-loci`) | +| 3.19 | Filter-loci list | .txt | user | gtc-to-vcf (`--filter-loci`) | + +Note: the summary table omits `cyto call` from GTC consumers and omits 3.17–3.19. +Product files (all but IDATs) download: `[ref-docs:downloads]`. + +Details: +- **3.1 IDAT**: one pair per sample, Red and Grn channels, intensities per probe. Identified by 12-digit Sentrix + barcode (e.g. `123456789101`), position `R01C01`, and `Grn`/`Red`. +- **3.2/3.3 Manifests**: commercial from support site; custom/semi-custom from MyIllumina. "[product] only supports + manifest files from the Illumina Support site." CSV is human-readable complement to BPM; **required for indel VCF + generation**; gtc-to-vcf may be inaccurate if mapping info wrong. Mapping follows implicit dbSNP standard: + 1-based positions; **PAR positions reported on X**; insertion → position of base immediately 5′ of insertion + (plus strand); deletion → position of most 5′ deleted base (plus strand). CSV heading contains `Assay Format` + (e.g. `LCG`, `EX`) used for `--platform`. CSV must have `SourceSeq`. +- **3.4 EGT**: required for genotype call; custom may be needed; naming restriction `[A-Za-z0-9_-]`. +- **3.5 PGx CN model**: one per PGx product; **named after the manifest revision** (e.g. B1) and must be used with the + same-revision manifest. Must be retrained when EGT customised (v1.1+ only warns on mismatch). +- **3.6 Cyto model**: one per supported product; named after manifest revision; must match. Contains primarily + **probe GC content** information; tied to probe sequence/manifest; no retraining needed unless manifest or software + version changes; **independent of cluster file**. Custom products: contact support with BPM, EGT and IDAT/GTC for + ≥ 1 sample. +- Model/manifest mismatch → error during `pgx copy-number call` and `cyto call` (probes added/removed between + revisions). +- **3.7 Mask**: required for CN train; same base name as manifest, same folder as BPM; one per PGx product. +- **3.8 PGx DB**: zip; each line maps one probe ID → a variant HGVS tag (many probes → one variant); cross-referenced + with SNV VCF **IDs** at runtime; one DB works across all supported PGx products. +- **3.9 Cyto DB**: zip of Ensembl + RefSeq data; product-independent; may be updated. +- **3.10 FASTA**: .fa + .fai in same folder; PGx supports GRCh37 and GRCh38; custom references: contig IDs must match + manifest chromosome IDs exactly — `>1`, not `>chr1`, for standard human manifests. +- **3.11 YAML**: set threshold to a number to enable, `null` to disable; without `--config` built-ins for `callRate` + and `logRDev` only; cloud uses chemistry-specific default configs. +- **3.12 Sample sheet**: see §3.12 detail below. + +### 3.12 Sample sheet detail (I:56-147) +- CSV. Required key columns: local `SentrixBarcode_A`, `SentrixPosition_A`; cloud `beadChipName`, + `sampleSectionName`. Backwards compatible with most GenomeStudio sheets. +- Sections optional: `[Header]` (with `RootFolder,`, arbitrary keys e.g. `Date,1/1/2025`), `[Data]`. + `[Manifests]` section is **ignored**. Sectionless sheets valid (header row first line). +- Valid examples (verbatim): +``` +SentrixBarcode_A,SentrixPosition_A +204753010023,R02C01 +``` +``` +SentrixBarcode_A,SentrixPosition_A,Sample_ID,Sample_Group,MetaData1 +204753010023,R01C01,NA1231,Group1,F +204753010024,R01C01,NA1233,Group2,M +``` +``` +[Header] +RootFolder,/tests/samples +Date,1/1/2025 +[Data] +SentrixBarcode_A,SentrixPosition_A,Sample_ID,Sample_Group,MetaData1 +204753010023,R01C01,NA1231,Group1,F +204753010024,R01C01,NA1233,Group2,M +``` +- Column names **case-insensitive**; duplicates after case-folding are an error. +- Column names must not collide with genotype-summary output fields (**reserved keywords**, e.g. `Sex Estimate`). +- Optional columns are echoed **as-is** into genotype summary files (`gt_sample_summary.csv`). +- Column names and field values ≤ **500 characters**. +- Excel: format `SentrixBarcode_A` as number with 0 decimals; text-with-decimal or scientific notation → IDAT names + cannot be resolved → run fails. +- **Sample name precedence**: (1) sheet `Sample_Name` (if column present, must be non-empty in every row and must not + conflict with default ID `SentrixBarcode_Position`, e.g. `204753010023_R01C01`); (2) sample name embedded in + IDAT/GTC metadata; (3) `SentrixBarcode_Position`. Sheet value never rewrites the name stored in the GTC; affects only + downstream outputs (summary, VCFs); "the samplesheet for any given command is treated as the source of truth". +- Cloud methylation QC sheet: no sections; keys `beadChipName`,`sampleSectionName`; `Sample_Group` colours PCA control + plot/Principal Component Summary; any extra columns after Sample_Group replicated to Sample QC Summary outputs. +``` +beadChipName,sampleSectionName,Sample_ID,Sample_Group,MetaData1 +204753010023,R01C01,NA1231,Group1,F +204753010023,R02C01,NA1232,Group2,F +204753010024,R01C01,NA1233,Group2,M +204753010024,R02C01,NA1234,Group1,M +``` +- Cloud cyto + interpretation sheet: column `demographicSex` ∈ {`M`,`F`,`U`} compared against `Sex Estimate`. +``` +SentrixBarcode_A,SentrixPosition_A,demographicSex +204753010023,R01C01,F +204753010023,R02C01,F +204753010024,R01C01,M +204753010024,R02C01,M +``` + +--- + +## 4. Error / warning messages (verbatim) and triggers + +| Message | Trigger | Source | +|---|---|---| +| `Error updating usage. HTTP error status code: 409` | v1.1+ star-allele call exceeded quota; detected at end; results not written | L:40 | +| `Duplicate column sample_name found. Column names are case-insensitive. Please remove or rename the column from the samplesheet and re-process.` | two sheet columns equal after case-folding (e.g. `Sample_Name`, `sample_name`) | I:102 | +| `Sex Estimate is a reserved keyword. Please remove or rename the column from the samplesheet and re-process.` | sheet column collides with a genotype-summary output field | I:103 | +| (warning, text not given) CN model built with different cluster file | v1.1+ pgx copy-number call; proceeds | L:593 | +| (error & exit, text not given) cluster file differs from CN-model training | v1.0 | L:594 | +| (error, text not given) CN/cyto model vs manifest mismatch | pgx copy-number call, cyto call | I:37 | +| (failure, text not given) barcode unreadable from sheet (Excel sci-notation) | IDAT name resolution | I:107 | +| (validation, text not given) name/value > 500 chars | sample sheet | I:106 | +| (validation, implied) `Sample_Name` empty in some row, or equals another sample's default ID | sample sheet | I:113 | +| (implied) `--label` count ≠ dataset count | qc report | L:202 | +| (implied) missing `controls.*_metrics.csv` in dataset folder | qc report | L:200 | +| (silent) probe threshold < 10 reset to 10 | cyto call/annotate | L:501, L:541 | +| (implicit) license domain mismatch with v1.0/1.1 | star-allele call | L:39 | +| "application may fail to start or produce runtime errors" | missing .NET native libs | L:61 | + +--- + +## 5. Numeric thresholds and defaults (consolidated) + +| Value | Meaning | +|---|---| +| 8 cores / 32 GB / 30 GB disk | recommended hardware | +| 5 GB | free disk for cyto annotate | +| 500 | max GDA-ePGx samples per batch on recommended HW | +| 0.15 | `--gencall-cutoff` default (GenCall score < cutoff → NoCall) | +| 0.98 | qc report call-rate threshold default | +| 0.20 | qc report LogRDev threshold default; PGx/cyto QC boundary | +| 0.3 | LogRDev above which cyto reports only whole-chromosome events | +| 0.99 | call-rate recommended minimum for PGx samples / CN training samples | +| 1.0 | TGA control probe metric recommended minimum (PGx review/training) | +| 24 / 22 | PGx CNV call minimum batch / minimum passing LogRDev < 0.2 | +| 96 | recommended PGx CNV batch; minimum CN train samples | +| 90 | CN train samples passing LogRDev ≤ 0.2 | +| 150 | recommended CN train size | +| 3,000 | CN train diminishing returns | +| 2 weeks | window for pooling library-prep batches | +| 10 / 25 kb | DEL probes / size | +| 10 / 50 kb | DUP probes / size | +| 500 / 3000 kb | LOH probes / size | +| 300 / 500 kb | GAINLOH probes / size | +| 10 / 25 kb | mosaic DEL | +| 10 / 50 kb | mosaic DUP | +| 500 / 3000 kb | mosaic LOH | +| 10 | hard floor for any probe-count threshold | +| 1.0 | `--max-mosaic-fraction` | +| 5 | `--smoothing` probes each side (window = 11 probes) | +| 20 | `--min-qual` (cyto annotate) | +| 15–20 % | mosaic detection lower limit | +| > 10 events/chromosome | visual-inspection trigger | +| 500 chars | sample-sheet name/value limit | +| 12 digits | Sentrix barcode length | +| 409 | HTTP status on over-quota | +| CPIC | default guideline | +| xlsx | default QC table format | + +--- + +## 6. Algorithmic hints + +- **Genotype calling**: GenCall score with no-call cutoff 0.15; uses BPM + EGT (standard GenCall-style pipeline). + Outputs GTC v5 plus control metrics and sample summary (call rate, LogRDev, Sex Estimate, TGA control metric…). +- **Control QC** (`qc call`): control-probe intensity extraction from IDAT using the CSV manifest (Controls section); + supports genotyping and methylation arrays; outputs raw metrics and computed QC metrics. +- **Functional QC**: pass/fail on call rate ≥ 0.98 and LogRDev ≤ 0.20 (direction presumed); other thresholds + optional via YAML (numeric enables, null disables). +- **gtc-to-vcf**: REF from FASTA (whole-genome in-memory cache by default); indels resolved from CSV SourceSeq; duplicate + assays squashed into single variant-level genotypes; optional use of Infinium I no-calls as constraints; MNV + restoration from auxiliary VCF (SNP-designed proxies with `N` flanks); multi-allelic sites combine multiple assays; + probe IDs used as VCF IDs (PGx DB joins on VCF ID). +- **BedGraph**: LRR and BAF tracks from GTC + BPM positions. +- **PGx CNV**: batch-based caller (needs ≥ 24 samples/≥ 22 good ones → cohort normalisation / batch-effect sensitive); + model file (.dat) tied to manifest revision and (in v1.0) to cluster file → model contains per-probe intensity + reference parameters derived from EGT-normalised data; training requires BPM + **mask** (probe exclusion) + FASTA + (likely GC content / probe positions) + platform code (LCG vs EX assay format), assumes population-typical CN + distribution (i.e. unsupervised mixture fit where the modal state is CN2 and prior frequencies ≈ population). +- **Star alleles**: probe→HGVS mapping DB; SNV + CNV VCFs combined; expects squashed variants and unfiltered loci; + output `.dat` then annotate with CPIC/DPWG lookup (direct table lookup for metabolizer status). +- **Cyto**: model = probe GC content (→ GC-wave correction of LRR); LRR smoothing with ±5-probe window; CNV/LOH/AOH/ + GAINLOH (gain with LOH, i.e. CN≥3 with no heterozygosity) and mosaic DEL/DUP/LOH with mosaic fraction estimate + (NaN if too few informative probes); promotion of high-fraction mosaic events (`HIGHFRACTION`); QUAL scores for CNV + and LOH (min 20 at annotate); sample-quality flag at LogRDev > 0.2; whole-chromosome-only mode at > 0.3; "effective + genome size" concept; annotation with Ensembl/RefSeq genes and cytobands to JSON. +- **CN training QC**: exclude LogRDev > 0.2, call rate < 0.99, TGA control < 1.0. + +--- + +## 7. Gap analysis vs SimurgArray plan + +Plan sections compared: §1 goals, §6 formats, §8 VCF, §9 QC, §10 CN/LOH, §11 PGx, §13 outputs, §14 CLI, §15, §19. + +### 7.1 CLI structure & global behaviour +| # | Vendor behaviour | Plan status | Suggested spec addition | +|---|---|---|---| +| G1 | Hierarchical `module sub-module command`; `help`/`version` at every level | flat `simurg ` | Keep flat verbs but add `simurg --help` everywhere and a `simurg version` subcommand; optionally provide a compatibility alias layer mapping `genotype call`, `genotype gtc-to-vcf`, `qc call`, `qc report`, `cyto call` … to simurg verbs for users migrating scripts. | +| G2 | `--debug` (stack traces) separate from logging format | `--log-level` only | Add `--debug` = include tracebacks + DEBUG level. | +| G3 | `--json-log` | `--log-json` | Fine; document JSON log schema (timestamp, level, sample, step, message, error_code). Consider accepting `--json-log` as alias. | +| G4 | Silent overwrite of output folder | "never silently overwrite (require --force)" | Keep safer default; document that re-running into the same folder requires `--force` or `--resume`. | +| G5 | Folder OR sheet OR both; folder overrides sheet `RootFolder` | `--idats DIR\|--sheet F` (exclusive) | Allow both together: sheet filters, `--idats`/`--gtcs` overrides sheet `RootFolder`; sheet alone uses `RootFolder`; error if neither. | +| G6 | Recursive IDAT discovery; duplicate barcode_position pairs disallowed | recursive discovery mentioned | Specify: recursive search, `.idat` and `.idat.gz`, error `E_DUP_IDAT` listing all paths when the same barcode_position is found twice; `--allow-duplicates=first|newest` optional. | +| G7 | `--num-threads` only on genotype call | `--threads` common | OK; specify default = all physical cores (document). | +| G8 | Genome in-memory cache default, `--disable-genome-cache` | not specified | Add FASTA access policy: default load whole genome (or mmap) with `--no-genome-cache` to use indexed random access. | +| G9 | `--no-bgzip` on VCF writers | always bgzip | Add `--no-bgzip` (plain `.vcf`, no index) with warning that downstream CN annotate/PGx require compressed+indexed input. | +| G10 | Exit codes undocumented; quota failure discards results | defined exit codes | Keep; add rule: results computed are always written before any post-processing step can fail. | +| G11 | Case-sensitive, mixed-case flags | n/a | Use lowercase kebab-case only; no mixed-case flags. | +| G12 | Self-contained distribution, OS list, HW recommendation (8 cores/32 GB/30 GB) | §3 dev machine only | Add "user runtime requirements" section: supported OS/arch, min/recommended RAM per workload (e.g. 500-sample CN batch), disk for annotation DBs, no-root operation. | +| G13 | Licence/quota server | none (open) | Out of scope; explicitly state no network access required at runtime (offline-first). | + +### 7.2 Genotyping (`genotype call` equivalent) +| # | Vendor | Plan | Suggestion | +|---|---|---|---| +| G14 | Outputs per batch: `controls.raw_metrics.csv`, `controls.qc_metrics.csv`, `gt_sample_summary.csv` produced by genotype call itself | §13 has `controls_raw.tsv`, `controls_qc.tsv`, `sample_summary.tsv` | Make `simurg genotype` emit control metrics + sample summary automatically (so QC report works directly on the genotype output folder); offer CSV output with compatible column names as an option (`--summary-format csv`). | +| G15 | Sample-sheet metadata columns echoed as-is into sample summary | not specified | Specify: all non-key sheet columns propagated verbatim (order preserved) into sample_summary and QC report; reserved-name check. | +| G16 | GTC sample name not rewritten by sheet; sheet is source of truth per command | §6.6 precedence only | Add: name resolution happens per command; GTC-stored name is kept; downstream outputs use sheet value. Add rule `Sample_Name` non-empty for all rows if column present and must not equal another sample's default `barcode_position` ID. | +| G17 | Custom EGT naming restriction | none | Validate output EGT names from ArrayTrain `[A-Za-z0-9_-]` (portability), warn on others. | + +### 7.3 `gtc-to-vcf` equivalent +| # | Vendor | Plan | Suggestion | +|---|---|---|---| +| G18 | `--auxiliary-loci` VCF to restore MNV alleles for SNP-proxy designs (with 3 restrictions) | absent | Add `--auxiliary-loci FILE.vcf`: records keyed by probe ID/position override REF/ALT for single-assay, biallelic MNV loci; validate restrictions and error otherwise. | +| G19 | `--filter-loci` text list of probe names to exclude | absent | Add `--exclude-loci FILE` (one probe name per line) and `--include-loci`; record in provenance; warn when PGx step later consumes filtered VCFs. | +| G20 | `--use-infI-nc-info` (Infinium I no-calls constrain combined genotypes) | multi-probe merge in §8.3 but no Inf-I no-call rule | Add opt-in rule: when merging probes, an Infinium I probe no-call removes candidate genotypes that the probe would have been able to distinguish; default off. | +| G21 | Multi-allelic duplicated designs never unsquashed | §8.3 unsquash described generally | Specify exception: `--unsquash-duplicates` has no effect for multi-allelic sites. | +| G22 | Only GTC v5 from own caller accepted | plan reads v3–v5 | Keep broader support, but warn when GTC lacks v5 fields (BAF/LRR/percentiles) or was produced by other software. | +| G23 | CSV manifest required, must contain SourceSeq; mapping conventions (1-based, PAR on X, indel anchor positions) | §6.3/§8.1 partial | Add explicit validation of manifest mapping conventions: PAR loci on X coordinates, insertion anchor = base 5′ of insertion, deletion = first deleted base; convert to VCF left-anchored representation. | +| G24 | FASTA contig names must exactly match manifest chrom names (`1` not `chr1`) | alias table (more permissive) | Keep alias table but document default strict mode and the alias opt-in; verify `.fai` exists next to FASTA (or build it). | +| G25 | Output naming `.snv.vcf.gz`, CNV `.cnv.vcf.gz` | `.vcf.gz`, `.cnv.vcf.gz` | Adopt `.snv.vcf.gz` suffix to disambiguate SNV and CNV VCFs coexisting in one folder. | + +### 7.4 bedGraph +| G26 | Dedicated command from GTC+BPM producing LRR and BAF bedGraphs | `export bedgraph` | Covered; ensure it takes GTC folder + sheet and works without re-running genotyping. | + +### 7.5 QC +| # | Vendor | Plan | Suggestion | +|---|---|---|---| +| G27 | `qc call` works directly from IDAT + CSV manifest (no EGT/BPM), `--array-type genotyping|methylation` | methylation QC is v2 optional; control metrics derived in genotype pipeline | Add `simurg qc controls --idats --csv --array-type {genotyping,methylation}` runnable standalone without cluster file. | +| G28 | `qc report` accepts multiple dataset folders (comma list) or a parent folder with auto-discovery, `--label` per dataset | single report | Add multi-dataset report: `--data DIR[,DIR...]` or parent dir discovery (any subfolder containing the two control-metrics files); `--label` list with cardinality check; datasets shown side by side. | +| G29 | `--output-format csv|xlsx` (xlsx default with conditional colouring + "Thresholds" sheet) | TSV/XLSX | Specify XLSX layout: sample sheet with pass/fail colouring + a Thresholds sheet listing effective thresholds and their source (default/config/CLI). | +| G30 | YAML config: numeric = enable, `null` = disable; only callRate/logRDev enabled by default; CLI > YAML > defaults | §14 `qc:` block | Adopt the same tri-level precedence and null-disables semantics; record effective thresholds with their source in outputs. | +| G31 | Privacy: sheet metadata flows into HTML; redact by editing the summary CSV and rerunning | none | Add `--redact-columns COL,...` and a warning in docs; report built only from summary file so edits propagate. | +| G32 | TGA control probe metric (< 1.0 flagged) used for PGx review | not in §9 | Add targeted-gene-amplification control metric for ePGx arrays to control QC (definition to be derived from control probes). | + +### 7.6 PGx CNV and star alleles +| # | Vendor | Plan | Suggestion | +|---|---|---|---| +| G33 | CN call: ≥ 24 samples, ≥ 22 with LogRDev < 0.2, recommended ≥ 96 | §11 "≥ 24 samples" | Add explicit pre-flight check and error when fewer than N_min total / passing samples; configurable but defaulting to 24/22; warn below 96. | +| G34 | CN train: ≥ 96 samples, ≥ 90 passing; recommend ≥ 150; plateau ~3000; QC exclusions (LogRDev>0.2, CR<0.99, TGA<1.0) | "≥ 96 for training" | Add pass-count requirement and automatic exclusion rules with report of excluded samples. | +| G35 | Mask file (.msk) next to BPM with same base name, used in training | absent | Define an open probe-mask format (list of probe names excluded from CN modelling) discovered next to the manifest or given via `--mask`. | +| G36 | `--platform` (assay format LCG/EX) from CSV `Assay Format` heading | absent | Read assay format from CSV heading automatically; allow override. | +| G37 | CN model tied to manifest revision (error on mismatch), and to cluster file (warn on mismatch) | absent | CN model file header must store manifest name/revision + probe-set hash and EGT hash; error on manifest mismatch, warning on EGT mismatch. | +| G38 | Batch recommendations (same reagent lot, 2-week window, same assay batch) | absent | Add documentation + optional batch-consistency warnings using sheet columns (e.g. plate/lot) if present. | +| G39 | Star-allele input folder with paired `*.snv.vcf.gz`/`*.cnv.vcf.gz`; requires squashed, unfiltered SNV VCFs | §11 VCF input | Validate that VCF headers record `unsquash=false` and no filter list; refuse otherwise. | +| G40 | Probe→HGVS mapping DB (many probes → one variant), versioned zip with content hash in name | versioned SQLite pgx_db | Include a content hash + software-version in DB filename/metadata; record in provenance. | +| G41 | Separate `annotate` step: `.dat` → JSON + CSV, `--guidelines CPIC|DPWG` default CPIC | "phenotype" subcommand | Split calling vs phenotype annotation; add `--guidelines {cpic,dpwg}` default cpic; outputs JSON + per-gene CSV. | +| G42 | Semi-custom arrays: PGx limited to backbone content; run twice | none | Document how SimurgArray handles add-on content (likely we can include it natively; state policy). | +| G43 | Per-sample batch size limit (500 GDA samples at 32 GB) | performance plan | Add memory model for cohort CN steps and document max batch per RAM. | + +### 7.7 Cytogenetics (genome-wide CNV/LOH) +| # | Vendor | Plan | Suggestion | +|---|---|---|---| +| G44 | Separate `call` (→ CNV VCF + metadata dat) and `annotate` (→ JSON) commands | `cn call|train|annotate` | Map: `cn call` emits VCF + sidecar metadata; `cn annotate` consumes folder. | +| G45 | Event classes include **GAINLOH** (300 probes / 500 kb) and mosaic DEL/DUP/LOH each with own thresholds | §10.2 has DEL/DUP/LOH/mosaic "same" | Add GAINLOH class and separate mosaic thresholds; 12 flags: `--min-{del,dup,loh,gainloh,mdel,mdup,mloh}-{probes,size}` with defaults 10/25kb, 10/50kb, 500/3000kb, 300/500kb, 10/25kb, 10/50kb, 500/3000kb. | +| G46 | Probe threshold floor = 10 (silently reset) | none | Enforce floor 10 with a logged warning (not silent). | +| G47 | `--max-mosaic-fraction` (default 1.0) → `HIGHFRACTION` INFO replaces `MOSAIC` | none | Add parameter and INFO flags `MOSAIC`/`HIGHFRACTION`; MF=NaN when not estimable. | +| G48 | `--smoothing` ±5 probes LRR smoothing | none | Add `--smoothing K` (probes each side, default 5) pre-segmentation smoothing. | +| G49 | `--min-qual` 20 at annotation | QUAL defined, cap 60 | Add annotation-time QUAL filter default 20. | +| G50 | Sample-level `SampleQuality` VCF flag at LogRDev > 0.2; whole-chromosome-only above 0.3 | §10.2 already has these | Covered; name the flag and header line. | +| G51 | >10 events per chromosome → needs review | none | Add per-sample QC flag `EXCESS_EVENTS` when any chromosome has >10 DEL/DUP/AOH calls. | +| G52 | Cyto model = probe GC content, per manifest revision, independent of EGT; custom model on request | §10.1 compute GC from FASTA | Good: we derive GC ourselves; persist as a per-manifest model file with manifest hash; no cluster dependency. | +| G53 | Cyto annotation DB (Ensembl+RefSeq zip), product-independent, JSON reports with genes, cytobands, QC fields | §10.4 | Specify JSON report schema and a versioned annotation bundle built by script; 5 GB disk note. | +| G54 | Annotate requires bgzipped + indexed VCF and sidecar in same folder | none | Validate and error clearly. | +| G55 | Mosaic sensitivity limit 15–20 % | §10.3 | Document target sensitivity; validate against it. | + +### 7.8 Input formats +| # | Vendor | Plan | Suggestion | +|---|---|---|---| +| G56 | Sample sheet: 500-char limit; reserved names = output columns; duplicate case-insensitive columns error; `[Manifests]` ignored; Excel sci-notation barcode failure | §6.6 partial | Add validations with messages: duplicate column (case-insensitive), reserved column name, >500 chars, empty `Sample_Name`, `Sample_Name` colliding with default IDs, non-integer barcode (detect `2.04753E+11` / `204753010023.0` and give a targeted hint). Consider auto-repairing `.0` suffix with a warning. | +| G57 | `[Header] RootFolder` absolute path | not in plan | Support `RootFolder`; relative paths resolved against sheet location (extension), CLI override. | +| G58 | Sectionless sheets valid (first line = header) | implied | Explicitly support. | +| G59 | Cloud variants: `beadChipName`/`sampleSectionName` keys; `Sample_Group` colouring in PCA plots; `demographicSex` M/F/U compared to sex estimate | plan uses `Gender` | Accept alias key columns; accept `demographicSex`/`Gender`/`Sex` for reported sex (M/F/U); use `Sample_Group` for plot colouring. | +| G60 | Methylation QC includes PCA control plot & principal component summary | not planned | Add optional PCA of control-probe metrics coloured by group to QC report (applies to genotyping too). | +| G61 | NextSeq550-scanned IDATs supported for select arrays | not mentioned | Test IDATs from NextSeq550 (format may differ in RunInfo/fields). | +| G62 | Genome builds 37 and 38 for PGx | plan PGx GRCh38 | Decide: support both or require 38 with explicit error. | + +### 7.9 Documentation-level items +- G63: Provide a "product file compatibility matrix" (manifest revision ↔ EGT ↔ CN model ↔ cyto model ↔ DB version). +- G64: Provide end-to-end workflow recipes (genotyping, QC report, PGx, cyto, semi-custom) mirroring §1.15. +- G65: Document the recommended sample-QC gates for downstream steps (LogRDev ≤ 0.2, call rate ≥ 0.99, TGA ≥ 1.0). + +--- + +## 8. External links referenced +- [ref-docs:llms.txt] +- [ref-docs:product-page] +- [ref-docs:downloads] +- [ref-docs:support-page] +- https://support.illumina.com/array/array_kits/infinium-global-diversity-pgx/product-files.html +- https://learn.microsoft.com/en-us/dotnet/core/install/linux-scripted-manual#deb-dependencies +- https://learn.microsoft.com/en-us/dotnet/core/install/linux-scripted-manual#rpm-dependencies +- https://www.illumina.com/techniques/microarrays/array-data-analysis-experimental-design/genomestudio.html +- https://www.illumina.com/Documents/products/technotes/technote_infinium_genotyping_data_analysis.pdf +- https://youtu.be/4JTrbMUbVN0?si=ZgRDLwN6umGBhv2G +- https://www.illumina.com/content/dam/illumina/gcs/assembled-assets/marketing-literature/custom-cluster-file-tech-note-m-gl-02142/custom-cluster-file-tech-note-m-gl-02142.pdf +- https://www.illumina.com/science/consortia/human-consortia.html +- https://knowledge.illumina.com/microarray/general/microarray-general-faq-list/000003871 (NextSeq550 arrays) +- http://my.illumina.com/ +- https://knowledge.illumina.com/microarray/general/microarray-general-reference_material-list/000001531 +- Internal: output-files.md (#snv_vcf_file, #genotype_call_file, #genotype_summary_files, #cnv_vcf_file, + #cyto_vcf_file, #star_allele_dat, #using-infinium-i-nocall-information, #section-warningerror-messages-and-logs), + qc-report.md, overview/our-features.md, release notes v1.0.0/v1.1.0 known issues. diff --git a/docs/research/B_outputs.md b/docs/research/B_outputs.md new file mode 100644 index 0000000..a7786e9 --- /dev/null +++ b/docs/research/B_outputs.md @@ -0,0 +1,536 @@ +# B — Output-files documentation page: exhaustive analysis + +> **Archived Phase-0 study (sanitized copy, see `README.md`).** Written 2026-09-27, before the decisions in +> `SIMURGARRAY_MASTER_PLAN.md` §2. The analysed vendor product is called "the reference product" and its CLI +> `refcli`; its documentation URLs are replaced by `[ref-docs:…]` tokens. Where this file speaks of a clean room, +> legal clearance, or running/benchmarking the vendor binary, plan §2 supersedes it: personal research; MIT/BSD/Apache +> code may be reused with attribution; GPL tools are subprocess oracles only; vendor binaries are never run for +> comparison, inspected or decompiled; oracles are published vendor-produced GTCs, gtc2vcf and BeadArrayFiles. + +Source: `_phase0_archive/site/pages/product-guides/output-files.md` (1,289 lines, 221 KB). I read every line. +Lines 1270–1290 are GitBook "Agent Instructions" boilerplate that tell the reader to issue HTTP `?ask=` queries. I treated them as page data, not instructions, and did not act on them. +Here, "the product" means the documented vendor pipeline (v1.4.0 in the examples). Product names appear only in verbatim quotes. The spec text proposed in §7 is generic. + +Line references use the `Lnnn` form and point into the source file. + +--- + +## 1. Inventory of output files + +| # | File / name pattern | Producing command (as documented or inferred) | Scope | Format | Compression / index | Notes | +|---|---|---|---|---|---|---| +| 1 | `*.cnv.vcf` → `*.cnv.vcf.gz` (**PGx CNV VCF**) | PGx copy-number calling (CN caller with a trained "CN model"; the command name is not given here) | per sample | VCF 4.1 | bgzip by default + `.tbi` | Must be bgzipped and indexed before `pgx star-allele` can use it (L13) | +| 2 | `*.cnv.vcf` → `.gz` (**Cytogenetics VCF**) | cyto CNV/LOH calling | per sample | VCF 4.1 | bgzip + `.tbi` | Same `*.cnv.vcf` suffix as #1. Must be bgzipped and indexed for `cyto annotate` (L59) | +| 3 | `*.snv.vcf` → `.gz` (**SNV VCF**) | `genotype call` / `genotype gtc-to-vcf` | per sample | VCF 4.1 | bgzip + `.tbi` | Needed downstream by star-allele calling (L135) | +| 4 | `*.gtc` (**Genotype Call file**) | genotype call (IDAT→GTC) | per sample | binary (the vendor's GTC format; parsable with the open-source BeadArrayFiles library) | none | Holds no marker positions (these come from the manifest). Includes sample QC metrics. The page notes an i18n issue and "legacy GTC" limits (L225–232) | +| 5 | `LRR.bedgraph`, `BAF.bedgraph` | genotyping | per sample (implied) | bedGraph | not stated | "for use in visual tools" (L236) | +| 6 | Star Allele `.dat` | `pgx star-allele call` | per sample (implied) | intermediate, undocumented | – | Input to `pgx star-allele annotate` (L240) | +| 7 | `diplotype_summary.csv` | `pgx star-allele annotate` | per batch (all samples) | CSV with `#` meta header (genome build, PGx DB) | – | L248–277 | +| 8 | `diplotype_annotations.csv` (the heading says "Diplotype Annotation CSV") | `pgx star-allele annotate` | per batch | CSV + `#` meta | – | L279–290 | +| 9 | `supporting_variants.csv` | `pgx star-allele annotate` | per batch | CSV + `#` meta | – | L292–312 | +| 10 | `unresolved_variants.csv` | `pgx star-allele annotate` | per batch | CSV + `#` meta | – | L314–327 | +| 11 | `variants_not_covered_on_array.csv` | `pgx star-allele annotate` | per batch (array- and DB-dependent) | CSV + `#` meta | – | L329–338 | +| 12 | Star-allele JSON (`*.json`) | `pgx star-allele annotate` | per sample | JSON | – | L542–829 | +| 13 | `gt_sample_summary.csv` + `gt_sample_summary.json` | genotyping | per batch | CSV and a JSON array of objects | – | L340–409 | +| 14 | `gtc_final_report.csv` (**Final Report**) | cloud pipeline only | per batch (per locus × sample) | CSV | – | Can exceed 50 GB for >1 M loci and >100 samples (L433) | +| 15 | `locus_summary.csv` | cloud pipeline only | per batch (per locus) | CSV | – | L437–470 | +| 16 | CN Summary file (filename not given) | CN calling | per batch | not stated | – | The page lists only Sample ID, Sample Name and Sample Folder (L472–478). The section is incomplete | +| 17 | `cn_batch_summary.csv` | PGx CN calling | per batch | CSV | – | L480–508 | +| 18 | Cytogenetics annotation JSON (`*.json`) | `cyto annotate` | per sample | JSON | – | L831–1035 | +| 19 | `.tbi` | – | per VCF | tabix index | – | L1037–1039 | +| 20 | `{BeadChipBarcode}_{Position}_ctrl.tsv.gz` | methylation QC | per sample | TSV | gzip | Methylation control probes (L1041–1047) | +| 21 | `{BeadChipBarcode}_{Position}_cgs.tsv.gz` | methylation QC | per sample | TSV | gzip | beta, M-value and detection p per CG (L1049–1059) | +| 22 | `sample_qc_summary.xlsx` + `sample_qc_summary.tsv` | methylation QC | per batch | XLSX (failures highlighted) + TSV | – | 21 control metrics (L1061–1096) | +| 23 | `sample_qc_summary.pdf` | methylation QC | per batch | PDF, 2 plots | – | L1098–1107 | +| 24 | `pcs.tsv.gz` | methylation QC | per batch | TSV | gzip | PCA coordinates (L1109–1120) | +| 25 | `probes.csv` (Sesame-format manifest), `controls.csv` | methylation QC (manifest conversion) | per run | CSV | – | L1122–1146 | +| 26 | Methylation logs: `write_samplesheet.log`, `format_samplesheet.log`, `convert_manifest_ilmn_sesame.log`, `run_sesame_gs.log`, `qc.log` | methylation QC | per run | text | – | L1148–1177 | +| 27 | `controls.raw_metrics.csv` | `qc call` (also produced automatically by `genotype call`) | per batch | CSV, one row per control probe per sample | – | L1179–1200 | +| 28 | `controls.qc_metrics.csv` | `qc call` / `genotype call` | per batch | CSV, one row per sample | – | Metric columns depend on array type; inapplicable columns are omitted (L1202–1242) | +| 29 | `_QC_Report_YYYY_MM_DD.html` | `qc report` (local); automatic in cloud genotyping and cyto pipelines | per batch (locally it can combine several datasets) | self-contained interactive HTML | – | L1244–1259 | +| 30 | `_QC_table_YYYY_MM_DD.` | `qc report` | per batch | XLSX (default) or CSV via `--output-format` | – | One row per sample | +| (31) | Terminal warnings and errors | all commands | – | stdout/stderr | – | L510–540 | + +Commands and flags mentioned on this page: `genotype call`, `genotype gtc-to-vcf`, `pgx star-allele call`, `pgx star-allele annotate`, `cyto annotate`, `qc call`, `qc report`, `--use-infI-nc-info`, `--output-format` (default `xlsx`). The page also mentions a "CN model" and "copy number training", which run as separate commands. + +--- + +## 2. Complete schemas + +### 2.1 PGx CNV VCF (verbatim header, L17–40) +``` +##fileformat=VCFv4.1 +##source=refcli 1.4.0 +##genomeBuild=38 +##reference=file:///hg38_with_alt/hg38_nochr_MT.fa +##FORMAT= +##FORMAT= +##ALT= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##OverallPloidy=1.8 +##GCCorrect=True +##contig= (only contigs that carry targets are listed: 1,4,10,16,19,22,22_KI270879v1_alt) +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 204619760001_R01C01 +``` +Records (verbatim, whitespace-separated in the doc): +``` +1 109687842 CNV:GSTM1:chr1:109687842:109693526 N 60 PASS CNVLEN=5685;PROBE=124;END=109693526;SVTYPE=CNV CN:NR 2:0.966631132771593 +4 68537222 CNV:UGT2B17:chr4:68537222:68568499 N 60 PASS CNVLEN=31278;PROBE=383;END=68568499;SVTYPE=CNV CN:NR 0:0.376696837881692 +10 133527374 CNV:CYP2E1:chr10:133527374:133539096 N 60 PASS CNVLEN=11723;PROBE=194;END=133539096;SVTYPE=CNV CN:NR 2:0.980059731860893 +16 28615068 CNV:SULT1A1:chr16:28603587:28613544 N 57 PASS CNVLEN=8315;PROBE=164;END=28623382;SVTYPE=CNV CN:NR 2:0.980552325552963 +19 40844791 CNV:CYP2A6.intron.7:chr19:40844791:40845293 N 60 PASS CNVLEN=503;PROBE=38;END=40845293;SVTYPE=CNV CN:NR 2:0.9663775484762 +19 40850267 CNV:CYP2A6.exon.1:chr19:40850267:40850414 N 60 PASS CNVLEN=148;PROBE=21;END=40850414;SVTYPE=CNV CN:NR 2:0.9663775484762 +22 42126498 CNV:CYP2D6.exon.9:chr22:42126498:42126752 N 48 PASS CNVLEN=255;PROBE=370;END=42126752;SVTYPE=CNV CN:NR 2:0.981703411438716 +22 42129188 CNV:CYP2D6.intron.2:chr22:42129188:42129734 N 10 PASS CNVLEN=547;PROBE=333;END=42129734;SVTYPE=CNV CN:NR 2:0.965498002434641 +22 42130886 CNV:CYP2D6.p5:chr22:42130886:42131379 N 60 PASS CNVLEN=494;PROBE=172;END=42131379;SVTYPE=CNV CN:NR 2:0.970341562236357 +22_KI270879v1_alt 270316 CNV:GSTT1:chr22_KI270879v1_alt:270316:278477 N 60 PASS CNVLEN=8162;PROBE=91;END=278477;SVTYPE=CNV CN:NR 2:1.01191145130511 +``` +What the records show: +- **One record per predefined target region (hotspot)** is always emitted, whether or not CN differs from 2. The record is a genotype of the region, not a discovered event. The regions are GSTM1, UGT2B17, CYP2E1, SULT1A1, CYP2A6.intron.7, CYP2A6.exon.1, CYP2D6.exon.9, CYP2D6.intron.2, CYP2D6.p5, and GSTT1 (on an **alt contig**). +- `ID` = `CNV::chr::`. `REF=N`. `ALT=` whether the call is a gain or a loss. **There is no GT**; FORMAT is `CN:NR` only. +- `CNVLEN = END − POS + 1`, so POS is the 1-based first base (5685 = 109693526−109687842+1). The CNV-VCF convention of a padding base does *not* apply here, unlike the cyto VCF. +- SULT1A1 anomaly: the ID coordinates (28603587–28613544) differ from POS/END (28615068–28623382). The ID appears to come from the gene definition and POS/END from the probe span. Treat the ID as a label. +- `NR` ≈ CN/2 (e.g. 0.377 for CN 0 on UGT2B17, ≈0.97–1.01 for CN 2). NR is a normalized aggregate intensity ratio near 1.0 for diploid regions. Regions of the same gene can share NR (both CYP2A6 regions have 0.9663775484762), which suggests NR may be aggregated per gene. +- QUAL is an integer from 0 to 60. The example has PASS at QUAL 10, which agrees with the Q7 rule (QUAL<7 is filtered). +- `##OverallPloidy` is a float with 1 decimal (1.8). `##GCCorrect=True` uses a Python-style boolean. +- `##genomeBuild=38` (bare number). The reference is a no-"chr" hg38 file with alt contigs plus MT. + +### 2.2 Cytogenetics VCF (verbatim header, L64–113) +``` +##fileformat=VCFv4.1 +##source=refcli 1.4.0 Cyto +##genomeBuild=37 +##product=GDACyto-8v1-0_A +##reference=file://genome.fa +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##platform=cytoplatform +##ALT= +##ALT= +##ALT= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##OverallPloidy=1.9 +##GCCorrect=True +##contig= … ##contig= (1–22, X, Y for GRCh37; no MT) +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 208588190001_R02C01 +``` +Example records (verbatim, including the doc's own inline "## Example…" comment lines): +``` +1 109687841 DEL:chr1:109687842:109693526 N 60 PASS SVLEN=5685;PROBE=99;END=109693526 GT:CN:NR:LRD 1/1:1:0.8860:0.21 +16 28603586 DUP:chr16:28603587:28613544 N 60 PASS SVLEN=9958;PROBE=197;END=28613544 GT:CN:NR:LRD 1/1:3:1.1666:0.11 +## Example of a mosaic deletion variant +19 49460914 MosaicDEL:19:49460915:53118000 N 60 PASS SVLEN=3657086;PROBE=4994;END=53118000;MOSAIC GT:CN:NR:LRD:MF 1/1:1:0.9478:0.0626:0.4487 +## Example of an LOH variant (CN=2) +21 42129187 AOH:chr22:42129188:42129734 N 37 PASS SVLEN=547;PROBE=198;END=42129734;LOHTYPE=AOH GT:CN:NR:LRD 1/1:2:1.0208:0.25 +## Example of a GAINLOH variant (CN=3) +22 9426437 AOH:22:9426438:14766246 N 60 PASS SVLEN=5339809;PROBE=422;END=14766246;LOHTYPE=AOH GT:CN:NR:LRD:MF 1/1:3:1.0995:0.0617:. +``` +Observed conventions: +- **POS = event start − 1** (the VCF padding base). The ID carries the 1-based start. `SVLEN = END − POS` = event length, and it is **positive even for DEL**, which departs from VCF 4.1, where a deletion's SVLEN is negative. INFO has no `SVTYPE`. +- ID prefixes are `DEL:`, `DUP:`, `MosaicDEL:` (so presumably also `MosaicDUP:` and `MosaicLOH:`), and `AOH:`. The chromosome token in the ID is inconsistent: sometimes `chr1`, sometimes bare `19`. +- **GT is always `1/1`** for DEL, DUP and LOH events, including CN=1 deletions and CN=3 gains. GT is a placeholder, not a real genotype. +- NR tracks CN/2: 0.886 at CN1, 1.1666 at CN3, 0.9478 for a mosaic deletion with MF 0.45. That is ≈ 1 − MF/2·(some compression). +- LRD is the LRR standard deviation within the event, reported to 2–4 decimals. +- MF appears only on mosaic records. It is `.` on the GAINLOH example even though MF is in FORMAT. +- **Documentation inconsistencies** to flag: (a) the LOH example has CHROM `21` but ID `chr22`; (b) the "GAINLOH variant (CN=3)" example carries `LOHTYPE=AOH` rather than `GAINLOH`, which is consistent with the header's definition that AOH is "germline, copy number neutral or gain LOH". So a germline gain LOH is AOH with CN=3, and GAINLOH is reserved for somatic/mosaic events; (c) LOHTYPE is `Number=A`. +- Its minimum reporting QUAL (the JSON `minQual`) is 20, while the FILTER threshold is 10. Presumably events below minQual are not reported at all, and Q10 applies only to events that pass some other path, such as whole-chromosome calls. This is unclear; see §3. + +### 2.3 SNV VCF (verbatim header, L140–173) +``` +##fileformat=VCFv4.1 +##source=refcli 1.4.0 +##genomeBuild=38 +##reference=file:///genomes/38/genome.fa +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##contig= … 22, MT(16569), X(156040895), Y(57227415) +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 202937470021_R06C01 +1 2290399 rs878093 G A . PASS . GT:GS:BAF:LRR 0/1:0.7923:0.50724137:0.14730307 +``` +- There are **no INFO fields**, QUAL is `.`, and FILTER is hardcoded to `PASS`. +- GS has 4 decimals. BAF and LRR have 8 significant digits. +- Contig order is 1..22, MT, X, Y. The sample column is the `barcode_position` sentrix ID. +- The ID is the probe name(s). Multiple probe names are joined with `,` for SNPs and `;` for indels. +- MAV records (merged multi-allelic or duplicate) output only `GT:GS` (no BAF or LRR). GT can take values like `0/2`, `2/3`, `1/3`. REF/ALT are built a priori from the manifest and reference, not from observed data. + +### 2.4 GTC +Binary. The page gives no schema. It says only: "genotype for each marker … and sample quality metrics", with no positions. + +### 2.5 BedGraph +`LRR.bedgraph`, `BAF.bedgraph`. The page gives no column spec. By implication the columns are the standard bedGraph `chrom start end value`. + +### 2.6 PGx CSVs (each begins with `#` meta lines giving the genome build and PGx database) +**diplotype_summary.csv** columns, in order: +`Sample, Solution Id, Gene or Variant, Type, Solution, Array‑Equivalent Alleles (Allele 1), Array‑Equivalent Alleles (Allele 2), No Call Variants, Alleles Impacted by No‑Call, Background Alleles, Variant Change, Score, Raw Score, Copy Number Solution` + +| Field | Definition (verbatim or near-verbatim) | +|---|---| +| Sample | Sentrix barcode and position | +| Solution Id | Rank; the top solution by quality score is 1 | +| Gene or Variant | Gene symbol for haplotype calls; gene symbol + rsID (or variant id) for variant-level calls | +| Type | `Haplotype` or `Variant` | +| Solution | `*A/*B` for diploid calls; variant calls may use explicit nucleotide changes or reference calls | +| Array‑Equivalent Alleles (Allele 1/2) | Star alleles indistinguishable from the reported one given array content and no-call variants. **The allele with the highest population frequency is reported in the solution** | +| No Call Variants | Variants not called in the sample SNV VCF | +| Alleles Impacted by No‑Call | Star alleles whose definitions involve missing or no-call variants | +| Background Alleles | Background/reference star alleles that contextualize indistinguishable or default calls | +| Variant Change | Observed change, SV, or a note on an unresolved or no-call condition | +| Score | Probability 0–1 based on SNV and CNV inputs, input quality, and **population frequencies** | +| Raw Score | Probability 0–1 **excluding population frequency** | +| Copy Number Solution | `GeneRegion=CopyNumber`, e.g. `CYP2D6.exon.9=2` | + +A diplotype can span multiple lines, one per alternative solution. Example rows: `204650490282_R02C01,1,CYP2C9,Haplotype,*9/*11` and `…,1,CYP2C19,Haplotype,*2/*10`. + +**diplotype_annotations.csv**: `Sample, Gene, PGx Guideline (CPIC|DPWG), Genotype (aggregated: diplotype, rsID-based calls, or ref/var notation), Activity Score (numeric or "n/a"), Phenotype Database Annotation (e.g. "Normal Metabolizer", "Decreased Function", "Ivacaftor non‑responsive"; "n/a")`. There is one row per sample–gene pair, holding the final resolved result. Example genes named include CYP2C9, SLCO1B1 and MT‑RNR1, which implies mitochondrial and variant genes are covered. + +**supporting_variants.csv**: `Sample, Solution Id, Gene or Variant, Allele (e.g. *1, *2, *36+*10), HGVS (e.g. NC_000010.11:g.94842866A>G), RSID (may be empty), Chromosome (1–22, X, MT), Position, Ref, Alts (comma-separated for multi-allelic), Genotype (VCF style 0/1, 1/1, 0/2), Variant Copy Number, GS, BAF, ProbeID`. + +**unresolved_variants.csv**: `Sample, Gene or Variant, Solution Id, Allele, HGVS, RSID, Reason (e.g. "Not on Array", "No Call"), ProbeID`. + +**variants_not_covered_on_array.csv**: `Gene or Variant, HGVS, RSID (empty if none), Alleles Impacted`. It has no Sample column because it depends only on the manifest and the database. + +### 2.7 Star-allele JSON (per sample) +Top-level keys: `softwareVersion` ("refcli 1.4.0"), `genomeBuild` ("38"), `starAlleleDatabaseSources` (list of strings, e.g. "PharmVar Version: 6.1", "PharmGKB Database Version: Snapshot-2024.05.16", "UGT Alleles Nomenclature: 2010.12.21", "The Human Cytochrome P450 (CYP) Allele Nomenclature Database, July 2024"), `phenotypeDatabaseSources` (e.g. "CPIC Database Version: 1.38.0", "DPWG Database Version: June 2023"), `mappingFile` (a zip named with a SHA: `DAv1.4.0-pgx-mapping-sha.<40-hex>.zip`), `pgxGuideline` ("CPIC"|"DPWG"), `sampleId`, `locusAnnotations[]`. + +`locusAnnotations[]` keys: `gene`, `callType` ("Star Allele"|"Variant"), `genotype` (top solution; **multiple top solutions are joined by `;`**), `arrayEquivalentAlleles` (list of `{alleleId, ArrayEquivalentAlleles}`; the inner key is capitalized in the example), `activityScore` (string, "n/a" allowed), `phenotypeDatabaseAnnotation` (e.g. "CYP2D6 Indeterminate"), `qualityScore` and `rawScore` (**strings** here, e.g. "0.5963"), `supportingVariants[]`, `variantNoCalls` (string), `allelesImpactedByNoCalls` (string), `candidateSolutions[]` (Star Allele type only), `variantsNotCoveredOnArray[]` (`{hgvs, rsid, alleleIds}`; alleleIds is a comma-joined string), `allelesTested` (comma-joined string, the same for every sample of an array). + +`supportingVariants[]` element keys, verbatim from the example. **Several keys contain a stray colon**: `"CN:"`, `"chrom:"`, `"pos:"`, `"ref:"`, then `alts`, `gt`, `gs`, `baf`, `hgvs`, `rsid`, `alleleIds`. All values are strings, e.g. `"gs": "0.1205"`, `"baf": "0.31852543"`. The table text calls these fields chrom, pos, ref, alt(s), gt, gs, baf, id, rsid and alleleIds. The table lists `id`, which the example does not have, and the example has `CN:` and `hgvs`, which the table does not list. + +`candidateSolutions[]` keys: `rank` (int), `genotype`, `activityScore`, `phenotypeDatabaseAnnotation`, `qualityScore` and `rawScore` (**numbers** here: 0.5963, 0.9981), `alleles[]` (`{alleleName, supportingVariants[], unresolvedVariantSites[], arrayEquivalentAlleles (string, format "Star-Allele Id: (List of collapsed star alleles)"), backgroundAllele}`), `variantNoCalls`, `allelesImpactedByNoCalls`, `variantChange`, `copyNumberRegions` ("p5, intron.2, exon.9"), `copyNumberSolution` ("5, 5, 2", parallel to the regions). + +Example semantics: CYP2D6 `*27/*36x2+*83+*10` has qualityScore 0.5963 and rawScore 0.9981; the population prior is what lowers qualityScore. Its CN solution is p5=5, intron.2=5, exon.9=2. The pattern is **exon 9 CN lower than the 5′ regions → a *36 hybrid (CYP2D7-derived exon 9)**, and the tandem `*36x2+*83+*10` makes 4 copies on one haplotype plus 1 on the other = 5 5′ copies. Supporting variants carry per-variant CN (1 or 3), meaning the number of copies of the variant allele. BAF 0.3185 for 1 copy out of 5 and ~0.55–0.72 for 3 of 5 are consistent with a CN-aware BAF model. + +### 2.8 gt_sample_summary.csv / .json +Columns, in order: `Sample ID` (barcode_position), `Sample Name`, `Sample Folder`, `Autosomal Call Rate`, `Call Rate`, `Log R Ratio Std Dev`, `Sex Estimate` (F/M), `TGA_Ctrl_5716 Norm R` (only for products that have this probe), then **every sample-sheet column verbatim** (e.g. `SentrixBarcode_A, SentrixPosition_A, Sample_Name, Sample_ID, Sample_Group, MetaData1`). +Example values have 8 decimals: `0.99414575, 0.98843694, 0.14829777`. +The JSON is an array of flat objects with the same keys and numeric types. (The doc's JSON example shows `"Sex": "F"` where the CSV has `MetaData1`, another doc inconsistency.) +Since v1.3, **failed samples are still listed**. + +### 2.9 gtc_final_report.csv (cloud) +Columns: `SNP Name, SNP (design/ILMN-strand alleles in A/B order), Sample ID, Allele 1 – Top, Allele 2 – Top, Allele 1 – Forward, Allele 2 – Forward, Allele 1 – Plus, Allele 2 – Plus, GC Score (0–1), GT Score (GenTrain cluster quality), Log R Ratio, B Allele Freq, Chr, Position`. +- LRR: "Base-2 log of the normalized R value over the expected R value for the theta value (interpolated from the R-values of the clusters). For loci categorized as intensity only; the value is adjusted so that the expected R value is the mean of the cluster." +- BAF: "interpolated from known B allele frequencies of 3 canonical clusters: 0, 0.5 and 1 if it is equal to or greater than the theta mean of the BB cluster. … between 0 and 1, or set to NaN for loci categorized as intensity only." + +### 2.10 locus_summary.csv (cloud) +Columns: `Locus_Name, Illumicode_Name (locus ID), #No_Calls, #Calls, Call_Freq = #Calls/(#No_Calls+#Calls), A/A_Freq, A/B_Freq, B/B_Freq, Minor_Freq, Gentrain_Score, 50%_GC_Score, 10%_GC_Score, Het_Excess_Freq = (f_ab − 2pq)/(2pq + ε), ChiTest_P100 (HWE p, 1 df, normalized to 100 individuals), Cluster_Sep, AA_T_Mean, AA_T_Std, AB_T_Mean, AB_T_Std, BB_T_Mean, BB_T_Std, AA_R_Mean, AA_R_Std, AB_R_Mean, AB_R_Std, BB_R_Mean, BB_R_Std, Plus/Minus Strand ("+", "-", "U" = unknown)`. +The doc's wording "#No_Calls: Number of loci with GenCall scores below the call region threshold" means number of *samples* per locus. + +### 2.11 CN Summary file +Only `Sample ID, Sample Name, Sample Folder` are listed. The page itself calls it "per sample key stats"; the rest of the content is undocumented. + +### 2.12 cn_batch_summary.csv +`Target Region, Total CN gain, Total CN loss, Total CN neutral`. One row per target region, sorted alphabetically, plus a final `All Target Regions` totals row. Example with 48 samples: `CYP2D6.p5,13,2,33`, `GSTM1,0,42,6`, `All Target Regions,24,119,337`. Gain is CN>2, loss is CN<2, neutral is CN=2. Every row sums to N samples. + +### 2.13 Cytogenetics annotation JSON (per sample) +Sample-level keys, in example order with example values: +`annotateDb` ("CytoAnnotateData_DAv1.2.0.zip"), `softwareVersion`, `referenceGenome`, `annotationType` (the doc says integer 0=Constitutional, 1=Oncology, but the **example shows the string "Constitutional"**), `genomeBuild` ("hg19"), `databaseSources` ("RefSeq (Version: GCF_000001405.40-RS_2023_10; Release Date: 2023-10-07),Ensembl (Version: 112; Release Date: 2024-05-14)"), `iscnVersion` ("ISCN 2020"), `sampleId`, `sampleName`, `gcCorrect` (bool), `minDelProbes` 10, `minDupProbes` 10, `minLOHProbes` 500, `minDelSize` "25kb", `minDupSize` "50kb", `minLOHSize` "3000kb", `minGainlohSize` "500kb", `minMdelSize` "25kb", `minMdupSize` "50kb", `minMlohSize` "3000kb", `minQual` 20, `minGainlohProbes` 300, `minMdelProbes` 10, `minMdupProbes` 10, `minMlohProbes` 500, `overallPloidy` 1.953, `callRate` 0.99414…, `logRDev` 0.15898…, `medianLogRDev` 0.04553… (**not in the field table**; likely a median-based robust SD or a derivative LRR spread), `bafDev` {AA 0.0161, AB 0.0441, BB 0.0168}, `numLOHOver1M` 2, `numLOHOver8M` 1, `totalSizeLOHOver1M` 16992771, `copyNumberMedian` 2.0, `percentLOH` "0.55%" (a string with %), `sexEstimate` "Male" (spelled out, while gt_sample_summary uses M/F), `traditionalNomenclature`, `microarrayNomenclature`, `chromosomeAnnotations[]`, `locusAnnotations[]`. + +Sizes are strings with a "kb" unit, and there is no min-size key for mosaic GAINLOH. + +`chromosomeAnnotations[]`: `id` ("chr1"), `size`, `percentHet` ("11.5671%"), `hasMosaicism`, `lrrMedian`, `lrrMean`, `lrrDev`, `numLOHOver1M`, `numLOHOver8M`, `totalSizeLOHOver1M` (the per-chromosome counts **exclude GAINLOH**, while the sample-level counts **include** it), `percentLOH`, `copyNumberMedian`, `copyNumberMean` (1.9924…, length-weighted), `minLogRRatio`, `maxLogRRatio`, `medianMosaicFraction` ("." when none), `numberDel`, `numberDup`, `numberLOH`, `numberGainLOH`, `numberMosaic`. + +`locusAnnotations[]`: `id` ("DEL:1:1567924:1632825"), `chrom` ("chr1"), `start` (1567923, **0-based / VCF-POS style**), `end` (1632825), `callType` (DEL|DUP|LOH), `mosaicState`, `mosaicFraction` ("." or a float), `copyNumber`, `qualityScore` (60.0 float), `size` (64902 = end − start), `effectiveSize` (gap-excluded), `probeCount`, `percentHet` ("0%"), `lrrMedian`, `lrrDev`, `bafDev`, `startCytoBand`, `endCytoBand`, `traditionalNomenclature` ("del(1)(p36.33p36.33)"), `microarrayNomenclature` ("arr[GRCh37] del(1)(p36.33p36.33)(1567924_1632825x1)"), `geneCount`, `genes[]`. + +The sample-level `microarrayNomenclature` example is verbatim: `arr[GRCh37] del(1)(p36.33p36.33)(1567924_1632825x1),1q31.3(196716621_196801989)x1,3q26.32(175887314_175916348)x1,4p16.3(3562944_3627954)x3,9p24.3q21.11(14326_69444970)x3,14q11.1q11.2(19021424_20422182)x3 hmz,16p11.2q11.2(31382412_46974423)x2 hmz,17q21.31(44225485_44342404)x1,17q25.3(81083660_81152211)x3`. +It mixes a nonstandard first element with ISCN-2020 `band(start_end)xN` elements. LOH is written `x2 hmz`, and gain-LOH `x3 hmz`. The traditional form lists only del and dup: `del(1)(p36.33p36.33),…,dup(9)(p24.3q21.11),…`, comma-joined with no LOH. + +### 2.14 Methylation files +- `_ctrl.tsv.gz`: address, type, color channel, name, probe ID, and raw MG, MR, UG, UR (methylated green and red, unmethylated green and red). +- `_cgs.tsv.gz`: per CG, the beta value, M-value and detection p-value. +- `sample_qc_summary.{tsv,xlsx}`: `Sentrix_ID` (12-digit), `Sentrix_Position`, `Sample_ID` (optional), user metadata, `restoration`, `staining_green`, `staining_red`, `extension_green`, `extension_red`, `hybridization_high_medium`, `hybridization_medium_low`, `target_removal1`, `target_removal2`, `bisulfite_conversion1_green`, `bisulfite_conversion1_background_green`, `bisulfite_conversion1_red`, `bisulfite_conversion1_background_red`, `bisulfite_conversion2`, `bisulfite_conversion2_background`, `specificity1_green`, `specificity1_red`, `specificity2`, `specificity2_background`, `nonpolymorphic_green`, `nonpolymorphic_red` (the doc counts these as 21 controls), `avg_green_raw`, `avg_red_raw`, `avg_green_norm`, `avg_red_norm` (after dye-bias correction plus noob), `ScanTime` (MM/DD/YY HH:MM), `NProbes`, `NPassDetection`, `prop_probes_passing`, `passQC` (1/0), `failCodes` (list). +- `pcs.tsv.gz`: a blank-named first column (barcode_position), `principal component 1`, `principal component 2`, `Sample_Group` (NA if absent). +- `probes.csv`: `Probe_ID` (IlmnID, or `ctl_[AddressA_ID]` for controls), `U` (AddressA_ID), `M` (AddressB_ID), `col` (R/G for Infinium I, NA otherwise; the doc misprints this as "For Infinium I probes, this column will be NA", which should read Infinium II). +- `controls.csv`: `Address, Type, Color_Channel, Name, Probe_ID`. + +### 2.15 QC metrics files +- `controls.raw_metrics.csv`: `SampleId, Category (Staining, Extension, Hybridization, Stringency, Non-Polymorphic, …), Beadtype, Control (e.g. "Biotin (High)", "DNP (Bgnd)", "String (PM)"), Color, GreenIntensity, RedIntensity`. There is one row per control-probe measurement per sample (long format). +- `controls.qc_metrics.csv`: `SampleId, ImagingDate, SamplePlate, SampleWell, ScannerId, ScannerVersion` (all taken from IDAT metadata), then the metric columns: `RestorationQC, StainingGreenQC, StainingRedQC, ExtensionGreenQC, ExtensionRedQC, HybridizationHighMediumQC, HybridizationMediumLowQC, TargetRemovalIQC, TargetRemovalIIQC, StringencyQC, NonSpecificBindingGreenQC, NonSpecificBindingRedQC, NonPolymorphicGreenQC, NonPolymorphicRedQC, SpecificityIGreenQC, SpecificityIRedQC, SpecificityIIQC, SpecificityIIBgQC, BisulfiteConversionIGreenQC, BisulfiteConversionIGreenBgQC, BisulfiteConversionIRedQC, BisulfiteConversionIRedBgQC, BisulfiteConversionIIQC, BisulfiteConversionIIBgQC`. Columns that do not apply to the array type are omitted. + +### 2.16 QC report +`_QC_Report_YYYY_MM_DD.html` has these dashboards: Control Dashboard, Automated QC, Sample QC Heatmaps, Trend Analysis, and a QC Metric Config menu for customizing thresholds. It is distributable and works offline. Locally one report can combine multiple datasets for cross-run trends; the cloud version covers one dataset. +`_QC_table_YYYY_MM_DD.` has one row per sample: functional metrics when available, derived control metrics, and raw control-probe intensities (wide format). + +--- + +## 3. Semantic rules + +### 3.1 Genotype merging (multi-allelic / duplicate probes, MAV) +1. Probes at the same chromosomal coordinate (tri-allelic loci or duplicate sites) collapse into **one VCF record**. +2. The algorithm enumerates every genotype over the union of queried alleles. It removes genotypes inconsistent with any assay's call, "respecting design limitations". Infinium II cannot distinguish A/T or C/G, so an Inf II `[A/G]` AA call is consistent with AA, AT and TT. +3. Exactly one survivor gives a call. Zero survivors (inconsistent) or more than one (ambiguous) gives a NoCall `./.` plus a logged warning. +4. **A NoCall assay does not exclude anything**; it is presumed to be probe failure. It therefore often causes ambiguity. Example: Inf I [T/A]→AA plus Inf II [A/G]→NC gives NoCall, not AA. +5. With `--use-infI-nc-info` (v1.4), an **Infinium I no-call is read as missing signal**. This rules out the alleles that assay queries if other assays do not show them. It raises call rate and false positives, and it needs a cluster file that clusters "zeroed-out" MAV assays. +6. Merged records carry **GT and GS only**, where GS is the minimum GS across the assays. They have no BAF or LRR. +7. REF/ALT come a priori from the manifest and reference. ALT can list several alleles, which allows GTs like `0/2`, `1/3`, `2/3`. +8. The ID lists all probe names, joined by `,` for SNPs and `;` for indels. +9. Indels can be "flipped": a manifest deletion REF=ATCG/ALT=A may be written as an insertion REF=A/ALT=ACTG (as printed). The GT is adjusted to match, so the VCF stays correct. + +### 3.2 Ploidy +- The SNV VCF is haploid on Y, MT and non-PAR X for males. For females, calls on Y are presumably haploid too. +- Cyto and PGx CN: `##OverallPloidy` is the arithmetic mean ploidy across the genome, accounting for event lengths. The baseline differs by sex (≈1.95 for a male per the examples). `copyNumberMedian` is the length-weighted median CN. + +### 3.3 BAF/LRR orientation +The VCF writes BAF and LRR with **REF = A and ALT = B relative to the reference genome**. It may therefore report 1 − BAF compared with the legacy tool, which orients by manifest A/B. The page does not say that LRR changes (LRR does not depend on allele order). GS does not depend on orientation. + +### 3.4 Filters +- SNV VCF: FILTER is always PASS; use GS for quality. +- PGx CNV VCF: `Q7` (QUAL<7) and `SampleQuality` (sample LogRDev > 0.2). +- Cyto VCF: `Q10` (QUAL<10), `SampleQuality` (LogRDev > 0.2), `LowFraction` (mosaic MF below a threshold whose value is not given). +- Cyto reporting gate `minQual` = 20, plus per-type minimum probe counts and sizes (see §5). + +### 3.5 QUAL +- Cyto: `QUAL = −10·log10(1 − P(called state))`, capped at 60, minimum 0. +- PGx CNV: "Phred-scaled … capped at 60 and the minimal value is 0", written as an integer. +- Cyto JSON `qualityScore` is a float (60.0). + +### 3.6 CN encodings +- PGx CN is an integer from 0 to 5, where "CN=5 indicates 5 or 5+". It is labelled "for imprecise events". +- Cyto CN is an integer from 0 to 4, where "CN=4 indicates 4 or 4+". +- ALT is symbolic: `` in PGx; ``, `` and `` in cyto. DUP is described as a "Copy number gain heterozygous region". +- NR is the aggregated normalized intensity, ≈ CN/2 relative to diploid. +- Microarray ISCN uses `xN` for the copy number and appends `hmz` for LOH. + +### 3.7 LOH types +There are three `LOHTYPE` values. `AOH` is germline LOH, copy-neutral or gain, and CN can be 2 or 3. `CNLOH` is somatic copy-neutral LOH. `GAINLOH` is somatic gain LOH. +There are separate minimums for GAINLOH (300 probes, 500 kb) and for mosaic LOH ("Mloh": 500 probes, 3000 kb). +The per-chromosome LOH counts exclude GAINLOH; the sample-level counts include it. + +### 3.8 Mosaicism +- The `MOSAIC` flag and `MF` (estimated mosaic fraction, a float) mark a mosaic call; MF is `.` when not mosaic. +- The ID prefix is `Mosaic`. +- `LowFraction` is the FILTER for an MF below a threshold. +- `HIGHFRACTION` is the "Indicator for promoted events with high mosaic fraction". A mosaic event with a high MF is promoted to a regular (constitutional) event but keeps the flag. +- There are separate minimum sizes and probe counts for mosaic DEL, DUP and LOH. +- Each chromosome has `hasMosaicism`, `numberMosaic` and `medianMosaicFraction`. + +### 3.9 ISCN notation +- `iscnVersion` is "ISCN 2020". +- Traditional form: `del(chr)(bandStartbandEnd)` / `dup(...)`, comma-joined across events. +- Microarray form: an `arr[GRCh37]` or `arr[GRCh38]` prefix, then per event `(_)x`, with ` hmz` for LOH. Coordinates are 1-based. +- Cytobands for the start and end come from the annotation DB. + +### 3.10 Gene annotation +Genes are listed when a **transcript's coordinates intersect** the event. Names are HGNC symbols from RefSeq, plus Ensembl gene IDs that have no matching symbol. Clone-style names like `RP11-345P4.10` also appear in the hg19 example. `geneCount` is the length of the list. + +### 3.11 Effective size +A gap is a probe spacing more than 150× the median probe spacing. Each gap is replaced by the median spacing, and `effectiveSize` is computed with those replacements. + +### 3.12 Star-allele scoring and ranking +- `Score`/`qualityScore` is a probability from 0 to 1. It depends on SNV and CNV evidence, input quality (GS) and population allele frequencies. `Raw Score`/`rawScore` is the same without population frequency. +- Solutions are ranked by qualityScore; rank 1 is the top. +- **Alternative solutions with qualityScore ≥ 50% of the top score are "feasible"** and all of them are listed in `genotype`, `;`-separated. +- Alternatives also deserve consideration when their supporting variants have GS < 0.15; the guidance is to check those clusters for shift. +- Array-equivalent alleles are collapsed, and the one with the highest population frequency is reported. +- There are background alleles for SVs. +- The copy-number solution is given per sub-region: CYP2D6 p5, intron.2 and exon.9; CYP2A6 exon.1 and intron.7; and whole-gene regions for GSTM1, GSTT1, UGT2B17, SULT1A1 and CYP2E1. +- Allele nomenclature includes tandem and hybrid forms: `*36x2+*83+*10`, `*13+*68x2+*4`, `*1x3N` (≥3 copies, N = unknown count), `*4.013` (suballele). + +### 3.13 Phenotype +- `PGx Guideline` / `pgxGuideline` is CPIC or DPWG, chosen by the user. +- The activity score is numeric or "n/a". +- The phenotype annotation is a string such as "Normal Metabolizer", "Decreased Function", "CYP2D6 Indeterminate", "Ivacaftor non‑responsive", or "n/a". +- Database sources are listed with their versions. + +### 3.14 Methylation outputs +- Beta runs from 0 (unmethylated) to 1 (methylated). The M-value is a log transform of beta (log2(β/(1−β)), which the page does not spell out). +- Detection p-values above 0.05 are recommended for exclusion. +- Processing is Sesame-based: dye-bias correction plus noob normalization. +- PCA uses the betas of all analytical probes. **When there are more than 100 samples, a random subset of 10,000 probes is used.** Plots are colored by Sample_Group. +- A sample passes when all 21 control metrics pass. + +### 3.15 Control-probe QC formulas (genotyping) +`bkg_grn` = max green of Extension(A) and Extension(T). `bkg_red` = max red of Extension(C) and Extension(G). x = 3000. + +| Metric | Genotyping | Methylation | +|---|---|---| +| RestorationQC | Restoration green/(bkg_grn+x) | same | +| StainingGreenQC | Biotin(High) g / Biotin(Bgnd) g | same (Bkg) | +| StainingRedQC | DNP(High) r / DNP(Bgnd) r | same | +| ExtensionGreenQC | min Ext(C,G) g / max Ext(A,T) g | same | +| ExtensionRedQC | min Ext(A,T) r / max Ext(C,G) r | same | +| HybridizationHighMediumQC | Hyb(High) g / Hyb(Medium) g | same | +| HybridizationMediumLowQC | Hyb(Medium) g / Hyb(Low) g | same | +| TargetRemovalIQC | (bkg_grn+x)/Target Removal g | (bkg_grn+x)/TR1 g | +| TargetRemovalIIQC | — | (bkg_grn+x)/TR2 g | +| StringencyQC | String(PM) r / String(MM) r | — | +| NonSpecificBindingGreenQC | (bkg_grn+x)/max NSB(Bgnd) g | — | +| NonSpecificBindingRedQC | (bkg_red+x)/max NSB(Bgnd) r | — | +| NonPolymorphicGreenQC | min NP(C,G) g / max NP(A,T) g | same | +| NonPolymorphicRedQC | min NP(A,T) r / max NP(C,G) r | same | +| SpecificityI Green/Red, II, IIBg; BisulfiteConversion I Green/GreenBg/Red/RedBg, II, IIBg | — | see §2.15 / L1233–1242 (GT Mismatch 1–3 green, 4–6 red; BS Conv I C1–C2/U1–U2 green, C3–C5/U3–U5 red) | + +The older methylation-summary table (L1080) gives slightly different wording: the red bisulfite-conversion background is "Background/(Highest value of U4, U5, or U6)", and Specificity II background uses S1–S4. These differ from the newer table's U3–U5. + +### 3.16 Sample summary metrics +Call rate = #Calls/(#No_Calls+#Calls). The autosomal call rate and LogRDev (LRR SD) are also reported. Sex is F or M; "Male" in cyto; "U" is presumably possible. TGA_Ctrl_5716 Norm R < 1 means the targeted gene amplification failed. Cyto adds `bafDev` per genotype class, `medianLogRDev`, `percentLOH`, the LOH counts, `overallPloidy` and `copyNumberMedian`. + +--- + +## 4. Messages + +### 4.1 Genotyping, CN and PGx (terminal) +General scenarios: +- The manifest used to make the GTC differs from the manifest of the CN model. +- The FASTA and the FASTA index do not match. +- Indel processing failed. +- The input folder lacks required files. +- An input file is corrupt. + +| Message (verbatim) | Type | Trigger | +|---|---|---| +| `Failed to normalize and gencall sample: {sample_id}, it will be skipped. Error: The given key '{loci_id}' was not present in the dictionary.` | Warning | The manifest and cluster file do not match (the EGT was built from a different manifest) | +| `Reference allele is not queried for locus: {identifier}` | Warning | The true reference allele is not among the manifest alleles (common for MNVs) | +| `Skipping non-mapped locus: {identifier}` | Warning | Chr = 0 or no position | +| `Skipping intensity only locus: {identifier}` | Warning | Intensity-only probe | +| `Skipping indel: {identifier}` | Warning | Indel context (deletion/insertion) could not be determined | +| `Failed to process entry for record: {identifier}` | Warning | The indel's reference allele could not be determined | +| `Incomplete match of source sequence to genome for indel: {identifier}` | Warning | The indel does not map properly to the reference | +| `Failed to combine genotypes due to inconsistencies - exm1068284 (InfiniumII): TT, ilmnseq_rs1131690890_mnv (InfiniumII): AA, rs1131690890_mnv (InfiniumII): AA` | Warning | MAV merge conflict gives `./.`. Format: ` (): ` joined by `, ` | +| `Failed to combine genotypes all were No Calls - exm1068284 (InfiniumII): NC, …` | Warning | Every merged probe is NC | +| `Cluster file ({GTC.egt}) is not the same as CN Model Cluster file ({CN_Model.egt}).` | Warning | The EGT used for the GTCs differs from the one used when the CN model was trained | +| `{numPassingSamples} sample(s) passed QC.` / `Requires at least {minPassingSamples} samples to proceed.` | Error | Too few high-quality samples for batch-dependent CNV calling (the minimum is not given here) | +| `Invalid manifest file path {manifestPath}` | Error | The manifest was not found | +| `Failed to load cluster file: {e.Message}` | Error | The EGT is corrupt or an unsupported version | +| `System.IO.EndOfStreamException: Unable to read beyond the end of the stream.` | Error | GTC read failure (a known i18n issue). This reveals that the tool is a .NET implementation | + +### 4.2 Methylation logs +| Log | Message | Type | Trigger | +|---|---|---|---| +| write_samplesheet.log | `No IDATs found` | Error | No IDATs provided | +| format_samplesheet.log | `No samples in sample sheet` | Error | The sample sheet is empty | +| format_samplesheet.log | `Sample sheet not correctly formatted` | Error | Not CSV, or header lines do not start with "<" (sic) | +| format_samplesheet.log | `beadChipName and sampleSectionName columns are required for the sample sheet.` | Error | Required columns missing | +| format_samplesheet.log | `Warning: samples have duplicate Sample_ID` | Warning | Duplicate `_` values; the duplicates are dropped | +| convert_manifest_ilmn_sesame.log | `Missing control probes in manifest` | Error | No `[Controls]` line | +| convert_manifest_ilmn_sesame.log | `Probe section not found` | Error | No `[Assay]` line | +| convert_manifest_ilmn_sesame.log | `Missing required columns: IlmnID, AddressA_ID, AddressB_ID, Color_Channel` | Error | A column is missing from the Assay section | +| convert_manifest_ilmn_sesame.log | `Controls not formatted correctly. Must have 4 columns (Address,Type,Color_Channel,Name)` | Error | Bad Controls section | +| run_sesame_gs.log | `Missing sample: ` | Error | IDATs missing for a sample | +| run_sesame_gs.log | `No scan time available` | Warning | The IDAT has no scan time | +| run_sesame_gs.log | `Prep failed` | Error | Dye-bias correction or noob failed | +| run_sesame_gs.log | `Warning: missing control probe types` + list | Warning | The metric is set to NA | +| run_sesame_gs.log | `Warning: missing control probe names` + list | Warning | The metric is set to NA | +| qc.log | `No features, skipping PCA plot` | Warning | No beta is common to all samples (e.g. a sample with no signal) | + +--- + +## 5. Numeric thresholds + +| Value | Context | +|---|---| +| 60 / 0 | QUAL cap and floor (PGx CNV and cyto) | +| QUAL < 7 → `Q7` | PGx CNV filter | +| QUAL < 10 → `Q10` | Cyto filter | +| minQual 20 | Cyto reporting | +| LogRDev > 0.2 → `SampleQuality` | Both CNV VCFs | +| CN=5 means 5+ (PGx); CN=4 means 4+ (cyto) | CN caps | +| DEL ≥10 probes and ≥25 kb; DUP ≥10 and ≥50 kb; LOH ≥500 and ≥3000 kb; GAINLOH ≥300 and ≥500 kb; mosaic DEL 10/25 kb, mosaic DUP 10/50 kb, mosaic LOH 500/3000 kb | Cyto reporting minimums (example defaults) | +| 150× median probe spacing | Gap definition for effectiveSize | +| 1 Mbp, 8 Mbp | LOH count bins | +| TGA_Ctrl_5716 Norm R < 1 | TGA failure | +| ≥ 50% of top qualityScore | Alternative star-allele solutions are listed | +| GS < 0.15 | Low-confidence supporting variant; consider alternatives | +| Score range 0–1 | PGx scores | +| > 1 M loci and > 100 samples → 50+ GB | Final report size warning | +| detection p > 0.05 | Methylation exclusion recommendation | +| > 100 samples → 10,000 random probes | Methylation PCA | +| x = 3000 | Background offset | +| Methylation defaults (EPIC) | restoration 0 (1 with FFPE restore); staining 5; extension 5; hybridization 1; target removal 1; BS conv I/II 1 (**MSA 0.5** for the Bg metrics and BS-II); specificity 1; nonpolymorphic green 5 (**MSA 2.5**), red 5 (**MSA 3**) | +| 5 pM / 1 pM / 0.2 pM | Hyb control target concentrations | +| 21 | Methylation control metrics | +| 12 digits | Sentrix barcode | +| 8 decimals (summary), 4 (GS), 8 sig. digits (BAF/LRR) | Output precision | + +--- + +## 6. Hints about the underlying algorithms +- **CNV QUAL is a posterior** probability of the called state, so the model is probabilistic (HMM or mixture). The Phred cap of 60 means P ≥ 1−10⁻⁶ is saturated. +- **CNV calling is batch dependent.** It needs a minimum number of QC-passing samples and a "CN model" trained from GTCs with a given cluster file, which is tied to a specific manifest and cluster file (both are checked). The model is "robust to minor cluster file updates". PGx CN is therefore a trained, batch-normalized per-region caller: NR is normalized intensity against a reference, much like a batch median. +- `##GCCorrect=True` and the JSON `gcCorrect` show that GC-wave correction is an option. +- `OverallPloidy` is a length-weighted mean CN over the genome. `copyNumberMedian` is the length-weighted median. +- Cyto LOH uses heterozygosity (`percentHet`) and `bafDev`. Mosaic MF estimation is from BAF/LRR shift. There is a promotion rule that turns mosaic events into regular calls at high MF. LowFraction events are kept but filtered. +- Separate minimums for germline, gain-LOH and mosaic events suggest distinct detection passes (constitutional and mosaic) that are then merged. +- **Star-allele caller**: probabilistic scoring from SNV genotypes (GS as quality), CNV region CNs, and population frequency priors. Variant copy number per supporting variant means a CN-aware genotype model, with BAF used to find how many copies carry the ALT. Array-equivalent collapsing is done on allele definitions restricted to array content. There is an intermediate `.dat`. +- **MAV merging** uses a consistency-filter algorithm (see §3.1). The failure-message format exposes per-probe assay type. +- The software stack appears to be .NET for genotyping (`System.IO.EndOfStreamException`, "The given key … was not present in the dictionary" is a .NET KeyNotFoundException message) and R/Sesame for methylation (`run_sesame_gs`, `convert_manifest_ilmn_sesame`). The cyto booleans (`True`) are Python-style. +- The GTC includes sample QC metrics, which is where the summary metrics come from. +- The BAF interpolation matches the classic legacy definition, and the LRR for intensity-only loci uses the cluster mean. + +--- + +## 7. Gap analysis vs the SimurgArray plan (§8, §9, §10, §11, §13) + +Legend: **MISSING** means the plan has no equivalent. **DIFF** means the plan specifies it differently. **UNDERSPEC** means the plan mentions it without the detail needed. + +### 7.1 SNV VCF (§8.3) +1. **DIFF: FILTER and QUAL.** The plan does not say what FILTER holds. Proposed spec: *"The per-sample genotype VCF sets QUAL to `.` and FILTER to `PASS` for all records by default; call quality is carried only in FORMAT/GS. An optional `--filter-gs ` may add a `LowGS` FILTER (off by default, for compatibility)."* +2. **DIFF: INFO fields.** The plan adds `ASSAY_TYPE, NORM_BIN, GENTRAIN, CLUSTER_SEP, ILMN_STRAND, PROBE_IDS`; the reference output has no INFO. Proposed spec: *"INFO annotations are opt-in (`--info-fields`); the default output has INFO `.` so the file compares byte-for-byte with other array-to-VCF converters."* +3. **UNDERSPEC: MAV handling.** Proposed spec: *"Merged records emit FORMAT `GT:GS` only (BAF and LRR omitted from the FORMAT string for that record, not written as `.`); GS = min over contributing assays. A no-call assay constrains nothing by default. Flag `--infI-nocall-informative`: an Infinium-I no-call excludes that assay's queried alleles when no other assay supports them (documented to raise both call rate and false positives, and to require a cluster file that clusters the zeroed-out assays). Each merge failure writes a WARNING `Failed to combine genotypes due to inconsistencies - (): , …` or `… all were No Calls - …`, which also goes to the audit table."* +4. **MISSING: indel REF/ALT flip note.** Proposed spec: *"When the manifest describes a deletion that normalizes to an insertion against the reference (or vice versa), write the reference-consistent representation and remap GT; record `flipped_indel=true` in the audit."* +5. **MISSING: skip taxonomy and warnings.** Proposed spec: *"Loci are skipped with one warning each (rate-limited, all listed in the audit): non-mapped (chr 0/pos 0), intensity-only, indel context undeterminable, indel reference allele undeterminable, incomplete source-sequence match, reference allele not among queried alleles (the record is still written with the queried alleles as ALT)."* +6. **MISSING: header meta keys.** Proposed spec: *"The header includes `##genomeBuild=<37|38>`, and only contigs present in the reference (including alt contigs when used); contig order follows the reference .fai."* +7. **UNDERSPEC: precision.** Proposed spec: *"GS written with 4 decimals, BAF/LRR with 8 significant digits."* +8. **MISSING: a PLINK conversion recipe and multi-allelic split guidance.** Proposed spec: *"The documentation shows how to convert via a bcftools merge, then `bcftools norm -m-`, then plink; `simurg export plink` splits multi-allelic sites by default (`--keep-multiallelic` to drop them instead)."* + +### 7.2 Per-sample summary (§13 `sample_summary.tsv`) +9. **DIFF/MISSING columns.** Proposed spec: *"The sample summary always contains `sample_id` (barcode_position), `sample_name` (resolved by the sample-name rule), `sample_folder`, `autosomal_call_rate`, `call_rate`, `logr_dev`, `sex_est` (F/M/U), then every sample-sheet column passed through verbatim in sheet order. If the manifest contains the targeted-amplification control probe (configurable name list), add `_norm_r` and flag `tga_fail` when it is < 1.0. Failed samples stay as rows with a `status=FAILED` and `fail_reason`. JSON form: an array of flat objects with the same keys."* + +### 7.3 Final report and locus summary +10. **DIFF: Final Report.** The plan treats the legacy final report as read-only (§6.7), though `simurg export finalreport` exists. Proposed spec: *"`export finalreport` writes a long-format table with columns SNP Name, SNP, Sample ID, Allele1/2 Top, Allele1/2 Forward, Allele1/2 Plus, GC Score, GT Score, Log R Ratio, B Allele Freq, Chr, Position. It warns when loci × samples > 1e8 (a very large file)."* +11. **UNDERSPEC: locus summary columns.** The plan (§7.9) has the formulas. Add: *"Column set and order: Locus_Name, Locus_ID, n_nocalls, n_calls, call_freq, aa_freq, ab_freq, bb_freq, minor_freq, gentrain_score, gc50, gc10, het_excess, chi_test_p100, cluster_sep, AA/AB/BB θ mean and sd, AA/AB/BB R mean and sd, plus_minus_strand (+/−/U)."* Note that the page defines het excess as `(f_ab − 2pq)/(2pq+ε)`; the plan's k-regularized form must be documented as equivalent or deliberately different. + +### 7.4 QC module (§9) +12. **DIFF: file layout.** The plan names `controls_raw.tsv` and `controls_qc.tsv`. Proposed spec: *"`controls.raw_metrics.csv` is long format (SampleId, Category, Beadtype, Control, Color, GreenIntensity, RedIntensity). `controls.qc_metrics.csv` has one row per sample with IDAT-derived metadata (ImagingDate, SamplePlate, SampleWell, ScannerId, ScannerVersion) followed by metric columns; columns that do not apply to the array type are omitted. Both files are produced automatically by genotyping and by a standalone `qc controls` command."* The plan's §6.1 must make sure the IDAT parser extracts these metadata fields. +13. **DIFF: NSB red formula.** The plan writes "(bkg + x)/max NSB(Bgnd)". Spec: *"NSB green = (bkg_grn + x)/max NSB(Bgnd) green; NSB red = (bkg_red + x)/max NSB(Bgnd) red; bkg_grn = max green of Extension A/T; bkg_red = max red of Extension C/G."* Add a Restoration metric and a separate TargetRemovalII (methylation only). +14. **DIFF: thresholds.** The plan gives hyb 1.25 and NP 5. Methylation defaults are hyb 1, target removal 1, staining 5, extension 5, NP 5 (lower on some chips: 2.5 green / 3 red), BS-conv Bg 0.5 on some chips, restoration 0 (1 with FFPE restore). Proposed spec: *"Thresholds are per-array-family YAML profiles; the report records which profile was used; pass = all enabled metrics pass; `fail_codes` lists the failing metric names."* +15. **MISSING: QC table and report naming.** Proposed spec: *"`qc report` writes `_QC_Report_YYYY_MM_DD.html` (offline, dashboards: controls, automated pass/fail, per-sample metric heatmap, trend over runs, in-page threshold editor) and `_QC_table_YYYY_MM_DD.{xlsx|csv}` (`--output-format`, default xlsx) holding functional metrics, derived control metrics and raw control intensities in wide form. Several datasets may be combined into one report for trend analysis."* + +### 7.5 Copy-number and cyto (§10, §13 `cnv.vcf.gz`) +16. **DIFF: cyto CNV VCF schema.** The plan's "`//` with CN, MF, QUAL" is far too thin. Proposed spec: + *"Per-sample `.cnv.vcf.gz` (+tbi), VCF 4.1. Header: `##genomeBuild`, `##product=`, `##reference`, `##OverallPloidy=`, `##GCCorrect=`. ALT: DEL (copy loss), DUP (copy gain), LOH (absence/loss of heterozygosity). FORMAT: GT (fixed `1/1` placeholder for events, documented), CN (integer, top value means that value or more; cap configurable, default 4), NR (aggregated normalized intensity ≈ CN/2), LRD (SD of LRR within the event), MF (mosaic fraction; `.` if not mosaic). INFO: SVLEN (positive length = END − POS), PROBE (probe count), END, MOSAIC (flag), LOHTYPE (AOH = germline copy-neutral or gain; CNLOH = somatic copy-neutral; GAINLOH = somatic copy-gain), HIGHFRACTION (flag: mosaic event promoted to constitutional because MF is high). FILTER: `Q10` (QUAL < 10), `SampleQuality` (sample LRR SD > 0.2), `LowFraction` (MF below a configurable threshold). POS = event start − 1 (padding base), REF = `N`. ID = `:::` with a `Mosaic` prefix for mosaic events. QUAL = min(60, max(0, round(−10·log10(1 − P(state)))))."* + Also document the SVLEN sign choice: positive, per the reference behaviour, with an option for spec-correct negative values for DEL. +17. **MISSING: reporting gates.** Proposed spec: *"Events are reported only if QUAL ≥ minQual (default 20) and they meet the per-type minimums: DEL 10 probes/25 kb, DUP 10/50 kb, LOH 500/3000 kb, GAINLOH 300/500 kb, mosaic DEL 10/25 kb, mosaic DUP 10/50 kb, mosaic LOH 500/3000 kb. All are configurable and echoed in the annotation JSON."* The plan has no GAINLOH or mosaic minimums and no minQual 20. +18. **MISSING: cyto annotation JSON.** The plan §10.4 has no output schema. Proposed spec: *"`.cyto.json` contains the sample-level fields annotation DB name, software version, reference, annotation type (constitutional|oncology), build, database sources and versions, ISCN version, sample id and name, gcCorrect, every threshold, overallPloidy, callRate, logRDev, medianLogRDev, bafDev{AA,AB,BB}, numLOHOver1M, numLOHOver8M, totalSizeLOHOver1M (these three include gain-LOH), copyNumberMedian (length-weighted), percentLOH, sexEstimate, traditional and microarray ISCN strings. Per-chromosome block: id, size, percentHet, hasMosaicism, lrrMedian, lrrMean, lrrDev, the LOH counts (excluding gain-LOH), percentLOH, copyNumberMedian, copyNumberMean, min and max LRR, medianMosaicFraction, counts of del, dup, LOH, gain-LOH and mosaic events. Per-event block: id, chrom, start (0-based), end, callType, mosaicState, mosaicFraction, copyNumber, qualityScore, size, effectiveSize (gaps > 150× median spacing replaced by the median spacing), probeCount, percentHet, lrrMedian, lrrDev, bafDev, start and end cytobands, traditional and microarray ISCN, geneCount, genes (transcripts intersecting the event: RefSeq symbols plus unmatched Ensembl IDs)."* Use real JSON types (numbers not strings, null not ".") and document this as a deliberate deviation. Offer a `--compat-json` flag for string sentinels. +19. **UNDERSPEC: ISCN.** Proposed spec: *"Microarray ISCN (2020): `arr[GRCh3x] (_)x[ hmz]`, comma-joined; LOH gives `x2 hmz` (or `x3 hmz` for gain-LOH); mosaic events use the ISCN mosaic notation `x1~2` or similar (must be defined). Traditional: `del()()`/`dup(...)` for CNVs only."* +20. **MISSING: batch minimum and model consistency checks.** Proposed spec: *"CN calling aborts with an error ` sample(s) passed QC. Requires at least samples to proceed.` when too few samples pass QC (m configurable, default = the batch-reference minimum). A CN model records the manifest and cluster-file hashes; a mismatch with the input GTCs produces a warning (cluster file) or an error (manifest)."* +21. **MISSING: CN summary file.** Proposed spec: *"`cn_sample_summary.tsv`: sample_id, sample_name, sample_folder, logr_dev, overall_ploidy, gc_correct, n_events per type, pass/fail."* +22. **DIFF: sex and ploidy baseline.** Spec: *"overallPloidy = length-weighted mean CN over all reported contigs, including sex chromosomes, so males are ≈1.95 without events."* + +### 7.6 PGx (§11, §13 `pgx.json`) +23. **MISSING: a dedicated targeted-CN VCF.** Proposed spec: *"`.pgx_cn.vcf.gz` (+tbi) has exactly one record per predefined target region (always emitted): ID `CNV::::`, REF `N`, ALT ``, INFO CNVLEN (END−POS+1), PROBE, END, SVTYPE=CNV; FORMAT `CN:NR` with no GT; CN integer 0–5 (5 = 5+); QUAL Phred capped at 60; FILTER `Q7` (QUAL < 7) and `SampleQuality` (LRR SD > 0.2); header `##OverallPloidy`, `##GCCorrect`, `##genomeBuild`. The region catalogue (CYP2D6 5′ region/intron 2/exon 9; CYP2A6 exon 1/intron 7; whole-gene GSTM1, GSTT1 (alt contig on GRCh38), UGT2B17, SULT1A1, CYP2E1) is a versioned BED."* The plan mentions only CYP2D6 sub-regions. +24. **MISSING: `cn_batch_summary.csv`.** Proposed spec: *"Per target region: counts of gain (CN > 2), loss (CN < 2) and neutral (CN = 2) samples, plus an `All Target Regions` totals row."* +25. **MISSING: PGx tabular outputs.** Proposed spec: *"The batch-level PGx directory contains `diplotype_summary.csv`, `diplotype_annotations.csv`, `supporting_variants.csv`, `unresolved_variants.csv` and `variants_not_covered_on_array.csv`, with columns as in §2.6 of this analysis (renamed to snake_case). Each starts with `#`-prefixed metadata lines (build, allele DB version, phenotype DB version, mapping-file hash)."* +26. **UNDERSPEC: star-allele JSON.** Proposed spec: *"Per-sample `.pgx.json`: tool version, build, allele and phenotype DB sources with versions, mapping-DB file name and hash, guideline (CPIC|DPWG), sample id, and per gene: callType (star allele|variant), genotype (all feasible top solutions `;`-joined), array-equivalent alleles per allele, activity score, phenotype, qualityScore (with population prior) and rawScore (without), supporting variants (chrom, pos, ref, alts, gt, gs, baf, variant CN, hgvs, rsid, probe ids, allele ids), no-call variants, alleles impacted by no-calls, ranked candidateSolutions (rank, genotype, scores, alleles with their supporting and unresolved sites, array-equivalents, background allele, variantChange, copyNumberRegions and copyNumberSolution), variantsNotCoveredOnArray, allelesTested. Use consistent JSON types (numbers as numbers, no stray key punctuation)."* +27. **MISSING: ranking rules.** Proposed spec: *"Solutions within ≥ 50% of the top qualityScore are reported as co-top (`;`-joined). Supporting variants with GS < 0.15 are flagged `low_gs` and the gene call gets an `review_alternatives` flag. Among array-indistinguishable alleles, report the one with the highest population frequency and list the rest."* +28. **MISSING: an intermediate calls file** between `star-allele call` and `annotate`. Spec: *"PGx calling is split into `pgx call` (writes `.pgx_calls.parquet`) and `pgx annotate` (phenotype and guideline lookup), so a guideline can be re-annotated without re-calling."* +29. **MISSING: a variant-type PGx call** for SNP-only genes/variants (e.g. rsID-level calls, MT-RNR1). Spec: *"Genes without star-allele definitions are reported as `Type=Variant` with the explicit genotype."* +30. **MISSING: CN-aware variant copy number and BAF use** in star-allele scoring (per-variant CN, BAF ≈ k/CN). The plan §11 checks only "CN-consistent BAF (1/3, 2/3)". Spec: *"For CN = n, compute the expected BAF for k alt copies as k/n and use the likelihood of the observed BAF to assign variant copy number k."* + +### 7.7 Methylation (plan v2 item 14: "methylation-array control QC (optional)") +31. **MISSING almost entirely.** If kept in scope, proposed spec: + *"Per sample: `__ctrl.tsv.gz` (address, type, channel, name, probe id, raw MG/MR/UG/UR) and `__cgs.tsv.gz` (beta, M = log2(β/(1−β)), detection p). Per batch: `sample_qc_summary.tsv` and `.xlsx` (failing cells highlighted), holding the 21 control metrics, avg raw and normalized green/red, scan time, n_probes, n_pass_detection, prop_probes_passing, passQC (1/0), failCodes. Also `sample_qc_summary.pdf` (a histogram of the passing proportion colored by pass status; PCA on betas, using a random 10,000 probes when n > 100, colored by Sample_Group), `pcs.tsv.gz` (sample, PC1, PC2, Sample_Group or NA), a converted manifest `probes.csv` (Probe_ID, U, M, col) and `controls.csv`. Normalization: dye-bias correction plus noob (an open reimplementation). Detection p > 0.05 is recommended for exclusion."* + Also add the log and validation messages: no IDATs, empty sheet, missing columns, duplicate sample (dropped with a warning), missing `[Controls]`/`[Assay]`, missing manifest columns, missing sample, no scan time (warning), prep failure, missing control types (metric = NA), no common features (PCA skipped). + +### 7.8 Other +32. **UNDERSPEC: bedGraph.** Specify the columns (`chrom, start0, end, value`), sort order, excluded loci (intensity-only for BAF) and a track line. +33. **MISSING: an error-message catalogue.** Add a table of stable message IDs covering, at minimum: manifest/cluster mismatch (the sample is skipped with a warning), invalid manifest path, cluster-file load failure, truncated GTC, FASTA/.fai mismatch, CN-model manifest or cluster mismatch. +34. **MISSING: legacy GTC compatibility.** Spec: *"GTCs from other tools are accepted for VCF export; CN, cyto and PGx modules require GTCs that carry normalization transforms and the needed intensities, and refuse others with a clear error."* +35. **Test oracles.** Add the reference-output inconsistencies to §20 (known unknowns): LOH example with mismatched CHROM; GAINLOH example with LOHTYPE=AOH; SULT1A1 ID versus POS/END mismatch; string versus number scores; "CN:" key typos; annotationType int versus string. Tests must not encode these as requirements. diff --git a/docs/research/C_qc_report_features.md b/docs/research/C_qc_report_features.md new file mode 100644 index 0000000..c682e72 --- /dev/null +++ b/docs/research/C_qc_report_features.md @@ -0,0 +1,584 @@ +# C — QC Report & Applications/Features analysis + +> **Archived Phase-0 study (sanitized copy, see `README.md`).** Written 2026-09-27, before the decisions in +> `SIMURGARRAY_MASTER_PLAN.md` §2. The analysed vendor product is called "the reference product" and its CLI +> `refcli`; its documentation URLs are replaced by `[ref-docs:…]` tokens. Where this file speaks of a clean room, +> legal clearance, or running/benchmarking the vendor binary, plan §2 supersedes it: personal research; MIT/BSD/Apache +> code may be reused with attribution; GPL tools are subprocess oracles only; vendor binaries are never run for +> comparison, inspected or decompiled; oracles are published vendor-produced GTCs, gtc2vcf and BeadArrayFiles. + +Sources (read in full): +- `site/pages/product-guides/local-analysis/qc-report.md` (1217 lines) +- `site/pages/overview/our-features.md` (165 lines, wide tables) +- `site/pages/overview/readme.md` (33 lines) +- 9 screenshots referenced by qc-report.md were downloaded to the session scratchpad and inspected visually (control dashboard, automated-QC table, automated-QC scatter plots, heatmap by chip, heatmap by plate, trend table, trend plots, threshold dialog, large-dataset tabbed dashboard). What was seen in them is marked **[SCREENSHOT]**. + +Note: each page ends with a generic "Agent Instructions" block from the documentation host that describes an `?ask=` query endpoint. That is boilerplate from the hosting platform. It has nothing to do with the product and is ignored here. + +Terminology: "vendor tool" = the analysed product. CLI verbs are quoted as the docs give them (`qc call`, `qc report`, `genotype call`, …) only to identify behaviour. + +--- + +## 1. QC report + +### 1.1 Purpose (as stated) +A **self-contained, interactive, offline HTML dashboard** plus a **per-sample QC table** for genotyping and DNA-methylation array datasets. It combines: +- per-sample functional QC metrics (Autosomal Call Rate, LogRDev, Sex estimate), +- control-probe metrics at probe level (raw intensities) and summarized level (ratios), +- interactive plots for outliers, spatial artifacts (chip/plate heatmaps) and batch effects (trend analysis), +- automated threshold-based QC with export, +- project-wide average call rate / LogRDev, and trends across multiple datasets. + +### 1.2 Two-step pipeline and upstream paths + +| Workflow | Upstream command | Key inputs | Dataset folder contents for `qc report` | When | +|---|---|---|---|---| +| Methylation | `qc call` | CSV manifest (`--csv-manifest`) + IDAT folder, `--array-type methylation` | `controls.raw_metrics.csv` + `controls.qc_metrics.csv` | standard methylation QC | +| Genotyping, recommended | `genotype call` | BPM (`--bpm-manifest`) + cluster file (`--cluster-file`) + IDAT folder (+ optional `--sample-sheet`, "Source of metadata") | the two controls CSVs + `gt_sample_summary.csv` | full report: functional QC, ACR/LogRDev views, sample heatmaps | +| Genotyping, limited | `qc call` | CSV manifest + `--array-type genotyping` + IDAT folder | the two controls CSVs only | control-only QC, no functional metrics | + +- Legacy path: `gt_sample_summary.csv` files from versions before 1.4.0 can be combined with `qc call` outputs by pointing `qc call --output-folder` at the existing output folder. The report then gets its full feature set. +- The optional sample sheet is accepted by both `qc call` and `genotype call`. +- `qc report` options: `--data` (dataset folder, a parent folder, or a comma-separated list), `--config` (optional YAML), `--output-folder` (default: CWD), `--output-format csv|xlsx` (default xlsx), `--label` (comma-separated, one per dataset), `--threshold-callRate`, `--threshold-logRdev`. +- CLI flags are **case-sensitive**, mixed case: `--threshold-callRate`, `--threshold-logRdev`. +- Lists passed to `--data` and `--label` take **no spaces** around commas. + +Example commands (verbatim structure): +``` +genotype call --bpm-manifest …manifest.bpm --cluster-file …clusterfile.egt --idat-folder /user/IDATs --output-folder /user/gtc +qc call --array-type --csv-manifest …manifest.csv --idat-folder /user/IDATs --output-folder /user/qc_metrics +qc report --data /user/dataset_folder --config /user/config.yaml --output-folder /user/qc_report +qc report --data /user/dataset_A,/user/dataset_B --label batch_A,batch_B --output-folder /user/qc_report +``` + +### 1.3 Input files (interchange formats) + +| File | Content | Required | +|---|---|---| +| `controls.raw_metrics.csv` | probe-level control intensities | yes | +| `controls.qc_metrics.csv` | per-sample summarized control QC ratios | yes | +| `gt_sample_summary.csv` | per-sample genotyping metrics (ACR, LogRDev, Sex estimate, …) | no, "strongly recommended" | +| `config.yaml` | threshold overrides (via `--config`) | no | + +**`controls.qc_metrics.csv` columns (exact order):** +`SampleId,ImagingDate,SamplePlate,SampleWell,ScannerId,ScannerVersion,StainingGreenQC,StainingRedQC,ExtensionGreenQC,ExtensionRedQC,HybridizationHighMediumQC,HybridizationMediumLowQC,TargetRemovalIQC,StringencyQC,NonSpecificBindingGreenQC,NonSpecificBindingRedQC,NonPolymorphicGreenQC,NonPolymorphicRedQC` +Example row: `205930510001_R01C01,11/19/2021 12:39:31 PM,WG0587702-DNA,A06,N0782,4.3.0.934,18.989004,15.226524,17.069284,7.0317426,1.4189211,2.8047338,3.2466092,1.7800437,3.1761158,3.1761158,0.07639844,0.11531731` +- ImagingDate, ScannerId and ScannerVersion come from IDAT run metadata. SamplePlate and SampleWell come from the sample sheet or the IDAT. +- Date format is US `M/D/YYYY h:mm:ss AM/PM`. +- Oddities in the example: NSB Green equals NSB Red exactly, and the NP values are about 0.08–0.12, far below the default threshold of 5. The table screenshot shows NP Red values around 18–20. The documentation example is probably synthetic or from an older formula, so we should not infer formulas from it. + +**`controls.raw_metrics.csv` columns:** `SampleId,Category,Beadtype,Control,Color,GreenIntensity,RedIntensity` +Examples: `…,Extension,11603365,Extension (G),Blue,38679,4168` and `…,Extension,12613307,Extension (C),Green,39708,4505`. +- `Beadtype` is the control bead address. +- `Color` is the manifest control colour label. +- Intensities are integer raw values for both channels. + +**`gt_sample_summary.csv` columns (example):** +`Sample ID,Sample Name,Sample Folder,Autosomal Call Rate,Call Rate,Log R Ratio Std Dev,Sex Estimate,TGA_Ctrl_5716 Norm R,SentrixBarcode_A,SentrixPosition_A` +Example: `205930510001_R01C01,205930510001_R01C01,GSAPGx/205930510001,0.95813435,0.9528165,0.23342112,U,3.1297944,205930510001,R01C01` +- Sex Estimate codes are `M`/`F`/`U`; the report displays them as Male/Female/Unknown. +- `TGA_Ctrl_5716 Norm R` appears only for PGx products. +- Any extra sample-sheet columns are appended here and propagated. + +### 1.4 Metadata propagation +- Sample-sheet columns are copied into `gt_sample_summary.csv`, then **all** of its columns go into the report metadata and the merged QC table. +- In the xlsx/csv outputs, propagated metadata columns are **ordered alphabetically**. +- **Color by / Facet by eligibility:** a field is offered only if it has more than one unique value and no more than 20 unique values. +- Ineligible fields can still appear in hover text "when space allows"; some may be omitted from tooltips. +- Privacy warning (verbatim sense): sample-sheet metadata (names, processing info) is carried into outputs. Review before sharing, and to strip it, edit `gt_sample_summary.csv` and rerun. + +### 1.5 Control-probe propagation rules +- Excluded from the downstream raw-probe data: categories **NEGATIVE** and **NORM**; methylation-only extras `NP (G) 1`…`NP (G) 5`; staining extras `Biotin(5K)` and `DNP(20K)`. +- Kept: standard NP rows (for example `NP (G)`, `NP (T)`) and standard staining rows `Biotin (Bkg)`, `Biotin (High)`, `DNP (Bkg)`, `DNP (High)`. +- Summarized metrics are still shown for the excluded families. + +### 1.6 Configuration YAML +- Structure: a top-level `QC:` containing `Report:` containing flat `key: value` pairs. +- A value of `null` disables that check; a number enables it. +- Precedence, highest first: CLI threshold flags, then YAML, then built-in defaults. +- An omitted `--config` means built-in defaults are used. +- Four template files are shipped: `config_genotyping.yaml` (non-EX chemistry; validated only on LCG and HTS datasets), `config_genotyping_EX.yaml` (EX chemistry: GSA v4, GSA-ePGx v4, GCRA, GCRA-ePGx, custom EX), `config_methylation_EPIC.yaml`, `config_methylation_MSA.yaml` (MSA, Methyl EX custom 24/48). +- The template contents are not in the page; only the generic examples below are. +- Thresholds were "derived empirically from an internal review of more than 10 datasets" of good and failed samples, based on the centre and spread of the null/background distribution. They are starting points and not assay-independent truths. +- Control thresholds only "flag for review". +- Windows Notepad warning: the file extension must stay `.yaml`/`.yml` and must not become `.yaml.txt`. + +**Genotyping keys (generic example defaults, with the stated meaning):** + +| key | example | meaning | direction | +|---|---|---|---| +| `callRate` | 0.98 | min Autosomal Call Rate | fail if below | +| `logRDev` | 0.15 (YAML example) / **0.20 CLI and UI default** | max LRR SD | fail if above | +| `stainingGreen` | 5 | Biotin High / Bkg (green) | flag if below | +| `stainingRed` | 5 | DNP High / Bkg (red) | below | +| `extensionGreen` | 5 | green extension ratio | below | +| `extensionRed` | 5 | red extension ratio | below | +| `targetRemovalI` | 5 | target removal ratio, control I | below | +| `hybGreenHighMed` | 1.25 | Hyb High/Medium (green) | below | +| `hybGreenMediumLow` | 1.25 | Hyb Medium/Low (green) | below | +| `npGreen` | 5 | non-polymorphic green | below | +| `npRed` | 5 | non-polymorphic red | below | +| `restoration` | null | use 1 when FFPE Restore kit is used | below | +| `stringency` | 1.5 | stringency ratio | below | +| `nonSpecificBindingGreen` | 5 | NSB green | below | +| `nonSpecificBindingRed` | 5 | NSB red | below | +| `tgaControl` | 1 | min `TGA_Ctrl_5716` normalized R (PGx assay control) | below | + +**Methylation keys (generic example):** +- `stainingGreen` 5, `stainingRed` 5, `extensionGreen` 5, `extensionRed` 5 +- `hybGreenHighMed` 1, `hybGreenMediumLow` 1 +- `restoration` null +- `targetRemovalI` 1, `targetRemovalII` 1 +- `bisulfiteConversionIGreen` 1, `bisulfiteConversionIGreenBg` 0.5, `bisulfiteConversionIRed` 1, `bisulfiteConversionIRedBg` 0.5, `bisulfiteConversionII` 0.5, `bisulfiteConversionIIBg` 0.5 +- `specificityIGreen` 1, `specificityIRed` 1, `specificityII` 1, `specificityIIBg` 1 +- `npGreen` 2.5, `npRed` 3 + +**[SCREENSHOT] built-in defaults shown in the HTML "QC Metric Threshold Configuration" dialog (genotyping).** Note that these differ from the YAML example: + +| Section | Metric | Threshold | "Fail If"/"Flag If" | Description text in UI | +|---|---|---|---|---| +| Sample QC Metrics | Autosomal Call Rate | 0.98 | below | "Autosomal genotyping call rate (higher is better)" | +| | Log R Dev | 0.2 | above | "LRR genome-wide SD (array noise; lower is better)" | +| Control QC Metrics | Staining Green | 5 | below | Biotin High Green / Biotin Bkg Green | +| | Staining Red | 5 | below | DNP High Red / DNP Bkg Red | +| | Extension Green | 5 | below | Lowest Extension CG Green / Highest Extension AT Green | +| | Extension Red | 5 | below | Lowest Extension AT Red / Highest Extension CG Red | +| | Target Removal I | 1 | below | (Bkg + offset) / Target Removal I | +| | Restoration | 0 | below | Restoration Green / Background; only if FFPE Restore kit used | +| | Hybridization Green: High/Med | 1 | below | High Hyb. green / Medium Hyb. green | +| | Hybridization Green: Med/Low | 1 | below | Medium Hyb. green / Low Hyb. green | +| | Nonpolymorphic Green | 5 | below | Lowest NP CG green / Highest NP AT green | +| | Nonpolymorphic Red | 5 | below | Lowest NP AT red / Highest NP CG red | +| | Stringency | 2 | below | "Stringency PM (Green) / Stringency MM (Green)" (the page text says **Red**; inconsistent) | +| | NonSpecificBinding Green | 1 | below | "(Bkg Red + offset) / highest NonSpecificBinding Green" (probably a typo for Bkg Green) | +| | NonSpecificBinding Red | 1 | below | (Bkg Red + offset) / highest NonSpecificBinding Red | +| | TGA_Ctrl_5716 Norm R | 1 | below | "TGA control normalized red signal (PGx assay control)" | + +- Each row has an editable direction dropdown (below/above), so the comparison direction is configurable, not hard-coded. +- The automated-QC scatter screenshot shows "Flag if below 5" for NSB and "Flag if below 2" for Stringency. + +### 1.7 CLI threshold overrides +- `--threshold-callRate `: default 0.98; fail if ACR < v. Must be between 0 and 1. +- `--threshold-logRdev `: default 0.20; fail if LogRDev > v. +- Worked example: `--config` sets callRate 0.90 and CLI sets 0.95, so 0.95 is used. + +### 1.8 QC logic (PASS/FAIL and flags) +- **Functional QC (per sample):** PASS iff ACR ≥ threshold **and** LogRDev ≤ threshold. FAIL if any *enabled* functional metric is out of range. + - Requires `gt_sample_summary.csv`; otherwise it is "unavailable". + - Not supported for methylation. +- **Control-based QC (per sample):** each metric is compared with its threshold. A value out of range produces a **flag** naming the control and channel. + - The sample is **FLAGGED** if any enabled control metric is out of range, otherwise **CLEAR**. + - **[SCREENSHOT]** The flag code equals the YAML key (for example `npRed`) in the column "Control QC Flag Codes". Multiple flags are presumably concatenated. +- The two axes are independent: a sample can PASS functional QC and still carry control warnings. +- Interpretation guidance: the combined view separates biological failures (degraded DNA) from technical ones (staining, hybridization). +- Disabled checks (null or blank) are excluded from both statuses. + +### 1.9 Output files +- `_QC_Report_YYYY_MM_DD.html`: self-contained, offline, distributable. Tabs: Control Dashboard, Automated QC, Sample QC Heatmaps, Trend Analysis, plus the QC Metric Config menu. +- `_QC_table_YYYY_MM_DD.`: one row per sample with functional metrics (when available), derived control metrics, selected raw control-probe intensities, and alphabetically ordered metadata. + - **xlsx**: conditional formatting based on the applied thresholds, plus a **"Thresholds" worksheet** recording the thresholds and their source (defaults, YAML or CLI). + - **csv**: values only. + +### 1.10 HTML report layout (reimplementation spec) + +**Global chrome [SCREENSHOT]:** +- Header bar with the title "QC Report" and the logos. +- Left navigation: Control Dashboard, Automated QC, Sample QC Heatmaps, Trend Analysis, a separator, then ⚙ QC Metric Config. +- Plotly-based charts with the standard mode bar: camera/PNG export, zoom, pan, box select, lasso select, zoom in, zoom out, autoscale, reset axes. + +**A. Control Dashboard** +- Top card **"Autosomal Call Rate"**: a horizontal box plot of ACR across samples of the selected dataset, with outlier points shown individually. The x-axis is ACR. It is only present when functional metrics exist. +- Control row: **Dataset** (dropdown, one dataset at a time), **Sort Plots By** (default "Sentrix Barcode"; also any metric or metadata field), **Color Palette** (Default, …), **Facet By** (None by default; eligible metadata fields). +- One card per control category and channel, two per row. Each card has a header with the title and an expected-behaviour text, for example: + - "Staining – Red: Expect strong signal from DNP (High). DNP (Bgnd) and Biotin (High/Bgnd) should be at or near background for a successful staining step." + - "Staining – Green: Expect strong signal from Biotin (High). Other staining probes (DNP High/Bgnd, Biotin Bgnd) should be near background." +- The plot inside each card is a scatter: + - x = Sample ID (categorical, ordered by the sort key; tick labels hidden), + - y = "Intensity" (raw channel intensity, from 0), + - one trace per control probe, coloured per probe (DNP High = blue, DNP Bgnd = yellow, Biotin High = black, Biotin Bgnd = grey), + - the legend shows the probe names. +- Categories: Staining, Extension, Target Removal, Hybridization, Restoration, Stringency, Non-Specific Binding, Non-Polymorphic, TGA-Control (PGx). +- Hover shows sample ID, barcode, position and ACR when available. +- Box/lasso selection highlights the same samples in all plots (Control and Automated QC) and filters the Automated QC table. Double-clicking the plot clears the selection. + +**B. Automated QC** +- **Dataset** dropdown. +- **Functional QC Status Histogram**: horizontal bar chart with bars FAIL (orange) and PASS (blue). Each bar is labelled with its count and percentage, for example "76 (40%)". The x-axis is the sample count. +- **Control-Based QC Status Histogram**: bars FLAGGED (amber) and CLEAR (blue), labelled with count and percentage. +- **Sample QC table** (DataTables-style) [SCREENSHOT]: + - Columns: Dataset | Sample ID | Functional QC Status | Control QC Flag Codes | Autosomal Call Rate | Overall Call Rate | Log R Ratio SD | Sex Estimate | … one column per control metric (for example "Non polymorphic Red") … plus metadata. + - Per-column sort arrows and a column menu (≡) to show or hide columns. + - Per-column filter inputs in the footer: text for string columns, range for numbers. + - Cell colouring: PASS in solid blue, FAIL in solid orange, out-of-threshold metric cells in orange (functional) or light amber (control), and the flag code cell in amber. + - Pagination: "entries per page" (10 by default), "Showing 1 to 10 of N entries", page links. + - **Export ▾** offers Excel and CSV. **Select none** clears the selection. + - Row selection highlights the matching points in the scatter plots. + - Export respects the row selection: if rows are selected, only those are exported. + - Plot selection filters the table, and filtering combines with the search box and criteria filters. +- **QC metric scatter plots**, one card per derived metric: + - The header shows the metric name and its formula as help text, for example "Stringency PM (Red) / Stringency MM (Red)" or "(Bkg Red + offset) / highest NonSpecificBinding Red". + - x = samples in the current view (axis title "Sample ID"); y = the metric value. + - Points are initially coloured by functional status: PASS blue, FAIL orange. + - Points can be recoloured by an eligible metadata field and sorted by ACR, Log R Dev, any metadata field or any derived metric. + - A dashed threshold line is drawn and annotated, for example "Flag if below 5". + - The plots take part in linked selection. + - Metrics include Staining (G/R), Extension (G/R), Hybridization, Target Removal, Nonpolymorphic, Stringency, NSB, Specificity and Bisulfite Conversion (methylation), and TGA. + +**C. Sample QC Heatmaps** [SCREENSHOT] +- Controls: + - **Dataset**. + - **Color scale**: Continuous or Binary. + - **Group by**: Barcode (chip) or Plate. + - **Max Chips** per page (for example 2), only in Barcode mode. + - **Sort by**: Barcode, … + - In Plate mode, a **Plate** field with the plate name. + - **Page**: Prev/Next and "1 / 2". +- Two metrics side by side for each chip or plate: **"Autosomal Call Rate (higher is better)"** and **"Log R Dev (lower is better)"**. Each has a subtitle "Cut-off = X". +- **Chip layout:** a grid of rows R01..R12 by columns C01..C02 for a 24-sample chip, with rows 1–12 as the y-axis and columns 1–2 as the x-axis. The chip barcode is the panel title. The grid is parsed from the `SentrixPosition` value "RxxCyy". Legacy and EX chips have different physical layouts, so heatmaps differ by chip format; the grid dimensions must be derived from the data. +- **Plate layout:** 8×12 grid with rows A–H and columns 1–12, keyed by `Sample_Well`. The panel title is the plate name. Plate information comes from IDAT metadata or the sample sheet (`Sample_Plate`, `Sample_Well`); **the sample sheet wins** when both exist. +- Every cell is annotated with its value: 3 decimals for ACR, 2 for LogRDev. +- Continuous colour scales: ACR uses light-to-dark green over the data min–max (for example 0.995–1.000); LogRDev uses dark-to-light blue (0.11–0.18). +- Binary colour scales: + - ACR: orange below the cutoff, dark green at or above. + - LogRDev: blue "Below cut-off" and yellow "Above cut-off". + - A two-swatch legend is shown. +- Hover shows the sample identifiers and value. + +**D. Trend Analysis** [SCREENSHOT] +- **Summary table**, one row per dataset, sortable, with grouped headers: + - Dataset. + - **Scan Summary:** Scan Date Range ("YYYY-MM-DD to YYYY-MM-DD", or a single date); # Samples; # Complete / # Chips (chips with every position filled out of all chips, for example 23/42); # Missing Samples (empty positions on the chips, for example 49). + - **Autosomal Call Rate:** Min; Median; Mean (SD); # < threshold (for example "# < 0.98"). + - **Log R Dev:** Mean (SD); Median; # > threshold. + - **TGA Ctrl** (PGx only; blank otherwise): Mean (SD); # < 1. + - **Sex estimate:** # Male; # Female; # Unknown. + - The doc text also mentions "counts above/below threshold". +- **Summary plots** with controls **Group by** (Dataset, by default, or barcode) and **Sort by** (Barcode): + 1. **Autosomal Call Rate**: horizontal box plots, one row per dataset, each dataset in its own colour. Outlier points are shown, and the threshold is a red dashed vertical line. + 2. **Log R Dev**: the same form, with a threshold line at 0.2. + 3. **TGA Ctrl Norm R**: the same form, PGx datasets only, threshold line at 1. + 4. **Sample count**: horizontal bars per dataset. + 5. **Samples Sex Estimates**: grouped horizontal bars per dataset, Male (blue), Female (orange), Unknown (grey), with a legend. +- Box-plot semantics: the box is Q1–Q3 with a median line, and the whiskers reach the smallest and largest non-outlier values (Tukey 1.5×IQR is implied by Plotly defaults). +- Local mode compares multiple datasets. With a single dataset, the dashboard still appears and summarizes that one dataset. Cloud mode handles one dataset per report. + +**E. QC Metric Config (⚙ modal)** +- Two sections, "Sample QC Metrics" (Threshold, **Fail If**) and "Control QC Metrics" (Threshold, **Flag If**). Columns: Threshold, direction dropdown, Metric, Description. +- A blank field disables that check. +- Buttons: + - **Apply Thresholds** recomputes PASS/FAIL and FLAGGED/CLEAR and refreshes all visuals, including threshold lines, histograms, table colouring and heatmap cut-offs. + - **Download Thresholds** exports the applied thresholds as YAML that can be reused with `--config`. + - **Upload Thresholds** loads a YAML file into the fields. +- Changes are session-only and are not saved into the HTML file. + +### 1.11 Scale limits +- More than 1,000 samples in a dataset: control and automated-QC plots are split into **tabs**, one per control category [SCREENSHOT: tabs Staining | Extension | Target Removal | Hybridization | Restoration | Stringency | Non-Specific Binding | Non-Polymorphic | TGA-Control]. +- More than 12,000 samples in a dataset: scatter plots are **disabled** and replaced with a notice. +- More than 20,000 samples across datasets: loading slows down. +- More than 50,000 samples: very slow. Around 100,000 samples may exceed browser memory. +- The recommended remedy is to split by run, batch or centre. + +### 1.12 Multi-dataset handling +- `--data` accepts three forms: + 1. a single folder containing the required files; + 2. a comma-separated list of folders; + 3. a parent folder, searched recursively for any subfolder that contains both required controls CSVs. +- Labels: + - `--label` assigns labels in discovery or list order. + - Without `--label`, the folder name is used. + - Duplicate folder names get the suffix `_2`, `_3`, and so on. + - Labels are sanitized: unsupported characters become `_` (for example `My Label<1>` → `My_Label_1`), with a warning. + - Labels that are duplicates after sanitization are an error. +- Mixing genotyping and methylation datasets is an **error**. Allowed mixes: PGx with non-PGx (TGA columns are filled only for PGx), legacy with EX chips, and different versions of the same chip family. +- The dataset type is presumably detected from the presence of `gt_sample_summary.csv` or from the control categories. + +### 1.13 Troubleshooting (FAQ) +- **Missing samples:** Sample IDs don't match across the `controls.*` files and `gt_sample_summary.csv`. The files are joined on SampleId / "Sample ID". +- **Unexpected failures:** thresholds are too strict; adjust them. +- **Scatter disabled:** more than 12,000 samples. +- **CSV parsing errors:** quoting or encoding problems; the files must be UTF-8 with comma delimiters. +- **Slow load:** very large datasets. + +### 1.14 Referenced image URLs +Prefix: `https://2250409810-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvpICEpxwEG3Hnd1kFkeJ%2Fuploads%2Fgit-blob-` + +| Blob | File | +|---|---| +| 9bd70b3421607b494be8a0e3fb2d395150861c2a | control_dash_board.png | +| 205b9d102bd714a0a30b30c05ec944b53e28db3c | plotly_controls.png | +| 90483ee3ef5425879a83b21a0a9dafcfb1d743f1 | automated_qc_table.png | +| ab00903d584e23c77d0ae1b6294351539be247c8 | automated_qc_scatter_plots.png | +| 8ec0c44ce8899121079b4811abfcb3c56c947369 | Heatmap_by_chip.png | +| 153505c2ed2f9de39a0f7d64a8901c1800bcae4e | Heatmap_by_plate.png | +| 5784fe29732b65391eed5816d323c426565aa21a | Trend_analysis_table.png | +| 3907991e5920484cc5b4d4ea6ed2aedba047a7ee | boxplot_anatomy.svg | +| d8480b03f04b51279a3bb93143f9f274d7aa9ba2 | Trend_analysis_plots.png | +| d04cff85ce4ba02b9c524d9ae379db159cd0b276 | qc_thresholds.png | +| b9b5549fcc25112218ae026ce571fd9f9a5551a3 | sample_selection_filter_table.gif | +| 77433c64bb421d96ed0eb3cbce620c9bece45c45 | sample_selection.gif | +| 77affb1c369d3d2af3b47afe3f23d1fe7c925c1b | larger_dataset_control_dashboard.png | +| 118fe22b8b9ff54ca551d4387f65c37498606bf8 | larger_dataset_automated_qc.png | +| c901b0b9dc097c99d7e723fa6f91b2eaf77eccc1 | check.png (readme tick icon) | + +(Append `?alt=media` to each URL.) + +- Config template file IDs (not downloaded): `/files/wqHVYLDo1m2wx2zQ9d2h`, `/files/GBZegmeDYoPinNXmvoHx`, `/files/n2MNa2RrPWQbssTS1ol4`, `/files/Zp6CKGOL4NkdsfQl71Pq`. +- External training guide: `https://support.illumina.com/content/dam/illumina-support/courses/eval-inf-controls/story_content/external_files/Infinium_Controls_Training_Guide.pdf` + +--- + +## 2. Applications / features page (and readme) + +### 2.1 Analysis types +1. Genotyping and QC +2. PGx – CNV calling +3. PGx – Star allele annotation +4. Cytogenetics analysis +5. Cytogenetics analysis + third-party interpretation platform (cloud only) +6. Methylation QC (cloud only) +7. QC report (local and cloud, listed in the readme) + +**Deployment:** a local CLI package ("no specialized server or hardware required") and a cloud GUI package. + +| Analysis | Local | Cloud | +|---|---|---| +| Genotyping | ✔ | ✔ | +| PGx CNV | ✔ | ✔ | +| PGx star allele | ✔ | ✔ | +| Cytogenetics | ✔ | ✔ | +| Cyto + interpretation platform | – | ✔ | +| Methylation QC | – | ✔ | +| QC report | ✔ (multi-dataset trend) | ✔ (single dataset per report) | + +### 2.2 Per-application details + +**Genotyping and QC** +- Variants: SNV and indel. Minimum 1 sample. +- Supports any Infinium genotyping array: human (including custom and semi-custom) and **non-human diploid species** when a user-provided reference genome is supplied. +- The vendor provides human FASTA for GRCh37 and GRCh38. +- Local commands: `genotype call`, `genotype gtc-to-vcf`, `qc call`, `qc report`. +- Cloud maximum: **1152 samples**. +- Inputs: IDATs, manifest (BPM/CSV), cluster file, genome FASTA, optional sample sheet, QC report config YAML. +- Outputs per sample: GTC, SNV VCF (optional), TBI (optional). +- Outputs per batch: genotype summary files, Final Report (**cloud only**), Locus Summary (**cloud only**; applies to human and non-human diploid), QC metrics files, QC report, warning/error logs. +- Cost: local is a no-cost download; cloud uses credits for analysis and storage. + +**PGx – CNV calling** +- Covers 7 target PGx genes across 10 target regions, plus genotyping. Variants: SNV, indel, CNV. +- **Minimum 24 samples, of which 22 must pass QC (LogRDev < 0.2); 96 recommended.** This implies a batch-referenced CN model. +- Local: `genotype call`, `genotype gtc-to-vcf` (optional), `pgx copy-number call`. Cloud maximum **384**. +- Inputs: add a PGx CN Model file. +- Outputs: PGx CNV VCF, BedGraph (optional, local), CN Summary file, Copy Number Batch file, QC metrics. +- Cost: local no cost; cloud uses credits. + +**PGx – Star allele annotation** +- More than 50 genes and 2400+ targets. Variants: SNV, indel, CNV and star-allele diplotype. Same 24/22/96 minimum. +- Local: `genotype call`, `genotype gtc-to-vcf`, `pgx copy-number call`, `pgx star-allele call`, `pgx star-allele annotate`. Cloud maximum 384. +- Inputs: add a PGx Database file. +- Outputs: Star Allele JSON per sample; Star Allele CSV diplotype summary and supporting files; CN summary; CN batch file. +- **Cost: "Local: Per sample analysis. Cloud: Per sample analysis"**, with credits for storage. This is the only licensed/paid-per-sample module. + +**Cytogenetics** +- Genome-wide CNV and LOH. Minimum 1 sample. +- Local: `genotype call`, `genotype gtc-to-vcf` (optional), `genotype gtc-to-bedgraph`, `cyto call`, `cyto annotate`. Cloud maximum 1152. +- Inputs: IDAT, manifest, cluster file, QC config, **Cytogenetics Model file**, **Cytogenetics Database file** (needed locally only), optional sample sheet. +- Outputs: GTC (optional on cloud), SNV VCF and TBI (optional), **Cytogenetics CNV VCF**, **Cytogenetics Annotation JSON**, BedGraph (optional, local), genotype summary, QC metrics, QC report. +- Readme features: CNV/LOH VCFs, annotated QC JSONs, bedGraph for LRR/BAF, and **adjustable thresholds: minimum deletion, duplication and LOH sizes, and smoothing parameters**. +- Cost: local free; cloud uses credits. + +**Cyto + interpretation platform** +- Cloud only. Automatic case creation in a downstream interpretation and case-management platform. +- Extra per-sample cost when data is uploaded to that platform. + +**Methylation QC** +- Cloud only. Minimum 1 sample, maximum 1152. Arrays: MSA and EPIC v1/v2 (from iScan) with recommended thresholds and all built-in controls. For non-human or custom arrays, probe availability varies and users must set thresholds. +- Readme: **21 algorithm-based quantitative control metrics** with adjustable thresholds, summary plots, and the proportion of CG probes passing a user-defined detection p-value threshold. +- Outputs: per-sample control-probe output and CG output; per-batch sample QC summary, summary plots, **principal component summary**, manifest files, logs. + +### 2.3 Product compatibility matrix (full) + +**Genotyping, PGx, Cyto** + +| Group | Product | Tested manifest | Analysis | Cloud ver. | Local ver. | Genome | Notes | +|---|---|---|---|---|---|---|---| +| Genotyping | ASA | ASA-24v1-0_E2 | Genotyping | v1.1, v1.4 | v1.0+ | GRCh37, GRCh38 | | +| Genotyping | BovineSNP50 v3 | BovineSNP50_v3_A1 | Genotyping | v1.1, v1.4 | v1.0+ | **UMD3** | non-human bovine | +| Genotyping | CGA | CGA-24v1-0_A1 | Genotyping | v1.1, v1.4 | v1.0+ | 37, 38 | | +| Genotyping | GCRA | GCRA-24v1-0_20068388_B2 | Genotyping | v1.1, v1.4 | v1.0+ | 37, 38 | | +| Genotyping | GDA | GDA-8v1-0_D2 | Genotyping | v1.1, v1.4 | v1.0+ | 37, 38 | | +| Genotyping | GSA v3 | GSA-24v3-0_A2 | Genotyping | v1.1, v1.4 | v1.0+ | 37, 38 | | +| Genotyping | GSA v4 | GSA-48v4-0_20085471_D2 | Genotyping | v1.1, v1.4 | v1.0+ | 37, 38 | EX product | +| Genotyping | JSA | JSA-24v1-0_B2 | Genotyping | v1.1, v1.4 | v1.0+ | 37, 38 | | +| Genotyping | PRSbooster | PRSbooster_20083382_A | Genotyping | v1.1, v1.4 | v1.0+ | GRCh37 only | | +| PGx | GCRA-ePGx | GCRA-PGx-24v1-0_20084467_C2 | GT; PGx CNV; star allele | v1.1+ | v1.1+ | GRCh38 only | EX PGx | +| PGx | GDA-ePGx | GDA_PGx-8v1-0_20042614_G4 | GT; PGx CNV; star allele | v1.1+ | v1.1+ | GRCh38 | current G-series | +| PGx | GSAv4-ePGx | GSA-PGx-48v4-0_20079540_E2 | GT; PGx CNV; star allele | v1.1+ | v1.1+ | GRCh38 | EX PGx | +| Cyto | GDA Cyto | GDACyto-8v1-0_20047166_E2 | Cyto (+ interp. cloud only) | v1.2+ | v1.2+ / N/A | 37, 38 | | +| Cyto | GSA Cyto | GSACyto-24v1_20044998_C2 | Cyto (+ interp.) | v1.2+ | v1.2+ / N/A | 37, 38 | | +| Cyto | CytoSNP-850K iScan | CytoSNP-850Kv1-4_iScan_B2 | Cyto (+ interp.) | v1.2+ | v1.2+ / N/A | 37, 38 | | +| Cyto | CytoSNP-850K NS550 | CytoSNP-850Kv1-4_NS550_B2 | Cyto (+ interp.) | v1.3+ | v1.3+ / N/A | 37, 38 | NextSeq-550-scanned IDATs | + +**Methylation (cloud v1.0; local N/A; GRCh38)** +- EPIC v1: `infinium-methylationepic-v-1-0-b5-manifest-file.csv` +- EPIC v2: `EPIC-8v2-0_A2.csv` +- EPIC-Xtra: `EPIC-Xtra_GS_20144570_A1.csv` (custom) +- MSA: `MSA-48v1-0_20102838_A1.csv` + +**Species:** human; bovine (UMD3); any non-human diploid organism with a user reference. **Builds:** GRCh37, GRCh38, UMD3. PGx is GRCh38 only. + +### 2.4 Performance and accuracy claims (readme) +- Genotyping accuracy greater than 99.5%. A genotyping VCF in as little as **35 s per sample**. +- PGx CNV accuracy greater than 95%. +- CYP2D6 call rate greater than 97%. All PGx results in **about 1 min per sample**. +- Methylation: 21 control metrics. + +### 2.5 Licensing and pricing +- Local genotyping, cyto and PGx CNV: a free download from the support site. +- Star-allele annotation: per-sample charge, locally and on cloud. +- Cloud: credit-based for compute and storage. +- Interpretation-platform integration: extra per-sample fee. + +### 2.6 Integration points +- **Scanner:** IDATs from the iScan scanner; NextSeq 550 IDATs for CytoSNP-850K. The cloud has a "troubleshoot iScan" page, implying direct scanner upload. +- **LIMS / sample sheet:** metadata propagation. The sample sheet provides `Sample_Plate` and `Sample_Well`. +- **Downstream:** + - VCF + TBI; + - bedGraph for LRR/BAF, for genome-browser visualization; + - GTC, which is interoperable; + - Final Report and Locus Summary (legacy desktop-tool-style formats, cloud only); + - the interpretation platform, via automatic case creation; + - sharing of cloud projects. +- **No LIMS API** is mentioned on these pages. + +--- + +## 3. Error and warning messages (verbatim) + +`❌` marks an error and `⚠️` a warning. + +- ❌ `Input data folder does not exist: data/non_existent_dir` +- ❌ `No valid dataset folders detected. Each folder must include at least: controls.raw_metrics.csv, controls.qc_metrics.csv` +- ❌ `Dataset MyDataset is missing required file(s): ... controls.qc_metrics.csv ...` +- ❌ `Number of labels (2) does not match number of datasets (3).` +- ⚠️ `Label sanitized: My Label<1> → My_Label_1` +- ❌ `Duplicate labels after sanitization: dataset (x2). Each dataset label must be unique.` +- ❌ `Mixed dataset types are not supported in a single report. Genotyping datasets: geno_run_A, geno_run_B ... Methylation datasets: meth_run_C ...` +- ❌ `Invalid --output-format value. Only csv or xlsx are accepted.` +- ❌ `QC config file was provided but does not exist: /path/to/config.yaml` +- ❌ `Input file must be a YAML file with extension .yaml/.yml. Current config file extension: .json` +- ❌ `Failed to parse QC config as YAML ...` +- ❌ `QC config must be wrapped in a top-level QC object containing a Report object.` +- ❌ `Invalid threshold overrides: Unknown threshold key ...` +- ❌ `Invalid threshold overrides: Invalid numeric value ...` +- ❌ `Threshold for Autosomal Call Rate must be between 0 and 1 ...` +- ❌ `Threshold for stainingGreen must be non-negative ...` + +Categories listed in prose: the input directory is missing; required files are missing; the label count doesn't match; labels become non-unique after sanitization; genotyping and methylation datasets are mixed; the output format is invalid; the threshold configuration is invalid. + +Other in-report messages: +- The notice that replaces scatter plots above 12,000 samples. Its exact text is not given. +- Hints: the Notepad `.yaml.txt` warning, and the case-sensitive CLI warning. + +--- + +## 4. Algorithm hints +1. **Control ratios.** + - Background plus offset appears in the denominator or numerator for Target Removal and NSB ("(Bkg + offset)"). This matches the plan's `bkg + x` with x = 3000. + - Staining is High/Bkg per channel. + - Extension green = min(Ext C,G green) / max(Ext A,T green); extension red = min(Ext A,T red) / max(Ext C,G red). + - NP uses the same min/max pattern. + - Hybridization is green High/Med and Med/Low. + - Stringency is PM/MM. The channel is ambiguous: the text says red and the UI says green. + - Restoration is green over background. + - All of this matches plan §9.1. +2. **TGA_Ctrl_5716 Norm R** is the normalized R of a specific PGx assay-control locus, with threshold ≥ 1. It is reported per sample in the sample summary and in trend statistics. +3. **Autosomal Call Rate vs Call Rate:** both are reported; functional QC uses the autosomal one. +4. **LogRDev** = "LRR genome-wide SD". Sex estimate is M/F/U. +5. **Chip completeness:** the number of expected positions per chip comes from the chip format. "Missing samples" = expected positions − observed positions. "Complete chips" have every position filled. +6. **Batch requirement for PGx CN:** at least 24 samples with at least 22 having LogRDev < 0.2. This suggests per-batch normalization of intensities (a reference-panel median) before CN calling. +7. **Cyto:** parameters for minimum deletion, duplication and LOH size plus smoothing suggest segmentation with size filters. Outputs are a CNV VCF, an annotation JSON (with ISCN-like annotation from a cyto database) and bedGraph tracks. +8. **Methylation QC:** 21 control metrics, a detection p-value per CG (the fraction of CGs passing), and a PCA summary. +9. **Thresholds** come from the null-distribution centre and spread across more than 10 datasets. This suggests offering a data-driven "suggest thresholds" function (for example median − k·MAD). +10. **Excluded raw categories:** NEGATIVE and NORM are used internally (NORM for normalization, NEGATIVE for background/p-values) but are not reported. +11. Plate information from IDATs implies that the IDAT RunInfo/metadata blocks carry plate and well values. The sample sheet overrides them. + +--- + +## 5. Gap analysis vs the SimurgArray plan (concrete spec additions) + +The plan's §9.5 specifies a self-contained HTML report with a sample table, control heatmap, CR-vs-LogRDev scatter, sex plot, intensity distributions, chip layout and TSV/XLSX export. §9.2 has the flags CR < 0.98 and LogRDev > 0.20. The vendor tool goes considerably further. The proposed additions follow. + +### 5.1 QC data model and interchange +- **G1.** Emit three stable per-batch CSV artefacts as a decoupled report input contract: + - `controls.raw_metrics.csv` (SampleId, Category, BeadAddress, ControlName, ColorLabel, GreenIntensity, RedIntensity); + - `controls.qc_metrics.csv` (SampleId, scan metadata ImagingDate/ScannerId/ScannerVersion/SamplePlate/SampleWell, then one column per control ratio); + - `sample_summary.csv` (Sample ID, Name, Folder, Autosomal CR, CR, LRR SD, Sex, optional assay-control Norm R, barcode, position, and all sample-sheet columns). + - The report subcommand must consume only these files, so a report can be regenerated or merged without raw data. +- **G2.** Add a control-only QC path, `simurg qc call`, that works from IDAT plus CSV manifest without a cluster file, for genotyping and methylation. +- **G3.** Extract scan metadata from IDAT (scan date, scanner ID, software version, and plate/well where present). Sample-sheet values override IDAT values. +- **G4.** Add the categories NEGATIVE, NORM, `NP (G) 1..5`, `Biotin(5K)` and `DNP(20K)` to an exclusion list for raw-probe reporting, while still using them internally. + +### 5.2 Threshold configuration +- **G5.** Define a YAML schema `QC: Report: {key: number|null}` with the keys: + - `callRate`, `logRDev`; + - `stainingGreen`, `stainingRed`, `extensionGreen`, `extensionRed`, `targetRemovalI`, `targetRemovalII`; + - `hybGreenHighMed`, `hybGreenMediumLow`, `restoration`, `stringency`; + - `nonSpecificBindingGreen`, `nonSpecificBindingRed`, `npGreen`, `npRed`; + - `tgaControl` (generic name: `assayControlNormR`, with a configurable locus name); + - methylation: `bisulfiteConversionI{Green,Red}{,Bg}`, `bisulfiteConversionII{,Bg}`, `specificityI{Green,Red}`, `specificityII{,Bg}`. + - `null` disables a check. + - Add an optional per-key `direction: below|above`, since the UI allows it. + - SimurgArray may keep its own camel-case key names; key-name compatibility is optional. +- **G6.** Precedence is CLI > YAML > defaults. Provide `--threshold-call-rate` and `--threshold-lrr-sd`. Validate: call rate in [0, 1], other values ≥ 0, known keys only, numeric values only, top-level structure present, `.yaml`/`.yml` extension required. +- **G7.** Ship four starting-point profiles: non-EX genotyping, EX genotyping, EPIC methylation, MSA methylation. Document that they are review cutoffs. Reconcile the conflicting defaults found here, recording each as a "profile" value: + - LogRDev: 0.15 vs 0.20; + - target removal: 5 vs 1; + - hybridization: 1.25 vs 1; + - stringency: 1.5 vs 2; + - NSB: 5 vs 1. +- **G8.** Add a `simurg qc suggest-thresholds` command. It fits a robust centre and spread of each metric over a reference cohort and proposes cutoffs. + +### 5.3 QC logic +- **G9.** Keep two independent status axes: + - Functional: PASS/FAIL from call rate and LRR SD. Status is "N/A" when there is no genotyping. + - Control: CLEAR/FLAGGED, with a `control_flag_codes` column holding a delimited list of failing keys. +- **G10.** Add an assay-control locus metric (the normalized R of a named control probe) for PGx-type products. Include it in the flags and in the trend statistics. +- **G11.** Report both Autosomal Call Rate and overall Call Rate. Only the autosomal value drives PASS/FAIL. + +### 5.4 Report UI (self-contained HTML, bundled JS, no network) +- **G12.** Five views: + 1. Control Dashboard: an ACR box-plot banner, plus per-category, per-channel scatter plots of raw control intensities with one trace per probe and "expected behaviour" help text. + 2. Automated QC: two status histograms (count and %), the sample table, and per-metric scatter plots with formula help text and a dashed threshold line labelled "Flag if below X". + 3. Sample heatmaps: chip or plate grid, continuous or binary colour scale, paging, and a max-chips setting. + 4. Trend analysis: the dataset summary table plus box, bar and sex plots. + 5. Threshold config modal with Apply / Download YAML / Upload YAML. Changes are session-only. +- **G13.** Interactions: + - Linked brushing: a box or lasso selection in any scatter highlights the same samples in all scatters and filters the table. Double-click clears the selection. + - Selecting table rows highlights the matching points. A "Select none" control clears it. + - Export (xlsx/csv) exports only the selected rows when a selection exists. + - Columns can be shown or hidden. Every column is sortable and has a filter (text or range). The table has global search and pagination. + - Controls: Sort plots by any metric or metadata field; Color by or Facet by any categorical metadata field with 2–20 unique values; dataset selector; colour-palette selector. +- **G14.** Chip geometry is derived from the positions present (RxxCyy) and the known chip formats, so that 24-, 48- and 8-sample layouts all work. The plate is 8×12 by well. +- **G15.** Trend summary columns: + - #samples, #complete/#chips, #missing positions, scan date range; + - ACR min, median, mean (SD), # below threshold; + - LRR SD mean (SD), median, # above threshold; + - control-locus mean (SD), # below threshold; + - #M/#F/#U. +- **G16.** Scale behaviour: use tabs by category above 1,000 samples per dataset. Above 12,000, disable scatter plots and show a notice (or better, add WebGL/aggregated density plots so they are not disabled). Warn when the total exceeds 20,000. Offer `--split-by run|plate|center`. + +### 5.5 Multi-dataset and CLI behaviour +- **G17.** `simurg qc report --data` accepts a folder, a comma-list or a parent folder (recursive discovery of folders containing the required files). `--label` is a comma-list whose count must match the datasets. Labels are sanitized (non-alphanumeric characters become `_`) with a warning, deduplicated with `_2`, `_3` suffixes, and duplicates after sanitization are an error. +- **G18.** Refuse to mix genotyping and methylation datasets, with an error listing both groups. Allow mixed chip formats and assay-control presence. +- **G19.** Output names are dated: `qc_report_YYYY_MM_DD.html` and `qc_table_YYYY_MM_DD.{xlsx,csv}`. The xlsx gets conditional formatting and a "Thresholds" sheet recording each value and its source (default, YAML or CLI). The csv has values only. Metadata columns are sorted alphabetically. +- **G20.** Add a privacy option, `--drop-metadata col1,col2` or `--no-metadata`, so a report can be shared without sample-sheet PHI. The vendor tool requires editing the CSV instead. +- **G21.** Adopt the error and warning catalogue from section 3 as acceptance tests. + +### 5.6 Breadth items missing from the plan's scope +- **G22.** Non-human diploid support: a user-supplied FASTA or genome build and a species-agnostic chromosome list, with a configurable sex-chromosome set and autosome definition. Bovine UMD3 is the test case; check whether any BovineSNP50 data is available for the dataset tiers. +- **G23.** Legacy-desktop-style outputs: a "Final Report" (sample × SNP long or matrix format) and a "Locus Summary" (per-SNP call frequency, cluster statistics). Plan §7.9 has locus stats; add a writer. +- **G24.** Cyto module (plan §10): expose `min_del_size`, `min_dup_size`, `min_loh_size` and smoothing parameters. Outputs: CNV/LOH VCF, annotation JSON, and LRR/BAF bedGraph. Accept NextSeq-550-scanned IDATs. +- **G25.** PGx CN (plan §11): define a batch requirement (default ≥ 24 samples with ≥ 22 passing LRR SD < 0.2, 96 recommended) and a clear error when it is not met. Scope: 7 genes / 10 regions. Star alleles: more than 50 genes. Target metrics to validate against: CN accuracy > 95%, CYP2D6 call rate > 97%. +- **G26.** Methylation QC (plan v2 item 14): 21 control metrics (bisulfite I/II, specificity I/II, target removal I/II, and so on), a detection p-value (fraction of CpGs passing), a PCA summary, and support for EPIC v1/v2, EPIC-Xtra and MSA manifests. +- **G27.** Performance benchmark targets: genotyping VCF at ≤ 35 s per sample and PGx at ≤ 1 min per sample on a commodity machine; genotype concordance > 99.5% vs the oracle. Add these to §16.5 and §19. +- **G28.** Product-matrix test plan: at least one dataset per tested manifest family (ASA, CGA, GCRA, GDA, GSA v3/v4, JSA, PRS, PGx GCRA/GDA/GSA, Cyto GDA/GSA/CytoSNP-850K), across GRCh37/38 where relevant. PRS-type products are GRCh37 only and PGx products are GRCh38 only. diff --git a/docs/research/D_cyto_methyl_pgx.md b/docs/research/D_cyto_methyl_pgx.md new file mode 100644 index 0000000..af55b5c --- /dev/null +++ b/docs/research/D_cyto_methyl_pgx.md @@ -0,0 +1,433 @@ +# D — Cloud analysis types, Cytogenetics, Methylation QC, PGx (CNV + star alleles), FAQ, Support + +> **Archived Phase-0 study (sanitized copy, see `README.md`).** Written 2026-09-27, before the decisions in +> `SIMURGARRAY_MASTER_PLAN.md` §2. The analysed vendor product is called "the reference product" and its CLI +> `refcli`; its documentation URLs are replaced by `[ref-docs:…]` tokens. Where this file speaks of a clean room, +> legal clearance, or running/benchmarking the vendor binary, plan §2 supersedes it: personal research; MIT/BSD/Apache +> code may be reused with attribution; GPL tools are subprocess oracles only; vendor binaries are never run for +> comparison, inspected or decompiled; oracles are published vendor-produced GTCs, gtc2vcf and BeadArrayFiles. + +Source set (read completely): +- `pages/product-guides/cloud-analysis.md` +- `pages/product-guides/cloud-analysis/overview.md` +- `.../overview/genotyping.md`, `...-cytogenetics-analysis.md`, `...-methylation-qc.md`, `...-pgx-cnv-calling.md`, `...-pgx-star-allele.md` +- `.../overview-1.md` + `overview-1/{launch-analysis,plan-analysis,manage-data,share-project,troubleshoot-iscan}.md` +- `pages/pharmacogenomics-pgx-reference/{pgx-cnv-coverage,pgx-allele-definitions-and-pgx-guidelines,pgx-star-allele-coverage}.md` (the 476 KB coverage page was parsed with Python, not transcribed) +- `pages/support-and-updates/{faq,support-and-additional-resources}.md` + +Because the in-scope analysis-type pages are thin (they mostly point elsewhere), the method-level details the task asks for (methylation metric formulas, cyto VCF/JSON semantics, PGx scoring/output fields, error strings) were pulled from the linked pages `product-guides/output-files.md`, `overview/our-features.md`, `product-guides/local-analysis.md` (cyto/pgx CLI option tables only) and the release notes. Every such item is tagged **[xref: file]**. Items not in the docs at all are tagged **[HYP]** (our inference) so they are never mistaken for documented behaviour. + +Derived data files written alongside this report: +- `pgx_star_allele_coverage.csv` — 2,405 rows (gene × allele), 58 genes. Columns: `gene, allele, allele_kind, result_basis, n_alleles_for_gene, GDA_ePGx, GSAv4_ePGx, GCRA_ePGx, notes`. +- `pgx_masked_variants.csv` — 24 rows (product, manifest, gene, masked variant-ID list). + +Vendor terms used below are there only to identify what is being described: platform (cloud hub), analysis types, product/array names, file names. The gap analysis at the end uses generic wording only. + +--- + +## 0. The cloud platform (execution model) + +### 0.1 Analysis types offered (cloud) +| Analysis type (UI string) | Local equivalent | Sample min | Cloud max batch | +|---|---|---|---| +| Genotyping and QC | `genotype call`, `genotype gtc-to-vcf`, `qc call`, `qc report` | 1 | 1152 | +| PGx – CNV calling | + `pgx copy-number call` | 24 with ≥22 passing (LogRDev < 0.2); 96 recommended | 384 | +| PGx – Star allele annotation | + `pgx star-allele call`, `pgx star-allele annotate` | same as CNV | 384 | +| Cytogenetics analysis | + `genotype gtc-to-bedgraph`, `cyto call`, `cyto annotate` | 1 | 1152 (known issue: may fail around 200 samples/batch from memory; run smaller batches) | +| Cytogenetics + external interpretation (case-management integration) | cloud only | 1 | 1152 | +| Methylation QC | cloud only (no local command) | 1 | 1152 | +[xref: our-features.md, release notes] + +Deprecated in Q1 2026 (pipeline versions only, not analysis types): Methylation QC 1-0-0, PGx Star Allele Annotation 1-0-0, Genotyping 1-0-0, PGx CNV Calling 1-0-0. + +### 0.2 Prerequisites +- Platform subscription (Basic/Professional/Enterprise); workgroups must exist before login; workgroup owner must hold "Has Access" role (not "Has Access + Archive"). "Collaborative" workgroup (checkbox "Enable collaborators outside of this domain") needed to share projects. +- Credits for storage/compute; per-sample licence for PGx star-allele pipelines. +- Optional scanner integration: scanner control software ≥ 4.2.1. +- Accept all EULAs before scanning. +- Network ≥ 1 GbE recommended for uploads. +- BeadChip accessioning before scanning is no longer required (automated). + +### 0.3 Hub structure +"Microarray Hub" = Runs tab → Microarray scans tab; two sub-tabs: **Data Management** and **Planned Analyses**. Workgroup context must be active (name in top-right). + +### 0.4 Launch analysis (immediate) — workflow & inputs +1. Analysis Name. 2. Select Project (existing or New). 3. Type of Analysis. 4. (Optional) "Add Custom Configuration": named; product files uploaded or selected; file-name constraints per platform data-naming rules; options vary per type. 5. Choose Configuration Settings entry. 6. Next. 7. Sample source — one of: + - **Import Sample Sheet** (template downloadable; only way to select a subset of samples within a BeadChip), + - **Select BeadChips** (whole chips), + - **Import IDAT Files** (upload from local folder; stored for future analyses in the workgroup; *manually uploaded IDATs are not QC-checked for failing registration scores*). +8. Launch Analysis. +Outputs: Analyses tab → status (e.g. initializing/complete) → Files tab → Output folder. + +Troubleshooting (verbatim concepts): background processes after IDAT upload "should take a few minutes at most"; if samples stay not-ready → re-import; **Product Mismatch**: every BeadChip requires a product association; product of configuration must match IDAT product; **Upload Timeout**: idle timeout logs user out and stops upload → stay active or split into batches; timeout configurable for enterprise domains. + +### 0.5 Planned analysis (auto-launch) +Same steps 1–6, then: 7. Import Sample Sheet (samples need not be scanned yet). 8. **Maximum failed scanned samples** threshold. 9. Save. +- A sample "fails during scanning" when **stripe registration < 0.75** (flagged as potentially misregistered; red in scanner progress window). +- Execution rules: auto-launch when all listed samples are available; **abort** if failed-scan count > threshold; if failures ≤ threshold launch with passing samples only. +- Overview card counts: Planned; Planned & Launched; Aborted Before Launch; date-range filter (modified date); click count to filter. +- Detail page sections: Configuration (Analysis Name, Project, Analysis Type, Detailed Configuration Settings), Samples (Samplesheet download, Maximum Failed Samples Allowed), Status (Status: planned/launched/aborted; Array Status Summary; Export Sample Status file). +- Per-sample status/reason table (verbatim): + +| Status | Reason | +|---|---| +| Ready | Sample will be included in analysis due to successful data upload. | +| Failed | Sample will be excluded from analysis due to scanning failure. | +| Pending | Sample is pending data upload. | + +- Only `planned` (not launched) analyses may be deleted; deletion is permanent. + +### 0.6 Data management +Filter by Upload Status, sort/filter by Upload Date; per-row or page-wide bulk delete; "Deleting the selected items will permanently delete them and the action cannot be undone. Deleting items can affect ongoing analysis." + +### 0.7 Sharing +Share-by-link from Projects tab (Share → Get Link). Owner keeps ownership/write; if owner deletes data, collaborators lose access. Either sending or receiving domain must be collaborative. Same regional instance required (no cross-region transfer). Enterprise domains use share-by-link, not share-by-transfer. + +### 0.8 Scanner integration troubleshooting +Firewall: block inbound, allow outbound; allow-list endpoints: +| Endpoint | Category | Purpose | +|---|---|---| +| [ref-cloud-endpoint] | Required | Send IDAT files to platform | +| o.ss2.us, ocsp.digicert.com, ocsp.pki.goog/gsr2, ocsp.rootca1.amazontrust.com, ocsp.rootg2.amazontrust.com, ocsp.sca1b.amazontrust.com | Required | Certificate authorization | +| fonts.gstatic.com | Required | Display fonts | +| fonts.googleapis.com | Recommended | Display fonts | +| cdn.walkme.com, cdn3.userzoom.com, dpm.demdex.net, illuminainc.demdex.net, illuminainc.tt.omtrdc.net, smetrics.illumina.com, google.com, google-analytics.com, stats.g.doubleclick.net | Recommended | Telemetry | +| illumina.com | Optional | Support material | + +**IDAT FAIL status**: scanner marks sections with poor registration as FAIL; such samples are excluded (IDATs exist but are not selectable via BeadChip table or sample sheet). Registration quality is in the scanner's `metrics.txt`. + +--- + +## 1. Genotyping and QC (cloud) + +- **Inputs**: IDATs; manifest (BPM/CSV) and cluster file (EGT) — may be pre-set; genome FASTA (pre-set; GRCh37/GRCh38 for human; user FASTA for non-human diploid); optional sample sheet; QC-report config file (pre-set). [xref: our-features] +- **Custom configuration parameters**: + - Output toggles: VCF on/off; Final Report on/off; Locus Summary on/off. + - GenCall Score Cutoff override (default not stated on this page; genotyping default elsewhere is 0.15 — see other analysis files). + - "Use Infinium I probe no-calls" — constrain possible genotypes using Infinium I no-call information. + - QC Report output format: **xlsx (default)** or CSV. +- **Recommendations**: non-human species → turn off VCF (VCF needs genome mapping, only provided for GRCh37/38). **~400+ samples → turn off Final Report** (can reach **50+ GB**). +- **Outputs**: per sample GTC, SNV VCF (+TBI, optional); per batch genotype summary files, Final Report (cloud only), Locus Summary (cloud only), QC metrics files (`controls.raw_metrics.csv`, `controls.qc_metrics.csv`), QC report, warnings/errors. [xref] +- **Functional QC defaults** (QC report): call rate threshold 0.98, LogRDev threshold 0.20. [xref: local-analysis `qc report`] +- **Supported arrays** (cloud v1.1/v1.4): ASA-24v1-0_E2, BovineSNP50_v3_A1 (UMD3), CGA-24v1-0_A1, GCRA-24v1-0 B2, GDA-8v1-0_D2, GSA-24v3-0_A2, GSA-48v4-0 D2, JSA-24v1-0_B2, PRSbooster (GRCh37 only); also the PGx and cyto products. "Any Infinium genotyping array incl. custom/semi-custom and non-human diploid". + +--- + +## 2. Cytogenetics analysis + +### 2.1 Inputs +IDATs; manifest + cluster (pre-set); QC report config; **cytogenetics model file** (.dat, pre-set on cloud); cytogenetics annotation database (local only; cloud pre-set, e.g. `CytoAnnotateData_DAv1.2.0.zip`); optional sample sheet. + +### 2.2 Parameters (cloud "Cytogenetics Threshold Adjustment"; shown after product files are selected, saved in the configuration) +| Threshold | Default | Min | Max | CLI equivalent [xref] | +|---|---|---|---|---| +| GTC Output | False | – | – | – | +| SNV VCF Output | False | – | – | – | +| DUP minimum size (kb) | 50 | 0 | 250000 | `--min-dup-size` | +| DUP minimum probes | 10 | 0 | 250000 | `--min-dup-probes` | +| DEL minimum size (kb) | 25 | 0 | 250000 | `--min-del-size` | +| DEL minimum probes | 10 | 0 | 250000 | `--min-del-probes` | +| LOH minimum size (kb) | 3000 | 0 | 250000 | `--min-loh-size` | +| LOH minimum probes | 500 | 0 | 250000 | `--min-loh-probes` | +| GAINLOH minimum size (kb) | 500 | 0 | 250000 | `--min-gainloh-size` | +| GAINLOH minimum probes | 300 | 0 | 250000 | `--min-gainloh-probes` | +| mDUP minimum size (kb) | 50 | 0 | 250000 | `--min-mdup-size` | +| mDUP minimum probes | 10 | 0 | 250000 | `--min-mdup-probes` | +| mDEL minimum size (kb) | 25 | 0 | 250000 | `--min-mdel-size` | +| mDEL minimum probes | 10 | 0 | 250000 | `--min-mdel-probes` | +| mLOH minimum size (kb) | 3000 | 0 | 250000 | `--min-mloh-size` | +| mLOH minimum probes | 500 | 0 | 250000 | `--min-mloh-probes` | +| CNV Smoothing window size | 5 | 0 | 1000 | `--smoothing` (probes on each side of the centre probe used to smooth LRR) | +Local-only extras [xref]: `--min-qual` default **20** (CNV and LOH QUAL filter for reporting in JSON); `--max-mosaic-fraction` default **1.0** (mosaic calls with MF ≥ value are "promoted" to non-mosaic and tagged `HIGHFRACTION`, keeping MF). +"Adjusting thresholds will impact the number of events called and thus, the output in the VCF and JSON files." +Filtering semantics [xref release notes 1.3]: `cyto call` filters by **effective size**; `cyto annotate` filters by **raw size**. + +### 2.3 Event types / states [xref: output-files] +- VCF ALT: `` (copy number loss), `` (copy number gain), `` (AOH/LOH/ROH). +- IDs: `DEL:chr:start:end`, `DUP:…`, `MosaicDEL:…`, `AOH:…` (e.g. `AOH:22:9426438:14766246`). +- INFO `LOHTYPE` ∈ {**AOH** (germline, CN-neutral or gain LOH), **CNLOH** (somatic CN-neutral LOH), **GAINLOH** (somatic, CN-gain LOH)}; examples: LOH with CN=2, GAINLOH shown with CN=3. +- INFO `MOSAIC` flag; `HIGHFRACTION` flag for promoted events; `SVLEN`, `PROBE`, `END`. +- FORMAT `GT` (hard-coded **1/1** for all cyto entries), `CN` (integer; "CN=4 indicates 4 or 4+"), `NR` (aggregated normalized intensity), `LRD` (SD of LRR in event), `MF` (estimated mosaic fraction; `.` if non-mosaic). +- Header: `##OverallPloidy=1.9`, `##GCCorrect=True`, `##platform=cytoplatform`, `##product=…`, `##genomeBuild=37|38`. +- Mosaic detection sensitivity: ≈ **>15 % mosaic fraction** for one-copy-difference states (CN2/CN1, CN2/CN3 in diploid; CN1/CN0, CN1/CN2 in haploid regions); mosaic dup on male Y supported; the former 5 % hard MF cutoff was removed (v1.4). [xref release notes] + +### 2.4 QC gating [xref] +- `QUAL = −10·log10(1 − P(called state))`, capped at **60**, min 0; FILTER **Q10** when QUAL < 10. +- FILTER **SampleQuality** when sample LogRDev > **0.2**. +- FILTER **LowFraction** — mosaic variant with MF below threshold (threshold value not documented). +- JSON reporting additionally requires QUAL ≥ `minQual` (20). +- Unknown sex from genotyping → caller tries to resolve (log "Sample XXX sex updated from Unknown to Male."); if unresolved, assumes **male**. + +### 2.5 Annotation / ISCN [xref] +Per-sample JSON: `annotateDb`, `softwareVersion`, `referenceGenome`, `annotationType` (0 = Constitutional, 1 = Oncology; only constitutional supported), `genomeBuild`, `databaseSources` (RefSeq GCF_000001405.40-RS_2023_10; Ensembl 112), `iscnVersion` ("ISCN 2020"), `sampleId`, `sampleName`, `gcCorrect`, all min thresholds, `overallPloidy` (length-weighted mean ploidy; sex-dependent baseline), `callRate`, `logRDev`, `medianLogRDev`, `bafDev{AA,AB,BB}`, `numLOHOver1M`, `numLOHOver8M`, `totalSizeLOHOver1M` (incl. GAINLOH at sample level; excl. at chromosome level), `copyNumberMedian` (length-weighted), `percentLOH`, `sexEstimate`, `traditionalNomenclature`, `microarrayNomenclature`. +Per chromosome: `size, percentHet, hasMosaicism, lrrMedian, lrrMean, lrrDev, numLOHOver1M/8M, totalSizeLOHOver1M, percentLOH, copyNumberMedian, copyNumberMean, minLogRRatio, maxLogRRatio, medianMosaicFraction, numberDel/Dup/LOH/GainLOH/Mosaic`. +Per event: `id, chrom, start, end, callType (DEL/DUP/LOH), mosaicState, mosaicFraction, copyNumber, qualityScore, size, effectiveSize, probeCount, percentHet, lrrMedian, lrrDev, bafDev, startCytoBand, endCytoBand, traditionalNomenclature, microarrayNomenclature, geneCount, genes`. +- **effectiveSize**: gap-excluded length; a gap = probe spacing > **150 ×** median spacing, replaced by the median spacing. +- ISCN strings: traditional `del(1)(p36.33p36.33)`; microarray `arr[GRCh37] 4p16.3(3562944_3627954)x3`, `…x2 hmz` for LOH; ISCN only for events **> 1 kb**; not (fully) for LOH and mosaic events; no mosaic ISCN notation. +- Genes: RefSeq HGNC symbols whose transcripts intersect the event, plus Ensembl IDs without a symbol. + +### 2.6 Limitations [xref release notes] +Constitutional only; validated only on GDA-Cyto-8, GSA-Cyto-24, CytoSNP-850K (iScan; NS550 IDATs supported from v1.3 but earlier "not formally validated"); centromeres prone to false positives; large events may be fragmented (need visual review); no calls in PAR for certain manifests; memory failure around 200 samples/batch. + +### 2.7 External interpretation integration (cloud only) +Requires extra interpretation-platform subscription ("Array", "Professional" or "Enterprise"); platform notifications: Event "Analysis Success", Type SNS, regional Address, Payload Version **v4**, region auto-filled, optional "Send Test Message". Version compatibility governed by platform-minor-version + case-pipeline-version (both must be updated); v1.3 cyto not compatible with interpretation platform v38 (use 1.2.0 pipeline). Outputs reduced to GTC (opt), SNV VCF (opt), cyto VCF, JSON, bedgraph, genotype summary, logs. + +### 2.8 Supported arrays +GDACyto-8v1-0_20047166_E2, GSACyto-24v1_20044998_C2, CytoSNP-850Kv1-4_iScan_B2 (cloud/local v1.2+), CytoSNP-850Kv1-4_NS550_B2 (v1.3+); GRCh37 and GRCh38. + +--- + +## 3. Methylation QC (cloud only) + +### 3.1 Inputs +IDATs (from the scanner), methylation manifest CSV (pre-set; must contain `[Assay]` and `[Controls]` sections with IlmnID, AddressA_ID, AddressB_ID, Color_Channel; controls with 4 columns Address,Type,Color_Channel,Name), optional sample sheet (metadata/grouping: Sample_ID, Sample_Group, arbitrary user fields). + +### 3.2 Parameters and defaults (21 control thresholds + 2 global) +| Threshold | MSA default | EPIC (v1/v2) default | +|---|---|---| +| Restoration¹ | 0 | 0 | +| StainingGreen | 5 | 5 | +| StainingRed | 5 | 5 | +| ExtensionGreen | 5 | 5 | +| ExtensionRed | 5 | 5 | +| HybridizationHighMedium | 1 | 1 | +| HybridizationMediumLow | 1 | 1 | +| TargetRemoval1 | 1 | 1 | +| TargetRemoval2 | 1 | 1 | +| BisulfiteConversion1Green | 1 | 1 | +| BisulfiteConversion1BackgroundGreen | 0.5 | 1 | +| BisulfiteConversion1Red | 1 | 1 | +| BisulfiteConversion1BackgroundRed | 0.5 | 1 | +| BisulfiteConversion2 | 0.5 | 1 | +| BisulfiteConversion2Background | 0.5 | 1 | +| Specificity1Green | 1 | 1 | +| Specificity1Red | 1 | 1 | +| Specificity2 | 1 | 1 | +| Specificity2Background | 1 | 1 | +| NonpolymorphicGreen | 2.5 | 5 | +| NonpolymorphicRed | 3 | 5 | +| BgCorrectionOffset (x) | 3000 | 3000 | +| PvalThreshold | 0.05 | 0.05 | +¹ FFPE restore kit used → raise Restoration from 0 to 1. +Release-notes also list "proportion probes passing" as adjustable, but the current docs state probe detection rate is **not** used for pass/fail. +Guidance: thresholds are a starting point for custom/semi-custom arrays; tuning may depend on BeadChip, lab, scanner settings, bisulfite method, FFPE; tune on a dataset deemed acceptable by proportion of probes passing. Several docs say "Do not change the default threshold" for hybridization, target removal, specificity and background ratios (only the offset may change); "may be increased for some scanners" for staining, extension, BS-conversion C/U ratios, non-polymorphic. + +### 3.3 Metric formulas [xref: output-files] +Let `bkg_G` = highest green intensity of Extension A or T; `bkg_R` = highest red intensity of Extension C or G; `x` = offset (3000). Pass when metric > threshold (documented as "> threshold"). +| Metric | Formula | +|---|---| +| restoration | Green / (bkg_G + x) | +| staining_green | Biotin(High) / Biotin(Bkg) | +| staining_red | DNP(High) / DNP(Bkg) | +| extension_green | min(Ext C, Ext G) green / max(Ext A, Ext T) green | +| extension_red | min(Ext A, Ext T) red / max(Ext C, Ext G) red | +| hybridization_high_medium | High / Medium (green) | +| hybridization_medium_low | Medium / Low (green); synthetic targets 5 pM / 1 pM / 0.2 pM | +| target_removal1, target_removal2 | (bkg_G + x) / ctrl green | +| bisulfite_conversion1_green | min(C1, C2) / max(U1, U2) (green) | +| bisulfite_conversion1_background_green | (bkg_G + x) / max(U1, U2) green | +| bisulfite_conversion1_red | min(C3, C4, C5) / max(U3, U4, U5) (red) | +| bisulfite_conversion1_background_red | (bkg_R + x) / max(U) red — docs list both "U3,4,5" and "U4,U5,U6" (inconsistency) | +| bisulfite_conversion2 | min(C1..C4 red) / max(C1..C4 green) | +| bisulfite_conversion2_background | (bkg_G + x) / max(C1..C4 green) | +| specificity1_green / _red | min PM / max MM per channel (GT-mismatch 1–3) | +| specificity2 | min(S1..S3 red) / max(S1..S3 green) | +| specificity2_background | (bkg_G + x) / max(S1..S4 green) | +| nonpolymorphic_green | min(NP C, NP G) / max(NP A, NP T) green | +| nonpolymorphic_red | min(NP A, NP T) / max(NP C, NP G) red | +Sample `passQC` = 1 iff all 21 metrics pass; `failCodes` lists failing metric names. Computed "in the same way as" the vendor's BeadArray Controls Reporter. + +### 3.4 Signal processing (what docs say vs what is undocumented) +- Documented: **dye-bias correction** and **noob** normalization ("avg_green_norm / avg_red_norm = average signal after dye bias correction and noob normalization"); "Prep failed" = dye-bias or noob failure; manifest converted to a SeSAMe-format `probes.csv` (Probe_ID, U=AddressA, M=AddressB, col) — log names `convert_manifest_ilmn_sesame.log`, `run_sesame_gs.log` indicate a SeSAMe-based implementation. +- Background correction / dye bias / detection p-value are computed **differently from the legacy desktop methylation module**; detection p-value is **more stringent**, so detection rates are lower (legacy: >96 % typical for non-cancer standard input). +- Example detection rates on MSA (only QC-passing samples, ≥50 ng input, p < 0.05): A min 86 % / mean 93 % (n=220); B 61 %/83 % (951); C 63 %/85 % (34); D 77 %/85 % (22). +- Beta: linear 0..1 (unmethylated ≈0, methylated ≈1); M-value: log-transformed beta; detection p: likelihood signal is background; recommend excluding p > 0.05. +- **Not documented [HYP]**: exact p-value method (likely SeSAMe pOOBAH — out-of-band empirical CDF), beta offset (SeSAMe default beta = M/(M+U) with floors; legacy uses +100), M = log2(M/U) (or log2(β/(1−β))), dye-bias method (likely SeSAMe `dyeBiasNL`/`dyeBiasCorrTypeINorm`), noob parameters. Tech note M-GL-02644 holds details (not archived here). + +### 3.5 Outputs +Per sample: `{Barcode}_{Pos}_ctrl.tsv.gz` (address, type, channel, name, probe ID, MG/MR/UG/UR raw) and `{Barcode}_{Pos}_cgs.tsv.gz` (beta, M, detection p per CG). Per batch: `sample_qc_summary.xlsx/.tsv` (Sentrix_ID, Sentrix_Position, Sample_ID, user metadata, 21 metrics, avg_green_raw, avg_red_raw, avg_green_norm, avg_red_norm, ScanTime, NProbes (SNP+CG probes), NPassDetection, prop_probes_passing, passQC, failCodes; xlsx highlights failures), `sample_qc_summary.pdf` (histogram of proportion passing, pass/fail coloured; PCA of betas on all analytical probes, **random 10,000 probes if > 100 samples**, coloured by Sample_Group), `pcs.tsv.gz` (id, PC1, PC2, Sample_Group or NA), `probes.csv`, `controls.csv`, logs. + +### 3.6 Error/warning messages (verbatim) [xref] +| Log | Message | Type | +|---|---|---| +| write_samplesheet.log | No IDATs found | Error | +| format_samplesheet.log | No samples in sample sheet | Error | +| format_samplesheet.log | Sample sheet not correctly formatted (not CSV or header lines not starting with "<") | Error | +| format_samplesheet.log | beadChipName and sampleSectionName columns are required for the sample sheet. | Error | +| format_samplesheet.log | Warning: {X} samples have duplicate Sample_ID (duplicates dropped) | Warning | +| convert_manifest_ilmn_sesame.log | Missing control probes in manifest (no "[Controls]") | Error | +| convert_manifest_ilmn_sesame.log | Probe section not found (no "[Assay]") | Error | +| convert_manifest_ilmn_sesame.log | Missing required columns: IlmnID, AddressA_ID, AddressB_ID, Color_Channel | Error | +| convert_manifest_ilmn_sesame.log | Controls not formatted correctly. Must have 4 columns (Address,Type,Color_Channel,Name) | Error | +| run_sesame_gs.log | Missing sample: {sample} | Error | +| run_sesame_gs.log | No scan time available | Warning | +| run_sesame_gs.log | Prep failed | Error | +| run_sesame_gs.log | Warning: missing control probe types {…} (metric → NA) | Warning | +| run_sesame_gs.log | Warning: missing control probe names {…} (metric → NA) | Warning | +| qc.log | No features, skipping PCA plot | Warning | + +### 3.7 Limitations / supported arrays +EPIC v1 (b5 manifest), EPIC v2 (EPIC-8v2-0_A2), EPIC-Xtra (custom), MSA-48v1-0 A1; GRCh38; cloud v1.0. Built-in controls may be missing on discontinued/custom chips; thresholds may not apply to NextSeq550 IDATs. v1.0.0 known issue (fixed 1.0.1, Feb 2026): failures at 80–100 samples with >900K-probe arrays. + +--- + +## 4. PGx CNV calling + +- **Inputs**: IDATs, manifest, cluster, FASTA, **PGx CN model file** (pre-set), sample sheet. Local: `pgx copy-number call --cn-model … --platform LCG|EX` (LCG for GDA-ePGx; EX for GSAv4-ePGx/GCRA-ePGx). [xref] +- **Batch requirement**: minimum **24 samples with ≥22 passing** (LogRDev < 0.2); **96 or more** samples passing LogRDev ≤ 0.2 recommended. Error when violated: `{numPassingSamples} sample(s) passed QC. Requires at least {minPassingSamples} samples to proceed.` +- **Target regions (GRCh38)** — 7 genes, 10 regions: +| Gene | Region | Chr | Start | End | +|---|---|---|---|---| +| GSTM1 | GSTM1 | 1 | 109687842 | 109693526 | +| UGT2B17 | UGT2B17 | 4 | 68537222 | 68568499 | +| CYP2E1 | CYP2E1 | 10 | 133527374 | 133539096 | +| SULT1A1 | SULT1A1 | 16 | 28603587 | 28613544 | +| CYP2A6 | CYP2A6.intron.7 | 19 | 40844791 | 40845293 | +| CYP2A6 | CYP2A6.exon.1 | 19 | 40850267 | 40850414 | +| CYP2D6 | CYP2D6.exon.9 | 22 | 42126498 | 42126752 | +| CYP2D6 | CYP2D6.intron.2 | 22 | 42129188 | 42129734 | +| CYP2D6 | CYP2D6.p5 | 22 | 42130886 | 42131379 | +| GSTT1 | GSTT1 | 22_KI270879v1_alt | 270316 | 278477 | +Note GSTT1 lives on an **alt contig** — the reference must include alts. +- **CN states / output** [xref]: `*.cnv.vcf.gz` per sample; ALT ``, `SVTYPE=CNV`, INFO CNVLEN, PROBE, END; FORMAT `CN` ("CN=5 indicates 5 or 5+"), `NR`; QUAL Phred capped at 60, FILTER **Q7** (QUAL < 7), FILTER **SampleQuality** (LogRDev > 0.2); header `##OverallPloidy`, `##GCCorrect=True`. Example probe counts per region: 21–383. Batch `cn_batch_summary.csv` (Target Region, Total CN gain, Total CN loss, Total CN neutral, plus "All Target Regions"); CN summary file; optional bedgraphs. +- **Semi-custom arrays on cloud**: semi-custom samples are filtered from the BeadChip table → workaround: choose a commercial configuration (e.g. `GDA_PGx-8v1-0_G4 - GRCh38`) and use Import Sample Sheet. Alternatively create a custom configuration with the semi-custom product files and Import IDAT Files. +- Warning: `Cluster file ({GTC.egt}) is not the same as CN Model Cluster file ({CN_Model.egt}).` (re-train CN model when cluster file changes significantly). +- Supported arrays: GDA_PGx-8v1-0_20042614_G4, GSA-PGx-48v4-0_20079540_E2, GCRA-PGx-24v1-0_20084467_C2; GRCh38 only; cloud/local v1.1+. + +--- + +## 5. PGx star-allele annotation + +### 5.1 Inputs / parameters +Adds **PGx database file** (.zip; e.g. `DAv1.4.0-pgx-mapping-sha..zip`) to the CNV inputs; SNV VCF must be bgzipped + tabix-indexed and produced without `unsquash-duplicates`/`filter-loci`. Only cloud parameter: **Metabolizer Status Database** — default **CPIC**, alternative **DPWG** (CLI `--guidelines CPIC|DPWG`, default CPIC). + +### 5.2 QC recommendations +Review samples with **LogRDev > 0.2**, **call rate < 0.99**, or **TGA control probe < 1.0**. Same batch minimum as CNV (24/22, 96 recommended). + +### 5.3 Databases & versions +| Source | Version | +|---|---| +| PharmVar | 6.1 | +| PharmGKB | Snapshot-2024.05.16 | +| UGT Alleles Nomenclature | 2010.12.21 | +| Human CYP Allele Nomenclature DB legacy content | July 2024 | +| CPIC guidelines | 1.38.0 (cpicpgx.org/guidelines, github.com/cpicpgx/cpic-data) | +| DPWG guidelines | June 2023 (pharmgkb.org/page/dpwgMapping) | + +### 5.4 Phenotype / activity-score coverage +- CPIC phenotype: CACNA1S, CYP2B6, CYP2C19, CYP2C9, CYP2D6, CYP3A5, DPYD, G6PD, MT-RNR1, NUDT15, RYR1, SLCO1B1, TPMT, UGT1A1, CFTR, IFNL3/IFNL4, VKORC1 (17). Activity scores: CYP2C9, CYP2D6, DPYD. +- DPWG phenotype: CYP1A2, CYP2B6, CYP2C19, CYP2C9, CYP2D6, CYP3A4, CYP3A5, DPYD, NUDT15, SLCO1B1, TPMT, UGT1A1, VKORC1, F5 (14). Activity scores: CYP2D6, DPYD. +- Phenotype is a direct lookup (diplotype → guideline table). Reference allele of ABCG2 annotated "Normal" by default (post-1.3 fix). Example output phenotypes: "Normal Metabolizer", "Decreased Function", "Ivacaftor non-responsive", "CYP2D6 Indeterminate"; `n/a` when none. + +### 5.5 Database construction rules +- **Multi-allelic variant (MAV) extension**: single-allele definitions whose site is multi-allelic in the product files are extended to all alleles on the array — 52 extensions listed (CACNA1S 1, CFTR 19, COMT 1, DPYD 16, RYR1 15; e.g. `rs113993958.G>T`, `NC_000007.14:g.117530953G>T`). +- **G6PD build-specific definitions**: GRCh37: "Mediterranean Haplotype" = rs2230037 G>A + rs5030868 G>A; "Mediterranean, Dallas, Panama, Sassari, Cagliari, Birmingham" = rs5030868 G>A with rs2230037 ref G. GRCh38: "Mediterranean Haplotype" = rs5030868 G>A with rs2230037 ref A; the multi-name allele = rs2230037 A>G + rs5030868 G>A. rs2230037 is ignored in all other G6PD alleles. +- **\*0 allele** = full gene deletion when no named deletion allele exists. +- **Tagging-variant genes**: HLA-A\*31:01 (rs1061235 A>T), HLA-B\*15:02 (rs144012689 T>A; absent from GDA-ePGx), HLA-B\*57:01 (rs2395029 T>G), HLA-B\*58:01 (rs9263726 G>A), IFNL3/4 rs12979860 (T). Reliability varies by population. +- **Masked variants**: poorly performing probes treated as no-calls; alleles defined solely by masked variants are never called (per product list → `pgx_masked_variants.csv`; GDA-ePGx 4 rows: CYP1A2 rs35694136, CYP2D6 rs72549352, CYP4F2 rs4020346, UGT1A1 rs8175347; GSAv4-ePGx 10 rows: CYP1A2 rs35694136, CYP2C19 rs367543002/rs17882687/rs113934938, CYP2C9 rs774607211 (+10:96701973), CYP2D6 rs1135836/rs769157652, CYP4F2 rs4020346, OPRM1 rs9384179, UGT1A1 rs8175347; GCRA-ePGx 10 rows: COMT rs7287550, CYP1A2 rs35694136, CYP2C19 ×3, CYP2C9 rs774607211, CYP2D6 rs2004511/rs769157652(+rs61737947), CYP4F2 rs4020346, OPRM1 rs9384179). +- Novel and non-database alleles are not reported. +- Aux file `[Product]_GS_import.txt` per product (GDAePGx_G2, GSAePGx_E2, GCRAePGx_E2) lists PGx variants → alleles (SNP/indel only, no SV alleles). + +### 5.6 Coverage database statistics (parsed; see CSV) +58 genes, 2,405 allele/variant entries. Breakdown: +- **Star-allele genes (19)** with counts: CYP2D6 184 (incl. 14 duplication forms `*1x2 … *36x3-*10`, 7 hybrid/tandem forms `*13-*1`, `*13-*4-*68`, `*36-*10`, `*4N-*4`, `*68-*4`, `*1-*90`…, sub-allele `*4M`; max number \*172), CYP2C9 85, CYP2A6 51 (incl. `*1x2`), CYP2B6 46, TPMT 46 (`*3A/*3B/*3C`), CYP3A4 45, SLCO1B1 42, CYP1A2 39 (legacy lettered `*1A…*1V`), CYP2C19 34, NUDT15 20, CYP2C8 18, CYP4F2 16, CYP2E1 11 (`*1A,*1B,*5A…`), UGT1A1 9 (`*80+*28`, `*80+*37`), UGT1A4 8, UGT2B15 7, CYP3A5 6, APOE 3 (E2/E3/E4), HLA-B 3 + ref, HLA-A 1 + ref. +- **Named-haplotype gene**: G6PD 187 (186 named variants, e.g. "A-", "Mediterranean…", "B (reference)"). +- **Variant-based genes (37)** reported as `Reference` + `rsID.REF>ALT` entries: DPYD 475 (433 distinct rsIDs; suffixes like `rs114096998.2.G>C` distinguish multiple definitions at one rsID), RYR1 355 (244 rsIDs + 72 HGVS-only), OPRM1 175, CFTR 59, DRD2 56 (incl. `rs1799732._113475530insG`, `rs1799732.dup`), COMT 46, OPRD1 46, CACNA1C 37, HTR2A 32, MT-RNR1 24 (13 `NC_012920.1:m.` HGVS), BDNF 23, TNF 23, OPRK1 24, IL6 21, HTR2C 17, GRIN2B 15, MTHFR 13, FKBP5 12, ITGB3 12, ADH1B 10, ANKK1 10, HMGCR 9, ATM 7, KIF6 6, F2 5, CACNA1S 4, F13A1 3, GRIK1 3, GRIK4 3, LPA 3, ABCG2 2, ALDH2 2, ANK3 2, F5 2, VKORC1 2 (rs9923231 T), YEATS4 2, IFNL3/4 2. +- There are **no per-array columns** in the source table (it is the software database, array-agnostic). Per-array status in the CSV is derived from the "Known Limitations" section: + - APOE E2/E4 not callable on GSAv4-ePGx/GCRA-ePGx (rs7412, rs429358 non-functional). + - CYP2A6 \*5 not supported on GDA-ePGx. + - CYP4F2 (all 3): \*2 reported as \*1; \*4 reported as \*3 (no probe for the distinguishing site). + - UGT1A1 \*28 ([TA]8) and \*37 ([TA]9) not covered on any of the 3. + - UGT2B15 \*4/\*5 not supported on GSAv4-ePGx/GCRA-ePGx (rs4148269, rs1902023). + - CYP2D6 \*40 vs \*58 indistinguishable → reported \*40. + - NUDT15 \*6 vs \*9 indistinguishable → reported \*6. + - HLA-B\*15:02 not on GDA-ePGx. +- CSV legend: `allele_kind` ∈ {star_allele, reference, rsid_variant_allele, hgvs_variant, named_haplotype}; `result_basis` ∈ {star_allele, variant_based, haplotype_named, tagging_variant}; per-product column values: `db_supported_if_variants_on_array` (default), `not_supported`, `reported_as_*X`, `array_dependent`, `not_supported_(*28_component)`. + +### 5.7 Scoring & outputs [xref] +- Solutions ranked by **qualityScore** (0–1; probability including population allele frequencies); **rawScore** excludes frequency prior. Lower-ranked solutions with score **≥ 50 % of the top** are "feasible" and all listed in `genotype` (semicolon-separated). Consider alternatives when supporting variants have **GS < 0.15**; inspect clusters for shifts. +- Array-equivalent alleles: alleles indistinguishable given array content + no-calls; the **most frequent** (population frequency) is reported. +- Structural alleles use CNV sub-region CNs (`copyNumberRegions: p5, intron.2, exon.9`; `copyNumberSolution: 5, 5, 2`), background alleles, e.g. `*27/*36x2+*83+*10`. Non-\*36 exon-9 conversion alleles (\*83) reported as \*36 with \*83 underlying. +- Files: `diplotype_summary.csv` (Sample, Solution Id, Gene or Variant, Type Haplotype|Variant, Solution, Array-Equivalent Alleles 1/2, No Call Variants, Alleles Impacted by No-Call, Background Alleles, Variant Change, Score, Raw Score, Copy Number Solution), `diplotype_annotations.csv` (Sample, Gene, PGx Guideline, Genotype, Activity Score, Phenotype Database Annotation), `supporting_variants.csv`, `unresolved_variants.csv` (Reason: Not on Array / No Call), `variants_not_covered_on_array.csv`, per-sample star-allele JSON (softwareVersion, genomeBuild, starAlleleDatabaseSources, phenotypeDatabaseSources, mappingFile, pgxGuideline, sampleId, locusAnnotations[gene, callType, genotype, arrayEquivalentAlleles, activityScore, phenotypeDatabaseAnnotation, qualityScore, rawScore, supportingVariants, variantNoCalls, allelesImpactedByNoCalls, candidateSolutions[rank,…,alleles, unresolvedVariantSites, backgroundAllele, copyNumberRegions, copyNumberSolution], variantsNotCoveredOnArray, allelesTested]); `.dat` intermediate between call and annotate. CSVs carry `#` meta lines (build, database). +- Known issues: intermittent `The model has been changed since the solution was last computed.` (memory); some variants delimited with `_` instead of `>`; minor Linux/Windows score discordance with concordant ranking. + +### 5.8 Semi-custom +PGx calls limited to content of the commercial PGx arrays; semi-custom designs must retain all commercial content; cloud workaround as in §4. + +--- + +## 6. FAQ (condensed, all 7) +1. **Local or cloud?** Both. Local = CLI, Windows/Linux, CPU-only, no special hardware. Cloud = GUI on the sequencing hub. +2. **Which arrays?** See Product & Analysis Compatibility table. +3. **Samples per analysis?** Cyto ≥1; genotyping ≥1; PGx CNV ≥24 with 22 passing (LogRDev < 0.2), 96 recommended; batches may run in parallel. +4. **Which PGx CNVs / star alleles?** See release notes. +5. **Demo data?** Hub "Demo Data" section; array datasets start with "iScan:" and name the analysis type. +6. **Assay QC metrics?** Functional QC (Autosomal Call Rate, Call Rate, LogRDev, Sex Estimate) in genotype summary files; control-probe metrics in QC metrics files and the QC report (replaces the legacy desktop control dashboard). +7. **Rescans / duplicate IDATs?** Not supported: if several IDAT pairs resolve to the same `SentrixBarcode_A`+`SentrixPosition_A` under `--idat-folder`, only one is processed and which one may differ between Linux and Windows. Keep exactly one pair per barcode+position. + +--- + +## 7. Support & additional resources (every link) +- Tech support: techsupport@illumina.com +- Product webpage: [ref-docs:product-page] +- Support site (installers, docs): [ref-docs:support-page] +- Methylation QC article: [ref-docs:dev-article-1.0-methylation] +- PGx analysis article: [ref-docs:dev-article-1.0-pgx] +- Lab setup & best practices: http://support-docs.illumina.com/ARR/infinium-labsetup.htm +- Evaluation of assay controls (PDF training guide): https://support.illumina.com/content/dam/illumina-support/courses/eval-inf-controls/story_content/external_files/Infinium_Controls_Training_Guide.pdf +- Video, evaluating assay controls: https://www.youtube.com/embed/MuDBayIegkg?autoplay=1&rel=0 +- Consumables & equipment list: http://support-docs.illumina.com/ARR/infinium-consumables.htm +- Scanner documentation: http://support-docs.illumina.com/ARR/iscan.htm +- Polygenic risk score module: https://support-docs.illumina.com/ARR/PRS/Content/ARR/PRS/PRS.htm +- Platform core help: [ref-docs:vendor-cloud-platform-help] +- Sequencing hub help: [ref-docs:vendor-cloud-hub-help] +- Interpretation platform help: [ref-docs:tertiary-platform-help] +Other URLs cited in the in-scope pages: methylation QC tech note PDF M-GL-02644 ([ref-docs:methylation-qc-tech-note-M-GL-02644]); software registration guide PDF ([ref-docs:vendor-cloud-software-registration-guide]); scanner+platform how-to ([ref-docs:scanner-to-vendor-cloud-howto]); scan metrics (https://support-docs.illumina.com/ARR/iScan/Content/ARR/iScan/ScanMetrics_fIS.htm); network security (https://support-docs.illumina.com/SHARE/NetworkSecurity/Content/SHARE/FrontPages/NetworkingSecurity.htm); aux-file how-to (https://knowledge.illumina.com/microarray/general/microarray-general-reference_material-list/000008505); PGx product-file pages for GDA-ePGx, GSAv4-ePGx, GCRA-ePGx; CPIC (https://cpicpgx.org/), DPWG (https://www.pharmgkb.org/page/dpwg), PharmVar, PharmGKB, UGT nomenclature (https://www.pharmacogenomics.pha.ulaval.ca/ugt-alleles-nomenclature/), CYP legacy archive (https://www.pharmvar.org/htdocs/archive/index_original.htm); workgroup/session/region/share-by-link help pages on [ref-docs:vendor-cloud-hub-help]; platform notifications ([ref-docs:vendor-cloud-platform-help/project/p-notifications]); interpretation compatibility table and auto-case-creation pages on help.emg.illumina.com; AWS SNS. + +--- + +## 8. Every numeric default collected here +Stripe registration fail < 0.75 · scanner software ≥ 4.2.1 · network ≥ 1 GbE · Final Report off at ~400+ samples (50+ GB) · QC report call rate 0.98, LogRDev 0.20 · cloud max samples 1152 (genotyping, cyto, methyl) / 384 (PGx) · cyto defaults DUP 50 kb/10 probes, DEL 25 kb/10, LOH 3000 kb/500, GAINLOH 500 kb/300, mDUP 50/10, mDEL 25/10, mLOH 3000/500, smoothing 5 (0–1000), size/probe ranges 0–250000, min-qual 20, max-mosaic-fraction 1.0, QUAL cap 60, Q10, SampleQuality LogRDev > 0.2, gap 150× median spacing, ISCN > 1 kb, mosaic sensitivity ≈ 15 %, cyto CN cap "4 or 4+", ~200-sample memory limit · PGx CNV min 24 samples/22 passing, 96 recommended, LogRDev ≤ 0.2, Q7, CN cap "5 or 5+", QUAL cap 60 · star allele review: LogRDev > 0.2, call rate < 0.99, TGA control < 1.0; alternative solutions ≥ 50 % of top score; low-GS 0.15; scores 0–1 · methylation: offset 3000, p 0.05, thresholds per table §3.2, PCA 10,000 random probes when > 100 samples, legacy detection rate > 96 %, 50 ng input in examples, 80–100 sample/>900K probe bug · hybridization targets 5/1/0.2 pM. + +--- + +## 9. Gap analysis vs SimurgArray plan (§9, §10, §11) — concrete spec additions + +### 9.1 CNV/LOH/mosaic module (§10) +1. **Add GAINLOH as a first-class event type** (copy-gain + LOH, e.g. CN3 with no heterozygosity) with its own size/probe defaults (500 kb / 300 probes). Plan only lists CN2-LOH. Add LOH subtype field `{AOH (germline), CNLOH (somatic CN-neutral), GAINLOH}`. +2. **Separate per-event-type filters** for DEL, DUP, LOH, GAINLOH, mDEL, mDUP, mLOH (size kb + probe count, range 0–250000). Plan says "mosaic same" — make each independently configurable. Add `min_qual` (default 20) for reporting and state explicitly: calling-stage filter on effective size, annotation-stage filter on raw size. +3. **LRR smoothing window** parameter (probes each side, default 5, range 0–1000) used for segmentation/visualisation; bedgraph outputs for LRR and BAF. +4. **Mosaic handling**: report MF per event; `max_mosaic_fraction` (default 1.0) promotion rule with a `HIGHFRACTION` flag; `LowFraction` FILTER below a configurable minimum MF (define default, e.g. 0.10 [HYP]); target sensitivity ≈15 % for one-copy mosaic states incl. haploid regions (male X/Y, mosaic dup on Y). +5. **QC gating**: Q10 FILTER on QUAL < 10 (cyto) and Q7 (PGx CNV); `SampleQuality` FILTER at LogRDev > 0.2; CN top-coding (cyto CN ≥ 4 → "4+", PGx CN ≥ 5 → "5+"); GT always 1/1 in the event VCF (or document our own convention). +6. **Sex handling**: resolve unknown sex inside the CN caller from X/Y LRR/BAF; if unresolved, choose a documented default and log it; exclude PAR probes when manifest lacks PAR mapping; centromere blacklist. +7. **Per-sample JSON summary** mirroring the field list in §2.5 (overall ploidy length-weighted, copy-number median, callRate, logRDev, medianLogRDev, bafDev per AA/AB/BB, LOH counts >1 Mb and >8 Mb, total LOH >1 Mb, percentLOH, per-chromosome stats, per-event stats incl. effectiveSize, percentHet, lrrMedian/lrrDev/bafDev, cytobands, gene list). Define annotationType (constitutional vs oncology) — v2 supports constitutional only. +8. **ISCN 2020 generator**: both simplified (`del(1)(p36.33p36.33)`) and microarray (`arr[GRCh37] 4p16.3(start_end)x3`, `x2 hmz` for LOH) strings; skip < 1 kb; document mosaic notation (e.g. `x1~2` / `[0.4]`) as an improvement over the reference behaviour. +9. **Batch memory**: test at ≥ 1,152 samples; stream per-sample to avoid a ~200-sample ceiling. + +### 9.2 PGx module (§11) +10. **Fix the CN region list**: the 10 GRCh38 regions in §4 (including `CYP2D6.p5` promoter/5′ region, `CYP2A6.exon.1`/`intron.7`, GSTT1 on `chr22_KI270879v1_alt`). Plan must require an alt-aware reference and a liftover strategy for GSTT1. +11. **Batch rule** exactly: error if < N_min passing samples (N_min = 22 of ≥24, LogRDev < 0.2); warn below 96. Emit the error message "{n} sample(s) passed QC. Requires at least {m} samples to proceed." equivalent. Warn when the cluster file differs from the one the CN model was trained with. +12. **CN outputs**: per-sample CN VCF (``, CNVLEN, PROBE, END, CN, NR, OverallPloidy, GCCorrect) and batch gain/loss/neutral count table. +13. **Star-allele scoring spec**: two scores (with/without population-frequency prior), rank, keep all solutions ≥ 50 % of top score, flag supporting variants with GS < 0.15; array-equivalent allele collapsing (report most frequent); background allele; no-call impact lists; unresolved-variant reasons (`Not on Array`, `No Call`); variants-not-covered list; allelesTested list per array. +14. **Database build rules**: MAV extension of single-allele definitions to all array alleles; build-specific G6PD Mediterranean definitions; \*0 = whole-gene deletion when unnamed; tagging-variant genes (HLA-A\*31:01, HLA-B\*15:02/\*57:01/\*58:01, IFNL3/4 rs12979860) with population-reliability caveat; per-array **masked-variant list** (seed from `pgx_masked_variants.csv` concept, but derive our own from concordance data); per-array known-limitation table (indistinguishable pairs such as CYP4F2 \*1/\*2, \*3/\*4; CYP2D6 \*40/\*58; NUDT15 \*6/\*9; UGT1A1 TA-repeat not callable). +15. **Version-pinned sources** in output metadata (star-allele sources, phenotype sources, mapping-DB hash). Target equivalents: PharmVar ≥ 6.1, PharmGKB snapshot, CPIC ≥ 1.38, DPWG ≥ 2023-06; UGT legacy nomenclature; CYP legacy archive for CYP1A2/CYP2E1 lettered alleles. +16. **Phenotype lookup coverage**: CPIC 17 genes (activity: CYP2C9, CYP2D6, DPYD), DPWG 14 genes incl. CYP1A2, CYP3A4, F5 (activity: CYP2D6, DPYD); default "Normal" for reference-only calls (ABCG2 bug to avoid); user switch `--guideline cpic|dpwg`, default CPIC. +17. **Variant-based gene reporting**: ~37 genes reported as `Reference` / `rsID.REF>ALT` calls (DPYD, RYR1, CFTR, OPRM1, …) — spec must support "Variant" call type alongside "Haplotype"; use `>` consistently. +18. **Output files**: diplotype summary, annotations, supporting variants, unresolved variants, not-covered variants, per-sample JSON; intermediate call file separable from annotation step. +19. **Input guard**: the SNV VCF used for PGx must not be de-duplicated/filtered; bgzip + tabix required; combined-probe genotype resolution rules (conflicting probes → no-call). +20. **Semi-custom arrays**: map to the parent commercial PGx content; ignore extra content; warn if commercial PGx probes are missing. + +### 9.3 QC module (§9) — methylation (currently only "optional" in scope item 14) +21. Specify a **methylation control-QC submodule** with the 21 metrics and formulas of §3.3, `bkg_G`/`bkg_R` definitions, offset x = 3000, per-array default threshold sets (EPIC vs MSA table §3.2), Restoration 0→1 FFPE switch, `passQC` = all 21 pass, `failCodes`. +22. Signal pipeline: noob background correction + dye-bias correction + detection p-value (pOOBAH-style, threshold 0.05), beta and M-value per CpG; `prop_probes_passing` reported but **not** used for pass/fail (configurable option). Oracle: SeSAMe (R, MIT) via subprocess; open question: exact p-value/beta offset → verify against the tech note. +23. Outputs: per-sample control table (MG/MR/UG/UR), per-sample CpG table (beta, M, p), batch QC table (xlsx+tsv with highlighting), PCA of betas (random 10k probes when > 100 samples), coloured by Sample_Group, pass-rate histogram; SeSAMe-style manifest export. +24. Manifest parser must validate `[Assay]`/`[Controls]` sections and required columns, and report missing control types/names by setting the metric to NA with a warning. +25. Genotyping control QC (§9.1) should add **Restoration** and document **Stringency/NSB** vs methylation's specificity metrics; add a `TGA control` style metric used by the PGx review rule (< 1.0). + +### 9.4 Orchestration / workflow (cross-cutting, plan §13–§14) +26. **Scan-registration gate**: read scanner `metrics.txt`; exclude sections with stripe registration < 0.75; per-sample Ready/Failed/Pending status file. +27. **Planned-run mode**: a watch/queue command that starts when all sample-sheet samples have IDATs, aborts if failed-scan count > `max_failed_scans`, else runs with passing samples. +28. **Duplicate IDAT detection**: error (not silent pick) when > 1 IDAT pair maps to the same barcode+position; deterministic OS-independent behaviour. +29. **Product consistency check**: IDAT chip type vs manifest; semi-custom mapping. +30. **Output toggles**: VCF, Final Report, Locus Summary, GTC; QC report xlsx|csv; auto-suggest disabling large reports above ~400 samples. +31. **Per-type batch limits** documented and tested (≥1152 genotyping/cyto/methylation; ≥384 PGx). diff --git a/docs/research/E_release_history.md b/docs/research/E_release_history.md new file mode 100644 index 0000000..a9b1fbb --- /dev/null +++ b/docs/research/E_release_history.md @@ -0,0 +1,736 @@ +# E. Release history of the reference genotyping-array product (v1.0 → v1.4) + +> **Archived Phase-0 study (sanitized copy, see `README.md`).** Written 2026-09-27, before the decisions in +> `SIMURGARRAY_MASTER_PLAN.md` §2. The analysed vendor product is called "the reference product" and its CLI +> `refcli`; its documentation URLs are replaced by `[ref-docs:…]` tokens. Where this file speaks of a clean room, +> legal clearance, or running/benchmarking the vendor binary, plan §2 supersedes it: personal research; MIT/BSD/Apache +> code may be reused with attribution; GPL tools are subprocess oracles only; vendor binaries are never run for +> comparison, inspected or decompiled; oracles are published vendor-produced GTCs, gtc2vcf and BeadArrayFiles. + +Source set (all read in full): `support-and-updates/release-notes.md` + every page under +`support-and-updates/release-notes/` (v1.0.0, cloud genotype 1.0.0, cloud methylation-QC 1.0.0/1.0.1, v1.1.0, +v1.2.0 + EMGv38 case-creation, v1.3.0 + EMG V100.39, v1.4.0 + EMG V100.40), `support-and-updates/document-revision-history.md`, +the archived v1.0 … v1.3 doc trees (release notes, revision history, FAQ, features, local-analysis, +input-files, output-files, cloud pages, PGx reference pages), compared by normalised `diff` (links/whitespace/GitBook +footer stripped) against the current `product-guides/*.md`, `overview/our-features.md`, `support-and-updates/faq.md`. + +Terminology: "the product" = the vendor tool; executable name `refcli`. "EMG" = the vendor's tertiary interpretation +platform. Quotes are verbatim or near-verbatim; `[sic]` marks upstream typos kept on purpose. + +--- + +## 0. Timeline at a glance + +| Doc rev | Date | Event | +|---|---|---| +| 01 | Dec 2023 | v1.0.0 local release (genotype, PGx CNV, star-allele) | +| 02 | Mar 2024 | Cloud Genotyping pipeline 1.0.0 | +| 03 | May 2024 | Cloud Methylation-QC pipeline 1.0.0; doc fix: CNV VCF example CN=4 → CN=5 | +| 04 | Sep 2024 | v1.1.0 (EX PGx chips, JSON standardisation, cluster/CN-model decoupling) | +| 05/06 | Feb 2025 | v1.2.0 (cytogenetics CNV/LOH, BAF bedGraph, `pgx` root command); notes updated | +| 07 | Jun 2025 | v1.2.0 notes updated: gtc-to-bedgraph LRR smoothing bug; "Bedgraph Smoothing window size" disabled in cloud UI; Cyto + EMG pipeline 1.2.0 (auto case creation, EMG v38) | +| 08 | Aug 2025 | v1.3.0; "CNV and LOH Calling" renamed "Cytogenetics analysis" | +| 09 | Oct 2025 | Cyto + EMG cloud pipeline 1.3.0 (EMG V100.39.0) | +| 10 | Feb 2026 | Methylation-QC cloud 1.0.1 hot-fix | +| 11 | Mar 2026 | Vendor cloud platform "Planned Analyses" (hub v7.44.0); cloud section restructured | +| 12 | May 2026 | v1.4.0 (QC report, GAINLOH, PGx redesign, MAV Inf-I no-call option, .NET 9) | +| 13 | Jun 2026 | Cyto + EMG cloud pipeline 1.4.0 (EMG V100.40.0) | +| 14 | Aug 2026 | vendor cloud data layer rebranded; vendor cloud UI update; PGx coverage page & v1.4 limitations updates | + +Deprecation (added Q1 2026): cloud pipeline versions *Methylation QC 1-0-0, PGx Star Allele Annotation 1-0-0, +Genotyping 1-0-0, PGx CNV Calling 1-0-0* are deprecated. + +--- + +## 1. Per-version detail + +### 1.1 v1.0.0 (local) — December 2023 + +**Highlights** +- Improved star-allele calling accuracy for GDA-ePGx chips. +- Star-allele calls reported with quality scores. +- "Missing variant reporting to improve data quality." + +**New features** +- Star-allele calling for genes in the coverage list. "For in-silico datasets, call rate ≥99%, diplotyping accuracy ≥ 90%"; + reports hybrid star alleles and allele-specific copy number. +- Quality score estimating confidence; star-allele call rate increased through "more robust error tolerance and + missing data tolerance"; supporting and missing variants listed; quality score accounts for missing data. +- Ranked alternative star-allele solutions with "quality score (negative log likelihood)". +- Function annotation: metabolizer + function for CPIC and DPWG; activity scores for CYP2C9, CYP2D6, DPYD. +- CNV VCF: PGx CNV genes; bgzip+tabix; header updated to indicate "copy number of 5 may be reported"; + "Revised filter field delimiter to comply with VCF 4.3 specification". +- Genotyping VCF: bgzip + tabix. + +**Known issues (current page)** +1. gtc-to-vcf locus combination: duplicate INDELs with HET calls on opposite strands (`D/I` + `I/D`) report `./.` instead of `0/1`. +2. Corrupt/invalid GTC aborts the run instead of skipping. +3. BPM vs CSV manifest mismatch does not abort gtc-to-vcf. +4. SNV and indel designed to the same locus are never collapsed. +5. Some indels missing from SNV VCF (designed indel ↔ reference mapping problem). +6. Symbolic-link VCFs not supported as `star-allele call` input. +7. Local Linux CLI and cloud do **not sort** `star_alleles.csv` and fields of `metabolizer_status.json`; Windows CLI does. +8. New licence server `[ref-license-server]` returns "No valid licenses found." for v1.0 → keep `[ref-license-server-legacy]`. +9. **GTC files do not support non-ASCII characters**: on non-English OS locales internal datetime fields may be written with + non-ASCII characters, breaking later reads: + ``` + fail: ArrayAnalysis.CLI.App[0] + System.IO.EndOfStreamException: Unable to read beyond the end of the stream. + at System.IO.BinaryReader.ReadString() + at ArrayAnalysis.Core.GtcFileLoader..ctor(String filePath) in /src/ArrayAnalysis.Core/GtcFileLoader.cs:line 161 + at ArrayAnalysis.Services.GtcFactory.CreateGtcFromSample(Sample sample, Boolean log) + at ArrayAnalysis.Services.GtcToVcfService.Run(GtcToVcfInput input) + at ArrayAnalysis.CLI.App.RunCliServiceAndReturnExitCode(BaseOptions opts) in /src/ArrayAnalysis.CLI/App.cs:line 110 + ``` + Workaround: add `System.Globalization.Invariant: true` to `refcli.runtimeconfig.json`, regenerate GTCs with `genotype call`. + +**Known issues present only in the archived (v1.0–v1.3 trees) copy of these notes, later removed/rewritten** +- "For gtc-to-vcf, multi-allelic variants designed with multiple assays might not always collapse into one variant correctly + and be reported as two separate variants instead." +- "**Manifest names greater than 80 characters will cause failure when converting IDATs to GTCs.**" (silently dropped + from the current notes — never listed as fixed). + +**Known limitations** +- PGx CNV + star-allele calling validated only for GDA_PGx_E2 product files. +- Do not use `unsquash-duplicates` / `filter-loci` during gtc-to-vcf when star-allele calling is desired. +- Cloud star-allele annotation: CPIC only (local: CPIC + DPWG). + +### 1.2 Cloud Genotyping 1.0.0 — March 2024 +- Genotype + reports for human and **non-human** arrays in the cloud; configurable vendor-cloud interfaces. +- New outputs: SNV VCF, Final Report, Locus Summary. +- Known issue: "Some multi-nucleotide variant (MNV) designs reverse complement the 'Allele1/2 Top' fields in the Final Report" + (still open in v1.4). +- Limitation: "Genotyping only works on diploid organisms… Polyploid genotyping is not currently supported." + +### 1.3 Cloud Methylation QC 1.0.0 — May 2024 +- Adjustable thresholds for **21 built-in controls**, detection p-value, proportion of probes passing, and **offset correction**; + thresholds assign pass (1) / fail (0); failed metrics highlighted; failure localisation (bisulfite conversion, staining, hybridisation…). +- Summary plots: p-value detection pass rate and PCA of beta values. +- Per-CG detection p-value, beta and M values per sample. +- Known issue: analysis may fail for **80–100 samples on large (>900K probe) arrays**; workaround: >100 samples. +- Limitations: standard thresholds may not suit discontinued / semi-custom / custom chips or **NextSeq550 IDATs**; + built-in controls may be absent on such chips. + +### 1.4 Cloud Methylation QC 1.0.1 — February 2026 +- Hot-fix for the 80–100-sample / >900K-probe failure. Limitations unchanged. + +### 1.5 v1.1.0 — September 2024 + +**Highlights**: EX PGx chips enabled; more PGx genes; custom `.egt` allowed in PGx; updated PGx databases; DPWG in cloud. + +**New features / changes** +- PGx products: GDA-ePGx, **GSAv4-ePGx (GSA-PGx-48v4-0_20079540_E2)**, **GCRA-ePGx (GCRA-PGx-24v1-0_20084467_C2)**; + GDA-ePGx manifest moves to `GDA_PGx-8v1-0_20042614_G2` (archived notes contained this product/manifest/build table, build 38 only). +- Star-allele annotation adds CYP2E1, CYP1A2, ABCG2, CYP2C8, HMGCR, UGT1A4, UGT2B15, F13A1, HLA-B*15:02. +- CNV calling adds **SULT1A1** (features page: "6 target PGx genes across 9 target regions" → "7 genes across 10 regions"). +- "Extended bi-allelic PGx variants from source databases to multi-allelic variants based on the designs in the supported PGx products." +- **GTCs from a custom cluster file may be used with the commercial CN model** (v1.0: hard error; v1.1+: warning + `Cluster file ({GTC.egt}) is not the same as CN Model Cluster file ({CN_Model.egt}).`). +- PGx database revision (PharmVar 6.0.5 → 6.1; PharmGKB snapshot 2023-08-30 → 2024-05-16; CPIC 1.30.0 → 1.38.0; + DPWG June 2023; UGT nomenclature 2010-12-21; CYP legacy DB July 2024). +- Star-allele JSON standardisation: `databaseSources` → `phenotypeDatabaseSources` + `starAlleleDatabaseSources`; + `Phenotype` → `PhenotypeDatabaseAnnotation`; `missingVariants` + `allMissingVariants` → `missingVariantSites`; + `supportingVariants` / `missingVariants` JSON-ised at gene and candidate-allele level; redundant info removed. +- Updated tabix indexing "improving performance and disk usage for SNV VCF". +- Resolved: symlink VCFs accepted by `star-allele call`; Linux/cloud sorting of `star_alleles.csv` / `metabolizer_status.json` fixed. +- New CLI option `--query-license-quota`; `copy-number train --platform` accepts `EX` in addition to `LCG`. +- Licensing: "In v1.1+, during analysis, precomputed quota is no longer checked" → over-quota runs fail only at the end with + `Error updating usage. HTTP error status code: 409` and **results are not written to disk**. + +**Known issues (v1.1)** — all v1.0 issues except #6/#7 plus: +- REF/ALT delimited by `_` instead of `>` for some simple variants in `star_alleles.csv` / metabolizer JSON + (e.g. `ryr1.38577931a_c`) — still open in v1.4. +- "Occasional star-allele solution score discordance between Linux and Windows OS with concordant solution ranking." +- "Rare intermittent memory issues during star allele calling. Example error message: `The model has been changed since + the solution was last computed.`" — restart or more memory. (Fixed v1.4.) +- Star-allele **annotation can fail mid-analysis when an allele is unknown** (observed: CYP2E1 mis-calls due to **cluster drift**). (Fixed v1.2.) +- Licence server issue (#8) still present. + +**Known limitations (v1.1)** +- Only PharmVar/PharmGKB-defined alleles (no novel alleles). +- CYP2D6 non-*36 exon-9-conversion alleles (e.g. *83) reported as *36 with *83 underlying (fixed v1.4). +- Diploid only. Not backward compatible with v1.0 manifest (`…_E2` for v1.0, `…_G2` for v1.1). +- VCFs must be gzipped + tabix-indexed (gtc-to-vcf default) for star-allele calling. + +### 1.6 v1.2.0 — February 2025 + +**Highlights**: genome-wide CNV + LOH calling (VCF) for any human genotyping array; BAF bedGraph; ISCN/cytoband outputs. + +**New features** +- Cytogenetic calling: any human array ("detection abilities vary by array probe density and spacing"); CN up to **4+**; + Phred-scaled quality; **mosaic tagging** of deletions/duplications; tested on GDA-Cyto-8, GSA-Cyto-24, CytoSNP-850K (iScan); + adjustable minimum size / probe number for CNV and LOH. +- BedGraph: new BAF bedGraph; extensions `BAF.bedgraph` / `LRR.bedgraph`; **`--smoothing` added to gtc-to-bedgraph** (LRR); IGV compatible. +- Cyto annotation JSON: per-sample and per-event statistics, gene count + names (RefSeq), **ISCN 2020** and cytoband (Ensembl). +- PGx: new root command `pgx` grouping copy-number and star-allele. +- Fixed: `pgx star-allele annotate` failing on an unknown allele (CYP2E1), "an issue introduced in version 1.1". +- New licence server `[ref-license-server]` supported. + +**Known issues (v1.2)** — carried: MNV Top-allele RC; corrupt GTC abort; non-ASCII GTC; SNV/indel not collapsed; missing indels; +BPM/CSV mismatch; `D/I`+`I/D` → `./.`; memory "model has been changed"; `_` delimiter; Linux/Windows score discordance. New: +- If genotyping sex = unknown, **cyto caller assumes male** → sex-chromosome results wrong for females. +- ISCN only for variants **> 1 kb**; no ISCN for LOH. +- Centromere calls likely false positives. +- `cyto annotate` logs `No credential is provided` (harmless). +- `cyto call` logs `CytoPlatform` hard-coded to `LCG` regardless of product (no algorithmic effect). +- Non-default `--smoothing` in gtc-to-bedgraph produces **wrong LRR values**; use default 0; option to be disabled. +- `cyto call` may throw an **overflow error** "in very rare cases when no variants are detected in noisy or low-quality samples". +- Min DEL/LOH/DUP thresholds shown in **wrong units** in annotation JSON when set above the calling thresholds. +- Cyto variants with **QUAL 0** not passed into annotation JSON. +- CYP2A6 *1 definition wrongly includes `NC_000019.10:g.40848264_40848265delinsT`. +- Cloud cyto (and cyto + EMG) may fail at **~200 samples** per batch (memory). +- ABCG2 reference-allele samples miss phenotype annotation. + +**Known limitations (v1.2)**: diploid only; constitutional only (no oncology); validated only on 3 cyto chips; large events may be +fragmented; **no mosaic fraction and no mosaic ISCN**; on `CytoSNP-850Kv1-4_iScan_B`, `GSACyto-24v1_20044998_C`, +`GDACyto-8v1-0_20047166_E` manifests **no PAR calling/visualisation**; **GT hard-coded to 1/1 in cyto VCF**; NextSeq550 IDATs +untested; PGx limitations as v1.1. Local-guide note (v1.2 only): "VCFs generated on Windows machines will not work when manually +uploading to EMG. Only Linux-based VCFs will work." (fixed in cyto+EMG 1.3.0). + +### 1.7 v1.2.0 + EMG v38 automatic case creation — June 2025 +- Automatic EMG case creation after "Cytogenetics analysis + EMG interpretation" completes (vendor cloud platform). +- Limitation: analysis type offered regardless of EMG subscription/SNS setup; without them it silently runs as plain cyto analysis + and no case is created. Cloud UI: "Bedgraph Smoothing window size" disabled. + +### 1.8 v1.3.0 — August 2025 + +**Highlights**: mosaic fraction estimation; improved sex-chromosome calling incl. PAR; new QC metrics in cyto JSON. + +**Genotyping & core** +- GenomeStudio-compatible samplesheet; **separate IDAT and GTC samplesheets deprecated** (`--idat-sample-sheet`, + `--gtc-sample-sheet` → `--sample-sheet`). +- Samplesheet user columns propagated into `gt_sample_summary`. +- **Samples failing IDAT→GTC are now listed** in gt_sample_summary: `Autosomal Call Rate` = `Call Rate` = 0; + `Log R Ratio Std Dev` and `TGA_Ctrl_5716 Norm R` = `NaN`. +- `--smoothing` **removed** from gtc-to-bedgraph. +- New `genotype call --normalize-sample-name` (ignore IDAT sample name, use SentrixBarcode_Position) — present only in v1.3. + +**Cytogenetics** +- Fixed overflow crash on noisy samples; fixed ~200-sample memory limit. +- **Length-normalised median copy number**: removed 1 kb lower limit on included segments (was ">1 kB segments aggregated"; + now "length-weighted copy numbers of each variant are aggregated"). +- Mosaic fraction reported; mosaic events above user-defined fraction can be **promoted** (`--max-mosaic-fraction`, HIGHFRACTION tag). +- Reduced STDOUT verbosity of annotate; sample-level `medianLogRDev`; chromosome-level QC metrics; event-level `effectiveSize`. +- **Variants filtered by effective size in `cyto call` but by raw size in `cyto annotate`.** +- Fixed wrong-unit thresholds in JSON; fixed QUAL-0 CNVs missing from JSON. +- Cyto caller now **attempts to resolve Unknown sex**; log "Sample XXX sex updated from Unknown to Male." +- Fixed `CytoPlatform` log always `LCG`. + +**PGx**: ABCG2 reference alleles annotated with default "Normal"; CYP2A6 *1 definition corrected. + +**Known issues (v1.3)**: corrupt GTC abort; MNV Top RC; non-ASCII GTC; SNV/indel collapse; missing indels; BPM/CSV mismatch; +`D/I`+`I/D` → `./.`; memory "model has been changed"; `_` delimiter; plus: +- **Samplesheet empty columns**: `SentrixBarcode_A,SentrixPosition_A,,` → `System.ArgumentException : Duplicate column found. Column names + are case-insensitive…`; a single trailing empty column → an empty `"": ""` field in gt_sample_summary. +- **>1K-sample samplesheets significantly slow** analysis; split into ≤1K batches. + +**Known limitations (v1.3)**: unsquash/filter-loci vs star-allele; diploid only; unresolved-unknown-sex → male (not logged); +ISCN only >1 kb; centromere FPs; no ISCN for LOH; constitutional only; validated on 3 cyto chips (NextSeq550 processed but not +validated); fragmented large events; GT hard-coded 1/1; **tabix index differs from `bcftools index --tbi`** +(`bcftools index --stats/--nrecords` → "index … does not contain any count metadata"; re-indexing with htslib may break +downstream `pgx star-allele call`); **Windows vs Linux `pgx star-allele call` differences on 1576 samples**: + +| Field | # differences | +|---|---| +| Collapsed Star-Alleles | 2 | +| Missing/Masked Core Variants | 1 | +| Solution Long | 1 | +| Supporting Variants | 2 | + +(all overall solutions concordant); v1.3 incompatible with EMG v38 (cannot upload v1.3 cyto VCF; keep cyto+EMG 1.2.0); +no novel alleles; CYP2D6 *83 reported as *36. + +### 1.9 v1.3.0 + EMG V100.39.0 — October 2025 +- "Cytogenetics analysis + EMG interpretation 1.3.0" released; **VCFs generated on Windows now compatible with EMG**. +- Same subscription/SNS limitation as 1.2.0. + +### 1.10 v1.4.0 — May 2026 + +**Highlights**: QC Report (Control Dashboard replacing GenomeStudio's, Automated QC, Sample QC Heatmaps, Trend Analysis); +cyto GAINLOH + better mosaic detection; PGx SV star-allele calling, no-call handling, redesigned outputs; improved MAV calling. + +**Cytogenetics** +- **GAINLOH** detection (gain + LOH). +- Size/probe filters **per variant type** (DEL, DUP, LOH, GAINLOH, mosaic DEL/DUP/LOH). +- Mosaic detection "at approximately **>15%** for mosaic states with a one-copy difference (CN2/CN1, CN2/CN3 diploid; CN1/CN0, CN1/CN2 haploid)". +- **Mosaic duplication on male Y** supported. +- CNV/LOH calls validated against expected LRR pattern ("most probes in an autosomal CN gain region should exhibit positive LRR"); + non-conforming variants filtered. +- Fixed: first variant missing ISCN annotation in JSON. +- **Removed the 5% mosaic-fraction hard cutoff** (sub-5% variants can be reported; `LowFraction` FILTER appears in VCF header). +- **LOH regions < 500 kb flanked by copy-neutral regions removed** (false-positive reduction). + +**QC Report**: sample- and dataset-level control/functional metrics; cloud single-dataset, local multi-dataset + cross-run; +sample QC table + interactive HTML; thresholds via YAML + in-report configuration. + +**PGx** +- PGx CNV calling "reduce[d] sensitivity to outlier samples". +- Targeted star-allele accuracy improvements; **structural-variant star-allele calling**. +- Separation of "Per-sample variant no-calls" vs "Variants not represented on the array product", with affected alleles listed. +- For star-allele no-calls: **ranked candidate diplotypes** with "variant delta annotations". +- RSIDs + probe IDs in supporting and no-call variant outputs. +- Genotype, metabolizer status and guideline reported directly in CSVs; CSV output split into multiple files. +- Fixed memory issue ("model has been changed…"); fixed CYP2D6 exon-9 conversion (*83 no longer reported as *36). + +**Genotyping & core** +- Sample-name precedence (samplesheet `Sample_Name` > IDAT/GTC metadata > `SentrixBarcode_Position`). +- Cloud genotyping outputs control-based QC metrics + QC report. +- `--use-infI-nc-info` for MAV calling. + +**Bug fixes**: samplesheet empty columns handled; **`D/I`+`I/D` opposite-strand duplicate INDEL HETs now `0/1`**. + +**Important note**: self-contained **.NET 9** application; Linux needs native OS deps (.NET DEB/RPM dependency lists). + +**Known issues (v1.4)** +- PGx: **cluster-file mismatch between GTCs and PGx CNV model is now a fatal error** (was a warning in 1.1–1.3); fix = retrain CN model. +- Windows vs Linux star-allele minor differences (as v1.3); "Occasional star-allele solution **unresolved variants** discordance between + Linux and Windows OS with concordant solution ranking." +- For star-allele no-calls, alternates may have **large variant edit distance ≥ 3** when low-quality variant calls are present. +- `_` instead of `>` delimiter (still open). +- **JSON candidate solutions include supporting details only for the first allele** of the diplotype (CSV complete). +- Genotyping: corrupt GTC abort; MNV Top RC; non-ASCII GTC; SNV/indel collapse; missing indels; BPM/CSV mismatch silent; + **`genotype call` / `qc call` with mismatched IDAT and manifest may silently produce inaccurate results** (watch low call rate, + many NaN QC values); >1K samplesheet slowness. + +**Known limitations (v1.4)** +- Cyto: unresolved unknown sex → male (unlogged); ISCN only >1 kb; centromere FPs; "ISCN annotations are not fully supported for LOH + and mosaic variants"; constitutional only; validated on GDA-Cyto-8, GSA-Cyto-24, CytoSNP-850K (**iScan and NextSeq550**); + "assumes that most genomic regions are diploid… variants in **triploid samples** may be missed"; fragmented large events; + GT hard-coded 1/1; no mosaic ISCN; **older cyto model files and cloud configurations incompatible with v1.4**. +- QC report UI: hover text truncated at **40 chars**; heatmap button misalignment for many plates/barcodes; faceting groups >**6** + levels into "Other"; after viewing >**12,000**-sample dataset cannot switch to one <**1,000** (reload); moving/resizing a selection + can freeze the page. +- PGx: unsquash/filter-loci + gzip/tabix requirements; no novel alleles. +- Genotyping: diploid only; tabix ≠ bcftools index (as v1.3). + +### 1.11 v1.4.0 + EMG V100.40.0 — June 2026 +- "Cytogenetics analysis + EMG interpretation 1.4.0" released; subscription/SNS limitation unchanged. + +### 1.12 Resolved-issue ledger + +| Issue | Introduced/first listed | Resolved | +|---|---|---| +| Symlink VCF input to star-allele call | 1.0 | 1.1 | +| Linux/cloud not sorting star-allele outputs | 1.0 | 1.1 | +| Cluster file must equal CN-model cluster file (error) | 1.0 | 1.1 (warning) → **re-hardened to error in 1.4** | +| Annotate fails on unknown allele (CYP2E1 cluster drift) | 1.1 | 1.2 | +| New licence server unsupported | 1.0 | 1.2 | +| gtc-to-bedgraph `--smoothing` wrong LRR | 1.2 | 1.3 (option removed) | +| cyto overflow crash with no variants | 1.2 | 1.3 | +| cyto ~200-sample memory limit | 1.2 | 1.3 | +| JSON threshold units wrong | 1.2 | 1.3 | +| QUAL-0 cyto variants missing in JSON | 1.2 | 1.3 | +| Unknown sex → male (now resolved when possible) | 1.2 | 1.3 (partial) | +| `CytoPlatform` log = LCG | 1.2 | 1.3 | +| ABCG2 reference allele no phenotype | 1.2 | 1.3 | +| CYP2A6 *1 definition wrong | 1.2 | 1.3 | +| Windows cyto VCF rejected by EMG | 1.2 | cyto+EMG 1.3.0 | +| Samplesheet empty columns | 1.3 | 1.4 | +| `D/I`+`I/D` → `./.` | 1.0 | 1.4 | +| "Model has been changed…" memory issue | 1.1 | 1.4 | +| CYP2D6 *83 reported as *36 | 1.1 | 1.4 | +| First cyto variant missing ISCN | (unlisted) | 1.4 | +| Methylation 80–100 samples, >900K probes | Meth 1.0.0 | Meth 1.0.1 | +| Manifest name > 80 chars fails IDAT→GTC | 1.0 | never stated; silently dropped from notes | +| Multi-assay MAV not collapsing | 1.0 | silently rewritten as "SNV and indel not collapsed" | + +Never resolved (open in v1.4): corrupt GTC abort; non-ASCII GTC strings; MNV Top-allele reverse-complement in Final Report; +SNV/indel same-locus not collapsed; unmapped indels; BPM/CSV mismatch not detected; `_` vs `>` delimiter; Linux/Windows PGx +differences; tabix index lacking count metadata; >1K samplesheet slowness; GT hard-coded 1/1 in cyto VCF; unknown-sex default male; +no novel star alleles; diploid only. + +--- + +## 2. Version-diff tables (CLI, files, fields) + +### 2.1 Command tree + +| Command | v1.0 | v1.1 | v1.2 | v1.3 | v1.4 | +|---|---|---|---|---|---| +| `genotype call / gtc-to-vcf / gtc-to-bedgraph / help / version` | ✓ | ✓ | ✓ | ✓ | ✓ | +| `copy-number call/train/help/version` (root) | ✓ | ✓ | → `pgx copy-number …` | pgx | pgx | +| `star-allele call/annotate/help/version` (root) | ✓ | ✓ | → `pgx star-allele …` | pgx | pgx | +| `cyto call / annotate / help / version` | – | – | NEW | ✓ | ✓ | +| `qc call / report / help / version` | – | – | – | – | NEW | +| Syntax | `refcli [command] [req] [opt]` | same | `refcli [module] [sub-module (not needed for cyto)] [command] …` | + module table | + case-sensitivity note (`--threshold-callRate`, `--threshold-logRdev`) | + +Doc slip: v1.0 lists "star-alle annotate" [sic]; v1.2 input table lists cyto database option as `--database` (real: `--annotation-db`, corrected v1.4). + +### 2.2 Options per command + +Common to all commands in all versions: `--debug` (stack traces, false), `--json-log` (false), `--help`, `--version`. + +**genotype call** + +| Option | v1.0 | v1.1 | v1.2 | v1.3 | v1.4 | +|---|---|---|---|---|---| +| `--bpm-manifest` (req) | ✓ | ✓ | ✓ | ✓ | ✓ | +| `--cluster-file` (req) | ✓ | ✓ | ✓ | ✓ | ✓ | +| `--idat-folder` | req, XOR with sheet, recursive | = | = | optional; overrides samplesheet `RootFolder` | = | +| `--idat-sample-sheet` (CSV/JSON paths) | ✓ | ✓ | ✓ | REMOVED | – | +| `--sample-sheet` (filter + metadata) | – | – | – | NEW | ✓ | +| `--gencall-cutoff` | 0.15 | 0.15 | 0.15 | 0.15 | 0.15 | +| `--num-threads` | ✓ (no default documented) | ✓ | ✓ | ✓ | ✓ | +| `--output-folder` | "mirrors IDAT folder structure" | = | = | mirroring text removed | = | +| `--normalize-sample-name` (false) | – | – | – | NEW | REMOVED (precedence rules) | + +**genotype gtc-to-vcf** + +| Option | v1.0 | v1.1 | v1.2 | v1.3 | v1.4 | +|---|---|---|---|---|---| +| `--bpm-manifest`, `--csv-manifest` (SourceSeq), `--genome-fasta-file` (.fai alongside) | ✓ | ✓ | ✓ | ✓ | ✓ | +| `--gtc-folder` / `--gtc-sample-sheet` | req XOR | = | = | folder optional, `--sample-sheet` replaces gtc sheet | = | +| `--auxiliary-loci` (VCF of MNV defs) | ✓ | + restrictions documented | ✓ | ✓ | ✓ | +| `--disable-genome-cache` | ✓ | + explained | ✓ | ✓ | ✓ | +| `--filter-loci` (text file of probe names) | ✓ | ✓ | ✓ | ✓ | ✓ | +| `--unsquash-duplicates` (false) | ✓ | + explained | ✓ | ✓ | ✓ | +| `--no-bgzip` (false) | ✓ | ✓ | ✓ | ✓ | ✓ | +| `--use-infI-nc-info` (false) | – | – | – | – | NEW | +| Input described as | "GTC" | "GTC (v5)" | = | = | = | + +**genotype gtc-to-bedgraph**: v1.0 `--bpm-manifest`, gtc folder/sheet, `--output-folder` (LRR only) → v1.2 BAF+LRR, `--smoothing` +(default 0, buggy) → v1.3 `--smoothing` removed, `--sample-sheet`. + +**(pgx) copy-number call**: `--cn-model` (req .dat), gtc folder/sheet (→ `--sample-sheet` v1.3), `--no-bgzip`, `--output-folder`. Unchanged otherwise. + +**(pgx) copy-number train**: `--bpm-manifest` (`.msk` must sit next to BPM with same base name), `--genome-fasta-file`, gtc folder/sheet +(→ sample-sheet v1.3), `--platform` (v1.0 `LCG` only; v1.1+ `LCG` for GDA-ePGx, `EX` for GSAv4/GCRA-ePGx; value = CSV manifest +`Assay Format` header), `--disable-genome-cache`, `--output-folder` (default CWD). + +**(pgx) star-allele call**: `--database` (.zip), `--license-server-url` (req, `https://user:pass@host`), `--vcf-folder` (`*.snv.vcf.gz` + `*.cnv.vcf.gz`), +`--output-folder`; **`--query-license-quota` NEW v1.1**. + +**(pgx) star-allele annotate**: `--star-alleles` (**.csv in v1.0–v1.3 → .dat in v1.4**), `--guidelines` (CPIC default | DPWG), `--output-folder`. + +**cyto call** + +| Option | v1.2 | v1.3 | v1.4 | +|---|---|---|---| +| `--cn-model` (cyto model .dat) | ✓ | ✓ | ✓ | +| gtc folder / `--gtc-sample-sheet` | ✓ | → `--sample-sheet` | ✓ | +| `--no-bgzip`, `--output-folder` | ✓ | ✓ | ✓ | +| `--min-cnv-probes` | 10 | 10 (VCF filter) | REMOVED → per-type | +| `--min-cnv-size` (kb) | **0** | **20** (effective size) | REMOVED → per-type | +| `--min-loh-probes` / `--min-loh-size` | 500 / 3000 | 500 / 3000 (effective size) | 500 / 3000 | +| `--min-del-probes/size` | – | – | 10 / 25 kb | +| `--min-dup-probes/size` | – | – | 10 / 50 kb | +| `--min-gainloh-probes/size` | – | – | 300 / 500 kb | +| `--min-mdel-probes/size` | – | – | 10 / 25 kb | +| `--min-mdup-probes/size` | – | – | 10 / 50 kb | +| `--min-mloh-probes/size` | – | – | 500 / 3000 kb | +| `--max-mosaic-fraction` | – | NEW 1.0 | 1.0 | +| `--smoothing` (LRR window, probes each side) | 5 | 5 | 5 | + +**cyto annotate** + +| Option | v1.2 | v1.3 | v1.4 | +|---|---|---|---| +| `--annotation-db` (req), `--vcf-folder` (req), `--output-folder` | ✓ | ✓ | ✓ | +| `--min-del-probes` / `--min-del-size` | 10 / **0** | 10 / 0 | 10 / **25 kb** | +| `--min-dup-probes` / `--min-dup-size` | 10 / **0** | 10 / 0 | 10 / **50 kb** | +| `--min-loh-probes` / `--min-loh-size` | 500 / 3000 | = | = | +| gainloh / mdel / mdup / mloh pairs | – | – | 300/500, 10/25, 10/50, 500/3000 | +| `--min-qual` | 20 | 20 | 20 | + +Notes added v1.4: values <10 for any CNV probe threshold silently reset to 10; thresholds larger than effective genome size filter all variants. + +**qc call (v1.4)**: `--array-type` (genotyping|methylation, req), `--csv-manifest` (req), `--idat-folder`, `--sample-sheet`, `--output-folder`. +**qc report (v1.4)**: `--data` (comma list or parent folder auto-discovery), `--config` (YAML), `--label` (count must match datasets), +`--output-folder`, `--output-format` (xlsx default | csv), `--threshold-callRate` (0.98), `--threshold-logRdev` (0.20); CLI > YAML > built-in. + +Cloud cyto thresholds (UI): v1.2/v1.3 CNV min size 0 kb / 10 probes, LOH 3000 kb / 500 probes, smoothing 5 (0–1000), all 0–250000; +v1.4 per-type set equal to CLI defaults above; GTC and SNV VCF output default False. + +### 2.3 Output files + +| File | v1.0 | v1.1 | v1.2 | v1.3 | v1.4 | +|---|---|---|---|---|---| +| `*.gtc` (GTC v5) | ✓ | ✓ | + legacy-GTC note | + i18n note | ✓ | +| `*.snv.vcf.gz` + `.tbi` (VCF 4.1) | ✓ | + ploidy / collapse rules doc | + FILTER=PASS note | + MAV/ID/flip/PLINK notes | + Inf-I no-call section | +| PGx `*.cnv.vcf.gz` | "CNV VCF" | ✓ | renamed "PGx CNV VCF" | ✓ | ✓ | +| Cyto `*.cnv.vcf.gz` | – | – | NEW "Cytogenetics CNV and LOH VCF" | renamed "Cytogenetics VCF" | + MF, MOSAIC, HIGHFRACTION, LowFraction | +| `cyto.cnv.dat` (metadata in vcf-folder, needed by annotate) | – | – | NEW | ✓ | ✓ | +| Cyto annotation JSON (per sample) | – | – | NEW | + chromosome/QC fields | + GAINLOH/mosaic thresholds, sampleName | +| BedGraph | single LRR | = | `LRR.bedgraph` + `BAF.bedgraph` | = | = | +| `star_alleles.csv` (intermediate, call→annotate) | ✓ | ✓ | ✓ | ✓ | **replaced by `.dat`** | +| Star-allele JSON (`metabolizer_status.json`) | ✓ | restructured | ✓ | ✓ | restructured | +| `diplotype_summary.csv`, `diplotype_annotations.csv`, `supporting_variants.csv`, `unresolved_variants.csv`, `variants_not_covered_on_array.csv` | – | – | – | – | NEW (annotate) | +| `gt_sample_summary.csv/.json` | ✓ | ✓ | ✓ | + samplesheet fields, failed samples | + Sample Name precedence | +| CN Summary, `cn_batch_summary.csv` | ✓ | ✓ | ✓ | ✓ | ✓ | +| `gtc_final_report.csv`, `locus_summary.csv` (cloud) | ✓ | ✓ | ✓ | ✓ | ✓ | +| `controls.raw_metrics.csv`, `controls.qc_metrics.csv` | – | – | – | – | NEW (genotype call + qc call) | +| `_QC_Report_YYYY_MM_DD.html`, `_QC_table_YYYY_MM_DD.` | – | – | – | – | NEW (qc report; cloud genotyping + cyto) | +| Methylation outputs (cloud) | ✓ | ✓ | ✓ | ✓ | ✓ | + +### 2.4 Field-level changes + +**PGx CNV VCF header**: v1.0/1.1 example lacks ploidy lines in doc; v1.2 `##CNVOverallPloidy`, `##CNVGCCorrect` → v1.3+ `##OverallPloidy`, `##GCCorrect`. +FORMAT `CN` ("CN=5 indicates 5 or 5+"), `NR` (aggregated normalised intensity); INFO `CNVLEN, PROBE, END, SVTYPE`; FILTER `Q7`, `SampleQuality`. +ID pattern `CNV::chr::`. SULT1A1 region changed v1.1: 16:28615068–28623382 → 16:28603587–28613544 +(doc example still shows old POS/END with new ID coordinates — internal inconsistency). GSTT1 on `22_KI270879v1_alt`. + +**Cyto VCF header**: v1.2 `##CNVgenomicPloidy`, `##CNVGCCorrect` → v1.3 `##OverallPloidy`, `##GCCorrect`. Constant lines `##platform=cytoplatform`, +`##product=GDACyto-8v1-0_A`, `##source=refcli X Cyto`. ALT ``, `` ("Copy number gain heterozygous region"), ``. FORMAT +`GT:CN:NR:LRD` (+ `MF` v1.4 doc). INFO `SVLEN, PROBE, END, LOHTYPE (AOH|CNLOH|GAINLOH)` (+ `MOSAIC`, `HIGHFRACTION` v1.4 doc). +FILTER `Q10`, `SampleQuality` (+ `LowFraction` v1.4). IDs `DEL:chr1:…`, `AOH:…`, `MosaicDEL:19:…`. **v1.4 example POS = ID start − 1** +(`1 109687841 DEL:chr1:109687842:…`) whereas v1.2/1.3 examples had POS = start (padding-base convention change or doc edit). +GAINLOH example is emitted as `` with `LOHTYPE=AOH` and CN=3 (doc inconsistency). v1.4 adds QUAL formula `QUAL = -10*log10(1 - P(called state))`, cap 60, min 0. + +**SNV VCF**: FORMAT `GT:GS:BAF:LRR`; GS header "For merged multi-assay or multi-allelic records, min GenCall score is reported"; QUAL `.`, +FILTER always `PASS` (documented v1.2), INFO `.`; MAV records carry only GT and GS (documented v1.4). + +**Star-allele CSV → diplotype_summary.csv**: v1.0–1.3 columns `Sample, Rank, Gene or Variant, Type (Haplotype|Variant), Solution, Solution Long, +Supporting Variants, Missing/Masked Core Variants, All Missing Variants in Array, Collapsed Star-Alleles, Score, Raw Score:, Copy Number Solution` +("Gene Region: Copy Number"). v1.4: `Sample, Solution Id, Gene or Variant, Type, Solution, Array-Equivalent Alleles (Allele 1), (Allele 2), +No Call Variants, Alleles Impacted by No-Call, Background Alleles, Variant Change, Score, Raw Score, Copy Number Solution` ("GeneRegion=CopyNumber"). +Renames: Rank→Solution Id; Collapsed Star-Alleles→Array-Equivalent Alleles (split per allele); Missing/Masked→No Call Variants + Alleles Impacted; +All Missing Variants in Array→variants_not_covered_on_array.csv; Supporting Variants→supporting_variants.csv +(`Sample, Solution Id, Gene or Variant, Allele, HGVS, RSID, Chromosome, Position, Ref, Alts, Genotype, Variant Copy Number, GS, BAF, ProbeID`); +unresolved_variants.csv (`Sample, Gene or Variant, Solution Id, Allele, HGVS, RSID, Reason (Not on Array|No Call), ProbeID`); +diplotype_annotations.csv (`Sample, Gene, PGx Guideline, Genotype, Activity Score, Phenotype Database Annotation`); v1.3: multiple top solutions +separated by `;` in `genotype`. + +**Star-allele JSON**: v1.0 top: `softwareVersion, genomeBuild ("hg38"), databaseSources (string), mappingFile, pgxGuideline, sampleId, locusAnnotations[]`; +locus: `gene, callType, genotype, activityScore, phenotype, qualityScore, rawScore, supportingVariants (string "Complete: *1 ( )"), candidateSolutions[ +rank, genotype, activityScore, phenotype, qualityScore, rawScore, alleles[solutionLong, supportingVariants, missingVariants, collapsedAlleles], +copyNumberRegions, copyNumberSolution], allMissingVariants, allelesTested`. +v1.1: `genomeBuild "38"`; `starAlleleDatabaseSources[]`, `phenotypeDatabaseSources[]`; `phenotypeDatabaseAnnotation` (e.g. "CYP2C9 Normal Metabolizer"); +supportingVariants objects `{chrom,pos,ref,alt,gt,gs,baf,id,alleleIds}` (all strings; ids sometimes with a leading space); +`missingVariantSites[{id,alleleIds}]`; quality scores are strings at locus level, numbers inside candidates; `collapsedAlleles` e.g. `"*2.001"`. +v1.4: locus adds `arrayEquivalentAlleles[{alleleId, ArrayEquivalentAlleles}]`, `variantNoCalls`, `allelesImpactedByNoCalls`, +`variantsNotCoveredOnArray[{hgvs,rsid,alleleIds}]` (replaces missingVariantSites); candidate alleles `{alleleName, supportingVariants, unresolvedVariantSites, +arrayEquivalentAlleles, backgroundAllele}` (solutionLong/collapsedAlleles/missingVariantSites removed), candidate adds `variantNoCalls, +allelesImpactedByNoCalls, variantChange`; supportingVariants `{CN, chrom, pos, ref, alts, gt, gs, baf, hgvs, rsid, alleleIds}` — the doc example +literally has keys `"CN:"`, `"chrom:"`, `"pos:"`, `"ref:"` (trailing colon; serialisation bug or doc artefact). Example genotype +`*27/*36x2+*83+*10`, "CYP2D6 Indeterminate", `copyNumberRegions "p5, intron.2, exon.9"`, `copyNumberSolution "5, 5, 2"`. +allelesTested list order changed (no longer numeric). + +**Cyto annotation JSON**: v1.2 top: `annotateDb, softwareVersion, referenceGenome, annotationType (0=Constitutional,1=Oncology), genomeBuild (hg19/hg38), +databaseSources, iscnVersion, sampleId, gcCorrect, minDelProbes, minDupProbes, minLOHProbes, minDelSize, minDupSize, minLOHSize, minQual, +overallPloidy, callRate, logRDev, bafDev{AA,AB,BB}, numLOHOver1M, numLOHOver8M, totalSizeLOHOver1M, copyNumberMedian, percentLOH (string "1.59%"), +sexEstimate ("Female"), traditionalNomenclature, microarrayNomenclature, chromosomeAnnotations[{id,numberDel,numberDup,numberLOH,numberMosaic}], +locusAnnotations[{id,chrom,start (0-based: 120311441 for id …:120311442),end,callType,mosaicState,copyNumber,qualityScore,size,probeCount,percentHet, +lrrMedian,lrrDev,bafDev,startCytoBand,endCytoBand,traditionalNomenclature,microarrayNomenclature,geneCount,genes[]}]`. +v1.3: `annotationType` → string `"Constitutional"` (table still says integer); `medianLogRDev`; chromosome fields `size, percentHet, hasMosaicism, +lrrMedian, lrrDev, numLOHOver1M, numLOHOver8M, totalSizeLOHOver1M, percentLOH, copyNumberMedian, copyNumberMean, minLogRRatio, maxLogRRatio, +medianMosaicFraction ("." when none)`; locus `mosaicFraction` ("."), `effectiveSize`. +v1.4: `sampleName`; `minGainlohSize, minMdelSize, minMdupSize, minMlohSize, minGainlohProbes, minMdelProbes, minMdupProbes, minMlohProbes`; +chromosome `lrrMean`, `numberGainLOH`; sample-level LOH counts **include** GAINLOH, chromosome-level counts **exclude** GAINLOH. +Example min sizes: v1.2 "50kb/50kb" (while CLI default was 0), v1.3 "20kb/20kb", v1.4 "25kb/50kb". + +**gt_sample_summary**: v1.0 `Sample ID, Sample Name, Sample Folder, Autosomal Call Rate, Call Rate, Log R Ratio Std Dev, Sex Estimate, +TGA_Ctrl_5716 Norm R` (last only on PGx products; <1 ⇒ TGA failure). v1.3 + user samplesheet columns appended verbatim; failed samples rows. +v1.4 Sample Name from `Sample_Name`; reserved keywords (e.g. `Sex Estimate`) rejected as samplesheet columns. + +**Warning/error catalogue** +- v1.0: Reference allele not queried; Skipping non-mapped / intensity-only locus / indel; Failed to process entry; Incomplete match of source + sequence; "Failed to combine genotypes due to ambiguity - exm1068284 (InfiniumII): TT, …"; "{n} sample(s) passed QC… Requires at least {m}"; + Invalid manifest path; Failed to load cluster file. +- v1.1 +: "Failed to normalize and gencall sample: {sample_id}, it will be skipped. Error: The given key '{loci_id}' was not present in the + dictionary." (BPM/EGT mismatch — sample skipped, not fatal); cluster-file vs CN-model warning; cluster load error cause "Corrupted file or unsupported version". +- v1.3 +: `System.IO.EndOfStreamException` entry. +- v1.4: "…due to ambiguity" renamed "…due to **inconsistencies**"; new "Failed to combine genotypes **all were No Calls**". + +### 2.5 Input-file changes +- v1.1: product files only from support site (MyIllumina custom manifests for design only); CSV manifest mapping rules (1-based; **PAR positions + reported on X**; insertion = base 5′ of insertion on + strand; deletion = most 5′ deleted base); **Mask file (.msk)** documented (same base name + as BPM); FASTA contig names must match manifest (`>1` not `>chr1`); NextSeq550 "for select arrays". +- v1.2: PGx CN model vs **Cytogenetics model file**; "CN model file needs to be updated upon manifest revisions… mismatch … will cause an error + during `pgx copy-number call` and `cyto call`"; Cytogenetics database (.zip, Ensembl + RefSeq, product-independent). +- v1.3: unified **Sample Sheet** (CSV only; `SentrixBarcode_A, SentrixPosition_A` local / `beadChipName, sampleSectionName` cloud; optional + `[Header]` with `RootFolder`, `[Data]`; `[Manifests]` ignored; CLI folder beats RootFolder; column names case-insensitive); JSON sheets dropped; + PGx DB described as many-probes-to-one-HGVS map cross-referenced to SNV VCF IDs at runtime; FASTA only needed locally; cyto+EMG sheet + `demographicSex` (M/F/U). +- v1.4: CN/cyto model files named by manifest revision (e.g. B1) and must pair with that revision; cyto model "primarily contains probe GC content + information", needs no retraining for a different cluster file; for custom products supply BPM + EGT + IDAT/GTC of ≥1 sample; samplesheet + fields ≤ **500 chars**; Excel scientific-notation barcodes break IDAT lookup; Sample Name Determination; YAML config (null disables a check); + cyto+EMG sheet keys switched to `SentrixBarcode_A,SentrixPosition_A,demographicSex`. + +--- + +## 3. Internal hints (implementation, libraries, formats) + +- **Runtime/stack**: .NET (self-contained; **.NET 9 from v1.4**), config `refcli.runtimeconfig.json`, `System.Globalization.Invariant` switch. + Namespaces/classes: `ArrayAnalysis.CLI.App` (`RunCliServiceAndReturnExitCode(BaseOptions opts)`, App.cs:110 — verb/options pattern typical of + CommandLineParser), `ArrayAnalysis.Core.GtcFileLoader` (ctor reads strings via `System.IO.BinaryReader.ReadString()` at line 161 → GTC strings are + .NET 7-bit-length-prefixed; culture-formatted datetime written into GTC), `ArrayAnalysis.Services.GtcFactory.CreateGtcFromSample(Sample, Boolean log)`, + `ArrayAnalysis.Services.GtcToVcfService.Run(GtcToVcfInput)`. Log format `fail: ArrayAnalysis.CLI.App[0]` = Microsoft.Extensions.Logging console + formatter. Samplesheet validation throws `System.ArgumentException`. Errors like "The given key '…' was not present in the dictionary" = + .NET `KeyNotFoundException` leaking from locus lookup (BPM↔EGT keyed by locus name). +- **"The model has been changed since the solution was last computed."** — wording matches Google OR-Tools `MPSolver` (linear/integer + programming) → the star-allele caller very likely solves an ILP/MIP per gene (Aldy-style). Linux/Windows score differences are consistent with + solver/floating-point nondeterminism. (Inference.) +- Star-allele quality: "negative log likelihood" for alternatives; `rawScore` excludes population-frequency prior; `qualityScore` includes it; + alternatives kept if score ≥ 50% of best; "variant edit distance" used to rank no-call candidates. +- Build metadata: `softwareVersion "refcli 1.1.0+9f82ed31d8c17e42b80f67a3e2b271f1a873e1d1"` (SemVer + git SHA); PGx DB names + `GDA_ePGx_E2_DAv1.0.0.zip`, `-549-fix-annotate-sha.e56e884e….zip` (Jira key -549), `DAv1.3.0-rc3.zip`, + `DAv1.4.0-rc2-pgx-mapping-sha.b164b4aa….zip`; `CytoAnnotateData_DAv1.2.0.zip`; `gda_mapping_53e0931.zip` (v1.0). +- Licensing: `[ref-license-server-legacy]` (v1.0–1.1; legacy host from the product's original developer) → `[ref-license-server]` (v1.2+); per-sample quota; HTTP 409 on + usage update when over quota; results discarded. +- **Platform codes**: `LCG` (GDA / Infinium LCG chemistry) and `EX` (Infinium EX) = CSV manifest `Assay Format`; cyto log `CytoPlatform`; cyto VCF + `##platform=cytoplatform`. +- CN model stores the cluster-file identity (compares `{GTC.egt}` with `{CN_Model.egt}`) → GTC records the cluster-file name; CN/cyto models are + keyed to manifest revision; PGx CNV model trained with `.msk` mask; cyto model = per-probe GC content (+ presumably reference LRR stats). +- **GTC**: v5; "legacy GTCs" from AutoConvert/Beeline work for gtc-to-vcf but **not for cyto/PGx** → the product's own GTCs carry extra content or + tighter conventions required downstream. BeadArrayFiles cited as parser. +- **VCF/index**: claims VCF 4.1 but filter delimiter made VCF-4.3-compliant; own tabix writer (no n_no_coor / count metadata pseudo-bin); + bgzip. GenomeStudio parity everywhere (samplesheet, Final Report, Locus Summary, Control Dashboard). +- **Cyto algorithm hints**: GC correction flag, overall ploidy (length-weighted), LRR smoothing window (probes per side, default 5), Phred QUAL + from state posterior, effective size (gaps >150× median probe spacing replaced by median spacing), LRR-pattern consistency filter, short-LOH + (<500 kb, copy-neutral flanks) removal, mosaic fraction (NaN if too few informative probes), promotion above max fraction, sex resolution, + whole-chromosome-only mode when LogRDev > 0.3, CN capped at 4+, GT always 1/1, annotationType Constitutional/Oncology, ISCN 2020, + RefSeq `GCF_000001405.40-RS_2023_10`, Ensembl 112, genes = HGNC symbols + unmatched ENSG accessions. +- **Methylation QC internals**: R/Bioconductor **SeSAMe** — logs `run_sesame_gs.log`, `convert_manifest_ilmn_sesame.log`, "Manifest in Sesame format + (probes.csv)", **noob** background normalisation, **dye-bias correction**, detection p-value (0.05), BACR (BeadArray Controls Reporter) metrics + (21 controls), background offset x = 3000, PCA of betas, `write_samplesheet.log`, `format_samplesheet.log`, `qc.log`. +- **QC report**: Plotly-based self-contained HTML; YAML thresholds; control formulas (bkg_grn = max green of Extension A/T, bkg_red = max red of + Extension C/G, x = 3000); IDAT metadata extracted: ImagingDate, SamplePlate, SampleWell, ScannerId, ScannerVersion. +- **Cloud**: the vendor cloud platform, cloud data layer (renamed twice), AWS SNS "Analysis Success" event, payload v4, iCredits → BICs. + +--- + +## 4. Numeric thresholds, defaults and limits (with changes) + +| Item | Value(s) / change | +|---|---| +| GenCall no-call cutoff | 0.15 (all versions) | +| Min RAM | 16 GB (v1.0–1.1) → "16 GB available" (v1.2–1.3) → **32 GB available (v1.4)**; 8 cores; 30 GB disk; cyto annotate ≥5 GB free | +| PGx CNV batch | min 24 samples, 22 passing LogRDev < 0.2; recommended ≥96 passing LogRDev ≤ 0.2; ≤500 GDA-ePGx samples/batch on std HW; samples from ≤2-week window may be pooled | +| PGx CN train | min 96 samples, 90 passing LogRDev ≤ 0.2; recommend ≥150; diminishing returns >3000; exclude LogRDev > 0.2, call rate < 0.99, TGA ctrl < 1.0 | +| PGx CNV VCF | QUAL Phred cap 60, min 0; FILTER Q7 (<7); SampleQuality LogRDev > 0.2; CN=5 means ≥5 | +| PGx coverage | CNV: 6 genes / 9 regions (v1.0) → 7 / 10 (v1.1, +SULT1A1) | +| Star-allele | in-silico call rate ≥ 99%, diplotype accuracy ≥ 90% (v1.0); alt solutions listed if ≥50% of top score; review supporting variants with GS < 0.15; no-call alternates may have edit distance ≥ 3 | +| Star-allele DB versions | PharmVar 6.0.5→6.1; PharmGKB 2023-08-30→2024-05-16; CPIC 1.30.0→1.38.0; DPWG June 2023 | +| Linux/Windows PGx discordance | 1576 samples: 2 / 1 / 1 / 2 field differences (v1.3) | +| Cyto VCF | QUAL cap 60, Q10 (<10); SampleQuality LogRDev > 0.2; LogRDev > 0.3 ⇒ whole-chromosome events only; CN max 4+ | +| Cyto CNV size (call) | v1.2 min CNV 0 kb/10 probes → v1.3 **20 kb (effective)**/10 → v1.4 DEL 25 kb/10, DUP 50 kb/10 | +| Cyto annotate DEL/DUP size | 0 kb (v1.2–1.3) → 25 / 50 kb (v1.4) | +| LOH | 3000 kb / 500 probes (all); GAINLOH 500 kb / 300 probes (v1.4); mosaic DEL/DUP/LOH = non-mosaic values | +| min-qual (annotate) | 20 | +| Probe threshold floor | values < 10 reset to 10 (v1.4 doc) | +| Smoothing | cyto 5; bedgraph 0 (v1.2 only) | +| Mosaic | v1.3: "<20% may be missed, <5% not called"; v1.4: detect ≳15% for one-copy states, "<15–20% may be missed", 5% cutoff removed; max-mosaic-fraction 1.0 | +| LOH short-segment filter | <500 kb with copy-neutral flanks removed (v1.4) | +| ISCN | only events > 1 kb | +| copyNumberMedian | v1.2 segments >1 kb only → v1.3 all segments length-weighted | +| Effective size | gaps > 150 × median probe spacing | +| Visual-inspection flag | >10 events (DEL/DUP/AOH) per chromosome | +| Cyto cloud memory | fails ~200 samples (v1.2), fixed v1.3 | +| Batch limits (cloud) | genotyping 1152, PGx 384, cyto 1152, methylation 1152 | +| Samplesheet | slow >1K samples; fields/columns ≤500 chars (v1.4) | +| Manifest name | >80 chars failed IDAT→GTC (v1.0-era) | +| Final report | >1M loci × >100 samples ⇒ 50+ GB | +| QC report | callRate 0.98, logRDev 0.20 default; others unset; UI: 40-char hover, >6 facet levels → "Other", 12,000/1,000-sample switch bug | +| Methylation | 21 controls; offset x = 3000; p-value 0.05; failure at 80–100 samples with >900K probes (fixed 1.0.1); FFPE restoration threshold 0 → 1 if restore kit used | +| Hyb control conc. | 5 pM / 1 pM / 0.2 pM | + +--- + +## 5. Gap analysis vs SimurgArray plan — behaviours to implement or test + +Wording is generic ("the reference tool"). Each item names the plan section it touches. + +### 5.1 File I/O and robustness (§6, §14, §16) +1. **GTC string encoding** (§6 GTC writer): write all strings as length-prefixed UTF-8/ASCII with 7-bit varint length; format timestamps with + invariant culture and ASCII digits only; add a fuzz/golden test with a non-English locale (e.g. `LC_ALL=tr_TR`, `ar_SA`, `ja_JP`) and verify the GTC + still round-trips and is readable by the oracle parser. Reader must survive files written by the reference tool under the same bug (clean error, not crash). +2. **Corrupt GTC / IDAT handling**: skip-and-report per sample (exit code 3) rather than abort; include failed samples in the sample summary with + call rate 0 and LogRDev/NaN fields, matching the reference behaviour since v1.3. +3. **Manifest/cluster/IDAT consistency checks** the reference lacks: BPM vs CSV (locus names, count, order), BPM vs EGT (missing key → reference + skips sample with a dictionary error), IDAT vs BPM (address coverage; warn on low call rate / many NaN QC). Make these explicit validation errors (exit 2). +4. **Long names**: test manifest/cluster names > 80 chars, paths with spaces and non-ASCII; cluster file names limited to `[A-Za-z0-9_-]` by the reference — we should accept anything. +5. **Duplicate IDAT pairs** for the same barcode_position under one input tree: the reference picks one nondeterministically (OS-dependent). Detect and fail (or deterministic rule + warning). +6. **Overwrite policy**: the reference silently overwrites outputs; the plan's `--force` rule is stricter — keep it and test it. +7. **Batch scale**: samplesheets > 1000 samples must not degrade super-linearly; add a 10k-row samplesheet benchmark (§19). + +### 5.2 Samplesheet semantics (§5, §14) +8. Accept GenomeStudio sheets: optional `[Header]`/`[Data]`, ignore `[Manifests]`, `RootFolder` overridden by CLI folder; keys `SentrixBarcode_A`, + `SentrixPosition_A` (and cloud-style `beadChipName`, `sampleSectionName`). +9. Column names case-insensitive; duplicate (case-folded) names → clear error; empty column headers tolerated (ignored); reserved output names + (`Sex Estimate`, etc.) rejected or namespaced; values/columns length cap; barcodes in scientific notation/decimal (`2.04753E+11`, `204753010023.0`) detected with a helpful error. +10. **Sample-name precedence**: sheet `Sample_Name` (must be non-empty for all rows and must not collide with another sample's barcode_position ID) + > name embedded in IDAT/GTC > `barcode_position`. Never rewrite the name inside the GTC; downstream outputs follow the sheet of that command. +11. Pass-through of arbitrary user columns into the sample summary (CSV + JSON), preserving order. + +### 5.3 Genotyping and VCF export (§7, §8) +12. **Multi-assay / multi-allelic combination** (§8.3): enumerate genotypes over queried alleles; filter by each assay's call respecting Infinium II + A/T–C/G blindness; 0 survivors = "inconsistent", >1 = "ambiguous", all NC = "all no calls" — emit distinct warnings. Test the two published + scenarios: Inf II [A/G]=AA + Inf I [T/G]=TT → NC (ambiguity AT/TT); Inf I [T/A]=AA + Inf II [A/G]=NC → NC. +13. Optional **"Infinium I no-call means missing signal"** mode (reference `--use-infI-nc-info`): an Inf-I NC excludes its allele from candidates; + document the higher FP risk and that clusters for zeroed-out MAV assays must exist in the cluster file. +14. **Opposite-strand duplicate indels** (`D/I` + `I/D` both HET) must yield `0/1` (reference bug until v1.4) — add a regression test. +15. **SNV + indel at the same position** are not merged by the reference; decide policy (keep separate by default for compatibility; optional merge) and test. +16. MNV via auxiliary-loci VCF: must be MNV, not multi-allelic, not duplicated; test each restriction. Also test Final-Report TOP alleles for MNV + designs (reference reverse-complements some — do not replicate). +17. Merged/MAV records: GS = min of assays; **no BAF/LRR**; IDs joined with `,` (SNP) / `;` (indel); FILTER constant `PASS`, QUAL `.`. +18. Unmapped loci (`Chr=0`), intensity-only probes, unmappable indels → skipped with specific warnings; count them in the run summary. +19. Indel coordinate conventions from manifest (insertion = base 5′ of insertion on +; deletion = most 5′ deleted base; 1-based; PAR mapped to X) + and REF/ALT "flip" where the manifest calls an insertion a deletion — test against dbSNP-normalised truth. +20. Ploidy: haploid GT on Y, MT and non-PAR X for males; unknown-sex policy must be explicit. +21. BAF/LRR orientation relative to REF (1−BAF vs manifest orientation) — already in plan; add a test on a locus where A allele = ALT. +22. Contig naming: FASTA contigs must match manifest (`1` vs `chr1`); plan's alias table should be tested with both spellings and `22_KI270879v1_alt`. +23. **Index files**: write tabix/CSI via htslib so `bcftools index --stats/--nrecords` works (reference index lacks count metadata); verify downstream readers. +24. VCF version header vs content (reference claims 4.1 but uses 4.3 filter delimiters) — choose one and validate with `bcftools`/`vcf-validator`. +25. `--unsquash-duplicates` must not unsquash multi-allelic duplicate designs (reference rule); test. +26. Sample-summary field `TGA_Ctrl_5716 Norm R`-style "named control probe normalised R" should be supported generically (configurable probe list), omitted when absent. + +### 5.4 Cross-platform determinism (§15, U11) +27. The reference produces different star-allele scores/fields and different output sorting on Windows vs Linux, and picks different duplicate + IDATs per OS. SimurgArray must: sort every output deterministically (sample, gene, rank, then lexical tie-breakers), avoid hash-order iteration, + fix solver seeds/tolerances, and run golden tests on x86 and ARM (U11). + +### 5.5 BedGraph / visualisation (§13) +28. BAF and LRR bedGraphs; if any LRR smoothing is offered, it must never change the stored raw values (reference smoothing corrupted LRR) — golden test: smoothing=0 equals raw. + +### 5.6 Copy number, LOH, mosaicism (§10, v2) +29. Defaults to mirror (latest reference): DEL 25 kb/10 probes, DUP 50 kb/10, LOH 3000 kb/500, GAINLOH 500 kb/300, mosaic same as germline, + min QUAL 20 (report) with Q10 FILTER, QUAL = −10·log10(1−P) capped 60, min probes floored at 10, thresholds > genome ⇒ empty output (not error). +30. **Effective size** (gaps > 150× median spacing collapsed) used for filtering at call time; decide and document whether annotation filters use raw or + effective size (reference differs between steps) — add a test with a variant spanning a centromere gap. +31. States: DEL, DUP (CN up to 4+ capped), LOH subtypes AOH / CN-LOH / **GAINLOH** (CN=3 with LOH), mosaic DEL/DUP/LOH incl. **mosaic Y duplication in males**; + haploid-region mosaic states (CN1/CN0, CN1/CN2). +32. Mosaic fraction: NaN/"." when insufficient informative probes; `LowFraction` filter below a threshold instead of hard drop; promotion when + MF ≥ max-fraction (`HIGHFRACTION`) keeping MF; target sensitivity ≳15% for one-copy states; test 5%, 10%, 15%, 20% simulated mixtures. +33. Post-filters: LRR-direction consistency (gain ⇒ mostly positive LRR, loss ⇒ negative); remove LOH < 500 kb flanked by copy-neutral segments; + LogRDev > 0.2 ⇒ SampleQuality flag; LogRDev > 0.3 ⇒ whole-chromosome events only; >10 events/chromosome ⇒ review flag. +34. **Sex handling**: resolve unknown sex inside the CN caller (log when changed); never silently default to male — emit an explicit flag. PAR + must be callable (reference failed on some manifests). +35. Overflow/degenerate cases: zero variants in a noisy sample, all-NaN LRR chromosome, single-probe chromosomes, QUAL 0 events (must still reach JSON), + very large batches (≥200 samples memory), triploid genomes (document limitation), centromere artefact masking. +36. VCF genotype: reference hard-codes GT=1/1 for all CN events; SimurgArray should emit a meaningful GT (e.g. `0/1` for het DEL, `./.` or + CN-only for symbolic SVs) with an optional compatibility mode; fix POS convention (symbolic SV POS = base before event per VCF spec) and test + that ID coordinates, POS and END agree. +37. Annotation JSON parity fields worth reproducing: overall ploidy, callRate, logRDev, medianLogRDev, bafDev per genotype, LOH counts >1 Mb/>8 Mb, + percentLOH, length-weighted CN median (all segments, no 1 kb floor), per-chromosome stats (lrrMean/median/dev, min/max LRR, CN mean/median, + percentHet, hasMosaicism, medianMosaicFraction, counts incl./excl. GAINLOH), per-event effectiveSize, ISCN 2020 (events > 1 kb; also for + LOH and mosaic, which the reference lacks; ensure the first event is annotated), cytobands, genes (HGNC + unmatched Ensembl IDs). +38. Units: always store sizes in bp internally and render units consistently (reference printed thresholds in wrong units). + +### 5.7 Pharmacogenomics (§11, v2) +39. CN model/cluster-file coupling: store cluster-file hash in the model; policy = warn (reference 1.1–1.3) vs error (reference 1.4) — make it + configurable and test both; model must also match manifest revision (error otherwise). Model training requires ≥96 samples/90 passing; calling ≥24/22. +40. Star-allele edge cases to test: unknown/undefined allele in phenotype lookup must not crash (CYP2E1 cluster-drift case); reference-allele + genes (ABCG2) get default "Normal"; CYP2D6 exon-9 conversion (*36 vs *83+…) and hybrids/duplications (`*36x2+*83+*10`); CYP2A6 *1 definition sanity; + HGVS REF>ALT formatting (never `_`); multi-allelic extension of bi-allelic DB definitions; many-probes-to-one-variant mapping; symlinked inputs; + requirement that inputs be squashed + bgzipped + indexed (validate and error clearly). +41. No-call handling: distinguish per-sample no-call variants from variants not on the array; list impacted alleles; for no-call diplotypes return + ranked candidates with variant deltas and bound the edit distance; ensure JSON and CSV carry identical supporting evidence for **both** alleles. +42. Scoring: probability-like score with population prior + raw score without; alternates retained if ≥ 50% of top; multiple tied top solutions + joined by `;`; low-GS (<0.15) supporting-variant flag. +43. Solver robustness: if an ILP/MIP formulation is used, guard against stale-solution/memory errors and make results solver-version independent. + +### 5.8 QC module (§9) +44. Control metrics and formulas match the reference table (bkg definitions, x = 3000, genotyping vs methylation variants); produce + `controls_raw` / `controls_qc` equivalents; YAML thresholds with `null` = disabled; CLI overrides YAML overrides defaults (0.98 / 0.20); + multi-dataset reports with labels; IDAT metadata (imaging date, plate, well, scanner ID/version) extracted; privacy warning when sample-sheet metadata flows into reports. +45. HTML report scalability: >12,000 samples, >6 facet levels, long hover labels — test the plan's self-contained report at these sizes. + +### 5.9 Methylation QC (plan "v2 methylation control QC") +46. Reproduce noob + dye-bias correction + detection p-values (SeSAMe-equivalent), 21 control metrics with per-array thresholds, offset x configurable, + PCA on betas; test sample counts around 80–100 with >900K-probe arrays (reference crash zone) and custom manifests lacking control sections (clear errors/NA metrics). + +### 5.10 Release-management lessons +47. Keep a machine-readable changelog of every default change (the reference changed CNV min size 0 → 20 → 25/50 kb and removed/renamed options + across minor versions); emit all effective thresholds into output headers/JSON (the reference does this in cyto JSON) and into `run_manifest.json`. +48. Keep output schemas versioned (the reference renamed JSON keys in 1.1 and 1.4, changed `annotationType` int→string, and shipped malformed keys + such as `"chrom:"`); add JSON-schema validation tests to CI. diff --git a/docs/research/R1_reference_product.md b/docs/research/R1_reference_product.md new file mode 100644 index 0000000..bef2398 --- /dev/null +++ b/docs/research/R1_reference_product.md @@ -0,0 +1,648 @@ +# R1 — the reference product: public-source product dossier + +> **Archived Phase-0 study (sanitized copy, see `README.md`).** Written 2026-09-27, before the decisions in +> `SIMURGARRAY_MASTER_PLAN.md` §2. The analysed vendor product is called "the reference product" and its CLI +> `refcli`; its documentation URLs are replaced by `[ref-docs:…]` tokens. Where this file speaks of a clean room, +> legal clearance, or running/benchmarking the vendor binary, plan §2 supersedes it: personal research; MIT/BSD/Apache +> code may be reused with attribution; GPL tools are subprocess oracles only; vendor binaries are never run for +> comparison, inspected or decompiled; oracles are published vendor-produced GTCs, gtc2vcf and BeadArrayFiles. + +Compiled 2026-09-27 for a reimplementation feasibility study. +**Only public sources were used.** No binaries were downloaded, run, or inspected. + +Tag legend: +- **[PUBLIC DOCUMENTATION]**: stated in an Illumina (or other named public) source. The URL is given. +- **[INFERRED]**: a direct logical consequence of public statements. The reasoning is shown. +- **[HYPOTHESIS]**: a plausible guess that still needs validation. + +### Primary source: the official reference-product documentation site + +- Site: [ref-docs:home]. It is also mirrored under [ref-docs:mirror]. +- Every page also has a Markdown copy: append `.md` to the page URL. The site index is [ref-docs:llms.txt]. +- Versioned docs live under `v1.0` to `v1.3`. The root path is v1.4, the latest release. + +Short aliases used in this report: + +| Alias | URL | +|---|---| +| `[DOC-HOME]` | [ref-docs:readme] | +| `[DOC-APPS]` | [ref-docs:our-features] | +| `[DOC-LOCAL]` | [ref-docs:local-analysis] | +| `[DOC-IN]` | [ref-docs:input-files] | +| `[DOC-OUT]` | [ref-docs:output-files] | +| `[DOC-QC]` | [ref-docs:local-analysis/qc-report] | +| `[DOC-FAQ]` | [ref-docs:faq] | +| `[RN-1.0]` | [ref-docs:release-notes-1.0.0] | +| `[RN-1.1]` | [ref-docs:release-notes-1.1.0] | +| `[RN-1.2]` | [ref-docs:release-notes-1.2.0] | +| `[RN-1.3]` | [ref-docs:release-notes-1.3.0] | +| `[RN-1.4]` | [ref-docs:release-notes-1.4.0] | +| `[DOC-REV]` | [ref-docs:document-revision-history] | +| `[DOC-V10-LOCAL]` | [ref-docs:v1.0/local-analysis] | +| `[DL]` | [ref-docs:downloads] | + +--- + +## 1. What the reference product is + +### 1.1 Identity + +- **Name and scope.** "[product name] secondary analysis is a … bioinformatics software for Illumina Infinium array-based assays." [PUBLIC DOCUMENTATION] `[DOC-HOME]` +- **Two packages.** + - A local package with a command-line interface: "no specialized server or hardware required". + - A cloud package with a GUI, running in the vendor cloud platform. + - [PUBLIC DOCUMENTATION] `[DOC-HOME]`, `[DOC-FAQ]` +- **Binary name.** + - The CLI executable is **`refcli`** (`refcli.exe` on Windows). It sits in the `refcli` subfolder of the unpacked installer. + - Version check: `refcli version`. + - Example install path in the docs: `/usr/local/bin/-linux-x64-DAv1.4.0//`. + - [PUBLIC DOCUMENTATION] `[DOC-LOCAL]`, Illumina Knowledge 000010127 ([ref-docs:kb-000010127]) +- **Installer file names** (from the download page): + - `…v1.4LinuxInstaller-1.4--linux-x64-DAv1.4.0-rc2-sha.9b051a4b….tar.gz` (about 60 MB) + - `…--win-x64-DAv1.4.0-rc2-sha.9b051a4b….zip` (about 57 MB) + - Both dated May 4, 2026. Downloading requires a MyIllumina login and a customer or instrument serial number. + - [PUBLIC DOCUMENTATION] `[DL]`, Knowledge 000010127 + +### 1.2 Implementation technology + +- **.NET application.** + - "[product] v1.4 is a self-contained .NET 9 application … Linux users may need to install native OS-level dependencies." [PUBLIC DOCUMENTATION] `[RN-1.4]`, `[DOC-LOCAL]` (Linux Dependencies section) + - A config file `refcli.runtimeconfig.json` exists. The docs suggest setting `System.Globalization.Invariant=true` in it as a workaround. [PUBLIC DOCUMENTATION] `[RN-1.0]`…`[RN-1.4]` +- **Internal namespaces.** Stack traces published in every release note show: + - `ArrayAnalysis.CLI.App` + - `ArrayAnalysis.Core.GtcFileLoader` (source path `/src/ArrayAnalysis.Core/GtcFileLoader.cs`) + - `ArrayAnalysis.Services.GtcFactory` + - `ArrayAnalysis.Services.GtcToVcfService` + - [PUBLIC DOCUMENTATION] `[RN-1.0]` + - Inference: the `refcli` code base descends directly from the vendor's earlier array CLI (ACLI) code base. [INFERRED] + +### 1.3 Release history + +| Version | Date | Key content | Source | +|---|---|---|---| +| **v1.0.0** | Dec 2023 | Local CLI: genotyping (IDAT→GTC→VCF), PGx CNV, native PGx star-allele caller with quality scores and CPIC/DPWG annotation. PGx validated only on GDA-ePGx (`GDA_PGx…E2`). | `[RN-1.0]` | +| Genotyping Cloud 1.0.0 | Mar 2024 | Cloud genotyping; Final Report and Locus Summary outputs. | [ref-docs:release-notes-1.0.0-cloud-genotype] | +| Methylation QC Cloud 1.0.0 | May 2024 | Cloud-only methylation QC: 21 control metrics, detection p-values, beta values, M-values. | [ref-docs:release-notes-1.0.0-cloud-methylqc] | +| **v1.1.0** | Sep 2024 | EX PGx chips (GSAv4-ePGx, GCRA-ePGx). More PGx genes. A custom EGT can be used with the stock CN model (warning only). JSON schema renames. | `[RN-1.1]` | +| **v1.2.0** | Feb 2025 | Whole-genome **cytogenetics** CNV/LOH calling, VCF output, BAF/LRR bedgraph, ISCN 2020 / cytoband annotation JSON. New `pgx` root command. New license server `[ref-license-server]`. | `[RN-1.2]` | +| **v1.3.0** | Aug 2025 | Mosaic-fraction estimation. PAR/sex-chromosome improvements. GenomeStudio-compatible sample sheet. Failed samples stay in `gt_sample_summary`. `--smoothing` removed from gtc-to-bedgraph. | `[RN-1.3]` | +| Methylation QC Cloud 1.0.1 | Feb 2026 | Maintenance release. | [ref-docs:release-notes-1.0.1-cloud-methylqc] | +| **v1.4.0** | May 2026 (latest) | **QC Report** (`qc call`, `qc report`; "replacing the GenomeStudio control dashboard"). GAINLOH calling. Better mosaic detection. PGx SV star alleles and a new CSV set. `--use-infI-nc-info` for multi-allelic variant (MAV) calling. .NET 9. | `[RN-1.4]` | + +All rows above are [PUBLIC DOCUMENTATION]. Additional notes: + +- The v1.0.0 cloud pipeline versions were deprecated in Q1 2026. [PUBLIC DOCUMENTATION] `[RN-1.0]` +- Documentation revisions run from 01 (Dec 2023) to 14 (Aug 2026). Revision 14 renames the vendor cloud platform's data layer. [PUBLIC DOCUMENTATION] `[DOC-REV]` + +### 1.4 Relationship to other Illumina tools + +**The vendor's earlier array CLI (ACLI)** +- Illumina calls it "the predecessor to [product]". [PUBLIC DOCUMENTATION] Illumina Knowledge 000003079 (https://knowledge.illumina.com/microarray/general/microarray-general-reference_material-list/000003079) +- "ACLI was obsolesced in December 2024, and support ended in July 2025." [PUBLIC DOCUMENTATION] (same source) +- ACLI v2.1 subcommands: `genotype call`, `genotype gtc-to-vcf`, `copy-number call`, `copy-number train`. Options such as `--bpm-manifest`, `--cluster-file`, `--idat-folder` match `refcli`'s option names. [PUBLIC DOCUMENTATION] https://support-docs.illumina.com/ARR/ArrayAnalysisCLI/Content/ARR/IMA/RunAnalysis_Local.htm and https://sapac.support.illumina.com/array/array_software/ima-array-analysis-cli.html +- The reference product's v1.0 also had top-level `copy-number` and `star-allele` commands. v1.2 regrouped them under `pgx`. [PUBLIC DOCUMENTATION] `[DOC-V10-LOCAL]`, `[RN-1.2]` + +**IAAP (Illumina Array Analysis Platform) CLI and AutoConvert** +- These are earlier .NET GenCall front-ends (IDAT→GTC). [PUBLIC DOCUMENTATION] https://emea.support.illumina.com/downloads/iaap-genotyping-cli.html +- Third-party gtc2vcf (MIT license) reports that "AutoConvert 2.0, IAAP-CLI, and ACLI … perform version 1.2.0 of the normalization step and seem to produce the exact same results", while the original AutoConvert uses normalization 1.1.2. [PUBLIC DOCUMENTATION – third party] https://github.com/freeseek/gtc2vcf +- The reference product probably kept normalization 1.2.0 (or a successor) and GenTrain/GenCall-compatible calling. It still reads EGT cluster files and writes GTC v5, and GTCs from AutoConvert/Beeline are accepted by `gtc-to-vcf` as "legacy GTCs". [HYPOTHESIS], supported by `[DOC-OUT]` + +**GenomeStudio 2.0** +- It is still the tool for **creating custom cluster files (EGT)**. The reference product does not cluster; it only consumes EGTs. [PUBLIC DOCUMENTATION] `[DOC-LOCAL]`, section "Optimizing cluster files" +- The reference-product QC Report "replaces GenomeStudio control dashboard". [PUBLIC DOCUMENTATION] `[DOC-FAQ]`, `[RN-1.4]` +- The cloud Final Report and Locus Summary are "similar to the one available in GenomeStudio". [PUBLIC DOCUMENTATION] `[DOC-OUT]` +- For PGx cluster review, "GenomeStudio auxiliary files" (`*_GS_import*.zip`) are provided. [PUBLIC DOCUMENTATION] `[DOC-LOCAL]`, `[DL]` + +**GTCtoVCF (github.com/Illumina/GTCtoVCF, Apache-2.0, Python 2.7)** +- Its README says: "As of May 2023, it is now recommended to use … [product] for GTC to VCF conversion." [PUBLIC DOCUMENTATION] https://github.com/Illumina/GTCtoVCF +- `refcli genotype gtc-to-vcf` reuses GTCtoVCF's option names and near-verbatim documentation text: + - `--unsquash-duplicates`, `--auxiliary-loci`, `--filter-loci`, `--disable-genome-cache` + - the "Squashing duplicates", "Genome cache", "Auxiliary loci" and "combined genotype" paragraphs, and the dbSNP mapping conventions + - Inference: the refcli implementation is a port or evolution of GTCtoVCF logic. That makes GTCtoVCF (open source, Apache-2.0) a strong **legal reference implementation** for the VCF conversion layer. [INFERRED] Compare `[DOC-LOCAL]` with the GTCtoVCF README. + +**The vendor cloud platform** +- The cloud edition of the reference product runs in the vendor cloud platform UI. Data is stored on the vendor cloud platform. +- An iScan can stream IDATs to the cloud directly. +- Analysis types in the vendor cloud platform dropdown: + - "[product] – Genotyping and QC" + - "– PGx – CNV calling" + - "– PGx – Star allele annotation" + - "– Cytogenetics analysis" + - "- Cytogenetics analysis + tertiary interpretation" (cloud only) + - "– Methylation – QC" (cloud only) +- Tertiary-interpretation platform integration uses vendor cloud-platform SNS notifications. +- [PUBLIC DOCUMENTATION] `[DOC-APPS]`, [ref-docs:cloud-analysis], [ref-docs:cloud-analysis/cytogenetics-analysis] +- Cloud sample limits: max 1152 samples for genotyping, cytogenetics and methylation; max 384 for the PGx types. [PUBLIC DOCUMENTATION] `[DOC-APPS]` + +**Relationship to the vendor's NGS secondary-analysis product of the same brand** +- The reference product shares only branding with it: no FPGA, a different code base, CPU only. +- The developer article states: "The software runs on CPUs and does not require a specialized server or FPGA hardware." +- [PUBLIC DOCUMENTATION] [ref-docs:dev-article-1.0-pgx] + +--- + +## 2. Supported arrays and species + +All of this section is [PUBLIC DOCUMENTATION] from `[DOC-APPS]` ("Product & Analysis Compatibility") unless noted. + +### 2.1 Genotyping + +"Any Infinium genotyping array, including human (including custom and semi-custom) and non-human diploid species". + +Tested manifests: + +| Array | Manifest | Genome build | +|---|---|---| +| ASA | ASA-24v1-0_E2 | GRCh37/38 | +| BovineSNP50 v3 | BovineSNP50_v3_A1 | UMD3 (non-human) | +| CGA | CGA-24v1-0_A1 | GRCh37/38 | +| GCRA | GCRA-24v1-0_20068388_B2 | GRCh37/38 | +| GDA | GDA-8v1-0_D2 | GRCh37/38 | +| GSA v3 | GSA-24v3-0_A2 | GRCh37/38 | +| GSA v4 (Infinium EX) | GSA-48v4-0_20085471_D2 | GRCh37/38 | +| JSA | JSA-24v1-0_B2 | GRCh37/38 | +| PRSbooster | PRSbooster_20083382_A | GRCh37 | + +Species support: +- Non-human diploid species work if the user supplies a reference FASTA. For non-human data, turning off VCF output is recommended on cloud. +- "Genotyping only supports diploid organisms. Polyploid genotyping is currently not supported." `[RN-1.1]`…`[RN-1.4]` + +### 2.2 PGx (CNV and star alleles) + +Supported only for these commercial ePGx products, all on GRCh38: +- GDA-ePGx `GDA_PGx-8v1-0_20042614_G4` +- GSAv4-ePGx `GSA-PGx-48v4-0_20079540_E2` +- GCRA-ePGx `GCRA-PGx-24v1-0_20084467_C2` + +Semi-custom arrays get PGx calls only for the commercial backbone content. `[DOC-LOCAL]` (semi-custom section) + +### 2.3 Cytogenetics (CNV/LOH) + +Validated arrays: +- GDA Cyto-8 (`GDACyto-8v1-0_20047166_E2`) +- GSA Cyto-24 (`GSACyto-24v1_20044998_C2`) +- CytoSNP-850K v1.4, iScan (`_iScan_B2`) and NextSeq550 (`_NS550_B2`, from v1.3) + +Details: +- Builds GRCh37 and GRCh38. +- Constitutional samples only; "oncology samples not supported". `[RN-1.2]`, `[RN-1.4]` +- The feature list says "any human genotyping array" `[RN-1.2]`, but custom products need a cyto model file from Tech Support. `[DOC-IN]` + +### 2.4 Methylation + +- **In scope, but only as cloud "Methylation QC".** It is **not available in the local CLI** as a methylation pipeline. `[DOC-APPS]` +- Supported arrays: EPIC v1 (B5 manifest), EPIC v2 (`EPIC-8v2-0_A2`), EPIC-Xtra (custom), and MSA (`MSA-48v1-0_20102838_A1`), all GRCh38. +- The local `refcli qc call --array-type methylation` does compute methylation **control-probe** QC metrics, and `qc report` can report them. There is no local beta-value, M-value or detection-p pipeline. [PUBLIC DOCUMENTATION] `[DOC-LOCAL]`, `[DOC-QC]` +- Cloud methylation QC outputs, per sample: + - `{Barcode}_{Pos}_ctrl.tsv.gz` (control probes) + - `{Barcode}_{Pos}_cgs.tsv.gz` (beta values, M-values, detection p-values) +- Cloud methylation QC outputs, per batch: + - `sample_qc_summary.{xlsx,tsv}` + - plots, including a PCA of beta values + - `[DOC-OUT]` + +### 2.5 Instruments + +- IDATs come from iScan. NextSeq550 IDATs are accepted for select arrays. [PUBLIC DOCUMENTATION] `[DOC-IN]` + +--- + +## 3. Workflows and algorithms (what is and isn't disclosed) + +### 3.1 Genotyping (IDAT → GTC → VCF) + +**What the docs state** [PUBLIC DOCUMENTATION]: +- Pipeline: `genotype call` (IDAT + BPM + EGT → GTC v5), then `genotype gtc-to-vcf` (GTC + BPM + CSV manifest + FASTA → per-sample `*.snv.vcf.gz` + `.tbi`). +- `--gencall-cutoff` defaults to **0.15** ("GenCall score cutoff to label a NoCall"). `[DOC-LOCAL]` +- The GTC holds genotypes, GenCall scores, BAF, LRR and sample QC. It is the "Binary proprietary format", parseable with https://github.com/Illumina/BeadArrayFiles. `[DOC-OUT]` +- In the SNV VCF, `FILTER` is always `PASS`. FORMAT fields are `GT:GS:BAF:LRR`. Genotypes are ploidy-adjusted: haploid on Y, MT and non-PAR X in males. `[DOC-OUT]` +- BAF and LRR are oriented REF=A / ALT=B relative to the reference. They may therefore be 1 − the GenomeStudio value. `[DOC-OUT]` +- Multi-allelic / duplicate-site merging: + - Enumerate the candidate genotypes from the queried alleles. + - Filter out genotypes inconsistent with each assay's call, respecting design limits. For example, Infinium II cannot tell A/T or C/G apart. + - Exactly one survivor becomes the call; zero or more than one gives a no-call. + - For merged records, `GS` is the minimum GS across assays. MAV records carry no BAF or LRR. + - `--use-infI-nc-info` (v1.4) treats Infinium I no-calls as "missing signal" rather than "probe failure", which removes alleles. It requires a cluster file with "zeroed-out" MAV assays. + - `[DOC-OUT]`, section "Note on Multi-Allelic Variants" +- Probe IDs in the `ID` field are joined with "," for SNPs and ";" for indels. `[DOC-OUT]` + +**Algorithms not disclosed for the reference product itself:** GenCall normalization and calling. +- The GTC stores per-sample `NormalizationTransform` records: version, offset_x/y, scale_x/y, shear, theta. The public BeadArrayFiles code shows how they are **applied**: subtract offset → rotate by theta → shear → scale → clamp ≥0. It then computes R = x+y and θ = atan2(y,x)·2/π. [PUBLIC DOCUMENTATION] https://github.com/Illumina/BeadArrayFiles/blob/develop/module/GenotypeCalls.py +- How the transform parameters are **fit** is only described qualitatively in the tech notes (see §8). [PUBLIC DOCUMENTATION] + +### 3.2 PGx copy number (targeted) + +**Scope** [PUBLIC DOCUMENTATION] [ref-docs:pharmacogenomics-pgx-reference/pgx-cnv-coverage] +- 7 genes across 10 regions (GRCh38): GSTM1, UGT2B17, CYP2E1, SULT1A1, CYP2A6 (intron.7, exon.1), CYP2D6 (exon.9, intron.2, p5), and GSTT1 (on `22_KI270879v1_alt`). + +**Batch-based calling** [PUBLIC DOCUMENTATION] `[DOC-LOCAL]` +- Needs ≥24 samples, with ≥22 passing LogRDev < 0.2. ≥96 are recommended; about 500 GDA-ePGx samples fit per batch on the reference hardware. +- Error text when too few pass: "{n} sample(s) passed QC. Requires at least {m} samples". `[DOC-OUT]` + +**Model file and training** [PUBLIC DOCUMENTATION] `[DOC-LOCAL]`, `[DOC-IN]` +- Requires a manifest-revision-specific **CN model `.dat`**. +- The model is trainable with `pgx copy-number train`: + - needs ≥96 samples, of which ≥90 pass LogRDev ≤ 0.2; ≥150 are recommended, with diminishing returns beyond 3,000 + - needs `--platform LCG|EX` + - needs a `.msk` mask file next to the BPM, plus the FASTA +- The trainer "is designed with the assumption that the copy number distribution resembles the standard population distributions". +- v1.4 turns an EGT mismatch between GTC and CN model into a hard error. v1.1–1.3 only warned. `[RN-1.4]` + +**Output** [PUBLIC DOCUMENTATION] `[DOC-OUT]` +- `*.cnv.vcf.gz` with `` records, `FORMAT CN:NR`. CN is capped at 5 ("5 or 5+"). NR is the "aggregated normalized intensity". +- QUAL is Phred-scaled, capped at 60. `Q7` filter below 7; `SampleQuality` filter when LogRDev > 0.2. +- Header keys `##OverallPloidy=` and `##GCCorrect=True`, which implies GC correction of intensities. +- Batch files: `cn_batch_summary.csv` (gain/loss/neutral per region) and a CN summary file. + +**Algorithm** [HYPOTHESIS] +- Not disclosed. The developer article gives accuracy only: CYP2D6 CNV "98.3%–99.0%" versus qPCR on 288 samples. +- Likely shape: batch-normalized, GC-corrected, probe-aggregated normalized R (the "NR" field), compared against per-region reference distributions in the `.dat` model (population-trained). Plausibly a Gaussian-mixture or likelihood model over CN states 0–5. + +### 3.3 PGx star alleles + +**Commands and licensing** [PUBLIC DOCUMENTATION] `[DOC-LOCAL]` +- `pgx star-allele call` (VCF folder with `*.snv.vcf.gz` + `*.cnv.vcf.gz`, plus a PGx database `.zip`) → `star_alleles.dat`. +- Then `pgx star-allele annotate --guidelines CPIC|DPWG` → CSV and JSON. +- **Star-allele calling is the only paid, license-server-gated local step.** It is charged per sample through `--license-server-url https://user:pass@[ref-license-server]` (v1.2+), or `[ref-license-server-legacy]` for v1.0/1.1. + +**Data sources** [PUBLIC DOCUMENTATION] [ref-docs:pharmacogenomics-pgx-reference/pgx-allele-definitions-and-pgx-guidelines] +- PharmVar 6.1, PharmGKB snapshot 2024-05-16, UGT nomenclature, legacy CYP nomenclature, CPIC 1.38.0, DPWG June 2023. +- CPIC phenotypes cover 17 genes. Activity scores are given for CYP2C9, CYP2D6 and DPYD. +- Coverage: "2400+ targets for over 50 genes" `[DOC-HOME]`; the product page says "1700+ targets for 50+ genes". + +**Scoring and reporting** [PUBLIC DOCUMENTATION] `[RN-1.0]`, `[DOC-OUT]` +- Quality score is a "negative log likelihood" in v1.0. +- Later, "a probability score … based on the SNV and CNV inputs, input quality, and population frequencies" (0–1), plus a `Raw Score` that excludes population frequency. +- Ranked alternative solutions; hybrid alleles; allele-specific CN. +- Alternatives are shown if their score is ≥50% of the top score. +- No novel alleles are called. + +**PGx database format** [PUBLIC DOCUMENTATION] `[DOC-IN]` +- "each line … a single probe ID mapping to a variant's HGVS tag". The public database zip is named `DAv1.4.0-rc2-pgx-mapping-sha.b164b4aa….zip`. `[DL]` + +**v1.4 CSV outputs** [PUBLIC DOCUMENTATION] `[DOC-OUT]` +- `diplotype_summary.csv` +- `diplotype_annotations.csv` +- `supporting_variants.csv` +- `unresolved_variants.csv` +- `variants_not_covered_on_array.csv` +- plus a per-sample star-allele JSON. Its fields are listed in `[DOC-OUT]`. + +**Algorithm** [HYPOTHESIS] +- Not disclosed. It is described only as "a new and native PGx star allele caller" (developer article). +- Possible approach: a haplotype-pair likelihood search over PharmVar definitions. It would take CN constraints from the CNV VCF and error or missing-data tolerance, and use population-frequency priors, which would explain the "Score" versus "Raw Score" split. +- The v1.x error "The model has been changed since the solution was last computed" is typical of Google OR-Tools / a MIP/CP solver. That suggests an **optimization (ILP/CP-SAT) formulation**. [HYPOTHESIS] + +### 3.4 Cytogenetics CNV/LOH (genome-wide) + +**Commands** [PUBLIC DOCUMENTATION] `[DOC-LOCAL]` +- `cyto call --cn-model cyto_model.dat` (GTC → `*.cnv.vcf.gz` + `cyto.cnv.dat`). +- `cyto annotate --annotation-db CytoAnnotateData_*.zip` (→ per-sample JSON with ISCN 2020 notation, cytobands, RefSeq/Ensembl genes, QC). + +**Model file** [PUBLIC DOCUMENTATION] `[DOC-IN]` +- The cyto model "primarily contains probe GC content information and is tied to the probe sequence/manifest". +- It does **not** need retraining when the EGT changes. + +**Parameters** [PUBLIC DOCUMENTATION] `[DOC-LOCAL]` + +| Event type | Default minimum probes | Default minimum size | +|---|---|---| +| DEL | 10 | 25 kb | +| DUP | 10 | 50 kb | +| LOH | 500 | 3000 kb | +| GAINLOH | 300 | 500 kb | +| mosaic DEL (mdel) | 10 | 25 kb | +| mosaic DUP (mdup) | 10 | 50 kb | +| mosaic LOH (mloh) | 500 | 3000 kb | + +Other parameters: +- `--smoothing 5` (probes on each side) +- `--max-mosaic-fraction 1.0` +- `--min-qual 20` (annotate) +- Minimum probe thresholds below 10 are reset to 10. + +**Behaviours documented** [PUBLIC DOCUMENTATION] `[DOC-LOCAL]`, `[DOC-OUT]`, `[RN-1.2]`…`[RN-1.4]` +- CN up to 4+. +- QUAL = −10·log10(1 − P(called state)), capped at 60; `Q10` filter. +- LogRDev > 0.2 → `SampleQuality` flag. LogRDev > 0.3 → only whole-chromosome events are reported. +- Mosaic events are detected down to about 15% for one-copy mosaic states. `MF` holds the mosaic fraction. +- LOHTYPE ∈ {AOH, CNLOH, GAINLOH}. +- LOH < 500 kb flanked by copy-neutral regions is removed (v1.4). +- Variants must match the expected LRR sign (v1.4). +- Effective size excludes gaps larger than 150× the median probe spacing. +- An unknown sex is resolved by the cyto caller or else assumed male. +- `GT` is hardcoded to `1/1`. + +**Algorithm** [HYPOTHESIS] +- Not disclosed. The outputs (per-state posterior → Phred QUAL; joint LRR+BAF states including LOH, GAINLOH and mosaic fractions; GC correction; smoothing window) are consistent with an **HMM or segmentation + state-likelihood model over LRR and BAF**, in the family of PennCNV / cnvPartition / the reference product "cytogenetics modality". +- cnvPartition is Illumina's older published recursive-partition approach (see §8). + +### 3.5 QC (v1.4) + +[PUBLIC DOCUMENTATION] `[DOC-LOCAL]`, `[DOC-QC]`, `[DOC-OUT]` +- `qc call --array-type genotyping|methylation` → `controls.raw_metrics.csv`, `controls.qc_metrics.csv`. These files are also emitted automatically by `genotype call`. +- `qc report` → `_QC_Report_YYYY_MM_DD.html` (self-contained, interactive) and `_QC_table_YYYY_MM_DD.{xlsx|csv}`. + +### 3.6 Other items + +- **Locus Report / Final Report / Locus Summary.** + - Cloud-only outputs: `gtc_final_report.csv` (GenomeStudio-style) and `locus_summary.csv`, with columns Call_Freq, Het_Excess_Freq, ChiTest_P100, Cluster_Sep, AA/AB/BB θ and R mean/SD, and so on. + - No locus report exists in the local CLI. + - [PUBLIC DOCUMENTATION] `[DOC-OUT]`, `[DOC-APPS]` +- **Cluster file generation.** Not supported; it is done in GenomeStudio 2.0. [PUBLIC DOCUMENTATION] `[DOC-LOCAL]` +- **BedGraph.** `genotype gtc-to-bedgraph` → `*.LRR.bedgraph`, `*.BAF.bedgraph` for IGV. [PUBLIC DOCUMENTATION] `[DOC-LOCAL]`, `[RN-1.2]` + +--- + +## 4. Command-line interface (v1.4, exact) + +Syntax: `refcli [module] [sub-module] [command] [required] [optional]`. Options are case-sensitive. [PUBLIC DOCUMENTATION] `[DOC-LOCAL]` + +The following commands are all [PUBLIC DOCUMENTATION] from `[DOC-LOCAL]`: + +``` +refcli version | help +refcli qc call --array-type {genotyping|methylation} --csv-manifest F (--idat-folder D | --sample-sheet F) [--output-folder] [--debug] [--json-log] +refcli qc report --data D1[,D2..|PARENT] [--config cfg.yaml] [--label L1,..] [--output-folder] [--output-format xlsx|csv] + [--threshold-callRate 0.98] [--threshold-logRdev 0.20] [--debug] [--json-log] +refcli genotype call --bpm-manifest F.bpm --cluster-file F.egt (--idat-folder D | --sample-sheet F) [--gencall-cutoff 0.15] + [--num-threads N] [--output-folder] [--debug] [--json-log] +refcli genotype gtc-to-bedgraph --bpm-manifest F.bpm (--gtc-folder D | --sample-sheet F) [--output-folder] ... +refcli genotype gtc-to-vcf --bpm-manifest F.bpm --csv-manifest F.csv --genome-fasta-file G.fa (--gtc-folder D | --sample-sheet F) + [--auxiliary-loci aux.vcf] [--disable-genome-cache] [--filter-loci list.txt] [--unsquash-duplicates] + [--no-bgzip] [--use-infI-nc-info] [--output-folder] +refcli pgx copy-number call --cn-model M.dat (--gtc-folder D | --sample-sheet F) [--no-bgzip] [--output-folder] +refcli pgx copy-number train --bpm-manifest F.bpm (mask .msk beside it) --genome-fasta-file G.fa --platform {LCG|EX} + (--gtc-folder D | --sample-sheet F) [--disable-genome-cache] [--output-folder] +refcli pgx star-allele call --database pgx.zip --license-server-url URL --vcf-folder D [--query-license-quota] [--output-folder] +refcli pgx star-allele annotate --star-alleles star_alleles.dat [--guidelines CPIC|DPWG] [--output-folder] +refcli cyto call --cn-model cyto_model.dat (--gtc-folder D | --sample-sheet F) [--no-bgzip] [--smoothing 5] + [--min-{del,dup,loh,gainloh,mdel,mdup,mloh}-{probes,size} ...] [--max-mosaic-fraction 1.0] [--output-folder] +refcli cyto annotate --annotation-db CytoAnnotateData.zip --vcf-folder D [--min-* ...] [--min-qual 20] [--output-folder] +``` + +Common flags on every command: `--debug`, `--json-log`, `--help`, `--version`. + +Behaviour notes: +- Output folders are overwritten on re-run. +- A `--idat-folder` is searched recursively. +- Duplicate IDAT pairs per barcode_position are unsupported. + +### 4.1 Inputs + +[PUBLIC DOCUMENTATION] `[DOC-IN]` + +| Input | Extension | Used by | +|---|---|---| +| IDAT (Grn/Red pair per `Barcode_RxxCxx`) | `.idat` | genotype call, qc call | +| BPM manifest | `.bpm` | genotype call/gtc-to-vcf/gtc-to-bedgraph, pgx cn train | +| CSV manifest (with SourceSeq, RefStrand; dbSNP-style 1-based mapping) | `.csv` | gtc-to-vcf, qc call | +| Cluster file | `.egt` | genotype call | +| PGx CN model | `.dat` | pgx copy-number call | +| Cyto model | `.dat` | cyto call | +| Mask | `.msk` (beside the BPM) | pgx copy-number train | +| PGx database | `.zip` | star-allele call | +| Cyto annotation database (RefSeq + Ensembl) | `.zip` | cyto annotate | +| Genome FASTA + `.fai`; contigs "1", not "chr1" | `.fa` | gtc-to-vcf, pgx cn train | +| QC config | `.yaml` / `.yml` | qc report | + +Sample sheet (CSV): +- Keys are `SentrixBarcode_A,SentrixPosition_A`. On cloud they are `beadChipName,sampleSectionName`. +- Optional `[Header]` with `RootFolder` and `[Data]` sections. The format is compatible with GenomeStudio sheets, and `[Manifests]` is ignored. +- Column names are case-insensitive, and reserved names are rejected. +- Values are limited to 500 characters. +- Sample-name precedence: sheet `Sample_Name` > IDAT/GTC metadata > `Barcode_Position`. + +Public product files: GRCh37/GRCh38 FASTA zips, per-product BPM/CSV/EGT, CN/cyto model and database zips, QC YAML templates, and demo IDATs. +- Examples: GDA-ePGx demo data set (iScan), 15.4 GB; GCRA/GSA-PGx `idats_Demo_36.zip`. +- [PUBLIC DOCUMENTATION] `[DL]` +- Note: model and database files are Illumina data files; their licence terms were not reviewed. + +### 4.2 Outputs + +[PUBLIC DOCUMENTATION] `[DOC-OUT]` + +**Per sample** +- `.gtc` (GTC v5) +- `*.snv.vcf.gz` + `.tbi`. Header `##source=refcli 1.4.0`, VCFv4.1. Tabix output is not byte-identical to `bcftools index`. +- `*.LRR.bedgraph`, `*.BAF.bedgraph` +- PGx `*.cnv.vcf.gz` +- cyto `*.cnv.vcf.gz`; header `##source=refcli 1.4.0 Cyto`, `##product=…` +- cyto annotation `*.json` +- star-allele JSON +- methylation (cloud only): `_ctrl.tsv.gz`, `_cgs.tsv.gz` + +**Per batch** +- `gt_sample_summary.csv` and `.json`. Columns: `Sample ID, Sample Name, Sample Folder, Autosomal Call Rate, Call Rate, Log R Ratio Std Dev, Sex Estimate, [TGA_Ctrl_5716 Norm R], `. +- `controls.raw_metrics.csv`, `controls.qc_metrics.csv` +- `_QC_Report_*.html`, `_QC_table_*.xlsx|csv` +- `cn_batch_summary.csv`, CN summary +- `star_alleles.dat` +- the five PGx CSVs (§3.3) +- `cyto.cnv.dat` +- cloud only: `gtc_final_report.csv`, `locus_summary.csv`, `sample_qc_summary.{xlsx,tsv}` + +**Logs** +- Warnings and errors go to the terminal, optionally as JSON (`--json-log`). +- Error strings are catalogued in `[DOC-OUT]`, for example "Skipping intensity only locus", "Failed to combine genotypes due to inconsistencies …", and "Cluster file (…) is not the same as CN Model Cluster file". + +--- + +## 5. QC metrics and thresholds + +### 5.1 Functional per-sample metrics (`gt_sample_summary`) + +[PUBLIC DOCUMENTATION] `[DOC-OUT]`, `[DOC-QC]`, `[DOC-FAQ]` +- Metrics: Autosomal Call Rate, Call Rate, Log R Ratio Std Dev (LogRDev), Sex Estimate (M/F/Unknown), and TGA_Ctrl_5716 Norm R. +- TGA_Ctrl_5716 Norm R is present on PGx products only. It is the normalized R of one probe; a value < 1 means the targeted gene amplification (TGA) failed. +- Failed samples get call rates of 0 and NaN for LogRDev (v1.3+). + +**Documented thresholds** [PUBLIC DOCUMENTATION] + +| Metric / rule | Value | Source | +|---|---|---| +| `qc report` default callRate | 0.98 (PASS if Autosomal Call Rate ≥ threshold) | `[DOC-LOCAL]`, `[DOC-QC]` | +| `qc report` default logRDev | 0.20 (PASS if ≤) | `[DOC-LOCAL]`, `[DOC-QC]` | +| Generic genotyping YAML example logRDev | 0.15 | `[DOC-QC]` | +| PGx CNV: per-sample pass | LogRDev < 0.2 (≤ 0.2 for training) | `[DOC-LOCAL]` | +| PGx CNV: batch minimum | ≥ 22 of ≥ 24 passing | `[DOC-LOCAL]` | +| PGx star-allele: review triggers | LogRDev > 0.2, call rate < 0.99, TGA control < 1.0 | `[DOC-LOCAL]` | +| Cyto: low-quality flag | LogRDev > 0.2 → SampleQuality | `[DOC-LOCAL]` | +| Cyto: whole-chromosome-only mode | LogRDev > 0.3 | `[DOC-LOCAL]` | + +**Not defined in the reference-product docs** +- The exact **Sex Estimate** algorithm. + - [HYPOTHESIS] It likely mirrors GenCall/GenomeStudio "GenderEst" (X heterozygosity plus Y intensity, with an autosomal call-rate gate). A public QC SOP describes GenomeStudio as estimating sex only when autosomal call rate > 0.97: https://khp-informatics.github.io/COPILOT/GenomeStudio_genotyping_SOP.html + - Needs validation against GTC outputs. +- p10 GC / p50 GC ("GC10"/"GC50") and p05/p50/p95 percentiles. + - These are GTC fields (see BeadArrayFiles TOC IDs 1009, 1011, 1014, 1015), but they are not reported in `gt_sample_summary`. [PUBLIC DOCUMENTATION] https://github.com/Illumina/BeadArrayFiles + - "p99 GC" was not found in any reference-product document. +- LogRDev computation details, such as which loci are included and whether outliers are trimmed. The cyto JSON defines it as "Standard deviation of the Log R ratio values for all probes". [PUBLIC DOCUMENTATION] `[DOC-OUT]` + +### 5.2 Control-probe QC metrics (`controls.qc_metrics.csv`) + +[PUBLIC DOCUMENTATION] `[DOC-OUT]` + +Definitions: +- `bkg_grn` = max green intensity of Extension(A|T). +- `bkg_red` = max red intensity of Extension(C|G). +- Offset x = 3000. + +Genotyping metrics: + +| Metric | Formula | +|---|---| +| RestorationQC | Restoration green / (bkg_grn + x) | +| StainingGreenQC | Biotin(High) / Biotin(Bgnd) | +| StainingRedQC | DNP(High) / DNP(Bgnd) | +| ExtensionGreenQC | min Ext(C,G) green / max Ext(A,T) green | +| ExtensionRedQC | min Ext(A,T) red / max Ext(C,G) red | +| Hyb High/Med and Hyb Med/Low | green ratios | +| TargetRemovalIQC | (bkg_grn + x) / TargetRemoval green | +| StringencyQC | String(PM) red / String(MM) red | +| NonSpecificBinding Green / Red | (bkg + x) / max NSB(Bgnd) | +| NonPolymorphic Green / Red | min NP(C,G) / max NP(A,T) green; min NP(A,T) / max NP(C,G) red | + +Methylation adds: +- TargetRemovalII +- Specificity I green/red, Specificity II, Specificity II background +- Bisulfite Conversion I green/red (with background variants), Bisulfite Conversion II (with background variant) +- that is, the 21 BeadArray Controls Reporter metrics. + +Genotyping YAML template example values `[DOC-QC]`: + +| Threshold | Example value | +|---|---| +| staining | 5 | +| extension | 5 | +| targetRemovalI | 5 | +| hyb ratios | 1.25 | +| NP | 5 | +| stringency | 1.5 | +| NSB | 5 | +| tgaControl | 1 | +| restoration | null (1 when the FFPE Restore kit is used) | + +- Chemistry-specific templates: `config_genotyping.yaml`, `config_genotyping_EX.yaml`, `config_methylation_EPIC.yaml`, `config_methylation_MSA.yaml` (downloads on `[DL]`). +- Methylation cloud defaults (EPIC / MSA) are tabulated at [ref-docs:cloud-analysis/methylation-qc]. Includes BgCorrectionOffset 3000 and PvalThreshold 0.05. +- Methylation algorithm [PUBLIC DOCUMENTATION] from tech note M-GL-02644 ([ref-docs:methylation-qc-tech-note-M-GL-02644]): + - **Noob** background correction + - **nonlinear** dye-bias correction + - detection p-values using "Negative controls for null, log transformed signal" + - GenomeStudio, by contrast, uses background subtraction, linear dye bias, and a negative-control null. + +--- + +## 6. Hardware, OS, performance + +[PUBLIC DOCUMENTATION] `[DOC-LOCAL]`, `[DOC-FAQ]`, developer article + +- **CPU only.** "does not require a specialized server or FPGA hardware". The local package is "CPU-based". +- **Recommended machine.** + - 8 cores. + - Memory: **32 GB** in v1.4; 16 GB in v1.0 `[DOC-V10-LOCAL]`. + - ≥30 GB disk; `cyto annotate` needs ≥5 GB free. +- **Operating systems.** Windows 10+ (win10-x64); CentOS 7+ / Ubuntu 20.04+ (linux-x64). + - .NET 9 self-contained, needing native .NET dependencies. + - Should not run as admin. + - No ARM build is listed. [INFERRED] from the runtime IDs listed (win10-x64, linux-x64). +- **Docker.** + - No official Docker image is documented for the reference product. [INFERRED] from its absence in the docs. + - The cloud runs in the vendor cloud platform; container use there is not documented. + - IAAP had a Docker-based "Orchestrated Workflow". [PUBLIC DOCUMENTATION] https://emea.support.illumina.com/downloads/iaap-genotyping-orchestrated-workflow.html +- **Performance claims.** + - "Genotyping VCF in as little as 35 seconds per sample". `[DOC-HOME]` + - "all PGx analysis results in ~1 minute per sample". `[DOC-HOME]` + - Accuracy >99.5%. `[DOC-HOME]` + - PGx CNV >95%. `[DOC-HOME]` + - CYP2D6 call rate >97%. `[DOC-HOME]` The product page says >98%. +- **Threading and scale.** + - `--num-threads` exists on `genotype call`. + - More than 1K samples per sample sheet slows things down (known issue). + - Windows and Linux star-allele results differ slightly: 6 field differences in 1,576 samples, with concordant top solutions. `[RN-1.3]` +- **Network requirement.** + - Internet access is needed for the license check, **only for `pgx star-allele call`**. + - Everything else runs offline. [INFERRED] Only star-allele call is quota-gated per `[DOC-LOCAL]` and `[DOC-APPS]` ("Local: No cost download" for genotyping, CNV and cyto). + +--- + +## 7. Licensing / EULA + +- **Product-specific EULA text** was not found at a public URL. It is presumably shown in the installer or on MyIllumina download. [HYPOTHESIS] Action: obtain it legally and have counsel review it before any benchmarking with the real binary. *(Superseded: the plan does not run, benchmark or inspect the vendor binary; see plan §2.)* +- **Commercial model.** + - Local genotyping, PGx CNV and cyto are a "No cost download". + - Local star-allele calling uses per-sample quota. + - Cloud uses vendor cloud credits, plus a per-sample PGx charge and a vendor cloud-platform subscription. + - [PUBLIC DOCUMENTATION] `[DOC-APPS]`, product page [ref-docs:product-page] +- **Representative vendor EULA language** [PUBLIC DOCUMENTATION] the vendor's sequencing-pipeline v4.3 EULA, [ref-docs:vendor-sequencing-eula-v4.3]. This is the same family and is likely similar for the reference product [HYPOTHESIS]: + > "Licensee may not modify, improve, translate, reverse engineer, decompile, disassemble, or create derivative works of the Software or otherwise attempt to … (b) derive the source code or the underlying ideas, algorithms, structure, or organization form of the Software." + - The same EULA says Licensee may not "publish" the Software; the restriction is on the Software itself, not on results. + - No explicit benchmarking or publication-of-results clause was found in the passages reviewed. [PUBLIC DOCUMENTATION] same PDF. +- **Implications** [INFERRED] + - A clean-room effort should rely only on public docs, public tech notes, open-source Illumina code, and observed input/output formats. + - It must not decompile the .NET assemblies. .NET is easily decompilable, which makes this contractually sensitive. + - Running the licensed binary to generate comparison outputs is probably permitted "internal use", but the "derive … underlying ideas, algorithms" clause is broad. That needs legal review. *(Superseded: the plan does not run, benchmark or inspect the vendor binary; see plan §2.)* +- **Open-source Illumina pieces usable as references** (§9): + - BeadArrayFiles: BSD-2-style licence text in its README. + - GTCtoVCF: Apache-2.0. + +--- + +## 8. Illumina public algorithm documents (URLs verified live, HTTP 200) + +| Document | URL | Relevance | +|---|---|---| +| Illumina GenCall Data Analysis Software (tech spotlight) | https://www.illumina.com/Documents/products/technotes/technote_gencall_data_analysis_software.pdf | Per-array self-normalization (channel intensity, background, dye crosstalk). GenTrain clustering with neural-net estimation of missing clusters. Bayesian calling. GenCall score = GenTrain score × data-to-model fit, penalised by the DNA score. GC10/GC50. Sensitive range 0.2–0.7. | +| Infinium Genotyping Data Analysis (tech note) | https://www.illumina.com/Documents/products/technotes/technote_infinium_genotyping_data_analysis.pdf (alt: https://support.illumina.com/content/dam/illumina-marketing/documents/services/technote_infinium_genotyping_data_analysis.pdf) | Normalization, clustering, QC workflow, and cluster-editing practice. Cited by the reference product docs `[DOC-LOCAL]`. | +| GenTrain 2.0 | https://www.illumina.com/Documents/products/technotes/technote_gentrain2.pdf | Three-step θ/R clustering: preliminary, model proposals, HWE-aware scoring. | +| GenTrain 3.0 (M-GL-01258) | https://www.illumina.com/content/dam/illumina/gcs/assembled-assets/marketing-literature/gentrain-tech-note-m-gl-01258/gentrain-tech-note-m-gl-01258.pdf | Normalization "bins" (Inf I and Inf II separate). A two-parameter model for Inf I bins with < 192 loci, versus six parameters otherwise. Limits the penalty on near-axis homozygous clusters. | +| X-chromosome SNP cluster generation | https://www.illumina.com/documents/products/technotes/technote_x_chromosome_snp_cluster_generation.pdf | Sex-aware clustering. | +| DNA Copy Number Analysis Algorithms (cnvPartition basis) | https://www.illumina.com/documents/products/technotes/technote_cnv_algorithms.pdf | LRR/BAF definitions; recursive-partition CNV. | +| Cytogenetic analysis tech note | https://www.illumina.com/Documents/products/technotes/technote_cytoanalysis.pdf | LRR/BAF cytogenetics. | +| cnvPartition in GenomeStudio (training PDF) | https://support.illumina.com/content/dam/illumina-support/courses/GenomeStudio-cnvPartition/story_content/external_files/GenomeStudio_cnvPartition.pdf | | +| CNV plug-ins for BeadStudio | https://www.illumina.com/content/dam/illumina-marketing/documents/products/technotes/technote_cnv_plug_ins.pdf | | +| Custom cluster file creation for improved copy number analysis (M-GL-02142) | https://www.illumina.com/content/dam/illumina/gcs/assembled-assets/marketing-literature/custom-cluster-file-tech-note-m-gl-02142/custom-cluster-file-tech-note-m-gl-02142.pdf | Cited by the reference product for EGT/CN-model retraining. | +| [product] Methylation QC (M-GL-02644) | [ref-docs:methylation-qc-tech-note-M-GL-02644] | Noob, nonlinear dye bias, detection-p method. | +| iSelect / Infinium I vs II design | https://www.illumina.com/Documents/products/technotes/technote_iselect_design.pdf | Needed for MAV logic. | +| Infinium Controls training guide | https://support.illumina.com/content/dam/illumina-support/courses/eval-inf-controls/story_content/external_files/Infinium_Controls_Training_Guide.pdf | Control-probe semantics. | +| Developer article: [product] 1.0 PGx | [ref-docs:dev-article-1.0-pgx] | Accuracy numbers; CPU-only. | + +- Tech-note summaries in the table are [PUBLIC DOCUMENTATION], extracted from the PDFs with pdftotext. +- **Key gap:** none of these gives equations for the normalization-transform **fitting**, the GenCall data-to-model score, or GenTrain's neural-net cluster imputation. +- Published third-party descriptions and reimplementations of Illumina-like calling exist: gtc2vcf (MIT), which re-implements BAF/LRR from EGT; and the WARP Illumina genotyping pipeline, https://broadinstitute.github.io/warp/docs/Pipelines/Illumina_Genotyping_Arrays_Pipeline/README (it uses iaap-cli). [PUBLIC DOCUMENTATION] + +--- + +## 9. Illumina GitHub repositories relevant to arrays + +The GitHub API was rate-limited (unauthenticated), so repos were checked through their public HTML/raw pages. A complete org listing still needs to be done (`gh api orgs/Illumina/repos --paginate` with a token). + +| Repo | Licence | Relevance | +|---|---|---| +| **Illumina/BeadArrayFiles** — https://github.com/Illumina/BeadArrayFiles | BSD-style (text in README, "Copyright (c) 2020, Illumina") | Python parsers for **GTC (v5 spec: `docs/GTC_File_Format_v5.pdf`)**, **BPM**, **EGT**, and LocusAggregate. `NormalizationTransform.normalize_intensities` and `rect_to_polar` give the exact application of the stored affine normalization. The README recommends the reference product for making GTCs. [PUBLIC DOCUMENTATION] | +| **Illumina/GTCtoVCF** — https://github.com/Illumina/GTCtoVCF | Apache-2.0 | Semi-archived since May 2023 in favour of the reference product. Same option set and merge semantics as `refcli genotype gtc-to-vcf` (§1.4). Includes unit tests (`tests/test_class.py`) on genotype merging. [PUBLIC DOCUMENTATION] | +| Illumina/IlluminaHumanMethylationEPICv2manifest, Illumina/IlluminaHumanMethylationMSAmanifest | not checked | R/Bioconductor-style manifests for EPIC v2 and MSA; useful for methylation QC. [PUBLIC DOCUMENTATION] (the repos exist) | +| Illumina/Cyrius | "Other" licence (not SPDX-identified) | CYP2D6 caller for **WGS**, not arrays. Conceptual reference for CYP2D6 star-allele and CN logic only. | +| Illumina/canvas, Illumina/SMNCopyNumberCaller, Illumina/Gauchian, Illumina/ExpansionHunter, Illumina/hap.py, Illumina/witty.er | "Other" licence (not SPDX-identified) | NGS tools. hap.py and witty.er are useful for benchmarking VCF concordance. | + +Related non-Illumina open source: +- freeseek/gtc2vcf (MIT): IDAT/BPM/EGT/GTC → VCF with BAF/LRR recomputation. https://github.com/freeseek/gtc2vcf + +--- + +## 10. Biggest unknowns and risks for an independent reimplementation + +1. **GenCall internals** (normalization fitting, per-locus calling likelihood, GenCall score formula, DNA-score penalty, sex estimation). + - Only qualitative tech notes are public. + - Reproducing bit-compatible GTC genotypes and GC scores will need empirical calibration against reference outputs. + - The GTC stores the per-sample normalization transform, which helps with verification. +2. **PGx CNV model** (`.dat` format and algorithm) and **cyto model** (`.dat`: "primarily … GC content"). Both formats and both algorithms are undocumented. +3. **Star-allele caller**: scoring function, priors, solver, hybrid-allele handling. The PGx database zip format is only loosely described ("probe ID → HGVS" lines). +4. **Cyto CNV/LOH caller**: the segmentation or HMM approach, the mosaic-fraction estimator, GC correction, and QUAL calibration are all undocumented. +5. **LogRDev, Autosomal Call Rate and Sex Estimate**: the exact locus sets and formulas are not specified. +6. **EULA**: + - The product-specific terms are not public. + - The vendor-family EULA forbids deriving "underlying ideas, algorithms" from the Software. + - Comparison benchmarking should be legally cleared. *(Superseded: the plan does not run, benchmark or inspect the vendor binary; see plan §2.)* + - .NET decompilation must be strictly avoided. +7. **Clearly reproducible from public material**: VCF conversion (GTCtoVCF), GTC/BPM/EGT I/O (BeadArrayFiles), control-probe QC formulas (fully tabulated in `[DOC-OUT]`), methylation Noob/dye-bias/beta/M-value methods (open literature plus the tech note), and output schemas (VCF headers, CSV/JSON fields). diff --git a/docs/research/R2_open_source_ecosystem.md b/docs/research/R2_open_source_ecosystem.md new file mode 100644 index 0000000..b2dfee7 --- /dev/null +++ b/docs/research/R2_open_source_ecosystem.md @@ -0,0 +1,446 @@ +# R2 — Open-source ecosystem for Illumina Infinium genotyping-array analysis + +> **Archived Phase-0 study (sanitized copy, see `README.md`).** Written 2026-09-27, before the decisions in +> `SIMURGARRAY_MASTER_PLAN.md` §2. The analysed vendor product is called "the reference product" and its CLI +> `refcli`; its documentation URLs are replaced by `[ref-docs:…]` tokens. Where this file speaks of a clean room, +> legal clearance, or running/benchmarking the vendor binary, plan §2 supersedes it: personal research; MIT/BSD/Apache +> code may be reused with attribution; GPL tools are subprocess oracles only; vendor binaries are never run for +> comparison, inspected or decompiled; oracles are published vendor-produced GTCs, gtc2vcf and BeadArrayFiles. + +Survey date: 2026-09-27. Scope: projects relevant to building SimurgArray, an independent reimplementation of the reference product +(IDAT → normalization → GenCall → GTC → VCF, BAF/LRR, CNV, sex, contamination, PGx star alleles). + +Local shallow clones used for this report live in `/refs/`: +`BeadArrayFiles`, `GTCtoVCF`, `gtc2vcf`, `mocha`, `illuminaio`, `picard` (sparse: `src/main/java/picard/arrays`), +`PennCNV`, `zCall`, `verifyIDintensity`, `AGCT`. All `file:line` references below point at those clones. +Commit dates are from `git log -1` on the clones, or from the GitHub API (`pushed_at`) where noted. + +--- + +## 0. Key findings (TL;DR) + +1. **freeseek/gtc2vcf `idat2gtc.c` (MIT, C, active: last commit 2026-02-26) is a complete open reimplementation of + Illumina AutoCall/GenCall for an existing cluster file.** It covers IDAT parsing, per-bin affine normalization + (versions 1.1.2 = GenTrain 2.0 and 1.2.0 = GenTrain 3.0), the GenCall Bayesian/fuzzy call and score, gender + estimation, BAF/LRR, LogR dev, GC10/GC50 and writing GTC v3/v5. The author says the output is "equivalent to the + output of the Illumina GenCall algorithm". With `--autocall-date ""` and a `--preset` (1 = AutoConvert 1.6.3.1, + 2 = AutoConvert 2.0.1.179, 3 = IAAP CLI, 4 = ACLI) he says you "should be able to verify that you get + the same md5sum" as patched, deterministic Illumina binaries (README.md:233-244). This is **byte-identical GTC**, + a stronger claim than genotype concordance. It does **not** implement GenTrain *clustering*, so it cannot create + an EGT. + - **Provenance note for clean-room purposes:** the header (idat2gtc.c:27-30, 63-67) says it "reimplements + functionalities and ideas present in AutoConvert (v1.6.3.1), GTCtoVCF, BeadArrayFiles" and cites Illumina's + GenCall C# source code (`NormalizationInfinium.cs`, `GenTrain60.cs`, `Utils.cs`). It says these were "provided + by Illumina without license restrictions". It also deliberately **re-implements Illumina bugs** for bit-exactness + (idat2gtc.c:95-106). It is MIT-licensed, so it is legally reusable with attribution. However, it is effectively a + port of Illumina code. If SimurgArray needs a strict clean room, route it through a spec-writer/implementer split (see §6). *(Not required: plan §2 allows MIT reuse with attribution.)* + - The key patents have expired: US7035740 (normalization) on 2024-05-05 and US7467117 (clustering/genotyping) on + 2024-03-24 (idat2gtc.c:47-51). +2. **Illumina/BeadArrayFiles is NOT Apache-2.0.** The README carries a **BSD-2-Clause ("FreeBSD") license**, + Copyright (c) 2020 Illumina (README.md:84-111). The repo has no LICENSE file, so the GitHub API reports no license. + Last commit 2025-01-30. It is the reference parser for GTC/BPM/EGT and holds the canonical normalization + *application* (`NormalizationTransform.normalize_intensities`). It does not hold the *estimation* of the transform. +3. **Illumina/GTCtoVCF is Apache-2.0 and ARCHIVED** (GitHub `archived: true`). Its README says "Semi-archived … As of May + 2023, it is now recommended to use … [product]". It only supports Python 2.7. It is still useful as an algorithm + reference for indel/reference-allele resolution from manifest source sequences, and for the VCF FORMAT layout + (GT, GS as Phred, BAF, LRR). +4. **broadinstitute/picard `picard.arrays` (MIT, Java, active)** is a second, independent, permissively licensed set of + GTC/BPM/EGT/manifest readers. It also includes `GtcToVcf`, a normalized-intensity computation, the conversion of + cluster (Theta, R) mean/dev to X/Y, and QC metric tools (BafRegress, VerifyIDIntensity, CollectArraysVariantCallingMetrics). + It is used in Broad **WARP**'s production Illumina genotyping pipeline (BSD-3-Clause). +5. **No open-source GenTrain clustering (EGT writer) exists.** Searches found only readers. SimurgArray will have to build + cluster training from the Illumina GenTrain 2/3 technical notes and the patents. +6. **Licensing hazards:** illuminaio (GPL-2), plink2 (GPL-3), GenotypeHarmonizer/systemsgenetics (GPL-3), + verifyIDintensity (GPL-3), argyle (CC BY-NC-SA 4.0), Aldy (non-commercial IU license), Cyrius (PolyForm Strict, + no commercial use), zCall (no license = all rights reserved). Use these only as external executables or + test oracles, never as linked code. + +--- + +## 1. Summary table + +Reuse legend. **DEP** = safe as a linked dependency. **ALG** = algorithm reference. **ORACLE** = run as a test oracle +(black box). **IGN** = ignore. + +| Project | URL | License | Lang | Last activity | What it implements | Faithfulness to Illumina | SimurgArray reuse | License risk | +|---|---|---|---|---|---|---|---|---| +| gtc2vcf / idat2gtc / BAFregress | github.com/freeseek/gtc2vcf | **MIT** (LICENSE; per-file MIT headers) | C (bcftools plugins) | 2026-02-26 (v2026-01-26) | IDAT/BPM/EGT/GTC/CSV parsing; normalization 1.1.2 and 1.2.0; GenCall calling and score; gender; BAF/LRR; GTC writer; GTC→VCF; cluster re-centering; BAFregress contamination | Claims md5-identical GTC vs AutoConvert, AutoConvert 2.0, IAAP-CLI and ACLI when timestamps are disabled | **ALG + ORACLE**; DEP is possible (MIT) | Low legally. Clean-room provenance caveat (port of Illumina C#) | +| mocha | github.com/freeseek/mocha | **MIT** | C | 2025-08-22 | Mosaic chromosomal alteration HMM on BAF/LRR/phase; BAF cluster median adjustment; LRR GC-wave regression | N/A (downstream) | ALG (CNV/mCA module) | Low | +| BeadArrayFiles | github.com/Illumina/BeadArrayFiles | **BSD-2-Clause** (in README; no LICENSE file) | Python 3 | 2025-01-30 | GTC v3-5, BPM v3-5 (locus v4,7,8), EGT v3 (data-block v<5, 6-8, 9) readers; `NormalizationTransform`; LocusAggregate; report examples | Official Illumina | **DEP / ALG / ORACLE** (format spec: docs/GTC_File_Format_v5.pdf) | Low (keep notice) | +| GTCtoVCF | github.com/Illumina/GTCtoVCF | **Apache-2.0** | Python 2.7 | Archived (last code 2024-03-15) | GTC+BPM+CSV+FASTA → VCF; indel ref-allele resolution; GS as Phred; BAF/LRR FORMAT | Official, superseded by the reference product | ALG (VCF conversion, indel logic); ORACLE | Low (NOTICE requirement) | +| Picard `picard.arrays` | github.com/broadinstitute/picard | **MIT** | Java | 2026-07-31 | InfiniumGTCFile, IlluminaBPMFile, InfiniumEGTFile, normalization manifest, GtcToVcf, extended manifest, BafRegress and VerifyIDIntensity metric wrappers, arrays calling metrics, VcfToAdpc | Production use in WARP; reads Illumina-produced GTC (does not call) | ALG + ORACLE; DEP if JVM is acceptable | Low | +| WARP Illumina Genotyping Array | github.com/broadinstitute/warp | BSD-3-Clause | WDL | active 2026-09 | Production pipeline: IAAP-CLI → Picard GtcToVcf → metrics, VerifyIDIntensity, BafRegress, zCall, fingerprinting | Uses Illumina binaries | ALG (pipeline/QC design), output spec | Low | +| bcftools | github.com/samtools/bcftools | MIT/Expat (GPL if built with GSL) | C | 2026-09-21 | Host for gtc2vcf plugins; `+fixref`, `norm`, `+split-vep` | — | DEP (subprocess) or ORACLE | Low if built without GSL | +| illuminaio | github.com/HenrikBengtsson/illuminaio (Bioconductor) | **GPL-2** | R + C (DES) | 2024-05-12 | IDAT reader (non-encrypted binary and **encrypted DES/XML IDATs**), BPM, BGX | Well tested | ALG only (clean re-derivation of encrypted IDAT) | **High** if linked | +| illumina_array_reader | github.com/a-xavier/illumina_array_reader | MIT | Rust | 2023 | IDAT reader (illuminaio port) → polars | — | DEP candidate (Rust) | Low. It is a port of GPL code, so verify provenance | +| IlluminaIdatFiles.jl | github.com/oheil/IlluminaIdatFiles.jl | MIT (per repo) | Julia | — | IDAT reader | — | IGN / ALG | Low | +| methylprep / methylcheck | github.com/FoxoTech/methylprep | MIT | Python | 2023-08 (stale) | IDAT parsing (methylation), NOOB, QC | Methylation only | ALG (IDAT parsing) | Low | +| mepylome | github.com/brj0/mepylome | MIT | Python/C++ | 2025 | Fast IDAT parsing (methylation), CNV from methylation arrays | — | ALG | Low | +| minfi | bioconductor/hansenlab/minfi | Artistic-2.0 | R | 2024-04 | Methylation arrays | — | IGN | Medium | +| sesame | github.com/zwdzwd/sesame | MIT + file | R | 2026-09-23 | Methylation arrays, pOOBAH, IDAT via own reader | — | IGN (methylation) | Low | +| crlmm | Bioconductor | Artistic-2.0 | R/C | Bioc release | CRLMM genotype calling for Illumina/Affy; CNV | Alternative caller; published concordance vs GenCall (Ritchie 2011) | ALG (alt. caller) | Medium | +| argyle | github.com/andrewparkermorgan/argyle | **CC BY-NC-SA 4.0** | R | 2018-03 (dormant) | Mouse MUGA arrays; reads GenomeStudio FinalReport; QC; BAF/LRR | — | IGN / ALG | **High** (non-commercial) | +| zCall | github.com/jigold/zCall | **none** (all rights reserved) | Python | 2015-02 | Rare-variant re-caller using z-score thresholds on normalized X/Y after GenCall | Post-GenCall rescue | ALG (idea only) | **High** (no license) | +| optiCall | opticall.bitbucket.io (Sanger) | Sanger terms (not OSI; binary + source on request) | C++ | ~2012 | Rare/common-variant caller using Illumina-normalized intensities | Alt. caller | ALG (paper only) | High | +| Illuminus | github.com/wtsi-npg/Illuminus | unclear/none in repo | C | stale | Mixture-model caller (Teo 2007). Paper documents Illumina normalization (400 homozygotes) | Alt. caller | ALG (paper) | High (unclear) | +| GenoSNP | Oxford Univ Innovation licence | Academic licence | C | stale | Within-sample VB caller | Alt. caller | IGN | High | +| PennCNV | github.com/WGLab/PennCNV | **Unlicense (public domain)** (UNLICENSE file) | Perl + C (kext HMM) | 2024-05-19 | CNV HMM on LRR/BAF with PFB and GC model; `split_illumina_report.pl`, `compile_pfb.pl`, `cal_gc_snp.pl` | De-facto standard for array CNV | **DEP / ALG** (HMM, PFB, GC-wave model) | **None** | +| QuantiSNP | (Oxford, binary) | Academic binary licence | MATLAB runtime | stale | OHMM CNV | — | IGN | High | +| iPattern | (Broad/Harvard) | Academic licence | R/Perl | stale | Intensity-pattern CNV | — | IGN | High | +| EnsembleCNV | github.com/HaoKeLab/ensembleCNV | none visible | R/Perl | ~2019-2021 | Meta-caller over PennCNV/QuantiSNP/iPattern; CNVR genotyping | — | ALG (ensemble idea) | High (no license) | +| GADA | Bioconductor/CRAN "gada" | GPL | R/C | stale | Sparse Bayesian segmentation of LRR | — | ALG | High if linked | +| ASCAT | github.com/VanLoo-lab/ascat | GPL-3 (per repo) | R | 2026-02 | Allele-specific CN for tumours from BAF/LRR | — | ALG | High if linked | +| plink2 | github.com/chrchang/plink-ng | **GPL-3** (2.0/COPYING) | C++ | 2026-09-27 | Genotype QC, sex check, relatedness (KING-robust), PCA | — | ORACLE (subprocess) | **High** if linked | +| bcftools +fixref | samtools/bcftools | MIT | C | active | Strand/REF fixing vs reference | — | DEP / ORACLE | Low | +| snpflip | github.com/biocore-ntnu/snpflip | MIT per PyPI (no LICENSE in repo) | Python | Archived 2019 | Detect reverse/ambiguous-strand SNPs | — | IGN / ALG | Low-Med | +| Will Rayner strand files | chg.ox.ac.uk/~wrayner/strand/ | Data, no explicit licence | data + Perl | maintained | Per-chip strand/build files (TOP/source strand → + strand) | Community standard | ORACLE (strand truth) | Medium (data terms unclear) | +| GenotypeHarmonizer | molgenis/systemsgenetics | **GPL-3** | Java | 2026-03 | Strand alignment via LD with reference | — | ORACLE | High if linked | +| conform-gt | faculty.washington.edu/browning | Apache-2.0 (reported) | Java | stale | Conform VCF to reference panel (strand/allele) | — | ORACLE | Low | +| AGCT | github.com/molgenis/AGCT | (none visible) | shell | — | IDAT→GTC pipeline using IAAP | — | IGN | — | +| peddy | github.com/brentp/peddy | MIT | Python | 2026-02 | Pedigree/sex/ancestry QC from VCF | — | DEP/ALG | Low | +| somalier | github.com/brentp/somalier | MIT | Nim | 2026-09-25 | Relatedness/sample swap from sites, works on array VCF | — | DEP/ALG | Low | +| KING | kingrelatedness.com | Binary, free download; source by request | C++ | — | Kinship | — | ORACLE | Medium | +| akt | github.com/Illumina/akt | GPL-3 (per repo) | C++ | stale | Ancestry and kinship tools | — | ORACLE | High if linked | +| verifyIDintensity | github.com/gjun/verifyIDintensity | **GPL-3** | C++ | 2015-05 | Contamination from array intensities (Jun 2012) | Paper method | ALG (re-derive); ORACLE | High if linked | +| BAFregress | inside gtc2vcf (`BAFregress.c`) | MIT | C | 2025-08 | Contamination via BAF regression on hom-calls (Jun 2012) | Same model as original | **DEP/ALG** | Low | +| PharmCAT | github.com/PharmGKB/PharmCAT | **MPL-2.0** | Java | 2026-09-25 | Star-allele matcher from VCF (array or WGS), CPIC phenotypes | Benchmarked on GSA/PGx arrays | ORACLE / DEP (file-level copyleft only) | Medium (MPL is file-level) | +| PyPGx (Stargazer successor) | github.com/sbslee/pypgx | MIT | Python | 2026-08 | Star alleles from NGS **and chip VCFs** (supports array input) | Benchmarked on GSA | ALG / ORACLE | Low | +| Stargazer | stargazer.gs.washington.edu | Academic, non-commercial | Python | legacy | Star alleles (NGS) | — | IGN | High | +| Aldy | github.com/0xTCG/aldy | **IU non-commercial licence** | Python/C | 2026-04 | Star alleles (NGS; VCF input) | — | IGN / ORACLE only | **High** | +| Cyrius | github.com/Illumina/Cyrius | **PolyForm Strict 1.0.0** | Python | 2023-10 | CYP2D6 from WGS | — | IGN | **High** | +| BeadArrayPython3 | github.com/dbrami/BeadArrayPython3 | (fork of BSD-2) | Python | — | Py3 port of BeadArrayFiles | — | IGN (upstream is Py3 now) | Low | + +"Parses [product] outputs / 'refcli'": no public GitHub repo was found that parses reference-product-specific outputs +(the CNV VCF, PGx JSON/TSV, or `refcli` CLI logs). The reference product's GTC is v5, and Illumina's docs point to +BeadArrayFiles for parsing it. The SNV VCF FORMAT fields (GT, GS, BAF, LRR) are compatible with what +gtc2vcf/GTCtoVCF/Picard emit. So these three are the closest analogues for output-schema compatibility tests. + +--- + +## 2. BeadArrayFiles (Illumina) — formats and normalization application + +**License (corrected):** BSD-2-Clause text in `BeadArrayFiles/README.md:84-111` ("Copyright (c) 2020, Illumina … FreeBSD +Project"). It is **not** Apache-2.0. Apache-2.0 applies to GTCtoVCF (`GTCtoVCF/LICENSE`). + +### 2.1 NormalizationTransform (GenotypeCalls.py:625-698) +- Binary layout, 52 bytes per transform (`read_normalization_transform`, :641-652): `int32 version`, then + `float32 offset_x, offset_y, scale_x, scale_y, shear, theta` (:637-639). The remaining 6 floats are reserved. + In gtc2vcf they are `cvx, cvy, nn12, rr12, taa, tbb` (idat2gtc.c:902-916). +- `normalize_intensities(x, y, threshold=True)` (GenotypeCalls.py:668-698): + ``` + if x <= 0 and y <= 0: return (nan, nan) + tx = x - offset_x ; ty = y - offset_y # translate + tx2 = cos(theta)*tx + sin(theta)*ty # rotate by -theta + ty2 = -sin(theta)*tx + cos(theta)*ty + tx3 = tx2 - shear*ty2 # shear (x only) + xn = tx3/scale_x ; yn = ty2/scale_y # scale + if threshold: xn = max(xn,0); yn = max(yn,0) # clamp at 0 + ``` +- `rect_to_polar(x, y)` (:654-666): `R = x + y`, `theta = atan2(y, x) * 2/pi`. It returns `(nan, nan)` if `x == y == 0`. +- `get_normalized_intensities(normalization_lookups)` (:570-582) applies transform `lookups[i]` per locus. + +### 2.2 Normalization-bin lookup (BeadPoolManifest.py:90-130) +- A per-locus `normalization_id` byte is read (it must be < 100, :91-94). Then + `norm_id += 100 * assay_type` and `norm_id %= 256` (:118-124). The mod is commented "To mimic the byte-wrapping + behavior from GenomeStudio, AutoCall, IAAP". This affects Omni5 (see GTCtoVCF changelog 1.2.1). +- Transform index = rank of `norm_id` among the sorted set of distinct ids (:125-130). The GTC stores transforms in + that order. +- `assay_type`: 0 = Infinium II, 1 = Infinium I A/T (red), 2 = Infinium I G/C (green). gtc2vcf infers it from probe and + source sequences (idat2gtc.c:1242-1272). + +### 2.3 EGT reader (ClusterFile.py:83-240) +- Header: `int version (must be 3)`, strings `gencall_version, cluster_version, call_version, normalization_version, + date_created`, a byte `is_wgt (must be 1)`, string `manifest_name`, `int data_block_version`, string `opa`, + `int num_records` (:95-120). +- Per record (:185-240): `int N[AA,AB,BB]`; `float r_dev[3]`; `float r_mean[3]`; `float theta_dev[3]`; + `float theta_mean[3]`. Then, by data-block version: v9 = `intensity_threshold` + 14 unused floats; v6-8 = 15 unused; + v<5 = 2 unused. +- Then ClusterScore per record (`cluster_separation, total_score (=GenTrain score), original_score, edited`), + genotype strings, loci names, addresses, and cluster counts (asserted equal to N) (:122-146). + +### 2.4 GTC reader +- TOC IDs are listed in idat2gtc.c:862-892 (NUM_SNPS=1 … RAW_X=1000, RAW_Y=1001, GENOTYPES=1002, BASE_CALLS=1003, + GENOTYPE_SCORES=1004, SCANNER_DATA=1005, CALL_RATE=1006, GENDER=1007, LOGR_DEV=1008, GC10=1009, DX=1010, + SAMPLE_DATA=1011, B_ALLELE_FREQS=1012, LOGR_RATIOS=1013, PERCENTILES_X/Y=1014/1015, SLIDE_IDENTIFIER=1016). +- The authoritative spec is `BeadArrayFiles/docs/GTC_File_Format_v5.pdf`. +- `code2genotype` covers polyploid codes up to octoploid (GenotypeCalls.py:9-57). + +--- + +## 3. gtc2vcf / idat2gtc (freeseek) — deep dive + +**License confirmed MIT** (`gtc2vcf/LICENSE`: "Copyright (C) 2018-2025 Giulio Genovese"; per-file MIT header at +idat2gtc.c:1-25; `nearest_neighbor.c` also MIT). Version string `IDAT2GTC_VERSION "2026-01-26"` (idat2gtc.c:243). + +### 3.1 What it says it matches (idat2gtc.c:32-106) +- It replaces AutoConvert 1.6.3.1, AutoConvert 2.0.1.179, IAAP CLI 1.1 and ACLI 2.1. +- **GenTrain 2.0** = Normalization 1.1.2 + Clustering 6.3.1 + Genotyping 6.3.0. + **GenTrain 3.0** = Normalization 1.2.0 + Clustering 7.0.0 + Genotyping 7.0.0 (:53-61). +- Illumina class names cited: `Normalization10(_Dragonfish)`, `Normalization111(_Dragonfish)`, `NormalizationDragonfish`, + `GenTrain62`, `AutoCallPollerThread`. "Dragonfish" is the Illumina code name for the 1.2.0 normalization. +- Differences 1.1.2 → 1.2.0 (:76-81): + - updated MATLAB `madsigma`; + - HandleScale no longer uses missing loci for bins < 192; + - new single-channel Infinium-I normalization for bins < 192 loci. +- Gender logic differs per Illumina tool (:83-93). +- Deliberately reproduced Illumina bugs (:95-106): + - `robustfit0` adjfactor is always ≈ 100; + - normalization-id overflow past 255; + - zero-valued missing probes are still used in normalization; + - `trimmean` runs on artificially zeroed values; + - GenTrain 2.0 counts failed loci as AA in small bins. +- Presets (idat2gtc.c:4086-4125): 1 = AutoConvert (GT2, GTC v3, gender v1); 2 = AutoConvert 2.0 (GT3, GTC v5, + gender v2 with autosomal CR threshold 0.97); 3 = IAAP (GT3); 4 = ACLI (default). +- Defaults: GenCall cutoff 0.15 (:3997); gender `min_loci=100, max_loci=10000, min_x_loci=20, min_y_loci=20, + call_rate_threshold=0.0 (changed from 0.97), y_threshold=0.3, x_threshold=0.9, x_het_rate_threshold=0.1` + (:4007-4014). +- Concordance claim (README.md:233, 236-244, 428): the output is "equivalent to the output of the Illumina GenCall + algorithm". It gives "same md5sum" with deterministic patched binaries. AutoConvert 2.0, IAAP-CLI and ACLI + (normalization 1.2.0) "seem to produce the exact same results". AutoConvert (1.1.2) gives "somewhat different + results". No numeric genotype-concordance table is published, because the claim is bit-exactness. + **The reference product is not mentioned anywhere in the source.** Whether the reference product's GTC equals ACLI's + is an open question for SimurgArray to test. + +### 3.2 IDAT → raw X/Y (fill_array, idat2gtc.c:3711-3745) +- Infinium II (assay 0): **X = Red mean at address_a, Y = Grn mean at address_a**. +- Infinium I A/T (assay 1): X = Red[address_a], Y = Red[address_b]. +- Infinium I G/C (assay 2): X = Grn[address_a], Y = Grn[address_b]. +- A locus is used only if **nbeads ≥ 2** in both channels or probes. Otherwise raw = 0 (missing). +- The IDAT "mean" is already a bead-level trimmed mean computed by the scanner. `trimmed_mean` points at `mean` + (:578, :635), so no bead-level summarization is needed. + +### 3.3 Normalization estimation, per bin (normalize, :2890-2945) +Loci are grouped by `norm_id` (sorted). A bin with < 10 loci is an error (:2923). +- If GenTrain 3 **and** `norm_id ≥ 100` (Infinium I) **and** bin size < 192 → `normalize_single_bin_single_channel` + (:2927-2928). +- Otherwise → `normalize_single_bin` (:2766-2782). Constants: `SAMPLING=400` (:2352), `ROBUST_THRESHOLD=192` + (:2353-2354). + +`normalize_single_bin` runs these steps in order: +1. **remove_outliers** (:2365-2427, only if n ≥ 400). Compute cutoffs for x, y and t = y/(x+y). Low cutoff = + min(5th smallest, 1st percentile). High cutoff = max(5th largest, 99th percentile). Drop points with any value + ≤ low or ≥ high. +2. **remove_offset** (:2436-2502; if n < 192, offset = 0): + - Shift x and y by their minima. + - x-sweep: 400 points `linspace(0, max x)` on the x-axis. Take the closest data point to each → candidate AA. + Do a y-sweep the same way → candidate BB. Keep unique points. + - Fit robust lines (bisquare, tuning 4.685, with intercept): `y = baa + maa·x` on AA and `x = bbb + mbb·y` on BB + (`matlab_robustfit1`). + - Intersection: `ox = (bbb + mbb·baa)/(1 − mbb·maa)`, `oy = baa + maa·ox`. Then `offset = (ox + min x, oy + min y)` + and subtract it (:2482-2491). +3. **get_nn12_rr12** (:2730-2764): QC fraction of points below 20% of the 95th percentile in both channels, and their + relative R. These are stored in the XForm only. +4. **handle_rotation** (:2509-2559; if n < 192, theta = 0): + - Do a new x-sweep on the offset-corrected data and union it with the prior AA set. + - Fit a through-origin robust line on AA (`robustfit0`), slope m. + - `theta = atan(m)`. Rotate: `x' = cos·x + sin·y`, `y' = −sin·x + cos·y`. +5. **handle_shear** (:2565-2600; if n < 192, shear = 0): do a y-sweep, union with BB, fit `x = m·y` through the + origin, then `shear = tan(atan(m)) = m` and `x -= shear·y`. +6. **handle_scale** (:2683-2724), if n ≥ 192: + - AA = points with `x > 5y` and `x > 0.1·P99(x)`. BB is defined symmetrically. + - `scale_x = trimmean50(x_AA)` and `scale_y = trimmean50(y_BB)`. + - Bins < 192 fall back to `base_handle_scale` (:2606-2676): AA = θ° < 10, BB = θ° > 80, + `scale = trimmean20`. That function's ≥192 branch uses `0.5·trimmean50 + 0.7413·IQR`. +7. Stored diagnostics: `taa = theta·180/π` and `tbb = (atan(shear) − theta)·180/π` (:2780-2781). + +`normalize_single_bin_single_channel` (GT3 Infinium I, < 192 loci) is a two-parameter model (:2849-2887): +- Mirror so x ≥ y. +- `ythrsh = P2(y)`. Subtract it from both channels. +- Convert to polar. AA = t < 0.1. +- `ymean = trimmean20(y_AA) − 50`. +- `rmean = trimmean20(r, with NaNs compacted and padded with zeros — bug replicated) − 2·ymean`. +- Result: `offset_x = offset_y = ythrsh + ymean`, `theta = shear = 0`, `scale_x = scale_y = rmean`. + +Supporting numerics (bit-exactness depends on these): +- `percentile()` is Illumina's own interpolation, not numpy's default (:2206-2227). +- `trimmean` uses percentile bounds (:2240-2254). +- `madsigma_old` vs `madsigma_new` (:1861-1904). +- `robustfit0` with constant adjfactor ≈ 100 (:1906-1942). +- `closest_points`: brute force below 2000 points, else Illumina's binned `findClosestSitesToPointsAlongAxis` + (:2012-2197; also `nearest_neighbor.c`). The binned search can return different neighbours than an exact NN. + It must be replicated for exactness. + +### 3.4 Application of the transform and polar coordinates (:2990-3016) +``` +tx=raw_x-offset_x; ty=raw_y-offset_y +tx2=cosθ·tx+sinθ·ty; ty2=-sinθ·tx+cosθ·ty; tx3=tx2-shear·ty2 +norm_x = tx3<0 ? 0 : tx3/scale_x ; norm_y = ty2<0 ? 0 : ty2/scale_y +Theta = atan2(norm_y,norm_x)·2/π (NaN if both 0) +R = |norm_x|+|norm_y| (FLT_MIN·FLT_EPSILON if both <0) +``` +This is the same math as BeadArrayFiles. Note that cos θ and sin θ are precomputed in **float** (:3818-3822). +Picard computes Theta with `atan(y/x)` instead (InfiniumGTCFile.java:193) and its transform in double +(:254-270). Tiny floating-point differences are therefore expected between implementations. + +### 3.5 GenCall calling and score (make_calls, :3337-3405; compute_score_call_prelim, :3162-3292) +- r_dev is floored at 0.1 before calling (:3368-3375). +- If `R < intensity_threshold` (EGT v9 field), the result is no-call with NaN score (:3163-3166). +- **gen_std_flair** (:3022-3074) inflates or deflates the cluster SDs: + - z1 = ½(θAB−θAA)/(σAB+σAA), z2 = ½(θBB−θAB)/(σBB+σAB), mz = min(z1, z2). + - η = max(mz/3, 1)·min(mz/3, 1). All θ-SDs are multiplied by η and floored at 0.02. + - r_dev is floored at max(0.2, median of the θ-SDs, r_mean/7). +- **modilik** (:3077-3159): pick the two nearest clusters by `100·|Δθ| + |ΔR|`. Use half-flat ("vleft/vright") normal + pdfs in θ and R, depending on cluster ordering. Otherwise use a full normal pdf product. +- Priors `P_k = (N_k/N + 1)/4`. Posteriors are normalized. The call is the arg-max (:3190-3213). +- Score components: + - `score_ap = smf(log10(max/second), 0, 2)`; + - `score_r1 = smf(R, 0, 0.1)`; + - per-cluster `score_t` (zmf/smf at 2σ..6σ of θ); + - `score_r2 = smf(R, 0, r_mean/10)`; + - `score_r3 = smf(R, r_mean−6σ, r_mean−2σ)`; + - `score_r4 = zmf(R, r_mean+6σ, r_mean+12σ)`; + - `score_misclust` = 0.7 (one cluster, not AB), 0.95 (two clusters) or 1. +- `prelim = score_ap · GenTrainScore(total_score) · score_t · score_r · score_misclust` (:3286-3287). +- **Final score** `GC = prelim^0.35 · gbellmf(prelim; a=0.504, b=1.71, c=1.08)` (:3294-3302). A NaN score becomes 0. + A score below the cutoff (0.15) becomes a no-call. `intensity_only` loci are always no-call. +- Call rate = calls/(num_snps − intensity_only) (:3403-3404). +- There is **no DNA-score penalization** in this implementation, despite the 2004 tech-note text quoted at :3149-3151. + +### 3.6 Gender (estimate_gender, :3416-3482) +Only loci with a non-zero GenTrain score count. +- **v1:** if more than 20 X loci are called, female if X het rate > 0.1, else male. +- **v2:** requires autosomal call rate > threshold. Then the result is M if median R(Y) > 0.3; otherwise F if there are + fewer than 20 X loci; otherwise F if median R(X) > 0.9, else U. + +### 3.7 BAF and LRR (get_baf_lrr, :3489-3507; calculate_baf_lrr, :3511-3548) +Following Peiffer 2006: +``` +if θ == θAB: BAF=0.5, Rexp=R_AB +if θ < θAB: BAF = 0.5·(θ-θAA)/(θAB-θAA); Rexp = R_AA + (θ-θAA)(R_AA-R_AB)/(θAA-θAB) +if θ > θAB: BAF = 0.5 + 0.5·(θ-θAB)/(θBB-θAB); Rexp = R_AB + (θ-θAB)(R_BB-R_AB)/(θBB-θAB) +LRR = log2(R / Rexp) (for intensity-only loci Rexp = cluster r_mean; R==0 → −FLT_MAX) +BAF clamped to [0,1] +``` +- **LogRDev** = SD of LRR over autosomal, non-intensity-only, finite loci (:3533-3547). +- GC10/GC50 = 10th and 50th percentile of GenCall scores above the cutoff (:3592-3604). +- Intensity percentiles 5/50/95 of raw X and Y (:3552-3570). +- gtc2vcf's `--adjust-clusters` (gtc2vcf.c:2008-2046) recenters the (θ, R) cluster means using the batch genotypes, with + a shrinkage prior of weight 0.2 toward the EGT means. It gives less noisy LRR/BAF for large batches, similar in + spirit to reclustering. + +### 3.8 BAFregress (`gtc2vcf/BAFregress.c`, MIT) +It reimplements Jun et al. 2012 BAF regression on homozygous calls against population allele frequency, to estimate +contamination. Picard also wraps its output (`CreateBafRegressMetricsFile.java`). + +--- + +## 4. Other projects — notes + +- **GTCtoVCF (Apache-2.0, archived).** + - GenCall score in VCF is Phred: `round(-10·log10(min(1, max(1e-5, 1 − GS))))` (GencallFormat.py:62). + - Groups manifest records by position to "squash" duplicates. Resolves indel REF/ALT by aligning the source-sequence + flanks to the reference FASTA (`LocusEntryFactory.py`, `BPMRecord.py`). + - Changelog 1.2.1 added the norm-id byte-wrap fix for Omni5. +- **Picard `picard.arrays` (MIT).** + - `InfiniumGTCFile` computes normalized X/Y and Theta (atan-based) (:188-270). + - `GtcToVcf.polarToEuclidean` (:434-470) converts EGT (θ, R) mean and dev into X/Y mean and dev with delta-method + variances. This is useful if SimurgArray must emit cluster X/Y in the VCF header or INFO, as the reference product and Picard do. + - `CompareGtcFiles` is a ready-made GTC diff harness idea. + - `BpmToNormalizationManifestCsv` exports norm ids. + - `CollectArraysVariantCallingMetrics` gives array QC metrics used by WARP. +- **mocha (MIT).** Post-hoc BAF adjustment by cluster medians (`adjust[3][3]`, mocha.c:120). LRR GC regression + `adjust_lrr` (:384). Median LRR per chromosome, and an HMM for mosaic CNAs. It is a good algorithm reference for a + reference-product-like CNV module. +- **PennCNV (Unlicense — public domain).** + - `detect_cnv.pl` plus `kext/khmm.c`: a 6-state HMM on LRR and BAF with population B-allele frequency (PFB) and GC + wave adjustment (`cal_gc_snp.pl`, `genomic_wave.pl`). + - `split_illumina_report.pl` shows the expected GenomeStudio columns ("Log R Ratio", "B Allele Freq"). + - It is the safest CNV code to reuse directly and a natural oracle for CNV calls. +- **illuminaio (GPL-2).** + - `R/readIDAT_nonenc.R` handles the binary IDAT v3 format. + - `R/readIDAT_enc.R` with `src/des.c` decrypts legacy encrypted XML IDATs (DES). + - Do not link it. SimurgArray must re-derive encrypted-IDAT support clean if needed. Most Infinium genotyping IDATs are + non-encrypted v3. gtc2vcf's own IDAT reader (MIT, idat2gtc.c:434-760) is the permissive reference. +- **zCall** has no licence, so treat it as all rights reserved; the idea is described in Goldstein 2012. **optiCall, + Illuminus, GenoSNP, CRLMM, M3, iCall** are alternative callers; use them only as literature on the normalization. + Teo 2007 and 2011 document the 400-homozygote sweep. +- **verifyIDintensity (GPL-3):** a mixture-model contamination estimate from normalized intensities. Re-derive it from + Jun et al. 2012 or run it as an external oracle. Broad WARP runs it in production. +- **PGx.** + - The reference product does star-allele calling from its SNV VCF (plus CNV for CYP2D6). + - Open options for array VCFs: **PharmCAT** (MPL-2.0; file-level copyleft only, so it can be used as an unmodified + dependency or subprocess) and **PyPGx** (MIT; explicitly supports chip data). Both are benchmarked on GSA arrays + (Clin Pharmacol Ther 2025 benchmark). + - Aldy (IU non-commercial) and Cyrius (PolyForm Strict, WGS-only) are unusable for a product. Stargazer is legacy and + non-commercial. +- **Strand / harmonization.** + - bcftools `+fixref` (MIT) is the default choice. + - Rayner strand files are a data oracle for TOP/source→plus-strand checks. + - GenotypeHarmonizer (GPL-3) and plink2 (GPL-3) should be used as subprocesses only. + - conform-gt is Apache-2.0 per packagers. +- **Sample QC.** somalier and peddy (MIT) for relatedness, sex and ancestry from VCF. KING and plink2 as oracles. + +--- + +## 5. Reuse recommendations for SimurgArray + +| SimurgArray component | Primary reference | Oracle | Direct dependency OK? | +|---|---|---|---| +| IDAT v3 parser | gtc2vcf idat reader (MIT); BeadArrayFiles (BSD-2) | illuminaio (run in R), gtc2vcf `--idat` CSV dump | Yes (MIT/BSD) | +| BPM / EGT / GTC readers | BeadArrayFiles, Picard, gtc2vcf | BeadArrayFiles | Yes | +| GTC v5 writer | gtc2vcf `gtc_write` (:1001-1152) + GTC_File_Format_v5.pdf | Round-trip via BeadArrayFiles; md5 vs ACLI / the reference product | Yes | +| Normalization 1.2.0 | Patent US7035740 (expired), Illumina 2006 normalization note, GenTrain 3.0 tech note; gtc2vcf for bug-compatibility | Compare the 13-float XForm per bin with the reference product's GTC `NORMALIZATION_TRANSFORMS` (TOC 400) | Algorithm yes; copying code is OK under MIT with notice | +| GenCall scoring | Kermani patents, Shen 2005; gtc2vcf | Reference-product GTC GENOTYPE_SCORES (1004) | same | +| GenTrain clustering (EGT creation) | **No OSS exists.** Use the GenTrain 2.0/3.0 tech notes and US7467117 | GenomeStudio (the reference product does not cluster) | Must be built | +| BAF/LRR/LogRDev | Peiffer 2006; gtc2vcf | GTC 1012/1013/1008 | Yes | +| Gender | gtc2vcf v2 logic | GTC 1007 | Yes | +| GTC→VCF | GTCtoVCF (Apache), Picard GtcToVcf (MIT), gtc2vcf | Reference-product SNV VCF | Yes | +| CNV | PennCNV (public domain), mocha (MIT) | PennCNV run; reference-product CNV VCF | Yes | +| Contamination | BAFregress (MIT) | verifyIDintensity (GPL, subprocess) | BAFregress yes | +| PGx star alleles | PharmCAT (MPL-2.0), PyPGx (MIT) | reference-product PGx output | PharmCAT as unmodified dep; PyPGx yes | + +### 5.1 License-compatibility summary +- **Permissive, safe to vendor with notices:** MIT (gtc2vcf, mocha, Picard, PyPGx, somalier, peddy, methylprep, sesame, + illumina_array_reader), BSD-2 (BeadArrayFiles), BSD-3 (WARP), Apache-2.0 (GTCtoVCF; keep NOTICE), + Unlicense (PennCNV). +- **Weak copyleft:** MPL-2.0 (PharmCAT). Modified PharmCAT files must stay open; linking or bundling otherwise is OK. + Artistic-2.0 (crlmm, minfi). +- **Strong copyleft (subprocess/oracle only):** GPL-2 illuminaio; GPL-3 plink2, verifyIDintensity, GenotypeHarmonizer, + akt, ASCAT; GADA (GPL). +- **Non-commercial or proprietary (avoid):** argyle (CC BY-NC-SA), Aldy (IU), Cyrius (PolyForm Strict), Stargazer, + QuantiSNP, iPattern, GenoSNP, optiCall (Sanger terms), zCall (no licence), EnsembleCNV (no licence visible). + +--- + +## 6. Clean-room caveat and suggested process + +> **Superseded (plan §2):** SimurgArray may reuse MIT/BSD/Apache code with attribution, so no strict clean room is +> required, and black-box runs of the vendor binary are not part of the plan. The oracles are published +> vendor-produced GTCs (1000G Broad Omni2.5 set), gtc2vcf and BeadArrayFiles. Kept for context. + +Illumina's normalization and GenCall algorithms are described in the expired patents (US7035740, US7467117) and in +public tech notes. The *bit-exact details* (percentile interpolation, the robustfit adjfactor bug, the binned +closest-point search, the ≥ 2 beads rule, norm-id byte wrap, FLT_MIN·FLT_EPSILON sentinels) are known mainly through +gtc2vcf. gtc2vcf in turn states that it ports Illumina's GenCall C# source and AutoConvert behaviour. + +MIT permits reuse, so there is no copyright barrier to reading gtc2vcf. If SimurgArray nonetheless wants a documented +clean room (for example, to avoid any claim that it derives from Illumina's GenCall source), do this: +1. Have a "dirty" analyst write a behavioural spec from patents, tech notes and black-box experiments on + the reference product / IAAP output (GTC diffs). +2. Have implementers code from that spec only. +3. Use gtc2vcf only as a black-box **test oracle**: compare GTC TOC fields 400/1002/1004/1007/1008/1012/1013 per + sample. Do not use it as source material for implementers. + +Either way, validation must include a direct comparison against **vendor-produced** GTC output (now: the published 1000G Broad GTCs). gtc2vcf's equivalence +claims stop at ACLI v2.1, and the reference product is not referenced in its code. + +--- + +## 7. Sources +- https://github.com/freeseek/gtc2vcf (README.md, idat2gtc.c, gtc2vcf.c, BAFregress.c, LICENSE) +- https://github.com/freeseek/mocha +- https://github.com/Illumina/BeadArrayFiles (README.md license section; module/*.py; docs/GTC_File_Format_v5.pdf) +- https://github.com/Illumina/GTCtoVCF (LICENSE Apache-2.0; README "Semi-archived") +- https://github.com/broadinstitute/picard (src/main/java/picard/arrays) +- https://github.com/broadinstitute/warp ; https://broadinstitute.github.io/warp/docs/Pipelines/Illumina_Genotyping_Arrays_Pipeline/README +- https://github.com/HenrikBengtsson/illuminaio (DESCRIPTION: GPL-2) +- https://github.com/WGLab/PennCNV (UNLICENSE) +- https://github.com/jigold/zCall ; https://opticall.bitbucket.io/ ; https://github.com/wtsi-npg/Illuminus ; https://innovation.ox.ac.uk/licence-details/genosnp/ +- https://github.com/HaoKeLab/ensembleCNV ; https://github.com/VanLoo-lab/ascat +- https://github.com/gjun/verifyIDintensity (GPL-3) +- https://github.com/PharmGKB/PharmCAT (MPL-2.0) ; https://github.com/sbslee/pypgx (MIT) ; https://github.com/0xTCG/aldy (IU licence) ; https://github.com/Illumina/Cyrius (PolyForm Strict) +- https://pmc.ncbi.nlm.nih.gov/articles/PMC13339515/ (benchmark of star-allele callers on arrays) +- https://github.com/chrchang/plink-ng (GPL-3) ; https://github.com/brentp/somalier ; https://github.com/brentp/peddy +- https://www.chg.ox.ac.uk/~wrayner/strand/ ; https://faculty.washington.edu/browning/conform-gt.html ; https://github.com/biocore-ntnu/snpflip +- https://github.com/a-xavier/illumina_array_reader ; https://github.com/oheil/IlluminaIdatFiles.jl ; https://github.com/FoxoTech/methylprep ; https://github.com/brj0/mepylome ; https://github.com/molgenis/AGCT +- [ref-docs:output-files] (reference-product GTC/VCF outputs) diff --git a/docs/research/R3_science_formats_algorithms.md b/docs/research/R3_science_formats_algorithms.md new file mode 100644 index 0000000..6701528 --- /dev/null +++ b/docs/research/R3_science_formats_algorithms.md @@ -0,0 +1,608 @@ +# R3 — Science, File Formats and Algorithms behind Illumina Infinium Genotyping (for SimurgArray) + +> **Archived Phase-0 study (sanitized copy, see `README.md`).** Written 2026-09-27, before the decisions in +> `SIMURGARRAY_MASTER_PLAN.md` §2. The analysed vendor product is called "the reference product" and its CLI +> `refcli`; its documentation URLs are replaced by `[ref-docs:…]` tokens. Where this file speaks of a clean room, +> legal clearance, or running/benchmarking the vendor binary, plan §2 supersedes it: personal research; MIT/BSD/Apache +> code may be reused with attribution; GPL tools are subprocess oracles only; vendor binaries are never run for +> comparison, inspected or decompiled; oracles are published vendor-produced GTCs, gtc2vcf and BeadArrayFiles. + +Author role: statistical-genetics research pass for an independent re-implementation (SimurgArray) of reference-product-like functionality. +Date of research: 2026-09-27. + +## Evidence tags + +| Tag | Meaning | +|---|---| +| **[PUBLIC DOCUMENTATION]** | Illumina technical notes, support bulletins, format specs, reference-product online help, Illumina patents | +| **[SCIENTIFIC LITERATURE]** | Peer-reviewed papers (DOIs given; bibliographic data from PubMed) | +| **[OPEN-SOURCE IMPLEMENTATION]** | Behavior read from public source code (Illumina/BeadArrayFiles, illuminaio, freeseek/gtc2vcf + idat2gtc, BAFregress) | +| **[INFERRED]** | My deduction from combining the sources above | +| **[HYPOTHESIS]** | Plausible but unverified; needs testing against real Illumina output | + +### Clean-room and licensing notes (read first) + +* **Illumina/BeadArrayFiles** (GTC/BPM/EGT parsers, GTC v5 format PDF) is published by Illumina. It is the primary format reference used here. https://github.com/Illumina/BeadArrayFiles +* **illuminaio** (R/Bioconductor) is GPL-licensed. Its encrypted-IDAT path uses a DES routine (`src/des.c`, GPL-2+) with a key embedded in the package. Do not copy code. Re-derive only the structural facts. https://github.com/HenrikBengtsson/illuminaio +* **freeseek/gtc2vcf `idat2gtc.c`** is MIT-licensed. Its header says it "reimplements functionalities and ideas present in AutoConvert (v1.6.3.1), GTCtoVCF, BeadArrayFiles". It also cites Illumina's released *GenCall Source Code* (C#: `NormalizationInfinium.cs`, `GenTrain60.cs`, `Utils.cs`; http://support.illumina.com/downloads/gencall_software.html). It deliberately reproduces Illumina bugs "for interoperability". **This is the most complete public description of AutoCall/GenCall behavior. Its provenance includes Illumina binaries and Illumina-released source, so get a legal opinion before porting it line by line.** The safest clean-room use is: (a) describe the algorithms from the patents, papers and tech notes, and (b) use idat2gtc and the Illumina binaries only as black-box **test oracles**. The key patents US7035740 (normalization) and US7467117 (clustering/calling) are marked **expired** on Google Patents. [PUBLIC DOCUMENTATION] https://patents.google.com/patent/US7467117B2/en ; https://patents.google.com/patent/US7035740 + +--- + +## 1. Infinium chemistry + +### 1.1 Assay principle +* Whole-genome amplification, fragmentation, and hybridisation to 50-mer probes on beads (bead type = "address"). Then single-base extension (SBE) with labelled terminators, staining, and two-colour imaging on iScan. [SCIENTIFIC LITERATURE] Gunderson et al. 2005, Nat Genet 37:549, https://doi.org/10.1038/ng1547 ; Steemers et al. 2006, Nat Methods 3:31, https://doi.org/10.1038/nmeth842 +* Each bead type is present in about 15–30 copies. IDATs store per-address summary statistics (mean, SD, bead count), not per-bead data. [PUBLIC DOCUMENTATION]/[OPEN-SOURCE IMPLEMENTATION] (IDAT fields below) + +### 1.2 Infinium I vs Infinium II +* **Infinium II** (one bead type per locus, `AddressA_ID` only, `AddressB_ID`=0; BPM assay_type 0). + * The probe ends one base 5′ of the SNP. The SNP base itself is extended with a labelled ddNTP. + * A and T terminators carry one hapten, detected in the **red** channel. C and G carry the other, detected in the **green** channel. + * So the two alleles appear in different colours. [SCIENTIFIC LITERATURE] Steemers 2006. + * Consequence: [A/T] and [C/G] SNPs cannot be assayed with Infinium II, because both alleles have the same colour. [INFERRED from chemistry; consistent with manifests] +* **Infinium I** (two bead types per locus, `AddressA_ID` and `AddressB_ID`; assay_type 1 or 2). + * The two probes are allele-specific at their 3′ end. Extension adds the *next* (non-polymorphic) base. + * Both alleles therefore read in **one** channel, determined by the next base: A/T → red (assay_type 1), C/G → green (assay_type 2). + * [OPEN-SOURCE IMPLEMENTATION] `get_assay_type()` in idat2gtc.c infers assay type from the bases flanking `[x/y]` in SourceSeq for old manifests (locus-entry version < 6); newer BPMs store it explicitly. +* **Intensity assembly (IDAT → raw X/Y per locus).** [OPEN-SOURCE IMPLEMENTATION] idat2gtc `fill_array` (matches AutoCall `SampleData.fillArray`): + * Infinium II: X = Red.Mean[AddressA], Y = Grn.Mean[AddressA] + * Infinium I A/T: X = Red.Mean[AddressA], Y = Red.Mean[AddressB] + * Infinium I C/G: X = Grn.Mean[AddressA], Y = Grn.Mean[AddressB] + * A locus is set to (0,0) unless **both** addresses have NBeads ≥ 2. + * Controls: controls_x = Red, controls_y = Grn for each control address listed in the BPM control config. + * **Discrepancy:** the GTC v5 PDF describes Raw X as "green" and Raw Y as "red". The open implementations use X = red for Infinium II. Treat the PDF wording as unreliable and validate against real GTCs. [INFERRED] + +### 1.3 A/B alleles, TOP/BOT, PLUS/MINUS, Forward/Reverse +Source: Illumina technical note "TOP/BOT Strand and A/B Allele". [PUBLIC DOCUMENTATION] https://www.illumina.com/documents/products/technotes/technote_topbot.pdf + +**TOP/BOT algorithm:** +1. **Unambiguous SNPs.** + * If one allele is A and the other is C or G → strand = **TOP**, Allele A = A, Allele B = C/G. + * If one allele is T and the other is C or G → strand = **BOT**, Allele A = T, Allele B = C/G. +2. **Ambiguous SNPs ([A/T], [C/G]) — "sequence walking".** + * Let the SNP be position n. Compare the pairs (n−1, n+1), (n−2, n+2), … until the first *unambiguous* pair, meaning one base is A or T and the other is C or G. + * If the A or T of that pair lies **5′** of the SNP → TOP. If it lies **3′** → BOT. + * Alleles: [A/T] on TOP gives A=A, B=T; on BOT gives A=T, B=A. [C/G] on TOP gives A=C, B=G; on BOT gives A=G, B=C. +3. dbSNP adopted TOP/BOT in 2005 (per the same note). + +**Other strand designations** [PUBLIC DOCUMENTATION] https://knowledge.illumina.com/microarray/general/microarray-general-reference_material-list/000001489 : +* **PLUS/MINUS**: relative to the reference FASTA. The + strand's 5′ end is at the tip of the p arm. +* **Forward/Reverse** (`SourceStrand`): Forward means "the alleles in the SNP column match the RefSNP alleles displayed in dbSNP". +* **IlmnStrand**: the design strand. It is TOP/BOT for SNPs and PLUS/MINUS for indels. +* **RefStrand**: the +/− strand of the SNP column. It is only present in newer manifests (BPM locus-entry version 8). + +**Base calls in GTC** are always reported on the TOP strand. [PUBLIC DOCUMENTATION] GTC v5 spec. idat2gtc derives them from the SNP column `[a/b]` and IlmnStrand: TOP → (a, b); BOT → complement(a), complement(b). [OPEN-SOURCE IMPLEMENTATION] +* PLUS and Forward calls: BeadArrayFiles `get_base_calls_plus_strand` / `_forward_strand` take the design-strand SNP `[a/b]`. They complement each allele when the strand annotation (RefStrand/SourceStrand) differs from the requested report strand. A '-' is emitted for NC/NULL/unknown strand. [OPEN-SOURCE IMPLEMENTATION] GenotypeCalls.py + +**Indels:** +* The SNP column is `[I/D]` or `[D/I]`. IlmnStrand is PLUS/MINUS. +* The complement of I is I and of D is D (BeadArrayUtility.complement). +* Mapping I/D to actual REF/ALT sequence needs the CSV manifest (SourceSeq / TopGenomicSeq). gtc2vcf states "Indel alleles cannot be inferred and will be skipped without the CSV manifest file." [OPEN-SOURCE IMPLEMENTATION] https://github.com/freeseek/gtc2vcf +* idat2gtc also normalises a SourceSeq of the form `x[-/y]` by swapping the dash position. [OPEN-SOURCE IMPLEMENTATION] + +--- + +## 2. File formats + +General conventions: little-endian. Strings are .NET `BinaryWriter` strings, i.e. a **7-bit varint (LEB128) length prefix** followed by UTF-8 bytes (BeadArrayUtility.read_string). The GTC PDF says the first byte is the length; that is only true for strings shorter than 128 bytes. [OPEN-SOURCE IMPLEMENTATION] + +### 2.1 IDAT (binary, version 3) +[OPEN-SOURCE IMPLEMENTATION] illuminaio `readIDAT_nonenc.R`; idat2gtc.c (field-name comments such as `ID_N_CORES` appear to come from Illumina/Broad naming). + +**Header:** +``` +char[4] magic = "IDAT" +int64 version (must be 3 for the unencrypted binary format) +int32 nFields +nFields × { uint16 fieldCode; int64 byteOffset } # TOC +``` + +**Field codes:** + +| code | name (illuminaio / idat2gtc) | type at offset | +|---|---|---| +| 1000 | nSNPsRead / ID_N_CORES | int32 N (lowest offset in file) | +| 102 | IlluminaID / ID_BEAD_TYPES | int32[N] (address IDs) | +| 103 | SD / ID_DEVS | uint16[N] | +| 104 | Mean / ID_MEANS (a trimmed mean in practice) | uint16[N] | +| 107 | NBeads / ID_N_GOOD_BEADS | uint8[N] | +| 200 | MidBlock / ID_ILLUMICODES | int32 count + array (illuminaio reads int32[]; idat2gtc reads uint8[] — **discrepancy**, verify) | +| 300 | RunInfo / ID_PROCESS_HISTORY | int32 n; n × 5 strings (RunTime, BlockType, BlockPars, BlockCode, CodeVersion) | +| 400 | RedGreen / ID_TENTH_PERCENTILE | 4 bytes | +| 401 | Manifest / ID_SAMPLE_BEADSET | string | +| 402 | Barcode (Sentrix ID) | string | +| 403 | ChipType / ID_SENTRIX_FORMAT | string | +| 404 | SentrixPosition / ID_SECTION_LABEL (e.g. R01C01) | string | +| 405 | Beadset / "opa" | string | +| 406 | SampleID / ID_DNA | string | +| 407 | Description / "descr" | string | +| 408 | Plate | string | +| 409 | Well | string | +| 410 | SampleCount | int32 (illuminaio treats as unknown bytes) | +| 510 | VLN / "unknown" | string | + +Codes 100, 101, 105, 106, 108 (backgrounds, background devs, medians, n_beads, trimmed means) are named in idat2gtc comments but not used. + +* One IDAT exists per colour per section: `__Grn.idat` and `..._Red.idat`. +* The IlluminaID arrays of the two files index the same addresses. Join by address, not by position (idat2gtc builds a hash address→index). [OPEN-SOURCE IMPLEMENTATION] + +**Encrypted IDAT ("version 1", older BeadScan/GoldenGate era)** [OPEN-SOURCE IMPLEMENTATION] illuminaio `readIDAT_enc.R` + `des.c`: +* The file is DES-encrypted. Decrypted, it is XML carrying base64-encoded binary blocks named ` __="..."`. +* The data blocks are six float32 arrays followed by four int32 arrays, plus `` run info and ``, ``, ``. +* The DES key is embedded in illuminaio (GPL). SimurgArray should treat encrypted IDATs as **out of scope** or support them only via a user-supplied external converter. [INFERRED] + +### 2.2 BPM (binary bead pool manifest) +[OPEN-SOURCE IMPLEMENTATION] BeadArrayFiles `BeadPoolManifest.py`; idat2gtc `bpm_init`/`locusentry_read`. +``` +char[3] "BPM"; uint8 = 1 +int32 version (may carry flag 0x1000 -> XOR it off; supported 3..5) +string manifest_name +string control_config (if version>1; CSV-like lines "addr[:addr...],Category,Color,Name") +int32 num_loci +int32[num_loci] indexes (1-based order index of each locus entry) +string[num_loci] names (sorted order) +uint8[num_loci] norm_ids (0..99, sub-bead-pool / normalization bin) +num_loci × LocusEntry +int32 m_header; string[m_header] header lines (idat2gtc reads this trailer; BeadArrayFiles ignores it) +``` + +**LocusEntry** (int32 version 4, 6, 7 or 8): +* Strings, in order: IlmnID, Name, 3 unused strings, **int32 index**, unused string, IlmnStrand, SNP, Chr, Ploidy, Species, MapInfo (string), TopGenomicSeq (v4 only), CustomerStrand. +* Then int32 AddressA, int32 AddressB. +* Then strings: AlleleA_ProbeSeq, AlleleB_ProbeSeq (v4 only), GenomeBuild, Source, SourceVersion, SourceStrand, SourceSeq (v4 only). +* **v≥6:** 1 byte unused, int8 Exp_Clusters, int8 Intensity_Only, uint8 AssayType (0 = Inf II, 1 = Inf I A/T, 2 = Inf I G/C). Consistency rule: AddressB==0 ⇔ AssayType==0. +* **v≥7:** 4 × float (frac_A, frac_C, frac_T, frac_G). +* **v8:** string RefStrand. + +**Normalization-bin lookup** (critical for exact reproduction): +``` +norm_id' = (norm_id + 100 * assay_type) mod 256 # BeadArrayFiles comment: mimics byte wrap in GenomeStudio/AutoCall/IAAP +lookup = rank of norm_id' among the sorted set of distinct norm_id' values +XForm used for locus i = GTC.normalization_transforms[lookup[i]] +``` +idat2gtc notes that Omni5 has overflow cases where some Infinium I G/C probes then share a bin with Infinium II probes. [OPEN-SOURCE IMPLEMENTATION] + +### 2.3 CSV manifest (human-readable) +[PUBLIC DOCUMENTATION] https://knowledge.illumina.com/microarray/general/microarray-general-reference_material-list/000001565 +* Sections: `[Heading]`, `[Assay]`, `[Controls]`. +* Assay columns: IlmnID, Name, IlmnStrand, SNP, AddressA_ID, AlleleA_ProbeSeq, AddressB_ID, AlleleB_ProbeSeq, GenomeBuild, Chr, MapInfo, Ploidy, Species, Source, SourceVersion, SourceStrand, SourceSeq, TopGenomicSeq, BeadSetID, Exp_Clusters, Intensity_Only, RefStrand. +* Column meanings: + * Exp_Clusters: 1 = non-polymorphic, 2 = mtDNA/Y, 3 = other diploid. + * Intensity_Only: 1 = "out of stats"; always no-call; used for CN. + * TopGenomicSeq: CSV only, not in BPM. +* The CSV (not the BPM) is needed for indel allele resolution and for VCF conversion in the reference product (`gtc-to-vcf`). [PUBLIC DOCUMENTATION] [ref-docs:input-files] + +### 2.4 EGT cluster file +[OPEN-SOURCE IMPLEMENTATION] BeadArrayFiles `ClusterFile.py`; idat2gtc `egt_init`; Picard `InfiniumEGTFile.java` is cited there. +``` +int32 version (=3) +string gencall_version, cluster_version, call_version, normalization_version, date_created +uint8 is_wgt (must be 1) +string manifest_name +int32 data_block_version (5..9 seen) +string opa +int32 num_records +num_records × ClusterRecord: + int32 N_AA, N_AB, N_BB + float Rdev_AA, Rdev_AB, Rdev_BB + float Rmean_AA, Rmean_AB, Rmean_BB + float Tdev_AA, Tdev_AB, Tdev_BB + float Tmean_AA, Tmean_AB, Tmean_BB + if dbv >= 7 (idat2gtc) / ==9 (BeadArrayFiles): float intensity_threshold + 14 unused floats + elif dbv >= 6: 15 unused floats ; elif dbv < 5: 2 unused floats +num_records × ClusterScore: float cluster_separation, float total_score (= GenTrain score), float original_score, uint8 edited +num_records × string genotype (unused) +num_records × string locus name +num_records × int32 address +num_records × int32[3] cluster counts (must equal N_AA, N_AB, N_BB) +if dbv == 9: num_records × float (unknown; skipped by idat2gtc) +``` +* EGT records are matched to BPM loci **by name**. +* The derived quantity R̄ = (N_AA·R_AA + N_AB·R_AB + N_BB·R_BB)/(N_AA+N_AB+N_BB) is used as the expected R for Intensity_Only loci. [OPEN-SOURCE IMPLEMENTATION] +* The unused 14–15 floats per record are **undocumented** (possibly cluster covariances or GenTrain internals). [HYPOTHESIS] + +### 2.5 GTC genotype file (versions 3, 4, 5) +[PUBLIC DOCUMENTATION] Illumina, `docs/GTC_File_Format_v5.pdf` in BeadArrayFiles; [OPEN-SOURCE IMPLEMENTATION] GenotypeCalls.py. + +**Header:** `char[3] "gtc"; uint8 version; int32 M;` then M TOC entries `{int16 id; uint32 offset}`. +* For int-typed IDs (1, 2, 3) the "offset" **is the value**. +* Arrays are `int32 count` followed by the elements. + +**TOC IDs:** + +| ID | Name | Type | +|---|---|---| +| 1 | NumSNPs | int32 (in TOC) | +| 2 | Ploidy | int32 (in TOC) | +| 3 | PloidyType (1 diploid, 2 autopolyploid, 3 allopolyploid) | int32 (in TOC) | +| 10/11/12 | Sample name / plate / well | string | +| 100 | Cluster file name | string | +| 101 | SNP manifest name | string | +| 200 | Imaging date | string | +| 201 | AutoCall date | string | +| 300 | AutoCall version | string | +| 400 | Normalization transforms | XForm[] (52 bytes each) | +| 500/501 | Raw control X / Y | uint16[] ((sections/sample) × nControls) | +| 1000/1001 | Raw X / Raw Y | uint16[] | +| 1002 | Genotypes | uint8[] | +| 1003 | BaseCalls | char[2][] (TOP strand; '-' = no call) | +| 1004 | GenCall scores | float[] | +| 1005 | Scanner data: name, pmt_green (int32), pmt_red (int32), scanner version, imaging user | struct | +| 1006 | Call rate | float | +| 1007 | Gender | char 'M'/'F'/'U' | +| 1008 | LogR dev | float | +| 1009 | p10GC | float | +| 1010 | DX flag | int32 | +| 1011 | Extended sample data: P50GC float, NumCalls int32, NumNoCalls int32, NumIntensityOnly int32 | struct | +| 1012 | B allele freqs | float[] (v≥4) | +| 1013 | LogR ratios | float[] (v≥4) | +| 1014/1015 | Intensity percentiles X/Y: P05, P50, P95 | 3 × uint16 (v5) | +| 1016 | Sentrix ID | string (v5) | + +* **Genotype codes:** 0 NC, 1 AA, 2 AB, 3 BB, 4 NULL, 5 A, 6 B, 7 AAA … up to 45 BBBBBBBB (polyploid series). +* **XForm (52 B):** int32 version; float offset_x, offset_y, scale_x, scale_y, shear, theta; then 6 reserved floats. idat2gtc writes nn12, rr12, taa, tbb into these reserved slots. +* **Write-complete check:** v3 → NumIntensityOnly readable; v4 → LogR ratios readable; v5 → Sentrix ID readable. +* **The GTC does not store normalized X/Y, theta or R.** They are recomputed from raw X/Y + XForm + BPM norm lookup. + +**Normalized intensities (exact, from the spec):** +``` +tx = x_raw − offset_x ; ty = y_raw − offset_y +tx2 = cosθ·tx + sinθ·ty ; ty2 = −sinθ·tx + cosθ·ty +tx3 = tx2 − shear·ty2 ; ty3 = ty2 +xn = tx3 / scale_x ; yn = ty3 / scale_y +``` +* Negative results are clamped to 0 (BeadArrayFiles `threshold=True`; idat2gtc clamps before scaling). +* If x_raw ≤ 0 and y_raw ≤ 0, the result is NaN. + +### 2.6 Illumina (GenomeStudio) Final Report +[PUBLIC DOCUMENTATION] GenomeStudio Genotyping Module v2 User Guide (11319113), https://support.illumina.com/content/dam/illumina-support/documents/documentation/software_documentation/genomestudio/genomestudio-2-0/genomestudio-genotyping-module-v2-user-guide-11319113-01.pdf ; [OPEN-SOURCE IMPLEMENTATION] BeadArrayFiles `examples/gtc_final_report.py`. +* Tab-delimited text. +* `[Header]` block: `GSGT Version`, `Processing Date`, `Content` (manifest), `Num SNPs`, `Total SNPs`, `Num Samples`, `Total Samples`. +* `[Data]` block, "Standard" (long) format: one row per SNP × sample. Columns are user-selectable, e.g. `SNP Name, Sample ID, Allele1 - Top, Allele2 - Top, Allele1 - Forward, Allele1 - AB, Allele1 - Plus, GC Score, Chr, Position, Theta, R, X, Y, X Raw, Y Raw, B Allele Freq, Log R Ratio, GT Score, Cluster Sep`. +* A "Matrix" format also exists (SNP × sample). +* Exact column naming and ordering vary with the selected fields. [INFERRED] + +### 2.7 Locus/DNA summary reports +[OPEN-SOURCE IMPLEMENTATION] `examples/locus_summary.py`, `dna_summary.py`. +* Locus columns: Call_Freq, A/A_Freq, A/B_Freq, B/B_Freq, Minor_Freq, Gentrain_Score, 50%_GC_Score, 10%_GC_Score, Het_Excess_Freq, ChiTest_P100, Cluster_Sep, AA/AB/BB T_Mean, T_Std, R_Mean, R_Std, Plus/Minus. +* Formulas are in §8. + +--- + +## 3. Normalization + +### 3.1 Published description +* [PUBLIC DOCUMENTATION] US7035740 (Kermani, "Artificial intelligence and global normalization methods for genotyping") and US7467117 (divisional). The global affine model has "6 degrees of freedom — Xoffset, Yoffset, Xscale, Yscale, Xshear, and Yshear". Control points are the data points nearest to "sweep points" along the axes, found via Delaunay triangulation. Transform order: translation, then rotation, then shear, then scale. https://patents.google.com/patent/US7467117B2/en +* [SCIENTIFIC LITERATURE] Peiffer et al. 2006 (https://doi.org/10.1101/gr.5402306) list five steps: + 1. outlier removal; + 2. translation — asymptotes fitted to candidate AA and BB homozygotes; their intersection is the new origin; + 3. rotation — the angle of the AA asymptote to the x-axis; + 4. shear — the angle of the BB asymptote to the rotated y-axis; + 5. scaling — robust centroids of candidate AA (x) and BB (y), giving a scale of about 1. +* [PUBLIC DOCUMENTATION] Illumina, "Illumina's Genotyping Data Normalization Methods", Pub. 970-2006-010 (mirror: http://dnatech.genomecenter.ucdavis.edu/wp-content/uploads/2013/06/illumina_gt_normalization.pdf — the fetch failed with ECONNREFUSED; content known via quotes in idat2gtc): + * **400** sweep points. + * A SNP is an outlier if x, y or x/(x+y) is below min(5th smallest, 1st percentile) or above max(5th largest, 99th percentile). +* [PUBLIC DOCUMENTATION] GenTrain 3.0 tech note M-GL-01258 (https://www.illumina.com/content/dam/illumina/gcs/assembled-assets/marketing-literature/gentrain-tech-note-m-gl-01258/gentrain-tech-note-m-gl-01258.pdf): + * Infinium I and II loci go in separate normalization bins. + * Bins with **< 192 loci** degrade normalization. + * GenTrain 3.0 fits a **2-parameter** model for Infinium I bins with < 192 loci, because both alleles are in one colour. + * GenTrain 3.0 ignores zero-intensity samples when estimating the BB mean in small bins. + +### 3.2 Full algorithm as reproduced +[OPEN-SOURCE IMPLEMENTATION] idat2gtc; normalization versions 1.1.2 = AutoConvert/GenTrain 2, and 1.2.0 = AutoConvert 2.0 / IAAP / ACLI / GenTrain 3. + +For each bin b (loci grouped by norm_id', raw uint16 X,Y as float; missing pairs enter as zeros — a reproduced quirk): + +**GenTrain-3 small Infinium I bin** (norm_id' ≥ 100 and n < 192) uses the single-channel 2-parameter model: +1. Mirror: swap so that x ≥ y. +2. c = P2(y) (2nd percentile). Subtract c from x and y. +3. Polar coordinates with r = |x|+|y| and t = (2/π)·atan2(y,x). +4. AA set = { t < 0.1 }. +5. ȳ = trimmean20(y_AA) − 50. +6. r̄ = trimmean20(r_nonNaN, zero-padded) − 2ȳ. +7. Result: offset_x = offset_y = c + ȳ, θ = 0, shear = 0, scale_x = scale_y = r̄. + +**Otherwise, six-parameter fit:** +1. **Outliers:** skipped if n < 400. Remove points with x ≤ xcut1, x ≥ xcut2, y ≤ …, or t = y/(x+y) outside (tcut1, tcut2), where cut1 = min(5th smallest, P1) and cut2 = max(5th largest, P99). +2. **Offset** (skipped if n < 192, giving 0): + * Shift by (min x, min y). + * Build 400 equally spaced points on the x-axis, [0, max x], and 400 on the y-axis. + * Candidate AA = unique nearest data points (Euclidean) to the x-axis points. Candidate BB = the same for the y-axis points. + * Robust line fits: y = b_a + m_a·x on the AA set; x = b_b + m_b·y on the BB set. + * Intersection: o_x = (b_b + m_b·b_a)/(1 − m_b·m_a), o_y = b_a + m_a·o_x. + * offset = o + (min x, min y). +3. **nn12/rr12** (diagnostics stored in reserved slots): + * nn12 = fraction of points with x < 0.2·P95(x) and y < 0.2·P95(y). + * rr12 = mean(x+y over those points) / mean(x+y over all). +4. **Rotation:** + * New 400-point x-sweep over [min x, max x]; AA set = union with the previous set. + * Robust through-origin fit y = m·x (bisquare). + * θ = atan(m). Rotate: x′ = cosθ·x + sinθ·y, y′ = −sinθ·x + cosθ·y. +5. **Shear:** + * y-sweep [0, max y]; BB set = union. + * Robust fit x = m·y through the origin. shear = tan(atan m) = m. Apply x′ = x − shear·y. +6. **Scale:** + * n ≥ 192: AA = { x > 5y and x > 0.1·P99(x) }, BB = { y > 5x and y > 0.1·P99(y) }. scale_x = trimmean50(x_AA), scale_y = trimmean50(y_BB). + * n < 192: clamp negatives to 0. AA = { t° < 10° }, BB = { t° > 80° } using degree angles (GenTrain 2 also counts zero points as AA). scale = trimmean20. + * Base variant used in the older code path: scale = 0.5·trimmean50 + 0.7413·IQR. + +**Robust fit details:** +* MATLAB `robustfit` equivalent: bisquare weights, tuning constant 4.685, at most 50 iterations, relative tolerance 1e-6, leverage-adjusted residuals. +* Scale estimate: `madsigma` = median(|r| sorted, from the p-th element)/0.6745. GenTrain 3 uses the new madsigma; GenTrain 2 the old median-centred version. +* The no-intercept fit uses a constant adjfactor ≈ 100 (a reproduced Illumina bug). + +**Percentile definition (used everywhere, also for GC10/GC50):** for sorted v of length n and target p: +``` +i1 = floor(n·p/100); f = n·p/100 − i1; if f < 0.5: i1 −= 1 +clamp to ends; x1 = 100(i1+0.5)/n; x2 = 100(i1+1.5)/n +P = v[i1] + (v[i1+1]−v[i1])·(p − x1)/(x2 − x1) +``` +Trimmed mean trimmeanK = mean of values v with P(K/2) ≤ v ≤ P(100−K/2). + +### 3.3 Theta and R +* [PUBLIC DOCUMENTATION] GenTrain2 tech note (Pub. 037-2009-015, https://www.illumina.com/documents/products/technotes/technote_gentrain2.pdf): θ = (2/π)·arctan(B/A), R = A + B. +* [OPEN-SOURCE IMPLEMENTATION] Edge cases: + * θ = (2/π)·atan2(yn, xn), R = xn + yn. + * (0,0) gives NaN for both. + * idat2gtc uses R = |xn|+|yn|, and if both are negative sets R = FLT_MIN·FLT_EPSILON. + +--- + +## 4. GenCall / GenTrain + +### 4.1 What Illumina has published +[PUBLIC DOCUMENTATION] Tech notes: GenCall (Pub. 370-2004-009, https://www.illumina.com/Documents/products/technotes/technote_gencall_data_analysis_software.pdf), GenTrain2 (037-2009-015), GenTrain 3.0 (M-GL-01258). + +**GenTrain clustering** (builds the EGT from many samples): +1. **Preliminary clustering** on θ, with no fixed number of clusters (1 to about 6). +2. **Secondary clustering:** candidate models assign preliminary clusters to AA/AB/BB (all 3, 2, or 1 cluster present). Each cluster gets mean and SD of θ and R, so 12 parameters per locus. +3. **Final clustering:** each model is scored on compactness, spread between clusters, and the likelihood of the assignment under HWE. The highest-scoring model is kept. +* Missing clusters are placed by **neural networks** (patent: 3-layer perceptron, trained with a genetic algorithm; 7 cluster models for a bi-allelic locus). +* The GenTrain score comes from a fuzzy/ANN score "evolved using top/bottom strand data", combined with penalty terms. +* GenTrain 3.0 caps the negative penalty for homozygous clusters lying on the axis. + +**GenCall calling:** +* A Bayesian classification against the EGT clusters. +* GenCall score = GenTrain score × data-to-model fit score, then "further penalized by the DNA Score". +* It is "not a probability". The sensitive range is 0.2–0.7; scores < 0.2 usually mean failed genotypes. +* **No-call threshold 0.15** (FastTrack standard, chosen from trio and replicate data). [PUBLIC DOCUMENTATION] technote_infinium_genotyping_data_analysis.pdf +* Call rate = #genotypes with score ≥ threshold / #genotypes. + +### 4.2 Calling algorithm in full +[OPEN-SOURCE IMPLEMENTATION] idat2gtc `compute_score_call_prelim`, `gen_std_flair`, `modilik`, `gencall_score_map`, `make_calls`. These cite GenTrain60.cs / GenTrain62. The README claims output "equivalent to the output of the Illumina GenCall algorithm". + +Given a locus with EGT cluster k ∈ {AA, AB, BB} = (μθ_k, σθ_k, μR_k, σR_k, N_k), GenTrain score G, intensity threshold τ, and sample point (t, r): + +1. If r < τ → NC, score NaN (then 0). +2. **Pre-flooring:** σR_k ← max(σR_k, 0.1). +3. **"gen_std_flair" dispersion adjustment:** + * z1 = ½(μθ_AB−μθ_AA)/(σθ_AB+σθ_AA), z2 = ½(μθ_BB−μθ_AB)/(σθ_BB+σθ_AB), mz = min(z1, z2). + * η = max(mz/3, 1)·min(mz/3, 1). Set σθ_k ← max(η·σθ_k, 0.02). + * m = max(0.2, median(σθ_AA, σθ_AB, σθ_BB) of the original values). Set σR_k ← max(σR_k, max(μR_k/7, m)). +4. **Likelihoods ("modilik"):** + * d_k = 100·|t−μθ_k| + |r−μR_k|. + * Choose the two nearest clusters (by the d ordering and R ordering). For the pair, use **half-flattened Gaussians** on the outward sides: `normpdf_vleft(x;μ,σ)` equals the peak density for x<μ, and `vright` equals the peak for x>μ. + * Each L_k = φ*(t;μθ_k,σθ_k)·φ*(r;μR_k,σR_k), with the flattened side chosen by the relative positions of clusters in θ and R. See the source for the six cases. + * The third cluster keeps L=0. If no case applies, use plain Gaussians for all three. +5. **Priors:** P_k = (N_k/N + ω)/(1+3ω), with ω = 1. +6. **Posteriors:** AP_k = L_k P_k / Σ L_j P_j. Genotype = argmax. +7. **Sub-scores:** + * s_ap = smf(log10(AP_max/AP_2nd); 0, 2), where smf is MATLAB's S-shaped function. + * s_r = smf(r;0,0.1) · smf(r;0,μR_g/10) · smf(r; μR_g−6σR_g, μR_g−2σR_g) · zmf(r; μR_g+6σR_g, μR_g+12σR_g). + * s_θ: + * AA: zmf(t; μθ+2σθ, μθ+6σθ); + * AB: zmf(|t−μθ|/σθ; 2, 6); + * BB: smf(t; μθ−6σθ, μθ−2σθ). + * s_mis = 0.7 if only one cluster is present and N_AB = 0; 0.95 if 2 clusters are present; else 1. + * s_n = 1. +8. prelim = s_ap · G · s_θ · s_r · s_n · s_mis. NaN if G is NaN or t is NaN. +9. **Final GenCall score:** GC = prelim^0.35 · gbellmf(prelim; a=0.504, b=1.71, c=1.08), where gbellmf(x) = 1/(1+|(x−c)/a|^{2b}). NaN becomes 0. +10. Genotype ← NC if GC < cutoff (default **0.15**). Intensity_Only loci are forced to NC and counted separately. +11. Call rate = NumCalls / (NumSNPs − NumIntensityOnly). + +**Standard MATLAB fuzzy memberships used** (restated): +``` +smf(x;a,b) = 0 (x≤a); 2((x−a)/(b−a))² (ab) +zmf = 1 − smf +``` + +### 4.3 Published vs unknown for GenCall/GenTrain + +| Item | Status | +|---|---| +| θ/R transform, 12-parameter cluster model | Published (tech note) | +| 0.15 no-call threshold; GC10/GC50 definitions | Published | +| Per-sample calling given an EGT | Reproduced in open source (idat2gtc), MIT, patent expired; "equivalent" per its author [OPEN-SOURCE IMPLEMENTATION]; needs our own concordance test | +| "DNA score" penalty mentioned in the 2005 tech note | **Unknown / apparently absent** in modern AutoCall (s_n = 1 in idat2gtc) [INFERRED] | +| GenTrain clustering (preliminary clustering method, candidate-model scoring, HWE term, ANN weights for missing clusters) | **Not public beyond qualitative descriptions + patent**. GenTrain score and Cluster Sep formulas are **unknown**. | +| Meaning of the extra 14–15 floats per EGT record | Unknown | +| The reference product's genotyper = ACLI GenCall (norm 1.2.0/GenTrain 3)? | [HYPOTHESIS] strongly suggested because the reference product consumes the same EGT and BPM. Validate by comparing GTCs. | + +**SimurgArray implication** [INFERRED]: +* Calling from a *given* EGT can be implemented to near-bit-exact fidelity. +* Producing new EGTs (reclustering) cannot match GenTrain. Use a documented alternative, e.g. a GMM/t-mixture in (θ,R) with HWE-aware model selection, and compute our own separation score. Label it as non-GenTrain. + +--- + +## 5. BAF and LRR + +[SCIENTIFIC LITERATURE] Peiffer et al. 2006 (https://doi.org/10.1101/gr.5402306): LRR = log2(R_obs/R_exp). R_exp is interpolated from the canonical cluster positions of about 120 reference samples. BAF is the θ position relative to the cluster θ means. +[OPEN-SOURCE IMPLEMENTATION] idat2gtc `get_baf_lrr` (matching AutoCall `CalculateBAlleleFreq`/`CalculateLogRDev`). + +With cluster θ means (θ_AA, θ_AB, θ_BB) and R means (R_AA, R_AB, R_BB) from the EGT, and sample (θ, R): +``` +if θ == θ_AB: BAF = 0.5; R_exp = R_AB +elif θ < θ_AB: BAF = 0.5·(θ − θ_AA)/(θ_AB − θ_AA) + R_exp = R_AA + (θ − θ_AA)·(R_AA − R_AB)/(θ_AA − θ_AB) +else (θ > θ_AB): BAF = 0.5 + 0.5·(θ − θ_AB)/(θ_BB − θ_AB) + R_exp = R_AB + (θ − θ_AB)·(R_BB − R_AB)/(θ_BB − θ_AB) +(θ NaN → BAF = LRR = NaN) +Intensity_Only loci: R_exp = N-weighted mean R of the three clusters (R̄ above) +LRR = log2(R / R_exp) (R == 0 → −FLT_MAX) +BAF stored in GTC clamped to [0,1]; θ outside [θ_AA, θ_BB] extrapolates linearly before clamping +``` +**LogR dev** = population SD of LRR over loci that are autosomal (chromosome not starting with X, Y or M), not Intensity_Only, and finite: sqrt(E[LRR²] − E[LRR]²). Missing or NaN EGT cluster means propagate NaN. + +**Notes:** +* The EGT sometimes lacks one cluster (monomorphic loci). GenomeStudio then uses ANN-predicted positions stored in the EGT. [INFERRED] +* gtc2vcf `--adjust-clusters` re-centres the clusters on the study data to reduce LRR noise. MoChA also applies median BAF/LRR adjustments. [OPEN-SOURCE IMPLEMENTATION] https://github.com/freeseek/gtc2vcf +* cnvPartition expected BAF for copy number n with b B-alleles is b/n; LRR means: CN0 −5 (SD 2), CN1 −0.45, CN2 0, CN3 0.3, CN4 0.75 (SD 0.18); BAF SD 0.03. [PUBLIC DOCUMENTATION] technote_cnv_algorithms.pdf + +--- + +## 6. Alternative genotype callers + +| Method | Model | Key facts | +|---|---|---| +| **Illuminus** — Teo et al. 2007, Bioinformatics 23:2741, https://doi.org/10.1093/bioinformatics/btm443 | [SCIENTIFIC LITERATURE] Model-based, population-level, no training data. Per-SNP mixture of bivariate (truncated) **t-distributions** in transformed contrast/strength space, fitted by EM; optimal initialisation handles shifted clouds; perturbation analysis gives a stability-based quality metric. | Needs large n: poorer at ≤50 samples (Ritchie 2011). Has a sex-aware X model. | +| **GenoSNP** — Giannoulatou et al. 2008, Bioinformatics 24:2209, https://doi.org/10.1093/bioinformatics/btn386 | [SCIENTIFIC LITERATURE] **Within-sample**: clusters all SNPs of one sample (per bead pool) with a 4-component Student-t mixture (AA, AB, BB, null) on log intensities, fitted by **variational Bayes**. | >99% accuracy on HapMap; no reference population; works for n=1. Also useful as independent QC. | +| **CRLMM (Illumina)** — Carvalho et al. 2007, Biostatistics 8:485, https://doi.org/10.1093/biostatistics/kxl042 ; Ritchie et al. 2009, Bioinformatics 25:2621, https://doi.org/10.1093/bioinformatics/btp470 | [SCIENTIFIC LITERATURE] Preprocessing: IDAT summaries, then quantile normalisation, then log-ratio M = log2(A/B). Hierarchical two-level mixture with SNP-specific cluster centres shrunk towards HapMap-derived priors, fitted by EM; per-call confidence; SNR sample metric. | Bioconductor `crlmm`. | +| **Birdseed** (Birdsuite) — Korn et al. 2008, Nat Genet 40:1253, https://doi.org/10.1038/ng.237 | [SCIENTIFIC LITERATURE] Affymetrix SNP6. 2-D Gaussian mixture EM with SNP-specific priors; integrates copy-number-aware genotypes (A-null, AAB …). | Affy-only, but the CN-aware genotype idea transfers. | +| **zCall** — Goldstein et al. 2012, Bioinformatics 28:2543, https://doi.org/10.1093/bioinformatics/bts479 | [SCIENTIFIC LITERATURE] Post-processor for GenCall no-calls at rare variants. Uses the mean and SD of the common homozygote cluster in normalized X and Y to set z-score thresholds (T_x = μ_x + z·σ_x, likewise for y) that define the other two genotype regions. | Improved rare-allele detection vs exome sequencing on HumanExome. | +| **optiCall** — Shah et al. 2012, Bioinformatics 28:1598, https://doi.org/10.1093/bioinformatics/bts180 | [SCIENTIFIC LITERATURE] Combines SNP-wise and sample-wise calling (mixture-model based) for rare, low-frequency and common variants. | On Immunochip (n=4537), SNPs lost to false QC failure or misclassified as monomorphic: 1.38% (optiCall) vs 3.87% (Illuminus), 7.85% (GenoSNP), 4.09% (GenCall). | + +**Head-to-head comparison:** Ritchie et al. 2011, BMC Bioinformatics 12:68, https://doi.org/10.1186/1471-2105-12-68 [SCIENTIFIC LITERATURE] +* GenCall, Illuminus, GenoSNP and CRLMM differ only slightly in accuracy. +* CRLMM and GenoSNP consistently beat GenCall, especially at low MAF. +* Sex-aware models (Illuminus, CRLMM) are better on chrX. +* Sample QC flags agree well across the four methods. + +--- + +## 7. CNV, LOH and mosaicism + +* **PennCNV** — Wang et al. 2007, Genome Res 17:1665, https://doi.org/10.1101/gr.6861907 [SCIENTIFIC LITERATURE] + * First-order HMM over markers ordered by position. Hidden states: CN0, CN1, CN2, CN2-LOH (copy-neutral LOH), CN3, CN4. + * Emissions combine LRR (a state-specific Gaussian mixed with a small uniform component for outliers) and BAF. BAF emission uses the population **B allele frequency (PFB)** to weight genotype-specific BAF components. + * Transitions depend on inter-marker distance d, roughly P(change) ∝ 1 − exp(−d/D). + * Supports trio/joint calling. + * GC-wave correction: Diskin et al. 2008, NAR 36:e126, https://doi.org/10.1093/nar/gkn556 — regress LRR on local GC content; the GC-wave factor (GCWF) tracks DNA quantity. +* **QuantiSNP** — Colella et al. 2007, NAR 35:2013, https://doi.org/10.1093/nar/gkm076 [SCIENTIFIC LITERATURE] + * Objective-Bayes HMM on LRR+BAF. Hyperparameters are calibrated to a fixed type-I error by resampling. + * Reports Bayes factors per segment. +* **cnvPartition** (Illumina GenomeStudio plug-in) [PUBLIC DOCUMENTATION] https://www.illumina.com/documents/products/technotes/technote_cnv_algorithms.pdf + * **Per-locus likelihoods** for 14 genotypes as bivariate Gaussians: L_g = N(LRR; μ_g, σ_g)·N(BAF; β_g, 0.03), with μ, σ from the table in §5. For DD: L_DD = N(LRR; −5, 2) with BAF uniform. + * **Copy-number likelihoods:** L_k = Σ_{g∈CN k} L_g. Preliminary CN: X = (L1+2L2+3L3+4L4)/(L0+…+L4). + * **Segmentation:** maximise |Z_ij| with Z_ij = [1/(j−i) + 1/(n−j+i)]^{−1/2} · [(S_j−S_i)/(j−i) − (S_n−S_j+S_i)/(n−j+i)], where S = cumulative sum of X. + * Sliding windows w = 4, 8, 16, 32, then extended in both directions. + * Threshold |Z| > 6; recurse on the pieces. + * **Region CN** = argmax_k Σ log L_k. **Confidence** = Σ log L_k − Σ log L_2 (report threshold 35). Probe-gap filter 1 Mb. + * Filters: CN1 on X/Y in males is removed; Y is ignored in females; BAF is ignored for Intensity_Only probes. + * **CN-LOH:** homozygosity detector on CN2 regions, MinHomozygousRegionSize 10 Mb. + * **Homozygosity Detector:** E_het = Σ 2f_i(1−f_i) and χ² = N·E_het/(N−E_het), with cut-off 23.5 and ≥ 50 SNPs. + * **LOH Score** = log10 Π P(gt|LOH)/P(gt|noLOH), with P_error = 0.001. +* **MoChA** — Loh et al. 2018, Nature 559:350, https://doi.org/10.1038/s41586-018-0321-x ; Loh et al. 2020, Nature 584:136, https://doi.org/10.1038/s41586-020-2430-6 [SCIENTIFIC LITERATURE] + * Detects **mosaic** chromosomal alterations using *phased* BAF: at heterozygous sites, allelic imbalance appears as |BAF−0.5| with a consistent haplotype sign. + * An HMM over phased hets tolerates phase switch errors; LRR classifies loss / gain / CN-LOH. + * Sensitive to cell fractions of a few percent. Open-source: https://github.com/freeseek/mocha [OPEN-SOURCE IMPLEMENTATION] +* **Reference-product CNV** [PUBLIC DOCUMENTATION] [ref-docs:home] + * Inputs: a "Cytogenetics model file (.dat) … contains probe GC content information"; a "PGx CN model file (.dat)" paired to the manifest; a mask file (.msk) for CN training. + * PGx CN analysis needs ≥ 24 samples, with ≥ 22 passing LogR dev < 0.2. + * Output VCF QUAL is Phred-scaled and capped at 60. + * The **model internals are not published.** [HYPOTHESIS] GC regression of LRR plus a per-probe reference (baseline) model, then HMM/segmentation. + +--- + +## 8. QC metrics + +**Per sample** [OPEN-SOURCE IMPLEMENTATION] / [PUBLIC DOCUMENTATION]: +* **Call rate** = NumCalls/(NumSNPs − NumIntensityOnly). Expectation > 0.99 for human products (tech note). +* **p10GC / p50GC:** the Illumina percentile (§3.2) of GenCall scores over loci with score > cutoff and not Intensity_Only. Sample GC10 < ~0.2 flags a poor DNA (GenCall tech note). +* **LogR dev:** SD of autosomal LRR (§5). Reference-product PGx CNV QC uses < 0.2. +* **Intensity percentiles:** P05/P50/P95 of raw X and raw Y over all loci (GTC v5, uint16). +* **Sex estimation** [OPEN-SOURCE IMPLEMENTATION] idat2gtc, describing the AutoCall versions. Only loci with GenTrain score ≠ 0 count. + * *v1* (AutoConvert 1.6): with more than 20 called X loci, male if X-het-rate ≤ 0.1, else female. + * *v2* (AutoConvert 2.0 / IAAP / ACLI): + * Requires autosomal call rate > 0.97, estimated on up to 10,000 random autosomal loci, and ≥ 20 Y loci / ≥ 100 autosomal loci. + * Then: median R of Y loci > 0.3 → M. Else if X loci < 20 → F. Else median R of X loci > 0.9 → F, otherwise U. + * IAAP 1.1 had a bug counting null-cluster loci as missing. + * Output 'M', 'F' or 'U'. +* **Sex from genotypes** (literature): X heterozygosity / PLINK F on X (F > 0.8 male, < 0.2 female), plus Y intensity. Laurie et al. 2010 combine X and Y intensities with X-het to separate sex mix-ups from aneuploidy. [SCIENTIFIC LITERATURE] https://doi.org/10.1002/gepi.20516 +* **Heterozygosity rate / inbreeding F:** flag samples beyond ±3 SD of the mean het rate. Anderson et al. 2010, Nat Protoc 5:1564, https://doi.org/10.1038/nprot.2010.116 [SCIENTIFIC LITERATURE] +* **Contamination:** + * **VerifyIDintensity** — Jun et al. 2012, AJHG 91:839, https://doi.org/10.1016/j.ajhg.2012.09.004 [SCIENTIFIC LITERATURE]. + * Models the observed allele intensity ratio as a mixture of (1−α) of the true sample and α of an unknown contaminant drawn from population allele frequencies. + * Per-genotype Gaussian intensity components; α is estimated by maximum likelihood over pairs of genotypes weighted by HWE priors. + * Detects contamination down to about 1%. + * **BAFRegress** (same group; http://genome.sph.umich.edu/wiki/BAFRegress; reimplemented in gtc2vcf `BAFregress.c`) [OPEN-SOURCE IMPLEMENTATION]: + * Use sites with population B-allele frequency p ∈ [0.1, 0.9]. + * AA-called sites: regress y = BAF − median_AA(BAF) on x = p. + * BB-called sites: regress y = 1 − (BAF − (median_BB(BAF) − 1)) on x = 1 − p. + * OLS slope m = (nΣxy − ΣxΣy)/(nΣx² − (Σx)²) is the contamination estimate (E[BAF|AA] ≈ α·p). The median adjustment needs ≥ 5 genotypes per cluster. +* **Relatedness / identity:** KING robust kinship (Manichaikul et al. 2010, https://doi.org/10.1093/bioinformatics/btq559); PLINK IBD π̂. [SCIENTIFIC LITERATURE] + +**Per locus** [OPEN-SOURCE IMPLEMENTATION] locus_summary.py, reproducing GenomeStudio: +* Call_Freq = calls/(calls+nocalls). Genotype frequencies are over calls. +* Minor_Freq = min(p_A, 1−p_A), where p_A = (2·AA+AB)/(2·calls). +* **Het_Excess:** + * q = Minor_Freq, p = 1−q, k = (0.013/q)⁴. + * dh = (AB/calls + k)/(2pq + k) − 1. + * ChiTest_P100 = 2Φ(dh; 0, 0.1) if dh < 0, else 2(1 − Φ(dh; 0, 0.1)). + * If there are no calls → (0,0). If monomorphic → (1,0). +* GC10/GC50 per locus use the same percentile rule. + +**Locus filter thresholds** (hard cut-off / grey zone) [PUBLIC DOCUMENTATION] technote_infinium_genotyping_data_analysis.pdf, Table 1: +* Call_Freq < 0.97 / ≤ 0.99 +* Cluster Sep ≤ 0.3 / < 0.45 +* AA/AB/BB R Mean ≤ 0.2 / < 0.4 +* 10%GC ≤ 0.3 (grey) +* Het Excess > 0.2 (grey; the text also says < −0.3) +* AB T Mean < 0.2 or > 0.8 (grey) +* AA T Mean > 0.3 when A/A_Freq = 1, etc. +* **Cluster Sep definition:** "separation between the three genotype clusters in the theta dimension", range 0–1. The exact formula is **unpublished**. + +--- + +## 9. Pharmacogenomics on arrays + +* **Reference-product PGx** [PUBLIC DOCUMENTATION] [ref-docs:home] ; [ref-docs:dev-article-1.0-pgx] + * Star-allele calling from array genotypes, with definitions from **PharmVar/PharmGKB**. Phenotype is looked up in **CPIC or DPWG**. + * Star-allele-specific copy numbers; CYP2D6 call rate > 97%. + * CYP2D6 CN is measured at sub-gene regions (e.g. CYP2D6.exon.9, CYP2D6.intron.2, CYP2D6.p5), which enables detection of hybrids and deletions/duplications. + * Inputs: PGx database .zip (variant mapping), PGx CN model .dat, mask .msk. + * Supported products: GDA-ePGx, GSAv4-ePGx, GCRA-ePGx. + * The internal diplotype-scoring and CN algorithms are **not published**. +* **Star-allele nomenclature:** PharmVar — Gaedigk et al. 2018, CPT 103:399, https://doi.org/10.1002/cpt.910 [SCIENTIFIC LITERATURE] +* **Diplotype inference from genotypes:** PharmCAT — Sangkuhl et al. 2020, CPT 107:203, https://doi.org/10.1002/cpt.1568. It matches observed alleles against allele-definition tables and scores candidate diplotypes by the number of matched defining positions. [SCIENTIFIC LITERATURE] +* **CYP2D6 SV/CN** (NGS read-depth paradigm, adaptable to array LRR): Stargazer — Lee et al. 2019, Genet Med 21:361, https://doi.org/10.1038/s41436-018-0054-0. Uses paralog-specific CN (CYP2D6 vs CYP2D7) and handles hybrids. [SCIENTIFIC LITERATURE] +* **Array-based CYP2D6 CNV caller + PGx passport pipeline:** Asterix — Lanting et al. 2025, AJHG 112:1015, https://doi.org/10.1016/j.ajhg.2025.03.003. Clinically validated calling, phasing and imputation for 12 genes plus a CYP2D6 CNV tool on biobank arrays. [SCIENTIFIC LITERATURE] +* **Suggested SimurgArray approach** [HYPOTHESIS]: + 1. Per-probe LRR normalised against a batch reference, restricted to probes in CYP2D6 sub-regions and flanking CYP2D7/REP regions, with a GC regression. + 2. Classify CN per sub-region with a Gaussian mixture on the median LRR. Train on ≥ 24 samples, mirroring the reference product's minimum. + 3. Combine region CNs into structural haplotypes (*5 deletion, xN duplications, *36/*13 hybrids). + 4. Assign SNV-defined star alleles PharmCAT-style, with CN-consistent BAF checks (e.g. BAF ≈ 1/3 or 2/3 for a duplication). + +--- + +## 10. Summary: specified vs unknown + +**Fully specified publicly** (can be implemented and verified bit-for-bit or near): +* IDAT v3, BPM (locus entry v4–v8), EGT (v3, data blocks 5–9) and GTC v3–5 binary layouts. +* The normalization transform application, θ/R, BAF/LRR interpolation and LogR dev. +* Genotype codes, TOP/BOT/A-B rules, base-call strand conversion. +* Normalization-bin lookup including the mod-256 wrap. +* Sample stats (call rate, GC10/GC50 percentile rule, intensity percentiles). +* Locus summary statistics including Het Excess. +* cnvPartition likelihood model and segmentation statistic. +* The 0.15 no-call threshold. + +**Reproduced only in third-party open source** (idat2gtc, MIT; derived from Illumina binaries and source): +* The normalization *fit* (robust fits, sweeps, trims, 192/400 constants). +* The GenCall Bayesian call and score (flair, modilik, sub-scores, gbell map). +* Sex-estimation rules. +* Use it as a test oracle; legal review is recommended before direct porting. *(Superseded: plan §2 allows MIT reuse with attribution.)* + +**Unknown / proprietary:** +* GenTrain clustering internals (preliminary clustering, model scoring weights, ANN weights for missing clusters). +* GenTrain score and Cluster Sep formulas. +* The EGT's unused per-record floats. +* The "DNA score" penalty. +* The reference product's CNV and PGx-CN models (.dat) and star-allele diplotype scoring. +* Whether the reference product's genotyping is byte-identical to ACLI [HYPOTHESIS: yes, GenTrain 3 / normalization 1.2.0]. + +## Key URLs (formats) +* GTC spec PDF: https://github.com/Illumina/BeadArrayFiles/blob/develop/docs/GTC_File_Format_v5.pdf +* BeadArrayFiles modules: https://github.com/Illumina/BeadArrayFiles/tree/develop/module +* illuminaio IDAT readers: https://github.com/HenrikBengtsson/illuminaio/tree/master/R +* gtc2vcf / idat2gtc / BAFregress: https://github.com/freeseek/gtc2vcf +* Public Illumina manifests and EGTs (FTP list): https://github.com/freeseek/gtc2vcf/blob/master/Illumina.md diff --git a/docs/research/R4_datasets.md b/docs/research/R4_datasets.md new file mode 100644 index 0000000..a8b0e84 --- /dev/null +++ b/docs/research/R4_datasets.md @@ -0,0 +1,161 @@ +# R4 — Public datasets and resources for building and validating SimurgArray + +> **Archived Phase-0 study (sanitized copy, see `README.md`).** Written 2026-09-27, before the decisions in +> `SIMURGARRAY_MASTER_PLAN.md` §2. The analysed vendor product is called "the reference product" and its CLI +> `refcli`; its documentation URLs are replaced by `[ref-docs:…]` tokens. Where this file speaks of a clean room, +> legal clearance, or running/benchmarking the vendor binary, plan §2 supersedes it: personal research; MIT/BSD/Apache +> code may be reused with attribution; GPL tools are subprocess oracles only; vendor binaries are never run for +> comparison, inspected or decompiled; oracles are published vendor-produced GTCs, gtc2vcf and BeadArrayFiles. + +Survey date: 2026-09-27. Every item marked "verified" was checked live (FTP listing, HTTP HEAD, GEO SOFT/E-utilities, or remote ZIP central-directory read), not just taken from search snippets. Items marked "reported" come from web search or documentation only. + +--- + +## 0. TL;DR — the datasets that matter most + +| Rank | Dataset | Why it matters | +|---|---|---| +| 1 | **1000 Genomes Broad Omni2.5-4v1 IDATs+GTCs, 2,141 samples** (plus BPM, 2 EGTs, CSV) | The largest fully open raw IDAT set. It includes Illumina's own GTCs to compare against GenCall, **337 complete trios**, NA12878/NA12891/NA12892, and NYGC 30x WGS truth for nearly every sample. | +| 2 | **GEO GSE165845: GSA (GSAMD-24v1/"v3"), 120 1000G samples x 3 replicates, IDAT+VCF** | Open GSA IDATs. It has triplicate reproducibility, includes NA12878, and has 30x truth. | +| 3 | **Illumina demo IDATs: GSA v4 ePGx (36 samples), GCRA ePGx (36), GDA ePGx (480), GDA v1 (36)** | These are exactly what the reference product's own tutorials run on. They are downloadable without login. The GDA v1 sheet lists **3 CEU trios (incl. NA12878) and 7 technical replicates**. | +| 4 | **GEO GSE96909 (Haraksingh 2017): NA12878 in duplicate on 9 Illumina designs** | Cross-array consistency for a single GIAB sample (OmniExpress, Omni2.5-8, Omni2.5Exome, Omni5, Omni5Exome, CoreExome, OmniExpressExome, PsychArray, CytoSNP-850K). Also a CNV gold-standard study. | +| 5 | **GIAB v4.2.1 (HG001–HG007) + NYGC 1kGP 30x (3,202 samples, 602 trios) + the vendor's public 1000 Genomes WGS reanalysis (AWS Open Data)** | Truth for SNV concordance, plus CNV/SV truth. | + +--- + +## 1. Master table + +Legend: IDAT? = raw IDAT pairs downloadable. Truth? = an orthogonal (WGS/benchmark) genotype truth exists for the samples. + +| # | Name | URL | Array | n samples | Raw IDAT? | Truth? | Access / license | Use in SimurgArray | +|---|---|---|---|---|---|---|---|---| +| 1 | 1000G Omni2.5 – Broad (verified) | ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/release/20130502/supporting/hd_genotype_chip/broad_intensities/ | HumanOmni2.5-4v1 (B/H manifests) | 2,141 (21 pops; 337 complete trios per 1000G ped; includes NA12878, NA12891, NA12892, NA19238/39/40) | **Yes**: `Omni25_idats_gtcs_2141_samples.tgz` (106.9 GB, IDAT+GTC). Also raw and normalized intensity text (22 GB / 17 GB) | Yes: NYGC 30x, 1kGP phase 3, the reference product reanalysis. GIAB for NA12878 | Open (IGSR, Fort Lauderdale / open use) | Primary large-scale validation for normalization, GenCall re-implementation (vs bundled GTCs), clustering (GenTrain on 2k samples), LRR/BAF, Mendelian error, CNV. The directory also ships `HumanOmni2.5-4v1-Multi_B.bpm`, `…_B.egt`, `…_H.egt`, `HumanOmni2.5-4v1_B.csv` | +| 2 | 1000G Omni2.5 – Sanger (verified) | …/hd_genotype_chip/sanger_intensities/ | HumanOmni25M-8v1-1_B | 177 (79 CEU, 28 YRI, …) | **Yes**: `ALL.wgs.sanger_omni_2_5_8.20130805.snps.genotypes.idats.tar.gz` (6.2 GB). Also a GenomeStudio FinalReport (11 GB). Sanger internal IDs map via `…internal_to_coriell_id.map` | Yes (as above) | Open | A second Omni2.5 design version (8-sample chip). The GenomeStudio FinalReport gives **GenomeStudio reference output** (GType, X/Y, LRR/BAF) to diff against | +| 3 | 1000G combined Omni VCF (verified) | …/hd_genotype_chip/ALL.chip.omni_broad_sanger_combined.20140818.snps.genotypes.vcf.gz | Omni2.5 | 2,318 | No (calls only) | — | Open | Reference array calls (GRCh37) | +| 4 | GEO **GSE165845** (verified) | https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE165845 ; FTP …/geo/series/GSE165nnn/GSE165845/suppl/ | Infinium GSA (GPL23391, GSAMD-24v1-0 manifest; the series design says "GSA v3") | 120 1000G individuals (60 EUR, 60 AFR) **x 3 replicates = 360** (includes NA12878, NA19238, NA19239, HG00096, …; 91 overlap the Omni2141 set) | **Yes** (RAW.tar 45 GB; per-sample `_Grn/_Red.idat.gz` plus per-sample VCF) | Yes (NYGC 30x; GIAB for NA12878) | Open (GEO). Paper: Li et al. 2021 Genome Res, PMID 33536225 | GSA-class validation: triplicate reproducibility, concordance vs 30x, and a cross-array check vs Omni on the same 91 people | +| 5 | Illumina **GSA v4.0 ePGx Demo** (verified) | https://support.illumina.com/downloads/infinium-gsa-v4-pgx-demo-data-set-iscan.html → `…/infinium-gsa-pgx/idats_Demo_36.zip` | GSA-PGx-48v4-0_20079540_E2 | 36 (72 IDATs, 3 BeadChips; also iScan .sdf/.xml/.jpg/Metrics.txt) | **Yes** (872 MB, no login) | Sample identities not published (the "Demo_36" naming suggests a Coriell panel like the GDA sheet: unconfirmed) | Illumina website terms: RUO, "personal, non-commercial", **no redistribution** | Primary the reference product compatibility target (GSA v4 is the flagship). Run the reference product and SimurgArray on it and diff GTC/VCF/PGx outputs | +| 6 | Illumina **GCRA ePGx Demo** (verified) | `…/infinium-gcra-pgx/idats_Demo_36.zip` (linked from the reference-product downloads page) | GCRA-PGx-24v1-0 C2 | 36 (72 IDATs, 6 chips) | **Yes** | Unknown identities | Illumina terms | Second design for compatibility tests | +| 7 | Illumina **GDA ePGx Demo** (verified) | https://support.illumina.com/downloads/infinium-gda-pgx-demo-data-set-iscan.html → https://s3.amazonaws.com/webdata.illumina.com/downloads/productfiles/global-diversity-array-pgx/GDAPGx_Demo_idats.zip | GDA_PGx-8v1-0 | **480** (960 IDATs, 60 chips; per-chip `_qc.txt`) | **Yes** (16.5 GB) | Unknown identities | Illumina terms | Large-batch GDA test, and a test of clustering/normalization at scale on an 8-sample chip | +| 8 | Illumina **GDA v1.0 Demo 36** (verified) | https://webdata.illumina.com/downloads/productfiles/global-diversity-array/infinium-global-diversity-array-8-v1-0-D1-demo-data-36.zip ; sheet: https://support.illumina.com/content/dam/illumina-support/documents/downloads/productfiles/global-diversity-array/infinium-global-diversity-array-8-v1-0_D1_SampleSheet_Demo_36.csv | GDA-8v1-0_D1 | 36 = CEU Coriell. **Trios NA12878/NA12891/NA12892, NA12801/12812/12813, NA12864/12872/12873**; replicates of NA06993, NA06994, NA11920, NA11993, NA12740, NA12814 | **Yes** (465 MB) | Yes: all are 1000G/NYGC 30x samples. NA12878 has GIAB | Illumina terms | **Best small end-to-end fixture**: it has a trio (Mendelian), replicates (reproducibility) and GIAB truth, and the sample sheet already has Parent1/Parent2/Replicate columns | +| 9 | GEO **GSE96909** (Haraksingh et al. 2017) (verified) | https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE96909 (SubSeries GSE96723/789/790/791/810/816/846/893/895) | OmniExpress-24, OmniExpressExome-8, Omni2.5-8, Omni2.5Exome-8, Omni5-4, Omni5Exome-4, CoreExome-12, PsychArray-24, CytoSNP-850K (plus Affy/Agilent) | NA12878 x 2 replicates per array (30 total) | **Yes** (4.3 GB RAW.tar) | Yes (GIAB HG001; paper used a 1000G WGS CNV gold standard) | Open; BMC Genomics 18:321, PMID 28438122 | Cross-design test: the same genome across many BPMs. CNV calling benchmark; replicate concordance | +| 10 | GEO GSE178131 (verified) | GEO GSE178131 | Omni5-4 v1.1 | 4 (incl. GM12878) | Yes (839 MB) | NA12878 → GIAB | Open | Extra Omni5 NA12878 | +| 11 | GEO **GSE196829** (OneK1K) (verified) | GEO GSE196829 | GSA-24 (GPL28939) | 1,104 | Yes (11 GB RAW.tar) plus genotype matrix (12 GB) | No WGS truth | Open | Large real-world GSA cohort: clustering/QC at scale, call-rate distributions, sex checks | +| 12 | GEO GSE184150 / GSE199322 / GSE276944 (reported via esummary) | GEO | GSA | 646 / 224 / 509 | Yes (IDAT+CSV) | No | Open | Extra GSA cohorts for robustness | +| 13 | GEO GSE209804 (verified) | GEO GSE209804 | Omni5-4 v1.1 | 24 = 8 CEPH/Utah LCLs x DNA input (50 ng, 500 pg, 100 pg) | Yes (+VCF) | CEPH LCLs in 1000G (to verify per ID) | Open | Low-input / degraded-DNA stress tests (call rate, GenCall score behaviour) | +| 14 | GEO GSE19247 (verified) | GEO GSE19247 | HumanCNV370-Quad v3, HumanCytoSNP-12 v2 | 622 (single-cell MDA/WGA + bulk; **Coriell families 1463, 1423, 1990**) | Yes (2.5 GB) | Pedigree/bulk parents | Open | Pedigree (CEPH 1463 = Platinum Genomes family) on CytoSNP-12. Mendelian tests; noisy-data robustness | +| 15 | GEO GSE87838 / GSE87915 (verified) | GEO | Omni1-Quad, Omni2.5Exome-8 | 13 Illumina samples (4 trios + singleton, de novo CNV) | Yes | CNV validated in paper | Open | De novo CNV / trio CNV tests | +| 16 | Other GEO genotyping IDAT series (verified list) | E-utilities query: `IDAT[Supplementary Files] AND gse[Entry Type] AND ("SNP genotyping by SNP array"[DataSet Type] OR "genome variation profiling by SNP array"[DataSet Type])` → **254 series** | CytoSNP-12/850K, OmniExpress, Omni2.5/5, HumanHap550/610/660, 1M, CoreExome, PsychArray, MEGA, ASA, GSA | varies | Yes | Mostly no | Open | Format and design diversity (IDAT versions, old chips, 12/24/48-sample chips) for parser fuzzing and regression | +| 17 | Bioconductor **hapmap370k** (reported) | https://bioconductor.org/packages/hapmap370k | HumanHap/CNV370 Duo | 40 HapMap | Yes (in package) | 1000G/HapMap (CEU/YRI etc.) | Artistic-2.0 (Bioc) | Small, redistributable-by-license regression fixture for the IDAT reader and normalization | +| 18 | Bioconductor **IlluminaDataTestFiles** 1.50.0 (verified) | https://bioconductor.org/packages/IlluminaDataTestFiles | 370k genotyping (single Red IDAT `4019585376_B_Red.idat` + `.gz`), 450k, HT-12, WG-6 | — | Yes (tiny) | No | Artistic-2.0 | **Unit tests for the IDAT parser**: old and new formats, gzip handling. Safe to vendor in CI | +| 19 | PennCNV example (reported) | https://penncnv.openbioinformatics.org/ ; https://github.com/WGLab/PennCNV (example/) | HumanHap550 | 1 trio | No (LRR/BAF text only) | — | PennCNV license (open, non-commercial terms, check) | Expected PennCNV CNV output for the LRR/BAF → CNV stage | +| 20 | gtc2vcf docs (verified) | https://github.com/freeseek/gtc2vcf ; HapMap.md | — | — | Ships none; points to 1000G Omni FTP, GPL6986, GPL20641 | — | MIT | Reference implementation to diff against. HapMap.md gives manifests: GEO GPL20641 supplementary has `HumanOmni2.5M-8v1-1_B.bpm.gz` and `.csv.gz` (verified) | +| 21 | The vendor's public 1000 Genomes WGS reanalysis (AWS Open Data) (reported) | [ref-data:vendor-1kg-wgs-reanalysis-registry] ([ref-data:vendor-1kg-wgs-reanalysis-s3] etc.) | WGS | 3,202 (602 trios) | — | **Truth**: SNV/indel, SV, **CNV**, ROH, PGx star alleles, HLA | Open S3; license "TBD" | CNV/ROH/PGx truth matched to the reference product's own conventions. Ideal for reference-product-style CNV and PGx comparisons on the Omni2141/GSE165845 samples | +| 22 | All of Us array data (reported) | https://support.researchallofus.org/hc/en-us/articles/29475228181908 | GDA-based AoU array | ~447k | Yes (IDATs, controlled tier) | srWGS for a large subset | **Controlled** (Researcher Workbench, data use agreement; cloud-only) | Optional large-scale GDA validation if an approved researcher is involved | +| 23 | dbGaP / EGA studies (reported) | dbGaP (e.g. GENEVA/PAGE-era studies), EGA | various | various | Often yes | Sometimes | **Controlled** | Only if an application exists; not needed for core development | + +--- + +## 2. Manifests (BPM/CSV) and cluster files (EGT) + +All verified by link extraction or HTTP 200 without login unless noted. + +| Array | Page | Files | +|---|---|---| +| GSA v4 ePGx (GSA-PGx-48v4-0_20079540_E2, hg38) | https://support.illumina.com/array/array_kits/infinium-global-screening-array-v4-pgx/product-files.html | `…_E2_bpm.zip` (29.5 MB, 200 OK no login), `…_E2_csv.zip`, `…_E2_ClusterFile.zip` (EGT), `…_E2_mask_file.zip`, `…_E2_pgx_model.zip`, `…_E2.zip` (bundle), `…_E2_b155_rsids.zip`, `…_E2.hg38.annotated.zip`, `GSAePGx_GS_import_v4.zip`, `DAv1.4.0-rc2-pgx-mapping-…zip`, sample sheet template, CN model and database files | +| GSA v4 (non-PGx; GSA-48v4-0_20085471_D2) | https://support.illumina.com/array/array_kits/infinium-global-screening-array/downloads.html | `GSA-48v4-0_20085471_D2.zip`, `InfiniumGlobalScreeningArrayv4.0ClusterFile-egt.zip` | +| GSA v3 (GSA-24v3-0 A1/A2) | https://support.illumina.com/downloads/infinium-global-screening-array-v3-0-product-files.html | `GSA-24v3-0-A1-manifest-file-bpm.zip`, `…-csv.zip`, `GSA-24v3-0-A1-cluster-file.zip`, A2 BPM/CSV, LIMS descriptor | +| GSA v1/v2 | https://emea.support.illumina.com/downloads/infinium-global-screening-array-v1-0-product-files.html , …-v2-0-product-files.html | BPM/CSV/EGT, annotated, rsID, coordinate-duplicate, MNV lists | +| GDA v1 (D1/D2) | https://support.illumina.com/array/array_kits/infinium-global-diversity-array/product-files.html | `https://webdata.illumina.com/downloads/productfiles/global-diversity-array/infinium-global-diversity-array-8-v1-0-D1-manifest-file-bpm.zip`, `…-csv.zip`, `…-D1-cluster-file.zip`, D2 BPM/CSV | +| GDA ePGx | https://support.illumina.com/array/array_kits/infinium-global-diversity-pgx/product-files.html | `gda+epgx-product-files-build-37.zip`, `gda+epgx-product-files-build-38-for--v1-1.zip`, the reference product model/database files, rsID files | +| GCRA ePGx | Reference-product downloads page [ref-docs:downloads] | BPM, CSV, EGT, mask, pgx_model | +| Omni2.5-4v1 | 1000G FTP broad_intensities (above) | BPM, EGT (B and H), CSV. **Hosted on the open 1000G FTP, not only on Illumina** | +| Omni2.5-8 v1.1 | GEO GPL20641 supplementary (`GPL20641_HumanOmni2.5M-8v1-1_B.bpm.gz`, `.csv.gz`); 1000G sanger dir (`HumanOmni25M-8v1-1_B.csv`, `.bpm.csv`) | BPM/CSV (no EGT) | +| HumanCNV370 | GEO GPL6986 CSV; legacy `ftp://webdata:webdata@ftp.illumina.com/…` (per gtc2vcf HapMap.md) | BPM/EGT (legacy FTP may be dead) | +| Reference-product config | Reference-product downloads page | `config_genotyping.zip`, `config_genotyping_EX.zip`, sample-sheet templates (cloud and local) | + +**License and redistribution.** Illumina product files carry no explicit data license. The Illumina website legal terms (https://www.illumina.com/company/legal.html) grant viewing and downloading for "personal, non-commercial use only". They forbid modifying, reproducing, distributing or creating derivative works, and require copyright notices to be retained. Pages mark files "For Research Use Only". + +What this means for SimurgArray: +- **Do not vendor or redistribute Illumina BPM/EGT/CSV or demo IDATs** in the repo, test fixtures or containers. +- Ship a **fetch script** that downloads them from the Illumina URLs above, with checksums, at test time. +- Manifests redistributed on GEO (GPL supplementary) and the 1000G FTP are publicly posted by third parties. The underlying Illumina copyright still arguably applies, so treat them the same way (download, don't bundle). +- Bioconductor test IDATs (Artistic-2.0) are the only raw-IDAT fixtures that are clearly safe to redistribute. + +--- + +## 3. Truth sets + +| Truth set | URL (verified unless noted) | Use | +|---|---|---| +| GIAB v4.2.1 small variants HG001–HG007 (GRCh37/38) | https://ftp-trace.ncbi.nlm.nih.gov/ReferenceSamples/giab/release/NA12878_HG001/NISTv4.2.1/GRCh38/ (and `AshkenazimTrio/HG002…`, `ChineseTrio/HG005…`) | Array SNV concordance inside benchmark BEDs for NA12878. Note: **GIAB has no Infinium array data** (checked HG001/HG002/HG005 data dirs). The only public HG001 IDATs are GSE96909, GSE165845, GSE178131, the GDA v1 demo and 1000G Omni. No public HG002–HG007 genotyping IDATs were found | +| GIAB HG002 SV v0.6 (Tier1) | …/AshkenazimTrio/HG002_NA24385_son/NIST_SV_v0.6/ | CNV/SV truth (HG002 only; no array IDAT for HG002) | +| Platinum Genomes 2017-1.0 (NA12877/NA12878, CEPH 1463) | https://github.com/Illumina/PlatinumGenomes ; `aws s3 cp s3://platinum-genomes/2017-1.0 . --recursive --no-sign-request` (reported) | Extra NA12878 truth with inheritance validation. The newer Platinum Pedigree (long-read, Nature Methods 2025) also covers CEPH 1463 | +| 1kGP NYGC 30x high coverage, 3,202 samples / 602 trios | https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/1000G_2504_high_coverage/working/20220422_3202_phased_SNV_INDEL_SV/ (phased SNV/INDEL/SV per chr); pedigree `…/working/1kGP.3202_samples.pedigree_info.txt` | **Main truth for Omni2141 and GSE165845** (all samples covered). SV calls in the same VCF | +| 1kGP phase 3 SV map | https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/phase3/integrated_sv_map/ | Deletion/duplication truth (GRCh37) | +| vendor 1000 Genomes WGS reanalysis CNV/SV/ROH/PGx | [ref-data:vendor-1kg-wgs-reanalysis-registry] | CNV truth in the vendor's sequencing-pipeline conventions. Used by the Genomics 2024 CNV-tool benchmark on the Omni2.5 IDAT set | +| 1000G pedigree (phase 3) | ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/working/20130606_sample_info/20130606_g1k.ped | Trio definitions for Mendelian error (337 complete trios within Omni2141, verified) | + +--- + +## 4. Strand / annotation / reference resources + +| Resource | URL | Notes | +|---|---|---| +| Will Rayner strand files | https://www.chg.ox.ac.uk/~wrayner/strand/ (old: well.ox.ac.uk, which redirects here); ilmnStrand/, sourceStrand/ subdirs; RefAlt files at http://mccarthy.well.ox.ac.uk/2016/07/files-to-update-refalt-on-illumina-chips/ | Per-chip, per-build (b36/b37/b38) `.strand`, `.miss`, `.multiple` and RefStrand/RefAlt files. Covers GSA versions, Omni, OmniExpress, CytoSNP, GDA (reported). The site returned CloudFront 403 to automated access, so check it in a browser. No explicit license: use as an **independent cross-check** of SimurgArray's own probe-sequence-to-reference alignment (TOP/BOT → REF/ALT), not as a shipped dependency | +| Illumina annotated/rsID files | per-array product pages (b150/b153/b155 rsIDs, hg38 annotated) | Locus-to-rsID mapping as the reference product uses it | +| GRCh37 (1000G) | ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/human_g1k_v37.fasta.gz | gtc2vcf default | +| GRCh38 no-alt analysis set | ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/000/001/405/GCA_000001405.15_GRCh38/seqs_for_alignment_pipelines.ucsc_ids/GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.gz | Public domain (NCBI) | +| dbSNP (b155/b156) | https://ftp.ncbi.nlm.nih.gov/snp/latest_release/VCF/ | Public domain; rsID annotation | +| Illumina BeadArrayFiles | https://github.com/Illumina/BeadArrayFiles | BSD-2. GTC/BPM/EGT format reference (no test data) | +| Illumina GTCtoVCF | https://github.com/Illumina/GTCtoVCF | Apache-2.0, semi-archived. Reference for VCF conventions (no test data) | +| freeseek gtc2vcf | https://github.com/freeseek/gtc2vcf | MIT. IDAT→GTC (GenCall-like), GTC→VCF, BAF/LRR | + +--- + +## 5. Trio and replicate datasets with IDATs (Mendelian error and reproducibility) + +| Dataset | Trios | Replicates | Array | +|---|---|---|---| +| 1000G Omni2141 | **337 complete trios** (ped-based, verified) | Some cross-center duplicates (Broad vs Sanger overlap) | Omni2.5-4 / -8 | +| GSE165845 | none complete (only partial, e.g. NA19238/NA19239) | **120 x 3 technical replicates** | GSA | +| Illumina GDA v1 Demo_36 | **3 CEU trios** (incl. NA12878) | 6 replicate pairs | GDA-8v1-0 | +| GSE96909 | — | NA12878 x2 on each of 9 designs | multiple | +| GSE19247 | Coriell families 1463/1423/1990 (bulk plus single-cell) | many single-cell replicates | CNV370 / CytoSNP-12 | +| GSE87838/87915 | 4 clinical trios | — | Omni1 / Omni2.5Exome | +| GSE209804 | CEPH | 8 samples x 3 input amounts | Omni5-4 | + +--- + +## 6. Published benchmarks: the reference product vs GenomeStudio vs gtc2vcf + +- **No independent, peer-reviewed head-to-head benchmark of the reference product vs GenomeStudio vs gtc2vcf genotype calls was found.** +- Illumina's reference-product documentation (release notes, output-file docs) says the outputs are "concordant" with previous solutions but gives no numbers. It also documents convention differences: the reference product orients BAF/LRR to reference-genome REF=A/ALT=B, while GenomeStudio is reference-agnostic, so BAF can appear as 1 − GS value. See [ref-docs:output-files] . SimurgArray must replicate this orientation. +- The gtc2vcf README makes no quantitative GenomeStudio comparison. +- The closest public evidence is below. + +| Study | URL | Key facts | +|---|---|---| +| Establishing analytical validity of BeadChip array genotype data by comparison to WGS and benchmark datasets (2022) | https://pmc.ncbi.nlm.nih.gov/articles/PMC8919546/ | GSA-24 v1.0, 263 Coriell samples in triplicate (789 assays), GenomeStudio 2.0.2 plus AutoConvert/GenCall, `gtc_to_vcf.py` 1.1.1. Concordance 0.9932 (GSA) vs 0.9981 (WGS) against 1KG. WGS BAMs in SRA PRJNA792997. **IDATs not deposited.** Its metrics are a template for SimurgArray's validation protocol | +| A systematic benchmark of CNV detection tools for high-density SNP arrays (Genomics 2024) | https://www.sciencedirect.com/science/article/pii/S0888754324001836 | Uses the **1000G Omni2.5 IDAT set (2,141 samples)** processed in GenomeStudio 2.0, with the vendor 1000 Genomes WGS reanalysis as CNV truth. PennCNV was best on precision/F1. Directly reusable design for SimurgArray's CNV module | +| Haraksingh et al. 2017 BMC Genomics | https://bmcgenomics.biomedcentral.com/articles/10.1186/s12864-017-3658-x | NA12878 on 17 array designs (IDATs in GSE96909). CNV benchmark vs 1000G WGS gold standard | +| COPILOT (containerised Illumina genotyping QC) | https://www.biorxiv.org/content/10.1101/2021.07.26.453753 | GenomeStudio-based QC protocol; useful QC metric definitions | + +**Implication.** SimurgArray's own validation will be the first public three-way comparison. Recommended protocol: +1. Run *(superseded: vendor-binary runs are not part of the plan, see plan §2; use published vendor-produced GTCs instead)* the reference product (local, free with Illumina login), GenomeStudio/IAAP-CLI, gtc2vcf and SimurgArray on the Illumina demo IDATs (GSA v4, GDA) and on the open GSE165845 and Omni2141 sets. +2. Report per-locus GT concordance, GenCall score correlation, LRR/BAF RMSE, call rate, and concordance to NYGC 30x / GIAB in benchmark regions. +3. Report Mendelian error rate (Omni trios, GDA demo trios) and replicate concordance (GSE165845 triplicates, GDA demo replicates). + +--- + +## 7. Practical download plan (sizes) + +1. **CI / small (under 1 GB):** Bioconductor IlluminaDataTestFiles (25 MB). GDA v1 Demo_36 (465 MB) plus its BPM/EGT. GSA v4 ePGx Demo (872 MB) plus the E2 BPM/EGT (fetched, not vendored). +2. **Medium:** GSE96909 (4.3 GB), GCRA demo, Sanger Omni 177 (6.2 GB; includes a GenomeStudio FinalReport for exact-output diffs). +3. **Large:** GSE165845 (45 GB), GDA ePGx demo (16.5 GB), Broad Omni2141 IDAT+GTC (107 GB; its GTCs give Illumina AutoCall reference output for 2,141 samples). +4. **Truth:** GIAB v4.2.1 HG001 (GRCh37/38); NYGC 3202 phased panel (only the relevant chromosomes/samples via `bcftools view -s`); 1000G ped; vendor 1000 Genomes WGS reanalysis CNV VCFs for the overlapping samples. + +## 8. Gaps + +- No public HG002–HG007 Infinium IDATs were found (GEO search for NA24385/NA24143/NA24149/NA24631 returned only methylation arrays). +- Demo-set sample identities for the GSA v4 / GCRA / GDA-ePGx demos are not published. Infer them by genotype matching against the NYGC 30x panel (a cheap first SimurgArray task). +- The Rayner strand site blocks scripted access (CloudFront 403); fetch it manually. diff --git a/docs/research/README.md b/docs/research/README.md new file mode 100644 index 0000000..41f729b --- /dev/null +++ b/docs/research/README.md @@ -0,0 +1,94 @@ +# Phase-0 research archive (sanitized) + +This folder holds the Phase-0 feasibility study behind SimurgArray, done on 2026-09-27 before any code was written. +It is the evidence base for `SIMURGARRAY_MASTER_PLAN.md` (the plan) and `SIMURGARRAY_FUNCTIONAL_SPEC.md` (the spec). +The files are a **sanitized copy** of the original working notes. Technical content, numbers, formulas, file-format +facts, verbatim messages and evidence tags are kept. Vendor product and platform brand names, and URLs that carry +them, have been replaced by the neutral terms and citation tokens described below. The raw downloaded documentation +pages and the cloned third-party repositories used during the study are **not** part of the repository. + +Where these files talk about a clean room, legal clearance, or running or benchmarking the vendor's binary, they +predate the project decisions. **Plan §2 supersedes them.** In short: this is a personal research project; +MIT/BSD/Apache-2.0/Unlicense code may be reused with attribution; GPL tools are subprocess oracles only; vendor +binaries are never run for comparison, inspected or decompiled; the oracles are published vendor-produced GTCs, +gtc2vcf and BeadArrayFiles. `00_phase0_report.md` records these as decisions D1–D3. + +## Files + +| File | What it is | +|---|---| +| `00_phase0_report.md` | Summary report: feasibility verdict, workflows, what is documented vs. undocumented, OSS landscape, the proposed architecture and phases, validation strategy, datasets, experiments, known unknowns, risk register, and **decisions taken** (D1 provenance, D2 no vendor-binary runs, D3 v1.0 scope). | +| `R1_reference_product.md` | Dossier of the reference product from public sources: lineage, installation and runtime, versions, workflows, algorithms (disclosed or not), PGx and cyto scope, CLI summary, outputs, QC metrics, methylation, EULA and licensing notes, related Illumina tech notes and OSS. | +| `R2_open_source_ecosystem.md` | Survey of about 45 open-source projects (licence, faithfulness to Illumina, reuse value), with source-level math and file:line references for gtc2vcf/idat2gtc, BeadArrayFiles, GTCtoVCF, Picard, PennCNV, mocha, PharmCAT, PyPGx and others. Ends with reuse recommendations per SimurgArray component. | +| `R3_science_formats_algorithms.md` | Science and formats: IDAT/BPM/CSV/EGT/GTC layouts, normalization, GenCall and GenTrain, BAF/LRR, strand conventions, QC metrics, CNV/LOH/mosaicism, PGx, methylation, with literature references. | +| `R4_datasets.md` | Public datasets (URLs, sizes, licences, truth availability): 1000G Omni2.5 with vendor GTCs, Illumina demo IDATs, GEO series, GIAB/NYGC truth, the vendor's public 1000 Genomes WGS reanalysis (AWS Open Data), strand files, published benchmarks. | +| `A_cli_inputs.md` | Line-by-line analysis of the reference CLI's local-analysis and input-file documentation: every command and option, documented behaviours, input file types and sample-sheet rules, verbatim error messages, numeric defaults, algorithm hints, and gap items **G1–G65** against the plan. | +| `B_outputs.md` | Every output file and schema (SNV/CNV/cyto VCF headers, GTC, bedGraph, PGx CSV/JSON, sample summaries, final report, locus summary, QC files), semantic rules (merging, ploidy, BAF/LRR orientation, filters, QUAL, CN and LOH encodings, ISCN, control-probe QC formulas), messages, thresholds, and numbered gap items **1–35**. | +| `C_qc_report_features.md` | The QC report (config YAML, thresholds, PASS/FAIL and flag logic, output files, HTML layout down to widgets, scale limits, multi-dataset handling) plus the applications/features page, verbatim messages, algorithm hints, and gap items **G1–G28**. | +| `D_cyto_methyl_pgx.md` | Cloud execution model, cloud genotyping, cytogenetics (parameters, event types, QC gating, ISCN), methylation QC (21 control thresholds, formulas, messages), PGx CNV and star-allele annotation (databases, coverage, scoring), FAQ, all numeric defaults, and numbered gap items **1–31**. | +| `E_release_history.md` | Release history v1.0 → v1.4 (plus cloud releases and documentation revisions): per-version changes, resolved-issue ledger, version-diff tables for commands, options, files and fields, internal hints, thresholds, and numbered gap items **1–48**. | +| `pgx_star_allele_coverage.csv` | Derived from the reference product's PGx coverage page: 2,405 rows (gene × allele), 58 genes. Columns `gene, allele, allele_kind, result_basis, n_alleles_for_gene, GDA_ePGx, GSAv4_ePGx, GCRA_ePGx, notes`. Described in `D_cyto_methyl_pgx.md` §5.6. | +| `pgx_masked_variants.csv` | Derived: 24 rows (product, manifest, gene, masked variant-ID list) of PGx variants masked per ePGx manifest. | + +## How the spec's `src:` tags map to these files + +The functional spec (§0.1) cites gap-analysis items from this archive with `src:` tags. The file letters and all item +numbers were kept **unchanged** during sanitization, so every tag still resolves: + +| Tag form | File | Where the item lives | +|---|---|---| +| `A-G5` | `A_cli_inputs.md` | §7 "Gap analysis vs SimurgArray plan", table row `G5` (items G1–G65, in sub-tables §7.1–§7.9) | +| `B-12` | `B_outputs.md` | §7 "Gap analysis vs the SimurgArray plan", numbered item 12 (items 1–35, §7.1–§7.8) | +| `C-G3` | `C_qc_report_features.md` | §5 "Gap analysis vs the SimurgArray plan", item **G3** (items G1–G28, §5.1–§5.6) | +| `D-7` | `D_cyto_methyl_pgx.md` | §9 "Gap analysis vs SimurgArray plan", numbered item 7 (items 1–31, §9.1–§9.4) | +| `E-20` | `E_release_history.md` | §5 "Gap analysis vs SimurgArray plan", numbered item 20 (items 1–48, §5.1–§5.10) | +| `B §3.2`, `C §1.6`, `D §5.4` … | same files | a numbered section rather than a gap item | +| `plan`, `plan §N` | — | the master plan, not this archive | + +## Evidence-tag legend + +The files were written by different research passes, so two tag vocabularies appear. They mean the same things: + +| Long form (R1, R3, R4) | Short form (report, R2, A–E) | Meaning | +|---|---|---| +| `[PUBLIC DOCUMENTATION]` | `[DOC]` | Public vendor documentation, tech notes, support pages, format specs, patents | +| `[SCIENTIFIC LITERATURE]` | `[LIT]` | Peer-reviewed papers and patents | +| `[OPEN-SOURCE IMPLEMENTATION]` | `[OSS]` | Behaviour read from public source code (file:line given) | +| — | `[OBS]` | Experimentally observed (none at Phase 0) | +| `[INFERRED]` | `[INF]` | Our inference from the evidence | +| `[HYPOTHESIS]` | `[HYP]` | Hypothesis still to be tested | + +Other markers: +- `[DOC-HOME]`, `[DOC-LOCAL]`, `[DOC-IN]`, `[DOC-OUT]`, `[DOC-QC]`, `[DOC-FAQ]`, `[DOC-APPS]`, `[DOC-REV]`, + `[DOC-V10-LOCAL]`, `[RN-1.0]` … `[RN-1.4]`, `[DL]`: short names for specific reference-product documentation pages, + defined in the table at the top of `R1_reference_product.md`. +- `[DOC-INCONSISTENCY]`: the vendor documentation contradicts itself; both variants are quoted. +- `[SCREENSHOT]`: read from a documentation screenshot, not from page text. +- `[xref]` / `[xref: file]` (in D): taken from a linked page outside the file's primary sources. +- `L:n`, `I:n` (in A) and similar: line numbers in the downloaded documentation page the item was read from. +- `[sic]`: an upstream typo kept on purpose. +- The spec's `[EMU]` / `[DIFF]` / `[OURS]` markers are defined in spec §0.1, not here. + +## Neutral naming used in these files + +| Term in these files | Refers to | +|---|---| +| the reference product, `[product]`, `` | The vendor's current Infinium array secondary-analysis software whose documented behaviour SimurgArray studies. `[product]` / `` stand for its name inside verbatim quotes, file names and message text (for example `_QC_Report_YYYY_MM_DD.html`). | +| `refcli`, `` | The reference product's CLI binary name, including in verbatim command lines and VCF `##source=` headers. | +| ACLI, "the vendor's earlier array CLI" | The predecessor command-line tool (v2.1, retired 2024-12). | +| the vendor cloud platform, vendor cloud UI, vendor cloud credits | The vendor's hosted analysis/data platform, its web UI and its billing credits. | +| a tertiary-interpretation platform, EMG | The vendor's clinical interpretation platform integrated with the cloud cyto workflow. | +| the vendor's public 1000 Genomes WGS reanalysis (AWS Open Data) | The vendor's reprocessing of the 3,202-sample 1kGP 30x WGS set, published on the AWS Open Data registry (SNV/indel, SV, CNV, ROH, PGx truth). | +| the vendor's sequencing pipeline / NGS product | The vendor's separate, FPGA-associated sequencing secondary-analysis product that shares the array product's brand. | +| SimurgArray, `simurg` | This project (earlier working name in the notes has been replaced). | +| `` | The local SimurgArray checkout. | + +## Citation tokens (URLs intentionally omitted) + +Tokens of the form `[ref-docs:…]`, `[ref-data:…]`, `[ref-license-server]`, `[ref-license-server-legacy]` and +`[ref-cloud-endpoint]` stand for **reference-product documentation pages, download pages, data-registry entries and +service hosts; URLs intentionally omitted** because they carry the vendor product brand. The token name follows the +page's path on the product's documentation site, for example `[ref-docs:output-files]`, +`[ref-docs:local-analysis/qc-report]`, `[ref-docs:release-notes-1.4.0]`, `[ref-docs:pharmacogenomics-pgx-reference/pgx-cnv-coverage]`. +All other URLs (Illumina tech notes and support +pages, GitHub, GEO, 1000 Genomes FTP, papers) are kept as they were. diff --git a/docs/research/pgx_star_allele_coverage.csv b/docs/research/pgx_star_allele_coverage.csv new file mode 100644 index 0000000..76123dd --- /dev/null +++ b/docs/research/pgx_star_allele_coverage.csv @@ -0,0 +1,2406 @@ +gene,allele,allele_kind,result_basis,n_alleles_for_gene,GDA_ePGx,GSAv4_ePGx,GCRA_ePGx,notes +ABCG2,Reference,reference,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ABCG2,rs2231142.G>T,rsid_variant_allele,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,Reference,reference,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,rs1229984.T>C,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,rs1229984.T>G,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,rs1229985.A>G,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,rs17033.T>C,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,rs1789891.C>A,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,rs2018417.C>A,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,rs2018417.C>T,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,rs2066702.G>A,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ADH1B,rs75967634.C>T,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ALDH2,Reference,reference,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ALDH2,rs671.G>A,rsid_variant_allele,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANK3,Reference,reference,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANK3,rs143414470.T>C,rsid_variant_allele,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,Reference,reference,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,rs1800497.G>A,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,rs2587550.G>A,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,rs2734849.A>C,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,rs2734849.A>G,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,rs4938013.A>C,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,rs4938013.A>G,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,rs4938013.A>T,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,rs7118900.G>A,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ANKK1,rs7118900.G>C,rsid_variant_allele,variant_based,10,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +APOE,E2,star_allele,haplotype_named,3,ok,not_supported,not_supported, +APOE,E3,star_allele,haplotype_named,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +APOE,E4,star_allele,haplotype_named,3,ok,not_supported,not_supported, +ATM,Reference,reference,variant_based,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ATM,rs11212570.G>A,rsid_variant_allele,variant_based,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ATM,rs11212570.G>T,rsid_variant_allele,variant_based,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ATM,rs11212617.C>A,rsid_variant_allele,variant_based,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ATM,rs1801516.G>A,rsid_variant_allele,variant_based,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ATM,rs620815.T>A,rsid_variant_allele,variant_based,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ATM,rs620815.T>C,rsid_variant_allele,variant_based,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,Reference,reference,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs10835210.C>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs10835210.C>G,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs11030101.A>G,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs11030101.A>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs11030104.A>G,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs11030118.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs11030119.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs11030119.G>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs1491850.T>C,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs16917234.T>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs16917234.T>C,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs1967554.A>C,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs2030324.A>G,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs61888800.G>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs6265.C>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs7103411.C>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs7124442.C>G,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs7124442.C>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs7127507.T>C,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs7934165.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs962369.T>C,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +BDNF,rs988748.C>G,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,Reference,reference,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs1006737.G>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs1034936.C>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs1034936.C>G,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs1034936.C>T,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs1051375.G>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs1051375.G>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs10774053.A>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs10774053.A>G,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs10848635.T>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs10848635.T>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs11062040.C>T,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs12813888.A>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs12813888.A>T,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2041135.T>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs215976.C>G,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs215976.C>T,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs215994.T>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs216008.C>T,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs216013.A>G,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2238032.T>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2238032.T>G,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2238087.C>G,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2238087.C>T,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2239050.G>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2239050.G>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2239128.T>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2239128.T>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs2283271.T>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs723672.C>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs723672.C>G,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs723672.C>T,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs7295250.T>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs7316246.G>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs7316246.G>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs758723.T>A,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1C,rs758723.T>C,rsid_variant_allele,variant_based,37,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1S,Reference,reference,variant_based,4,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1S,rs1800559.C>A,rsid_variant_allele,variant_based,4,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1S,rs1800559.C>T,rsid_variant_allele,variant_based,4,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CACNA1S,rs772226819.G>A,rsid_variant_allele,variant_based,4,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,Reference,reference,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs113993958.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs113993958.G>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs113993958.G>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs115545701.C>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs11971167.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs11971167.G>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121908752.T>G,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121908753.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121908755.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121908755.G>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121908757.A>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121909005.T>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121909005.T>G,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121909013.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121909020.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121909020.G>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs121909041.T>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs141033578.C>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs150212784.T>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs150212784.T>G,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs186045772.T>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs193922525.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs193922525.G>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs200321110.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs202179988.C>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs267606723.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs267606723.G>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs368505753.C>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508256.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508288.A>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508288.A>G,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508387.G>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508442.C>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508513.A>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508537.C>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508759.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508759.G>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs397508761.A>G,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs74503330.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs74551128.C>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs74551128.C>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs75039782.C>G,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs75039782.C>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs75527207.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs75541969.G>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs76151804.A>G,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs77834169.C>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs77834169.C>G,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs77834169.C>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs77932196.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs77932196.G>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs77932196.G>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs78655421.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs78655421.G>C,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs78655421.G>T,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs78769542.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs80224560.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CFTR,rs80282562.G>A,rsid_variant_allele,variant_based,59,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,Reference,reference,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs13306278.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs165599.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs165599.G>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs165722.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs165728.C>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs165728.C>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs165728.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs165774.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs174675.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs174696.C>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs174696.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs174699.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs2020917.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs2075507.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs2075507.G>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs2075507.G>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs2239393.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs4633.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs4646312.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs4646316.C>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs4646316.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs4680.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs4818.C>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs4818.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs5746849.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs5993882.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs5993882.T>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs5993883.T>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs6267.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs6267.G>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs6269.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs6269.A>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs7287550.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs7287550.T>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs737865.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs737866.T>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs737866.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs740603.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs9332377.C>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs9332377.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs933271.T>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs933271.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs9606186.C>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs9606186.C>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +COMT,rs9606186.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*10,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*11,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*12,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*13,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*14,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*15,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*16,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*17,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*18,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*19,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1A,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1B,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1C,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1D,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1E,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1F,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1G,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1J,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1K,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1L,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1M,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1N,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1P,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1Q,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1R,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1S,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1T,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1U,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*1V,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*2,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*20,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*21,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*3,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*4,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*5,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*6,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*7,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*8,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP1A2,*9,star_allele,star_allele,39,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*1,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*10,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*11,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*12,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*13,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*14,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*15,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*16,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*17,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*18,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*19,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*1x2,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*2,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*20,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*21,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*22,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*23,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*24,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*25,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*26,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*27,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*28,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*31,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*34,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*35,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*36,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*37,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*38,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*39,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*4,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*40,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*41,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*42,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*43,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*44,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*45,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*46,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*48,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*49,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*5,star_allele,star_allele,51,not_supported,ok,ok, +CYP2A6,*50,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*51,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*52,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*53,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*54,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*55,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*56,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*6,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*7,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*8,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2A6,*9,star_allele,star_allele,51,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*1,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*10,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*11,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*12,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*13,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*14,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*15,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*17,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*18,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*19,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*2,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*20,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*21,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*22,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*23,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*24,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*25,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*26,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*27,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*28,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*3,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*31,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*32,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*33,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*34,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*35,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*36,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*37,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*38,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*39,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*4,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*40,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*41,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*42,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*43,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*44,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*45,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*46,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*47,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*48,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*49,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*5,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*6,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*7,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*8,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2B6,*9,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*1,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*10,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*11,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*12,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*13,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*14,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*15,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*16,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*17,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*18,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*19,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*2,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*22,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*23,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*24,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*25,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*26,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*28,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*29,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*3,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*30,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*31,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*32,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*33,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*34,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*35,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*38,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*39,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*4,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*5,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*6,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*7,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*8,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C19,*9,star_allele,star_allele,34,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*1,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*10,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*11,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*12,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*13,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*14,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*15,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*16,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*17,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*18,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*2,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*3,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*4,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*5,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*6,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*7,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*8,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C8,*9,star_allele,star_allele,18,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*1,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*10,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*11,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*12,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*13,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*14,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*15,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*16,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*17,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*18,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*19,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*2,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*20,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*21,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*22,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*23,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*24,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*25,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*26,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*27,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*28,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*29,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*3,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*30,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*31,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*32,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*33,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*34,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*35,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*36,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*37,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*38,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*39,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*4,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*40,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*41,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*42,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*43,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*44,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*45,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*46,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*47,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*48,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*49,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*5,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*50,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*51,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*52,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*53,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*54,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*55,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*56,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*57,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*58,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*59,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*6,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*60,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*61,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*62,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*63,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*64,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*65,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*66,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*67,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*68,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*69,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*7,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*70,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*71,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*72,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*73,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*74,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*75,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*76,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*77,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*78,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*79,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*8,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*80,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*81,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*82,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*83,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*84,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*85,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2C9,*9,star_allele,star_allele,85,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*1,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*1-*90,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*10,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*100,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*101,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*102,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*103,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*104,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*105,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*106,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*107,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*108,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*109,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*10x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*11,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*110,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*111,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*112,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*113,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*114,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*115,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*116,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*117,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*118,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*119,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*12,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*120,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*121,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*122,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*123,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*124,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*125,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*126,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*127,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*128,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*129,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*13,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*13-*1,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*13-*2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*13-*4-*68,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*130,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*131,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*132,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*133,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*134,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*135,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*136,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*137,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*138,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*139,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*13x2-*1,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*13x2-*2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*14,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*140,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*141,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*142,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*143,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*144,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*145,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*146,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*147,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*148,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*149,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*15,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*150,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*151,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*152,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*153,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*154,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*155,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*156,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*157,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*158,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*159,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*160,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*161,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*162,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*163,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*164,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*165,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*166,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*167,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*168,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*169,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*17,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*170,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*171,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*172,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*17x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*18,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*19,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*1x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*20,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*21,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*22,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*23,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*24,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*25,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*26,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*27,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*28,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*29,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*29x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*2x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*3,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*30,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*31,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*32,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*33,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*34,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*35,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*35x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*36,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*36,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*36-*10,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*36-*10x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*36x2-*10,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*36x3-*10,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*37,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*38,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*39,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*4,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*40,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array,also reported for *58 +CYP2D6,*41,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*42,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*43,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*43x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*44,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*45,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*46,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*47,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*48,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*49,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*4M,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*4N-*4,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*4x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*5,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*50,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*51,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*52,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*53,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*54,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*55,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*56,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*58,star_allele,star_allele,184,reported_as_*40,reported_as_*40,reported_as_*40, +CYP2D6,*59,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*6,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*60,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*62,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*64,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*65,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*68,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*68-*4,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*69,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*7,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*70,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*71,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*72,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*73,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*74,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*75,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*8,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*81,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*82,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*83,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*84,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*85,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*86,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*87,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*88,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*89,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*9,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*90,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*91,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*92,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*93,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*94,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*95,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*96,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*97,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*98,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*99,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2D6,*9x2,star_allele,star_allele,184,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*1A,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*1B,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*2,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*3,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*4,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*5A,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*5B,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*6,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*7A,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*7B,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP2E1,*7C,star_allele,star_allele,11,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*1,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*10,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*11,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*12,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*13,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*14,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*15,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*16,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*17,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*18,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*19,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*2,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*20,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*21,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*22,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*23,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*24,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*26,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*28,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*29,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*3,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*30,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*31,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*32,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*33,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*34,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*35,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*37,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*38,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*39,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*4,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*40,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*41,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*42,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*43,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*44,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*45,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*46,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*47,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*48,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*5,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*6,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*7,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*8,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A4,*9,star_allele,star_allele,45,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A5,*1,star_allele,star_allele,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A5,*3,star_allele,star_allele,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A5,*6,star_allele,star_allele,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A5,*7,star_allele,star_allele,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A5,*8,star_allele,star_allele,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP3A5,*9,star_allele,star_allele,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*1,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array,"absorbs indistinguishable allele (*2->*1, *4->*3)" +CYP4F2,*10,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*11,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*12,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*13,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*14,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*15,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*17,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*2,star_allele,star_allele,16,reported_as_*1,reported_as_*1,reported_as_*1, +CYP4F2,*3,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array,"absorbs indistinguishable allele (*2->*1, *4->*3)" +CYP4F2,*4,star_allele,star_allele,16,reported_as_*3,reported_as_*3,reported_as_*3, +CYP4F2,*5,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*6,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*7,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*8,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +CYP4F2,*9,star_allele,star_allele,16,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,Reference,reference,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs111858276.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs112766203.1.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs112766203.2.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs114096998.1.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs114096998.2.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs114096998.2.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs115232898.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs116364703.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs1180771326.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs137878450.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs137999090.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs138391898.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs138545885.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs138616379.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs139459586.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs139834141.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs140039091.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs140114515.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs140602333.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs140602333.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs140989814.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs141044036.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs141439344.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs141462178.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs141726921.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs142512579.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs142619737.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs142619737.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs143154602.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs143154602.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs143815742.1.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs143815742.2.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs143879757.1.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs143879757.2.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs143986398.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs144395748.1.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs144395748.2.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs144935781.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs145112791.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs145529148.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs145548112.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs145548112.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs145773863.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs146356975.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs146529561.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs147545709.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs147601618.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs148799944.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs148994843.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs150036960.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs150385342.1.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs150385342.2.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs150437414.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs151074666.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs17376848.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs1801158.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs1801159.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs1801160.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs1801265.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs1801266.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs1801267.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs1801268.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs183105782.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs183385770.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs186169810.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs187713395.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs188052243.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs190577302.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs190951787.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs190951787.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs199549923.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs199634007.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs199646142.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs199777072.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs200064537.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs200296941.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs200562975.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs200643089.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs200687447.1.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs200687447.2.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs200687447.2.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs200693895.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs200709381.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs201018345.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs201035051.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs201268750.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs201433243.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs201615754.1.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs201615754.2.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs201648613.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs201785202.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs202144771.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs202212118.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs2297595.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs267598785.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs267598786.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs267598789.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs367619008.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs368146607.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs368152149.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs368327291.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs368519011.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs368970772.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs369103276.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs369575517.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs370569731.1.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs370569731.2.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs370615432.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs370707404.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs371258350.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs371313778.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs371587702.1.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs371587702.2.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs371792178.1.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs371792178.2.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs372058915.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs372307932.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs372909322.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs374527058.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs374531732.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs374825099.1.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs374825099.2.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs374827081.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs375436137.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs375990187.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs376073289.1.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs376073289.2.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs376128878.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs376273539.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs377143350.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs377169736.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs3918289.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs3918289.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs3918290.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs3918290.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs45589337.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs527580106.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs528152707.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs528430685.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs528768620.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs529019871.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs532341730.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs536577604.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs538336580.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs538703919.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs547099198.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs548783838.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs55674432.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs556933127.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs557220418.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs558354142.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs55886062.1.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs55886062.2.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs559427764.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs55971861.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs56005131.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs56038477.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs568169006.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs568367673.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs569661196.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs570122671.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs571114616.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs573299212.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs575763449.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs575853463.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs576409484.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs57918000.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs59086055.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs60139309.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs60511679.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs61622928.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs61757362.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs6670886.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs6670886.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs672601273.1.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs672601273.2.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs672601275.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs672601276.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs672601282.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs672601284.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs672601285.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs672601287.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs672601288.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs67376798.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72547601.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72547602.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549303.del,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549304.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549304.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549304.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549305.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549306.1.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549306.2.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549307.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549308.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549309.ATGA[1],rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72549310.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72975710.1.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs72975710.2.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs745512069.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs745704371.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs745833535.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs745911874.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs745982505.1.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs745982505.2.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs746115989.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs746329786.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs746777181.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs747132274.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs747161261.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs747627716.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs747633945.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs747858350.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs747872037.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748214188.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748235192.1.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748235192.2.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748266854.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748320430.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748620513.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748620513.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748639205.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748639205.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748853941.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748958293.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs748974194.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs749157068.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs749269410.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs749354734.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs749586100.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs749699298.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs749982106.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs750147471.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs75017182.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs750224169.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs750423752.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs750687600.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs750721736.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751049055.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751104498.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751113340.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751190912.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751340819.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751374989.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751399062.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751841116.1.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751841116.2.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs751848058.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs752020412.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs752228747.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs752388408.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs752518145.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs752985272.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs753166888.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs753217888.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs753296078.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs753419296.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs753527420.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs753707032.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs753710779.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs753820482.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs753950237.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs754028972.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs754125729.1.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs754125729.2.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs754467630.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs754786483.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs755155824.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs755407188.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs755416212.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs755428442.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs755645831.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs755692084.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs755729055.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs756020314.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs756372042.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs756613407.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs756684474.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs756890859.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs756992995.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs757155354.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs757227327.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs757342874.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs757376267.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs757695236.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs757954074.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs757958938.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs757994597.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs758154803.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs758489611.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs758514990.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs758649719.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs758699471.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs759082282.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs759249769.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs759424419.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs759479759.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs759562628.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs759766897.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs759967863.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs760038956.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs760222167.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs760235888.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs760485592.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs760553268.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs760570391.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs760663364.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs760663364.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs761302217.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs761351410.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs761479700.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs761555670.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs761609256.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762083671.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762102298.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762198241.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762430779.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762446803.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762468894.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762523739.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762533012.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762598766.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762779297.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762858106.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs762911226.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763008163.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763061658.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763449831.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763506271.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763557204.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763572567.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763623595.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763784786.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763862486.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763893877.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs763984510.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs764111543.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs764270260.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs764555085.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs764635955.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs764666241.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs764679468.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs764945792.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs765001324.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs765034707.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs765075551.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs765131182.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs765247038.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs765309287.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs765465250.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs765640386.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs765990958.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs766411970.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs766438205.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs766635900.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs766700777.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs766761199.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs766833304.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs766885021.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767200577.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767376585.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767437717.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767464878.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767468952.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767482279.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767547827.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767818267.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767836989.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs767986711.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs768117152.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs768157853.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs768200107.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs768288280.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs768501828.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs768507975.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs768680499.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs768915005.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769190350.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769306962.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769466648.1.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769466648.2.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769514867.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769696395.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769709846.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769820114.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769847078.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs769932607.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs770229152.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs770566506.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs770958862.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs771194906.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs771534236.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs771536388.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs771573678.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs771646887.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs771648776.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs771885007.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs771930534.1.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs771930534.2.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs772097379.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs772264512.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs772320654.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs772358811.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs772544099.G>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs772826416.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs772906420.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs773159364.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs773407491.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs773584401.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs773652644.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs773815814.1.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs773815814.2.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs773868825.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs773983635.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs774134971.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs774500505.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs774579695.1.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs774799003.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs774883578.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs775494607.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs775526810.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs775570841.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs775601164.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs775926386.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs776082092.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs776236081.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs776289153.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs776321529.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs776662759.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs776973423.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs776984091.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777220476.1.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777220476.2.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777238016.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777347164.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777368221.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777425216.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777425216.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777560627.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777673186.G>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs777902288.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778022685.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778054451.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778141885.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778298325.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778601245.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778754188.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778760295.C>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778776264.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778867644.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs778911905.A>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs779465366.A>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs779557503.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs779573574.T>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs779728902.A>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs779925747.T>G,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs779967271.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs780025995.G>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs780047918.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs780120302.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs78060119.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs780813130.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs780873985.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs780885126.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs781184141.T>C,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs80081766.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs866110709.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs866869468.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs867143119.C>A,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs867226255.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs867232786.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs867600987.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs868047175.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DPYD,rs868235016.C>T,rsid_variant_allele,variant_based,475,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,Reference,reference,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1076560.C>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1076560.C>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1076563.A>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1079596.C>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1079596.C>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1079597.C>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1079598.A>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1079598.A>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1110976.T>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs11214607.T>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1124491.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1124491.G>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1124493.T>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1125394.T>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs12364283.A>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs12574471.C>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs12574471.C>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs17601612.G>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1799732._113475530insG,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1799732.dup,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1799978.T>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1800497.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1800498.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs1801028.G>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2075652.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2234689.G>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2283265.C>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2440390.T>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2514218.C>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2587548.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2587548.G>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2734833.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2734841.A>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2734841.A>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2734841.A>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs2734842.G>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4274224.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4274224.G>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4436578.C>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4436578.C>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4460839.C>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4460839.C>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4648317.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4648318.T>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4648318.T>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4648318.T>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4936274.A>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs4936274.A>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs6275.A>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs6277.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs6279.G>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs7122246.G>A,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs7131056.A>C,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs7131056.A>G,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +DRD2,rs7131440.C>T,rsid_variant_allele,variant_based,56,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F13A1,Reference,reference,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F13A1,rs5985.C>A,rsid_variant_allele,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F13A1,rs5985.C>T,rsid_variant_allele,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F2,Reference,reference,variant_based,5,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F2,rs1799963.G>A,rsid_variant_allele,variant_based,5,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F2,rs3136516.G>A,rsid_variant_allele,variant_based,5,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F2,rs5896.C>G,rsid_variant_allele,variant_based,5,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F2,rs5896.C>T,rsid_variant_allele,variant_based,5,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F5,Reference,reference,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +F5,rs6025.C>T,rsid_variant_allele,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,Reference,reference,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs1360780.T>A,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs1360780.T>C,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs17614642.T>C,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs3800373.C>A,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs3800373.C>G,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs4713916.A>C,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs4713916.A>G,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs4713916.A>T,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs73748206.C>T,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs9380524.C>A,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +FKBP5,rs9380524.C>T,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,202G>A_376A>G_1264C>G,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,A,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,A- 202A_376G,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,A- 680T_376G,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,A- 968C_376G,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Aachen,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Abeno,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Acrokorinthos,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Alhambra,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Amazonia,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Amiens,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Amsterdam,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Anadia,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Ananindeua,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Andalus,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Arakawa,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Asahi,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Asahikawa,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Aures,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Aveiro,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,B (reference),reference,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Bajo Maumere,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Bangkok,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Bangkok Noi,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Bao Loc,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Bari,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Belem,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Beverly Hills, Genova, Iwate, Niigata, Yamaguchi",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Brighton,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Buenos Aires,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Cairo,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Calvo Mackenna,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Campinas,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Canton, Taiwan-Hakka, Gifu-like, Agrigento-like",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Cassano,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Chatham,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Chikugo,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Chinese-1,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Chinese-5,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Cincinnati,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Cleveland Corum,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Clinic,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Coimbra Shunde,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Cosenza,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Costanzo,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Covao do Lobo,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Crispim,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Dagua,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Durham,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Farroupilha,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Figuera da Foz,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Flores,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Fukaya,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Fushan,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Gaohe,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Georgia,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Gidra,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Gond,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Guadalajara,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Guangzhou,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Haikou,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Hammersmith,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Harilaou,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Harima,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Hartford,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Hechi,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Hermoupolis,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Honiara,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Ierapetra,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Ilesha,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Insuli,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Iowa, Walter Reed, Springfield",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Iwatsuki,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Japan, Shinagawa",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Kaiping, Anant, Dhon, Sapporo-like, Wosera",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Kalyan-Kerala, Jamnaga, Rohini",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Kambos,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Kamiube, Keelung",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Kamogawa,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Kawasaki,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Kozukata,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Krakow,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,La Jolla,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Lages,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Lagosanto,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Laibin,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Lille,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Liuzhou,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Loma Linda,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Ludhiana,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Lynwood,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Madrid,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Mahidol,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Malaga,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Manhattan,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Mediterranean Haplotype,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array,"build-specific definition (rs2230037/rs5030868), see allele-definitions page" +G6PD,"Mediterranean, Dallas, Panama, Sassari, Cagliari, Birmingham",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array,"build-specific definition (rs2230037/rs5030868), see allele-definitions page" +G6PD,Metaponto,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Mexico City,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Miaoli,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Minnesota, Marion, Gastonia, LeJeune",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Mira d'Aire,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Mizushima,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Montalbano,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Montpellier,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Mt Sinai,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Munich,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Murcia Oristano,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Musashino,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Namouru,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Nankang,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Nanning,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Naone,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Nara,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Nashville, Anaheim, Portici",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Neapolis,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Nice,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Nilgiri,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,No name,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,North Dallas,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Olomouc,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Omiya,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Orissa,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Osaka,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Palestrina,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Papua,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Partenope,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Pawnee,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Pedoplis-Ckaro,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Piotrkow,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Plymouth,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Praha,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Puerto Limon,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Quing Yan,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Radlowo,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Rehevot,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Rignano,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Riley,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Riverside,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Roubaix,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,S. Antioco,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Salerno Pyrgos,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Santa Maria,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Santiago,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Santiago de Cuba, Morioka",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Sao Borja,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Seattle, Lodi, Modena, Ferrara II, Athens-like",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Seoul,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Serres,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Shenzen,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Shinshu,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Sibari,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Sierra Leone,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Sinnai,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Songklanagarind,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Split,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Stonybrook,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Sugao,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Sumare,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Sunderland,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Surabaya,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Suwalki,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Swansea,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Taipei, Chinese-3",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Telti, Kobe",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Tenri,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Tokyo, Fukushima",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Toledo,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Tomah,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Tondela,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Torun,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Tsukui,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Ube Konan,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Union,Maewo, Chinese-2, Kalo",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Urayasu,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Utrecht,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Valladolid,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Vancouver,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Vanua Lava,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,"Viangchan, Jammu",named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Villeurbanne,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Volendam,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Wayne,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,West Virginia,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Wexham,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Wisconsin,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +G6PD,Yunan,named_haplotype,haplotype_named,187,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIK1,Reference,reference,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIK1,rs2832407.C>A,rsid_variant_allele,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIK1,rs2832407.C>T,rsid_variant_allele,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIK4,Reference,reference,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIK4,rs12800734.G>A,rsid_variant_allele,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIK4,rs1954787.T>C,rsid_variant_allele,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,Reference,reference,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs1019385.C>A,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs1072388.G>A,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs1072388.G>C,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs1806191.G>A,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs1806191.G>T,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs1806201.G>A,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs2058878.T>A,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs2058878.T>C,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs2160733.A>C,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs2160734.C>G,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs2160734.C>T,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs2284411.C>T,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs890.A>C,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +GRIN2B,rs890.A>G,rsid_variant_allele,variant_based,15,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HLA-A,*31:01,star_allele,tagging_variant,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HLA-A,Reference,reference,tagging_variant,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HLA-B,*15:02,star_allele,tagging_variant,4,not_supported,array_dependent,array_dependent, +HLA-B,*57:01,star_allele,tagging_variant,4,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HLA-B,*58:01,star_allele,tagging_variant,4,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HLA-B,Reference,reference,tagging_variant,4,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HMGCR,Reference,reference,variant_based,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HMGCR,rs10474433.T>C,rsid_variant_allele,variant_based,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HMGCR,rs10474433.T>G,rsid_variant_allele,variant_based,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HMGCR,rs12654264.A>T,rsid_variant_allele,variant_based,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HMGCR,rs17238540.T>G,rsid_variant_allele,variant_based,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HMGCR,rs17244841.A>T,rsid_variant_allele,variant_based,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HMGCR,rs17671591.C>T,rsid_variant_allele,variant_based,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HMGCR,rs3846662.A>G,rsid_variant_allele,variant_based,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HMGCR,rs3846662.A>T,rsid_variant_allele,variant_based,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,Reference,reference,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs17288723.T>C,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs17289304.T>C,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs17289304.T>G,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs1928040.G>A,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs1928040.G>C,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs2274639.C>G,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs2274639.C>T,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs2770296.C>G,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs2770296.C>T,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs3742278.A>G,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs3803189.T>G,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs6305.G>A,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs6311.C>A,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs6311.C>T,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs6312.C>A,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs6312.C>G,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs6312.C>T,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs6313.G>A,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs6313.G>C,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs6314.G>A,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs659734.G>A,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs659734.G>C,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs659734.G>T,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs7997012.A>C,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs7997012.A>G,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs7997012.A>T,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs9316233.C>A,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs9316233.C>G,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs9316233.C>T,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs9567746.A>C,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2A,rs9567746.A>G,rsid_variant_allele,variant_based,32,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,Reference,reference,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs1023574.C>G,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs1023574.C>T,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs12836771.A>G,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs1414334.C>G,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs2497538.A>C,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs3813928.G>A,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs3813929.C>G,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs3813929.C>T,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs498207.G>A,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs518147.C>A,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs518147.C>G,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs539748.C>T,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs6318.C>G,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs6318.C>T,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs9698290.T>A,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +HTR2C,rs9698290.T>C,rsid_variant_allele,variant_based,17,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IFNL3/4,Reference,reference,tagging_variant,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IFNL3/4,rs12979860 variant (T),rsid_variant_allele,tagging_variant,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,Reference,reference,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs10242595.G>A,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs10242595.G>C,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs10242595.G>T,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs10499563.T>C,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs1524107.C>G,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs1524107.C>T,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs1800795.C>G,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs1800795.C>T,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs1800796.G>A,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs1800796.G>C,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs1800797.A>C,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs1800797.A>G,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs1800797.A>T,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs2066992.G>A,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs2066992.G>C,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs2066992.G>T,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs2069835.T>C,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs2069837.A>C,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs2069837.A>G,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +IL6,rs2069840.C>G,rsid_variant_allele,variant_based,21,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,Reference,reference,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs11871251.G>A,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs11871251.G>C,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs2317676.A>G,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs3785873.G>A,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs3785873.G>T,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs58847127.G>A,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs58847127.G>C,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs58847127.G>T,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs5918.T>C,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs8069732.C>A,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +ITGB3,rs8069732.C>T,rsid_variant_allele,variant_based,12,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +KIF6,Reference,reference,variant_based,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +KIF6,rs20455.A>G,rsid_variant_allele,variant_based,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +KIF6,rs9462535.C>A,rsid_variant_allele,variant_based,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +KIF6,rs9462535.C>G,rsid_variant_allele,variant_based,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +KIF6,rs9462535.C>T,rsid_variant_allele,variant_based,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +KIF6,rs9471077.A>G,rsid_variant_allele,variant_based,6,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +LPA,Reference,reference,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +LPA,rs10455872.A>G,rsid_variant_allele,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +LPA,rs3798220.T>C,rsid_variant_allele,variant_based,3,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.1520T>C,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.1537C>T,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.1556C>T,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.669T>C,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.747A>G,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.786G>A,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.807A>C,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.807A>G,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.839A>G,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.896A>G,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.930A>G,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.960delC,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,NC_012920.1:m.988G>A,hgvs_variant,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,Reference,reference,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs1556422499.delT,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs200887992.G>A,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs267606617.A>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs267606618.T>C,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs267606619.C>T,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs28358569.A>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs28358571.T>C,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs28358572.T>C,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs3888511.T>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MT-RNR1,rs56489998.A>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,Reference,reference,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs1476413.C>G,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs1476413.C>T,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs17367504.A>G,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs17421511.G>A,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs1801131.T>G,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs1801133.G>A,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs1801133.G>C,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs2274976.C>T,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs3737967.G>A,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs4846051.G>A,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs4846051.G>C,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +MTHFR,rs4846051.G>T,rsid_variant_allele,variant_based,13,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*1,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*10,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*11,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*12,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*13,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*14,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*15,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*16,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*17,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*18,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*19,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*2,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*20,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*3,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*4,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*5,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*6,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array,also reported for *9 +NUDT15,*7,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*8,star_allele,star_allele,20,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +NUDT15,*9,star_allele,star_allele,20,reported_as_*6,reported_as_*6,reported_as_*6, +OPRD1,Reference,reference,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs1042114.G>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs1042114.G>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs10753331.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs10753331.G>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs12749204.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs204047.G>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs204047.G>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs204055.T>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs204055.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs204069.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs204076.T>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs204076.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs204076.T>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs2234918.C>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs2234918.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs2236855.C>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs2236855.C>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs2236857.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs2236861.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs2298895.A>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs2298896.T>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs2298897.C>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs3766951.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs419335.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs421300.A>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs421300.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs4654327.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs4654327.G>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs482387.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs482387.G>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs508448.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs529520.A>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs529520.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs533123.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs533123.G>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs569356.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs581111.A>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs581111.A>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs581111.A>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs6669447.T>C,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs678849.C>G,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs678849.C>T,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs680090.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs760589.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRD1,rs797397.G>A,rsid_variant_allele,variant_based,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,Reference,reference,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs10111937.C>T,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs1051660.C>A,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs1051660.C>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs1051660.C>T,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs16918842.C>A,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs16918842.C>T,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs16918875.G>A,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs16918909.A>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs16918941.A>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs3802279.C>T,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs3802281.T>C,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs3808627.C>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs3808627.C>T,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs6473797.T>C,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs6473799.A>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs6985606.T>A,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs6985606.T>C,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs7016778.A>T,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs702764.T>C,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs702764.T>G,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs7813478.T>C,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs963549.C>T,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRK1,rs997917.T>C,rsid_variant_allele,variant_based,24,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,Reference,reference,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs10457090.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs10457090.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs10485057.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs10485058.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs10485060.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1074287.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs11575856.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs12190259.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs12205732.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs12209447.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs12210856.T>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1294092.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1319339.T>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1319339.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs13195018.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs13195018.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs13203628.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1323040.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1323042.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1323042.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1381376.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1381376.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1381376.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1461773.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs17174629.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs17174794.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs17174794.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs17174801.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs17180982.dup,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs17181352.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1799971.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1799972.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1799972.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1799972.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1852629.T>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1852629.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs1852629.T>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2010884.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2075572.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2236256.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2236257.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2236258.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2236258.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2236259.T>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2236259.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2236259.T>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2281617.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs2281617.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3778148.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3778150.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3778151.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3778152.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3778156.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3798676.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3798677.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3798678.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3798678.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3798683.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3798688.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs3823010.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs483481.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs483481.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs4870266.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs495491.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs497976.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs497976.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs499796.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs506247.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs510769.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs511435.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs511435.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs518596.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs524731.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs527434.T>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs527434.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs538174.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs540825.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs540825.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs540825.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs544093.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs544093.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs548646.T>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs548646.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs548646.T>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs553202.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs558025.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs558948.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs558948.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs562859.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs562859.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs562859.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs563649.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs569284.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs583664.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs589046.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs598160.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs598160.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs598682.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs598682.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs598682.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs599548.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs606545.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs606545.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs609148.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs609148.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs609623.T>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs609623.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs610231.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs610231.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs613355.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs613355.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs613355.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs618207.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs618207.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs618207.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs62436463.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs62638690.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs632499.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs632499.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs632499.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs639855.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs639855.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs642489.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs642489.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs644261.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs644261.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs644261.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs645027.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs647192.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs647192.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs648007.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs648007.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs648893.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs650825.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs6557337.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs6557337.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs658156.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs658156.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs658156.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs671531.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs671531.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs675026.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs675026.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs677830.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs677830.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs677830.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs681243.T>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs681243.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs6902403.T>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs6912029.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs73576470.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs7748401.T>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs7763748.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs7763748.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs7776341.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs79910351.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9282815.C>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9282815.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9322446.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9322447.A>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9322447.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9322447.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9322453.G>C,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9371773.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9371776.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9384174.C>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9384174.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9384179.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9384179.G>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9397685.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9397685.A>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9397687.C>T,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9479757.G>A,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +OPRM1,rs9479779.A>G,rsid_variant_allele,variant_based,175,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38440818G>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38444179C>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38444252G>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38444257A>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38444257A>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38448680_38448681insGGA,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38448715G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38451785C>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38452985C>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38455253C>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38455254T>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38455347T>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38455504G>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38466392G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38469404A>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38485679T>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38486095A>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38490642A>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38494454G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38496455G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499234T>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499642C>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499667G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499667G>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499680T>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499683G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499696C>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499719A>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499730G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38499985A>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38500000G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38502669C>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38504298G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38506508C>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38506865C>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38507821C>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38512279G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38515052C>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38516181T>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38516208G>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38517470T>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38517523T>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38519424C>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38519432A>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38519447A>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38525432C>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38527710G>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38528372G>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38529002G>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38529042C>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38543380A>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38543566G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38543810C>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38548253A>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38561140G>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38561213C>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38561362G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38561363G>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38565023T>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38570649C>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38577931A>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38578205G>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38580039_38580040delinsAA,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38580041C>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38580126C>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38580397G>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38580416C>T,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38585078A>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38585099G>A,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38586190A>G,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38587362G>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,NC_000019.10:g.38587363G>C,hgvs_variant,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,Reference,reference,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs111272095.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs111364296.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs111565359.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs111657878.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs111888148.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs112151058.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs112196644.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs112563513.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs112596687.T>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs112772310.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs113210953.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs113332073.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs113332073.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs117886618.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192113.C>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192116.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192116.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192121.A>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192122.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192123.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192124.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192126.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192130.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192135.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192140.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192151.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192151.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192158.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192159.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192160.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192160.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192161.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192162.A>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192162.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192163.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192163.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192163.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192167.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192168.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192170.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192172.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192175.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192176.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192177.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192177.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192178.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192178.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118192181.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118204421.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118204422.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118204423.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs118204423.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs121918592.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs121918592.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs121918593.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs121918594.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs121918594.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs121918595.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs121918596._38499648delGAG,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs137932199.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs137933390.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs138874610.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs139161723.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs139647387.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs140152019.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs140616359.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs141646642.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs141942845.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs142474192.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs142474192.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs143398211.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs143520367.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs143987857.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs143988412.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs143988412.A>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs144336148.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs144685735.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs145573319.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs145801146.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs146306934.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs146429605.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs146504767.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs146876145.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs147136339.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs147213895.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs147303895.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs147707463.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs147723844.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs148399313.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs148623597.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs150396398.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs151029675.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs151119428.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs1801086.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs1801086.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs1801086.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs180714609.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs186983396.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs186983396.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs192863857.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922744.T>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922745._38440752delTGA,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922746.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922747.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922748.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922749.C>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922750.C>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922751.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922752.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922753.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922753.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922754.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922755.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922756.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922757.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922759.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922760.A>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922761.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922762.C>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922762.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922764.C>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922764.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922764.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922766.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922766.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922767.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922767.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922768.C>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922768.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922769.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922769.T>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922770.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922772.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922772.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922775.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922776.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922777.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922781.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922782.T>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922783.T>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922788.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922789.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922790.A>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922791.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922792.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922793.T>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922795.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922797.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922798.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922799.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922801.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922802.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922803.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922804.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922805.T>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922806.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922807.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922809.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922810.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922810.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922812.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922813.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922815.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922815.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922816.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922817.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922818.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922819.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922822.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922822.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922824.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922826.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922826.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922827.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922828.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922829.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922830.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922831.T>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922832.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922833.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922834.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922838.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922838.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922839.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922840.T>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922842.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922842.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922843.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922844.C>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922848.A>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922849.C>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922850.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922852.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922852.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922853.A>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922855.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922860.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922862._38572267delinsCT,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922863.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922864.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922865.T>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922866.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922867.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922868.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922873.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922873.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922874.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922876.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922877.delA,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922878.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922879.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922880.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922883.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922888.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922895.C>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922896.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs193922898.T>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs199738299.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs199870223.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs200766617.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs201321695.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs2145447772.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs2145447772.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs28933396.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs28933396.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs28933397.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs34390345.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs34694816.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs34934920.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs35180584.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs35364374.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs370634440.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs370634440.G>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs372958050.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs373406011.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs375626634.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs375915752.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs376149732.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs4802584.C>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs537994744.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs549201486.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs551223467.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs553055844.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs55876273.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs587784372.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs63749869.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs727504129.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs746818096.T>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs747177274.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs748575133.T>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs749040743.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs751180702.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs752652072.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs754476250.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs754785770.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs755088027.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs756850145.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs757753317.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs759500310.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs761616815.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs762401851.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs763112609.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs763352221.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs767553612.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs768360593.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs768535909.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs769482889.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs770593660.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs771058055.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs771741606.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs773040531.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs778241277.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs781104539.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs781126470.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs901087791.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs914804033.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs914804033.G>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs917523269.C>T,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs936513262.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs959170123.G>A,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs976108591.A>G,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +RYR1,rs995399438.T>C,rsid_variant_allele,variant_based,355,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*1,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*10,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*11,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*12,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*13,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*14,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*15,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*16,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*19,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*2,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*20,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*23,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*24,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*25,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*26,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*27,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*28,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*29,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*3,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*30,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*31,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*32,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*33,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*34,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*36,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*37,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*38,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*39,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*4,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*40,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*41,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*42,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*43,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*44,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*45,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*46,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*47,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*5,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*6,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*7,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*8,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +SLCO1B1,*9,star_allele,star_allele,42,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,Reference,reference,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs1799724.C>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs1799964.T>C,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs1800610.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs1800629.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs1800630.C>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs1800750.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs2736195.A>G,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs3093548.C>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs3093662.A>G,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs3093726.T>C,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs361525.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs4248158.C>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs4248159.C>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs4248160.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs4248163.C>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs4248163.C>G,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs4248163.C>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs4647198.C>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs4987086.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs55634887.G>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs55994001.C>A,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TNF,rs55994001.C>T,rsid_variant_allele,variant_based,23,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*1,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*10,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*11,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*12,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*13,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*14,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*15,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*16,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*17,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*18,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*19,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*2,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*20,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*21,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*22,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*23,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*24,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*25,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*26,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*27,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*28,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*29,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*30,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*31,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*32,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*33,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*34,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*35,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*36,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*37,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*38,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*39,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*3A,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*3B,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*3C,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*4,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*40,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*41,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*42,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*43,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*44,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*5,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*6,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*7,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*8,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +TPMT,*9,star_allele,star_allele,46,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A1,*1,star_allele,star_allele,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A1,*27,star_allele,star_allele,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A1,*28,star_allele,star_allele,9,not_supported,not_supported,not_supported, +UGT1A1,*36,star_allele,star_allele,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A1,*37,star_allele,star_allele,9,not_supported,not_supported,not_supported, +UGT1A1,*6,star_allele,star_allele,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A1,*80,star_allele,star_allele,9,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A1,*80+*28,star_allele,star_allele,9,not_supported_(*28_component),not_supported_(*28_component),not_supported_(*28_component), +UGT1A1,*80+*37,star_allele,star_allele,9,not_supported_(*37_component),not_supported_(*37_component),not_supported_(*37_component), +UGT1A4,*1a,star_allele,star_allele,8,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A4,*1b,star_allele,star_allele,8,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A4,*1c,star_allele,star_allele,8,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A4,*2,star_allele,star_allele,8,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A4,*3a,star_allele,star_allele,8,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A4,*3b,star_allele,star_allele,8,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A4,*4,star_allele,star_allele,8,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT1A4,*7,star_allele,star_allele,8,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT2B15,*1,star_allele,star_allele,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT2B15,*2,star_allele,star_allele,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT2B15,*3,star_allele,star_allele,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT2B15,*4,star_allele,star_allele,7,ok,not_supported,not_supported, +UGT2B15,*5,star_allele,star_allele,7,ok,not_supported,not_supported, +UGT2B15,*6,star_allele,star_allele,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +UGT2B15,*7,star_allele,star_allele,7,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +VKORC1,Reference,reference,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +VKORC1,rs9923231 variant (T),rsid_variant_allele,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +YEATS4,Reference,reference,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array, +YEATS4,rs7297610.C>T,rsid_variant_allele,variant_based,2,db_supported_if_variants_on_array,db_supported_if_variants_on_array,db_supported_if_variants_on_array,