Release 2026.3.0 - #732
Open
bencap wants to merge 143 commits into
Open
Release 2026.3.0#732bencap wants to merge 143 commits into
bencap wants to merge 143 commits into
Conversation
Wire the UI up to the new GET /score-sets/{urn}/variants endpoint that
serves one pre-chewed record per variant (selection key, score,
consequence, annotation bridge ids, and parsed DNA/protein HGVS blocks).
- add LeanVariant/HgvsField types mirrored from the OpenAPI schema
- add getLeanScoreSetVariants and leanScoreSetVariantsUrl to the API
client
- fetch the lean view alongside the legacy CSV scoresData channel in
ScoreSetView, exposing a typed leanVariantRecords handle so consumers
can migrate off the CSV channel slice by slice
- regenerate openapi.d.ts for the new path and schemas
…rm binaries Add `os` (darwin, linux, win32) and `cpu` (x64, arm64) fields to package.json so installs are validated against supported platforms, and regenerate the lockfile to include the platform-specific optional binaries (e.g. the full set of @esbuild/* targets). This lets the project be installed and built on macOS, Linux, and Windows across x64 and arm64. Also picks up minor transitive dependency bumps from the lockfile regeneration.
Query the AlphaFold prediction API with the UniProt ID directly instead of first fetching the UniProt XML entry, parsing out AlphaFoldDB references, and having the user select one. This removes the AlphaFold ID dropdown and its supporting state. - Drop fetchUniprotData, the alphaFoldData computed property, and the alphaFoldData/selectedAlphaFold watchers; the uniprotId watcher now renders the viewer directly. - fetchAlphaFoldCifUrl and render key off uniprotId; the model is matched by entryId AF-<uniprotId>-F1 to disambiguate multi-entry responses (e.g. P42167). - Remove now-unused jquery, FloatLabel, and Select imports and the uniprotData/selectedAlphaFold data fields.# Please enter the commit message for your changes. Lines starting
Migrate the heatmap, histogram, score-set view, visualizer, and variant lookup off the legacy CSV-parsed `Variant` model onto the lean `DisplayVariant`/`LeanVariant` API record. The score-set view now fetches a single lean whole-set channel instead of the dual histogram-CSV + lean channels, and variant identity keys move from `accession` to `variantUrn` throughout. - Rework use-variant-coordinates around `coordinateFor(variant, level, frame)` as the single source of truth for the (level × frame) coordinate grid; add `resolveLevel` and `isUnmapped`, and make the (mapped, dna) cell null for protein assays (mavedb-api#784) - Handle unmapped variants: labels fall back to submitted HGVS rather than the URN, mapped/clinical mode is disabled and annotated when a set has no mapped data, and the search matches both frames - Extract VEP consequence bucketing into lib/consequences.ts, replacing the parsed-HGVS effect classifiers (`variantIsMissense`, etc.) in lib/variants.ts; `isStartOrStopLoss` stays as the block-aware heatmap filter - Extract shared d3 chart tooltip builders into lib/tooltips.ts and rebuild the heatmap/histogram tooltips on top of them - Add `isNucleotideHgvs` to lib/mave-hgvs.ts and `inferReferenceSequenceFromBlocks` to lib/variants.ts - Heatmap UX: deferred redraw with a loading indicator, a not-shown breakdown (no-coordinate vs complex), a note when the selection is off the chart, and viewport-aware hover-tooltip positioning - Add tests for consequences, mave-hgvs, and use-variant-coordinates
Consume the reworked GET /variants/{urn} envelope: a self-contained
VariantDetailPanel (assay-level facts, primary classification, gnomAD/ClinVar,
supersession badge, link to the variant page) wired into ScoreSetView on the
?variant= selection, plus use-variant-lookup / VariantScreen / the legacy
measurement-URN redirect repointed off the deleted VariantEffectMeasurementWithScoreSet
onto the flat envelope fields (clingenAlleleId bridge, separately fetched score set).
Clinical controls: drop the hard-coded DEFAULT_CLINICAL_CONTROL_VERSION, accept a
nullable version end to end, and render human-readable ClinVar versions
(formatClinvarVersion) in the heatmap/histogram clinical mode. openapi.d.ts
regenerated for the new API shapes.
Match the API field rename: the detail panel reads the superseding *score set*'s URN (supersession is score-set-versioned), not a variant URN, and the tooltip now reads "Superseded by score set X". Update the generated VariantDetail type to match. The /alleles/* schema regen in openapi.d.ts is deliberately left for the alleles-slice work.
…riants are completely or partially mapped
The viewer assumed a single canonical AlphaFold model (AF-<id>-F1), which does not exist for proteins over ~2700 aa, so those score sets rendered no structure (and silently errored). When no canonical AlphaFold model is available, fetch experimental (PDBe) and template (SWISS-MODEL) structures from 3D-Beacons and let the user switch between the covering segments via a dropdown. Normal-length proteins keep loading their single AlphaFold model as before. - Overlay heatmap scores on every structure: canonical-numbered models (AlphaFold, SWISS-MODEL) directly, and PDBe experimental structures via their SIFTS UniProt mapping (uniprot_accession selection). Always apply the selection with nonSelectedColor so molstar's per-chain default never shows. - Default to the structure that best covers the scored residues, and re-pick when score data arrives after the structures load. - Map clicked-residue events back to canonical UniProt positions (unp_seq_id) so clicking a residue selects and scrolls to the matching heatmap column on SIFTS-mapped structures. - Contain the dropdown overlay's scroll (overscroll-behavior) so it no longer chains into the molstar viewer, and dispose the previous molstar plugin when switching structures. - Offer only structures overlapping the assayed residues, and always show the segment selector for fragment structures (hidden only for a single full-length AlphaFold model).
…m-build-support chore(build): declare multi-platform support and include cross-platfo…
…ram url helper - Support an optional `limit` on getScoreSetScoresPreview and getScoreSetCountsPreview so the preview table fetches only the rows it renders instead of the full dataset; document that `drop_na_columns` is evaluated over the sampled rows - Remove the now-unused histogramScoreSetVariantDataUrl helper and its scoreSetVariantDataParams/namespace constant
Pass the variant's URN as a query param on the ClinGen variant-details link so the destination page can disambiguate which variant to show when a single ClinGen allele maps to multiple variants.
- Show the score set URN under its title when showUrn is set, so correlated score sets with identical facts can be told apart - Add an "Assay level" detail row driven by a new assayLevel prop, surfacing the score-set-wide protein/cdna/genomic measurement level - Scope the 2-col top-border reset to the new assay-facts-grid--2col class so the 1-col layout keeps a divider between every stacked row
- Pass MAX_ROWS as a limit to the scores/counts preview requests instead of fetching the full dataset and slicing client-side - Derive the "Showing X of Y" total from the score set's numVariants rather than the now-truncated fetched rows, since the fetch no longer returns the true total
proteinConsequenceBlock referenced variant.proteinLevelHgvs, a field that no longer exists on DisplayVariant; fall back through variant.mapped.protein (the mapped protein representation) before the submitted protein HGVS, matching the documented fallback order.
- Replace MeasurementType (nucleotide/protein/associatedNucleotide) with a two-way LevelBucket (nucleotide/protein) derived from the mapping record's AssayLevel, since cdna and genomic share one visual bucket - Add assayLevelBucket() to bucket a raw assay level, and dominantAssayLevel() to pick the most common non-null level across a score set's variants - Add ASSAY_LEVEL_LABELS for the three per-level labels and RELATIONSHIP_LABELS for the RT direct/protein_consequence/ nucleotide_encoding relationship display strings - Add unit tests covering bucketing and dominant-level selection, including ties and all-null/undefined inputs
Add memoizeRead, a p-memoize/expiry-map wrapper that dedupes concurrent calls to the same idempotent GET and caches the result for a short TTL. Read data can be rewritten underneath us at any time by the mapping/annotation worker, so the cache is tuned to collapse page-load request bursts rather than to reuse results long-term; a 30s default TTL bounds staleness while composables still handle same-page reuse via their own reactive caches.
- Replace lookupVariantsByClingenId (POST clingen-allele-id-lookups)
with getAlleleMeasurements (GET clingen-alleles/{id}/measurements),
the new entrypoint for the ClinGen-allele-centric variant page;
supports includeSuperseded, includeNucleotideSiblings, and asOf
- Wrap getAlleleByCaId, getScoreSet, getLeanScoreSetVariants, and
getVariantDetail in memoizeRead so repeated reads for the same key
dedupe and share a short-TTL cache instead of refetching
- Consolidate the duplicated getScoreSet into score-sets.ts and drop
the copy from calibrations.ts
- Drop getHistogramVariantData now that its only caller is gone
Add a "Download PDB" button to ProteinStructureView that downloads the PDB coordinate file for the currently displayed AlphaFold model. The PDB URL (pdbUrl) is read from the same AlphaFold prediction metadata already fetched to obtain the CIF URL loaded by the viewer.
Turn the structure viewer's download control into a SplitButton offering both the PDB structure and a PyMOL coloring script (.pml). The generated script reproduces the exact residue colors currently shown in the viewer for the selected "Color by" mode: it defines each displayed color with set_color and applies it to the matching residues via `color ..., resi`, reusing the same (residue number, color) pairs the viewer feeds to molstar so the coloring matches after loading the companion PDB.
Add a "ChimeraX coloring script (.cxc)" option to the structure viewer's download menu. The generated command script reproduces the same per-residue coloring as the PyMOL script, using `color /A:<ranges> #<hex> target acs` per unique color plus a whole-chain base color; ChimeraX accepts hex colors directly and writes residue lists as "5-8,12". Extract the residue grouping and run-compression (groupResiduesByColor, residueRuns) shared by the PyMOL and ChimeraX builders.
Add a "Mol* coloring script (.mvsj)" option to the structure viewer's download menu. The generated MolViewSpec document reproduces the current per-residue coloring for loading in the Mol* viewer (drag-and-drop, or the ?mvs-url= parameter). It fetches the AlphaFold structure by URL, so it is self-contained (no companion file needed), and selects residues by author numbering (auth_seq_id = UniProt position) to match MaveDB's numbering.
Add groupAlleles, which collapses a variant detail's allele sidecar into rendered groups: each c<->g projection pair (linked by projectionOf) folds into one entry with deduplicated annotations, while the protein apex and projection-failed candidates stay as one-member groups. Groups carry a measured/pageRoot/derivation summary and sort measured-and-page-root entries first, then bottom-up by level (genomic -> cdna -> protein), so the UI can render one block per real allele instead of one per c/g/p record. Add unit tests covering the nucleotide-assay and protein-assay pairing shapes, divergent-annotation flagging, dangling projectionOf, the measured-vs-null-relation distinction, and page-anchor CAID exclusion from surfaced links.
Drop a leftover console.log(endpoint) call in useEntityCache's fetch path.
- Replace the retired lookupVariantsByClingenId flow with getAlleleMeasurements, consuming the API's own direct-first order instead of re-deriving nucleotide/protein/associatedNucleotide buckets from a nested exactMatch/equivalentAa/equivalentNt shape - Extract per-URN detail/score-set/scores caching into useMeasurementCache, and selection + its derived state (score, calibration resolution, clingen id) into useMeasurementSelection, so useVariantLookup becomes an orchestrating facade over both plus useClingenAllele - Add includeSuperseded and asOf query axes; any change to anchor, superseded scope, or as_of bumps a query epoch, clears the caches, and refetches, so a slower stale response can't clobber a newer one - Add a one-shot citation fallback: an initial `?variant=` deep link to a superseded measurement enables includeSuperseded once so it resolves, without fighting a later manual toggle-off - Cap background prefetch of non-selected measurement details at 4 concurrent requests via p-limit, so a large equivalence class doesn't fire a request storm on load
- Widen SequenceLevel from 'dna'|'protein' to 'cdna'|'genomic'|
'protein', mirroring the backend's AnnotationLayer enum, and route
the mapped frame through the new mapped.{cdna,genomic,protein}
triple instead of the removed assayLevelHgvs/proteinLevelHgvs
fields
- In the raw frame, cdna and genomic both alias hgvsNt since the
submitted string is target-relative and the level split only
exists post-mapping; sequenceTypeOptions collapses them into one
"Nucleotide" option keyed by the variant's assayLevel
- Make getHgvsNt in the mapped frame prefer the coding (cdna)
coordinate over genomic, falling back to genomic only when there
is no coding projection, so it pairs naturally with the protein
change in labels and tooltips
- Update tests for the three-level split, the raw-frame NT aliasing,
the coding-preferred mapped fallback, and the existing protein-only
no-fabricated-coding guarantee (#784)
Reverse translation expands a change into many redundant equivalence- class representations (a protein consequence plus its sibling nucleotide encodings). Add aggregateByStudy to collapse those back into one entry per study — measurement count, assay level(s) (protein/nucleotide/mixed), distinct functional classifications, and functional score range — so search can surface per-study evidence instead of a row per representation. Studies with more corroborating measurements sort first, ties broken by title. Add unit tests covering single- and multi-study collapsing, the mixed-level flag with internal disagreement, and a null score range when no measurement carries a score.
…ship - Rename AlleleResult.variants from nucleotide/protein/ associatedNucleotide to direct/proteinConsequence/nucleotideEncoding, mirroring the API's AlleleMeasurement.relationship, and switch its entries from VariantEffectMeasurementWithShortScoreSet to AlleleMeasurement - Add mergeAlleleSpellings to fold one allele's transcript/genomic/MANE coordinates into another, deduplicating shared MANE entries, so a protein change's several registered transcript alleles collapse into one search result instead of several - Drop the unused `m` regex flag from clinGenAlleleIdRegex/ clinVarVariationIdRegex/rsIdRegex, switch `||` defaults to `??`, and replace a for-in loop with Object.entries in the MANE coordinate walk Add unit tests for mergeAlleleSpellings covering coordinate folding, MANE coordinate dedup, and fill-without-overwrite of genome-build HGVS.
Reorder the "Browse by" cards so Browse all leads and drop the narrow BRCA1 card, leaving an even two-column Browse all + Human grid. Clarify the contribution cards and add docs entry points under both panels (search guide, submission guide) so newcomers have a way into the docs. Refresh the dataset-search guide to match the current filter-sidebar UI: replace the stale Target/Publication "tabs" description with the collapsible sidebar sections, document the Keywords facet and result sorting, and swap in a current screenshot. Closes #665
…nnotation state The compact variant picker showed "No reference annotations were found for this variant" whenever the protein allele had no direct consequence and no pooled gnomAD/ClinVar. For a reverse-translated protein change that assertion is false: the change fans out to candidate nucleotide alleles that carry their own VEP consequence. Split the empty state — when candidate-derivation alleles are present, name the fan-out and scope the absence to population/clinical evidence; keep the original message only when there is genuinely nothing. The candidate count reuses groupAlleles so a candidate's c↔g spellings count once.
…mp-urn-redirect Feature/davereinhart/617/tmp urn redirect
Calibrations gain two curator-provided pieces of clinical context, edited in the calibration wizard and surfaced across the score-set and variant views: - Disease/disorder: a MONDO term chosen via typeahead (DiseaseAutocomplete), defaulting to the generic "disease or disorder" concept. Sent to the server as the bare code and shown on the calibration table and detail views. - Clinical controls: a CSV of variants with known pathogenic/benign status used to derive the calibration, behind a PHI acknowledgment gate. Controls drive a pathogenic/benign overlay in the score histogram (selectable alongside ClinVar through the new clinical-control-source dropdown), per-range placement rows and a concordance summary in the calibration table, and a "used as a control" badge on the variant page. The two share the calibration editor plumbing (draft model, save payload, field descriptions, calibration types), which interleaves them across the same files, so they land as one change rather than as two non-buildable commits.
Mirror the API's SET_SCORES restriction in the editor: the variant-scores card is shown only while the score set is private, so a published set's scores can no longer be edited from the UI. Corrections go through a superseding set.
Before the collection fetch resolves, maveMdScoreSetUrns is an empty array, indistinguishable from a genuinely empty collection. Add a loading flag so the table shows a loader instead of a "0 datasets" flash on page load. Addresses review feedback on #719.
The Quickstart said the API enforced no rate limits. The WAF now blocks clients above 1,500 requests per IP per 5 minutes with a 429 and a Retry-After header. Document the limit and add Python, R, and curl examples that wait and retry on 429.
# Conflicts: # package-lock.json
docs(api-quickstart): document the API rate limit and 429 handling
…landing-scoreset-table feat: MaveMD score set landing table redesign
…-datasets-home Rework home Explore/Contribute panels and refresh search docs
The score set page's variant preview shows five rows but downloaded the whole scores and counts CSVs on every page view. Pass limit=5 to both requests and read the "of N" total from the score set's variant count. Matches the change on the allele data model branch, so the two merge cleanly. Closes #728
- Document the 100 requests / 5 min per-IP limit on score set data downloads, and that each start/limit page counts as a request. - Document the 503 the API returns while it's busy, and retry on 503 as well as 429 in the Python and R examples.
docs(api-quickstart): document the CSV download limit and 503 retries
The preview requests send drop_unused_hgvs_columns=false so it shows the same columns as the full download. Cover both the scores and counts requests.
…iant-preview-rows perf(variant-preview): fetch only the preview rows
The variant-details and annotated-variants downloads use fetch, which the axios auth interceptor doesn't cover, so they went out unauthenticated and an owner downloading an unpublished score set got a 404.
…tion-controls-ui feat: calibration controls and disease context in the UI
…nload buttons into one menu The page's subject allele is now "Your variant" wherever it's badged, the measured allele's badge reads "Measured", and the ClinVar and gnomAD empty states say "this allele", since they describe one allele rather than the page's variant. The variant header's two download split buttons become a single "…" menu on every screen size, with VA-Spec downloads labelled and the menu disabled while a download runs.
…ta-model - score-sets.ts: the preview requests keep release's drop_unused_hgvs_columns 'false' (#729); RT's new lean-view and score set fetchers are kept. - VariantInfoSection.vue stays deleted. #722's calibration-control row moves onto the variant page's Functional evidence card, with selectedVariantControlStatus in use-variant-lookup. - ScoreSetHistogram.vue: RT's version with #722's calibration-controls source re-applied, keyed on variantUrn. - SearchVariantsScreen.vue keeps CALIBRATION_STATUS_LEGEND_HTML and drops the score-set list constants RT removed. - calibrations.ts renames #722's FunctionalClassification alias to ScoreCalibrationFunctionalClassification, to avoid RT's string type. - openapi.d.ts regenerated from the synced API branch.
Measurement relationship - Badge is now Direct / Indirect; both related-variant relationships share Indirect. The detail is stated once, as the first element of the Functional evidence box: "This score was measured on a different variant which has the same protein change as yours: <HGVS>". - Remove the relationship sentence under the carousel and the unlabeled confidence pill on Functional evidence. Clinical & population ledger - "Measured" is a page-wide fact (lookup.measuredDigests, from the loaded measurement envelopes), so the page variant reads "Your variant" + "Measured" instead of flipping to Convergent when another card is selected. - The selected measurement's variant gets a solid "Selected measurement" badge and a sage border echoing the selected card. Resolved / Convergent / Candidate stay relative to the selection and only appear on variants without a measurement of their own. - Extract titleMember into allele-grouping and reuse it for the notice. Page controls - Move "MaveDB as of" and the superseded toggle into a View options panel opened from the header (count badge when non-default, as-of shown in the subtitle); Key becomes a header button. Wording - One noun per referent (variant / score set), "protein change" instead of "protein consequence", "Functional impact" for the classification, "Molecular mechanism", sentence-case "Assay facts", and "Detects ... variants" labels matching the docs. - Add Calibration and NMD Key-drawer entries, retitle the confidence section, and point the drawer's "more" link at the interpreting-annotated-variants doc. - Update variant-page and assay-facts docs to match.
…n-for-allele-data-model Rebuild variant detail, allele grouping, and clinical controls on the allele-centric API
- Bump version from 2026.2.4.2 to 2026.3.0 - Update axios from ^1.18.1 to ^1.20.0 - Update dompurify from ^3.4.11 to ^3.4.16 - Update moment from ^2.29.4 to ^2.31.0 - Update uuid from ^9.0.1 to ^11.1.1 - Update @vitejs/plugin-basic-ssl from ^1.0.2 to ^2.3.0 - Update @vitest/coverage-v8 from 2.1.9 to ^4.1.11 - Update vite from ^5.4.21 to ^7.3.6 - Update vitest from ^2.1.9 to ^4.1.11 - Add overrides for rest-client-vue to use the latest uuid refactor: remove unused css preprocessor options in vite.config.js fix: disable coverage for all files in vitest.config.ts
… document Cat-VRS mappings - gnomadVariantUrl reads the dataset from a release table and leaves it off for an unknown release instead of guessing gnomad_r4, matching the API's gnomad_variant_url. - The data-standards page describes the categorical variant's mappings and the VA-Spec proposition subject.
- Examples use the 1.1 field names (focus, subject, object) and the ga4gh-gkm-term classification system. - A note states which specification versions MaveDB emits and that minor releases can rename fields.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Features
ScoreSetCreatorandExperimentCreatorcomponents #606: required fields are marked in the Experiment and Score Set formsBug Fixes
Maintenance