code: def cigar_to_seq(a, gap='*'):
      
      seq, cigar = a.seq, a.cigar
      start = 0
      subseqs = []
      npadded = 0
      if cigar is None:
          return None, npadded
  
      for operation, length in cigar:
          end = start if operation == 2 else start + length
  
          if operation == 0:  # match
              subseq = seq[start:end]
          elif operation == 1:  # insertion
              subseq = ""
          elif operation == 2:  # deletion
              subseq = gap * length
              npadded += length
          elif operation == 3:  # skipped
              subseq = 'N' * length
          elif operation in (4, 5):  # clip
              subseq = ""
          else:
              raise NotImplementedError
  
          subseqs.append(subseq)
          start = end
  
      return "".join(subseqs), npadded
docs: Accepts a pysam row.
  
      cigar alignment is presented as a list of tuples (operation,length). For
      example, the tuple [ (0,3), (1,5), (0,2) ] refers to an alignment with 3
      matches, 5 insertions and another 2 matches.
  
      Op BAM Description
      M 0 alignment match (can be a sequence match or mismatch)
      I 1 insertion to the reference
      D 2 deletion from the reference
      N 3 skipped region from the reference
      S 4 soft clipping (clipped sequences present in SEQ)
      H 5 hard clipping (clipped sequences NOT present in SEQ)
      P 6 padding (silent deletion from padded reference)
      = 7 sequence match
      X 8 sequence mismatch
  
      convert the sequence based on the cigar string. For example: