docs: def dot_alignment(self, seq_field='vdj_nt', name_field='seq_id', uca=None,
              chain='heavy', uca_name='UCA', as_fasta=False, just_alignment=False):
          '''
          Returns a multiple sequence alignment of all lineage sequence with the UCA
          where matches to the UCA are shown as dots and mismatches are shown as the
          mismatched residue.
  
          Inputs (optional)
          -----------------
          seq_field: the sequence field to be used for alignment. Default is 'vdj_nt'.
          name_field: field used for the sequence name. Default is 'seq_id'.
          chain: either 'heavy' or 'light'. Default is 'heavy'.
  
          Returns
          -------
          The dot alignment (string)
          '''
          if uca is None:
              uca = self.uca.heavy if chain == 'heavy' else self.uca.light
          uca.id = 'UCA'
          if chain == 'heavy':
              sequences = [p.heavy for p in self.heavies if seq_field in p.heavy]
              if name_field != 'seq_id':
                  uca[name_field] = uca['seq_id']
              sequences.append(uca)
              seqs = [(s[name_field], s[seq_field]) for s in sequences]
          else:
              sequences = [p.light for p in self.lights if seq_field in p.light]
              if name_field != 'seq_id':
                  uca[name_field] = uca['seq_id']
              sequences.append(uca)
              seqs = [(s[name_field], s[seq_field]) for s in sequences]
          aln = muscle(seqs)
          g_aln = [a for a in aln if a.id == 'UCA'][0]
          dots = [(uca_name, str(g_aln.seq)), ]
          for seq in [a for a in aln if a.id != 'UCA']:
              s_aln = ''
              for g, q in zip(str(g_aln.seq), str(seq.seq)):
                  if g == q == '-':
                      s_aln += '-'
                  elif g == q:
                      s_aln += '.'
                  else:
                      s_aln += q
              dots.append((seq.id, s_aln))
          if just_alignment:
                  return [d[1] for d in dots]
          name_len = max([len(d[0]) for d in dots]) + 2
          dot_aln = []
          for d in dots:
              if as_fasta:
                  dot_aln.append('>{}\n{}'.format(d[0], d[1]))
              else:
                  spaces = name_len - len(d[0])
                  dot_aln.append(d[0] + ' ' * spaces + d[1])
          return '\n'.join(dot_aln)