def add_germline_variants(self, germline_nucs, coding_pos):
        """Add potential germline variants into the nucleotide sequence.

        Sequenced individuals may potentially have a SNP at a somatic mutation position.
        Therefore they may differ from the reference genome. This method updates the gene
        germline gene sequence to match the actual individual.

        Parameters
        ----------
        germline_nucs : list of str
            list of DNA nucleotides containing the germline letter
        coding_pos : int
            0-based nucleotide position in coding sequence

        NOTE: the self.exon_seq attribute is updated, no return value
        """
        if len(germline_nucs) != len(coding_pos):
            raise ValueError('Each germline nucleotide should have a coding position')

        es = list(self.exon_seq)
        for i in range(len(germline_nucs)):
            gl_nuc, cpos = germline_nucs[i].upper(), coding_pos[i]
            if not utils.is_valid_nuc(gl_nuc):
                raise ValueError('{0} is not a valid nucleotide'.format(gl_nuc))
            if cpos >= 0:
                es[cpos] = gl_nuc
        self.exon_seq = ''.join(es)
Add potential germline variants into the nucleotide sequence.

        Sequenced individuals may potentially have a SNP at a somatic mutation position.
        Therefore they may differ from the reference genome. This method updates the gene
        germline gene sequence to match the actual individual.

        Parameters
        ----------
        germline_nucs : list of str
            list of DNA nucleotides containing the germline letter
        coding_pos : int
            0-based nucleotide position in coding sequence

        NOTE: the self.exon_seq attribute is updated, no return value