PGx star alleles: pgx star-allele call (PGX-011..021), probe masks vs 1000G, GeT-RM validation (K-029)

- simurg/pgx/star.py: solver-free diplotype enumeration incl. CN forms (deletion, xN), wildcards, array-equivalence
  classes, raw_score/score with CPIC frequency priors; calibrated error model (spec PGX-012 amended).
- pipeline/pgx_star.py: DB gene models, SNV + PGx CN VCF evidence, masks, diplotype_summary.tsv + pgx_calls.json.
- scripts/pgx: derive_masks.py (array vs 1000G 30x over HTTPS, GS calibration), getrm_truth.py,
  validate_star_getrm.py.
- GSA v4 PGx demo vs GeT-RM (16 CEPH): 100/109 gene calls; CYP2D6/2C19/2C9 41/45 (docs/validation/V2_pgx_star.md).
This commit is contained in:
kemal committed 2026-09-29 14:08:03 +01:00
1 parent 7e9ff28501
commit 194c087b24
15 files changed
+1168 -5

No files matched your search

+240
View File
@@ -0,0 +1,240 @@
{
"individuals": 30,
"genes": {
"CYP2B6": {
"n": 14,
"top": 12,
"equivalent": 12,
"not_comparable": 1
},
"CYP2C19": {
"n": 15,
"top": 14,
"equivalent": 15
},
"CYP2C9": {
"n": 15,
"top": 15,
"equivalent": 15
},
"CYP2D6": {
"n": 15,
"top": 12,
"equivalent": 14
},
"CYP3A5": {
"n": 15,
"top": 15,
"equivalent": 15
},
"CYP4F2": {
"n": 9,
"top": 8,
"equivalent": 8
},
"NAT2": {
"n": 9,
"top": 8,
"equivalent": 8
},
"NUDT15": {
"n": 1,
"top": 1,
"equivalent": 1
},
"SLCO1B1": {
"n": 15,
"top": 9,
"equivalent": 9
},
"TPMT": {
"n": 16,
"top": 15,
"equivalent": 15
},
"UGT1A1": {
"n": 9,
"top": 0,
"equivalent": 1
}
},
"legacy_nomenclature_genes": [
"SLCO1B1",
"UGT1A1"
],
"total": {
"n": 109,
"top": 100,
"equivalent": 103
},
"discordant": [
{
"individual": "NA12156",
"gene": "CYP4F2",
"truth": "(*2)/*3",
"call": "*1/*3",
"within_equivalents": false
},
{
"individual": "NA12156",
"gene": "SLCO1B1",
"truth": "*1/*21",
"call": "*1/*37",
"within_equivalents": false
},
{
"individual": "NA12156",
"gene": "UGT1A1",
"truth": "*60/*28",
"call": "*28/*80",
"within_equivalents": false
},
{
"individual": "NA12044",
"gene": "TPMT",
"truth": "*1/*21",
"call": "*1/*1",
"within_equivalents": false
},
{
"individual": "NA07019",
"gene": "UGT1A1",
"truth": "*1/*60",
"call": "*1/*1",
"within_equivalents": false
},
{
"individual": "NA06991",
"gene": "UGT1A1",
"truth": "*60/*60",
"call": "*1/*1",
"within_equivalents": false
},
{
"individual": "NA12878",
"gene": "CYP2D6",
"truth": "*3/(*68)+*4",
"call": "*4x2/*1;*4x2/*82",
"within_equivalents": false
},
{
"individual": "NA12878",
"gene": "UGT1A1",
"truth": "*60/*28",
"call": "*28/*80",
"within_equivalents": false
},
{
"individual": "NA11993",
"gene": "SLCO1B1",
"truth": "*1/*17",
"call": "*1/*15",
"within_equivalents": false
},
{
"individual": "NA11993",
"gene": "UGT1A1",
"truth": "(*28 + *60)/*60",
"call": "*28/*80",
"within_equivalents": false
},
{
"individual": "NA12003",
"gene": "UGT1A1",
"truth": "*60/*28",
"call": "*28/*80",
"within_equivalents": false
},
{
"individual": "NA07029",
"gene": "CYP2B6",
"truth": "*6/(*27)",
"call": "*1/*6",
"within_equivalents": false
},
{
"individual": "NA07029",
"gene": "CYP2C19",
"truth": "*8/*17",
"call": "*1/*17",
"within_equivalents": true
},
{
"individual": "NA07029",
"gene": "UGT1A1",
"truth": "*1/*1",
"call": "*1/*28",
"within_equivalents": true
},
{
"individual": "NA12892",
"gene": "CYP2B6",
"truth": "*1/*1",
"call": "*1/*5",
"within_equivalents": false
},
{
"individual": "NA11832",
"gene": "NAT2",
"truth": "*5/(*12)",
"call": "*1/*5",
"within_equivalents": false
},
{
"individual": "NA11832",
"gene": "SLCO1B1",
"truth": "*1/*1",
"call": "*14/*20",
"within_equivalents": false
},
{
"individual": "NA11832",
"gene": "UGT1A1",
"truth": "(*28 + *60)/*60",
"call": "*28/*80",
"within_equivalents": false
},
{
"individual": "NA10838",
"gene": "CYP2D6",
"truth": "*2/*4",
"call": "*1/*4;*2/*4",
"within_equivalents": true
},
{
"individual": "NA10838",
"gene": "SLCO1B1",
"truth": "*1/*1",
"call": "*1/*14",
"within_equivalents": false
},
{
"individual": "NA12813",
"gene": "CYP2D6",
"truth": "*2/*4",
"call": "*1/*4;*2/*4",
"within_equivalents": true
},
{
"individual": "NA12813",
"gene": "SLCO1B1",
"truth": "*1/*21",
"call": "*1/*20",
"within_equivalents": false
},
{
"individual": "NA12813",
"gene": "UGT1A1",
"truth": "(*28 + *60)/(*28 + *60)",
"call": "*80/*80",
"within_equivalents": false
},
{
"individual": "NA11881",
"gene": "SLCO1B1",
"truth": "*1/(*15)",
"call": "*14/*15",
"within_equivalents": false
}
]
}