Skip to content

Commit 08cea20

Browse files
committed
Rewrite dup as ins and try both shuffle directions
1 parent 586f430 commit 08cea20

File tree

3 files changed

+83
-10
lines changed

3 files changed

+83
-10
lines changed

src/hgvs/assemblymapper.py

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
HGVSUnsupportedOperationError,
1414
)
1515
from hgvs.variantmapper import VariantMapper
16+
from hgvs.posedit import PosEdit
17+
from hgvs.edit import NARefAlt
18+
from hgvs.location import SimplePosition, Interval
1619

1720
_logger = logging.getLogger(__name__)
1821

@@ -180,17 +183,18 @@ def c_to_p(self, var_c):
180183
and (var_c.posedit.pos.start.offset != 0 or var_c.posedit.pos.end.offset != 0)
181184
and var_out.posedit is None
182185
):
183-
if self._fetch_AlignmentMapper(tx_ac=var_c.ac).strand == 1:
184-
normalizer = hgvs.normalizer.Normalizer(
185-
self._norm.hdp, alt_aln_method=self.alt_aln_method, validate=False, shuffle_direction=5
186-
)
187-
else:
188-
normalizer = hgvs.normalizer.Normalizer(
189-
self._norm.hdp, alt_aln_method=self.alt_aln_method, validate=False, shuffle_direction=3
186+
var_g = self.c_to_g(var_c)
187+
strand = self._fetch_AlignmentMapper(tx_ac=var_c.ac).strand
188+
189+
for shuffle_direction in [3, 5]:
190+
shifted_var_g = self._far_shift(var_g, shuffle_direction, strand)
191+
shifted_var_c = super(AssemblyMapper, self).g_to_c(
192+
shifted_var_g, var_c.ac, alt_aln_method=self.alt_aln_method
190193
)
191-
var_g = normalizer.normalize(self.c_to_g(var_c))
192-
var_c = self.g_to_c(var_g, var_c.ac)
193-
var_out = super(AssemblyMapper, self)._c_to_p(var_c)
194+
var_out = super(AssemblyMapper, self)._c_to_p(shifted_var_c)
195+
196+
if var_out.posedit is not None:
197+
break
194198

195199
return self._maybe_normalize(var_out)
196200

@@ -287,6 +291,34 @@ def _maybe_normalize(self, var):
287291
# fall through to return unnormalized variant
288292
return var
289293

294+
def _far_shift(self, var_g, shuffle_direction, strand):
295+
"""Attempt to shift a variant all the way left or right. Rewrite
296+
duplications as insertions so that the change is shifted as far as
297+
possible."""
298+
normalizer = hgvs.normalizer.Normalizer(
299+
self._norm.hdp, alt_aln_method=self.alt_aln_method, validate=False, shuffle_direction=shuffle_direction
300+
)
301+
shifted_var_g = normalizer.normalize(var_g)
302+
if shifted_var_g.posedit.edit.type == 'dup':
303+
self._replace_reference(shifted_var_g)
304+
if (strand == 1 and shuffle_direction == 3) or (strand == -1 and shuffle_direction == 5):
305+
shifted_var_g.posedit = PosEdit(
306+
pos=Interval(
307+
start=SimplePosition(base=shifted_var_g.posedit.pos.start.base-1),
308+
end=SimplePosition(base=shifted_var_g.posedit.pos.start.base),
309+
),
310+
edit=NARefAlt(ref=None, alt=shifted_var_g.posedit.edit.ref)
311+
)
312+
else:
313+
shifted_var_g.posedit = PosEdit(
314+
pos=Interval(
315+
start=SimplePosition(base=shifted_var_g.posedit.pos.end.base),
316+
end=SimplePosition(base=shifted_var_g.posedit.pos.end.base+1),
317+
),
318+
edit=NARefAlt(ref=None, alt=shifted_var_g.posedit.edit.ref)
319+
)
320+
return shifted_var_g
321+
290322

291323
# <LICENSE>
292324
# Copyright 2018 HGVS Contributors (https://github.com/biocommons/hgvs)

tests/data/cache-py3.hdp

40.8 KB
Binary file not shown.

tests/test_hgvs_assemblymapper.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,47 @@ def test_map_of_ins_splice_region_preserved(self):
210210

211211
self.assertEqual(str(var_p), hgvs_p)
212212

213+
def test_map_of_dup_splice_region_preserved(self):
214+
hgvs_c = "NM_004119.2:c.1835_1837+3dup"
215+
hgvs_p = "NP_004110.2:p.(Gly613_Lys614insIleGly)"
216+
217+
var_c = self.hp.parse_hgvs_variant(hgvs_c)
218+
var_p = self.am.c_to_p(var_c)
219+
220+
self.assertEqual(str(var_p), hgvs_p)
221+
222+
hgvs_c = "NM_005228.4:c.2284-5_2290dup"
223+
hgvs_p = "NP_005219.2:p.(Ala763_Tyr764insPheGlnGluAla)"
224+
225+
var_c = self.hp.parse_hgvs_variant(hgvs_c)
226+
var_p = self.am.c_to_p(var_c)
227+
228+
self.assertEqual(str(var_p), hgvs_p)
229+
230+
hgvs_c = "NM_004456.4:c.2196-1_2196dup"
231+
hgvs_p = "NP_004447.2:p.(Tyr733AspfsTer8)"
232+
233+
var_c = self.hp.parse_hgvs_variant(hgvs_c)
234+
var_p = self.am.c_to_p(var_c)
235+
236+
self.assertEqual(str(var_p), hgvs_p)
237+
238+
hgvs_c = "NM_024529.4:c.130_131+1dup"
239+
hgvs_p = "NP_078805.3:p.(Gly44dup)"
240+
241+
var_c = self.hp.parse_hgvs_variant(hgvs_c)
242+
var_p = self.am.c_to_p(var_c)
243+
244+
self.assertEqual(str(var_p), hgvs_p)
245+
246+
hgvs_c = "NM_016222.3:c.27+2_27+5dup"
247+
hgvs_p = "NP_057306.2:p.(Arg10ValfsTer20)"
248+
249+
var_c = self.hp.parse_hgvs_variant(hgvs_c)
250+
var_p = self.am.c_to_p(var_c)
251+
252+
self.assertEqual(str(var_p), hgvs_p)
253+
213254

214255
class Test_RefReplacement(unittest.TestCase):
215256
test_cases = [

0 commit comments

Comments
 (0)