docs: def sequence_mutation_summary(self, alignment_ids=None, alignment_type=None):
          """Summarize all mutations found in the sequence_alignments attribute.
  
          Returns 2 dictionaries, single_counter and fingerprint_counter.
  
          single_counter:
              Dictionary of ``{point mutation: list of genes/strains}``
              Example::
  
                  {
                      ('A', 24, 'V'): ['Strain1', 'Strain2', 'Strain4'],
                      ('R', 33, 'T'): ['Strain2']
                  }
  
              Here, we report which genes/strains have the single point mutation.
  
          fingerprint_counter:
              Dictionary of ``{mutation group: list of genes/strains}``
              Example::
  
                  {
                      (('A', 24, 'V'), ('R', 33, 'T')): ['Strain2'],
                      (('A', 24, 'V')): ['Strain1', 'Strain4']
                  }
  
              Here, we report which genes/strains have the specific combinations (or "fingerprints") of point mutations
  
          Args:
              alignment_ids (str, list): Specified alignment ID or IDs to use
              alignment_type (str): Specified alignment type contained in the ``annotation`` field of an alignment object,
                  ``seqalign`` or ``structalign`` are the current types.
  
          Returns:
              dict, dict: single_counter, fingerprint_counter
  
          """
          if alignment_ids:
              ssbio.utils.force_list(alignment_ids)
  
          if len(self.sequence_alignments) == 0:
              log.error('{}: no sequence alignments'.format(self.id))
              return {}, {}
  
          fingerprint_counter = defaultdict(list)
          single_counter = defaultdict(list)
  
          for alignment in self.sequence_alignments:
              # Ignore alignments if a list of identifiers is provided
              if alignment_ids:
                  if alignment.id not in alignment_ids:
                      continue
              # Ignore alignments if type is specified
              if alignment_type:
                  if alignment.annotations['ssbio_type'] != alignment_type:
                      continue
  
              other_sequence = alignment.annotations['b_seq']
              mutations = alignment.annotations['mutations']
  
              if mutations:
                  # Turn this list of mutations into a tuple so it can be a dictionary key
                  mutations = tuple(tuple(x) for x in mutations)
                  fingerprint_counter[mutations].append(other_sequence)
  
                  for m in mutations:
                      single_counter[m].append(other_sequence)
  
          return dict(single_counter), dict(fingerprint_counter)