From 31b2f13a47efcf826566e117759ca71f00c90c78 Mon Sep 17 00:00:00 2001 From: Martijn Vermaat <martijn@vermaat.name> Date: Fri, 28 Feb 2014 10:04:47 +0100 Subject: [PATCH] Range and compound insertions/insertion-deletions The name checker supports ranges in insertions and insertion- deletions, for example `3_4ins8_12`, and compound insertions and insertion-deletions, for example `3_4ins[ATC;8_12]`. The inserted sequences are accepted and concatenated before any further processing, so reported descriptions show only the concatenated sequences. The support for ranges is limited to genomic descriptions. The position converter supports compound insertions and insertion-deletions, not ranges. Compound insertions and insertion-deletions are not part of the current HGVS nomenclature, but will be proposed. --- mutalyzer/grammar.py | 20 +- mutalyzer/mapping.py | 40 +++- mutalyzer/variantchecker.py | 87 +++++++-- tests/fixtures.py | 15 ++ tests/test_grammar.py | 28 +++ tests/test_mapping.py | 34 ++++ tests/test_variantchecker.py | 358 ++++++++++++++++++++++++++++++++++- 7 files changed, 545 insertions(+), 37 deletions(-) diff --git a/mutalyzer/grammar.py b/mutalyzer/grammar.py index 49388f75..f2a1b830 100644 --- a/mutalyzer/grammar.py +++ b/mutalyzer/grammar.py @@ -205,18 +205,26 @@ class Grammar(): Suppress(']')) ^ (RangeLoc + Suppress('[') + Number + \ Suppress(']')) ^ AbrSSR - # BNF: Ins -> RangeLoc `ins' (Nt+ | Number | RangeLoc | FarLoc) Nest? - Ins = RangeLoc + Literal('ins')('MutationType') + \ - ((NtString ^ Number)('Arg1') ^ RangeLoc ^ \ - FarLoc('OptRef')) + Optional(Nest) + # BNF: Seq -> (Nt+ | Number | RangeLoc | FarLoc) Nest? + Seq = Group(NtString('Sequence') ^ Number ^ RangeLoc('Range') ^ \ + FarLoc('OptRef') + Optional(Nest))('Seq') + + # BNF: SeqList -> Seq (`;' Seq)* + SeqList = delimitedList(Seq, delim=';')('SeqList') + + # BNF: SimpleSeqList -> (`[' SeqList `]') | Seq + SimpleSeqList = Suppress('[') + SeqList + Suppress(']') ^ Seq + + # BNF: Ins -> RangeLoc `ins' SimpleSeqList + Ins = RangeLoc + Literal('ins')('MutationType') + SimpleSeqList # BNF: Indel -> (RangeLoc | PtLoc) `del' (Nt+ | Number)? - # `ins' (Nt+ | Number | RangeLoc | FarLoc) Nest? + # `ins' SimpleSeqList # Note that the alternative PtLoc is not included in [3]. Indel = (RangeLoc ^ Group(PtLoc('PtLoc'))('StartLoc')) + Literal('del') + \ Optional(NtString ^ Number)('Arg1') + \ Literal('ins').setParseAction(replaceWith('delins'))('MutationType') + \ - ((NtString ^ Number)('Arg2') ^ RangeLoc ^ FarLoc) + Optional(Nest) + SimpleSeqList # BNF: Inv -> RangeLoc `inv' (Nt+ | Number)? Nest? Inv = RangeLoc + Literal('inv')('MutationType') + \ diff --git a/mutalyzer/mapping.py b/mutalyzer/mapping.py index ed751d08..9a059a68 100644 --- a/mutalyzer/mapping.py +++ b/mutalyzer/mapping.py @@ -56,10 +56,27 @@ def _construct_change(var, reverse=False): arg1 = var.Arg1 arg2 = var.Arg2 + def parse_sequence(seq): + if not seq.Sequence: + raise NotImplementedError('Only explicit sequences are supported ' + 'for insertions.') + if reverse: + return reverse_complement(str(seq.Sequence)) + return seq.Sequence + if var.MutationType == 'subst': change = '%s>%s' % (arg1, arg2) - elif var.MutationType == 'delins' and arg2: - change = '%s%s' % (var.MutationType, arg2) + elif var.MutationType in ('ins', 'delins'): + if var.SeqList: + if reverse: + seqs = reversed(var.SeqList) + else: + seqs = var.SeqList + insertion = '[' + ';'.join(str(parse_sequence(seq)) + for seq in seqs) + ']' + else: + insertion = parse_sequence(var.Seq) + change = '%s%s' % (var.MutationType, insertion) else: change = '%s%s' % (var.MutationType, arg1 or arg2 or '') @@ -506,8 +523,14 @@ class Converter(object) : # Construct the variant descriptions descriptions = [] for variant, mapping in zip(variants, mappings): - f_change = _construct_change(variant) - r_change = _construct_change(variant, reverse=True) + try: + f_change = _construct_change(variant) + r_change = _construct_change(variant, reverse=True) + except NotImplementedError as e: + self.__output.addMessage(__file__, 3, 'ENOTIMPLEMENTED', + str(e)) + return None + if self.mapping.orientation == 'forward': change = f_change else : @@ -723,8 +746,13 @@ class Converter(object) : mutations = [] for variant, cmap in zip(variants, core_mapping): - f_change = _construct_change(variant) - r_change = _construct_change(variant, reverse=True) + try: + f_change = _construct_change(variant) + r_change = _construct_change(variant, reverse=True) + except NotImplementedError as e: + self.__output.addMessage(__file__, 4, + "ENOTIMPLEMENTEDERROR", str(e)) + return None startp = self.crossmap.tuple2string((cmap.startmain, cmap.startoffset)) endp = self.crossmap.tuple2string((cmap.endmain, cmap.endoffset)) diff --git a/mutalyzer/variantchecker.py b/mutalyzer/variantchecker.py index 30bbbfc2..18412996 100644 --- a/mutalyzer/variantchecker.py +++ b/mutalyzer/variantchecker.py @@ -1185,25 +1185,74 @@ def process_raw_variant(mutator, variant, record, transcript, output): if variant.MutationType == 'inv': apply_inversion(first, last, mutator, record, output) - # Insertion. - if variant.MutationType == 'ins': - # Check if the inserted sequence is not a range. - # Todo: Implement this feature. - if not argument: - output.addMessage(__file__, 4, 'ENOTIMPLEMENTED', - 'Insertion of a range is not implemented yet.') - raise _RangeInsertionError() - apply_insertion(first, last, argument, mutator, record, output) - - # DelIns. - if variant.MutationType == 'delins': - # Check if the inserted sequence is not a range. - # Todo: Implement this feature. - if not sequence: - output.addMessage(__file__, 4, 'ENOTIMPLEMENTED', - 'Insertion of a range is not implemented yet.') - raise _RangeInsertionError() - apply_delins(first, last, sequence, mutator, record, output) + # Parse a Seq object containing a Sequence or a Range into a string. + def parse_sequence(seq): + if seq.Sequence: + if transcript and transcript.CM.orientation == -1: + return Bio.Seq.reverse_complement(str(seq.Sequence)) + return seq.Sequence + + if seq.StartLoc and seq.EndLoc: + if transcript: + output.addMessage(__file__, 4, 'ENOTIMPLEMENTED', + 'The insertion of a range is only supported ' + 'with genomic positioning.') + raise _RangeInsertionError() + + try: + range_first, range_last = _genomic_to_genomic( + seq.StartLoc.PtLoc, seq.EndLoc.PtLoc) + except _UnknownPositionError: + output.addMessage(__file__, 4, 'EUNKNOWN', + 'Unknown positions (denoted by "?") are ' + 'not supported.') + raise + except _RawVariantError: + output.addMessage(__file__, 4, 'EPOSITION', + 'Could not determine range.') + raise + + if range_last < range_first: + output.addMessage(__file__, 3, 'ERANGE', + 'End position is smaller than the begin ' + 'position.') + raise _RawVariantError() + + if range_first < 1: + output.addMessage(__file__, 4, 'ERANGE', + 'Position %i is out of range.' % range_first) + raise _RawVariantError() + + if range_last > len(mutator.orig): + output.addMessage(__file__, 4, 'ERANGE', + 'Position %s is out of range.' % range_last) + raise _RawVariantError() + + return mutator.orig[range_first - 1:range_last] + + output.addMessage(__file__, 4, 'ENOTIMPLEMENTED', + 'Only the insertion of a sequence or a range is ' + 'implemented.') + raise _RawVariantError() + + if variant.MutationType in ('ins', 'delins'): + if variant.SeqList: + if transcript and transcript.CM.orientation == -1: + seqs = reversed(variant.SeqList) + else: + seqs = variant.SeqList + insertion = ''.join(str(parse_sequence(seq)) + for seq in seqs) + else: + insertion = parse_sequence(variant.Seq) + + # Insertion. + if variant.MutationType == 'ins': + apply_insertion(first, last, insertion, mutator, record, output) + + # DelIns. + if variant.MutationType == 'delins': + apply_delins(first, last, insertion, mutator, record, output) #process_raw_variant diff --git a/tests/fixtures.py b/tests/fixtures.py index e25d018d..595d72a6 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -245,6 +245,21 @@ def hg19_transcript_mappings(): cds=(111957632, 111965694), select_transcript=False, version=2)) + session.add(TranscriptMapping( + chromosome_11, + 'refseq', + 'NM_012459', + 'TIMM8B', + 'reverse', + 111955524, + 111957522, + [111955524, 111957364], + [111956186, 111957522], + 'ncbi', + transcript=1, + cds=(111956019, 111957492), + select_transcript=False, + version=2)) session.add(TranscriptMapping( chromosome_11, 'refseq', diff --git a/tests/test_grammar.py b/tests/test_grammar.py index f9bf9ec9..4072549e 100644 --- a/tests/test_grammar.py +++ b/tests/test_grammar.py @@ -41,6 +41,34 @@ class TestGrammar(MutalyzerTest): self._parse('NM_002001.2:c.[(12del;12del)]') self._parse('NM_002001.2:c.[((12del)?;12del)?]') + def test_compound_insertion(self): + """ + Some some compound insertions. + """ + self._parse('NM_002001.2:c.15_16insA') + self._parse('NM_002001.2:c.15_16insATC') + self._parse('NM_002001.2:c.15_16ins[A]') + self._parse('NM_002001.2:c.15_16ins[ATC]') + self._parse('NM_002001.2:c.15_16ins28_39') + self._parse('NM_002001.2:c.15_16ins[28_39]') + self._parse('NM_002001.2:c.15_16ins[28_39;A]') + self._parse('NM_002001.2:c.15_16ins[28_39;ATC]') + self._parse('NM_002001.2:c.15_16ins[28_39;A;ATC]') + + def test_compound_delins(self): + """ + Some some compound deletion-insertions. + """ + self._parse('NM_002001.2:c.12_17delinsA') + self._parse('NM_002001.2:c.12_17delinsATC') + self._parse('NM_002001.2:c.12_17delins[A]') + self._parse('NM_002001.2:c.12_17delins[ATC]') + self._parse('NM_002001.2:c.12_17delins28_39') + self._parse('NM_002001.2:c.12_17delins[28_39]') + self._parse('NM_002001.2:c.12_17delins[28_39;A]') + self._parse('NM_002001.2:c.12_17delins[28_39;ATC]') + self._parse('NM_002001.2:c.12_17delins[28_39;A;ATC]') + def test_protein_variants(self): """ Some protein variants. diff --git a/tests/test_mapping.py b/tests/test_mapping.py index 4b2af7d4..3acb53cb 100644 --- a/tests/test_mapping.py +++ b/tests/test_mapping.py @@ -301,3 +301,37 @@ class TestConverter(MutalyzerTest): genomic = converter.c2chrom('NM_017780.2(CHD8):c.109A>T') erange = self.output.getMessagesWithErrorCode('EACCNOTINDB') assert_equal(len(erange), 1) + + def test_ins_seq_chrom2c(self): + """ + Insertion of a sequence (chrom2c). + """ + converter = self._converter('hg19') + coding = converter.chrom2c('NC_000011.9:g.111957482_111957483insGAT', 'list') + assert 'NM_003002.2:c.-150_-149insGAT' in coding + assert 'NM_012459.2:c.10_11insATC' in coding + + def test_ins_seq_seq(self): + """ + Insertion of two sequences (chrom2c). + """ + converter = self._converter('hg19') + coding = converter.chrom2c('NC_000011.9:g.111957482_111957483ins[GAT;AAA]', 'list') + assert 'NM_003002.2:c.-150_-149ins[GAT;AAA]' in coding + assert 'NM_012459.2:c.10_11ins[TTT;ATC]' in coding + + def test_ins_seq_c2chrom_reverse(self): + """ + Insertion of a sequence on reverse strand (c2chrom). + """ + converter = self._converter('hg19') + genomic = converter.c2chrom('NM_012459.2:c.10_11insATC') + assert_equal(genomic, 'NC_000011.9:g.111957482_111957483insGAT') + + def test_ins_seq_seq_c2chrom_reverse(self): + """ + Insertion of two sequences on reverse strand (c2chrom). + """ + converter = self._converter('hg19') + genomic = converter.c2chrom('NM_012459.2:c.10_11ins[TTT;ATC]') + assert_equal(genomic, 'NC_000011.9:g.111957482_111957483ins[GAT;AAA]') diff --git a/tests/test_variantchecker.py b/tests/test_variantchecker.py index 7049fc3f..4f435158 100644 --- a/tests/test_variantchecker.py +++ b/tests/test_variantchecker.py @@ -65,6 +65,21 @@ class TestVariantchecker(MutalyzerTest): in self.output.getOutput('protDescriptions') assert self.output.getOutput('newprotein') + @fix(cache('AL449423.14')) + def test_insertion_list_in_frame(self): + """ + Simple in-frame insertion of a list should give a simple description + on protein level. + """ + check_variant('AL449423.14(CDKN2A_v001):c.161_162ins[ATC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'AL449423.14:g.61938_61939insGAT') + assert 'AL449423.14(CDKN2A_v001):c.161_162insATC' \ + in self.output.getOutput('descriptions') + assert 'AL449423.14(CDKN2A_i001):p.(Met54delinsIleSer)' \ + in self.output.getOutput('protDescriptions') + assert self.output.getOutput('newprotein') + @fix(cache('AL449423.14')) def test_deletion_insertion_in_frame(self): """ @@ -81,6 +96,22 @@ class TestVariantchecker(MutalyzerTest): in self.output.getOutput('protDescriptions') assert self.output.getOutput('newprotein') + @fix(cache('AL449423.14')) + def test_deletion_insertion_list_in_frame(self): + """ + Simple in-frame deletion-insertion of a list should give a simple + description on protein level. + """ + check_variant('AL449423.14(CDKN2A_v001):c.161_162delins[ATCCC]', + self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'AL449423.14:g.61938_61939delinsGGGAT') + assert 'AL449423.14(CDKN2A_v001):c.161_162delinsATCCC' \ + in self.output.getOutput('descriptions') + assert 'AL449423.14(CDKN2A_i001):p.(Met54delinsAsnPro)' \ + in self.output.getOutput('protDescriptions') + assert self.output.getOutput('newprotein') + @fix(cache('AL449423.14')) def test_deletion_insertion_in_frame_complete(self): """ @@ -97,6 +128,23 @@ class TestVariantchecker(MutalyzerTest): in self.output.getOutput('protDescriptions') assert self.output.getOutput('newprotein') + @fix(cache('AL449423.14')) + def test_deletion_insertion_list_in_frame_complete(self): + """ + Simple in-frame deletion-insertion of a list should give a simple + description on protein level, also with the optional deleted sequence + argument. + """ + check_variant('AL449423.14(CDKN2A_v001):c.161_162delTGins[ATCCC]', + self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'AL449423.14:g.61938_61939delinsGGGAT') + assert 'AL449423.14(CDKN2A_v001):c.161_162delinsATCCC' \ + in self.output.getOutput('descriptions') + assert 'AL449423.14(CDKN2A_i001):p.(Met54delinsAsnPro)' \ + in self.output.getOutput('protDescriptions') + assert self.output.getOutput('newprotein') + @fix(cache('NM_003002.2')) def test_est_warning_nm_est(self): """ @@ -496,20 +544,318 @@ class TestVariantchecker(MutalyzerTest): # prediction is done. assert self.output.getOutput('newprotein') - @fix(cache('AB026906.1')) + @fix(cache('NG_008939.1')) + def test_ins_seq(self): + """ + Insertion of a sequence. + """ + check_variant('NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + + @fix(cache('NG_012337.1')) + def test_ins_seq_reverse(self): + """ + Insertion of a sequence on reverse strand. + """ + check_variant('NG_012337.1(TIMM8B_v001):c.12_13insGATC', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_012337.1:g.4911_4912insATCG') + assert 'NG_012337.1(TIMM8B_v001):c.12_13insGATC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) def test_ins_range(self): """ - Insertion of a range is not implemented yet. + Insertion of a range. """ - check_variant('AB026906.1:c.274_275ins262_268', self.output) + check_variant('NG_008939.1:g.5207_5208ins4300_4320', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 0) + + @fix(cache('NG_008939.1')) + def test_ins_seq_list(self): + """ + Insertion of a sequence as a list. + """ + check_variant('NG_008939.1:g.5207_5208ins[GTCCTGTGCTCATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_012337.1')) + def test_ins_seq_list_reverse(self): + """ + Insertion of a sequence as a list on reverse strand. + """ + check_variant('NG_012337.1(TIMM8B_v001):c.12_13ins[GATC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_012337.1:g.4911_4912insATCG') + assert 'NG_012337.1(TIMM8B_v001):c.12_13insGATC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_ins_range_list(self): + """ + Insertion of a range as a list. + """ + check_variant('NG_008939.1:g.5207_5208ins[4300_4320]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 0) + + @fix(cache('NG_008939.1')) + def test_ins_seq_seq(self): + """ + Insertion of two sequences. + """ + check_variant('NG_008939.1:g.5207_5208ins[GTCCTGTGCTC;ATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_012337.1')) + def test_ins_seq_seq_reverse(self): + """ + Insertion of two sequences on reverse strand. + """ + check_variant('NG_012337.1(TIMM8B_v001):c.12_13ins[TTT;GATC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_012337.1:g.4911_4912insATCAAAG') + assert 'NG_012337.1(TIMM8B_v001):c.12_13insTTTGATC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_ins_range_range(self): + """ + Insertion of two ranges. + """ + check_variant('NG_008939.1:g.5207_5208ins[4300_4309;4310_4320]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 0) + + @fix(cache('NG_008939.1')) + def test_ins_seq_range(self): + """ + Insertion of a sequence and a range. + """ + check_variant('NG_008939.1:g.5207_5208ins[GTCCTGTGCT;4310_4320]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_ins_range_seq(self): + """ + Insertion of a range and a sequence. + """ + check_variant('NG_008939.1:g.5207_5208ins[4300_4309;CATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_ins_seq_coding(self): + """ + Insertion of a sequence (coding). + """ + check_variant('NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_ins_seq_list_coding(self): + """ + Insertion of a sequence as a list (coding). + """ + check_variant('NG_008939.1(PCCB_v001):c.156_157ins[GTCCTGTGCTCATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_ins_seq_seq_coding(self): + """ + Insertion of two sequences (coding). + """ + check_variant('NG_008939.1(PCCB_v001):c.156_157ins[GTCCTGTGCTC;ATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5208insGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_157insGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_ins_range_coding(self): + """ + Insertion of a range (coding). + """ + check_variant('NG_008939.1(PCCB_v001):c.156_157ins180_188', self.output) assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 1) - @fix(cache('AB026906.1')) + @fix(cache('NG_008939.1')) + def test_ins_range_list_coding(self): + """ + Insertion of a range as a list (coding). + """ + check_variant('NG_008939.1(PCCB_v001):c.156_157ins[180_188]', self.output) + assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 1) + + @fix(cache('NG_008939.1')) + def test_delins_seq(self): + """ + Insertion-deletion of a sequence. + """ + check_variant('NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) def test_delins_range(self): """ - Deletion/insertion of a range is not implemented yet. + Insertion-deletion of a range. + """ + check_variant('NG_008939.1:g.5207_5212delins4300_4320', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 0) + + @fix(cache('NG_008939.1')) + def test_delins_seq_list(self): + """ + Insertion-deletion of a sequence as a list. + """ + check_variant('NG_008939.1:g.5207_5212delins[GTCCTGTGCTCATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_delins_range_list(self): + """ + Insertion-deletion of a range as a list. + """ + check_variant('NG_008939.1:g.5207_5212delins[4300_4320]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 0) + + @fix(cache('NG_008939.1')) + def test_delins_seq_seq(self): + """ + Insertion-deletion of two sequences. + """ + check_variant('NG_008939.1:g.5207_5212delins[GTCCTGTGCT;CATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_delins_range_range(self): + """ + Insertion-deletion of two ranges. + """ + check_variant('NG_008939.1:g.5207_5212delins[4300_4309;4310_4320]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 0) + + @fix(cache('NG_008939.1')) + def test_delins_seq_range(self): + """ + Insertion-deletion of a sequence and a range. + """ + check_variant('NG_008939.1:g.5207_5212delins[GTCCTGTGCT;4310_4320]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_delins_range_seq(self): + """ + Insertion-deletion of a range and a sequence. + """ + check_variant('NG_008939.1:g.5207_5212delins[4300_4309;CATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_delins_seq_coding(self): + """ + Insertion-deletion of a sequence (coding). + """ + check_variant('NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_delins_seq_list_coding(self): + """ + Insertion-deletion of a sequence as a list (coding). + """ + check_variant('NG_008939.1(PCCB_v001):c.156_161delins[GTCCTGTGCTCATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_delins_seq_seq_coding(self): + """ + Insertion-deletion of two sequences (coding). + """ + check_variant('NG_008939.1(PCCB_v001):c.156_161delins[GTCCTGTGCT;CATTATCTGGC]', self.output) + assert_equal(self.output.getIndexedOutput('genomicDescription', 0), + 'NG_008939.1:g.5207_5212delinsGTCCTGTGCTCATTATCTGGC') + assert 'NG_008939.1(PCCB_v001):c.156_161delinsGTCCTGTGCTCATTATCTGGC' \ + in self.output.getOutput('descriptions') + + @fix(cache('NG_008939.1')) + def test_delins_range_coding(self): + """ + Insertion-deletion of a range (coding). + """ + check_variant('NG_008939.1(PCCB_v001):c.156_161delins180_188', self.output) + assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 1) + + @fix(cache('NG_008939.1')) + def test_delins_range_list_coding(self): + """ + Insertion-deletion of a range as a list (coding). """ - check_variant('AB026906.1:c.274delins262_268', self.output) + check_variant('NG_008939.1(PCCB_v001):c.156_161delins[180_188]', self.output) assert_equal(len(self.output.getMessagesWithErrorCode('ENOTIMPLEMENTED')), 1) def test_no_reference(self): -- GitLab