diff --git a/VariantValidator/modules/gapped_mapping.py b/VariantValidator/modules/gapped_mapping.py index e0d4beca..6324bc8a 100644 --- a/VariantValidator/modules/gapped_mapping.py +++ b/VariantValidator/modules/gapped_mapping.py @@ -2335,7 +2335,6 @@ def g_to_t_gap_compensation_version3(self, hgvs_alt_genomic, hgvs_coding, ori, a if (rtx.posedit.pos.start.offset == 0 and rtx.posedit.pos.end.offset == 0) and ( ftx.posedit.pos.start.offset != 0 and ftx.posedit.pos.end.offset != 0): exons = self.validator.hdp.get_tx_exons(ftx.ac, hgvs_not_delins.ac, - self.validator.alt_aln_method, alt_aln_method=self.validator.alt_aln_method) exonic = False for ex_test in exons: diff --git a/VariantValidator/modules/vvMixinConverters.py b/VariantValidator/modules/vvMixinConverters.py index f9ba5e70..d6d37347 100644 --- a/VariantValidator/modules/vvMixinConverters.py +++ b/VariantValidator/modules/vvMixinConverters.py @@ -1122,24 +1122,50 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn): if 'Length implied by coordinates must equal sequence deletion length' in str(ea1): # This will only happen if the variant is flanking the gap but is # not inside the gap - logger.info('Variant is on the flank of a genomic gap but not within the gap') - # Logic, normalize the c. variant and if a substitution (cannot normalize) then direct map # Currently believe that sub.n is the only variant type which fits. ins can normalize - # and may also be a dup! Added identity also + # and may also be a dup! Added identity also to non normalizing try: try: norm_stored_c = hn.normalize(stored_hgvs_c) except HGVSUnsupportedOperationError: norm_stored_c = stored_hgvs_c + if norm_stored_c.posedit.edit.type == 'sub' or \ norm_stored_c.posedit.edit.type == 'identity': - flank_hgvs_genomic = self.vm.t_to_g(norm_stored_c, genomic_gap_variant.ac, - alt_aln_method) + + flank_hgvs_genomic = self.vm.t_to_g(stored_hgvs_c, genomic_gap_variant.ac, + alt_aln_method) + init_flank_hgvs_genomic = copy.copy(flank_hgvs_genomic) + + # Handle genomic opening gap (extra bases in transcript) + # Refer to test_inputs.py test_1 and test_2 + if (len(flank_hgvs_genomic.posedit.edit.ref) + < len(stored_hgvs_c.posedit.edit.ref) + and + len(stored_hgvs_c.posedit.edit.ref) == + len(genomic_gap_variant.posedit.edit.ref)-2 + and + len(genomic_gap_variant.posedit.edit.ref) == + len(genomic_gap_variant.posedit.edit.alt)): + n_flank_hgvs_genimic = hn.normalize(init_flank_hgvs_genomic) + if str(n_flank_hgvs_genimic) == str(init_flank_hgvs_genomic): + return self.vm.t_to_g(norm_stored_c, genomic_gap_variant.ac, alt_aln_method) + else: + return hn.normalize(init_flank_hgvs_genomic) + else: + flank_hgvs_genomic = self.vm.t_to_g(norm_stored_c, genomic_gap_variant.ac, + alt_aln_method) self.vr.validate(flank_hgvs_genomic) - # Gap in the transcript - if (flank_hgvs_genomic.posedit.edit.type == 'sub' and + # Gap in the transcript e.g. NR2E3 tests + if (len(init_flank_hgvs_genomic.posedit.edit.ref) + > len(stored_hgvs_c.posedit.edit.ref) + and + len(stored_hgvs_c.posedit.edit.ref) == + len(genomic_gap_variant.posedit.edit.ref) - 2): + return hn.normalize(init_flank_hgvs_genomic) + elif (flank_hgvs_genomic.posedit.edit.type == 'sub' and norm_stored_c.posedit.edit.type == 'sub' and stored_hgvs_c.posedit.edit.type == 'sub' and # sub is a single base change @@ -1147,8 +1173,6 @@ def myvm_t_to_g(self, hgvs_c, alt_chr, no_norm_evm, hn): genomic_gap_variant.posedit.pos.end.base - genomic_gap_variant.posedit.pos.start.base + 1))): pass - elif flank_hgvs_genomic.posedit.edit.type == 'sub': - return flank_hgvs_genomic else: return flank_hgvs_genomic @@ -2672,7 +2696,6 @@ def transcript_filter(self, rts, select_transcripts=None): # VF method accession = str(k + "." + v["version"]) rts.append([accession] + v["list"]) - print([accession] + v["list"]) return rts # If we got select_transcripts as a json of tx convert it into a list rts = [] diff --git a/tests/test_inputs.py b/tests/test_inputs.py index ecbe9866..468c9056 100644 --- a/tests/test_inputs.py +++ b/tests/test_inputs.py @@ -28,18 +28,24 @@ def test_variant1(self): 'tlr': 'NP_055935.4:p.(Leu12Pro)', 'slr': 'NP_055935.4:p.(L12P)'} assert results['NM_015120.4:c.35T>C']['hgvs_lrg_transcript_variant'] == 'LRG_741t1:c.35T>C' assert results['NM_015120.4:c.35T>C']['hgvs_lrg_variant'] == 'LRG_741:g.5146T>C' - assert results['NM_015120.4:c.35T>C']['primary_assembly_loci']['hg19'] == { - 'hgvs_genomic_description': 'NC_000002.11:g.73613031T>C', - 'vcf': {'chr': 'chr2', 'pos': '73613031', 'ref': 'T', 'alt': 'C'}} - assert results['NM_015120.4:c.35T>C']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000002.12:g.73385903T>C', - 'vcf': {'chr': 'chr2', 'pos': '73385903', 'ref': 'T', 'alt': 'C'}} assert results['NM_015120.4:c.35T>C']['primary_assembly_loci']['grch37'] == { - 'hgvs_genomic_description': 'NC_000002.11:g.73613031T>C', - 'vcf': {'chr': '2', 'pos': '73613031', 'ref': 'T', 'alt': 'C'}} + "hgvs_genomic_description": "NC_000002.11:g.73613031delinsCGGA", + "vcf": { + "alt": "CGGA", + "chr": "2", + "pos": "73613031", + "ref": "T" + } + } assert results['NM_015120.4:c.35T>C']['primary_assembly_loci']['grch38'] == { - 'hgvs_genomic_description': 'NC_000002.12:g.73385903T>C', - 'vcf': {'chr': '2', 'pos': '73385903', 'ref': 'T', 'alt': 'C'}} + "hgvs_genomic_description": "NC_000002.12:g.73385903delinsCGGA", + "vcf": { + "alt": "CGGA", + "chr": "2", + "pos": "73385903", + "ref": "T" + } + } assert results['NM_015120.4:c.35T>C']['reference_sequence_records'] == { 'transcript': 'https://www.ncbi.nlm.nih.gov/nuccore/NM_015120.4', 'protein': 'https://www.ncbi.nlm.nih.gov/nuccore/NP_055935.4', @@ -65,18 +71,24 @@ def test_variant2(self): 'tlr': 'NP_055935.4:p.(Glu13Asp)', 'slr': 'NP_055935.4:p.(E13D)'} assert results['NM_015120.4:c.39G>C']['hgvs_lrg_transcript_variant'] == 'LRG_741t1:c.39G>C' assert results['NM_015120.4:c.39G>C']['hgvs_lrg_variant'] == 'LRG_741:g.5150G>C' - assert results['NM_015120.4:c.39G>C']['primary_assembly_loci']['hg19'] == { - 'hgvs_genomic_description': 'NC_000002.11:g.73613032G>C', - 'vcf': {'chr': 'chr2', 'pos': '73613032', 'ref': 'G', 'alt': 'C'}} - assert results['NM_015120.4:c.39G>C']['primary_assembly_loci']['hg38'] == { - 'hgvs_genomic_description': 'NC_000002.12:g.73385904G>C', - 'vcf': {'chr': 'chr2', 'pos': '73385904', 'ref': 'G', 'alt': 'C'}} assert results['NM_015120.4:c.39G>C']['primary_assembly_loci']['grch37'] == { - 'hgvs_genomic_description': 'NC_000002.11:g.73613032G>C', - 'vcf': {'chr': '2', 'pos': '73613032', 'ref': 'G', 'alt': 'C'}} + "hgvs_genomic_description": "NC_000002.11:g.73613034_73613035insCGA", + "vcf": { + "alt": "GGAC", + "chr": "2", + "pos": "73613032", + "ref": "G" + } + } assert results['NM_015120.4:c.39G>C']['primary_assembly_loci']['grch38'] == { - 'hgvs_genomic_description': 'NC_000002.12:g.73385904G>C', - 'vcf': {'chr': '2', 'pos': '73385904', 'ref': 'G', 'alt': 'C'}} + "hgvs_genomic_description": "NC_000002.12:g.73385906_73385907insCGA", + "vcf": { + "alt": "GGAC", + "chr": "2", + "pos": "73385904", + "ref": "G" + } + } assert results['NM_015120.4:c.39G>C']['reference_sequence_records'] == { 'transcript': 'https://www.ncbi.nlm.nih.gov/nuccore/NM_015120.4', 'protein': 'https://www.ncbi.nlm.nih.gov/nuccore/NP_055935.4', @@ -3665,16 +3677,10 @@ def test_variant76(self): # Bug fix for issue https://github.com/openvar/variantValidator/issues/94 creates extra outputs. Not an issue so ignore # self.assertCountEqual(results['NM_032790.3:c.126C>A']['alt_genomic_loci'], [{'grch37': {'hgvs_genomic_description': 'NW_004504303.2:g.302871_302876del', 'vcf': {'chr': 'HG1595_PATCH', 'pos': '302869', 'ref': 'GCCCCGC', 'alt': 'G'}}}, {'hg19': {'hgvs_genomic_description': 'NW_004504303.2:g.302871_302876del', 'vcf': {'chr': 'NW_004504303.2', 'pos': '302869', 'ref': 'GCCCCGC', 'alt': 'G'}}}]) - assert results['NM_032790.3:c.126C>A']['primary_assembly_loci']['hg19'] == { - 'hgvs_genomic_description': 'NC_000012.11:g.122064773C>A', - 'vcf': {'chr': 'chr12', 'pos': '122064773', 'ref': 'C', 'alt': 'A'}} - assert results['NM_032790.3:c.126C>A']['primary_assembly_loci']['hg38'][ - 'hgvs_genomic_description'] == 'NC_000012.12:g.121626873C>A' - assert results['NM_032790.3:c.126C>A']['primary_assembly_loci']['grch37'] == { - 'hgvs_genomic_description': 'NC_000012.11:g.122064773C>A', - 'vcf': {'chr': '12', 'pos': '122064773', 'ref': 'C', 'alt': 'A'}} + assert results['NM_032790.3:c.126C>A']['primary_assembly_loci']['grch37'][ + 'hgvs_genomic_description'] == 'NC_000012.11:g.122064773_122064778del' assert results['NM_032790.3:c.126C>A']['primary_assembly_loci']['grch38'][ - 'hgvs_genomic_description'] == 'NC_000012.12:g.121626873C>A' + 'hgvs_genomic_description'] == 'NC_000012.12:g.121626868_121626873delinsA' assert results['NM_032790.3:c.126C>A']['reference_sequence_records'] == { 'transcript': 'https://www.ncbi.nlm.nih.gov/nuccore/NM_032790.3', 'protein': 'https://www.ncbi.nlm.nih.gov/nuccore/NP_116179.2', @@ -31089,10 +31095,10 @@ def test_issue_651a(self): variant = 'NM_017680.6:c.153G>T' select_transcripts = 'all' results = self.vv.validate(variant, 'GRCh38', select_transcripts).format_as_dict(test=True) - assert 'NC_000009.12:g.92474742delinsATCA' in \ + assert 'NC_000009.12:g.92474742_92474744del' in \ results['NM_017680.6:c.153G>T'][ 'primary_assembly_loci']['grch38']['hgvs_genomic_description'] - assert 'NC_000009.11:g.95237024delinsATCA' in \ + assert 'NC_000009.11:g.95237024_95237026del' in \ results['NM_017680.6:c.153G>T'][ 'primary_assembly_loci']['grch37']['hgvs_genomic_description'] @@ -31100,10 +31106,10 @@ def test_issue_651b(self): variant = 'NC_000009.12:g.92474742delinsATCA' select_transcripts = 'NM_017680.6' results = self.vv.validate(variant, 'GRCh38', select_transcripts).format_as_dict(test=True) - assert 'NC_000009.12:g.92474742delinsATCA' in \ + assert 'NC_000009.12:g.92474742_92474744del' in \ results['NM_017680.6:c.153G>T'][ 'primary_assembly_loci']['grch38']['hgvs_genomic_description'] - assert 'NC_000009.11:g.95237024delinsATCA' in \ + assert 'NC_000009.11:g.95237024_95237026del' in \ results['NM_017680.6:c.153G>T'][ 'primary_assembly_loci']['grch37']['hgvs_genomic_description'] @@ -31271,6 +31277,24 @@ def issue_786_part_B(self): assert results["intergenic_variant_1"]["primary_assembly_loci"]["grch38"][ "hgvs_genomic_description"] == "NC_000023.11:g.18890210_18893706delinsGCCTGCAGAG" + def issue_786_part_A1(self): + # Test that it fails for genome mismatch + results = self.vv.validate('NC_000015.9:g.72105928del', 'GRCh37', 'mane_select', liftover_level=True).format_as_dict(test=True) + assert 'intergenic_variant_1' in results + assert results["NM_014249.4:c.947A>C"]["primary_assembly_loci"]["grch37"][ + "hgvs_genomic_description"] == "NC_000015.9:g.72105928del" + assert results["NM_014249.4:c.947A>C"]["primary_assembly_loci"]["grch38"][ + "hgvs_genomic_description"] == "NC_000015.10:g.71813588A>C" + + def issue_786_part_A2(self): + # Test that it fails for genome mismatch + results = self.vv.validate('NC_000015.9:g.72105933dup', 'GRCh37', 'mane_select', liftover_level=True).format_as_dict(test=True) + assert 'intergenic_variant_1' in results + assert results["NM_014249.4:c.947A>C"]["primary_assembly_loci"]["grch37"][ + "hgvs_genomic_description"] == "NC_000015.9:g.72105933dup" + assert results["NM_014249.4:c.947A>C"]["primary_assembly_loci"]["grch38"][ + "hgvs_genomic_description"] == "NC_000015.10:g.71813591_71813592dup" + # # Copyright (C) 2016-2026 VariantValidator Contributors