Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion VariantValidator/modules/gapped_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
43 changes: 33 additions & 10 deletions VariantValidator/modules/vvMixinConverters.py
Original file line number Diff line number Diff line change
Expand Up @@ -1122,33 +1122,57 @@ 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
(len(genomic_gap_variant.posedit.edit.ref)+1 == (
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

Expand Down Expand Up @@ -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 = []
Expand Down
90 changes: 57 additions & 33 deletions tests/test_inputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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',
Expand Down Expand Up @@ -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',
Expand Down Expand Up @@ -31089,21 +31095,21 @@ 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']

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']

Expand Down Expand Up @@ -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"


# <LICENSE>
# Copyright (C) 2016-2026 VariantValidator Contributors
Expand Down