44from typing import Generic , TypeVar
55
66from ga4gh .core .models import iriReference
7- from ga4gh .va_spec .base import CohortAlleleFrequencyStudyResult , StudyGroup
8- from pydantic import ValidationError
7+ from ga4gh .va_spec .base import StudyGroup
98
109from anyvlm .storage import orm
11- from anyvlm .utils .types import AncillaryResults , QualityMeasures
10+ from anyvlm .utils .types import (
11+ AncillaryResults ,
12+ AnyVlmCohortAlleleFrequencyResult ,
13+ QualityMeasures ,
14+ )
1215
13- V = TypeVar ("V" ) # VA-Spec entity type
16+ V = TypeVar ("V" ) # VA-Spec compliant entity type
1417D = TypeVar ("D" ) # DB entity type
1518
1619
@@ -19,73 +22,77 @@ class BaseMapper(Generic[V, D], ABC):
1922
2023 @abstractmethod
2124 def from_db_entity (self , db_entity : D ) -> V :
22- """Convert DB entity to VA-Spec model."""
25+ """Convert DB entity to VA-Spec compliant model."""
2326
2427 @abstractmethod
2528 def to_db_entity (self , va_model : V ) -> D :
26- """Convert VA-Spec model to DB entity."""
29+ """Convert VA-Spec compliant model to DB entity."""
2730
2831
2932class AlleleFrequencyMapper (
30- BaseMapper [CohortAlleleFrequencyStudyResult , orm .AlleleFrequencyData ]
33+ BaseMapper [AnyVlmCohortAlleleFrequencyResult , orm .AlleleFrequencyData ]
3134):
3235 """Maps between Allele Frequency Entities"""
3336
3437 def from_db_entity (
3538 self , db_entity : orm .AlleleFrequencyData
36- ) -> CohortAlleleFrequencyStudyResult :
39+ ) -> AnyVlmCohortAlleleFrequencyResult :
3740 """Convert DB Allele Frequency Data to VA-Spec Cohort Allele Frequency Study Result model
3841
3942 :param db_entity: An ORM Allele Frequency Data instance
40- :return: VA-Spec Cohort Allele Frequency Study Result instance. Will use
41- iriReference for focusAllele
43+ :return: VA-Spec compliant Cohort Allele Frequency Study Result instance. Will
44+ use iriReference for focusAllele
4245 """
4346 homozygotes = db_entity .ac_hom
4447 heterozygotes = db_entity .ac_het
4548 hemizygotes = db_entity .ac_hemi
46- ac = sum (x or 0 for x in (homozygotes , heterozygotes , hemizygotes ))
47- an = db_entity .an
4849
49- if filter_ := db_entity .filter :
50- quality_measures = QualityMeasures (qcFilters = filter_ ).model_dump ()
50+ if any (x is not None for x in (homozygotes , heterozygotes , hemizygotes )):
51+ ancillary_results = AncillaryResults (
52+ homozygotes = homozygotes ,
53+ heterozygotes = heterozygotes ,
54+ hemizygotes = hemizygotes ,
55+ )
5156 else :
52- quality_measures = None
57+ ancillary_results = None
5358
54- return CohortAlleleFrequencyStudyResult (
59+ ac = sum (x or 0 for x in (homozygotes , heterozygotes , hemizygotes ))
60+ an = db_entity .an
61+
62+ return AnyVlmCohortAlleleFrequencyResult (
5563 focusAllele = iriReference (db_entity .vrs_id ),
5664 focusAlleleCount = ac ,
5765 locusAlleleCount = an ,
5866 focusAlleleFrequency = round (ac / an , 9 ),
59- qualityMeasures = quality_measures ,
60- ancillaryResults = AncillaryResults (
61- homozygotes = homozygotes ,
62- heterozygotes = heterozygotes ,
63- hemizygotes = hemizygotes ,
64- ).model_dump (),
67+ qualityMeasures = QualityMeasures (qcFilters = db_entity .filter )
68+ if db_entity .filter
69+ else None ,
70+ ancillaryResults = ancillary_results ,
6571 cohort = StudyGroup (name = db_entity .cohort ), # type: ignore
6672 )
6773
6874 def to_db_entity (
69- self , va_model : CohortAlleleFrequencyStudyResult
75+ self , va_model : AnyVlmCohortAlleleFrequencyResult
7076 ) -> orm .AlleleFrequencyData :
71- """Convert VA-Spec Cohort Allele Frequency Study Result model to DB Allele Frequency Data
77+ """Convert VA-Spec compliant Cohort Allele Frequency Study Result model to DB
78+ Allele Frequency Data
7279
73- :param va_model: VA-Spec Cohort Allele Frequency Study Result instance
80+ :param va_model: VA-Spec compliant Cohort Allele Frequency Study Result instance
7481 :return: ORM Allele Frequency Data instance
75- :raises ValueError: if ancillaryResults or qualityMeasures are invalid
7682 """
77- try :
78- ancillary_results = AncillaryResults (** va_model .ancillaryResults or {})
79- except ValidationError as e :
80- raise ValueError ("Invalid ancillaryResults data" ) from e
83+ ancillary_results = va_model .ancillaryResults
84+ if ancillary_results :
85+ ac_het = ancillary_results .heterozygotes
86+ ac_hom = ancillary_results .homozygotes
87+ ac_hemi = ancillary_results .hemizygotes
88+ else :
89+ ac_het = None
90+ ac_hom = None
91+ ac_hemi = None
8192
82- try :
83- quality_measures = QualityMeasures (** va_model .qualityMeasures or {})
84- except ValidationError as e :
85- raise ValueError ("Invalid qualityMeasures data" ) from e
93+ quality_measures = va_model .qualityMeasures
8694
8795 focus_allele = va_model .focusAllele
88-
8996 if isinstance (focus_allele , iriReference ):
9097 vrs_id = focus_allele .root
9198 else :
@@ -95,9 +102,9 @@ def to_db_entity(
95102 vrs_id = vrs_id ,
96103 an = va_model .locusAlleleCount ,
97104 ac = va_model .focusAlleleCount ,
98- ac_het = ancillary_results . heterozygotes ,
99- ac_hom = ancillary_results . homozygotes ,
100- ac_hemi = ancillary_results . hemizygotes ,
101- filter = quality_measures .qcFilters ,
105+ ac_het = ac_het ,
106+ ac_hom = ac_hom ,
107+ ac_hemi = ac_hemi ,
108+ filter = quality_measures .qcFilters if quality_measures else None ,
102109 cohort = va_model .cohort .name ,
103110 )
0 commit comments