Merge two reads by concatenating their sequence data and their
      quality data (<self> first, then <other>); <self> and <other> must have
      the same sequence name. A new merged FastqSequence object is returned;
      <Self> and <other> are left unaltered.

      :param other: the other sequence to merge with self.
      :param forceMerge: force the merge to occur, even if sequences names
                         don't match. In this case, <self> takes precedence.
      :return: A new FastqSequence that represents the merging of <self> and
               <other>
      :raise: FastqSequenceError if the sequences names do not match, and the
              forceMerge parameter is not set.

def merge(self, other, forceMerge=False):
    """
      Merge two reads by concatenating their sequence data and their
      quality data (<self> first, then <other>); <self> and <other> must have
      the same sequence name. A new merged FastqSequence object is returned;
      <Self> and <other> are left unaltered.

      :param other: the other sequence to merge with self.
      :param forceMerge: force the merge to occur, even if sequences names
                         don't match. In this case, <self> takes precedence.
      :return: A new FastqSequence that represents the merging of <self> and
               <other>
      :raise: FastqSequenceError if the sequences names do not match, and the
              forceMerge parameter is not set.
    """
    if self.sequenceName != other.sequenceName and not forceMerge:
      raise NGSReadError("cannot merge " + self.sequenceName + " with " +
                         other.sequenceName + " -- different " +
                         "sequence names")

    name = self.sequenceName
    seq = self.sequenceData + other.sequenceData
    qual = self.sequenceQual + other.sequenceQual

    return NGSReadError(name, seq, qual)