from __future__ import annotations
from dataclasses import dataclass
from enum import IntEnum, Enum
from typing import FrozenSet
[docs]
class AlleleMatchLevel(IntEnum):
"""
Following hla nomenclature:
NOT_ASSESSABLE (0):
Typing resolution insufficient
DRB345_SUBLOCUS_MISMATCH (-3):
DRB3/4/5 region mismatch:
- locus normalized to DRB345
- but underlying sub-loci differ (e.g. DRB3 vs DRB4/5 or DRBX)
ANTIGEN_MISMATCH (-2):
Mismatch at the group code encoding antigen
ALLELE_MISMATCH (-1):
Mismatch at the allele level encoding a specific allele
ARD_MATCH (1):
ARD level match
cf.https://hla.alleles.org/nomenclature/naming.html
"""
NOT_ASSESSABLE = 0
# Mismatch levels
DRB345_SUBLOCUS_MISMATCH = -3
ANTIGEN_MISMATCH = -2
ALLELE_MISMATCH = -1
# Separating mismatches from matches based on ARD
ARD_MATCH = 1
[docs]
class ARDMatchLevel(IntEnum):
"""
ARD refinement iff AlleleMatchLevel == ARD_MATCH.
G_GROUP_MATCH (2):
ARD exons identical at nucleotide level (G group)
P_GROUP_MATCH (1):
ARD exons identical at amino-acid level (P group)
NOT_APPLICABLE:
AlleleMatchLevel != ARD_MATCH
"""
G_GROUP_MATCH = 2
P_GROUP_MATCH = 1
NOT_APPLICABLE = 0
[docs]
class ARDMatchLevelCertainty(Enum):
"""
Certainty of ARD-match level.
NOT_APPLICABLE:
AlleleMatchLevel != ARD_MATCH
UNCERTAIN:
insufficient typing resolution to be sure about ARDMatchLevel
i.e., a *higher* ARDMatchLevel **is possible**
CERTAIN:
sufficient typing resolution to be sure about ARDMatchLevel
i.e., a *higher* ARDMatchLevel **is not possible**
"""
NOT_APPLICABLE = "not applicable for AlleleMatchLevel != ARD_MATCH"
UNCERTAIN = "uncertain about ARDMatchLevel due to insufficient resolution"
CERTAIN = "certain about ARDMatchLevel due to sufficient resolution"
[docs]
class MolecularMatchLevel(IntEnum):
"""
Molecular (sequence-level) refinement iff AlleleMatchLevel == ARD_MATCH.
EXACT_ALLELE_MATCH (5):
1-4 fields identical
CODING_SEQUENCE_MATCH (4):
1-3 fields identical, different or untyped 4th field
FULL_PROTEIN_MATCH (3):
1-2 fields identical, different or untyped 3rd field
ARD_MATCH_ONLY (2):
2-field difference but ARD equivalent
NOT_ASSESSABLE (1):
Typing resolution insufficient to assess molecular match level
NOT_APPLICABLE (0):
AlleleMatchLevel != ARD_MATCH
"""
EXACT_ALLELE_MATCH = 5
CODING_SEQUENCE_MATCH = 4
FULL_PROTEIN_MATCH = 3
ARD_MATCH_ONLY = 2
NOT_ASSESSABLE = 1
NOT_APPLICABLE = 0
[docs]
class MolecularMatchLevelCertainty(Enum):
"""
Certainty of molecular level.
NOT_APPLICABLE:
AlleleMatchLevel != ARD_MATCH
UNCERTAIN:
insufficient typing resolution to be sure about MolecularMatchLevel
i.e., a *higher* MolecularMatchLevel **is possible**
CERTAIN:
sufficient typing resolution to be sure about MolecularMatchLevel
i.e., a *higher* MolecularMatchLevel **is not possible**
"""
NOT_APPLICABLE = "not applicable for AlleleMatchLevel != ARD_MATCH"
UNCERTAIN = "uncertain about MolecularMatchLevel due to insufficient " \
"resolution"
CERTAIN = "certain about MolecularMatchLevel due to sufficient resolution"
[docs]
class ExpressionSuffixMatchLevel(Enum):
"""
Policy decisions about how to treat expression suffixes in matching.
Similar to cf AlleleMatchLevel in hla.py, but for expression suffixes.
"""
NOT_ASSESSABLE = "not_assessable"
ALLELE_MISMATCH = "allele_mismatch"
ANTIGEN_MISMATCH = "antigen_mismatch"
ARD_MATCH = "ard_match"
IGNORE = "ignore"
[docs]
@dataclass(frozen=True)
class ExpressionSuffixPolicy:
# N null; L low; S secreted; C cytoplasmic; A aberrant; Q questionable
risk_suffixes: FrozenSet[str] = frozenset({"N", "L", "S", "C", "A"})
ambiguous_suffixes: FrozenSet[str] = frozenset({"Q"})
# Defaults
equal_risk: ExpressionSuffixMatchLevel = \
ExpressionSuffixMatchLevel.NOT_ASSESSABLE
risk_vs_none: ExpressionSuffixMatchLevel = \
ExpressionSuffixMatchLevel.ALLELE_MISMATCH
risk_vs_different_risk: ExpressionSuffixMatchLevel = \
ExpressionSuffixMatchLevel.ALLELE_MISMATCH
q_present: ExpressionSuffixMatchLevel = \
ExpressionSuffixMatchLevel.NOT_ASSESSABLE