Takes a list, pdb_list, of pdb names e.g. ['Model', 'Scaffold', ...] with which the object was created.
            Using the first element of this list as a base, get the sequence alignments with chains in other members
            of the list. For simplicity, if a chain in the first PDB matches multiple chains in another PDB, we only
            return the alignment for one of the chains. If pdb_list is empty then the function defaults to the object's
            members.

            Returns a list of tuples (chain_id, sequence_alignment_printer_object). Each sequence_alignment_printer_object
            can be used to generate a printable version of the sequence alignment.

def get_sequence_alignment_printer_objects(self, pdb_list = [], reversed = True, width = 80, line_separator = '\n'):
        '''Takes a list, pdb_list, of pdb names e.g. ['Model', 'Scaffold', ...] with which the object was created.
            Using the first element of this list as a base, get the sequence alignments with chains in other members
            of the list. For simplicity, if a chain in the first PDB matches multiple chains in another PDB, we only
            return the alignment for one of the chains. If pdb_list is empty then the function defaults to the object's
            members.

            Returns a list of tuples (chain_id, sequence_alignment_printer_object). Each sequence_alignment_printer_object
            can be used to generate a printable version of the sequence alignment. '''

        if not pdb_list:
            pdb_list = self.pdb_names

        assert(len(set(pdb_list)) == len(pdb_list) and (len(pdb_list) > 1))
        assert(sorted(set(pdb_list).intersection(set(self.pdb_names))) == sorted(set(pdb_list)))

        primary_pdb = self.pdb_name_to_structure_mapping[pdb_list[0]]
        primary_pdb_name = pdb_list[0]
        primary_pdb_chains = sorted(primary_pdb.chain_atoms.keys())

        sequence_alignment_printer_objects = []
        for primary_pdb_chain in primary_pdb_chains:

            sa = SequenceAligner()

            # Add the primary PDB's sequence for the chain
            primary_pdb_sequence_type, primary_pdb_sequence = primary_pdb.get_annotated_chain_sequence_string(primary_pdb_chain, self.use_seqres_sequences_if_possible)
            sa.add_sequence('%s_%s' % (primary_pdb_name, primary_pdb_chain), str(primary_pdb_sequence))
            other_chain_types_and_sequences = {}
            for other_pdb_name in pdb_list[1:]:
                other_pdb = self.pdb_name_to_structure_mapping[other_pdb_name]
                other_chains = self.get_chain_mapping(primary_pdb_name, other_pdb_name).get(primary_pdb_chain)
                #other_chain = self.mapping[(primary_pdb_name, other_pdb_name)].get(primary_pdb_chain)
                if other_chains:
                    other_chain = sorted(other_chains)[0]
                    other_pdb_sequence_type, other_pdb_sequence = other_pdb.get_annotated_chain_sequence_string(other_chain, self.use_seqres_sequences_if_possible)
                    other_chain_types_and_sequences[other_pdb_name] = (other_pdb_sequence_type, other_pdb_sequence)
                    sa.add_sequence('%s_%s' % (other_pdb_name, other_chain), str(other_pdb_sequence))

            if len(sa.records) > 1:
                # If there are no corresponding sequences in any other PDB, do not return the non-alignment
                sa.align()

                #pdb1_alignment_str = sa._get_alignment_lines()['%s:%s' % (primary_pdb_name, pdb1_chain)]
                #pdb2_alignment_str = sa._get_alignment_lines()['%s:%s' % (pdb2_name, pdb2_chain)]

                sequence_names, sequences, sequence_tooltips = [], [], []

                sequence_names.append('%s_%s' % (primary_pdb_name, primary_pdb_chain))
                primary_pdb_alignment_lines = sa._get_alignment_lines()['%s_%s' % (primary_pdb_name, primary_pdb_chain)]
                sequences.append(primary_pdb_alignment_lines)
                sequence_tooltips.append(self.get_sequence_tooltips(primary_pdb, primary_pdb_sequence, primary_pdb_sequence_type, primary_pdb_name, primary_pdb_chain, primary_pdb_alignment_lines))
                for other_pdb_name in pdb_list[1:]:
                    #other_chain = self.mapping[(primary_pdb_name, other_pdb_name)].get(primary_pdb_chain)
                    other_pdb = self.pdb_name_to_structure_mapping[other_pdb_name]
                    other_chains = self.get_chain_mapping(primary_pdb_name, other_pdb_name).get(primary_pdb_chain)
                    if other_chains:
                        other_chain = sorted(other_chains)[0]
                        sequence_names.append('%s_%s' % (other_pdb_name, other_chain))
                        other_pdb_alignment_lines = sa._get_alignment_lines()['%s_%s' % (other_pdb_name, other_chain)]
                        sequences.append(other_pdb_alignment_lines)
                        other_pdb_sequence_type, other_pdb_sequence = other_chain_types_and_sequences[other_pdb_name]
                        sequence_tooltips.append(self.get_sequence_tooltips(other_pdb, other_pdb_sequence, other_pdb_sequence_type, other_pdb_name, other_chain, other_pdb_alignment_lines))

                sap = MultipleSequenceAlignmentPrinter(sequence_names, sequences, sequence_tooltips)
                sequence_alignment_printer_objects.append((primary_pdb_chain, sap))

        return sequence_alignment_printer_objects