diff --git a/mavehgvs/variant.py b/mavehgvs/variant.py index 96f30ee..2dbebb2 100644 --- a/mavehgvs/variant.py +++ b/mavehgvs/variant.py @@ -2,12 +2,17 @@ import itertools from typing import Optional, Union, List, Tuple, Mapping, Any, Sequence, Dict, Generator +from fqfa.constants import AA_CODES + from mavehgvs.position import VariantPosition from mavehgvs.patterns.combined import any_variant from mavehgvs.exceptions import MaveHgvsParseError __all__ = ["Variant"] +AA_3_TO_1 = {value: key for key, value in AA_CODES.items()} +"""Dict[str, str]: for converting three-letter amino acid codes to single-letter codes. +""" class Variant: fullmatch = re.compile(any_variant, flags=re.ASCII).fullmatch @@ -178,7 +183,11 @@ def sort_key(x): if targetseq is not None: for vtype, pos, seq in self.variant_tuples(): if vtype == "sub": - self._target_validate_substitution(pos, seq[0], targetseq) + if self._prefix == "p": + ref = AA_3_TO_1[seq[0]] + else: + ref = seq[0] + self._target_validate_substitution(pos, ref, targetseq) elif vtype in ("ins", "del", "dup", "delins"): self._target_validate_indel(pos, targetseq) diff --git a/setup.py b/setup.py index fcd5ac6..0d1b8d8 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ setuptools.setup( name="mavehgvs", - version="0.2.0", + version="0.2.1", author="Daniel Esposito and Alan F Rubin", author_email="alan.rubin@wehi.edu.au", description=( diff --git a/tests/test_variant.py b/tests/test_variant.py index e2a01a9..d5ff68f 100644 --- a/tests/test_variant.py +++ b/tests/test_variant.py @@ -497,6 +497,30 @@ def test_invalid_dna_delins(self): with self.assertRaises(MaveHgvsParseError): Variant(s, targetseq=target) + def test_matching_protein_substitution(self): + variant_tuples = [ + ("RCQY", "p.Arg1Ala"), + ("RCQY", "p.Gln3Trp"), + ("RCQY", "p.[Arg1Ala;Gln3Trp]"), + ] + + for target, s in variant_tuples: + with self.subTest(target=target, s=s): + v = Variant(s, targetseq=target) + self.assertEqual(s, str(v)) + + def test_nonmatching_protein_substitution(self): + variant_tuples = [ + ("RCQY", "p.Cys1Ala"), + ("RCQY", "p.Ala3Trp"), + ("RCQY", "p.[Arg1Ala;Cys3Trp]"), + ] + + for target, s in variant_tuples: + with self.subTest(target=target, s=s): + with self.assertRaises(MaveHgvsParseError): + Variant(s, targetseq=target) + class TestMiscMethods(unittest.TestCase): def test_is_multi_variant(self):