// HLA Typing Lab — representative demo data. // // Deliberately small and hand-written: enough rows to make each data product // legible, not a synthetic archive. Cascade Ridge is driven by generated // workbooks; this workspace is driven by this file, because the point of the // lab example is the SHAPE of the model, not the volume of it. // // Everything here is fictional. Allele names follow real IMGT/HLA nomenclature // so the tables read correctly to someone who works in this field. // ── The assay's own history ──────────────────────────────────────────────── // An assignment is only meaningful as (sequence + method version + reference // release), so both are first-class and every call cites them. const LAB_METHODS = [ { id: 'v1', label: 'SBT v1', years: '2009–2013', note: 'Original primer set; class I exons 2–3, class II exon 2.' }, { id: 'v2', label: 'SBT v2', years: '2014–2020', note: 'Revised DRB1 primers; group-specific full-length amplification added.' }, { id: 'v2.3', label: 'SBT v2.3', years: '2021–', note: 'Current. Allele-specific amplification for phase resolution.' }, ]; const LAB_RELEASES = [ { id: '3.55.0', date: 'Jan 2024', current: false }, { id: '3.58.0', date: 'Jan 2025', current: false }, { id: '3.60.0', date: 'Jul 2026', current: true }, ]; // ── Assignment Ledger ───────────────────────────────────────────────────── // The root data product. Every other product below derives from these rows. const LAB_ASSIGNMENTS = [ { id: 'CR-24118', study: 'HSCT-2026', drawn: '2026-06-02', method: 'v2.3', release: '3.60.0', a: 'A*02:01:01 / A*24:02:01', b: 'B*07:02:01 / B*44:02:01', c: 'C*07:02:01 / C*05:01:01', drb1: 'DRB1*15:01:01 / DRB1*04:01:01', dqb1: 'DQB1*06:02:01 / DQB1*03:02:01', res: 'Allele', status: 'Final' }, { id: 'CR-24119', study: 'HSCT-2026', drawn: '2026-06-02', method: 'v2.3', release: '3.60.0', a: 'A*02:01:01 / A*24:02:01', b: 'B*07:02:01 / B*44:02:01', c: 'C*07:02:01 / C*05:01:01', drb1: 'DRB1*15:01:01 / DRB1*04:01:01', dqb1: 'DQB1*06:02:01 / DQB1*03:02:01', res: 'Allele', status: 'Final' }, { id: 'CR-24107', study: 'VAX-COV', drawn: '2026-05-21', method: 'v2.3', release: '3.60.0', a: 'A*01:01:01 / A*03:01:01', b: 'B*08:01:01 / B*35:01:01', c: 'C*07:01:01 / C*04:01:01', drb1: 'DRB1*03:01:01 / DRB1*11:01:01', dqb1: 'DQB1*02:01:01 / DQB1*03:01:01', res: 'Allele', status: 'Final' }, { id: 'CR-24096', study: 'VAX-COV', drawn: '2026-05-14', method: 'v2.3', release: '3.60.0', a: 'A*29:02:01 / A*11:01:01', b: 'B*44:03:01 / B*15:01:01', c: 'C*16:01:01 / C*03:04:01', drb1: 'DRB1*07:01:01 / DRB1*13:01:01', dqb1: 'DQB1*02:02:01 / DQB1*06:03:01', res: 'Allele', status: 'Final' }, { id: 'CR-24085', study: 'VAX-COV', drawn: '2026-05-06', method: 'v2.3', release: '3.60.0', a: 'A*02:01:01 / A*02:01:01', b: 'B*57:01:01 / B*07:02:01', c: 'C*06:02:01 / C*07:02:01', drb1: 'DRB1*04:01:01 / DRB1*15:01:01', dqb1: 'DQB1*03:02:01 / DQB1*06:02:01', res: 'Allele', status: 'Review' }, { id: 'CR-24072', study: 'PANC-MHC', drawn: '2026-04-28', method: 'v2.3', release: '3.60.0', a: 'A*03:01:01 / A*68:01:02', b: 'B*40:01:02 / B*35:01:01', c: 'C*03:04:01 / C*04:01:01', drb1: '—', dqb1: '—', res: 'Class I only', status: 'Final' }, { id: 'CR-23940', study: 'HSCT-2026', drawn: '2026-03-11', method: 'v2.3', release: '3.60.0', a: 'A*11:01:01 / A*24:02:01', b: 'B*15:01:01 / B*51:01:01', c: 'C*03:04:01 / C*14:02:01', drb1: 'DRB1*04:05:01 / DRB1*09:01:02', dqb1: 'DQB1*04:01:01 / DQB1*03:03:02', res: 'Allele', status: 'Final' }, { id: 'CR-19864', study: 'HIV-PROG', drawn: '2014-08-19', method: 'v2', release: '3.58.0', a: 'A*02:01:01 / A*31:01:02', b: 'B*35:01:01 / B*39:05:01', c: 'C*04:01:01 / C*07:02:01', drb1: 'DRB1*04:04:01 / DRB1*08:02:01', dqb1: 'DQB1*03:02:01 / DQB1*04:02:01', res: 'Allele', status: 'Final' }, { id: 'CR-19802', study: 'HIV-PROG', drawn: '2014-06-03', method: 'v2', release: '3.58.0', a: 'A*02:01:01 / A*24:02:01', b: 'B*35:43:01 / B*40:02:01', c: 'C*04:01:01 / C*15:02:01', drb1: 'DRB1*13:03:01 / DRB1*16:02:01', dqb1: 'DQB1*03:01:01 / DQB1*03:02:01', res: 'Allele', status: 'Final' }, { id: 'CR-11427', study: 'ARBO-OUT', drawn: '2011-02-15', method: 'v1', release: '3.55.0', a: 'A*01:01:01 / A*02:01:01', b: 'B*08:01:01 / B*44:02:01', c: 'C*07:01:01 / C*05:01:01', drb1: 'DRB1*03:01 / DRB1*04:01', dqb1: 'DQB1*02:01 / DQB1*03:02', res: '2-field', status: 'Final' }, { id: 'CR-11390', study: 'ARBO-OUT', drawn: '2011-01-27', method: 'v1', release: '3.55.0', a: 'A*03:01:01 / A*11:01:01', b: 'B*07:02:01 / B*35:01:01', c: 'C*07:02:01 / C*04:01:01', drb1: 'DRB1*15:01 / DRB1*11:04', dqb1: 'DQB1*06:02 / DQB1*03:01', res: '2-field', status: 'Final' }, { id: 'CR-11288', study: 'ARBO-OUT', drawn: '2010-11-09', method: 'v1', release: '3.55.0', a: 'A*02:01:01 / A*26:01:01', b: 'B*38:01:01 / B*57:01:01', c: 'C*12:03:01 / C*06:02:01', drb1: 'DRB1*07:01 / DRB1*13:01', dqb1: 'DQB1*03:03 / DQB1*06:03', res: '2-field', status: 'Final' }, ]; // ── Ambiguity Queue ─────────────────────────────────────────────────────── // Split by what actually resolves it: bench work, convention, or judgment. const LAB_AMBIGUITY = [ { id: 'CR-24085', locus: 'DPB1', str: 'DPB1*04:01:01 / 04:02:01 (phase)', cause: 'cis/trans phase, heterozygote', route: 'Allele-specific amplification', owner: 'Bench' }, { id: 'CR-24096', locus: 'DRB1', str: 'DRB1*13:01:01G', cause: 'G group — identical ARD sequence', route: 'Report at G-group resolution', owner: 'Convention' }, { id: 'CR-23940', locus: 'C', str: 'C*14:02:01 / 14:03', cause: 'exon 3 SNP outside read', route: 'Re-amplify exon 3', owner: 'Bench' }, { id: 'CR-11427', locus: 'A', str: 'A*02:01P', cause: 'legacy 2-field call, v1 method', route: 'Leave as delivered — study is closed', owner: 'Judgment' }, ]; // ── Re-resolution Diff ──────────────────────────────────────────────────── // What moving to the current release actually changed. The point: most of it is // nomenclature, and only the last kind matters clinically. const LAB_RERESOLVE = { from: '3.58.0', to: '3.60.0', scanned: 1284, buckets: [ { kind: 'Renamed', n: 37, note: 'Allele name changed; same sequence. No action.', tone: 'flat' }, { kind: 'Expanded ambiguity', n: 12, note: 'New allele joins an existing string. Re-report if study is open.', tone: 'warn' }, { kind: 'Resolved', n: 5, note: 'Previously ambiguous, now unique. Ledger updated.', tone: 'good' }, { kind: 'Changed pair', n: 2, note: 'Resolved allele pair differs — review before any downstream use.', tone: 'bad' }, ], }; // ── Studies & Cohorts ───────────────────────────────────────────────────── // The lab is a service core: the unit of work is somebody else's study. const LAB_STUDIES = [ { id: 'HSCT-2026', name: 'Donor–recipient matching', pi: 'Transplant program', n: 64, need: 'A, B, C, DRB1, DQB1, DPB1 — allele level', out: 'Match report per pair', status: 'Active', reuse: 'Yes' }, { id: 'VAX-COV', name: 'Vaccine epitope coverage panel', pi: 'Immunology', n: 96, need: 'A, B, DRB1 — allele level', out: 'Coverage table', status: 'Active', reuse: 'Yes' }, { id: 'PANC-MHC', name: 'Tumour MHC class I expression', pi: 'External collaborator', n: 42, need: 'Class I only', out: 'Typing table for manuscript', status: 'In review', reuse: 'Yes' }, { id: 'CANINE-X', name: 'Canine / human peptide cross-presentation', pi: 'Comparative oncology', n: 18, need: 'Class I + DLA-88', out: 'Typing table + peptide map', status: 'Published', reuse: 'Yes' }, { id: 'HIV-PROG', name: 'HLA & HIV disease progression', pi: 'External cohort', n: 214, need: 'A, B, C, DRB1, DQB1 + KIR', out: 'Association tables', status: 'Published', reuse: 'Yes' }, { id: 'ARBO-OUT', name: 'Arbovirus infection outcome', pi: 'External cohort', n: 186, need: 'Class I + II, 2-field', out: 'Association tables', status: 'Closed', reuse: 'No' }, ]; // ── Method Performance ──────────────────────────────────────────────────── // The 17-year asset, as a table instead of institutional memory. const LAB_METHOD_PERF = [ { method: 'SBT v1', years: '2009–2013', runs: 412, first: '88.1%', amb: '14.2%', conc: '99.4%' }, { method: 'SBT v2', years: '2014–2020', runs: 968, first: '94.6%', amb: '7.8%', conc: '99.7%' }, { method: 'SBT v2.3', years: '2021–', runs: 604, first: '97.2%', amb: '4.1%', conc: '99.9%' }, ]; // Stat tiles for the Typing hub dashboard. const LAB_STATS = [ { label: 'Subjects typed', value: '1,284', sub: 'across 6 studies, 2009–2026' }, { label: 'Ambiguity queue', value: '4', sub: '2 bench · 1 convention · 1 judgment' }, { label: 'Reference release', value: '3.60.0', sub: 'current · archive re-resolved' }, { label: 'Calls needing review', value: '2', sub: 'resolved pair changed on 3.60.0' }, ]; window.LAB_METHODS = LAB_METHODS; window.LAB_RELEASES = LAB_RELEASES; window.LAB_ASSIGNMENTS = LAB_ASSIGNMENTS; window.LAB_AMBIGUITY = LAB_AMBIGUITY; window.LAB_RERESOLVE = LAB_RERESOLVE; window.LAB_STUDIES = LAB_STUDIES; window.LAB_METHOD_PERF = LAB_METHOD_PERF; window.LAB_STATS = LAB_STATS;