Skip to content

Commit 2746d7b

Browse files
committed
Add handling for missing mapping data in score set annotated variants responses
1 parent 73c75c7 commit 2746d7b

File tree

3 files changed

+156
-9
lines changed

3 files changed

+156
-9
lines changed

src/mavedb/routers/score_sets.py

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from sqlalchemy.orm import Session
1616

1717
from mavedb import deps
18+
from mavedb.lib.annotation.exceptions import MappingDataDoesntExistException
1819
from mavedb.lib.annotation.annotate import (
1920
variant_pathogenicity_evidence,
2021
variant_functional_impact_statement,
@@ -519,9 +520,16 @@ def get_score_set_annotated_variants(
519520
detail=f"No mapped variants associated with score set URN {urn} were found. Could not construct evidence lines.",
520521
)
521522

522-
return {
523-
mapped_variant.variant.urn: variant_pathogenicity_evidence(mapped_variant) for mapped_variant in mapped_variants
524-
}
523+
variant_evidence: dict[str, Optional[VariantPathogenicityEvidenceLine]] = {}
524+
for mv in mapped_variants:
525+
# TODO#372: Non-nullable URNs
526+
try:
527+
variant_evidence[mv.variant.urn] = variant_pathogenicity_evidence(mv) # type: ignore
528+
except MappingDataDoesntExistException:
529+
logger.debug(msg=f"Mapping data does not exist for variant {mv.variant.urn}.", extra=logging_context())
530+
variant_evidence[mv.variant.urn] = None # type: ignore
531+
532+
return variant_evidence
525533

526534

527535
@router.get(
@@ -569,10 +577,16 @@ def get_score_set_annotated_variants_functional_statement(
569577
detail=f"No mapped variants associated with score set URN {urn} were found. Could not construct functional impact statements.",
570578
)
571579

572-
return {
573-
mapped_variant.variant.urn: variant_functional_impact_statement(mapped_variant)
574-
for mapped_variant in mapped_variants
575-
}
580+
variant_impact_statements: dict[str, Optional[Statement]] = {}
581+
for mv in mapped_variants:
582+
# TODO#372: Non-nullable URNs
583+
try:
584+
variant_impact_statements[mv.variant.urn] = variant_functional_impact_statement(mv) # type: ignore
585+
except MappingDataDoesntExistException:
586+
logger.debug(msg=f"Mapping data does not exist for variant {mv.variant.urn}.", extra=logging_context())
587+
variant_impact_statements[mv.variant.urn] = None # type: ignore
588+
589+
return variant_impact_statements
576590

577591

578592
@router.get(
@@ -620,7 +634,16 @@ def get_score_set_annotated_variants_functional_study_result(
620634
detail=f"No mapped variants associated with score set URN {urn} were found. Could not construct study results.",
621635
)
622636

623-
return {mapped_variant.variant.urn: variant_study_result(mapped_variant) for mapped_variant in mapped_variants}
637+
variant_study_results: dict[str, Optional[ExperimentalVariantFunctionalImpactStudyResult]] = {}
638+
for mv in mapped_variants:
639+
# TODO#372: Non-nullable URNs
640+
try:
641+
variant_study_results[mv.variant.urn] = variant_study_result(mv) # type: ignore
642+
except MappingDataDoesntExistException:
643+
logger.debug(msg=f"Mapping data does not exist for variant {mv.variant.urn}.", extra=logging_context())
644+
variant_study_results[mv.variant.urn] = None # type: ignore
645+
646+
return variant_study_results
624647

625648

626649
@router.post(

tests/helpers/util/variant.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,15 @@ def create_mapped_variants_for_score_set(db, score_set_urn, mapped_variant: dict
100100
score_set.mapping_state = MappingState.complete
101101
db.commit()
102102
return
103+
104+
105+
def clear_first_mapped_variant_post_mapped(session, score_set_urn):
106+
db_score_set = session.query(ScoreSet).filter(ScoreSet.urn == score_set_urn).one()
107+
variants = db_score_set.variants
108+
109+
if variants:
110+
first_var = variants[0]
111+
first_var.mapped_variants[0].post_mapped = None
112+
session.commit()
113+
114+
return first_var

tests/routers/test_score_set.py

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,11 @@
6969
create_seq_score_set_with_variants,
7070
)
7171
from tests.helpers.util.user import change_ownership
72-
from tests.helpers.util.variant import create_mapped_variants_for_score_set, mock_worker_variant_insertion
72+
from tests.helpers.util.variant import (
73+
create_mapped_variants_for_score_set,
74+
mock_worker_variant_insertion,
75+
clear_first_mapped_variant_post_mapped,
76+
)
7377

7478

7579
########################################################################################################################
@@ -2839,6 +2843,42 @@ def test_nonetype_annotated_pathogenicity_evidence_lines_for_score_set_when_thre
28392843
assert annotated_variant is None
28402844

28412845

2846+
@pytest.mark.parametrize(
2847+
"mock_publication_fetch",
2848+
[({"dbName": "PubMed", "identifier": f"{TEST_PUBMED_IDENTIFIER}"})],
2849+
indirect=["mock_publication_fetch"],
2850+
)
2851+
def test_get_annotated_pathogenicity_evidence_lines_for_score_set_when_some_variants_were_not_mapped(
2852+
client, session, data_provider, data_files, setup_router_db, admin_app_overrides, mock_publication_fetch
2853+
):
2854+
experiment = create_experiment(client)
2855+
score_set = create_seq_score_set_with_mapped_variants(
2856+
client,
2857+
session,
2858+
data_provider,
2859+
experiment["urn"],
2860+
data_files / "scores.csv",
2861+
update={
2862+
"secondaryPublicationIdentifiers": [{"dbName": "PubMed", "identifier": f"{TEST_PUBMED_IDENTIFIER}"}],
2863+
"scoreRanges": camelize(TEST_SCORE_SET_RANGES_ONLY_PILLAR_PROJECT),
2864+
},
2865+
)
2866+
2867+
first_var = clear_first_mapped_variant_post_mapped(session, score_set["urn"])
2868+
2869+
response = client.get(f"/api/v1/score-sets/{score_set['urn']}/annotated-variants/pathogenicity-evidence-line")
2870+
response_data = response.json()
2871+
2872+
assert response.status_code == 200
2873+
assert len(response_data) == score_set["numVariants"]
2874+
2875+
for annotated_variant_urn, annotated_variant in response_data.items():
2876+
if annotated_variant_urn == first_var.urn:
2877+
assert annotated_variant is None
2878+
else:
2879+
assert f"Pathogenicity evidence line {annotated_variant_urn}" in annotated_variant.get("description")
2880+
2881+
28422882
@pytest.mark.parametrize(
28432883
"mock_publication_fetch",
28442884
[({"dbName": "PubMed", "identifier": f"{TEST_PUBMED_IDENTIFIER}"})],
@@ -2954,6 +2994,42 @@ def test_nonetype_annotated_functional_impact_statement_for_score_set_when_thres
29542994
assert annotated_variant is None
29552995

29562996

2997+
@pytest.mark.parametrize(
2998+
"mock_publication_fetch",
2999+
[({"dbName": "PubMed", "identifier": f"{TEST_PUBMED_IDENTIFIER}"})],
3000+
indirect=["mock_publication_fetch"],
3001+
)
3002+
def test_get_annotated_functional_impact_statement_for_score_set_when_some_variants_were_not_mapped(
3003+
client, session, data_provider, data_files, setup_router_db, admin_app_overrides, mock_publication_fetch
3004+
):
3005+
experiment = create_experiment(client)
3006+
score_set = create_seq_score_set_with_mapped_variants(
3007+
client,
3008+
session,
3009+
data_provider,
3010+
experiment["urn"],
3011+
data_files / "scores.csv",
3012+
update={
3013+
"secondaryPublicationIdentifiers": [{"dbName": "PubMed", "identifier": f"{TEST_PUBMED_IDENTIFIER}"}],
3014+
"scoreRanges": camelize(TEST_SCORE_SET_RANGES_ALL_SCHEMAS_PRESENT),
3015+
},
3016+
)
3017+
3018+
first_var = clear_first_mapped_variant_post_mapped(session, score_set["urn"])
3019+
3020+
response = client.get(f"/api/v1/score-sets/{score_set['urn']}/annotated-variants/functional-impact-statement")
3021+
response_data = response.json()
3022+
3023+
assert response.status_code == 200
3024+
assert len(response_data) == score_set["numVariants"]
3025+
3026+
for annotated_variant_urn, annotated_variant in response_data.items():
3027+
if annotated_variant_urn == first_var.urn:
3028+
assert annotated_variant is None
3029+
else:
3030+
assert annotated_variant.get("type") == "Statement"
3031+
3032+
29573033
@pytest.mark.parametrize(
29583034
"mock_publication_fetch",
29593035
[({"dbName": "PubMed", "identifier": f"{TEST_PUBMED_IDENTIFIER}"})],
@@ -3069,6 +3145,42 @@ def test_annotated_functional_study_result_exists_for_score_set_when_thresholds_
30693145
assert annotated_variant.get("type") == "ExperimentalVariantFunctionalImpactStudyResult"
30703146

30713147

3148+
@pytest.mark.parametrize(
3149+
"mock_publication_fetch",
3150+
[({"dbName": "PubMed", "identifier": f"{TEST_PUBMED_IDENTIFIER}"})],
3151+
indirect=["mock_publication_fetch"],
3152+
)
3153+
def test_annotated_functional_study_result_exists_for_score_set_when_some_variants_were_not_mapped(
3154+
client, session, data_provider, data_files, setup_router_db, admin_app_overrides, mock_publication_fetch
3155+
):
3156+
experiment = create_experiment(client)
3157+
score_set = create_seq_score_set_with_mapped_variants(
3158+
client,
3159+
session,
3160+
data_provider,
3161+
experiment["urn"],
3162+
data_files / "scores.csv",
3163+
update={
3164+
"secondaryPublicationIdentifiers": [{"dbName": "PubMed", "identifier": f"{TEST_PUBMED_IDENTIFIER}"}],
3165+
"scoreRanges": camelize(TEST_SCORE_SET_RANGES_ONLY_PILLAR_PROJECT),
3166+
},
3167+
)
3168+
3169+
first_var = clear_first_mapped_variant_post_mapped(session, score_set["urn"])
3170+
3171+
response = client.get(f"/api/v1/score-sets/{score_set['urn']}/annotated-variants/functional-study-result")
3172+
response_data = response.json()
3173+
3174+
assert response.status_code == 200
3175+
assert len(response_data) == score_set["numVariants"]
3176+
3177+
for annotated_variant_urn, annotated_variant in response_data.items():
3178+
if annotated_variant_urn == first_var.urn:
3179+
assert annotated_variant is None
3180+
else:
3181+
assert annotated_variant.get("type") == "ExperimentalVariantFunctionalImpactStudyResult"
3182+
3183+
30723184
########################################################################################################################
30733185
# Fetching gnomad variants for a score set
30743186
########################################################################################################################

0 commit comments

Comments
 (0)