From c1670accb9604ce0ca8e6564918d57b55ec213b8 Mon Sep 17 00:00:00 2001 From: Dave Lawrence Date: Wed, 19 Aug 2026 02:10:22 +0000 Subject: [PATCH 1/3] Paper: reframe around resolution goal, fair comparisons, terminology - #112 Address paper feedback (claude/paper_feedbac_2026-08-19.md): - Lead abstract/intro with the resolution goal (resolve as many real-world HGVS as possible) rather than "better UTA"; frame coverage, cleaning and version substitution as the three things serving that goal - Replace the unfair local-vs-remote throughput claim with like-for-like comparisons (local-to-local, remote-to-remote) in abstract and R3 - Recast the R2 Ensembl comparison as a capability point, not an accuracy headline; make RefSeq parity plus the historical submitted corpus the fair head-to-head, resolving the apparent Ensembl contradiction - Rename "version fallback"/"bumping" to "version substitution", "Tier 1/2" to "public/private data", and de-slang "a version bump can move a variant" - Cite the Ensembl VEP RefSeq alignment-gap limitation (ensembl-vep#1053) - Trim the JSON-format, benchmarking and TARK sections; lead the Discussion with the general-purpose transcript-source angle - Add claude/plans/new_analyses_plan.md capturing deferred analyses Paper-only prose and framing; no data or client-code changes. --- claude/plans/new_analyses_plan.md | 94 ++++++++++++++++++++++ paper/abstract.md | 28 ++++--- paper/discussion.md | 47 +++++------ paper/introduction.md | 23 +++--- paper/methods.md | 46 +++++------ paper/references.bib | 8 ++ paper/results.md | 126 ++++++++++++++++-------------- 7 files changed, 241 insertions(+), 131 deletions(-) create mode 100644 claude/plans/new_analyses_plan.md diff --git a/claude/plans/new_analyses_plan.md b/claude/plans/new_analyses_plan.md new file mode 100644 index 0000000..ae7a206 --- /dev/null +++ b/claude/plans/new_analyses_plan.md @@ -0,0 +1,94 @@ +# New analyses to do for the paper (deferred) + +From Dave's feedback (`claude/paper_feedbac_2026-08-19.md`, 2026-08-19). These need +re-running scripts / new data work, so they are parked here. The prose/framing edits +that do **not** need new data have already been applied to the paper. + +Constraint reminder: never run against full datasets (CLAUDE.md). Use samples / local +UTA / committed test data. No `cdot_private` example strings in-repo. + +--- + +## 1. Fair time-bucketed sampling of the ClinVar submitted (SCV) corpus [R2] + +**Why:** the current submitted-corpus sample is a single fixed-seed flat draw over all +unique (AlleleID, string) pairs, which has recency bias (ClinVar grows over time, so a +flat draw over-represents recent submissions). + +**Do:** +- In `build_clinvar_submitted_pairs.py`, add time-bucketed sampling: bucket SCV records + by submission date (or release/version era) and draw evenly across buckets, so + historical submissions are represented fairly. +- Keep a **second** run that is a whole-file random sample, reported alongside and + explicitly labelled as recency-biased (reflects the live distribution). +- Report both. The time-bucketed one is the fair "what labs submitted over the years" + number; the random one is "what the current file looks like". + +**Touches:** R2 numbers in `results.md`, `clinvar_submitted.csv`, Methods description of +the sampling. + +## 2. Run local UTA over (all of) ClinVar [R2 / R3] + +**Why:** we currently only sample the cdot-vs-UTA comparison "because UTA is slow", but +that caveat is for the *remote* server. The **local** `uta_20241220` may be able to do +the whole ClinVar set in a few hours. + +**Do:** run the full ClinVar resolution through local UTA (background job), so the +head-to-head is full-scale, not sampled. Removes the "gated to a sample by UTA +throughput" caveat for the local case. + +**Touches:** R2 (drop/reduce the sampling caveat), possibly R3. + +## 3. Why is version substitution needed at all? (submitter attribution) [new analysis] + +**Why:** we ingest every RefSeq/Ensembl release off the FTP sites, so in principle we +should have every published version. Yet labs cite versions we don't hold. Dave's +hypothesis: those transcripts come from a small number of labs that align transcripts +to the genome themselves (so the version never appeared in an official annotation +release). + +**Do (exploratory first, time-boxed):** +- Take the cited transcript versions that are absent from cdot's data. +- Group by submitter (SCV submitter / lab) in the ClinVar VCV XML. +- Test whether the absent-version citations concentrate in a small number of submitters, + or whether specific labs dominate. +- Characterise: are these self-aligned transcripts, pre-release versions, or genuine + gaps in our ingest? + +**Scope risk:** this is a genuinely new result and could balloon. Decide whether it +earns a place in the paper (probably a short paragraph in R2 or Discussion) before +investing heavily. + +## 4. Warm-cache benchmark rerun [R3] + +**Why:** the full-scale R3 paragraph currently says the local-JSON and REST runs' "cache +conditions differed, so their small difference is not evidence of REST outrunning local +JSON." That is a hand-wave. Replace it with a hot-cache protocol. + +**Do:** for the full-scale runs, do one throwaway pass to warm the sequence-layer cache, +discard it, then time the next pass. Report the hot-cache time and note it is only +marginally slower than cold. Removes the "cache conditions differed" sentence entirely. + +**Touches:** R3 full-scale paragraph, `benchmark.csv` (if regenerated), Methods. + +## 5. Drop non-HGVS input from the cleaning residual corpus [R4] + +**Why:** the R4 residual currently includes "non-HGVS input (pasted URLs, report +templates, prose)". Dave's point: that is a data-collection artifact, not a measure of +tool correctness, and should be removed from the denominator before counting the +residual, since it does not reflect what the cleaner could ever be expected to fix. + +**Do:** filter non-HGVS input out of the production cleaning corpus before computing the +residual rate, so the residual reflects genuine HGVS-repair ceiling only. Recompute the +R4 residual number and the Table S6 taxonomy denominators. + +**Touches:** R4 residual paragraph + Table 2 context, `cleaning.csv`, Supplementary +Table S6. + +--- + +## Also consider (from feedback, smaller) + +- ~~**VEP + RefSeq alignment gaps citation:**~~ DONE. R1 now cites Ensembl/ensembl-vep + issue #1053 (`@VepHgvsGaps` in references.bib) for the claim that VEP does not apply + transcript-to-genome alignment gaps when converting c. to genomic coordinates. diff --git a/paper/abstract.md b/paper/abstract.md index 3fde1cd..80167ff 100644 --- a/paper/abstract.md +++ b/paper/abstract.md @@ -4,12 +4,14 @@ **Motivation:** -Resolving a transcript-level HGVS variant description to genomic coordinates requires -accurate, versioned transcript-to-genome alignments. The standard source for this, -UTA, requires a PostgreSQL database, covers only -~{{ literature.uta_count | commas }} alignments, retains limited transcript history, -and omits Ensembl, while the descriptions real pipelines receive are often malformed or -cite retired transcript versions. +Clinical and research pipelines must resolve transcript-level HGVS variant descriptions +to genomic coordinates, and the practical goal is to resolve as many real-world +descriptions as possible, including the malformed strings and long-retired transcript +versions that accumulate in variant databases and clinical records. The standard +transcript source for the Python HGVS libraries, UTA, forces a tradeoff between a +locally installed PostgreSQL database and a slow public server that many clinical +networks firewall; it covers only ~{{ literature.uta_count | commas }} RefSeq +alignments, retains limited transcript history, and omits Ensembl. **Results:** @@ -21,16 +23,18 @@ the Python HGVS libraries, T2T-CHM13v2.0, as a single gzipped JSON file or a RES version that is no longer current, cdot resolved {{ clinvar_submitted.cdot_resolved_pct | dp(1) }}% versus {{ clinvar_submitted.uta_resolved_pct | dp(1) }}% for UTA. Loaded in memory, cdot -resolves ~{{ benchmark.cdot_local_tps | commas }} HGVS/second, nearly four orders of -magnitude above the public UTA server. A parser-independent cleaning step +resolves ~{{ benchmark.cdot_local_tps | commas }} HGVS/second, about four times a +locally installed UTA, and compared remote-to-remote its REST API is roughly two orders +of magnitude faster than the public UTA server. A parser-independent cleaning step (`clean_hgvs()`) repairs common formatting errors before resolution, and an opt-in -fallback substitutes a retired transcript version only when a coordinate-safety check -confirms the substitution does not move the variant. +version-substitution step supplies a retired transcript version only when a +coordinate-safety check confirms it does not change the variant's coordinate. **Availability and Implementation:** -https://github.com/SACGF/cdot; `pip install cdot`; MIT licence. Data files (JSON.gz) at -cdotlib.org and [Zenodo DOI]. +https://github.com/SACGF/cdot; `pip install cdot`; MIT licence. Data files (JSON.gz) are +published on the GitHub releases page and archived at [Zenodo DOI]; a REST API is served +at cdotlib.org. **Contact:** [email] diff --git a/paper/discussion.md b/paper/discussion.md index bb1f54d..b4d6828 100644 --- a/paper/discussion.md +++ b/paper/discussion.md @@ -1,19 +1,26 @@ # Discussion -For biocommons/hgvs users, cdot removes UTA's constraints (a PostgreSQL database, -RefSeq only, limited history) with a drop-in provider that adds Ensembl, +cdot is, first, a general-purpose source of versioned transcript-to-genome alignments: +RefSeq and Ensembl together, across GRCh37, GRCh38, and T2T-CHM13v2.0, with the full +release history, in a JSON format that parses far faster than the GTF/GFF files it is +built from and can be read from any language, not only Python. The per-release JSON on +the GitHub releases page is a faster-loading drop-in for the corresponding GTF/GFF, and +the REST API returns transcript coordinates on demand and in batches, so thin clients +need not bundle large annotation downloads. + +For biocommons/hgvs users specifically, cdot removes UTA's constraints (a PostgreSQL +database, RefSeq only, limited history) with a drop-in provider that adds Ensembl, T2T-CHM13v2.0, and the full release history. For the wider HGVS ecosystem, it recovers -the malformed and version-drifted descriptions real pipelines receive, with every -change reported for audit and a version substitution refused unless verified -coordinate-safe. +the malformed and version-drifted descriptions real pipelines receive, with every change +reported for audit and a version substitution refused unless verified coordinate-safe. -cdot also integrates Ensembl TARK: `EnsemblTarkDataProvider` is, to our knowledge, the -only client that exposes the Ensembl Transcript Archive through the biocommons/hgvs -data-provider interface, for pipelines that require Ensembl's own authoritative source. -Tools such as VariantValidator [@Freeman2018], built on biocommons/hgvs with a -self-hosted copy of UTA, and Mutalyzer [@Lefter2021], which uses its own normalisation -stack, are widely used to check and correct HGVS descriptions; cdot is complementary to -them, supplying the transcript-coordinate layer, not a validation service. +For pipelines that require Ensembl's own authoritative source, +`EnsemblTarkDataProvider` also exposes the Ensembl Transcript Archive (TARK) through the +same interface. Tools such as VariantValidator [@Freeman2018], built on biocommons/hgvs +with a self-hosted copy of UTA, and Mutalyzer [@Lefter2021], which uses its own +normalisation stack, are widely used to check and correct HGVS descriptions; cdot is +complementary to them, supplying the transcript-coordinate layer, not a validation +service. Nor is cdot the first tool to repair broken HGVS. VariantValidator corrects the mistakes it can interpret [@Freeman2018]; Mutalyzer's Name Checker returned a corrected @@ -57,16 +64,12 @@ carry the checker's ranked suggestions alongside the validation error, although service does not apply them. The LOVD measurement above therefore also characterises the syntax-repair layer surfaced by a current VariantValidator pipeline. -Beyond HGVS resolution, the JSON representation is useful in its own right. It parses -far faster than the GTF/GFF files it is built from, and the per-release JSON published -on the GitHub releases page is a faster-loading drop-in for the corresponding GTF/GFF. -The REST API returns transcript coordinates on demand and in batches, so thin clients -need not bundle large annotation downloads; Ensembl's public REST service covers only -Ensembl transcripts at the latest version, while cdot serves both consortia with -history. The format is also read outside Python: ferro-hgvs [@FerroHgvs], an -independent HGVS parser and normaliser written in Rust, loads cdot JSON directly as its -transcript-to-genome alignment source. A consumer in another language needs only a JSON -parser, not an HGVS library or the Python data-provider interface. +The general-purpose value of the format shows in reuse beyond Python and beyond +biocommons/hgvs. Where Ensembl's public REST service covers only Ensembl transcripts at +the latest version, cdot serves both consortia with history; and ferro-hgvs [@FerroHgvs], +an independent HGVS parser and normaliser written in Rust, loads cdot JSON directly as +its transcript-to-genome alignment source, needing only a JSON parser, not an HGVS +library or the Python data-provider interface. cdot separates unambiguous string cleaning, safe to apply automatically, from heuristics that can be wrong (an adjacent transcript version, a canonical transcript diff --git a/paper/introduction.md b/paper/introduction.md index ddc471b..a4442d0 100644 --- a/paper/introduction.md +++ b/paper/introduction.md @@ -14,12 +14,9 @@ over five years of production logs, only ~{{ literature.mutalyzer_error_pct | dp(0) }}% contained a syntactic or semantic error, and Mutalyzer could automatically correct only ~{{ literature.mutalyzer_autocorrect_pct | dp(0) }}% (all rates per unique description) -[@Lefter2021]. Transcript choice also matters downstream: only -{{ literature.lof_agreement_pct | dp(0) }}% of putative loss-of-function variants were -classified as loss-of-function by both RefSeq and Ensembl annotation sets in ANNOVAR -[@McCarthy2014], so covering both annotation sources matters. +[@Lefter2021]. -The two dominant Python HGVS libraries are biocommons/hgvs [@Hart2015; @Wang2018] and +The two dominant Python HGVS libraries are biocommons/hgvs [@Wang2018] and PyHGVS. biocommons/hgvs reads from a pluggable data provider behind a common interface, which other tools such as hgvs-weaver [@HgvsWeaver] also implement, so a single transcript backend serves multiple clients; PyHGVS loads transcripts from its own data @@ -40,9 +37,13 @@ whichever transcript version the lab used at the time, so making them usable mea resolving as many of these real-world strings as possible, including ones that reference transcript versions long retired from the current annotation. -To do this, cdot generates compact JSON files from all available RefSeq GFF3 and -Ensembl GTF annotation releases, covering {{ coverage.total_count | commas }} versioned -transcript alignments across GRCh37, GRCh38, and T2T-CHM13v2.0 [@Nurk2022]. The files -load locally in seconds and can also be served on demand through a REST API -(cdotlib.org), so the same data backs both a fast in-memory provider and lightweight -remote access. +To resolve as many of those descriptions as possible, cdot combines three things: broad +versioned transcript coverage, so the cited version is present in the first place; +parser-independent string cleaning, so a malformed description still parses; and an +opt-in, coordinate-safe version substitution for the cases where the exact cited version +is genuinely gone. For coverage, cdot generates compact JSON files from all available +RefSeq GFF3 and Ensembl GTF annotation releases, covering +{{ coverage.total_count | commas }} versioned transcript alignments across GRCh37, +GRCh38, and T2T-CHM13v2.0 [@Nurk2022]. The files load locally in seconds and can also be +served on demand through a REST API (cdotlib.org), so the same data backs both a fast +in-memory provider and lightweight remote access. diff --git a/paper/methods.md b/paper/methods.md index 79b35a8..abdfb20 100644 --- a/paper/methods.md +++ b/paper/methods.md @@ -4,8 +4,7 @@ cdot merges three transcript-annotation sources into a single dataset per build (Figure 1A), downloading the complete run of historical releases from the RefSeq and -Ensembl FTP sites because an NM_ version retired years ago is still cited in patient -records and ClinVar submissions: +Ensembl FTP sites: 1. **RefSeq GFF3**: {{ sources.refseq_grch37_releases | int }} GRCh37, {{ sources.refseq_grch38_releases | int }} GRCh38, and @@ -35,19 +34,14 @@ gzip-compressed JSON. ## JSON format JSON parses quickly in every major language and serialises cleanly over HTTP, so the -same files drive both the in-memory provider and the REST API. Each transcript entry stores shared metadata (`gene_name`, `hgnc`, `biotype`, -accession and version) plus a `genome_builds` dict keyed by assembly name. The build is -always a dict key, so a single-build file is a drop-in GTF/GFF replacement and the REST -API can return a transcript's GRCh37, GRCh38, and T2T-CHM13v2.0 alignments in one -response. Build-specific fields (`contig`, `strand`, CDS bounds, exons; Supplementary -Table S3) include a per-exon `gap` string (e.g. `"M196 I1 M61"`) recording -transcript-vs-genome indels, converted to HGVS CIGAR format at query time. A root-level -`schema_version` lets clients reject incompatible files on load. - -Canonical transcript tags (`mane_select`, `mane_plus_clinical`, `refseq_select`, and -`ensembl_canonical`) are stored per build where present. MANE Select covers ->{{ literature.mane_coverage_pct | dp(0) }}% of protein-coding genes [@Morales2022] -and is available for GRCh38; Ensembl canonical tags cover GRCh37 and GRCh38. +same files drive both the in-memory provider and the REST API. Each transcript entry +stores shared metadata plus a `genome_builds` dict keyed by assembly name, so one entry +carries a transcript's GRCh37, GRCh38, and T2T-CHM13v2.0 alignments and a single-build +file is a drop-in GTF/GFF replacement. Per-build fields include a per-exon `gap` string +recording transcript-vs-genome indels, converted to HGVS CIGAR format at query time, and +canonical tags (MANE Select and Plus Clinical, RefSeq Select, Ensembl canonical) where +present; a root-level `schema_version` lets clients reject incompatible files on load. +The full schema is Supplementary Table S3. ## String cleaning (`clean_hgvs()`) @@ -76,7 +70,7 @@ dropped entirely (`000059.4:c.68del`). `resolve_missing_accession_prefix()`, app kind letter allows and restores the prefix only when exactly one exists in the loaded data, reported as an `HGVSFix` like every other repair. -## Version fallback +## Version substitution A separate, opt-in helper, `get_best_transcript_version()`, addresses transcript-version drift. Substituting a different version is a heuristic that can be wrong, so it is @@ -144,7 +138,7 @@ Resolution accuracy and throughput are measured with scripts committed to the repository (`paper/scripts/`); protocol detail beyond what follows is in Supplementary Methods. `benchmark_resolution.py` resolves real (g.HGVS, c.HGVS) pairs through a pluggable provider (local JSON, REST, or UTA) and reports resolution rate, recovery -from cleaning and version fallback, and speed; the ClinVar pair set is built by +from cleaning and version substitution, and speed; the ClinVar pair set is built by `build_clinvar_pairs.py`. Cleaning is evaluated on a production query corpus and, as a reproducible control, with `inject_and_clean.py`, which injects each fix category into clean ClinVar strings. `lovd_head_to_head.py` runs the same injected cases through both @@ -158,17 +152,13 @@ originals. sequence-aware validation services, VariantValidator [@Freeman2018] and Mutalyzer [@Lefter2021], over their public REST APIs ({{ vv_mutalyzer_comparison.service_date }}; remote services cannot be version-pinned, -so the facts record the service date and the version metadata each API reports). -VariantValidator requests are routed by accession family (its Ensembl transcripts live -on a separate endpoint) and a case counts as recovered when the validated transcript -description matches the target; for Mutalyzer a match by either its -`corrected_description` or its `normalized_description` counts, since the normalizer -may legitimately re-shift a representation. On the uncorrupted originals, a valid input -the service *alters* is a false correction, while one it *rejects* (for example -Mutalyzer's `EINTRONIC` for intronic positions on a transcript reference, or a -transcript absent from VariantValidator's database) is counted separately as a -validity or coverage position, matching how LOVD's flagged-invalid originals are -reported. Version-fallback safety is measured by `compute_version_stability.py` on +so the facts record the service date and each API's reported version). A case counts as +recovered when the service's validated description matches the target; on the +uncorrupted originals, a valid input the service *alters* is a false correction while one +it *rejects* is counted separately as a validity or coverage position, matching how +LOVD's flagged-invalid originals are reported. The per-service request routing and +matching rules are in Supplementary Methods. Version-substitution safety is measured by +`compute_version_stability.py` on GRCh38, over a seeded {{ version_stability.sample_n | commas }}-accession sample of accessions cdot holds at two or more versions; the same run bins preserved coding bases by relative CDS position (Supplementary Figure S1). diff --git a/paper/references.bib b/paper/references.bib index 13fb9be..20e55d0 100644 --- a/paper/references.bib +++ b/paper/references.bib @@ -43,6 +43,14 @@ @misc{LovdHgvsChecker note = {Accessed 2026}, } +@misc{VepHgvsGaps, + author = {{Ensembl VEP}}, + title = {{HGVS} input does not take into account cDNA / genome alignment gaps}, + year = {2021}, + howpublished = {\url{https://github.com/Ensembl/ensembl-vep/issues/1053}}, + note = {Ensembl/ensembl-vep issue \#1053, opened 16 September 2021; accessed 2026}, +} + @misc{VariantValidator400, author = {{VariantValidator}}, title = {{VariantValidator} release 4.0.0: integration of the {LOVD} {HGVS} syntax checker}, diff --git a/paper/results.md b/paper/results.md index ea3d050..74cd600 100644 --- a/paper/results.md +++ b/paper/results.md @@ -1,9 +1,9 @@ # Results > **Provenance flags.** Results are reproducible from public data committed to this repo -> unless marked **[Tier 2]**, which denotes aggregate statistics from a private production -> corpus, published as frozen constants and not reproducible by a referee (see Methods / -> data availability). +> unless marked **[private data]**, which denotes aggregate statistics from a private +> production corpus, published as frozen constants and not reproducible by a referee (see +> Methods / data availability). --- @@ -21,31 +21,33 @@ retired it from the current annotation) and Ensembl itself, absent from UTA enti ({{ coverage.ensembl_unique_count | commas }} accessions present in cdot). T2T-CHM13v2.0 adds a further {{ coverage.t2t_unique_count | commas }} alignments, making cdot the first transcript data source to bring that assembly to the Python HGVS -libraries (biocommons/hgvs and PyHGVS); Ensembl VEP can already generate HGVS against -T2T, but it is a standalone annotation tool, not a transcript backend for these -libraries. The JSON format also stores per-exon alignment-gap information (indels of -the transcript relative to the genome) that downstream libraries apply during -coordinate conversion. +libraries (biocommons/hgvs and PyHGVS). The JSON format also stores per-exon +alignment-gap information (indels of the transcript relative to the genome) that +downstream libraries apply during coordinate conversion; Ensembl VEP, which can itself +generate HGVS, does not apply these transcript-to-genome gaps when converting a c. +description to genomic coordinates [@VepHgvsGaps], so it can misplace variants that fall +downstream of an indel in a gapped RefSeq alignment. ## R2: ClinVar and clinical resolution accuracy -To measure practical impact, a seeded sample of -{{ clinvar.n_variants | commas }} ClinVar [@Landrum2025] variant descriptions, spanning -RefSeq (NM_) and Ensembl (ENST) transcripts, was resolved against cdot and a locally -loaded UTA (release `uta_20241220`) through the identical biocommons/hgvs code path, -with sequences from a shared local SeqRepo so only the transcript-data layer differs -(the comparison is gated to a sample by UTA's throughput; the full ClinVar set is -resolved through cdot alone below). cdot resolved -{{ clinvar.cdot_resolution_pct | dp(1) }}% versus -{{ clinvar.uta_resolution_pct | dp(1) }}% for UTA. The gap is Ensembl: on the committed -ClinVar test pairs ({{ clinvar.n_refseq | commas }} RefSeq and -{{ clinvar.n_ensembl | commas }} Ensembl), with cdot serving transcript sequence from a -local genome FASTA so no pair is dropped for a sequence SeqRepo lacks, RefSeq is at -parity (cdot {{ clinvar.cdot_refseq_pct | dp(1) }}%, UTA -{{ clinvar.uta_refseq_pct | dp(1) }}%), while on Ensembl cdot resolves -{{ clinvar.cdot_ensembl_pct | dp(1) }}% and UTA -{{ clinvar.uta_ensembl_pct | dp(1) }}%, UTA storing no Ensembl alignments at all -(Supplementary Table S4). +Two comparisons measure resolution rate against a locally loaded UTA (release +`uta_20241220`): a controlled current-version check here, and the historical +submitted-string corpus below that is the real test of transcript depth. + +For the current-version check, a seeded ClinVar [@Landrum2025] sample of +preferred-transcript descriptions, deliberately including both RefSeq (NM_) and Ensembl +(ENST) transcripts, was resolved against cdot and UTA through the identical +biocommons/hgvs code path, with sequences from a shared local SeqRepo so only the +transcript-data layer differs. On RefSeq the two backends are at parity (cdot +{{ clinvar.cdot_refseq_pct | dp(1) }}%, UTA {{ clinvar.uta_refseq_pct | dp(1) }}%; cdot +serving transcript sequence from a local genome FASTA so no pair is dropped for a +sequence SeqRepo lacks). The remaining difference is capability, not accuracy: UTA stores +no Ensembl alignments at all, so it resolves {{ clinvar.uta_ensembl_pct | dp(1) }}% of +the Ensembl pairs against cdot's {{ clinvar.cdot_ensembl_pct | dp(1) }}% (Supplementary +Table S4). Because this sample is deliberately Ensembl-enriched to exercise that +capability, its aggregate rate is not a like-for-like accuracy score, so we do not read a +single headline resolution figure from it; the fair head-to-head is RefSeq parity here +and the historical submitted corpus below. At full scale, resolving every RefSeq and Ensembl c.HGVS in ClinVar through cdot alone ({{ clinvar_vcf.n_pairs | commas }} (g., c.) pairs) reaches @@ -62,15 +64,18 @@ variant_summary, ClinVar's own recomputed preferred-transcript name, always at t current transcript version. They therefore measure a current-version ceiling and cannot exercise historical transcript depth. -### What laboratories actually submit +### What laboratories submitted -To measure what laboratories actually write, we built a second public corpus from the -per-submission (SCV) HGVS attributes of the ClinVar VCV XML: each submitted string kept -verbatim and joined to the variant's VCF coordinate as ground truth via its AlleleID -({{ clinvar_submitted.n_unique_pairs | commas }} unique submitted-string/variant pairs -from {{ clinvar_submitted.n_scv_tx_strings | commas }} SCV transcript expressions; -Methods). The corpus is entirely RefSeq (not one submitted string cites an Ensembl -transcript), and its version profile confirms that submitted traffic is historical: +To measure what laboratories actually submitted over the years, we built a second public +corpus from the per-submission (SCV) HGVS attributes of the ClinVar VCV XML: each +submitted string kept verbatim and joined to the variant's VCF coordinate as ground +truth via its AlleleID ({{ clinvar_submitted.n_unique_pairs | commas }} unique +submitted-string/variant pairs from {{ clinvar_submitted.n_scv_tx_strings | commas }} SCV +transcript expressions; Methods). Unlike the deliberately Ensembl-enriched sample above, +this corpus reflects the natural submission mix, which is essentially all RefSeq (not one +submitted string cites an Ensembl transcript; Ensembl accessions enter ClinVar through +its recomputed names, not submitter descriptions). Its version profile confirms that +submitted traffic is historical: {{ clinvar_submitted.version_not_current_pct | dp(1) }}% of submitted strings cite a transcript version that is no longer the version in the current RefSeq annotation release ({{ clinvar_submitted.scv_weighted_not_current_pct | dp(1) }}% weighted by @@ -94,17 +99,17 @@ backends {{ clinvar.cdot_refseq_pct | dp(1) }}% above) opens to UTA alone). The submitted strings are largely well-formed, so cleaning has little to rescue (`fix_hgvs()` repaired {{ clinvar_submitted.rescued_by_fix | int }} string, with {{ clinvar_submitted.regressions | int }} regressions). The residual -{{ clinvar_submitted.residual_pct | dp(1) }}% after cleaning and version fallback +{{ clinvar_submitted.residual_pct | dp(1) }}% after cleaning and version substitution ({{ clinvar_submitted.residual_n | int }} of {{ clinvar_submitted.n_sample | commas }}) is dominated by version effects, not formatting: {{ clinvar_submitted_residual.version_refused | int }} cite a version -absent from the data, where the fallback declines to substitute because coordinate +absent from the data, where the substitution step declines to act because coordinate safety cannot be verified, and {{ clinvar_submitted_residual.coordinate_drift | int }} resolve through the cited historical version to a coordinate that differs from ClinVar's current interpretation; the full breakdown is in Supplementary Table S8. -**[Tier 2].** The same gap holds on the historical clinical data that motivated cdot: +**[private data].** The same gap holds on the historical clinical data that motivated cdot: the complete set of {{ historical.n_lines | commas }} unique HGVS descriptions imported into the Australian Genomics Shariant variant-sharing platform [@Tudini2022], classifications submitted by clinical laboratories over many years, each written @@ -147,12 +152,14 @@ resolves at {{ benchmark.cdot_local_tps | int }} HGVS/s (median). Batching the per-transcript REST lookups into one `prefetch()` request (all transcripts for the set, under a second, untimed) makes REST throughput equivalent to local JSON, the two differing by under 1% across repeats: with the transcript data in process memory, both -are bounded by the shared engine and sequence layer, not by the transcript backend. A -locally loaded UTA reached {{ benchmark.uta_local_tps | int }} HGVS/s, about a quarter -of local-JSON throughput, each lookup being a set of SQL queries instead of a dict hit. -The public remote UTA database, at {{ benchmark.uta_remote_tps | dp(2) }} HGVS/s, is -nearly four orders of magnitude slower than any local configuration, paying wide-area -round trips to a shared server on every lookup. +are bounded by the shared engine and sequence layer, not by the transcript backend. +Comparing like with like: locally, a loaded UTA reached +{{ benchmark.uta_local_tps | int }} HGVS/s, about a quarter of local-JSON throughput, +each lookup resolving a set of SQL queries where cdot needs a single JSON object; and +remote to remote, cdot's REST API at {{ benchmark.cdot_rest_tps | int }} HGVS/s (one +request per transcript, no prefetch) is more than two orders of magnitude faster than the +public UTA server's {{ benchmark.uta_remote_tps | dp(2) }} HGVS/s, which pays wide-area +round trips to a shared database on every lookup. At scale, a single local-JSON process resolved the entire set of 3,660,452 unique ClinVar (g.HGVS, c.HGVS) pairs in ~92 minutes (665 HGVS/s; 99.3% produced a genomic @@ -165,10 +172,12 @@ to close to a year. ## R4: String cleaning recovers malformed real-world HGVS -**[Tier 2].** The main test of cleaning is a production query stream: N = 32,752 real -queries typed into the HGVS search box of clinical and research variant-curation -platforms based on VariantGrid [@VariantGrid]. The strings are whatever a clinician or -curator pasted or typed, carrying the damage of their route to the box: whitespace and +**[private data].** The main test of cleaning is a production query stream: N = 32,752 +real search-box queries from clinical and research variant-curation platforms based on +VariantGrid [@VariantGrid], restricted to the subset that matched a broad HGVS regex +(loosely HGVS-shaped strings a cleaner could plausibly repair, not arbitrary free-text +search terms). The strings are whatever a clinician or curator pasted or typed, carrying +the damage of their route to the box: whitespace and non-printable characters from Word documents and report PDFs, lost casing, transposed punctuation, trailing protein annotations. The cleaning pipeline (`clean_hgvs()` plus the provider-verified accession-prefix restoration, Methods) raised the fraction @@ -190,7 +199,7 @@ historical transcript depth and the second with `clean_hgvs()`. **Table 2. Fixes applied across the production corpus (N = 32,752).** Each row is a cleaning fix category, with the number of rescued queries in which it fired and its share of the 1,721 rescued queries. Categories overlap (a single query may need several -fixes), so the counts sum to more than the total. *(Tier 2; counts are frozen constants +fixes), so the counts sum to more than the total. *(Private data; counts are frozen constants from a deterministic run of the cleaning pipeline, `clean_hgvs()` plus the provider-verified accession-prefix restoration, over the production corpus.)* @@ -218,7 +227,7 @@ no-regression guarantee on which the production result depends. ### Residual errors: the ceiling of cleaning *(Table S6)* -**[Tier 2].** The 3.3% of the production corpus (1,075 queries; 826 unique strings) +**[private data].** The 3.3% of the production corpus (1,075 queries; 826 unique strings) that still fail to parse after cleaning define the ceiling of pure string repair. Classified under a fixed decision-tree taxonomy (Supplementary Table S6, with synthesised examples and the classification method and its limitations), just over half @@ -227,19 +236,20 @@ is in principle fixable and marks the frontier for future cleaning rules, and th remainder splits evenly between valid HGVS the biocommons grammar rejects and non-HGVS input (pasted URLs, report templates, prose) that should not be parsed at all. -## R5: Transcript version fallback and safe substitution +## R5: Transcript version substitution and coordinate safety -When a cited transcript version is absent from the loaded data, the opt-in fallback -(Methods) substitutes an adjacent version only if the coordinate-safety check passes; +When a cited transcript version is absent from the loaded data, the opt-in substitution +step (Methods) supplies an adjacent version only if the coordinate-safety check passes; a substitution that cannot be verified safe is refused by default, preserving -exact-version semantics. The fallback is a client-layer feature: biocommons/hgvs has no -adjacent-version fallback with any data provider. In an end-to-end ablation +exact-version semantics. This is a client-layer feature: biocommons/hgvs has no +adjacent-version substitution with any data provider. In an end-to-end ablation (`paper/scripts/benchmark_resolution.py`) that removes the requested version from each -test variant, the fallback recovered the correct genomic coordinate with no false +test variant, the substitution recovered the correct genomic coordinate with no false rescues (a false rescue being a substitution that resolves to a different coordinate). -Caution is warranted because a version bump can move a variant. Across consecutive -RefSeq version bumps ({{ version_stability.refseq_pairs | commas }} pairs), +Caution is warranted because substituting one version for another can change the +coordinate a variant projects to. Across consecutive +RefSeq version pairs ({{ version_stability.refseq_pairs | commas }} pairs), {{ version_stability.refseq_preserving_pct | dp(1) }}% preserved every coding coordinate; for Ensembl ({{ version_stability.ensembl_pairs | commas }} pairs) {{ version_stability.ensembl_preserving_pct | dp(1) }}%. Weighted by coding base (the @@ -247,9 +257,9 @@ chance a *random* variant is unaffected), safety is {{ (version_stability.refseq_pervariant_safety * 100) | dp(1) }}% (RefSeq) and {{ (version_stability.ensembl_pervariant_safety * 100) | dp(1) }}% (Ensembl). When a coordinate does move it is almost always the whole CDS, driven by a re-annotation of -the coding region; the most dangerous case, a *partial* bump that mis-places some +the coding region; the most dangerous case, a *partial* substitution that mis-places some variants but not others, is rare -({{ version_stability.refseq_partial_drift_pct | dp(1) }}% of RefSeq bumps, +({{ version_stability.refseq_partial_drift_pct | dp(1) }}% of RefSeq pairs, {{ version_stability.ensembl_partial_drift_pct | dp(1) }}% Ensembl). Within that tail the risk is positional: a partial drift keeps a 5' prefix intact up to its first alignment change and moves what lies downstream, so preservation falls from From c26effabd64e5ac29928760e51b08cba94f7ffab Mon Sep 17 00:00:00 2001 From: Dave Lawrence Date: Wed, 19 Aug 2026 06:28:23 +0000 Subject: [PATCH 2/3] Paper: fair time-bucketed R2 sampling, R4 residual without non-HGVS, PR feedback - #112 R2 (submitted-string resolution): rebuild the corpus from the VCV XML with per-pair submission dates and sample two ways, a whole-file random draw (recency-biased) and a time-bucketed draw balanced across submission-year eras (the fair historical picture). Report both, leading with the fair sample (cdot 98.0% vs UTA 79.9%; the fair draw widens the gap because older submissions cite superseded versions). Adopt the more complete self-contained XML corpus (3,198,528 pairs, all dated). R4 (cleaning residual): drop non-HGVS input (pasted URLs, prose) from the corpus before counting the residual, since it is a data-collection artifact, not a measure of tool correctness. Residual 3.3% -> 3.0%. Turn the hardcoded cleaning-corpus numbers into a vibepaper fact (cleaning_corpus.csv). PR feedback: lead the abstract motivation with the Shariant origin story; rename the R2 heading to "ClinVar submissions as a historical record of transcripts used". --- claude/plans/new_analyses_plan.md | 99 +- paper/README.md | 2 +- paper/Snakefile | 3 +- paper/abstract.md | 6 +- paper/empirical_results/PROVENANCE.md | 90 +- paper/empirical_results/cleaning_corpus.csv | 2 + paper/empirical_results/clinvar_submitted.csv | 4 +- .../clinvar_submitted_residual.csv | 4 +- paper/methods.md | 10 +- paper/results.md | 92 +- .../scripts/build_clinvar_submitted_pairs.py | 194 +++- paper/supplementary.md | 31 +- .../clinvar_hgvs/clinvar_submitted_500.tsv | 1002 ++++++++--------- 13 files changed, 914 insertions(+), 625 deletions(-) create mode 100644 paper/empirical_results/cleaning_corpus.csv diff --git a/claude/plans/new_analyses_plan.md b/claude/plans/new_analyses_plan.md index ae7a206..5be2dc6 100644 --- a/claude/plans/new_analyses_plan.md +++ b/claude/plans/new_analyses_plan.md @@ -27,6 +27,80 @@ flat draw over-represents recent submissions). **Touches:** R2 numbers in `results.md`, `clinvar_submitted.csv`, Methods description of the sampling. +**Code DONE 2026-08-19 (run pending):** `build_clinvar_submitted_pairs.py` now captures +each pair's earliest SCV `SubmissionDate` from the VCV XML and writes it as a trailing +`submit_date` corpus column (downstream `iter_vcf_pairs` reads by name, so it is +ignored there). Two draws: `--sample-out` (the existing whole-file random draw, +recency-biased) and `--time-bucketed-out` (new, even across submission-year eras, +`--bucket-years` width, short eras drawn fully with the deficit redistributed). Both can +be emitted from one build/`--from-pairs`. Validated on synthetic skewed corpora + a tiny +synthetic VCV XML (earliest-date tracking, SCV collapse, even allocation, undated-drop, +and the missing-column error path). STILL TO RUN (needs full VCV XML + VCF, a big job): +rebuild the corpus with dates, emit both samples, resolve each via +`resolve_clinvar_pass.py`, then update the R2 numbers + Methods prose to report both. +Note: the committed `clinvar_submitted_500.tsv` predates the date column and should be +regenerated when the corpus is rebuilt. + +**RUN DONE 2026-08-19 (results pending prose):** rebuilt from `ClinVarVCVRelease_2026-06`. +New corpus = 3,198,528 unique (AlleleID, string) pairs, 100% RefSeq / 0 Ensembl, all with +a submission date, 19 eras 2008-2026. (Corpus is larger than the committed 2,933,667: the +XML path scans to the first *transcript* HGVS per assertion, capturing SCVs whose first +HGVS attribute is genomic/protein, which the CSV-extraction path dropped. More complete +and self-contained.) Raw distribution is heavily recency-skewed: 2024 = 1.14M, 2025 = +1.21M pairs vs a few thousand per year in 2010-2013. + +cdot resolution (0.2.34 refseq GRCh38, FastaSeqFetcher, --with-fixes) on 3,000-pair +seed-42 samples, VCF-coordinate scored: + +| | correct (after fix) | residual | 2008-2015 | 2016-2020 | 2021-2026 | +|---|---|---|---|---|---| +| RANDOM (recency-biased) | 2969 (99.0%) | 31 (1.0%) | 96.9% (n=32) | 99.2% | 99.0% | +| TIME-BUCKETED (fair) | 2939 (98.0%) | 61 (2.0%) | 95.6% (n=1072) | 99.2% | 99.3% | + +The fair draw is 2x harder (2.0% vs 1.0% residual) because it up-weights old submissions: +the random draw holds only 32 pre-2016 pairs (1%), the fair draw 1072 (36%), and pre-2016 +strings resolve at ~95.6% vs ~99% for recent ones. Residual composition also differs: +random residual is mostly `no_data` (recent strings citing versions cdot lacks), fair +residual is mostly `incorrect`/`error` (old versions projecting to drifted/invalid coords). +Pass CSVs: scratchpad `random_pass_cdot.csv`, `bucketed_pass_cdot.csv`. Corpus + samples +under `/data/clinvar/`. + +Dave's decisions 2026-08-19: ADOPT the 3.20M corpus; run UTA head-to-head on the samples +(done); HOLD item 1. + +Full measured numbers (new 3.20M corpus, cdot 0.2.34 refseq GRCh38, local uta_20241220): + +cdot-vs-UTA head-to-head (VCF-scored): +| draw | cdot correct | UTA correct | UTA no_data | cdot-only | uta-only | +|---|---|---|---|---|---| +| RANDOM (recency-biased) | 2969 (99.0%) | 2466 (82.2%) | 530 (17.7%) | 504 (16.8pts) | 1 | +| TIME-BUCKETED (fair) | 2939 (98.0%) | 2396 (79.9%) | 586 (19.5%) | 544 (18.1pts) | 1 | + +The fair draw WIDENS the cdot advantage (16.8 -> 18.1 pts): historical submissions cite +more superseded versions UTA holds no GRCh38 alignment for. + +Version-age on the new corpus (`version_age_new.csv`): version_not_current 75.1% (was +81.8% on the old 2.93M CSV-path corpus - the drop is the corpus redefinition), +scv_weighted_not_current 69.8%, base_retired 0.7%, not_current_in_cdot 99.3%, +absent_cdot_grch38 0.6%. + +STILL TODO (R2 prose/CSV rewrite): report BOTH samples (bucketed = fair headline, random += recency-biased); restructure `clinvar_submitted.csv` to carry both draws; pick which +sample the abstract reports; recompute the residual taxonomy +(`clinvar_submitted_residual.csv`) for the headline sample; regenerate committed +`clinvar_submitted_500.tsv` from the new corpus. Pass CSVs in scratchpad: +{random,bucketed}_pass_{cdot,uta}.csv. + +## PR #128 review comments (Dave, 2026-08-19) - addressed in parallel + +- DONE: renamed R2 heading "What laboratories submitted" -> "ClinVar submissions as a + historical record of transcripts used" (+ reworded lead-in). +- DONE: turned the hardcoded R4 cleaning-corpus constants into a vibepaper fact + (`cleaning_corpus.csv`, wired into Snakefile FROZEN_FACTS); templated N, rescued, + rates, residual across results.md Table 2 + supplementary S6. Render verified. +- DONE (draft, for Dave review): abstract motivation now leads with the Shariant origin + story. Intro already had the Shariant paragraph (lines 33-38). + ## 2. Run local UTA over (all of) ClinVar [R2 / R3] **Why:** we currently only sample the cdot-vs-UTA comparison "because UTA is slow", but @@ -71,7 +145,7 @@ marginally slower than cold. Removes the "cache conditions differed" sentence en **Touches:** R3 full-scale paragraph, `benchmark.csv` (if regenerated), Methods. -## 5. Drop non-HGVS input from the cleaning residual corpus [R4] +## 5. Drop non-HGVS input from the cleaning residual corpus [R4] — DONE 2026-08-19 **Why:** the R4 residual currently includes "non-HGVS input (pasted URLs, report templates, prose)". Dave's point: that is a data-collection artifact, not a measure of @@ -85,6 +159,29 @@ R4 residual number and the Table S6 taxonomy denominators. **Touches:** R4 residual paragraph + Table 2 context, `cleaning.csv`, Supplementary Table S6. +**Done:** the R4/S6 residual and cleaning-rate numbers are literal frozen constants in +the prose (not a facts CSV; `cleaning.csv` is the unrelated injection benchmark and was +not touched). Kept the frozen LLM per-class taxonomy counts and moved the 81 non-HGVS +queries out of the corpus. Reran `cdot_private/analyze_cleaning.py` to confirm the +frozen baseline reproduces (as-is 29,956, after 31,676, residual 1,076 vs frozen 1,075, +±1 code drift). Recomputed against N = 32,752 − 81 = 32,671: + +| quantity | was | now | +|---|---|---| +| corpus N | 32,752 | 32,671 | +| parseable as-submitted | 91.5% | 91.7% (29,956/32,671) | +| parseable after cleaning | 96.7% | 97.0% (31,677/32,671) | +| absolute gain | +5.3% | +5.3% (1,721/32,671 = 5.27%) | +| share of as-submitted failures rescued | ~62% of 8.5 pp | ~63% of 8.3 pp (1,721/2,715) | +| residual | 3.3% (1,075 q) | 3.0% (994 q) | +| S6 class %s | of 1,075 | of 994 (counts unchanged) | + +The "826 unique strings" figure was dropped (the unique count *within* the 81 non-HGVS +needs the lost per-string LLM labels; residual is now reported in queries only). + +Edited: `results.md` (main R4 para, Table 2 header, residual para), `supplementary.md` +(S6 header + table %s), `paper/README.md` (Tier-2 rate note). Paper re-rendered OK. + --- ## Also consider (from feedback, smaller) diff --git a/paper/README.md b/paper/README.md index 71986ff..c3a4124 100644 --- a/paper/README.md +++ b/paper/README.md @@ -124,7 +124,7 @@ The full-scale ClinVar throughput runs take ~1.5 h each — see `claude/benchmar - **Tier 1 (reproducible)** lives in the fact CSVs above and regenerates from public data committed here. - **Tier 2 (production validation, not reproducible)** — the cleaning rescue rate - (91.5% → 96.7%), the per-fix rescue distribution (Results Table 2), and the residual + (91.7% → 97.0%), the per-fix rescue distribution (Results Table 2), and the residual error taxonomy — comes from the private `cdot_private` corpus and is written into `results.md` as **literal frozen constants**, not regenerable facts. No corpus string ever enters this repo. When the corpus is re-analysed (`cdot_private/analyze_cleaning.py`), diff --git a/paper/Snakefile b/paper/Snakefile index 50f961a..c11fa8f 100644 --- a/paper/Snakefile +++ b/paper/Snakefile @@ -88,7 +88,8 @@ FROZEN_FACTS = ["literature.csv", "clinvar_submitted.csv", "clinvar_submitted_residual.csv", "clinvar_vcf.csv", "clinvar_vcf_residual.csv", "clinvar_residual_positions.csv", "genomic_mismatch.csv", - "historical.csv", "version_safety_validation.csv"] + "historical.csv", "version_safety_validation.csv", + "cleaning_corpus.csv"] FACT_FILES = COMPUTED_FACTS + FROZEN_FACTS diff --git a/paper/abstract.md b/paper/abstract.md index 80167ff..a63191d 100644 --- a/paper/abstract.md +++ b/paper/abstract.md @@ -4,8 +4,10 @@ **Motivation:** -Clinical and research pipelines must resolve transcript-level HGVS variant descriptions -to genomic coordinates, and the practical goal is to resolve as many real-world +cdot was built for the Australian Genomics Shariant project [@Tudini2022], which pools +variant classifications from clinical laboratories across the country, each recorded +against whatever transcript version the submitting lab used at the time. Making that +shared history usable meant resolving as many real-world transcript-level HGVS descriptions as possible, including the malformed strings and long-retired transcript versions that accumulate in variant databases and clinical records. The standard transcript source for the Python HGVS libraries, UTA, forces a tradeoff between a diff --git a/paper/empirical_results/PROVENANCE.md b/paper/empirical_results/PROVENANCE.md index a59bd27..1e44171 100644 --- a/paper/empirical_results/PROVENANCE.md +++ b/paper/empirical_results/PROVENANCE.md @@ -82,51 +82,83 @@ comparison on strings as the submitting labs wrote them. The variant_summary-based corpora take c.HGVS from ClinVar's recomputed `Name` column, always at the current transcript version, so they are a current-version ceiling. This corpus instead uses the per-SCV HGVS attributes of the VCV XML (submitted strings -verbatim), joined to the ClinVar VCF coordinate via AlleleID. The corpus (built from a -ClinVar XML download) is not committed, but a 500-pair seed-42 sample is +verbatim), joined to the ClinVar VCF coordinate via AlleleID, and tags each pair with +the earliest SCV submission date so it can be sampled by era. The corpus (built from a +ClinVar XML download) is not committed, but a 500-pair seed-42 random sample is (`tests/test_data/clinvar_hgvs/clinvar_submitted_500.tsv`). -Measured 2026-08-17 (ClinVarVCVRelease_2026-06, cdot 0.2.34 refseq GRCh38, local -uta_20241220): +Two 3,000-pair samples are scored (seed 42): a whole-file **random** draw (reflects the +live file, recency-biased) and a **time-bucketed** draw (even across submission-year +eras 2008-2026, the fair historical picture). R2 leads with the fair sample; the random +draw's numbers are the `rnd_*` columns. The fair draw is harder and widens the cdot-UTA +gap because it up-weights old submissions citing superseded versions. + +Measured 2026-08-19 (ClinVarVCVRelease_2026-06, cdot 0.2.34 refseq GRCh38, local +uta_20241220, SeqRepo for UTA sequence): ```bash -# corpus: 5,652,560 SCV HGVS values -> 3,495,275 transcript c./n. strings -# -> 2,933,667 unique (AlleleID, string) pairs; 100.00% RefSeq, 0 ENST +# corpus: 4,027,987 SCV transcript expressions -> 3,198,528 unique (AlleleID, string) +# pairs; 100% RefSeq, 0 ENST; all dated (2008-2026). Larger than the earlier 2,933,667: +# the XML path scans to the first *transcript* HGVS per assertion, capturing SCVs whose +# first HGVS attribute is genomic/protein (the --scv-csv-dir path dropped those). python paper/scripts/build_clinvar_submitted_pairs.py \ --xml ClinVarVCVRelease_2026-06.xml.gz clinvar.GRCh38.vcf.gz \ - clinvar_submitted_pairs.GRCh38.tsv # (or --scv-csv-dir extraction) + clinvar_submitted_pairs_dated.GRCh38.tsv --sample 3000 --seed 42 \ + --sample-out submitted_random_3000.tsv \ + --time-bucketed-out submitted_bucketed_3000.tsv -# version age vs the current annotation release (RS_2025_08, auto-detected -# from per-transcript source URLs in the cdot JSON): +# version age vs the current annotation release (RS_2025_08): 75.13% not-current python paper/scripts/compute_submitted_version_age.py \ - clinvar_submitted_pairs.GRCh38.tsv \ + clinvar_submitted_pairs_dated.GRCh38.tsv \ --refseq-grch38 cdot-0.2.34.refseq.GRCh38.json.gz \ --refseq-allbuilds cdot-0.2.34.all-builds-refseq-....json.gz -# resolution on the seed-42 3,000-pair sample (VCF-coordinate scoring): +# resolution on each sample (VCF-coordinate scoring), cdot then UTA: F=GCF_000001405.39_GRCh38.p13_genomic.fna.gz -python paper/scripts/resolve_clinvar_pass.py clinvar_submitted_sample3000.tsv \ - --json cdot-0.2.34.refseq.GRCh38.json.gz --fasta $F --with-fixes \ - --out submitted_pass_cdot_3000.csv -UTA_DB_URL=... HGVS_SEQREPO_DIR=... python paper/scripts/resolve_clinvar_pass.py \ - clinvar_submitted_sample3000.tsv --uta --out submitted_pass_uta_3000.csv +for S in random bucketed; do + python paper/scripts/resolve_clinvar_pass.py submitted_${S}_3000.tsv \ + --json cdot-0.2.34.refseq.GRCh38.json.gz --fasta $F --with-fixes \ + --out ${S}_pass_cdot.csv + UTA_DB_URL=postgresql://postgres@127.0.0.1:5433/uta/uta_20241220 \ + HGVS_SEQREPO_DIR=... python paper/scripts/resolve_clinvar_pass.py \ + submitted_${S}_3000.tsv --uta --out ${S}_pass_uta.csv +done ``` -`clinvar_submitted_residual.csv` is derived from the cdot pass rows with -`fixed_bucket != correct` (37 of 3,000): +`clinvar_submitted_residual.csv` is derived from the **time-bucketed** (headline) cdot +pass rows with `fixed_bucket != correct` (61 of 3,000), the error subtypes recovered by +re-resolving the residual strings and catching the exception class: -* `version_refused` (26): cited version absent from the data; the adjacent-version +* `coordinate_drift` (29): resolves through the cited historical version to a coordinate + that differs from ClinVar's current interpretation (`incorrect` bucket). +* `reference_mismatch` (18): the cited reference base does not exist on the cited + version (`HGVSInvalidVariantError`). +* `version_refused` (5): cited version absent from the data; the adjacent-version fallback declined to substitute because coordinate-safety could not be verified - (REFUSED_UNSAFE_VERSION; no false rescues by design). Split from `no_data` via - `summarize_clinvar_pass.py --split-no-data` (26 unknown-version). -* `unknown_accession` (1): no version of the accession in the data. -* `coordinate_drift` (4): resolves through the cited historical version to a - coordinate that differs from ClinVar's current interpretation. -* `position_out_of_bounds` (3) / `reference_mismatch` (1): the cited position or base - does not exist on the cited version (raises `HGVSInvalidIntervalError` / - `HGVSInvalidVariantError`). -* `grammar_unsupported` (2): repeat `ref[N]` and allele `[..]` notation the biocommons - grammar rejects. + (`no_data` where the accession holds other versions, via `get_tx_versions`). +* `grammar_unsupported` (5): repeat `ref[N]` / allele `[..]` notation the biocommons + grammar rejects (`HGVSParseError`). +* `position_out_of_bounds` (4): the cited position does not exist on the cited version + (`HGVSInvalidIntervalError`). +* `unknown_accession` (0): no version of the accession in the data. + +## cleaning_corpus.csv (frozen, Tier 2) + +R4 production cleaning-corpus headline numbers, transcribed from a deterministic run of +`cdot_private/analyze_cleaning.py` (`clean_hgvs()` plus provider-verified accession +restoration) over the private search-box corpus (issue #112). Not reproducible here (the +corpus is private); these are the literal constants R4 / Table 2 / Table S6 render from. + +`corpus_n` (32,671) is the loosely-HGVS search-box corpus after removing a small residue +of non-HGVS input (81 queries: pasted URLs, report templates, prose) that slipped the +collection regex and is a data-collection artifact, not something cleaning could repair +(issue #112 feedback). Removing it from the denominator: as-submitted parseable +`as_submitted_pct` 91.7%, after-cleaning `after_pct` 97.0% (`gain_pct` +5.3%, `rescued` +1,721 = `rescued_share_pct` ~63% of the `failed_pp` 8.3 points that failed +as-submitted), residual `residual_n` 994 (`residual_pct` 3.0%); `nonhgvs_n` 81. The +per-fix Table 2 counts and the Table S6 residual taxonomy stay literal (LLM +classification, not re-run). Refresh by re-running `analyze_cleaning.py` and editing +this CSV. ## historical.csv (frozen, Tier 2) diff --git a/paper/empirical_results/cleaning_corpus.csv b/paper/empirical_results/cleaning_corpus.csv new file mode 100644 index 0000000..aa7406b --- /dev/null +++ b/paper/empirical_results/cleaning_corpus.csv @@ -0,0 +1,2 @@ +corpus_n,as_submitted_pct,after_pct,gain_pct,rescued,failed_pp,rescued_share_pct,residual_n,residual_pct,nonhgvs_n +32671,91.7,97.0,5.3,1721,8.3,63,994,3.0,81 diff --git a/paper/empirical_results/clinvar_submitted.csv b/paper/empirical_results/clinvar_submitted.csv index a552f88..20b8635 100644 --- a/paper/empirical_results/clinvar_submitted.csv +++ b/paper/empirical_results/clinvar_submitted.csv @@ -1,2 +1,2 @@ -n_scv_tx_strings,n_unique_pairs,ensembl_pct,version_not_current_pct,scv_weighted_not_current_pct,base_retired_pct,not_current_in_cdot_pct,absent_cdot_pct,n_sample,sample_seed,cdot_resolved_pct,cdot_matched_pct,cdot_no_data,cdot_incorrect,cdot_error,uta_resolved_pct,uta_no_data_pct,cdot_only,cdot_only_pct,uta_only,rescued_by_fix,regressions,after_fix_matched_pct,residual_n,residual_pct -3495275,2933667,0.0,81.8,80.3,0.7,99.3,0.6,3000,42,98.9,98.7,27,4,7,80.1,19.7,563,18.8,1,1,0,98.8,37,1.2 +n_scv_tx_strings,n_unique_pairs,ensembl_pct,version_not_current_pct,scv_weighted_not_current_pct,base_retired_pct,not_current_in_cdot_pct,absent_cdot_pct,n_sample,sample_seed,cdot_resolved_pct,cdot_matched_pct,cdot_no_data,cdot_incorrect,cdot_error,uta_resolved_pct,uta_matched_pct,uta_no_data_pct,cdot_only,cdot_only_pct,uta_only,rescued_by_fix,regressions,after_fix_matched_pct,residual_n,residual_pct,rnd_cdot_resolved_pct,rnd_cdot_matched_pct,rnd_after_fix_matched_pct,rnd_uta_resolved_pct,rnd_uta_matched_pct,rnd_uta_no_data_pct,rnd_cdot_only,rnd_cdot_only_pct,rnd_uta_only,rnd_residual_n,rnd_residual_pct +4027987,3198528,0.0,75.1,69.8,0.7,99.3,0.6,3000,42,98.9,97.9,5,29,27,80.0,79.9,19.5,544,18.1,1,1,0,98.0,61,2.0,99.1,99.0,99.0,82.2,82.2,17.7,504,16.8,1,31,1.0 diff --git a/paper/empirical_results/clinvar_submitted_residual.csv b/paper/empirical_results/clinvar_submitted_residual.csv index f227239..4e3ec25 100644 --- a/paper/empirical_results/clinvar_submitted_residual.csv +++ b/paper/empirical_results/clinvar_submitted_residual.csv @@ -1,2 +1,2 @@ -n_residual,version_refused,unknown_accession,coordinate_drift,position_out_of_bounds,reference_mismatch,grammar_unsupported -37,26,1,4,3,1,2 +n_residual,version_refused,unknown_accession,coordinate_drift,position_out_of_bounds,reference_mismatch,grammar_unsupported +61,5,0,29,4,18,5 diff --git a/paper/methods.md b/paper/methods.md index abdfb20..2c3a7be 100644 --- a/paper/methods.md +++ b/paper/methods.md @@ -167,9 +167,13 @@ The submitted-string corpus (Results R2) is built by `build_clinvar_submitted_pairs.py` from the per-submission HGVS attributes of a ClinVar VCV XML release (ClinVarVCVRelease_2026-06): each SCV's first transcript c./n. expression is joined verbatim to the variant's VCF coordinate via its AlleleID and -collapsed to unique (AlleleID, string) pairs (Supplementary Methods). Samples are drawn -with a fixed seed (42): 3,000 pairs for the cdot-versus-UTA comparison and a committed -500-pair sample. Scoring uses the VCF coordinate rather than the g.HGVS string, since a +collapsed to unique (AlleleID, string) pairs, each tagged with the earliest SCV +submission date (Supplementary Methods). Two 3,000-pair samples are drawn with a fixed +seed (42) for the cdot-versus-UTA comparison: a whole-file random draw, which reflects +the live file and so is recency-biased as ClinVar grows, and a time-bucketed draw that +allocates evenly across submission-year eras so historical submissions are represented +fairly; a 500-pair random sample is committed for reproduction. Scoring uses the VCF +coordinate rather than the g.HGVS string, since a submitted string may legitimately spell an indel differently from ClinVar's normalised form. Transcript version age is computed by `compute_submitted_version_age.py` against the released cdot RefSeq JSON, whose per-transcript source URL identifies whether an diff --git a/paper/results.md b/paper/results.md index 74cd600..d5e5422 100644 --- a/paper/results.md +++ b/paper/results.md @@ -64,9 +64,10 @@ variant_summary, ClinVar's own recomputed preferred-transcript name, always at t current transcript version. They therefore measure a current-version ceiling and cannot exercise historical transcript depth. -### What laboratories submitted +### ClinVar submissions as a historical record of transcripts used -To measure what laboratories actually submitted over the years, we built a second public +To read ClinVar's submission history as a record of the transcript versions labs +actually used over the years, we built a second public corpus from the per-submission (SCV) HGVS attributes of the ClinVar VCV XML: each submitted string kept verbatim and joined to the variant's VCF coordinate as ground truth via its AlleleID ({{ clinvar_submitted.n_unique_pairs | commas }} unique @@ -85,28 +86,41 @@ transcript no longer annotated at any version. cdot's merged release history hol only {{ clinvar_submitted.absent_cdot_pct | dp(1) }}% of cited versions are absent from its GRCh38 data. -On a fixed-seed sample of {{ clinvar_submitted.n_sample | commas }} submitted pairs, -cdot resolved +Because ClinVar grows over time, a flat random draw over-represents recent submissions, +so we scored two {{ clinvar_submitted.n_sample | commas }}-pair samples (seed 42): one +balanced evenly across submission-year eras (2008-2026), which represents the historical +record fairly, and one drawn at random, which reflects the current file's recency skew +(Methods). + +On the fair era-balanced sample, cdot resolved {{ clinvar_submitted.cdot_resolved_pct | dp(1) }}% and reproduced ClinVar's VCF -coordinate for {{ clinvar_submitted.cdot_matched_pct | dp(1) }}%, versus -{{ clinvar_submitted.uta_resolved_pct | dp(1) }}% for the same locally loaded UTA. On -submitted strings, the RefSeq gap invisible at the current-version ceiling (both -backends {{ clinvar.cdot_refseq_pct | dp(1) }}% above) opens to -{{ clinvar_submitted.cdot_only_pct | dp(1) }} points: UTA holds no GRCh38 alignment for -{{ clinvar_submitted.uta_no_data_pct | dp(1) }}% of the cited versions, and +coordinate for {{ clinvar_submitted.after_fix_matched_pct | dp(1) }}%, versus +{{ clinvar_submitted.uta_resolved_pct | dp(1) }}% for the same locally loaded UTA. The +RefSeq gap invisible at the current-version ceiling (both backends +{{ clinvar.cdot_refseq_pct | dp(1) }}% above) opens to +{{ clinvar_submitted.cdot_only_pct | dp(1) }} points: {{ clinvar_submitted.cdot_only | commas }} of the {{ clinvar_submitted.n_sample | commas }} pairs resolve through cdot alone (one through -UTA alone). The submitted strings are largely well-formed, so cleaning has little to -rescue (`fix_hgvs()` repaired {{ clinvar_submitted.rescued_by_fix | int }} string, with +UTA alone), because UTA holds no GRCh38 alignment for +{{ clinvar_submitted.uta_no_data_pct | dp(1) }}% of the cited versions. The random draw +is easier on both backends ({{ clinvar_submitted.rnd_after_fix_matched_pct | dp(1) }}% +cdot versus {{ clinvar_submitted.rnd_uta_resolved_pct | dp(1) }}% UTA, a +{{ clinvar_submitted.rnd_cdot_only_pct | dp(1) }}-point gap): it is dominated by recent +submissions, and the fair sample is harder precisely because older submissions cite the +superseded versions this corpus exists to exercise. + +The submitted strings are largely well-formed, so cleaning has little to rescue +(`fix_hgvs()` repaired {{ clinvar_submitted.rescued_by_fix | int }} string, with {{ clinvar_submitted.regressions | int }} regressions). The residual -{{ clinvar_submitted.residual_pct | dp(1) }}% after cleaning and version substitution -({{ clinvar_submitted.residual_n | int }} of -{{ clinvar_submitted.n_sample | commas }}) is dominated by version effects, not -formatting: {{ clinvar_submitted_residual.version_refused | int }} cite a version -absent from the data, where the substitution step declines to act because coordinate -safety cannot be verified, and -{{ clinvar_submitted_residual.coordinate_drift | int }} resolve through the cited -historical version to a coordinate that differs from ClinVar's current interpretation; +{{ clinvar_submitted.residual_pct | dp(1) }}% on the fair sample after cleaning and +version substitution ({{ clinvar_submitted.residual_n | int }} of +{{ clinvar_submitted.n_sample | commas }}) is dominated by historical-version effects, +not formatting: {{ clinvar_submitted_residual.coordinate_drift | int }} resolve through +the cited version to a coordinate that differs from ClinVar's current interpretation, +{{ clinvar_submitted_residual.reference_mismatch | int }} cite a reference base that +does not exist on the cited version, and +{{ clinvar_submitted_residual.version_refused | int }} cite a version absent from the +data where substitution declines to act because coordinate safety cannot be verified; the full breakdown is in Supplementary Table S8. **[private data].** The same gap holds on the historical clinical data that motivated cdot: @@ -172,17 +186,24 @@ to close to a year. ## R4: String cleaning recovers malformed real-world HGVS -**[private data].** The main test of cleaning is a production query stream: N = 32,752 +**[private data].** The main test of cleaning is a production query stream: +N = {{ cleaning_corpus.corpus_n | commas }} real search-box queries from clinical and research variant-curation platforms based on VariantGrid [@VariantGrid], restricted to the subset that matched a broad HGVS regex (loosely HGVS-shaped strings a cleaner could plausibly repair, not arbitrary free-text -search terms). The strings are whatever a clinician or curator pasted or typed, carrying +search terms), with a small residue of non-HGVS input that slipped the regex (pasted +URLs, report templates, prose) excluded as a collection artifact (see Residual errors, +below). The strings are whatever a clinician or curator pasted or typed, carrying the damage of their route to the box: whitespace and non-printable characters from Word documents and report PDFs, lost casing, transposed punctuation, trailing protein annotations. The cleaning pipeline (`clean_hgvs()` plus the provider-verified accession-prefix restoration, Methods) raised the fraction -parseable by biocommons/hgvs from 91.5% as-submitted to 96.7%, a +5.3% absolute gain -(1,721 strings rescued, about 62% of the 8.5 percentage points that failed +parseable by biocommons/hgvs from {{ cleaning_corpus.as_submitted_pct | dp(1) }}% +as-submitted to {{ cleaning_corpus.after_pct | dp(1) }}%, a ++{{ cleaning_corpus.gain_pct | dp(1) }}% absolute gain +({{ cleaning_corpus.rescued | commas }} strings rescued, about +{{ cleaning_corpus.rescued_share_pct | int }}% of the +{{ cleaning_corpus.failed_pp | dp(1) }} percentage points that failed as-submitted) with zero regressions (no already-valid string was broken). Table 2 breaks the rescues down by fix type: whitespace removal and structural-punctuation repair dominate, followed by gene/transcript-wrapper repair and structure @@ -196,7 +217,7 @@ well-formed and fail by transcript-version age, whereas interactive human-typed carries the formatting damage cleaning repairs. cdot addresses the first with historical transcript depth and the second with `clean_hgvs()`. -**Table 2. Fixes applied across the production corpus (N = 32,752).** Each row is a +**Table 2. Fixes applied across the production corpus (N = {{ cleaning_corpus.corpus_n | commas }}).** Each row is a cleaning fix category, with the number of rescued queries in which it fired and its share of the 1,721 rescued queries. Categories overlap (a single query may need several fixes), so the counts sum to more than the total. *(Private data; counts are frozen constants @@ -215,7 +236,7 @@ provider-verified accession-prefix restoration, over the production corpus.)* | Other (del/dup count, mutation-type case, …) | `NM_000059.4:c.1_2del2` → `…del` | 11 | 0.6% | | Prefix / kind restoration | `NM_000059.4:1A>G` → `NM_000059.4:c.1A>G` | 4 | 0.2% | | Accession prefix restoration (provider-verified) | `000059.4:c.68del` → `NM_000059.4:c.68del` | 1 | 0.1% | -| **Total unique queries rescued** | | **1,721** | **100%** | +| **Total unique queries rescued** | | **{{ cleaning_corpus.rescued | commas }}** | **100%** | As a control, `paper/scripts/inject_and_clean.py` injects each `clean_hgvs()` fix category into a seeded sample of clean, parseable ClinVar c.HGVS @@ -227,14 +248,17 @@ no-regression guarantee on which the production result depends. ### Residual errors: the ceiling of cleaning *(Table S6)* -**[private data].** The 3.3% of the production corpus (1,075 queries; 826 unique strings) -that still fail to parse after cleaning define the ceiling of pure string repair. -Classified under a fixed decision-tree taxonomy (Supplementary Table S6, with -synthesised examples and the classification method and its limitations), just over half -is incomplete or reference-less input that no string-level repair can invent, about 30% -is in principle fixable and marks the frontier for future cleaning rules, and the -remainder splits evenly between valid HGVS the biocommons grammar rejects and non-HGVS -input (pasted URLs, report templates, prose) that should not be parsed at all. +**[private data].** A small residue of non-HGVS input ({{ cleaning_corpus.nonhgvs_n | int }} +queries: pasted URLs, report templates, prose) that slipped the corpus regex is a +data-collection artifact, not something cleaning could ever repair, so it is excluded +from the corpus above. The remaining {{ cleaning_corpus.residual_pct | dp(1) }}% +({{ cleaning_corpus.residual_n | commas }} queries) of genuine HGVS-shaped input that +still fails to parse after cleaning defines the ceiling of pure string repair. Classified under a fixed +decision-tree taxonomy (Supplementary Table S6, with synthesised examples and the +classification method and its limitations), well over half is incomplete or +reference-less input that no string-level repair can invent, about a third is in +principle fixable and marks the frontier for future cleaning rules, and the remaining +~8% is valid HGVS the biocommons grammar rejects. ## R5: Transcript version substitution and coordinate safety diff --git a/paper/scripts/build_clinvar_submitted_pairs.py b/paper/scripts/build_clinvar_submitted_pairs.py index bda5875..d60a9ad 100644 --- a/paper/scripts/build_clinvar_submitted_pairs.py +++ b/paper/scripts/build_clinvar_submitted_pairs.py @@ -46,15 +46,33 @@ string diversity; distinct strings for the same variant (e.g. two labs citing different transcript versions) are all kept. -Sampling rule (documented): ``--sample N --seed S`` draws a uniform random sample -of N pairs with ``random.Random(S).sample`` and writes them in original file -order; the committed test sample and the benchmark sample both use seed 42. - -Output TSV: header ``chrom pos ref alt g_hgvs c_hgvs scv_count`` - the VCF-format -pairs layout consumed by resolve_clinvar_pass.py (extra columns are ignored by its -reader). The full corpus is large and data-derived so it lives under a data dir -and is NOT committed; a 500-pair sample is committed to -tests/test_data/clinvar_hgvs/. +Sampling rules (documented), two complementary draws over the built corpus: + + * WHOLE-FILE RANDOM (``--sample-out``): ``--sample N --seed S`` draws a uniform + random sample of N pairs with ``random.Random(S).sample``, written in original + file order. Because ClinVar grows over time, a flat draw over-represents recent + submissions, so this sample reflects the LIVE distribution (recency-biased) - + "what the current file looks like". The committed test sample and the benchmark + sample both use seed 42. + * TIME-BUCKETED (``--time-bucketed-out``): buckets pairs by submission era + (``submit_date`` year, width ``--bucket-years``, default 1) and draws evenly + across buckets, so historical submissions are represented fairly regardless of + how few were made in a given year. This is the FAIR "what labs submitted over + the years" sample. Each pair's era is the EARLIEST SubmissionDate among the SCVs + that contributed it (when the string first appeared); pairs with no submission + date are dropped from this draw. Even allocation fills short buckets completely + and redistributes their deficit across the others; ``--seed`` makes it + deterministic. + +Both draws can be produced from one build (pass both ``--sample-out`` and +``--time-bucketed-out``). + +Output TSV: header ``chrom pos ref alt g_hgvs c_hgvs scv_count submit_date`` - the +VCF-format pairs layout consumed by resolve_clinvar_pass.py (which reads columns by +name, so the trailing ``scv_count``/``submit_date`` are ignored). ``submit_date`` is +the earliest SCV SubmissionDate (YYYY-MM-DD) for the pair, or empty if unknown. The +full corpus is large and data-derived so it lives under a data dir and is NOT +committed; a 500-pair sample is committed to tests/test_data/clinvar_hgvs/. Usage: # fast path: consume an existing per-SCV CSV extraction @@ -67,10 +85,11 @@ --xml ClinVarVCVRelease_2026-06.xml.gz \ clinvar.GRCh38.vcf.gz clinvar_submitted_pairs.GRCh38.tsv - # sample an existing corpus (no rebuild) + # sample an existing corpus (no rebuild): both draws at once python paper/scripts/build_clinvar_submitted_pairs.py \ - --from-pairs clinvar_submitted_pairs.GRCh38.tsv \ - --sample 500 --seed 42 --sample-out clinvar_submitted_500.tsv + --from-pairs clinvar_submitted_pairs.GRCh38.tsv --sample 3000 --seed 42 \ + --sample-out submitted_random_3000.tsv \ + --time-bucketed-out submitted_bucketed_3000.tsv """ import argparse import csv @@ -101,10 +120,14 @@ def sanitize(s): def iter_scv_csv(csv_dir): - """Yield (allele_id, submitted_hgvs) from an extract_xml_to_csv.py CSV dir. + """Yield (allele_id, submitted_hgvs, submit_date) from an extract_xml_to_csv.py + CSV dir. The extraction's ``hgvs`` column holds the first HGVS attribute value of the - SCV (which may be genomic or protein; the transcript filter is applied here).""" + SCV (which may be genomic or protein; the transcript filter is applied here). + ``submission_date`` is used for era bucketing if the extraction carries it; + older extractions without that column yield an empty date (those pairs are then + dropped from the time-bucketed draw).""" files = sorted(glob.glob(str(Path(csv_dir) / "*.csv"))) if not files: sys.exit(f"no CSVs found in {csv_dir}") @@ -113,15 +136,19 @@ def iter_scv_csv(csv_dir): for row in csv.DictReader(fh): h = sanitize(row.get("hgvs") or "") allele_id = row.get("allele_id") or "" + submit_date = (row.get("submission_date") or "").strip() if h and allele_id: - yield allele_id, h + yield allele_id, h, submit_date def iter_scv_xml(xml_path, limit=0): - """Yield (allele_id, submitted_hgvs) by streaming a ClinVar VCV XML release. + """Yield (allele_id, submitted_hgvs, submit_date) by streaming a ClinVar VCV + XML release. One VariationArchive at a time (iterparse + clear), so memory stays flat. - Yields the FIRST transcript c./n. expression per ClinicalAssertion.""" + Yields the FIRST transcript c./n. expression per ClinicalAssertion, tagged with + that assertion's ``SubmissionDate`` (YYYY-MM-DD; "" if the attribute is absent) + so the corpus can be bucketed by submission era.""" try: from lxml import etree except ImportError: # pragma: no cover - stdlib fallback @@ -142,11 +169,12 @@ def iter_scv_xml(xml_path, limit=0): ca_sa = ca.find("SimpleAllele") if ca_sa is None: continue + submit_date = ca.get("SubmissionDate") or "" for attr in ca_sa.iter("Attribute"): if attr.get("Type") == "HGVS" and attr.text: h = sanitize(attr.text) if is_submitted_tx_hgvs(h): - yield allele_id, h + yield allele_id, h, submit_date break elem.clear() while elem.getprevious() is not None: # lxml only; frees siblings @@ -156,7 +184,10 @@ def iter_scv_xml(xml_path, limit=0): def write_sample(pairs_path, n, seed, out_path): - """Uniform random sample of n data lines, written in original order.""" + """Uniform random sample of n data lines, written in original order. + + This is the recency-biased "whole-file random" draw: ClinVar grows over time, so + a flat draw over-represents recent submissions and reflects the live file.""" with open(pairs_path) as fh: header = fh.readline() lines = fh.readlines() @@ -167,7 +198,91 @@ def write_sample(pairs_path, n, seed, out_path): out.write(header) for i in idx: out.write(lines[i]) - print(f" sampled {n}/{len(lines):,} (seed {seed}) -> {out_path}", file=sys.stderr) + print(f" random sample {n}/{len(lines):,} (seed {seed}) -> {out_path}", file=sys.stderr) + + +def _allocate_even(bucket_sizes, n, rng): + """Split a draw of n evenly across buckets, honouring each bucket's capacity. + + Returns {bucket: take}. Each round hands every still-drawable bucket an equal + share of what remains; buckets that fill up drop out and their deficit is + redistributed across the rest, so short eras contribute all they have and the + long eras absorb the remainder. Any indivisible remainder is scattered one at a + time across random buckets that still have room (seeded via ``rng``).""" + take = {b: 0 for b in bucket_sizes} + remaining = min(n, sum(bucket_sizes.values())) + while remaining > 0: + active = [b for b in bucket_sizes if take[b] < bucket_sizes[b]] + if not active: + break + share = remaining // len(active) + if share == 0: + for b in rng.sample(active, remaining): + take[b] += 1 + break + for b in active: + add = min(share, bucket_sizes[b] - take[b]) + take[b] += add + remaining -= add + return take + + +def write_time_bucketed_sample(pairs_path, n, seed, out_path, bucket_years=1): + """Sample n data lines drawn evenly across submission-era buckets. + + Buckets are ``submit_date`` year floored to a ``bucket_years``-wide window. Lines + with no/unparseable date are dropped from this draw (reported). Fair by era, the + complement of the recency-biased whole-file draw.""" + with open(pairs_path) as fh: + header = fh.readline().rstrip("\n").split("\t") + lines = fh.readlines() + if "submit_date" not in header: + sys.exit(f"{pairs_path} has no submit_date column; rebuild the corpus " + "(newer build_clinvar_submitted_pairs.py) for the time-bucketed draw") + di = header.index("submit_date") + buckets = {} # bucket_key -> [line index] + n_undated = 0 + for i, line in enumerate(lines): + f = line.rstrip("\n").split("\t") + date = f[di] if di < len(f) else "" + if len(date) < 4 or not date[:4].isdigit(): + n_undated += 1 + continue + key = (int(date[:4]) // bucket_years) * bucket_years + buckets.setdefault(key, []).append(i) + n_dated = sum(len(v) for v in buckets.values()) + if n > n_dated: + sys.exit(f"--sample {n} > {n_dated} dated pairs available for bucketing") + rng = random.Random(seed) + take = _allocate_even({k: len(v) for k, v in buckets.items()}, n, rng) + chosen = [] + for key, idxs in buckets.items(): + chosen.extend(rng.sample(idxs, take[key])) + chosen.sort() + with open(out_path, "w") as out: + out.write("\t".join(header) + "\n") + for i in chosen: + out.write(lines[i]) + span = f"{min(buckets)}-{max(buckets) + bucket_years - 1}" if buckets else "n/a" + print(f" time-bucketed sample {len(chosen)}/{n_dated:,} dated pairs across " + f"{len(buckets)} eras ({span}, {bucket_years}y buckets; {n_undated:,} undated " + f"dropped; seed {seed}) -> {out_path}", file=sys.stderr) + for key in sorted(buckets): + print(f" {key}-{key + bucket_years - 1}: drew {take[key]:>4} " + f"of {len(buckets[key]):>7,}", file=sys.stderr) + + +def _write_requested_samples(args, pairs_path): + """Emit whichever of the two draws the CLI asked for, from a built corpus TSV.""" + if not (args.sample_out or args.time_bucketed_out): + return + if not args.sample: + sys.exit("--sample-out / --time-bucketed-out need --sample N") + if args.sample_out: + write_sample(pairs_path, args.sample, args.seed, args.sample_out) + if args.time_bucketed_out: + write_time_bucketed_sample(pairs_path, args.sample, args.seed, + args.time_bucketed_out, args.bucket_years) def main(): @@ -180,15 +295,18 @@ def main(): ap.add_argument("vcf", nargs="?", help="ClinVar VCF (ground truth, joined on ALLELEID)") ap.add_argument("out", nargs="?", help="output corpus TSV") ap.add_argument("--limit", type=int, default=0, help="(--xml) stop after N VariationArchives (smoke test)") - ap.add_argument("--sample", type=int, default=0, help="also write a random sample of N pairs") + ap.add_argument("--sample", type=int, default=0, help="sample size N for --sample-out / --time-bucketed-out") ap.add_argument("--seed", type=int, default=42) - ap.add_argument("--sample-out", help="path for the sample TSV") + ap.add_argument("--sample-out", help="path for the whole-file random sample (recency-biased)") + ap.add_argument("--time-bucketed-out", help="path for the era-balanced sample (fair over submission years)") + ap.add_argument("--bucket-years", type=int, default=1, help="(--time-bucketed-out) era width in years (default 1)") args = ap.parse_args() if args.from_pairs: - if not (args.sample and args.sample_out): - sys.exit("--from-pairs needs --sample and --sample-out") - write_sample(args.from_pairs, args.sample, args.seed, args.sample_out) + if not ((args.sample_out or args.time_bucketed_out) and args.sample): + sys.exit("--from-pairs needs --sample and at least one of " + "--sample-out / --time-bucketed-out") + _write_requested_samples(args, args.from_pairs) return if not (args.vcf and args.out): sys.exit("vcf and out are required when building") @@ -202,8 +320,9 @@ def main(): n_scv = n_tx = n_joined = 0 comp = {"refseq": 0, "ensembl": 0} - pairs = {} # (allele_id, c_hgvs) -> scv_count - for allele_id, h in scv_iter: + pairs = {} # (allele_id, c_hgvs) -> scv_count + min_date = {} # (allele_id, c_hgvs) -> earliest SubmissionDate seen ("" if none) + for allele_id, h, submit_date in scv_iter: n_scv += 1 if not is_submitted_tx_hgvs(h): continue @@ -214,27 +333,34 @@ def main(): key = (allele_id, h) if key not in pairs: comp[source_of(h.split(":", 1)[0])] += 1 - pairs[key] = pairs.get(key, 0) + 1 + pairs[key] = 0 + min_date[key] = "" + pairs[key] += 1 + # earliest actual date across the SCVs that share this pair (ISO dates sort + # lexicographically; "" is "unknown", never treated as earliest) + if submit_date and (not min_date[key] or submit_date < min_date[key]): + min_date[key] = submit_date with open(args.out, "w") as out: - out.write("chrom\tpos\tref\talt\tg_hgvs\tc_hgvs\tscv_count\n") + out.write("chrom\tpos\tref\talt\tg_hgvs\tc_hgvs\tscv_count\tsubmit_date\n") for (allele_id, c_hgvs), count in pairs.items(): chrom, pos, ref, alt, g_hgvs = g_by_allele[allele_id] - out.write(f"{chrom}\t{pos}\t{ref}\t{alt}\t{g_hgvs}\t{c_hgvs}\t{count}\n") + out.write(f"{chrom}\t{pos}\t{ref}\t{alt}\t{g_hgvs}\t{c_hgvs}\t{count}\t" + f"{min_date[(allele_id, c_hgvs)]}\n") n_pairs = len(pairs) + n_dated = sum(1 for d in min_date.values() if d) print(f"scanned {n_scv:,} SCV HGVS values -> {n_tx:,} transcript c./n. strings " f"-> {n_joined:,} with VCF ground truth -> {n_pairs:,} unique " f"(AlleleID, string) pairs", file=sys.stderr) if n_pairs: print(f" source mix: refseq {comp['refseq']:,} ({100*comp['refseq']/n_pairs:.2f}%) " f"ensembl {comp['ensembl']:,} ({100*comp['ensembl']/n_pairs:.2f}%)", file=sys.stderr) + print(f" submission date present on {n_dated:,} ({100*n_dated/n_pairs:.1f}%) " + f"of pairs (needed for the time-bucketed draw)", file=sys.stderr) print(f"Written: {args.out}", file=sys.stderr) - if args.sample: - if not args.sample_out: - sys.exit("--sample needs --sample-out") - write_sample(args.out, args.sample, args.seed, args.sample_out) + _write_requested_samples(args, args.out) if __name__ == "__main__": diff --git a/paper/supplementary.md b/paper/supplementary.md index 2c9913f..b15da6c 100644 --- a/paper/supplementary.md +++ b/paper/supplementary.md @@ -253,24 +253,25 @@ could not parse embedded the LOVD syntax checker's ranked suggestions in ### Table S6: Residual error classes after cleaning -**[Tier 2].** Single-label classification of the 1,075 production queries (826 unique -strings) that still fail to parse after cleaning (Results, "Residual errors"), under a -fixed decision-tree taxonomy. Of the eight classes, the seven repair-relevant ones are -shown; the eighth was non-HGVS input (81 queries, 7.5%: pasted URLs, report templates, -or prose), excluded here as there is nothing in it for cleaning to repair. Counts and % -are of the 1,075 residual queries; examples are synthesised from public BRCA2 -`NM_000059.4`. *(Tier 2; frozen constants from a deterministic run over the production -corpus.)* +**[Tier 2].** Single-label classification of the {{ cleaning_corpus.residual_n | commas }} +genuine-HGVS production queries +that still fail to parse after cleaning (Results, "Residual errors"), under a fixed +decision-tree taxonomy. A further {{ cleaning_corpus.nonhgvs_n | int }} residual queries were non-HGVS input (pasted URLs, +report templates, or prose) that slipped the corpus regex; these are a data-collection +artifact with nothing in them for cleaning to repair, so they are removed from the +corpus and excluded here (Results). Counts and % below are of the {{ cleaning_corpus.residual_n | commas }} residual queries; +examples are synthesised from public BRCA2 `NM_000059.4`. *(Tier 2; frozen constants +from a deterministic run over the production corpus.)* | Class | Queries | What it is (*example*) | |---|---|---| -| Truncated | 284 (26.4%) | cut off before a complete variant: `NM_000059.4:c.68_69` (range, no edit) | -| No reference | 277 (25.8%) | a bare variant body, no transcript/gene/accession: `c.68_69delAG` | -| Bad accession | 124 (11.5%) | misplaced or truncated version, or a missing prefix with no unique data match: `NM_000059/4:c.68del` (slash in place of the version dot) | -| Edit syntax | 113 (10.5%) | malformed or non-standard edit operation: `NM_000059.4:c.68AG>T` (multi-base reference in a substitution) | -| Trailing / concatenated | 85 (7.9%) | extra characters after a complete variant, or several run together: `NM_000059.4:c.68delAG;c.70A>G` | -| Grammar gap | 81 (7.5%) | legitimate HGVS the biocommons grammar rejects: `NM_000059.4:c.(67+1_68-1)_(70+1_71-1)del` (uncertain-range deletion) | -| Insertion (length only) | 30 (2.8%) | an insertion given as a base count, not a sequence: `NM_000059.4:c.68_69ins5` (position and length recoverable; inserted bases not) | +| Truncated | 284 (28.6%) | cut off before a complete variant: `NM_000059.4:c.68_69` (range, no edit) | +| No reference | 277 (27.9%) | a bare variant body, no transcript/gene/accession: `c.68_69delAG` | +| Bad accession | 124 (12.5%) | misplaced or truncated version, or a missing prefix with no unique data match: `NM_000059/4:c.68del` (slash in place of the version dot) | +| Edit syntax | 113 (11.4%) | malformed or non-standard edit operation: `NM_000059.4:c.68AG>T` (multi-base reference in a substitution) | +| Trailing / concatenated | 85 (8.6%) | extra characters after a complete variant, or several run together: `NM_000059.4:c.68delAG;c.70A>G` | +| Grammar gap | 81 (8.1%) | legitimate HGVS the biocommons grammar rejects: `NM_000059.4:c.(67+1_68-1)_(70+1_71-1)del` (uncertain-range deletion) | +| Insertion (length only) | 30 (3.0%) | an insertion given as a base count, not a sequence: `NM_000059.4:c.68_69ins5` (position and length recoverable; inserted bases not) | *Method and limitation:* classification was performed by a large language model (Claude Opus 4, Anthropic; 2026-06-17) applying the shared decision tree to each unique string, diff --git a/tests/test_data/clinvar_hgvs/clinvar_submitted_500.tsv b/tests/test_data/clinvar_hgvs/clinvar_submitted_500.tsv index 0fd1304..b62d3f5 100644 --- a/tests/test_data/clinvar_hgvs/clinvar_submitted_500.tsv +++ b/tests/test_data/clinvar_hgvs/clinvar_submitted_500.tsv @@ -1,501 +1,501 @@ -chrom pos ref alt g_hgvs c_hgvs scv_count -12 49052426 T C NC_000012.12:g.49052426T>C NM_003482.3:c.1259-2A>G 1 -6 18121581 A G NC_000006.12:g.18121581A>G NM_198586.2:c.1026T>C 1 -17 1727203 G T NC_000017.11:g.1727203G>T NM_001163809.1:c.2244G>T 1 -1 169617125 G A NC_000001.11:g.169617125G>A NM_003005.3:c.384C>T 1 -11 47342666 C T NC_000011.10:g.47342666C>T NM_000256.3:c.1536G>A 1 -16 88428910 C A NC_000016.10:g.88428910C>A NM_001127464.1:c.1440C>A 1 -6 24278050 A G NC_000006.12:g.24278050A>G NM_016356.5:c.921T>C 1 -1 65608905 C A NC_000001.11:g.65608905C>A NM_002303.5:c.1752+4C>A 1 -17 48728327 G A NC_000017.11:g.48728327G>A NM_006361.5:c.267C>T 1 -2 151514449 A G NC_000002.12:g.151514449A>G NM_001271208.1:c.23122-21T>C 1 -5 37224383 T C NC_000005.10:g.37224383T>C NM_023073.3:c.2501-50A>G 1 -17 9857438 G A NC_000017.11:g.9857438G>A NM_004246.2:c.627G>A 1 -4 95156044 A G NC_000004.12:g.95156044A>G NM_001203.2:c.*1371A>G 1 -1 25563755 G T NC_000001.11:g.25563755G>T NM_015627.2:c.711G>T 1 -2 158658252 T C NC_000002.12:g.158658252T>C NM_003628.3:c.2031T>C 1 -18 58537781 A G NC_000018.10:g.58537781A>G NM_052947.3:c.2406T>C 1 -1 231421655 C T NC_000001.11:g.231421655C>T NM_022051.2:c.234G>A 1 -19 15192300 T A NC_000019.10:g.15192300T>A NM_000435.2:c.341-2A>T 1 -21 46154234 G A NC_000021.9:g.46154234G>A NM_001320412.1:c.153C>T 1 -11 7043322 C A NC_000011.10:g.7043322C>A NM_176822.3:c.1296C>A 1 -1 32205186 G C NC_000001.11:g.32205186G>C NM_024296.4:c.549-8G>C 1 -19 47362702 T C NC_000019.10:g.47362702T>C NM_014681.5:c.1593+9T>C 1 -2 26462177 C T NC_000002.12:g.26462177C>T NM_194248.3:c.5197G>A 1 -1 154590374 A G NC_000001.11:g.154590374A>G NM_001111.4:c.2306T>C 1 -15 28272315 C T NC_000015.10:g.28272315C>T NM_004667.5:c.983G>A 1 -16 9764088 C G NC_000016.10:g.9764088C>G NM_000833.3:c.3456G>C 1 -14 23389617 G A NC_000014.9:g.23389617G>A NM_002471.3:c.3835C>T 1 -8 22532282 T C NC_000008.11:g.22532282T>C NM_001243975.1:c.1199T>C 1 -3 32158937 C T NC_000003.12:g.32158937C>T NM_015141.3:c.680C>T 1 -17 48728396 GC G NC_000017.11:g.48728397del NM_006361.5:c.197delG 1 -1 10948070 C T NC_000001.11:g.10948070C>T NM_001170754.1:c.2065G>A 1 -17 8014650 T C NC_000017.11:g.8014650T>C NM_000180.3:c.2462T>C 1 -20 36209711 G T NC_000020.11:g.36209711G>T NM_012156.2:c.1892G>T 1 -1 19227410 G T NC_000001.11:g.19227410G>T NM_015047.1:c.2105C>A 1 -2 98396851 G GGACGC NC_000002.12:g.98396852_98396853insACGCG NM_001298.3:c.1682_1683insACGCG 1 -22 39662398 G GCGGGGAT NC_000022.11:g.39662401_39662407dup NM_021096.3:c.3338_3344dup 1 -16 2317288 C T NC_000016.10:g.2317288C>T NM_001089.2:c.1106G>A 1 -9 130703086 C T NC_000009.12:g.130703086C>T NM_014285.5:c.706C>T 1 -16 89742839 G C NC_000016.10:g.89742839G>C NM_000135.2:c.3726C>G 1 -3 173604896 C T NC_000003.12:g.173604896C>T NM_014932.5:c.298C>T 1 -11 103177704 T C NC_000011.10:g.103177704T>C NM_001377.2:c.6023T>C 1 -X 41217325 G A NC_000023.11:g.41217325G>A NM_001039590.2:c.6191G>A 1 -10 62092842 CAA C NC_000010.11:g.62092844_62092845del NM_032199.3:c.3381_3382del 1 -3 121541414 G A NC_000003.12:g.121541414G>A NM_199420.3:c.409C>T 1 -3 142508104 T G NC_000003.12:g.142508104T>G NM_001184.3:c.4858A>C 1 -11 108193979 C G NC_000011.10:g.108193979C>G NM_002519.2:c.195G>C 1 -14 75047023 G T NC_000014.9:g.75047023G>T NM_001040108.1:c.2633C>A 1 -3 47408963 G T NC_000003.12:g.47408963G>T NM_015466.2:c.1518G>T 1 -17 57105864 G T NC_000017.11:g.57105864G>T NM_001242903.1:c.400G>T 1 -19 56088435 A C NC_000019.10:g.56088435A>C NM_001002836.2:c.737T>G 1 -1 155056992 G T NC_000001.11:g.155056992G>T NM_207197.1:c.1039G>T 1 -11 74457389 T C NC_000011.10:g.74457389T>C NM_005472.4:c.175A>G 1 -16 11269054 C G NC_000016.10:g.11269054C>G NM_005425.4:c.209G>C 1 -14 74798640 C T NC_000014.9:g.74798640C>T NM_019589.2:c.3343C>T 1 -17 27597347 C T NC_000017.11:g.27597347C>T NM_014238.1:c.968C>T 1 -13 102744944 C T NC_000013.11:g.102744944C>T NM_001146197.1:c.5753G>A 1 -16 2762302 C T NC_000016.10:g.2762302C>T NM_016333.3:c.1774C>T 1 -11 66315062 C T NC_000011.10:g.66315062C>T NM_020404.2:c.1966G>A 1 -19 2291716 G A NC_000019.10:g.2291716G>A NM_001101391.1:c.61C>T 1 -1 206900318 T G NC_000001.11:g.206900318T>G NM_001185156.1:c.267T>G 1 -10 86942851 C T NC_000010.11:g.86942851C>T NM_024756.2:c.1933G>A 1 -16 20423917 C T NC_000016.10:g.20423917C>T NM_017888.2:c.769C>T 1 -1 83883117 A C NC_000001.11:g.83883117A>C NM_024686.4:c.2389T>G 1 -7 157010265 G A NC_000007.14:g.157010265G>A NM_005515.3:c.86C>T 1 -11 62522244 A G NC_000011.10:g.62522244A>G NM_001620.1:c.12173T>C 1 -3 45968445 C T NC_000003.12:g.45968445C>T NM_024513.2:c.889G>A 1 -14 94497827 T C NC_000014.9:g.94497827T>C NM_173850.2:c.571A>G 1 -8 144413853 C A NC_000008.11:g.144413853C>A NM_130849.2:c.1316G>T 1 -11 58955624 T A NC_000011.10:g.58955624T>A NM_080661.3:c.599T>A 1 -X 108734121 C T NC_000023.11:g.108734121C>T NM_003604.2:c.2224G>A 1 -9 106928728 G A NC_000009.12:g.106928728G>A NM_021224.4:c.4816G>A 1 -3 47121790 C A NC_000003.12:g.47121790C>A NM_014159.6:c.2846G>T 1 -7 100124833 G A NC_000007.14:g.100124833G>A NM_152755.1:c.692G>A 1 -7 102934254 A G NC_000007.14:g.102934254A>G NM_001031692.2:c.341A>G 1 -11 124747591 G T NC_000011.10:g.124747591G>T NM_014312.3:c.928C>A 1 -19 49422544 C A NC_000019.10:g.49422544C>A NM_178449.3:c.227G>T 1 -19 14827590 A G NC_000019.10:g.14827590A>G NM_017506.1:c.652T>C 1 -1 85200857 C T NC_000001.11:g.85200857C>T NM_032184.1:c.140G>A 1 -15 81332794 C G NC_000015.10:g.81332794C>G NM_001080532.1:c.2928G>C 1 -2 33398468 G T NC_000002.12:g.33398468G>T NM_206943.2:c.5089G>T 1 -13 102739802 G C NC_000013.11:g.102739802G>C NM_001146197.1:c.10895C>G 1 -8 120502525 T C NC_000008.11:g.120502525T>C NM_022045.3:c.1643T>C 1 -11 66437358 C T NC_000011.10:g.66437358C>T NM_016050.3:c.305G>A 1 -1 224153329 C G NC_000001.11:g.224153329C>G NM_015176.2:c.704C>G 1 -19 52115461 C T NC_000019.10:g.52115461C>T NM_178523.3:c.1703G>A 1 -1 54609332 C T NC_000001.11:g.54609332C>T NM_176782.2:c.1694G>A 1 -1 74205651 G A NC_000001.11:g.74205651G>A NM_003838.3:c.1604G>A 1 -14 67650873 C T NC_000014.9:g.67650873C>T NM_001172.3:c.1018C>T 1 -6 159239546 G A NC_000006.12:g.159239546G>A NM_032532.2:c.4210G>A 1 -16 3115457 G A NC_000016.10:g.3115457G>A NM_003456.2:c.160G>A 1 -22 30372204 G C NC_000022.11:g.30372204G>C NM_001017437.2:c.1253G>C 1 -14 58329568 C G NC_000014.9:g.58329568C>G NM_002892.3:c.703C>G 1 -9 41986297 C T NC_000009.12:g.41986297C>T NM_001201380.1:c.1348G>A 1 -12 51269266 G C NC_000012.12:g.51269266G>C NM_001031628.1:c.13C>G 1 -11 93723151 C T NC_000011.10:g.93723151C>T NM_033395.1:c.6058C>T 1 -14 64487627 A C NC_000014.9:g.64487627A>C NM_006977.2:c.604T>G 1 -11 8640552 G A NC_000011.10:g.8640552G>A NM_014818.1:c.1388C>T 1 -22 46691726 G C NC_000022.11:g.46691726G>C NM_022766.5:c.1178C>G 1 -12 32701427 A C NC_000012.12:g.32701427A>C NM_012062.4:c.115A>C 1 -6 123366158 A G NC_000006.12:g.123366158A>G NM_006073.2:c.1298T>C 1 -1 155066896 T G NC_000001.11:g.155066896T>G NM_182689.1:c.280T>G 1 -1 43985351 C T NC_000001.11:g.43985351C>T NM_030587.2:c.901C>T 1 -7 90310089 A G NC_000007.14:g.90310089A>G NM_001039706.2:c.2677A>G 1 -10 46550037 G T NC_000010.11:g.46550037G>T NM_014696.3:c.700C>A 1 -19 35449760 A G NC_000019.10:g.35449760A>G NM_005306.2:c.46A>G 1 -3 52436007 C T NC_000003.12:g.52436007C>T NM_020163.1:c.1945G>A 1 -17 44210163 C T NC_000017.11:g.44210163C>T NM_014233.3:c.1587G>A 1 -17 17796240 G T NC_000017.11:g.17796240G>T NM_030665.3:c.3292G>T 1 -12 3633630 A T NC_000012.12:g.3633630A>T NM_001144958.1:c.1709T>A 1 -17 67552303 G A NC_000017.11:g.67552303G>A NM_012417.2:c.244G>A 1 -1 47439336 G A NC_000001.11:g.47439336G>A NM_004474.3:c.1201G>A 1 -12 15483987 T C NC_000012.12:g.15483987T>C NM_030667.2:c.89T>C 1 -19 38358295 C G NC_000019.10:g.38358295C>G NM_021185.4:c.1333C>G 1 -4 121859100 A C NC_000004.12:g.121859100A>C NM_176824.3:c.420T>G 2 -19 14515965 A G NC_000019.10:g.14515965A>G NM_006145.1:c.998T>C 1 -16 22266836 C T NC_000016.10:g.22266836C>T NM_013302.3:c.1724C>T 1 -10 122512013 G A NC_000010.11:g.122512013G>A NM_002775.4:c.1222G>A 1 -6 656466 G A NC_000006.12:g.656466G>A NM_148959.3:c.479C>T 1 -16 87644861 C T NC_000016.10:g.87644861C>T NM_020655.2:c.986C>T 1 -2 169509801 C T NC_000002.12:g.169509801C>T NM_006063.2:c.23C>T 1 -18 23842691 A G NC_000018.10:g.23842691A>G NM_198129.1:c.3544A>G 1 -1 225404470 C G NC_000001.11:g.225404470C>G NM_002296.3:c.1621G>C 1 -11 100979039 T C NC_000011.10:g.100979039T>C NM_152432.2:c.2446T>C 1 -2 70985034 T C NC_000002.12:g.70985034T>C NM_001115116.1:c.1327T>C 1 -7 117422279 G A NC_000007.14:g.117422279G>A NM_130768.2:c.286C>T 1 -3 49653356 T C NC_000003.12:g.49653356T>C NM_003458.3:c.3800T>C 1 -16 88877104 C T NC_000016.10:g.88877104C>T NM_005187.5:c.1834G>A 1 -16 724720 C G NC_000016.10:g.724720C>G NM_001031737.2:c.726G>C 1 -16 11178583 C T NC_000016.10:g.11178583C>T NM_015226.2:c.3055C>T 1 -15 43698765 A G NC_000015.10:g.43698765A>G NM_001015001.1:c.1136A>G 1 -20 38517796 C T NC_000020.11:g.38517796C>T NM_020336.2:c.1213C>T 1 -11 562703 G C NC_000011.10:g.562703G>C NM_003475.3:c.749G>C 1 -16 58041800 A G NC_000016.10:g.58041800A>G NM_002428.2:c.1094A>G 1 -3 52440441 C T NC_000003.12:g.52440441C>T NM_020163.2:c.1079G>A 1 -15 48136868 G A NC_000015.10:g.48136868G>A NM_205850.2:c.776G>A 1 -15 66781531 G T NC_000015.10:g.66781531G>T NM_005585.4:c.1487G>T 1 -19 37892995 C G NC_000019.10:g.37892995C>G NM_031951.3:c.2591G>C 1 -4 146640671 G T NC_000004.12:g.146640671G>T NM_004575.2:c.1093G>T 1 -18 58579590 C T NC_000018.10:g.58579590C>T NM_052947.3:c.1186G>A 1 -7 105565568 C A NC_000007.14:g.105565568C>A NM_021930.4:c.2106C>A 1 -6 99435841 T A NC_000006.12:g.99435841T>A NM_001080481.3:c.2320A>T 1 -X 153648119 A G NC_000023.11:g.153648119A>G NM_001395.2:c.166A>G 1 -4 3444105 C T NC_000004.12:g.3444105C>T NM_001528.2:c.542C>T 1 -9 116187805 G A NC_000009.12:g.116187805G>A NM_002581.3:c.1067G>A 1 -19 54095887 C G NC_000019.10:g.54095887C>G NM_206818.1:c.652G>C 1 -5 75677939 T A NC_000005.10:g.75677939T>A NM_001099271.1:c.1419A>T 1 -14 32091784 C T NC_000014.9:g.32091784C>T NM_001030055.1:c.1115C>T 1 -22 32406709 T C NC_000022.11:g.32406709T>C NM_014306.4:c.293A>G 1 -10 7205844 T C NC_000010.11:g.7205844T>C NM_001029880.2:c.1415A>G 1 -14 99175485 C A NC_000014.9:g.99175485C>A NM_022898.2:c.1138G>T 1 -2 25161144 CT C NC_000002.12:g.25161145del NM_000939.3:c.740delA 1 -16 2766181 C T NC_000016.10:g.2766181C>T NM_016333.4:c.5653C>T 1 -1 61088410 G T NC_000001.11:g.61088410G>T NM_005595.4:c.289G>T 1 -17 7512269 C G NC_000017.11:g.7512269C>G NM_000937.4:c.4417C>G 1 -1 158845720 T G NC_000001.11:g.158845720T>G NM_002432.1:c.704T>G 1 -19 11441295 G A NC_000019.10:g.11441295G>A NM_002743.2:c.406G>A 1 -8 68069843 A T NC_000008.11:g.68069843A>T NM_024870.2:c.1452A>T 1 -11 32954042 G T NC_000011.10:g.32954042G>T NM_001076786.1:c.3976G>T 1 -5 87268504 C T NC_000005.10:g.87268504C>T NM_002890.3:c.53C>T 1 -2 166405964 G C NC_000002.12:g.166405964G>C NM_002976.3:c.4665C>G 1 -X 135022298 G T NC_000023.11:g.135022298G>T NM_001078173.1:c.162C>A 1 -13 23320750 G C NC_000013.11:g.23320750G>C NM_000231.2:c.692G>C 1 -20 19685238 G A NC_000020.11:g.19685238G>A NM_020689.3:c.1201G>A 1 -17 35264578 C A NC_000017.11:g.35264578C>A NM_144975.3:c.1534C>A 1 -4 5446686 C G NC_000004.12:g.5446686C>G NM_018401.1:c.576C>G 1 -6 89333148 A G NC_000006.12:g.89333148A>G NM_016021.2:c.616T>C 1 -X 56563953 C T NC_000023.11:g.56563953C>T NM_013444.3:c.80C>T 1 -7 101164416 G C NC_000007.14:g.101164416G>C NM_003378.3:c.428C>G 1 -3 39184027 C T NC_000003.12:g.39184027C>T NM_194293.2:c.5419G>A 1 -3 44447582 C T NC_000003.12:g.44447582C>T NM_181489.5:c.2089G>A 1 -6 143884306 G A NC_000006.12:g.143884306G>A NM_001013623.2:c.31G>A 1 -1 159193882 G A NC_000001.11:g.159193882G>A NM_021189.3:c.635G>A 1 -11 85916201 T A NC_000011.10:g.85916201T>A NM_173556.3:c.1141T>A 1 -20 3671681 T A NC_000020.11:g.3671681T>A NM_025220.2:c.1805A>T 1 -16 70482153 G C NC_000016.10:g.70482153G>C NM_015386.2:c.1943C>G 1 -19 45364277 C A NC_000019.10:g.45364277C>A NM_000400.3:c.773G>T 1 -1 109750749 G A NC_000001.11:g.109750749G>A NM_139053.2:c.1684C>T 1 -2 108471109 G A NC_000002.12:g.108471109G>A NM_181453.3:c.1780G>A 1 -9 65283486 A G NC_000009.12:g.65283486A>G NM_001126334.1:c.892T>C 1 -7 24717287 T C NC_000007.14:g.24717287T>C NM_004403.2:c.664A>G 1 -8 36918835 G A NC_000008.11:g.36918835G>A NM_001031836.2:c.2534G>A 1 -10 24473864 C T NC_000010.11:g.24473864C>T NM_019590.3:c.1483C>T 1 -15 63643547 C G NC_000015.10:g.63643547C>G NM_003922.3:c.11188G>C 1 -10 89462407 C T NC_000010.11:g.89462407C>T NM_213606.4:c.172G>A 1 -16 31117821 C A NC_000016.10:g.31117821C>A NM_032188.3:c.140C>A 1 -19 5131933 G A NC_000019.10:g.5131933G>A NM_015015.3:c.1832G>A 1 -7 584538 C G NC_000007.14:g.584538C>G NM_001164761.1:c.739G>C 1 -3 12618646 T A NC_000003.12:g.12618646T>A NM_002880.3:c.76A>T 1 -9 89386480 G A NC_000009.12:g.89386480G>A NM_006378.3:c.1333C>T 1 -8 38820436 G C NC_000008.11:g.38820436G>C NM_006283.2:c.1192G>C 1 -2 137242537 G T NC_000002.12:g.137242537G>T NM_001080427.1:c.2138G>T 1 -9 35370345 C G NC_000009.12:g.35370345C>G NM_006377.3:c.1242C>G 1 -19 30009123 C T NC_000019.10:g.30009123C>T NM_003796.2:c.805C>T 1 -10 97750443 C A NC_000010.11:g.97750443C>A NM_001002261.3:c.777C>A 1 -12 1645956 C T NC_000012.12:g.1645956C>T NM_032642.2:c.784C>T 1 -15 62068476 G A NC_000015.10:g.62068476G>A NM_207322.2:c.863G>A 1 -2 206543278 G A NC_000002.12:g.206543278G>A NM_003812.2:c.682G>A 1 -5 129735107 T G NC_000005.10:g.129735107T>G NM_133638.3:c.3470T>G 1 -9 120536454 G A NC_000009.12:g.120536454G>A NM_018249.4:c.580C>T 1 -3 129257816 A G NC_000003.12:g.129257816A>G NM_016128.3:c.827A>G 1 -1 160239921 C A NC_000001.11:g.160239921C>A NM_015726.3:c.499G>T 1 -12 13214648 G C NC_000012.12:g.13214648G>C NM_001423.2:c.431G>C 1 -7 127615062 G C NC_000007.14:g.127615062G>C NM_006193.2:c.154C>G 1 -10 94246152 T C NC_000010.11:g.94246152T>C NM_016341.3:c.2627T>C 1 -19 18163296 G A NC_000019.10:g.18163296G>A NM_005027.2:c.1324G>A 1 -18 2694582 T C NC_000018.10:g.2694582T>C NM_015295.2:c.929T>C 1 -2 71148038 A G NC_000002.12:g.71148038A>G NM_005791.2:c.1597A>G 1 -17 29096879 G A NC_000017.11:g.29096879G>A NM_078471.3:c.4267C>T 1 -7 158652328 G A NC_000007.14:g.158652328G>A NM_017760.5:c.2899C>T 1 -9 97668905 A G NC_000009.12:g.97668905A>G NM_002486.4:c.2076A>G 1 -5 36975895 A G NC_000005.10:g.36975895A>G NM_133433.3:c.988A>G 1 -1 24458929 T C NC_000001.11:g.24458929T>C NM_020448.4:c.815T>C 1 -1 5927718 G A NC_000001.11:g.5927718G>A NM_015102.3:c.1372C>T 1 -7 150857504 G T NC_000007.14:g.150857504G>T NM_001091.2:c.1034G>T 1 -16 4693780 G A NC_000016.10:g.4693780G>A NM_032349.3:c.54G>A 1 -20 1443801 G T NC_000020.11:g.1443801G>T NM_001206736.1:c.1067C>A 1 -15 44675670 G C NC_000015.10:g.44675670G>C NM_001145112.1:c.38C>G 1 -10 68284224 T C NC_000010.11:g.68284224T>C NM_022129.3:c.820A>G 1 -5 141489477 G C NC_000005.10:g.141489477G>C NM_018929.2:c.237G>C 1 -2 158642499 G A NC_000002.12:g.158642499G>A NM_003628.3:c.1709G>A 1 -9 6012720 A G NC_000009.12:g.6012720A>G NM_012416.3:c.2888T>C 1 -1 173909616 C G NC_000001.11:g.173909616C>G NM_000488.3:c.1089G>C 1 -1 234427692 C G NC_000001.11:g.234427692C>G NM_005646.3:c.3135G>C 1 -11 1295721 T G NC_000011.10:g.1295721T>G NM_019009.3:c.107A>C 1 -15 82810121 C T NC_000015.10:g.82810121C>T NM_001080435.1:c.395C>T 1 -X 70238310 C G NC_000023.11:g.70238310C>G NM_001013579.2:c.559C>G 1 -5 77453892 A G NC_000005.10:g.77453892A>G NM_018268.2:c.448T>C 1 -6 31644192 G C NC_000006.12:g.31644192G>C NM_004639.3:c.1468C>G 1 -16 48211010 G A NC_000016.10:g.48211010G>A NM_032583.3:c.1546C>T 1 -2 112309978 A G NC_000002.12:g.112309978A>G NM_198581.2:c.430A>G 1 -2 112324571 A G NC_000002.12:g.112324571A>G NM_198581.2:c.1760A>G 1 -8 94170967 C T NC_000008.11:g.94170967C>T NM_001144663.1:c.802G>A 1 -5 79044430 C G NC_000005.10:g.79044430C>G NM_013391.2:c.868G>C 1 -11 6566370 T C NC_000011.10:g.6566370T>C NM_144666.2:c.11183T>C 1 -5 55108314 A C NC_000005.10:g.55108314A>C NM_006144.3:c.547A>C 1 -4 113355986 G C NC_000004.12:g.113355986G>C NM_001148.4:c.7368G>C 1 -11 64800767 C T NC_000011.10:g.64800767C>T NM_004579.3:c.722G>A 1 -6 142770009 T A NC_000006.12:g.142770009T>A NM_006734.3:c.4730A>T 1 -5 141209982 A G NC_000005.10:g.141209982A>G NM_018932.3:c.1075A>G 1 -3 15644541 C T NC_000003.12:g.15644541C>T NM_001370658.1:c.625C>T 1 -17 31258057 G A NC_000017.11:g.31258057G>A NM_000267.3:c.4111-287G>A 1 -2 151655888 A C NC_000002.12:g.151655888A>C NM_001271208.2:c.6631T>G 1 -20 18525912 A G NC_000020.11:g.18525912A>G NM_006363.6:c.814A>G 1 -9 136197447 T G NC_000009.12:g.136197447T>G NM_014564.3:c.1087A>C 1 -2 73230168 C T NC_000002.12:g.73230168C>T NM_032319.1:c.113G>A 1 -13 42888375 T C NC_000013.11:g.42888375T>C NM_001002264.1:c.1108A>G 1 -4 56469663 C G NC_000004.12:g.56469663C>G NM_006947.3:c.120C>G 1 -17 49798345 G A NC_000017.11:g.49798345G>A NM_007067.4:c.367G>A 1 -12 47077942 C T NC_000012.12:g.47077942C>T NM_181847.4:c.1061G>A 1 -21 44638070 C G NC_000021.9:g.44638070C>G NM_181688.1:c.653C>G 1 -20 10038483 T G NC_000020.11:g.10038483T>G NM_022096.4:c.182T>G 1 -17 58267479 C A NC_000017.11:g.58267479C>A NM_006151.2:c.1824C>A 1 -17 45397952 C G NC_000017.11:g.45397952C>G NM_199282.2:c.816G>C 1 -20 35842685 C T NC_000020.11:g.35842685C>T NM_016436.4:c.196C>T 1 -16 269324 G T NC_000016.10:g.269324G>T NM_183337.1:c.1349C>A 1 -1 210241979 C T NC_000001.11:g.210241979C>T NM_019605.3:c.713C>T 1 -17 7042574 A T NC_000017.11:g.7042574A>T NM_153357.1:c.608T>A 1 -9 15423160 T A NC_000009.12:g.15423160T>A NM_001039697.1:c.281T>A 1 -15 74202255 G C NC_000015.10:g.74202255G>C NM_022369.3:c.13C>G 1 -17 49168861 G T NC_000017.11:g.49168861G>T NM_153446.2:c.1456G>T 1 -9 129868240 C T NC_000009.12:g.129868240C>T NM_006676.6:c.926C>T 1 -19 7622370 C A NC_000019.10:g.7622370C>A NM_020196.2:c.1578G>T 1 -1 35392256 C G NC_000001.11:g.35392256C>G NM_005095.2:c.2632C>G 1 -19 58067830 A G NC_000019.10:g.58067830A>G NM_007134.1:c.1418A>G 1 -16 547527 C T NC_000016.10:g.547527C>T NM_005632.2:c.689C>T 1 -7 21906428 G A NC_000007.14:g.21906428G>A NM_018719.4:c.782C>T 1 -12 77044778 T C NC_000012.12:g.77044778T>C NM_203394.2:c.847A>G 1 -1 8865353 T C NC_000001.11:g.8865353T>C NM_001428.3:c.797A>G 1 -12 132570214 C T NC_000012.12:g.132570214C>T NM_001142641.1:c.980C>T 1 -1 108820578 G T NC_000001.11:g.108820578G>T NM_152763.3:c.2216C>A 1 -12 47789529 G A NC_000012.12:g.47789529G>A NM_015401.3:c.2141C>T 1 -9 21350385 C G NC_000009.12:g.21350385C>G NM_021002.2:c.503G>C 1 -X 118610335 A G NC_000023.11:g.118610335A>G NM_144658.3:c.3013A>G 1 -6 170289712 GC G NC_000006.12:g.170289716del NM_005618.3:c.150del 1 -15 48301386 A G NC_000015.10:g.48301386A>G NM_000338.3:c.3164+4A>G 1 -3 52348969 C T NC_000003.12:g.52348969C>T NM_015512.4:c.2188C>T 1 -20 10639899 C T NC_000020.11:g.10639899C>T NM_000214.2:c.3256G>A 1 -2 9543222 G A NC_000002.12:g.9543222G>A NM_003183.4:c.161C>T 1 -19 19110746 G A NC_000019.10:g.19110746G>A NM_178526.5:c.827G>A 1 -1 48471962 C G NC_000001.11:g.48471962C>G NM_019073.2:c.47G>C 1 -5 128114212 G A NC_000005.10:g.128114212G>A NM_001046.3:c.877G>A 1 -7 44112696 G T NC_000007.14:g.44112696G>T NM_001129.5:c.2356G>T 1 -11 65046348 G C NC_000011.10:g.65046348G>C NM_005468.2:c.1696C>G 1 -17 42021615 C T NC_000017.11:g.42021615C>T NM_001144927.1:c.38C>T 1 -12 123485720 A G NC_000012.12:g.123485720A>G NM_178314.3:c.887T>C 1 -7 77778822 A C NC_000007.14:g.77778822A>C NM_198467.2:c.2195A>C 1 -10 100499579 G A NC_000010.11:g.100499579G>A NM_015490.3:c.1430C>T 1 -19 16865566 C T NC_000019.10:g.16865566C>T NM_015260.2:c.1636C>T 1 -11 63096048 A G NC_000011.10:g.63096048A>G NM_001136506.2:c.1013T>C 1 -18 46086420 G A NC_000018.10:g.46086420G>A NM_001001937.1:c.1251C>T 1 -2 171055109 T G NC_000002.12:g.171055109T>G NM_012290.4:c.613A>C 1 -7 135187033 G A NC_000007.14:g.135187033G>A NM_014149.3:c.2018C>T 1 -17 10695795 T C NC_000017.11:g.10695795T>C NM_004589.2:c.310A>G 1 -2 121367788 C G NC_000002.12:g.121367788C>G NM_015282.2:c.3686G>C 1 -16 66609986 C T NC_000016.10:g.66609986C>T NM_144601.3:c.503C>T 1 -3 194686884 G A NC_000003.12:g.194686884G>A NM_153690.4:c.58G>A 1 -1 171324169 A G NC_000001.11:g.171324169A>G NM_002022.1:c.353A>G 1 -19 55359088 T C NC_000019.10:g.55359088T>C NM_001145402.1:c.1780A>G 1 -12 57471004 C T NC_000012.12:g.57471004C>T NM_005269.2:c.2264C>T 1 -1 18365593 T C NC_000001.11:g.18365593T>C NM_032880.4:c.911T>C 1 -6 76005346 A G NC_000006.12:g.76005346A>G NM_001563.2:c.1076T>C 1 -8 91084834 G A NC_000008.11:g.91084834G>A NM_016023.5:c.848G>A 1 -10 71446400 G A NC_000010.11:g.71446400G>A NM_022124.5:c.145+5G>A 1 -11 2588801 C A NC_000011.10:g.2588801C>A NM_000218.2:c.1340C>A 1 -12 2567572 C T NC_000012.12:g.2567572C>T NM_000719.6:c.1673C>T 2 -9 128222476 C T NC_000009.12:g.128222476C>T NM_004408.2:c.1008C>T 1 -X 111724993 G T NC_000023.11:g.111724993G>T NM_001099922.2:c.1661G>T 1 -13 23331229 T C NC_000013.11:g.23331229T>C NM_014363.5:c.12647A>G 1 -6 64590780 T G NC_000006.12:g.64590780T>G NM_001142800.2:c.5087A>C 1 -21 37625289 A G NC_000021.9:g.37625289A>G NM_002240.5:c.1142T>C 1 -16 89779955 G C NC_000016.10:g.89779955G>C NM_000135.2:c.1629C>G 1 -19 35249008 G A NC_000019.10:g.35249008G>A NM_205834.2:c.130G>A 1 -12 122490539 C T NC_000012.12:g.122490539C>T NM_017612.3:c.346G>A 1 -11 64296965 G A NC_000011.10:g.64296965G>A NM_033310.2:c.277G>A 2 -15 40932351 G A NC_000015.10:g.40932351G>A NM_019074.3:c.754G>A 1 -21 46272582 A G NC_000021.9:g.46272582A>G NM_003906.3:c.2444T>C 1 -9 77228192 C T NC_000009.12:g.77228192C>T NM_033305.2:c.1523C>T 1 -3 139348194 G A NC_000003.12:g.139348194G>A NM_020191.2:c.374G>A 1 -16 58009966 G A NC_000016.10:g.58009966G>A NM_024598.3:c.303G>A 1 -14 102027516 G A NC_000014.9:g.102027516G>A NM_001376.4:c.9020G>A 1 -X 41344350 C T NC_000023.11:g.41344350C>T NM_001356.3:c.976C>T 1 -7 25124041 G A NC_000007.14:g.25124041G>A NM_018947.6:c.79C>T 3 -10 102396726 G C NC_000010.11:g.102396726G>C NM_001077494.3:c.146G>C 2 -1 172553276 C T NC_000001.11:g.172553276C>T NM_014283.3:c.194C>T 1 -20 32435519 C T NC_000020.11:g.32435519C>T NM_015338.5:c.2807C>T 1 -11 47349904 GAGA G NC_000011.10:g.47349907_47349909del NM_000256.3:c.521_523delTCT 2 -9 127661161 ACT A NC_000009.12:g.127661162CT[1] NM_003165.3:c.388_389delCT 1 -15 51576176 A G NC_000015.10:g.51576176A>G NM_001174116.1:c.93T>C 1 -3 129437838 G C NC_000003.12:g.129437838G>C NM_001276270.2:c.217C>G 1 -22 50220869 C T NC_000022.11:g.50220869C>T NM_020461.3:c.3490G>A 2 -16 88434270 G A NC_000016.10:g.88434270G>A NM_001127464.1:c.6716G>A 2 -20 62824440 G A NC_000020.11:g.62824440G>A NM_001853.4:c.520-5G>A 1 -14 23389417 T C NC_000014.9:g.23389417T>C NM_002471.3:c.3954A>G 1 -17 58357806 C G NC_000017.11:g.58357806C>G NM_017763.6:c.1970G>C 1 -20 23049022 C A NC_000020.11:g.23049022C>A NM_000361.2:c.483G>T 1 -17 80368140 A G NC_000017.11:g.80368140A>G NM_001256071.1:c.12152A>G 1 -12 109788550 C CA NC_000012.12:g.109788551dup NM_021625.4:c.2057dupT 1 -8 67161813 CAT C NC_000008.11:g.67161814_67161815del NM_024790.6:c.2527_2528delAT 2 -6 79925034 T C NC_000006.12:g.79925034T>C NM_022726.3:c.289-2A>G 1 -16 10907778 C A NC_000016.10:g.10907778C>A NM_000246.3:c.2286C>A 2 -21 43059272 G A NC_000021.9:g.43059272G>A NM_000071.2:c.1177C>T 1 -18 57551312 T C NC_000018.10:g.57551312T>C NM_000140.4:c.1137+3A>G 1 -16 2072337 C T NC_000016.10:g.2072337C>T NM_000548.3:c.2194C>T 3 -7 117590379 A G NC_000007.14:g.117590379A>G NM_000492.3:c.1706A>G 2 -20 63350612 G A NC_000020.11:g.63350612G>A NM_000744.5:c.799C>T 1 -9 108926548 C T NC_000009.12:g.108926548C>T NM_003640.3:c.441G>A 3 -8 102212897 G T NC_000008.11:g.102212897G>T NM_015713.5:c.790-8C>A 2 -2 178651699 C T NC_000002.12:g.178651699C>T NM_133378.4:c.32128G>A 1 -3 37008894 A G NC_000003.12:g.37008894A>G NM_000249.3:c.534A>G 4 -17 61686079 G A NC_000017.11:g.61686079G>A NM_032043.2:c.2662C>T 8 -7 117535257 T C NC_000007.14:g.117535257T>C NM_000492.4:c.589T>C 1 -19 50416622 C T NC_000019.10:g.50416622C>T NM_002691.2:c.2966C>T 1 -12 132638096 C T NC_000012.12:g.132638096C>T NM_006231.4:c.5596G>A 1 -19 11111585 C T NC_000019.10:g.11111585C>T NM_000527.5:c.1132C>T 2 -4 78470102 T C NC_000004.12:g.78470102T>C NM_025074.7:c.7371+11T>C 1 -10 71778352 C G NC_000010.11:g.71778352C>G NM_022124.6:c.5187+44C>G 2 -12 21604811 A C NC_000012.12:g.21604811A>C NM_021957.3:c.-219T>G 1 -4 169393800 T C NC_000004.12:g.169393800T>C NM_012224.2:c.*710A>G 1 -6 152344164 A C NC_000006.12:g.152344164A>C NM_033071.3:c.11929T>G 3 -17 7221969 TTCTG T NC_000017.11:g.7221973_7221976del NM_000018.4:c.644_647del 1 -7 128845086 C T NC_000007.14:g.128845086C>T NM_001458.4:c.3621C>T 5 -X 32365169 C T NC_000023.11:g.32365169C>T NM_004006.2:c.4876G>A 4 -2 29193286 C T NC_000002.12:g.29193286C>T NM_004304.3:c.4801G>A 1 -8 89953246 A G NC_000008.11:g.89953246A>G NM_002485.5:c.1843T>C 2 -14 95115790 T C NC_000014.9:g.95115790T>C NM_177438.3:c.1784A>G 1 -5 240381 C A NC_000005.10:g.240381C>A NM_004168.4:c.1456C>A 1 -13 32319185 C G NC_000013.11:g.32319185C>G NM_000059.3:c.176C>G 2 -2 178601535 CTT C NC_000002.12:g.178601537_178601538del NM_001256850.1:c.50537_50538delAA 1 -2 214781054 T C NC_000002.12:g.214781054T>C NM_000465.2:c.820A>G 1 -13 32376727 C G NC_000013.11:g.32376727C>G NM_000059.3:c.8690C>G 3 -2 47445563 T TA NC_000002.12:g.47445564dup NM_000251.1:c.1293dupA 1 -2 73519760 C A NC_000002.12:g.73519760C>A NM_015120.4:c.9543-15C>A 1 -2 73519994 T TAC NC_000002.12:g.73519995_73519996dup NM_015120.4:c.9763_9764dupAC 1 -5 78885674 G A NC_000005.10:g.78885674G>A NM_000046.4:c.1052C>T 1 -7 117540155 G A NC_000007.14:g.117540155G>A NM_000492.3:c.925G>A 2 -1 198706748 A G NC_000001.11:g.198706748A>G NM_002838.3:c.694A>G 1 -9 131515444 CCT C NC_000009.12:g.131515445_131515446del NM_001077365.2:c.1195_1196del 1 -11 108247004 CT C NC_000011.10:g.108247006del NM_000051.3:c.944del 1 -12 32878474 C A NC_000012.12:g.32878474C>A NM_004572.4:c.406G>T 1 -19 50401832 T G NC_000019.10:g.50401832T>G NM_002691.2:c.371T>G 1 -8 144512557 GA G NC_000008.11:g.144512558del NM_004260.4:c.2889del 1 -2 47799318 T G NC_000002.12:g.47799318T>G NM_000179.2:c.1335T>G 1 -18 51067092 C T NC_000018.10:g.51067092C>T NM_005359.5:c.1213C>T 2 -16 2054324 T A NC_000016.10:g.2054324T>A NM_000548.5:c.365T>A 1 -18 46545308 C T NC_000018.10:g.46545308C>T NM_144612.6:c.3619+9G>A 3 -3 10073363 G A NC_000003.12:g.10073363G>A NM_033084.4:c.2715+1G>A 2 -1 40091984 G A NC_000001.11:g.40091984G>A NM_000310.3:c.362+61C>T 2 -19 48304065 C T NC_000019.10:g.48304065C>T NM_144577.3:c.630G>A 1 -9 95482182 C T NC_000009.12:g.95482182C>T NM_000264.3:c.606G>A 1 -12 39341575 C T NC_000012.12:g.39341575C>T NM_017641.3:c.1812G>A 2 -4 657483 C T NC_000004.12:g.657483C>T NM_000283.3:c.1390C>T 2 -19 50403490 C A NC_000019.10:g.50403490C>A NM_002691.2:c.1138-3C>A 1 -5 132588817 A G NC_000005.10:g.132588817A>G NM_005732.3:c.1182A>G 1 -6 56619308 C T NC_000006.12:g.56619308C>T NM_001723.5:c.4726G>A 1 -16 88842720 G C NC_000016.10:g.88842720G>C NM_000512.4:c.230C>G 2 -1 20645675 G A NC_000001.11:g.20645675G>A NM_032409.2:c.1075G>A 2 -11 31794664 G A NC_000011.10:g.31794664G>A NM_000280.4:c.648C>T 4 -12 123697081 T C NC_000012.12:g.123697081T>C NM_024809.4:c.1394-6T>C 2 -14 76500014 T C NC_000014.9:g.76500014T>C NM_004452.3:c.1448T>C 2 -16 50732832 A G NC_000016.10:g.50732832A>G NM_022162.1:c.*1013A>G 2 -16 53601225 G T NC_000016.10:g.53601225G>T NM_015272.2:c.*851C>A 3 -17 75763963 G A NC_000017.11:g.75763963G>A NM_000154.1:c.289C>T 1 -20 33412667 G A NC_000020.11:g.33412667G>A NM_003098.2:c.817C>T 2 -4 79903476 C T NC_000004.12:g.79903476C>T NM_058172.5:c.*3953G>A 1 -6 7584732 T C NC_000006.12:g.7584732T>C NM_004415.2:c.7470T>C 2 -1 237648602 T G NC_000001.11:g.237648602T>G NM_001035.3:c.7501T>G 2 -13 32316451 G A NC_000013.11:g.32316451G>A NM_000059.3:c.-10G>A 1 -6 7569191 C T NC_000006.12:g.7569191C>T NM_004415.2:c.1425C>T 2 -1 45332192 C T NC_000001.11:g.45332192C>T NM_001128425.1:c.907G>A 1 -7 116759381 G T NC_000007.14:g.116759381G>T NM_001127500.1:c.2309G>T 2 -2 214769228 C T NC_000002.12:g.214769228C>T NM_000465.4:c.1395+4G>A 1 -X 108695336 C T NC_000023.11:g.108695336C>T NM_033380.3:c.4891C>T 1 -7 87443759 G A NC_000007.14:g.87443759G>A NM_000443.3:c.1134C>T 1 -7 55205297 G A NC_000007.14:g.55205297G>A NM_005228.3:c.3313G>A 1 -2 188984776 T C NC_000002.12:g.188984776T>C NM_000090.3:c.96T>C 1 -X 154357504 G A NC_000023.11:g.154357504G>A NM_001110556.1:c.4875C>T 1 -9 12704526 G C NC_000009.12:g.12704526G>C NM_000550.3:c.1082G>C 1 -X 38301338 C T NC_000023.11:g.38301338C>T NM_000328.2:c.968G>A 2 -10 98422394 G C NC_000010.11:g.98422394G>C NM_000195.5:c.1718C>G 2 -17 75522027 C T NC_000017.11:g.75522027C>T NM_207346.3:c.946C>T 1 -14 23433665 C T NC_000014.9:g.23433665C>T NM_000257.4:c.68G>A 2 -2 233760930 A G NC_000002.12:g.233760930A>G NM_000463.3:c.643A>G 2 -18 51058145 G A NC_000018.10:g.51058145G>A NM_005359.6:c.688G>A 1 -22 49907841 G A NC_000022.11:g.49907841G>A NM_024105.3:c.872C>T 1 -7 116699246 T C NC_000007.14:g.116699246T>C NM_001127500.1:c.162T>C 1 -20 4699856 G A NC_000020.11:g.4699856G>A NM_000311.5:c.636G>A 1 -11 68416313 C T NC_000011.10:g.68416313C>T NM_002335.4:c.2828-15C>T 1 -11 78478493 AAAG A NC_000011.10:g.78478496_78478498del NM_024678.6:c.922-21_922-19delCTT 1 -11 67490106 G T NC_000011.10:g.67490106G>T NM_003977.2:c.537G>T 1 -13 32340798 C CTA NC_000013.11:g.32340800_32340801dup NM_000059.3:c.6445_6446dupAT 1 -17 65557855 T C NC_000017.11:g.65557855T>C NM_004655.3:c.766A>G 1 -22 20991769 G A NC_000022.11:g.20991769G>A NM_006767.3:c.933G>A 1 -17 43094545 T C NC_000017.11:g.43094545T>C NM_007294.4:c.986A>G 1 -17 43093249 T C NC_000017.11:g.43093249T>C NM_007294.3:c.2282A>G 1 -4 127921938 C G NC_000004.12:g.127921938C>G NM_152778.4:c.1024G>C 1 -16 2054305 T G NC_000016.10:g.2054305T>G NM_000548.3:c.346T>G 1 -5 132385477 G A NC_000005.10:g.132385477G>A NM_003060.3:c.802G>A 1 -16 89281453 G A NC_000016.10:g.89281453G>A NM_013275.6:c.5089C>T 1 -X 17728193 A G NC_000023.11:g.17728193A>G NM_198270.2:c.4024A>G 1 -1 193142038 G A NC_000001.11:g.193142038G>A NM_024529.5:c.701G>A 1 -5 74720499 A C NC_000005.10:g.74720499A>C NM_000521.4:c.1489A>C 1 -16 2086821 T G NC_000016.10:g.2086821T>G NM_000548.3:c.4939T>G 1 -15 89274245 GA G NC_000015.10:g.89274247del NM_001113378.2:c.1055del 1 -22 23803342 C T NC_000022.11:g.23803342C>T NM_003073.3:c.548C>T 1 -12 110281629 G A NC_000012.12:g.110281629G>A NM_170665.4:c.-161G>A 1 -16 67435979 C T NC_000016.10:g.67435979C>T NM_000196.4:c.501C>T 2 -6 52024709 C T NC_000006.12:g.52024709C>T NM_138694.4:c.5101G>A 1 -19 38721574 C T NC_000019.10:g.38721574C>T NM_004924.4:c.1328C>T 1 -19 50409172 A G NC_000019.10:g.50409172A>G NM_002691.2:c.1943A>G 1 -11 71444151 A G NC_000011.10:g.71444151A>G NM_001360.2:c.163T>C 1 -9 108929758 CT C NC_000009.12:g.108929760del NM_003640.4:c.303+10del 1 -6 144187411 CAGGTGCG C NC_000006.12:g.144187412_144187418del NM_003764.4:c.785_791del 1 -17 31259095 G C NC_000017.11:g.31259095G>C NM_000267.3:c.4333G>C 1 -X 154030810 T TA NC_000023.11:g.154030811dup NM_001110792.2:c.1053dup 1 -13 51974987 T C NC_000013.11:g.51974987T>C NM_000053.4:c.233A>G 1 -15 89776908 AGGGGCAGG A NC_000015.10:g.89776911_89776918del NM_001039958.1:c.554_561delGGCAGGGG 1 -7 117504365 T C NC_000007.14:g.117504365T>C NM_000492.4:c.164+2T>C 3 -16 53649101 T C NC_000016.10:g.53649101T>C NM_015272.5:c.2167A>G 1 -3 186785958 CGAAAT C NC_000003.12:g.186785960AAATG[1] NM_001967.4:c.431_435del 1 -5 90629418 G T NC_000005.10:g.90629418G>T NM_032119.3:c.1718G>T 4 -7 5977588 C T NC_000007.14:g.5977588C>T NM_000535.7:c.2445G>A 2 -13 110166257 G A NC_000013.11:g.110166257G>A NM_001845.6:c.3996C>T 1 -19 48297312 G A NC_000019.10:g.48297312G>A NM_144577.3:c.1677C>T 2 -16 28900625 G A NC_000016.10:g.28900625G>A NM_173201.4:c.1809G>A 1 -12 51913244 C T NC_000012.12:g.51913244C>T NM_000020.3:c.207C>T 2 -14 95107692 A G NC_000014.9:g.95107692A>G NM_177438.3:c.2720T>C 2 -2 178609740 G A NC_000002.12:g.178609740G>A NM_003319.4:c.24488C>T 1 -19 11041430 G A NC_000019.10:g.11041430G>A NM_001128849.1:c.4390G>A 2 -7 128848826 C T NC_000007.14:g.128848826C>T NM_001458.4:c.4771C>T 4 -2 1943100 C T NC_000002.12:g.1943100C>T NM_015025.2:c.387G>A 1 -2 165095539 A C NC_000002.12:g.165095539A>C NM_006922.3:c.4403T>G 1 -1 7984986 A G NC_000001.11:g.7984986A>G NM_007262.4:c.502A>G 1 -9 99149272 G A NC_000009.12:g.99149272G>A NM_004612.3:c.1479G>A 1 -1 181715381 C A NC_000001.11:g.181715381C>A NM_000721.3:c.1215C>A 2 -3 49530951 A G NC_000003.12:g.49530951A>G NM_004393.6:c.440A>G 1 -11 17395689 C T NC_000011.10:g.17395689C>T NM_000352.6:c.4228G>A 1 -15 48412654 G A NC_000015.10:g.48412654G>A NM_000138.4:c.8141C>T 1 -16 2076528 C A NC_000016.10:g.2076528C>A NM_000548.5:c.2780C>A 3 -9 16419194 T C NC_000009.12:g.16419194T>C NM_017637.5:c.3095A>G 1 -8 11708487 G A NC_000008.11:g.11708487G>A NM_002052.3:c.175G>A 1 -15 20534995 C A NC_000015.10:g.20534995C>A NM_001145004.1:c.1517G>T 1 -7 116795952 T C NC_000007.14:g.116795952T>C NM_001127500.1:c.4055T>C 1 -16 10682083 G A NC_000016.10:g.10682083G>A NM_144674.1:c.773C>T 1 -17 42103632 T C NC_000017.11:g.42103632T>C NM_024119.2:c.1730A>G 1 -2 238427110 G A NC_000002.12:g.238427110G>A NM_001040445.1:c.40G>A 1 -20 32435682 A G NC_000020.11:g.32435682A>G NM_015338.5:c.2970A>G 1 -19 46755906 C G NC_000019.10:g.46755906C>G NM_024301.4:c.456C>G 6 -4 990302 C G NC_000004.12:g.990302C>G NM_213613.2:c.637G>C 1 -3 39130990 A T NC_000003.12:g.39130990A>T NM_001366900.1:c.2459-2A>T 1 -11 112094890 T G NC_000011.10:g.112094890T>G NM_003002.3:c.400T>G 1 -10 132785714 G GC NC_000010.11:g.132785721dup NM_177400.3:c.234dup 2 -12 6592031 C T NC_000012.12:g.6592031C>T NM_001273.2:c.2975G>A 1 -17 43074362 C T NC_000017.11:g.43074362C>T NM_007294.4:c.4644G>A 1 -17 43124077 C A NC_000017.11:g.43124077C>A NM_007294.3:c.20G>T 1 -2 178547242 C T NC_000002.12:g.178547242C>T NM_001267550.2:c.94283G>A 2 -17 43091755 T G NC_000017.11:g.43091755T>G NM_007294.3:c.3776A>C 6 -X 154380001 TTACTC T NC_000023.11:g.154380005_154380009del NM_000117.2:c.251_255del5 1 -11 19182687 CTTG C NC_000011.10:g.19182689TGT[1] NM_003476.4:c.565_567delCAA 1 -19 55401545 C T NC_000019.10:g.55401545C>T NM_014501.2:c.560G>A 1 -17 34156387 A G NC_000017.11:g.34156387A>G NM_001094.4:c.146T>C 1 +chrom pos ref alt g_hgvs c_hgvs scv_count submit_date +12 49052426 T C NC_000012.12:g.49052426T>C NM_003482.3:c.1259-2A>G 1 2019-01-29 +6 18121581 A G NC_000006.12:g.18121581A>G NM_198586.2:c.1026T>C 1 2019-03-14 +17 1727203 G T NC_000017.11:g.1727203G>T NM_001163809.1:c.2244G>T 1 2019-03-14 +1 169617125 G A NC_000001.11:g.169617125G>A NM_003005.3:c.384C>T 1 2019-03-14 +14 23413837 A G NC_000014.9:g.23413837A>G NM_000257.4:c.5712T>C 1 2024-12-31 +19 58477813 T C NC_000019.10:g.58477813T>C NM_017908.2:c.519T>C 1 2024-12-31 +6 160718283 G T NC_000006.12:g.160718283G>T NM_000301.5:c.788-11G>T 1 2024-12-20 +12 88114444 G A NC_000012.12:g.88114444G>A NM_025114.3:c.2028C>T 1 2024-10-02 +9 26913948 C T NC_000009.12:g.26913948C>T NM_001031689.2:c.1487-1G>A 2 2020-10-09 +2 174748293 G A NC_000002.12:g.174748293G>A NM_001039523.2:c.1318-38C>T 1 2016-04-28 +11 103316440 T C NC_000011.10:g.103316440T>C NM_001080463.1:c.11671-105T>C 1 2019-04-12 +12 204619 T C NC_000012.12:g.204619T>C NM_003044.4:c.294A>G 1 2019-03-14 +6 18120533 C T NC_000006.12:g.18120533C>T NM_198586.2:c.*886G>A 1 2020-02-20 +9 104829030 C G NC_000009.12:g.104829030C>G NM_005502.3:c.2001G>C 1 2024-04-24 +7 100806531 G A NC_000007.14:g.100806531G>A NM_004444.4:c.2373C>T 1 2024-04-24 +8 47799229 C T NC_000008.11:g.47799229C>T NM_006904.6:c.10278G>A 1 2024-04-24 +20 45298285 G A NC_000020.11:g.45298285G>A NM_003833.4:c.1311C>T 1 2024-10-02 +17 61400362 C CGCG NC_000017.11:g.61400365GGC[6] NM_005994.3:c.201_203dupGGC 1 2024-10-02 +12 91056162 G A NC_000012.12:g.91056162G>A NM_007035.3:c.120C>T 1 2024-10-02 +1 75157080 G C NC_000001.11:g.75157080G>C NM_001001933.1:c.994+4G>C 1 2024-10-02 +17 41571523 A T NC_000017.11:g.41571523A>T NM_000226.3:c.470T>A 1 2012-07-31 +17 28534776 CT C NC_000017.11:g.28534777del NM_003593.2:c.1206delT 1 2019-01-29 +7 44254555 C T NC_000007.14:g.44254555C>T NM_172079.2:c.328G>A 1 2017-07-06 +12 47985760 G A NC_000012.12:g.47985760G>A NM_001844.4:c.1648C>T 2 2019-01-29 +14 45151463 C G NC_000014.9:g.45151463C>G NM_020937.2:c.985C>G 2 2024-11-06 +11 134332098 A G NC_000011.10:g.134332098A>G NM_138342.3:c.37A>G 1 2019-03-14 +7 18727596 C A NC_000007.14:g.18727596C>A NM_058176.2:c.1739C>A 1 2019-03-14 +5 83520025 TG T NC_000005.10:g.83520026del NM_004385.4:c.1720del 1 2019-10-15 +14 91338559 G A NC_000014.9:g.91338559G>A NM_001080414.4:c.821C>T 1 2021-07-27 +16 89810954 G A NC_000016.10:g.89810954G>A NM_000135.4:c.401C>T 1 2022-02-09 +21 33341082 A G NC_000021.9:g.33341082A>G NM_000629.2:c.284A>G 1 2024-04-19 +11 15972962 G GCTCT NC_000011.10:g.15972963CT[4] NM_033326.3:c.2270_2273dup 1 2021-11-03 +9 120957354 T C NC_000009.12:g.120957354T>C NM_001735.2:c.4693A>G 1 2024-04-19 +9 35090528 C T NC_000009.12:g.35090528C>T NM_032634.3:c.2792G>A 1 2023-06-07 +2 55672920 G A NC_000002.12:g.55672920G>A NM_033109.3:c.839C>T 1 2025-04-14 +1 210804148 A G NC_000001.11:g.210804148A>G NM_172362.3:c.1481T>C 1 2022-05-25 +11 65107640 GCCA G NC_000011.10:g.65107641CCA[1] NM_013265.4:c.419_421del 1 2022-07-29 +4 186620278 A G NC_000004.12:g.186620278A>G NM_005245.3:c.6308T>C 1 2022-08-10 +1 182585426 CA C NC_000001.11:g.182585429del NM_021133.4:c.1380delT 1 2022-08-22 +16 69714978 T G NC_000016.10:g.69714978T>G NM_000903.2:c.403A>C 1 2024-07-05 +18 58535174 A T NC_000018.10:g.58535174A>T NM_052947.3:c.5013T>A 1 2024-04-24 +3 142556503 G A NC_000003.12:g.142556503G>A NM_001184.3:c.1958C>T 1 2024-04-24 +16 88438529 T A NC_000016.10:g.88438529T>A NM_001127464.1:c.10975T>A 1 2024-04-24 +19 55015157 G A NC_000019.10:g.55015157G>A NM_001083899.1:c.788C>T 1 2024-04-19 +20 33037629 C A NC_000020.11:g.33037629C>A NM_174897.2:c.737C>A 1 2024-04-19 +1 6593447 C T NC_000001.11:g.6593447C>T NM_014851.2:c.1712G>A 1 2024-04-19 +6 35018031 C T NC_000006.12:g.35018031C>T NM_015245.2:c.1982C>T 1 2024-04-19 +15 75349179 G A NC_000015.10:g.75349179G>A NM_024608.2:c.274G>A 1 2024-04-20 +X 3310503 G A NC_000023.11:g.3310503G>A NM_015419.3:c.7700C>T 1 2024-04-20 +14 24299995 G A NC_000014.9:g.24299995G>A NM_174913.1:c.41G>A 1 2025-06-17 +8 55102927 C A NC_000008.11:g.55102927C>A NM_052898.1:c.439C>A 1 2025-04-14 +16 68357106 C T NC_000016.10:g.68357106C>T NM_019023.2:c.1961C>T 1 2024-04-20 +1 13263101 G A NC_000001.11:g.13263101G>A NM_001013407.1:c.1421G>A 1 2024-04-20 +5 90684063 C T NC_000005.10:g.90684063C>T NM_032119.3:c.6142C>T 1 2024-04-19 +6 112071450 G T NC_000006.12:g.112071450G>T NM_016262.4:c.1390C>A 1 2024-04-20 +2 176123955 T G NC_000002.12:g.176123955T>G NM_014213.3:c.839T>G 1 2024-04-19 +19 54453627 G A NC_000019.10:g.54453627G>A NM_052925.2:c.397G>A 1 2024-04-19 +8 11315059 C A NC_000008.11:g.11315059C>A NM_015458.3:c.1108C>A 1 2024-04-20 +17 80182751 A G NC_000017.11:g.80182751A>G NM_024110.3:c.310A>G 1 2024-04-19 +X 100914343 C T NC_000023.11:g.100914343C>T NM_212559.2:c.1345G>A 1 2024-04-20 +17 74773638 G A NC_000017.11:g.74773638G>A NM_015654.3:c.128C>T 1 2025-04-14 +12 57233749 G C NC_000012.12:g.57233749G>C NM_005412.5:c.1124G>C 1 2024-04-20 +4 8270047 G T NC_000004.12:g.8270047G>T NM_053044.3:c.79G>T 1 2024-04-19 +9 130476943 G A NC_000009.12:g.130476943G>A NM_000050.4:c.670G>A 1 2024-04-19 +22 22548425 G A NC_000022.11:g.22548425G>A NM_206953.1:c.1172C>T 1 2024-04-20 +15 41892983 C T NC_000015.10:g.41892983C>T NM_016642.2:c.190G>A 1 2024-04-20 +13 61411964 A G NC_000013.11:g.61411964A>G NM_022843.3:c.2135T>C 1 2024-04-20 +2 206306318 A C NC_000002.12:g.206306318A>C NM_020923.1:c.1790A>C 1 2024-04-20 +10 6220797 G A NC_000010.11:g.6220797G>A NM_004566.3:c.763G>A 1 2024-04-20 +1 235214010 C G NC_000001.11:g.235214010C>G NM_016374.5:c.1600G>C 1 2025-06-17 +12 100623617 A G NC_000012.12:g.100623617A>G NM_174942.1:c.812A>G 1 2024-04-19 +15 82819483 T C NC_000015.10:g.82819483T>C NM_001080435.1:c.1265T>C 1 2024-04-20 +17 19560263 C T NC_000017.11:g.19560263C>T NM_018242.2:c.997C>T 1 2025-06-17 +11 6478129 C T NC_000011.10:g.6478129C>T NM_001242854.1:c.706G>A 1 2025-04-14 +8 141218451 C T NC_000008.11:g.141218451C>T NM_001080431.1:c.1036G>A 1 2024-04-20 +11 108509988 G T NC_000011.10:g.108509988G>T NM_015065.2:c.5519C>A 1 2024-12-31 +1 160841715 A T NC_000001.11:g.160841715A>T NM_001166663.1:c.248T>A 1 2024-04-19 +4 271740 G T NC_000004.12:g.271740G>T NM_001137608.1:c.1117C>A 1 2024-04-20 +16 12052093 A C NC_000016.10:g.12052093A>C NM_032167.3:c.995A>C 1 2024-04-20 +7 99400352 C A NC_000007.14:g.99400352C>A NM_014891.6:c.286G>T 1 2024-12-31 +5 72900991 A G NC_000005.10:g.72900991A>G NM_002270.3:c.2432A>G 1 2024-04-20 +15 89582863 A G NC_000015.10:g.89582863A>G NM_152259.3:c.832A>G 1 2025-04-14 +12 56128404 G A NC_000012.12:g.56128404G>A NM_001184796.1:c.85G>A 1 2024-04-19 +9 109036279 C T NC_000009.12:g.109036279C>T NM_032012.3:c.2326G>A 1 2024-04-20 +3 142507999 C A NC_000003.12:g.142507999C>A NM_001184.3:c.4963G>T 1 2024-04-24 +15 74133728 C T NC_000015.10:g.74133728C>T NM_001130136.1:c.974C>T 1 2025-06-17 +1 31184010 C T NC_000001.11:g.31184010C>T NM_024522.2:c.278G>A 1 2025-04-14 +17 21300634 G C NC_000017.11:g.21300634G>C NM_145109.2:c.255G>C 1 2024-04-19 +15 44652210 C G NC_000015.10:g.44652210C>G NM_025137.3:c.926G>C 1 2024-04-20 +15 41852891 T C NC_000015.10:g.41852891T>C NM_016642.2:c.10175A>G 1 2024-04-20 +15 55439471 CTTTCCTTTATCCTTCAACCATTCTGGGTTCTTTTCTTCTTCTTTTAAATCGCAAAGTTCAGCTATGTCAGTATTCATTGCTCTTCGTGCCTCAGCTTGTTTGTGTAGCCA C NC_000015.10:g.55439472_55439581del NM_130810.3:c.784_893del 1 2023-04-04 +22 49787450 G C NC_000022.11:g.49787450G>C NM_014577.1:c.2404C>G 1 2024-04-19 +3 62243827 A G NC_000003.12:g.62243827A>G NM_002841.3:c.2396A>G 1 2024-04-20 +3 13570887 C T NC_000003.12:g.13570887C>T NM_001165035.1:c.532C>T 1 2024-04-19 +4 7734323 T C NC_000004.12:g.7734323T>C NM_020777.2:c.3260T>C 1 2025-06-17 +9 8504386 G A NC_000009.12:g.8504386G>A NM_002839.3:c.1697C>T 1 2024-04-20 +9 34098454 G C NC_000009.12:g.34098454G>C NM_015397.3:c.665C>G 1 2024-04-19 +1 109713720 A G NC_000001.11:g.109713720A>G NM_000851.3:c.319A>G 1 2025-06-17 +1 181798550 C T NC_000001.11:g.181798550C>T NM_000721.4:c.6529C>T 1 2023-08-06 +2 73452323 G T NC_000002.12:g.73452323G>T NM_015120.4:c.5799G>T 1 2023-08-23 +11 73308870 C T NC_000011.10:g.73308870C>T NM_014786.3:c.232C>T 1 2024-04-19 +5 149622004 C T NC_000005.10:g.149622004C>T NM_001001669.2:c.1277C>T 1 2024-04-19 +11 56376167 A C NC_000011.10:g.56376167A>C NM_001005204.1:c.544A>C 1 2024-04-20 +14 69769187 C T NC_000014.9:g.69769187C>T NM_001039465.1:c.302C>T 1 2024-04-20 +1 74572384 A G NC_000001.11:g.74572384A>G NM_001002912.4:c.3326T>C 1 2024-04-19 +1 216325333 GAAAT G NC_000001.11:g.216325335_216325338del NM_206933.4:c.1111_1114del 1 2023-12-07 +12 49349489 C T NC_000012.12:g.49349489C>T NM_024902.2:c.617C>T 1 2024-04-19 +17 79083095 A G NC_000017.11:g.79083095A>G NM_001042573.1:c.1114A>G 1 2024-04-19 +10 102066453 G A NC_000010.11:g.102066453G>A NM_024747.5:c.979G>A 1 2024-04-19 +8 22120801 G T NC_000008.11:g.22120801G>T NM_005144.4:c.2525C>A 1 2024-04-19 +2 96328115 T C NC_000002.12:g.96328115T>C NM_178495.5:c.1508T>C 1 2024-04-19 +22 49907905 G C NC_000022.11:g.49907905G>C NM_024105.3:c.808C>G 1 2024-04-19 +11 10482151 G A NC_000011.10:g.10482151G>A NM_001025389.1:c.515G>A 1 2024-04-19 +17 68250242 A G NC_000017.11:g.68250242A>G NM_016627.4:c.55A>G 1 2024-04-19 +8 67211609 T C NC_000008.11:g.67211609T>C NM_006421.4:c.4693A>G 1 2024-04-19 +6 138255522 G A NC_000006.12:g.138255522G>A NM_020340.4:c.857G>A 1 2024-04-19 +3 57277847 A C NC_000003.12:g.57277847A>C NM_001142733.2:c.1505T>G 1 2024-04-19 +6 116512226 C T NC_000006.12:g.116512226C>T NM_153711.2:c.530C>T 1 2024-04-19 +3 14666849 T C NC_000003.12:g.14666849T>C NM_016474.4:c.626T>C 1 2024-04-19 +2 121410897 G A NC_000002.12:g.121410897G>A NM_015282.2:c.2393C>T 1 2024-04-19 +8 39160949 T C NC_000008.11:g.39160949T>C NM_145004.5:c.578T>C 1 2024-04-19 +X 103500500 C A NC_000023.11:g.103500500C>A NM_080879.2:c.257G>T 1 2024-04-20 +21 41441779 G A NC_000021.9:g.41441779G>A NM_001144925.1:c.794G>A 1 2024-04-20 +8 10610085 A G NC_000008.11:g.10610085A>G NM_178857.5:c.4013T>C 1 2024-04-20 +9 136459796 C T NC_000009.12:g.136459796C>T NM_014866.1:c.5152G>A 1 2024-04-20 +17 44322816 T C NC_000017.11:g.44322816T>C NM_001143780.1:c.182A>G 1 2024-04-20 +15 42682398 G A NC_000015.10:g.42682398G>A NM_020759.2:c.2360G>A 1 2024-04-20 +15 53710903 G A NC_000015.10:g.53710903G>A NM_182758.2:c.908C>T 1 2024-04-20 +17 58512886 G C NC_000017.11:g.58512886G>C NM_004687.4:c.59C>G 1 2024-04-20 +4 168913987 C A NC_000004.12:g.168913987C>A NM_016081.3:c.2632C>A 1 2024-04-24 +3 129531017 C T NC_000003.12:g.129531017C>T NM_000539.3:c.503C>T 1 2024-06-26 +15 55430728 A G NC_000015.10:g.55430728A>G NM_130810.3:c.1205T>C 1 2024-07-05 +16 3022936 C A NC_000016.10:g.3022936C>A NM_017885.2:c.344G>T 1 2024-07-05 +1 248180791 C G NC_000001.11:g.248180791C>G NM_001004688.1:c.806C>G 1 2024-07-05 +X 153804122 G T NC_000023.11:g.153804122G>T NM_032512.2:c.1541C>A 1 2024-07-05 +12 18399739 T C NC_000012.12:g.18399739T>C NM_004570.4:c.2084T>C 1 2024-07-05 +2 60948050 C G NC_000002.12:g.60948050C>G NM_144709.2:c.1444G>C 1 2024-07-05 +6 108894486 G A NC_000006.12:g.108894486G>A NM_032131.4:c.691G>A 1 2024-07-05 +12 55958544 G A NC_000012.12:g.55958544G>A NM_001200054.1:c.398C>T 2 2024-10-02 +7 31879087 G A NC_000007.14:g.31879087G>A NM_001191058.3:c.514C>T 1 2024-10-02 +3 184164802 G C NC_000003.12:g.184164802G>C NM_004423.3:c.470G>C 1 2024-10-30 +11 96384300 C A NC_000011.10:g.96384300C>A NM_024725.3:c.448G>T 1 2024-12-25 +16 58037604 G A NC_000016.10:g.58037604G>A NM_002428.2:c.295G>A 1 2024-12-31 +19 35777684 T A NC_000019.10:g.35777684T>A NM_052948.3:c.46T>A 1 2024-12-31 +19 55247012 T C NC_000019.10:g.55247012T>C NM_014931.3:c.92A>G 1 2024-12-31 +20 42756531 T G NC_000020.11:g.42756531T>G NM_133170.3:c.790A>C 1 2024-12-31 +11 36592970 T A NC_000011.10:g.36592970T>A NM_000536.3:c.1199A>T 1 2024-12-31 +6 24850698 G A NC_000006.12:g.24850698G>A NM_014722.2:c.697C>T 1 2024-12-31 +12 56206575 C G NC_000012.12:g.56206575C>G NM_005785.3:c.826G>C 1 2024-12-31 +20 32436977 G A NC_000020.11:g.32436977G>A NM_015338.5:c.4265G>A 1 2025-04-14 +17 75100334 A C NC_000017.11:g.75100334A>C NM_004695.2:c.671A>C 1 2024-12-31 +22 32102176 C T NC_000022.11:g.32102176C>T NM_000343.3:c.1604C>T 1 2024-12-31 +9 127890854 G A NC_000009.12:g.127890854G>A NM_013443.3:c.487C>T 1 2024-12-31 +16 67155407 C A NC_000016.10:g.67155407C>A NM_003789.3:c.399G>T 1 2024-12-31 +12 49128881 T A NC_000012.12:g.49128881T>A NM_006082.2:c.433A>T 1 2024-12-31 +3 52540444 G T NC_000003.12:g.52540444G>T NM_001124767.1:c.172G>T 1 2024-12-31 +3 142383308 T C NC_000003.12:g.142383308T>C NM_019001.3:c.2608A>G 1 2024-12-31 +19 44027472 C G NC_000019.10:g.44027472C>G NM_001129996.1:c.244C>G 1 2024-12-31 +19 57607076 G T NC_000019.10:g.57607076G>T NM_020880.3:c.1551G>T 1 2024-12-31 +4 90313038 G A NC_000004.12:g.90313038G>A NM_001145065.1:c.1500G>A 1 2024-12-31 +8 120243957 C A NC_000008.11:g.120243957C>A NM_021110.1:c.2428C>A 1 2024-12-31 +18 45949552 G A NC_000018.10:g.45949552G>A NM_020964.2:c.1429C>T 1 2024-12-31 +19 681422 C A NC_000019.10:g.681422C>A NM_005860.2:c.595C>A 1 2024-12-31 +11 77245411 G A NC_000011.10:g.77245411G>A NM_182833.1:c.956C>T 1 2024-12-31 +2 132417370 C A NC_000002.12:g.132417370C>A NM_001508.2:c.328C>A 1 2024-12-31 +15 84840166 T C NC_000015.10:g.84840166T>C NM_020778.4:c.1493T>C 1 2024-12-31 +5 138386283 C G NC_000005.10:g.138386283C>G NM_016604.3:c.1042C>G 1 2024-12-31 +6 152362278 GCC TCT NC_000006.12:g.152362278_152362280delinsTCT NM_182961.2:c.10189_10191delinsAGA 1 2024-12-31 +9 98736602 G A NC_000009.12:g.98736602G>A NM_173551.5:c.2533C>T 2 2024-12-20 +1 158619238 A G NC_000001.11:g.158619238A>G NM_003126.2:c.6514T>C 1 2025-02-12 +2 175992383 A AT NC_000002.12:g.175992390dup NM_030650.3:c.104dup 1 2025-03-18 +8 9140970 T C NC_000008.11:g.9140970T>C NM_001201329.1:c.682A>G 1 2025-04-14 +12 9202583 G T NC_000012.12:g.9202583G>T NM_002864.2:c.369C>A 1 2025-04-14 +14 30622351 G T NC_000014.9:g.30622351G>T NM_016106.2:c.13G>T 1 2025-04-14 +1 112616814 A T NC_000001.11:g.112616814A>T NM_017744.4:c.287T>A 1 2025-04-14 +17 28747919 G A NC_000017.11:g.28747919G>A NM_004295.3:c.272G>A 1 2025-04-14 +9 135945093 T C NC_000009.12:g.135945093T>C NM_016172.2:c.811A>G 1 2025-04-14 +19 4446132 C A NC_000019.10:g.4446132C>A NM_025241.2:c.1117G>T 1 2025-04-14 +8 134509620 T C NC_000008.11:g.134509620T>C NM_020863.3:c.3491A>G 1 2025-04-14 +19 11832874 G A NC_000019.10:g.11832874G>A NM_152357.2:c.1698G>A 1 2025-04-14 +6 41931526 G C NC_000006.12:g.41931526G>C NM_004053.3:c.835G>C 1 2025-04-14 +2 31197294 C G NC_000002.12:g.31197294C>G NM_001145122.1:c.830G>C 1 2025-04-14 +1 246642029 A G NC_000001.11:g.246642029A>G NM_152609.2:c.929A>G 1 2025-04-14 +19 1271431 C T NC_000019.10:g.1271431C>T NM_001280.2:c.313C>T 1 2025-04-14 +6 43450618 C T NC_000006.12:g.43450618C>T NM_023932.2:c.1073G>A 1 2025-04-14 +9 111371634 G A NC_000009.12:g.111371634G>A NM_001080398.1:c.5258C>T 1 2025-04-14 +3 57246217 G A NC_000003.12:g.57246217G>A NM_012096.2:c.616G>A 1 2025-04-14 +20 62064808 CC TT NC_000020.11:g.62064808_62064809delinsTT NM_003185.4:c.1002_1003delinsAA 1 2025-05-02 +19 14160619 G A NC_000019.10:g.14160619G>A NM_014921.5:c.1588C>T 1 2025-06-03 +12 121652739 C A NC_000012.12:g.121652739C>A NM_173855.4:c.718G>T 1 2025-06-17 +22 25768734 C T NC_000022.11:g.25768734C>T NM_032608.5:c.818C>T 1 2025-06-17 +1 45614319 A G NC_000001.11:g.45614319A>G NM_002482.3:c.1619A>G 1 2025-06-17 +3 46996789 C G NC_000003.12:g.46996789C>G NM_015175.1:c.2512C>G 1 2025-06-17 +12 55027086 A G NC_000012.12:g.55027086A>G NM_021191.2:c.647A>G 1 2025-06-17 +20 25455747 C T NC_000020.11:g.25455747C>T NM_025176.4:c.3883G>A 1 2025-06-17 +3 52488599 G A NC_000003.12:g.52488599G>A NM_007184.3:c.3107G>A 1 2025-06-17 +9 73165206 A G NC_000009.12:g.73165206A>G NM_000700.1:c.703A>G 1 2025-06-17 +3 13351884 C T NC_000003.12:g.13351884C>T NM_024923.2:c.2830G>A 1 2025-06-17 +5 103009862 G A NC_000005.10:g.103009862G>A NM_000919.3:c.2327G>A 1 2025-06-17 +13 61413167 C G NC_000013.11:g.61413167C>G NM_022843.3:c.932G>C 1 2025-06-17 +1 206931538 C T NC_000001.11:g.206931538C>T NM_002644.3:c.2158G>A 1 2025-06-17 +5 69393178 T A NC_000005.10:g.69393178T>A NM_133339.1:c.1246T>A 1 2025-06-17 +17 7042611 A C NC_000017.11:g.7042611A>C NM_153357.1:c.571T>G 1 2025-06-17 +22 39430020 G A NC_000022.11:g.39430020G>A NM_006116.2:c.1313G>A 1 2025-06-17 +11 862695 T G NC_000011.10:g.862695T>G NM_001025237.1:c.209T>G 1 2025-06-17 +8 94526317 G A NC_000008.11:g.94526317G>A NM_015496.4:c.1927C>T 1 2025-06-17 +1 224433832 C A NC_000001.11:g.224433832C>A NM_025160.6:c.274G>T 1 2025-06-17 +6 33271635 A G NC_000006.12:g.33271635A>G NM_022553.4:c.41T>C 1 2025-06-17 +14 96837800 C T NC_000014.9:g.96837800C>T NM_003384.2:c.199C>T 1 2025-06-17 +13 45989076 C A NC_000013.11:g.45989076C>A NM_015070.3:c.966G>T 1 2025-06-17 +4 185462677 G T NC_000004.12:g.185462677G>T NM_152775.3:c.203C>A 1 2025-06-17 +14 100734633 C A NC_000014.9:g.100734633C>A NM_003836.5:c.889C>A 1 2025-06-17 +19 14518313 G A NC_000019.10:g.14518313G>A NM_006145.1:c.37C>T 1 2025-06-17 +6 101686271 C T NC_000006.12:g.101686271C>T NM_021956.4:c.869C>T 1 2025-06-17 +X 115306584 C T NC_000023.11:g.115306584C>T NM_016383.3:c.722C>T 1 2025-06-17 +12 12330385 G A NC_000012.12:g.12330385G>A NM_018050.2:c.938C>T 1 2025-06-17 +11 70487251 C T NC_000011.10:g.70487251C>T NM_012309.3:c.3042G>A 1 2019-04-12 +5 141179196 G A NC_000005.10:g.141179196G>A NM_019120.3:c.1162G>A 1 2024-04-20 +2 172485203 A G NC_000002.12:g.172485203A>G NM_000210.2:c.1793A>G 1 2025-04-14 +10 60200178 A G NC_000010.11:g.60200178A>G NM_020987.3:c.1442T>C 1 2025-08-06 +7 152180973 C A NC_000007.14:g.152180973C>A NM_170606.3:c.6887G>T 1 2025-08-19 +9 12708022 T G NC_000009.12:g.12708022T>G NM_000550.2:c.1287T>G 1 2025-09-30 +9 13247753 C T NC_000009.12:g.13247753C>T NM_003829.3:c.65G>A 1 2025-09-30 +X 88753922 A C NC_000023.11:g.88753922A>C NM_033048.5:c.508A>C 1 2025-09-30 +17 12666245 T C NC_000017.11:g.12666245T>C NM_001146312.3:c.55+2T>C 1 2025-09-28 +11 94306550 C G NC_000011.10:g.94306550C>G NM_001199206.1:c.176C>G 1 2025-09-30 +9 7013947 G A NC_000009.12:g.7013947G>A NM_015061.3:c.2128G>A 1 2025-09-30 +12 25227389 T C NC_000012.12:g.25227389T>C NM_004985.3:c.135A>G 1 2025-09-30 +5 38484829 A G NC_000005.10:g.38484829A>G NM_002310.5:c.2537T>C 1 2025-09-30 +22 50504860 C T NC_000022.11:g.50504860C>T NM_033200.2:c.1379G>A 1 2025-09-30 +5 32058038 C T NC_000005.10:g.32058038C>T NM_178140.2:c.2135C>T 1 2025-09-30 +17 8268571 G A NC_000017.11:g.8268571G>A NM_012393.2:c.3421G>A 1 2025-09-30 +5 116447424 G C NC_000005.10:g.116447424G>C NM_020796.3:c.2282C>G 1 2025-09-30 +15 42689953 C T NC_000015.10:g.42689953C>T NM_020759.2:c.8375C>T 1 2025-09-30 +1 211354450 G A NC_000001.11:g.211354450G>A NM_001033910.2:c.259G>A 1 2025-09-30 +16 1414687 G A NC_000016.10:g.1414687G>A NM_001193388.1:c.5C>T 1 2025-09-30 +9 93288843 C A NC_000009.12:g.93288843C>A NM_006648.3:c.4089C>A 1 2025-09-30 +16 88489118 C T NC_000016.10:g.88489118C>T NM_153813.2:c.233C>T 1 2025-09-30 +4 112620024 G A NC_000004.12:g.112620024G>A NM_018392.4:c.329C>T 1 2025-09-30 +2 27225095 C G NC_000002.12:g.27225095C>G NM_004341.3:c.1472C>G 1 2025-09-30 +16 30353222 C A NC_000016.10:g.30353222C>A NM_006110.2:c.874G>T 1 2025-09-30 +19 5789662 G A NC_000019.10:g.5789662G>A NM_020175.2:c.445C>T 1 2025-09-30 +6 87701522 C T NC_000006.12:g.87701522C>T NM_018064.3:c.163G>A 1 2025-09-30 +10 113553125 T C NC_000010.11:g.113553125T>C NM_004132.3:c.4T>C 1 2025-09-30 +1 19666024 C T NC_000001.11:g.19666024C>T NM_000871.1:c.271C>T 1 2025-09-30 +5 37299692 A C NC_000005.10:g.37299692A>C NM_153485.3:c.3562-124T>G 3 2025-10-17 +8 100709223 T A NC_000008.11:g.100709223T>A NM_002568.4:c.1246A>T 5 2025-10-17 +4 168373708 C A NC_000004.12:g.168373708C>A NM_001012967.3:c.4734G>T 4 2025-10-17 +4 44689840 C G NC_000004.12:g.44689840C>G NM_021927.3:c.1203-3C>G 1 2025-10-17 +5 149520392 G C NC_000005.10:g.149520392G>C NM_001892.6:c.358-4C>G 1 2025-10-17 +6 18132069 G A NC_000006.12:g.18132069G>A NM_000367.5:c.625+64C>T 2 2025-10-17 +6 30921588 G T NC_000006.12:g.30921588G>T NM_020442.6:c.1633-1G>T 1 2025-10-17 +9 136677313 G A NC_000009.12:g.136677313G>A NM_006412.4:c.316+110C>T 1 2025-10-17 +9 35703557 C T NC_000009.12:g.35703557C>T NM_006289.4:c.6474+3G>A 1 2025-10-17 +10 12230965 A T NC_000010.11:g.12230965A>T NM_006023.3:c.458A>T 1 2025-10-17 +12 124150010 C T NC_000012.12:g.124150010C>T NM_001347902.2:c.-37+219C>T 5 2025-10-17 +12 49005366 T C NC_000012.12:g.49005366T>C NM_002733.5:c.251-2A>G 5 2025-10-17 +16 683609 G C NC_000016.10:g.683609G>C NM_001005920.4:c.323-11C>G 1 2025-10-17 +1 33299368 G T NC_000001.11:g.33299368G>T NM_152493.3:c.*322G>T 2 2025-10-17 +17 41817834 G T NC_000017.11:g.41817834G>T NM_021939.4:c.392-255G>T 1 2025-10-17 +17 57839936 C A NC_000017.11:g.57839936C>A NM_016070.4:c.421-1G>T 1 2025-10-17 +17 67948310 A T NC_000017.11:g.67948310A>T NM_182641.4:c.7926+4A>T 1 2025-10-17 +19 16509639 C T NC_000019.10:g.16509639C>T NM_032207.4:c.1290C>T 1 2025-10-17 +22 19806756 A C NC_000022.11:g.19806756A>C NM_053004.3:c.419T>G 1 2025-10-17 +X 18897184 C A NC_000023.11:g.18897184C>A NM_000292.3:c.3261G>T 2 2025-10-17 +2 218432184 G T NC_000002.12:g.218432184G>T NM_007127.3:c.1341+1G>T 1 2025-10-17 +2 230178185 C A NC_000002.12:g.230178185C>A NM_080424.4:c.1419G>T 1 2025-10-17 +14 75959236 T C NC_000014.9:g.75959236T>C NM_003239.5:c.1190A>G 1 2022-09-04 +8 61518028 GT G NC_000008.11:g.61518029del NM_004318.4:c.1992+3del 1 2025-10-09 +X 152651571 G A NC_000023.11:g.152651571G>A NM_018558.4:c.947G>A 1 2025-10-17 +2 96610815 T C NC_000002.12:g.96610815T>C NM_001115016.3:c.1230A>G 1 2025-10-17 +6 42965144 T G NC_000006.12:g.42965144T>G NM_000287.3:c.2597A>C 1 2025-12-03 +1 179575780 C T NC_000001.11:g.179575780C>T NM_014625.2:c.85G>A 1 2025-06-25 +2 162278295 T C NC_000002.12:g.162278295T>C NM_022168.4:c.1675A>G 1 2025-12-12 +14 21406909 G A NC_000014.9:g.21406909G>A NM_001170629.1:c.2854C>T 2 2020-10-29 +5 122423543 G A NC_000005.10:g.122423543G>A NM_005460.2:c.806G>A 1 2020-02-20 +14 21500986 G A NC_000014.9:g.21500986G>A NM_019852.3:c.1043C>T 1 2025-12-19 +16 788957 G T NC_000016.10:g.788957G>T NM_022092.2:c.118G>T 1 2025-12-19 +12 55247873 A G NC_000012.12:g.55247873A>G NM_001005490.1:c.586A>G 1 2025-12-19 +16 16169807 G A NC_000016.10:g.16169807G>A NM_001171.5:c.2834C>T 1 2025-12-19 +12 43746182 C T NC_000012.12:g.43746182C>T NM_001098615.1:c.1127G>A 1 2025-12-19 +3 141278381 G A NC_000003.12:g.141278381G>A NM_152282.3:c.119G>A 1 2025-12-19 +5 171242707 A G NC_000005.10:g.171242707A>G NM_022897.3:c.2663A>G 1 2025-12-19 +12 132730136 C T NC_000012.12:g.132730136C>T NM_015114.1:c.2026G>A 1 2025-12-19 +10 27022584 T A NC_000010.11:g.27022584T>A NM_014915.2:c.4189A>T 1 2025-12-19 +10 97357165 C A NC_000010.11:g.97357165C>A NM_015179.3:c.3823G>T 1 2025-12-19 +16 81999587 A G NC_000016.10:g.81999587A>G NM_145168.2:c.706T>C 1 2025-12-19 +12 113428068 T G NC_000012.12:g.113428068T>G NM_138432.2:c.86T>G 1 2025-12-19 +8 72069130 T C NC_000008.11:g.72069130T>C NM_007332.2:c.337A>G 1 2025-12-19 +1 181796706 C T NC_000001.11:g.181796706C>T NM_001205293.1:c.6247C>T 1 2025-12-19 +3 44642712 C A NC_000003.12:g.44642712C>A NM_006991.3:c.1582C>A 1 2025-12-19 +X 32645094 TTTAC T NC_000023.11:g.32645097_32645100del NM_004006.2:c.1015_1018delGTAA 1 2025-12-19 +5 110761217 G A NC_000005.10:g.110761217G>A NM_138773.1:c.692G>A 1 2025-12-19 +20 38323945 G T NC_000020.11:g.38323945G>T NM_001725.2:c.844G>T 1 2025-12-19 +3 49642517 G C NC_000003.12:g.49642517G>C NM_003458.3:c.883G>C 1 2025-12-19 +9 127980062 A C NC_000009.12:g.127980062A>C NM_001035254.2:c.76T>G 1 2025-12-19 +1 152356069 C A NC_000001.11:g.152356069C>A NM_001014342.2:c.1717G>T 1 2025-12-19 +X 154903911 T C NC_000023.11:g.154903911T>C NM_000132.3:c.5993A>G 1 2025-12-18 +1 94007716 C G NC_000001.11:g.94007716C>G NM_000350.3:c.5923G>C 1 2024-06-26 +9 128611827 C T NC_000009.12:g.128611827C>T NM_001130438.2:c.4887C>T 1 2018-03-26 +1 179557025 A G NC_000001.11:g.179557025A>G NM_014625.4:c.738+2T>C 2 2023-10-18 +10 62813812 G T NC_000010.11:g.62813812G>T NM_000399.3:c.826C>A 2 2021-05-26 +16 84066532 G A NC_000016.10:g.84066532G>A NM_003791.3:c.2310C>T 1 2024-10-02 +5 128303075 C T NC_000005.10:g.128303075C>T NM_001999.4:c.5815G>A 1 2026-02-03 +11 68347874 G A NC_000011.10:g.68347874G>A NM_002335.2:c.119G>A 1 2021-10-30 +1 5864446 A C NC_000001.11:g.5864446A>C NM_015102.4:c.3888T>G 1 2024-10-02 +17 58357891 C T NC_000017.11:g.58357891C>T NM_017763.5:c.1885G>A 1 2025-04-21 +19 39826924 C T NC_000019.10:g.39826924C>T NM_004714.2:c.1159G>A 1 2024-10-02 +16 89100695 TG T NC_000016.10:g.89100697del NM_001127214.4:c.16del 1 2023-12-07 +X 153506912 C T NC_000023.11:g.153506912C>T NM_001711.4:c.759C>T 1 2025-12-19 +1 219915504 T C NC_000001.11:g.219915504T>C NM_018713.2:c.1403A>G 1 2024-12-31 +4 102582925 G A NC_000004.12:g.102582925G>A NM_003998.3:c.895G>A 1 2019-01-29 +1 228166132 A G NC_000001.11:g.228166132A>G NM_001010867.3:c.316A>G 1 2024-11-10 +7 93102975 A G NC_000007.14:g.93102975A>G NM_017654.3:c.3123T>C 1 2025-09-30 +19 11237475 T G NC_000019.10:g.11237475T>G NM_020812.2:c.2054A>C 1 2025-06-17 +2 199272549 A C NC_000002.12:g.199272549A>C NM_015265.3:c.1864T>G 1 2024-12-31 +12 8838393 G A NC_000012.12:g.8838393G>A NM_144670.3:c.913G>A 1 2025-12-19 +5 1216640 G A NC_000005.10:g.1216640G>A NM_001003841.2:c.970G>A 1 2022-12-07 +15 90231215 TAGAG T NC_000015.10:g.90231216AG[1] NM_006384.4:c.347-6_347-3del 1 2025-12-23 +X 77681612 G A NC_000023.11:g.77681612G>A NM_000489.6:c.3644C>T 1 2025-10-28 +12 49052626 C G NC_000012.12:g.49052626C>G NM_003482.3:c.1196G>C 2 2023-10-19 +14 75980851 G T NC_000014.9:g.75980851G>T NM_003239.4:c.43C>A 1 2023-12-21 +7 92002287 G A NC_000007.14:g.92002287G>A NM_005751.4:c.2370G>A 2 2018-08-15 +14 24163425 G T NC_000014.9:g.24163425G>T NM_006084.4:c.412G>T 1 2024-04-19 +2 110637978 G A NC_000002.12:g.110637978G>A NM_004336.3:c.3244C>T 1 2024-04-24 +20 25077869 G A NC_000020.11:g.25077869G>A NM_014588.5:c.628-4C>T 1 2020-02-20 +6 348269 C A NC_000006.12:g.348269C>A NM_001286555.3:c.430C>A 2 2025-10-17 +6 53078963 T G NC_000006.12:g.53078963T>G NM_033480.3:c.407+65T>G 1 2025-10-17 +8 53227256 T A NC_000008.11:g.53227256T>A NM_000912.5:c.*2041A>T 1 2025-10-17 +16 67304317 G C NC_000016.10:g.67304317G>C NM_001100915.3:c.451+104C>G 1 2025-10-17 +16 70523883 G T NC_000016.10:g.70523883G>T NM_012426.5:c.-116G>T 1 2025-10-17 +17 32654567 G C NC_000017.11:g.32654567G>C NM_015194.3:c.2400C>G 1 2025-10-17 +2 9849417 A G NC_000002.12:g.9849417A>G NM_005680.3:c.162A>G 4 2025-10-17 +19 11105436 C T NC_000019.10:g.11105436C>T NM_000527.4:c.530C>T 13 2016-11-23 +2 178601305 A T NC_000002.12:g.178601305A>T NM_001267550.2:c.55692T>A 1 2025-04-09 +17 10635772 G A NC_000017.11:g.10635772G>A NM_002470.2:c.3938C>T 1 2014-06-27 +2 47799900 G A NC_000002.12:g.47799900G>A NM_000179.3:c.1917G>A 2 2025-02-06 +13 20189227 C T NC_000013.11:g.20189227C>T NM_004004.6:c.355G>A 1 2022-02-09 +2 166051777 ACCATTATAAT A NC_000002.12:g.166051778_166051787del NM_001165963.1:c.896_905delATTATAATGG 1 2015-03-07 +22 23825317 G T NC_000022.11:g.23825317G>T NM_003073.3:c.888G>T 3 2019-04-24 +2 178782879 G T NC_000002.12:g.178782879G>T NM_001256850.1:c.3027C>A 1 2017-07-13 +16 68810199 C T NC_000016.10:g.68810199C>T NM_004360.3:c.690C>T 1 2024-04-24 +6 33444529 C T NC_000006.12:g.33444529C>T NM_006772.2:c.3494C>T 1 2016-01-22 +2 240783093 T C NC_000002.12:g.240783093T>C NM_004321.6:c.815A>G 1 2019-01-29 +2 47806792 G GCT NC_000002.12:g.47806793_47806794dup NM_000179.3:c.4016_4017dup 2 2023-12-07 +19 10986481 G C NC_000019.10:g.10986481G>C NM_003072.5:c.648G>C 1 2022-01-12 +2 26454728 A G NC_000002.12:g.26454728A>G NM_145038.5:c.2001A>G 2 2025-10-17 +2 21001971 G A NC_000002.12:g.21001971G>A NM_000384.2:c.13451C>T 9 2016-04-28 +17 45974480 A G NC_000017.11:g.45974480A>G NM_005910.5:c.307+9A>G 3 2017-08-17 +17 3658102 C T NC_000017.11:g.3658102C>T NM_001031681.2:c.779C>T 2 2016-04-28 +9 108889340 A T NC_000009.12:g.108889340A>T NM_003640.5:c.3214T>A 2 2021-07-07 +2 227688165 C T NC_000002.12:g.227688165C>T NM_025243.4:c.1314+1G>A 1 2024-12-20 +14 87945682 A G NC_000014.9:g.87945682A>G NM_000153.3:c.1541T>C 3 2021-05-26 +1 236900008 C T NC_000001.11:g.236900008C>T NM_000254.2:c.*2364C>T 1 2020-02-20 +12 114683409 C T NC_000012.12:g.114683409C>T NM_005996.3:c.-209G>A 1 2020-02-20 +13 113119302 A C NC_000013.11:g.113119302A>C NM_000131.4:c.*294A>C 1 2020-02-20 +14 67747845 G A NC_000014.9:g.67747845G>A NM_015346.3:c.*591C>T 1 2020-02-20 +21 34789493 T C NC_000021.9:g.34789493T>C NM_001754.4:c.*2642A>G 1 2020-02-20 +3 184372478 C T NC_000003.12:g.184372478C>T NM_000460.4:c.*35G>A 1 2022-02-21 +5 157252763 A C NC_000005.10:g.157252763A>C NM_005546.3:c.*85A>C 1 2020-02-20 +6 35510849 C G NC_000006.12:g.35510849C>G NM_003322.3:c.499+12G>C 2 2020-02-20 +7 117559525 G C NC_000007.14:g.117559525G>C NM_000492.3:c.1454G>C 5 2020-02-20 +8 95269135 G C NC_000008.11:g.95269135G>C NM_177965.3:c.55C>G 3 2020-02-20 +9 99151408 T G NC_000009.12:g.99151408T>G NM_004612.2:c.*2103T>G 1 2020-02-20 +17 50168470 T TG NC_000017.11:g.50168476dup NM_000023.2:c.488dupG 1 2025-06-25 +11 77190113 C T NC_000011.10:g.77190113C>T NM_000260.3:c.3724C>T 2 2019-01-29 +12 32877900 C T NC_000012.12:g.32877900C>T NM_004572.3:c.980G>A 3 2019-01-29 +13 32376656 T C NC_000013.11:g.32376656T>C NM_000059.3:c.8633-14T>C 2 2018-03-26 +14 23389057 T TG NC_000014.9:g.23389061dup NM_002471.4:c.3979-3dup 1 2022-12-13 +10 87864555 A T NC_000010.11:g.87864555A>T NM_000314.6:c.79+7A>T 1 2020-05-19 +3 38597914 G A NC_000003.12:g.38597914G>A NM_000335.5:c.2077C>T 1 2025-12-09 +12 132665424 GGCC G NC_000012.12:g.132665426CCG[1] NM_006231.2:c.2343_2345delGGC 3 2019-01-29 +13 32333094 G T NC_000013.11:g.32333094G>T NM_000059.4:c.1616G>T 1 2023-03-24 +7 94420627 C T NC_000007.14:g.94420627C>T NM_000089.3:c.2274C>T 1 2024-04-24 +12 98534225 G A NC_000012.12:g.98534225G>A NM_003276.2:c.1968G>A 2 2019-04-24 +12 55697502 GGAGCAATA G NC_000012.12:g.55697506_55697513del NM_002206.3:c.1446_1453del 1 2025-08-19 +17 61857100 T G NC_000017.11:g.61857100T>G NM_032043.2:c.337A>C 1 2024-04-24 +12 132632680 C T NC_000012.12:g.132632680C>T NM_006231.3:c.6120G>A 1 2019-10-16 +16 1204158 G A NC_000016.10:g.1204158G>A NM_021098.2:c.2151G>A 2 2019-09-25 +19 11058791 C T NC_000019.10:g.11058791C>T NM_001128849.1:c.4633C>T 1 2024-12-31 +11 71435745 AC A NC_000011.10:g.71435748del NM_001360.3:c.1057delG 1 2025-03-14 +2 43889733 C CA NC_000002.12:g.43889734dup NM_133259.3:c.4128dupT 1 2025-06-25 +2 237365858 G A NC_000002.12:g.237365858G>A NM_004369.3:c.5678C>T 1 2024-04-19 +5 71626744 A AC NC_000005.10:g.71626750dup NM_022132.4:c.735dupC 1 2026-02-26 +16 2497068 A G NC_000016.10:g.2497068A>G NM_001199107.2:c.920A>G 1 2025-10-17 +X 129560596 G A NC_000023.11:g.129560596G>A NM_000276.4:c.769G>A 3 2022-12-13 +17 37710592 C T NC_000017.11:g.37710592C>T NM_000458.4:c.1117G>A 2 2022-12-13 +1 77926885 G A NC_000001.11:g.77926885G>A NM_144573.4:c.857G>A 1 2022-12-13 +5 138934039 G A NC_000005.10:g.138934039G>A NM_001903.2:c.2671G>A 1 2024-12-31 +7 124870978 C G NC_000007.14:g.124870978C>G NM_015450.2:c.188G>C 2 2024-07-05 +7 128845159 G A NC_000007.14:g.128845159G>A NM_001458.5:c.3694G>A 1 2024-09-22 +12 132632363 G A NC_000012.12:g.132632363G>A NM_006231.2:c.6282C>T 1 2025-09-30 +X 19357714 A G NC_000023.11:g.19357714A>G NM_000284.3:c.894A>G 1 2020-02-20 +20 4899545 C T NC_000020.11:g.4899545C>T NM_005116.5:c.482+10G>A 1 2019-03-14 +3 49421520 C T NC_000003.12:g.49421520C>T NM_000481.4:c.311G>A 1 2022-01-11 +17 31235992 A G NC_000017.11:g.31235992A>G NM_000267.3:c.3945A>G 1 2024-05-11 +9 95458111 G C NC_000009.12:g.95458111G>C NM_000264.3:c.3070C>G 1 2024-12-31 +1 53213737 T C NC_000001.11:g.53213737T>C NM_000098.2:c.*142T>C 1 2020-02-20 +11 88337721 G A NC_000011.10:g.88337721G>A NM_001814.4:c.-49C>T 2 2020-02-20 +17 44372394 G C NC_000017.11:g.44372394G>C NM_000419.3:c.3090C>G 1 2020-02-20 +4 79905758 A C NC_000004.12:g.79905758A>C NM_058172.5:c.*1671T>G 1 2020-02-20 +6 131892369 C G NC_000006.12:g.131892369C>G NM_006208.2:c.*1858C>G 2 2020-02-20 +16 15704058 G A NC_000016.10:g.15704058G>A NM_002474.2:c.5852C>T 1 2024-04-24 +2 189575194 C T NC_000002.12:g.189575194C>T NM_014585.5:c.238G>A 1 2020-11-17 +11 6392116 TG T NC_000011.10:g.6392119del NM_000543.4:c.1054_1054delG 1 2021-01-10 +5 112838115 T G NC_000005.10:g.112838115T>G NM_000038.5:c.2521T>G 1 2024-07-05 +1 237784046 G A NC_000001.11:g.237784046G>A NM_001035.2:c.12334G>A 2 2025-04-14 +2 73519880 A G NC_000002.12:g.73519880A>G NM_015120.4:c.9648A>G 1 2024-12-31 +16 3256396 C T NC_000016.10:g.3256396C>T NM_000243.3:c.192G>A 4 2022-12-13 +18 31536331 A G NC_000018.10:g.31536331A>G NM_001943.5:c.1553A>G 1 2025-04-29 +21 43056842 T C NC_000021.9:g.43056842T>C NM_000071.2:c.1513A>G 2 2021-10-31 +9 4118062 C A NC_000009.12:g.4118062C>A NM_152629.3:c.951G>T 1 2023-07-05 +19 7528975 G A NC_000019.10:g.7528975G>A NM_020533.2:c.1134+5G>A 1 2023-05-17 +13 48362951 A G NC_000013.11:g.48362951A>G NM_000321.2:c.855A>G 1 2025-06-17 +5 141577497 C T NC_000005.10:g.141577497C>T NM_005219.4:c.1258G>A 2 2023-10-19 +14 95106091 G C NC_000014.9:g.95106091G>C NM_177438.2:c.2937C>G 1 2024-04-24 +X 25013001 G C NC_000023.11:g.25013001G>C NM_139058.3:c.994C>G 1 2022-12-13 +13 32340722 G C NC_000013.11:g.32340722G>C NM_000059.3:c.6367G>C 1 2024-07-05 +8 143923283 C T NC_000008.11:g.143923283C>T NM_000445.3:c.6727G>A 1 2024-04-20 +12 12718070 A G NC_000012.12:g.12718070A>G NM_004064.3:c.231A>G 1 2024-12-31 +16 56872385 C T NC_000016.10:g.56872385C>T NM_000339.2:c.887C>T 1 2022-05-16 +6 7579796 G A NC_000006.12:g.7579796G>A NM_004415.2:c.3606G>A 1 2024-04-24 +7 116699516 T A NC_000007.14:g.116699516T>A NM_001127500.1:c.432T>A 1 2024-04-24 +17 31181775 T A NC_000017.11:g.31181775T>A NM_000267.3:c.720T>A 1 2024-05-11 +6 33438512 A G NC_000006.12:g.33438512A>G NM_006772.2:c.1480A>G 1 2024-04-24 +21 43072091 C A NC_000021.9:g.43072091C>A NM_000071.2:c.103G>T 2 2024-07-05 +17 61686104 TT CA NC_000017.11:g.61686104_61686105delinsCA NM_032043.2:c.2636_2637delAAinsTG 1 2024-04-24 +5 1409135 AG A NC_000005.10:g.1409139del NM_001044.5:c.1399-11del 1 2025-12-23 +3 158652217 G GA NC_000003.12:g.158652223dup NM_024996.5:c.817dupA 1 2026-02-26 +1 99881666 G T NC_000001.11:g.99881666G>T NM_000642.3:c.2283G>T 1 2023-10-18 +1 237500732 G A NC_000001.11:g.237500732G>A NM_001035.2:c.2225G>A 1 2024-11-20 +17 75949713 C A NC_000017.11:g.75949713C>A NM_004035.7:c.1478+5G>T 1 2024-11-11 +14 64056161 C G NC_000014.9:g.64056161C>G NM_182914.2:c.9962C>G 1 2025-08-19 +15 89317479 G GAA NC_000015.10:g.89317483_89317484dup NM_002693.3:c.3538_3539dup 1 2023-12-07 +16 2072919 T C NC_000016.10:g.2072919T>C NM_000548.3:c.2291T>C 1 2024-04-24 +15 90815186 A C NC_000015.10:g.90815186A>C NM_000057.2:c.4161A>C 1 2024-04-24 +10 90920220 AG A NC_000010.11:g.90920223del NM_014391.3:c.155delC 1 2024-06-29 +7 21687217 G A NC_000007.14:g.21687217G>A NM_001277115.1:c.5740G>A 1 2025-09-30 +8 144512970 G T NC_000008.11:g.144512970G>T NM_004260.3:c.2632C>A 1 2025-06-17 +1 201091672 T C NC_000001.11:g.201091672T>C NM_000069.3:c.662A>G 1 2026-01-30 +11 108244765 T G NC_000011.10:g.108244765T>G NM_000051.3:c.663-23T>G 1 2024-04-19 +22 20992235 G A NC_000022.11:g.20992235G>A NM_006767.3:c.1015G>A 1 2024-05-11 +22 20993681 G A NC_000022.11:g.20993681G>A NM_006767.3:c.1280G>A 1 2025-09-30 +7 142749501 T A NC_000007.14:g.142749501T>A NM_002769.4:c.17T>A 1 2024-07-05 +7 116771634 A C NC_000007.14:g.116771634A>C NM_001127500.1:c.2921A>C 1 2024-12-31 +9 95101825 T A NC_000009.12:g.95101825T>A NM_000136.2:c.1559A>T 1 2024-12-31 +5 177398151 CGCCACCCTAT C NC_000005.10:g.177398154_177398163del NM_003052.5:c.1788_1797del 1 2024-12-20 +5 37157794 C A NC_000005.10:g.37157794C>A NM_023073.3:c.7833G>T 1 2024-12-20 +1 16044521 G T NC_000001.11:g.16044521G>T NM_000085.5:c.29G>T 1 2024-12-20 +17 44074228 A G NC_000017.11:g.44074228A>G NM_138387.3:c.287A>G 1 2025-09-30 +10 102599456 C T NC_000010.11:g.102599456C>T NM_016169.3:c.934C>T 1 2025-04-14 +21 45504528 CA C NC_000021.9:g.45504529del NM_001379500.1:c.2841del 1 2025-04-21 +5 179113858 T C NC_000005.10:g.179113858T>C NM_014244.4:c.*9A>G 1 2025-07-01 +22 42627380 G A NC_000022.11:g.42627380G>A NM_000398.7:c.557C>T 1 2025-08-19 +19 55166062 C A NC_000019.10:g.55166062C>A NM_001256714.1:c.228G>T 1 2025-09-30 +21 44910760 A AGTGG NC_000021.9:g.44910762_44910765dup NM_000211.5:c.19_22dup 1 2025-10-10 +18 70188108 C A NC_000018.10:g.70188108C>A NM_173630.4:c.1305G>T 1 2025-10-17 +2 29160279 G A NC_000002.12:g.29160279G>A NM_024692.6:c.1400-54G>A 1 2025-10-17 +7 148809370 G A NC_000007.14:g.148809370G>A NM_004456.4:c.2050C>T 4 2014-09-11 +16 53637799 T C NC_000016.10:g.53637799T>C NM_015272.4:c.3116A>G 1 2020-02-13 +16 2081754 C T NC_000016.10:g.2081754C>T NM_000548.3:c.3770C>T 7 2012-07-15 +3 37040185 G C NC_000003.12:g.37040185G>C NM_000249.3:c.1559-1G>C 4 2019-06-21 +13 102858387 G A NC_000013.11:g.102858387G>A NM_001204425.2:c.2003G>A 1 2025-08-18 +9 114406564 G C NC_000009.12:g.114406564G>C NM_001083885.2:c.878C>G 1 2021-08-17 +8 27469905 C A NC_000008.11:g.27469905C>A NM_000742.3:c.150G>T 1 2018-03-26 +22 20990400 C T NC_000022.11:g.20990400C>T NM_006767.3:c.666C>T 3 2018-03-26 +20 63694428 G A NC_000020.11:g.63694428G>A NM_001283009.2:c.3049G>A 1 2024-12-31 +11 68908328 G A NC_000011.10:g.68908328G>A NM_002180.2:c.440G>A 3 2020-04-07 +2 178561403 A C NC_000002.12:g.178561403A>C NM_003319.4:c.57534T>G 1 2024-12-31 +7 47877528 T C NC_000007.14:g.47877528T>C NM_138295.3:c.3624A>G 1 2024-10-02 +7 151001579 C G NC_000007.14:g.151001579C>G NM_000603.4:c.1464C>G 1 2020-01-29 +17 61684007 A G NC_000017.11:g.61684007A>G NM_032043.3:c.3039T>C 1 2025-04-29 +X 119851588 T C NC_000023.11:g.119851588T>C NM_080632.2:c.277A>G 1 2024-04-24 +10 119676582 G T NC_000010.11:g.119676582G>T NM_004281.3:c.1028G>T 1 2025-11-12 +1 11949788 G A NC_000001.11:g.11949788G>A NM_000302.4:c.184G>A 2 2025-05-23 +1 241497927 A T NC_000001.11:g.241497927A>T NM_000143.3:c.1434T>A 1 2026-03-31 +16 2050470 C G NC_000016.10:g.2050470C>G NM_000548.3:c.209C>G 1 2026-03-31 +15 60503594 T G NC_000015.10:g.60503594T>G NM_134261.3:c.1016A>C 1 2026-03-31 +11 108227870 A C NC_000011.10:g.108227870A>C NM_000051.3:c.167A>C 2 2021-06-11 +2 47796041 CAGA C NC_000002.12:g.47796042AGA[1] NM_000179.2:c.609_611delAGA 1 2026-03-31 +2 165754686 T C NC_000002.12:g.165754686T>C NM_004482.4:c.1567A>G 1 2024-12-20 +11 121109347 A G NC_000011.10:g.121109347A>G NM_005422.2:c.335A>G 1 2026-03-31 +6 70068437 A G NC_000006.12:g.70068437A>G NM_001858.4:c.1185A>G 1 2026-03-31 +15 45605433 TGA AT NC_000015.10:g.45605433_45605435delinsAT NM_012388.4:c.318_320delinsAT 1 2026-04-14 +6 32049526 C T NC_000006.12:g.32049526C>T NM_019105.6:c.9495G>A 1 2024-12-31 +1 23868283 G GCATCGCTACCCCT NC_000001.11:g.23868286_23868298dup NM_000147.5:c.3_4insAGGGGTAGCGATG 1 2026-04-09 +12 102866594 ACTGGCGGTAGTTGTAGGCAATGTCAGCAAACTGCTTCCGTCTTGCACGGTACACAGGATCTTTAAAAC A NC_000012.12:g.102866596_102866663del NM_000277.1:c.442_509del 1 2012-03-30 +17 43045757 A T NC_000017.11:g.43045757A>T NM_007294.3:c.5513T>A 6 2015-08-17 +17 43124092 T G NC_000017.11:g.43124092T>G NM_007294.3:c.5A>C 1 2018-11-12 +15 48437026 T C NC_000015.10:g.48437026T>C NM_000138.4:c.6431A>G 6 2018-04-25 +1 155235829 C A NC_000001.11:g.155235829C>A NM_001005741.2:c.1240G>T 2 2020-04-29 +12 88125356 C T NC_000012.12:g.88125356C>T NM_025114.3:c.1079G>A 9 2016-04-28 +11 108327679 G A NC_000011.10:g.108327679G>A NM_000051.3:c.7010G>A 2 2023-07-26 +10 87863460 C G NC_000010.11:g.87863460C>G NM_000314.4:c.-1009C>G 2 2017-08-01 +1 32818026 C T NC_000001.11:g.32818026C>T NM_003680.3:c.-782G>A 1 2020-02-20 +7 144410160 C T NC_000007.14:g.144410160C>T NM_001080413.3:c.68G>A 1 2020-02-20 +2 27445037 T C NC_000002.12:g.27445037T>C NM_015662.2:c.5137A>G 1 2024-10-02 +7 76511669 T C NC_000007.14:g.76511669T>C NM_030570.2:c.413T>C 1 2025-06-17 +11 19192405 T C NC_000011.10:g.19192405T>C NM_003476.5:c.44A>G 1 2025-10-28 +19 54939561 C T NC_000019.10:g.54939561C>T NM_001127255.2:c.1258G>A 1 2026-03-16 From dce67e0d1d57553f05639685adf94fd6d13cfcea Mon Sep 17 00:00:00 2001 From: Dave Lawrence Date: Wed, 19 Aug 2026 07:09:44 +0000 Subject: [PATCH 3/3] Paper: drop Tier 1/2 wording for public/private data; move S5/S6 tables to CSVs - #112 Supplementary: replace remaining "Tier 1 / Tier 2" labels with "public data / private data" to match the main paper's provenance flags, and fix the stale [Tier 2] marker note in paper/README.md. Move the two number-dense hardcoded supplementary tables (S5 injection benchmark, S6 residual taxonomy) into committed CSVs rendered inline via the vibepaper include-csv directive, so the values live in data files rather than hardcoded markdown. --- paper/README.md | 16 +++---- paper/empirical_results/PROVENANCE.md | 16 +++++++ .../empirical_results/injection_benchmark.csv | 20 +++++++++ paper/empirical_results/residual_taxonomy.csv | 8 ++++ paper/supplementary.md | 44 +++++-------------- 5 files changed, 62 insertions(+), 42 deletions(-) create mode 100644 paper/empirical_results/injection_benchmark.csv create mode 100644 paper/empirical_results/residual_taxonomy.csv diff --git a/paper/README.md b/paper/README.md index c3a4124..0627538 100644 --- a/paper/README.md +++ b/paper/README.md @@ -82,7 +82,7 @@ snakemake -s paper/Snakefile full --config pdf=true --cores 1 \ ### Full build — regenerates every fact, then renders -Recomputes the reproducible (Tier-1) facts from scratch, refreshes the +Recomputes the reproducible (public-data) facts from scratch, refreshes the `paper/empirical_results/` snapshot, then renders. Slow, and needs the inputs each fact requires. ```bash @@ -103,7 +103,7 @@ needs are absent, it copies the committed CSV instead, so a build always renders | `coverage.csv` | `paper/scripts/compute_coverage.py` over the release JSON.gz files | `data_dir` | | `benchmark.csv` | `paper/scripts/compute_benchmark.py` (Table 1 throughput) | `data_dir`, `uta_uri`, SeqRepo | | `version_stability.csv`, `positional_drift.csv` | `paper/scripts/compute_version_stability.py` | `data_dir` | -| `cleaning.csv` | `paper/scripts/inject_and_clean.py` (Tier-1 injection benchmark) | committed test data (none) | +| `cleaning.csv` | `paper/scripts/inject_and_clean.py` (public-data injection benchmark) | committed test data (none) | | `lovd_comparison.csv` | `paper/scripts/lovd_head_to_head.py` | `lovd_checker` (local PHP CLI) | | `sources.csv` | `paper/scripts/compute_sources.py` over `cdot_transcripts.yaml` | committed (none) | @@ -119,17 +119,17 @@ copies them into the facts dir. To change one, edit the CSV and update its entry The full-scale ClinVar throughput runs take ~1.5 h each — see `claude/benchmark_plan.md`. -### Two-tier facts and the private corpus +### Public and private facts -- **Tier 1 (reproducible)** lives in the fact CSVs above and regenerates from public - data committed here. -- **Tier 2 (production validation, not reproducible)** — the cleaning rescue rate +- **Public data (reproducible)** lives in the fact CSVs above and regenerates from + public data committed here. +- **Private data (production validation, not reproducible):** the cleaning rescue rate (91.7% → 97.0%), the per-fix rescue distribution (Results Table 2), and the residual - error taxonomy — comes from the private `cdot_private` corpus and is written into + error taxonomy come from the private `cdot_private` corpus and are written into `results.md` as **literal frozen constants**, not regenerable facts. No corpus string ever enters this repo. When the corpus is re-analysed (`cdot_private/analyze_cleaning.py`), transcribe the new aggregate numbers into `results.md` by hand. These are flagged - `[Tier 2]` in the text. + `[private data]` in the text. To refresh the committed snapshot without a full data run (e.g. after editing one analysis script), regenerate that one CSV into `output/facts/` and copy it into diff --git a/paper/empirical_results/PROVENANCE.md b/paper/empirical_results/PROVENANCE.md index 1e44171..2d6e821 100644 --- a/paper/empirical_results/PROVENANCE.md +++ b/paper/empirical_results/PROVENANCE.md @@ -142,6 +142,22 @@ re-resolving the residual strings and catching the exception class: (`HGVSInvalidIntervalError`). * `unknown_accession` (0): no version of the accession in the data. +## injection_benchmark.csv, residual_taxonomy.csv (table CSVs, not facts) + +Multi-row table CSVs rendered inline by the `` directive in +`supplementary.md` (Tables S5 and S6), so the numbers live in a CSV rather than hardcoded +in the markdown. `vibepaper`'s fact loader skips multi-row CSVs, so these are not `{{ }}` +facts; edit the CSV to change the table. + +* `injection_benchmark.csv` (Table S5): per-category recovery of `clean_hgvs()` vs LOVD / + VariantValidator / Mutalyzer on the injection benchmark. Body rows from + `inject_and_clean.py` + the LOVD / VV / Mutalyzer head-to-heads; the **Total** row is + the frozen aggregate (matches `lovd_comparison.csv` / `vv_mutalyzer_comparison.csv`). + Refresh by re-running those scripts and re-transcribing. +* `residual_taxonomy.csv` (Table S6): the seven repair-relevant residual classes of the + private cleaning corpus (frozen LLM classification; see `cleaning_corpus.csv`). Percentages + are of the 994 genuine-HGVS residual queries. + ## cleaning_corpus.csv (frozen, Tier 2) R4 production cleaning-corpus headline numbers, transcribed from a deterministic run of diff --git a/paper/empirical_results/injection_benchmark.csv b/paper/empirical_results/injection_benchmark.csv new file mode 100644 index 0000000..664fe2e --- /dev/null +++ b/paper/empirical_results/injection_benchmark.csv @@ -0,0 +1,20 @@ +Injected error (example → target),n,`clean_hgvs()`,LOVD top-1,VV,Mutalyzer +Whitespace (` NM_000059.4: c.68del`),200,100%,100%,96.5%,89.5% +Lowercased bases (`c.316g>a`),200,100%,100%,96.0%,89.5% +Trailing protein suffix (`c.68del p.Arg100Ter`),200,100%,91.5%,0%,0% +Gene wrapper with colon (`NM_000059.4:(BRCA2):c.68del`),200,100%,0%,0%,0% +Gene/transcript swapped (`BRCA2(NM_000059.4):c.68del`),200,100%,49.5%,94.5%,0% +"Surrounding quotes (`""NM_000059.4:c.68del""`)",200,100%,0%,97.5%,0% +Doubled colon (`NM_000059.4::c.68del`),200,100%,0%,99.0%,0% +Unbalanced bracket (`(NM_000059.4:c.68del`),200,100%,0%,0%,0% +"Separator typo (`NM_000059.4:c,68del`)",200,100%,100%,0%,0% +Doubled version dot (`NM_000059..4:c.68del`),200,100%,0%,0%,0% +Leading junk (`GRCh38.p2 NM_000059.4:c.68del`),200,100%,0%,0%,0% +Doubled kind (`NM_000059.4:c.c.68del`),200,100%,0%,0%,0% +Lowercased accession (`nm_000059.4:c.68del`),200,100%,52.0%,94.0%,35.5% +Redundant del/dup count (`c.68_69del23`),77,100%,0%,0%,0% +Missing accession underscore (`NM000059.4:c.68del`),200,100%,0%,0%,0% +Colon in accession prefix (`NM:_000059.4:c.68del`),200,100%,0%,0%,0% +Uppercased mutation type (`c.68DEL`),142,100%,100%,94.4%,0% +Dropped accession letter (`M_000059.4:c.68del`),200,100%,0%,0%,0% +**Total**,"**3,419**",**100.0%**,**33.0%**,**37.7%**,**12.5%** diff --git a/paper/empirical_results/residual_taxonomy.csv b/paper/empirical_results/residual_taxonomy.csv new file mode 100644 index 0000000..13c9c4b --- /dev/null +++ b/paper/empirical_results/residual_taxonomy.csv @@ -0,0 +1,8 @@ +Class,Queries,What it is (*example*) +Truncated,284 (28.6%),"cut off before a complete variant: `NM_000059.4:c.68_69` (range, no edit)" +No reference,277 (27.9%),"a bare variant body, no transcript/gene/accession: `c.68_69delAG`" +Bad accession,124 (12.5%),"misplaced or truncated version, or a missing prefix with no unique data match: `NM_000059/4:c.68del` (slash in place of the version dot)" +Edit syntax,113 (11.4%),malformed or non-standard edit operation: `NM_000059.4:c.68AG>T` (multi-base reference in a substitution) +Trailing / concatenated,85 (8.6%),"extra characters after a complete variant, or several run together: `NM_000059.4:c.68delAG;c.70A>G`" +Grammar gap,81 (8.1%),legitimate HGVS the biocommons grammar rejects: `NM_000059.4:c.(67+1_68-1)_(70+1_71-1)del` (uncertain-range deletion) +Insertion (length only),30 (3.0%),"an insertion given as a base count, not a sequence: `NM_000059.4:c.68_69ins5` (position and length recoverable; inserted bases not)" diff --git a/paper/supplementary.md b/paper/supplementary.md index b15da6c..e7d0672 100644 --- a/paper/supplementary.md +++ b/paper/supplementary.md @@ -27,7 +27,7 @@ as a missing accession prefix), so both tools are eligible on every case. ### Shariant corpus resolution protocol -The Shariant corpus (Results R2, Tier 2) is resolved as pure coordinate projection with +The Shariant corpus (Results R2, private data) is resolved as pure coordinate projection with `replace_reference=False`, so the sequence layer never differs between the two backends. @@ -136,7 +136,7 @@ notations are not miscounted. laboratories citing mostly current RefSeq versions, so this is a clean, public, reproducible scale check that cdot resolves real variants at scale, not an unbiased sample of the transcripts clinical labs use. The unbiased real-world complement is the Shariant -historical corpus (Results R2, Tier 2). The pair builder extracts both RefSeq and Ensembl +historical corpus (Results R2, private data). The pair builder extracts both RefSeq and Ensembl c.HGVS and reports the measured source mix, but ClinVar's `variant_summary` Name column is RefSeq-centric, so the Ensembl share at this scale is near zero. ClinVar's comprehensive Ensembl HGVS lives in `hgvs4variation.txt.gz`, which this pass does not ingest; the @@ -196,27 +196,9 @@ commands in each script's docstring; totals also appear in `paper/empirical_results/cleaning.csv`, `lovd_comparison.csv` and `vv_mutalyzer_comparison.csv`. -| Injected error (example → target) | n | `clean_hgvs()` | LOVD top-1 | VV | Mutalyzer | -|---|---|---|---|---|---| -| Whitespace (` NM_000059.4: c.68del`) | 200 | 100% | 100% | 96.5% | 89.5% | -| Lowercased bases (`c.316g>a`) | 200 | 100% | 100% | 96.0% | 89.5% | -| Trailing protein suffix (`c.68del p.Arg100Ter`) | 200 | 100% | 91.5% | 0% | 0% | -| Gene wrapper with colon (`NM_000059.4:(BRCA2):c.68del`) | 200 | 100% | 0% | 0% | 0% | -| Gene/transcript swapped (`BRCA2(NM_000059.4):c.68del`) | 200 | 100% | 49.5% | 94.5% | 0% | -| Surrounding quotes (`"NM_000059.4:c.68del"`) | 200 | 100% | 0% | 97.5% | 0% | -| Doubled colon (`NM_000059.4::c.68del`) | 200 | 100% | 0% | 99.0% | 0% | -| Unbalanced bracket (`(NM_000059.4:c.68del`) | 200 | 100% | 0% | 0% | 0% | -| Separator typo (`NM_000059.4:c,68del`) | 200 | 100% | 100% | 0% | 0% | -| Doubled version dot (`NM_000059..4:c.68del`) | 200 | 100% | 0% | 0% | 0% | -| Leading junk (`GRCh38.p2 NM_000059.4:c.68del`) | 200 | 100% | 0% | 0% | 0% | -| Doubled kind (`NM_000059.4:c.c.68del`) | 200 | 100% | 0% | 0% | 0% | -| Lowercased accession (`nm_000059.4:c.68del`) | 200 | 100% | 52.0% | 94.0% | 35.5% | -| Redundant del/dup count (`c.68_69del23`) | 77 | 100% | 0% | 0% | 0% | -| Missing accession underscore (`NM000059.4:c.68del`) | 200 | 100% | 0% | 0% | 0% | -| Colon in accession prefix (`NM:_000059.4:c.68del`) | 200 | 100% | 0% | 0% | 0% | -| Uppercased mutation type (`c.68DEL`) | 142 | 100% | 100% | 94.4% | 0% | -| Dropped accession letter (`M_000059.4:c.68del`) | 200 | 100% | 0% | 0% | 0% | -| **Total** | **{{ lovd_comparison.n_cases | commas }}** | **{{ lovd_comparison.cdot_pct | dp(1) }}%** | **{{ lovd_comparison.lovd_top1_pct | dp(1) }}%** | **{{ vv_mutalyzer_comparison.vv_pct | dp(1) }}%** | **{{ vv_mutalyzer_comparison.mut_pct | dp(1) }}%** | + Weighted by the production rescue-op distribution (Results Table 2) the totals are {{ lovd_comparison.cdot_weighted_pct | dp(1) }}% for `clean_hgvs()`, @@ -253,25 +235,19 @@ could not parse embedded the LOVD syntax checker's ranked suggestions in ### Table S6: Residual error classes after cleaning -**[Tier 2].** Single-label classification of the {{ cleaning_corpus.residual_n | commas }} +**[private data].** Single-label classification of the {{ cleaning_corpus.residual_n | commas }} genuine-HGVS production queries that still fail to parse after cleaning (Results, "Residual errors"), under a fixed decision-tree taxonomy. A further {{ cleaning_corpus.nonhgvs_n | int }} residual queries were non-HGVS input (pasted URLs, report templates, or prose) that slipped the corpus regex; these are a data-collection artifact with nothing in them for cleaning to repair, so they are removed from the corpus and excluded here (Results). Counts and % below are of the {{ cleaning_corpus.residual_n | commas }} residual queries; -examples are synthesised from public BRCA2 `NM_000059.4`. *(Tier 2; frozen constants +examples are synthesised from public BRCA2 `NM_000059.4`. *(Private data; frozen constants from a deterministic run over the production corpus.)* -| Class | Queries | What it is (*example*) | -|---|---|---| -| Truncated | 284 (28.6%) | cut off before a complete variant: `NM_000059.4:c.68_69` (range, no edit) | -| No reference | 277 (27.9%) | a bare variant body, no transcript/gene/accession: `c.68_69delAG` | -| Bad accession | 124 (12.5%) | misplaced or truncated version, or a missing prefix with no unique data match: `NM_000059/4:c.68del` (slash in place of the version dot) | -| Edit syntax | 113 (11.4%) | malformed or non-standard edit operation: `NM_000059.4:c.68AG>T` (multi-base reference in a substitution) | -| Trailing / concatenated | 85 (8.6%) | extra characters after a complete variant, or several run together: `NM_000059.4:c.68delAG;c.70A>G` | -| Grammar gap | 81 (8.1%) | legitimate HGVS the biocommons grammar rejects: `NM_000059.4:c.(67+1_68-1)_(70+1_71-1)del` (uncertain-range deletion) | -| Insertion (length only) | 30 (3.0%) | an insertion given as a base count, not a sequence: `NM_000059.4:c.68_69ins5` (position and length recoverable; inserted bases not) | + *Method and limitation:* classification was performed by a large language model (Claude Opus 4, Anthropic; 2026-06-17) applying the shared decision tree to each unique string,