From a57c62a3330375af2401b50e5ff8b505cae231a0 Mon Sep 17 00:00:00 2001 From: Benjamin Capodanno Date: Fri, 30 Jan 2026 15:03:50 -0800 Subject: [PATCH 1/2] chore: rename Zeiberg calibrations to ExCALIBR across the codebase --- src/mavedb/lib/annotation/agent.py | 8 +++--- src/mavedb/lib/annotation/contribution.py | 18 ++++++------- src/mavedb/lib/annotation/evidence_line.py | 14 +++++------ src/mavedb/lib/annotation/method.py | 11 ++++---- .../scripts/load_pp_style_calibration.py | 24 ++++++++++-------- tests/lib/annotation/test_agent.py | 15 ++++++----- tests/lib/annotation/test_contribution.py | 14 +++++------ tests/lib/annotation/test_method.py | 25 ++++++++++--------- 8 files changed, 66 insertions(+), 63 deletions(-) diff --git a/src/mavedb/lib/annotation/agent.py b/src/mavedb/lib/annotation/agent.py index c048255f..8d05fdea 100644 --- a/src/mavedb/lib/annotation/agent.py +++ b/src/mavedb/lib/annotation/agent.py @@ -58,14 +58,14 @@ def mavedb_user_agent(user: User) -> Agent: # XXX: Ideally, this becomes versioned software. -def zeiberg_calibration_agent() -> Agent: +def excalibr_calibration_agent() -> Agent: """ Create a [VA Agent](https://va-ga4gh.readthedocs.io/en/latest/core-information-model/entities/agent.html) - object for the Zeiberg calibration software. + object for the ExCALIBR calibration software. """ return Agent( - name="Zeiberg Variant Calibrator", + name="ExCALIBR Variant Calibrator", agentType="Software", # XXX - version? - description="Zeiberg variant calibrator, see https://github.com/Dzeiberg/mave_calibration", + description="ExCALIBR variant calibrator, see https://github.com/Dzeiberg/mave_calibration", ) diff --git a/src/mavedb/lib/annotation/contribution.py b/src/mavedb/lib/annotation/contribution.py index dbc75dc6..87482cc4 100644 --- a/src/mavedb/lib/annotation/contribution.py +++ b/src/mavedb/lib/annotation/contribution.py @@ -4,15 +4,15 @@ from ga4gh.core.models import Extension from ga4gh.va_spec.base.core import Contribution -from mavedb.models.mapped_variant import MappedVariant -from mavedb.models.user import User from mavedb.lib.annotation.agent import ( + excalibr_calibration_agent, mavedb_api_agent, - mavedb_vrs_agent, mavedb_user_agent, - zeiberg_calibration_agent, + mavedb_vrs_agent, ) from mavedb.lib.types.annotation import ResourceWithCreationModificationDates +from mavedb.models.mapped_variant import MappedVariant +from mavedb.models.user import User logger = logging.getLogger(__name__) @@ -46,15 +46,15 @@ def mavedb_vrs_contribution(mapped_variant: MappedVariant) -> Contribution: ) -def zeiberg_calibration_contribution() -> Contribution: +def excalibr_calibration_contribution() -> Contribution: """ Create a [VA Contribution](https://va-ga4gh.readthedocs.io/en/latest/core-information-model/entities/activities/contribution.html#contribution) - object for a sofware agent which performs calibrations on an arbitrary data set. + object for a software agent which performs calibrations on an arbitrary data set. """ return Contribution( - name="Zeiberg Calibration", - description="Contribution from the Zeiberg Calibration software", - contributor=zeiberg_calibration_agent(), + name="ExCALIBR Calibration", + description="Contribution from the ExCALIBR Calibration software", + contributor=excalibr_calibration_agent(), activityType="variant specific calibration software", ) diff --git a/src/mavedb/lib/annotation/evidence_line.py b/src/mavedb/lib/annotation/evidence_line.py index dd33f153..e091c983 100644 --- a/src/mavedb/lib/annotation/evidence_line.py +++ b/src/mavedb/lib/annotation/evidence_line.py @@ -1,28 +1,28 @@ from typing import Optional, Union from ga4gh.core.models import Coding, MappableConcept, iriReference -from ga4gh.va_spec.base.enums import StrengthOfEvidenceProvided from ga4gh.va_spec.acmg_2015 import VariantPathogenicityEvidenceLine from ga4gh.va_spec.base.core import ( Direction, EvidenceLine, - StudyResult, EvidenceLineType, StatementType, + StudyResult, VariantPathogenicityProposition, ) +from ga4gh.va_spec.base.enums import StrengthOfEvidenceProvided from mavedb.lib.annotation.classification import pathogenicity_classification_of_variant from mavedb.lib.annotation.contribution import ( + excalibr_calibration_contribution, mavedb_api_contribution, - mavedb_vrs_contribution, - zeiberg_calibration_contribution, mavedb_creator_contribution, mavedb_modifier_contribution, + mavedb_vrs_contribution, ) from mavedb.lib.annotation.document import score_set_to_document from mavedb.lib.annotation.method import ( - zeiberg_calibration_method, + excalibr_calibration_method, publication_identifiers_to_method, ) from mavedb.models.mapped_variant import MappedVariant @@ -59,7 +59,7 @@ def acmg_evidence_line( return VariantPathogenicityEvidenceLine( description=f"Pathogenicity evidence line {mapped_variant.variant.urn}.", - specifiedBy=zeiberg_calibration_method(evidence_outcome), + specifiedBy=excalibr_calibration_method(evidence_outcome), evidenceOutcome={ "primaryCoding": Coding( code=evidence_outcome_code, @@ -72,7 +72,7 @@ def acmg_evidence_line( contributions=[ mavedb_api_contribution(), mavedb_vrs_contribution(mapped_variant), - zeiberg_calibration_contribution(), + excalibr_calibration_contribution(), mavedb_creator_contribution(mapped_variant.variant, mapped_variant.variant.score_set.created_by), mavedb_modifier_contribution(mapped_variant.variant, mapped_variant.variant.score_set.modified_by), ], diff --git a/src/mavedb/lib/annotation/method.py b/src/mavedb/lib/annotation/method.py index af1348fa..ec9094fd 100644 --- a/src/mavedb/lib/annotation/method.py +++ b/src/mavedb/lib/annotation/method.py @@ -2,10 +2,11 @@ from typing import Optional from ga4gh.va_spec.acmg_2015 import VariantPathogenicityEvidenceLine -from ga4gh.va_spec.base.core import Method, iriReference as IRI +from ga4gh.va_spec.base.core import Method +from ga4gh.va_spec.base.core import iriReference as IRI -from mavedb.models.publication_identifier import PublicationIdentifier from mavedb.lib.types.annotation import PublicationIdentifierAssociations +from mavedb.models.publication_identifier import PublicationIdentifier logger = logging.getLogger(__name__) @@ -86,7 +87,7 @@ def mavedb_vrs_as_method() -> Method: return Method(name="Software version", reportedIn=mavedb_vrs_releases_as_iri()) -def zeiberg_calibrations_as_iri() -> IRI: +def excalibr_calibrations_as_iri() -> IRI: """ Create an IRI as described in for the software used to generate pillar project calibrations. Within the context of VA-Spec, this IRI can be used interchangeably with an equivalent method object for brevity. @@ -94,14 +95,14 @@ def zeiberg_calibrations_as_iri() -> IRI: return IRI("https://github.com/Dzeiberg/mave_calibration") -def zeiberg_calibration_method(method: Optional[VariantPathogenicityEvidenceLine.Criterion]) -> Method: +def excalibr_calibration_method(method: Optional[VariantPathogenicityEvidenceLine.Criterion]) -> Method: """ Generate a [VA Method](https://va-ga4gh.readthedocs.io/en/latest/core-information-model/entities/information-entities/method.html#method) object for the pillar project calibration software distribution. """ return Method( name="Software version", - reportedIn=zeiberg_calibrations_as_iri(), + reportedIn=excalibr_calibrations_as_iri(), methodType=method.value if method else None, ) diff --git a/src/mavedb/scripts/load_pp_style_calibration.py b/src/mavedb/scripts/load_pp_style_calibration.py index 5bcf6e46..11dc91f4 100644 --- a/src/mavedb/scripts/load_pp_style_calibration.py +++ b/src/mavedb/scripts/load_pp_style_calibration.py @@ -1,4 +1,4 @@ -"""Load an archive of Zeiberg calibration style calibrations into Score Sets. +"""Load an archive of ExCALIBR calibration style calibrations into Score Sets. This script processes JSON calibration files from an archive directory and applies them to MaveDB Score Sets based on a dataset mapping file. The script iterates through all @@ -9,7 +9,7 @@ Args: archive_path (str): Path to directory containing calibration JSON files dataset_map (str): Path to JSON file mapping dataset names to Score Set URNs - overwrite (bool): Whether to overwrite existing "Zeiberg calibration" entries + overwrite (bool): Whether to overwrite existing "ExCALIBR calibration" entries Input File Formats: @@ -56,8 +56,8 @@ - Strength labels: Supporting (±1), Moderate (±2), Moderate+ (±3), Strong (±4-8) 6. File Variants: Automatically detects and processes both regular and ClinVar 2018 variants 7. Calibration Naming: - - Regular files: "Zeiberg calibration" - - ClinVar 2018 files: "Zeiberg calibration (ClinVar 2018)" + - Regular files: "ExCALIBR calibration" + - ClinVar 2018 files: "ExCALIBR calibration (ClinVar 2018)" Skipping Behavior: - Files with no mapping entry or empty/invalid URNs (N/A, #VALUE!, empty string) @@ -103,16 +103,16 @@ } ALL_POINT_LABEL_MAPPINGS = {**POINT_LABEL_MAPPINGS, **{k * -1: v for k, v in POINT_LABEL_MAPPINGS.items()}} -ZEIBERG_CALIBRATION_CITATION = {"identifier": "2025.04.29.651326", "db_name": "bioRxiv"} +EXCALIBR_CALIBRATION_CITATION = {"identifier": "2025.04.29.651326", "db_name": "bioRxiv"} @click.command() @with_database_session @click.argument("archive_path", type=click.Path(exists=True, file_okay=False)) @click.argument("dataset_map", type=click.Path(exists=True, dir_okay=False)) -@click.option("--overwrite", is_flag=True, default=False, help="Overwrite existing `Zeiberg calibration` in score set") +@click.option("--overwrite", is_flag=True, default=False, help="Overwrite existing `ExCALIBR calibration` in score set") def main(db: Session, archive_path: str, dataset_map: str, overwrite: bool) -> None: - """Load an archive of Zeiberg calibration style calibrations into Score Sets""" + """Load an archive of ExCALIBR calibration style calibrations into Score Sets""" with open(dataset_map, "r") as f: dataset_mapping: Dict[str, str] = json.load(f) @@ -165,16 +165,18 @@ def main(db: Session, archive_path: str, dataset_map: str, overwrite: bool) -> N # Determine calibration name based on file name if "_clinvar_2018" in json_file: - calibration_name = "Zeiberg calibration (ClinVar 2018)" + calibration_name = "ExCALIBR calibration (ClinVar 2018)" + legacy_name = "Zeiberg calibration (ClinVar 2018)" # --- IGNORE --- else: - calibration_name = "Zeiberg calibration" + calibration_name = "ExCALIBR calibration" + legacy_name = "Zeiberg calibration" # --- IGNORE --- existing_calibration = None if overwrite: existing_calibration = ( db.query(ScoreCalibration) .filter(ScoreCalibration.score_set_id == score_set.id) - .filter(ScoreCalibration.title == calibration_name) + .filter(ScoreCalibration.title.in_([calibration_name, legacy_name])) .one_or_none() ) @@ -233,9 +235,9 @@ def main(db: Session, archive_path: str, dataset_map: str, overwrite: bool) -> N research_use_only=True, score_set_urn=score_set.urn, calibration_metadata={"prior_probability_pathogenicity": calibration_data.get("prior", None)}, - method_sources=[ZEIBERG_CALIBRATION_CITATION], threshold_sources=[], classification_sources=[], + method_sources=[EXCALIBR_CALIBRATION_CITATION], ) new_calibration_object = asyncio.run( diff --git a/tests/lib/annotation/test_agent.py b/tests/lib/annotation/test_agent.py index 69d33546..f610eeaf 100644 --- a/tests/lib/annotation/test_agent.py +++ b/tests/lib/annotation/test_agent.py @@ -1,14 +1,13 @@ from unittest import mock from mavedb import __version__ -from mavedb.models.user import User from mavedb.lib.annotation.agent import ( + excalibr_calibration_agent, mavedb_api_agent, - mavedb_vrs_agent, mavedb_user_agent, - zeiberg_calibration_agent, + mavedb_vrs_agent, ) - +from mavedb.models.user import User from tests.helpers.constants import TEST_USER @@ -45,9 +44,9 @@ def test_mavedb_user_agent(): assert agent.agentType == "Person" -def test_zeiberg_calibration_agent(): - agent = zeiberg_calibration_agent() +def test_excalibr_calibration_agent(): + agent = excalibr_calibration_agent() - assert agent.name == "Zeiberg Variant Calibrator" - assert agent.description == "Zeiberg variant calibrator, see https://github.com/Dzeiberg/mave_calibration" + assert agent.name == "ExCALIBR Variant Calibrator" + assert agent.description == "ExCALIBR variant calibrator, see https://github.com/Dzeiberg/mave_calibration" assert agent.agentType == "Software" diff --git a/tests/lib/annotation/test_contribution.py b/tests/lib/annotation/test_contribution.py index fe52bc17..034cb881 100644 --- a/tests/lib/annotation/test_contribution.py +++ b/tests/lib/annotation/test_contribution.py @@ -1,14 +1,14 @@ from datetime import datetime -import pytest +import pytest from ga4gh.va_spec.base import Contribution from mavedb.lib.annotation.contribution import ( + excalibr_calibration_contribution, mavedb_api_contribution, - mavedb_vrs_contribution, - zeiberg_calibration_contribution, mavedb_creator_contribution, mavedb_modifier_contribution, + mavedb_vrs_contribution, ) @@ -32,12 +32,12 @@ def test_mavedb_vrs_contribution(mock_mapped_variant): assert contribution.date.strftime("%Y-%m-%d") == mock_mapped_variant.mapped_date.strftime("%Y-%m-%d") -def test_zeiberg_calibration_contribution(): - contribution = zeiberg_calibration_contribution() +def test_excalibr_calibration_contribution(): + contribution = excalibr_calibration_contribution() assert isinstance(contribution, Contribution) assert contribution.activityType == "variant specific calibration software" - assert contribution.name == "Zeiberg Calibration" - assert contribution.description == "Contribution from the Zeiberg Calibration software" + assert contribution.name == "ExCALIBR Calibration" + assert contribution.description == "Contribution from the ExCALIBR Calibration software" assert contribution.contributor is not None diff --git a/tests/lib/annotation/test_method.py b/tests/lib/annotation/test_method.py index a7398f48..5fb83dc6 100644 --- a/tests/lib/annotation/test_method.py +++ b/tests/lib/annotation/test_method.py @@ -1,21 +1,22 @@ from unittest.mock import Mock -from ga4gh.va_spec.acmg_2015 import VariantPathogenicityEvidenceLine + import pytest +from ga4gh.va_spec.acmg_2015 import VariantPathogenicityEvidenceLine -from mavedb.models.score_set_publication_identifier import ScoreSetPublicationIdentifierAssociation from mavedb.lib.annotation.method import ( + excalibr_calibration_method, + excalibr_calibrations_as_iri, + mavedb_api_as_method, + mavedb_api_releases_as_iri, + mavedb_vrs_as_method, + mavedb_vrs_releases_as_iri, publication_as_iri, publication_identifier_to_method, publication_identifiers_to_method, - mavedb_api_releases_as_iri, - mavedb_api_as_method, - mavedb_vrs_releases_as_iri, - mavedb_vrs_as_method, - zeiberg_calibrations_as_iri, - zeiberg_calibration_method, variant_interpretation_functional_guideline_as_iri, variant_interpretation_functional_guideline_method, ) +from mavedb.models.score_set_publication_identifier import ScoreSetPublicationIdentifierAssociation MAVEDB_API_RELEASES_URL = "https://github.com/VariantEffect/mavedb-api/releases" MAVEDB_MAPPER_RELEASES_URL = "https://github.com/VariantEffect/dcd_mapping2/releases" @@ -93,15 +94,15 @@ def test_mavedb_vrs_as_method(): assert method.reportedIn.root == MAVEDB_MAPPER_RELEASES_URL -def test_zeiberg_calibrations_as_iri(): - assert zeiberg_calibrations_as_iri().root == MAVEDB_CALIBRATION_URL +def test_excalibr_calibrations_as_iri(): + assert excalibr_calibrations_as_iri().root == MAVEDB_CALIBRATION_URL @pytest.mark.parametrize( "evidence_outcome", [VariantPathogenicityEvidenceLine.Criterion.BS3, VariantPathogenicityEvidenceLine.Criterion.PS3] ) -def test_zeiberg_calibration_method(evidence_outcome): - method = zeiberg_calibration_method(evidence_outcome) +def test_excalibr_calibration_method(evidence_outcome): + method = excalibr_calibration_method(evidence_outcome) assert method.name == "Software version" assert method.reportedIn.root == MAVEDB_CALIBRATION_URL assert method.methodType == evidence_outcome.value From a3b31b7e0cf574477834022743112d70d238201c Mon Sep 17 00:00:00 2001 From: Benjamin Capodanno Date: Thu, 5 Feb 2026 09:55:40 -0800 Subject: [PATCH 2/2] fix: correct functional classification naming in calibration scripts --- src/mavedb/scripts/load_calibration_csv.py | 2 +- src/mavedb/scripts/load_pp_style_calibration.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mavedb/scripts/load_calibration_csv.py b/src/mavedb/scripts/load_calibration_csv.py index 904f51e9..6afc26cc 100644 --- a/src/mavedb/scripts/load_calibration_csv.py +++ b/src/mavedb/scripts/load_calibration_csv.py @@ -275,7 +275,7 @@ def build_ranges(row: Dict[str, str], infer_strengths: bool = True) -> Tuple[Lis ranges.append( FunctionalClassificationCreate( label=label, - classification=classification, + functional_classification=classification, range=(lower, upper), inclusive_lower_bound=incl_lower if lower is not None else False, inclusive_upper_bound=incl_upper if upper is not None else False, diff --git a/src/mavedb/scripts/load_pp_style_calibration.py b/src/mavedb/scripts/load_pp_style_calibration.py index 11dc91f4..d7b5e70d 100644 --- a/src/mavedb/scripts/load_pp_style_calibration.py +++ b/src/mavedb/scripts/load_pp_style_calibration.py @@ -84,7 +84,7 @@ from sqlalchemy.orm import Session from mavedb.lib.score_calibrations import create_score_calibration_in_score_set -from mavedb.models.enums.functional_classification import FunctionalClassification as FunctionalClassifcationOptions +from mavedb.models.enums.functional_classification import FunctionalClassification as FunctionalClassificationOptions from mavedb.models.score_calibration import ScoreCalibration from mavedb.models.score_set import ScoreSet from mavedb.models.user import User @@ -217,9 +217,9 @@ def main(db: Session, archive_path: str, dataset_map: str, overwrite: bool) -> N functional_range = score_calibration.FunctionalClassificationCreate( label=f"{ps_or_bs} {strength_label} ({points})", - classification=FunctionalClassifcationOptions.abnormal + functional_classification=FunctionalClassificationOptions.abnormal if points > 0 - else FunctionalClassifcationOptions.normal, + else FunctionalClassificationOptions.normal, range=range_data, acmg_classification=acmg_classification.ACMGClassificationCreate( points=int(points),