docs: def align(self, alignment_tool = 'clustalw', gap_opening_penalty = 0.2, ignore_bad_chains = False):
          '''If ignore_bad_chains is True then any chains containing all Xs as the sequence will be silently skipped.
             The default behavior is to raise a MalformedSequenceException in this case.'''
          if len(self.pdb_chains) > 1:
              sa = SequenceAligner(alignment_tool = alignment_tool, gap_opening_penalty = gap_opening_penalty)
              for pdb_chain in self.pdb_chains:
                  sa.add_sequence('%s_%s' % (pdb_chain['pdb_id'], pdb_chain['chain_id']), pdb_chain['sequence'], ignore_bad_chains = ignore_bad_chains)
              best_matches = sa.align()
              return sa.alignment_output, best_matches
          else:
              raise Exception('Cannot align sequences - less than two chains were specified.')