code: def subsequence(self, start, end):
      
      if (start < self.start or start >= self.end or end <= self.start or
         end > self.end or start >= end):
        raise SequenceError("invalid subsequence coordinates (" + str(start) +
                            " ," + str(end) + ") for sequence " + str(self))
  
      rel_start_string_coord = self.start - start - 1
      rel_end_string_coord = self.end - end - 1
      seq = self.sequenceData[rel_start_string_coord:rel_end_string_coord]
      return Sequence(self.name, seq, start, end, self.strand,
                      self.remaining + self.end - end, self.mutableString)
docs: Extract a subsequence from this sequence object using absolute coordinates
      that exist in the same coordinate space as the sequence itself. For
      example:
  
        46  --> A--CTGC-TAGC-GATCGACT <--  62      subsequence(47,52) == CTGC-T
  
      :param start:      the index marking the start (inclusive) of the
                         subsequence. This is a one-based index, and is in the
                         same coordinate space as this sequence object.
      :param end:        the index marking the end (exclusive) of the
                         subsequence. This is a one-based index, and is in the
                         same coordinate space as this sequence object.
  
      :return: a new sequence object that represents the subsequence of this from
               position start (indexed from 1, inclusive) to end (indexed from
               1, exclusive). Ungapped length of this will always be equal to
               end - start
      :rasie SequenceError: if the coordinates given fall outside of the start
                            and end indices of this sequence object.