Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/mavedb/lib/annotation/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
)
18 changes: 9 additions & 9 deletions src/mavedb/lib/annotation/contribution.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down Expand Up @@ -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",
)

Expand Down
14 changes: 7 additions & 7 deletions src/mavedb/lib/annotation/evidence_line.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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,
Expand All @@ -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),
],
Expand Down
11 changes: 6 additions & 5 deletions src/mavedb/lib/annotation/method.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down Expand Up @@ -86,22 +87,22 @@ 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 <https://datatracker.ietf.org/doc/html/rfc3986#section-4.1> 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.
"""
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,
)

Expand Down
2 changes: 1 addition & 1 deletion src/mavedb/scripts/load_calibration_csv.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
30 changes: 16 additions & 14 deletions src/mavedb/scripts/load_pp_style_calibration.py
Original file line number Diff line number Diff line change
@@ -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
Expand 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:

Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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)

Expand Down Expand Up @@ -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()
)

Expand Down Expand Up @@ -215,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),
Expand All @@ -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(
Expand Down
15 changes: 7 additions & 8 deletions tests/lib/annotation/test_agent.py
Original file line number Diff line number Diff line change
@@ -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


Expand Down Expand Up @@ -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"
14 changes: 7 additions & 7 deletions tests/lib/annotation/test_contribution.py
Original file line number Diff line number Diff line change
@@ -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,
)


Expand All @@ -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


Expand Down
25 changes: 13 additions & 12 deletions tests/lib/annotation/test_method.py
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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
Expand Down