<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def make_pdb(self, ligands=True, alt_states=False, pseudo_group=False, header=True, footer=True):
 """Generates a PDB string for the Assembly. Parameters ligands : bool, optional If `True`, will include ligands in the output. alt_states : bool, optional If `True`, will include alternate conformations in the output. pseudo_group : bool, optional If `True`, will include pseudo atoms in the output. header : bool, optional If `True` will write a header for output. footer : bool, optional If `True` will write a footer for output. Returns ------- pdb_str : str String of the pdb for the Assembly. Generated by collating Polymer().pdb calls for the component Polymers. """

        base_filters = dict(ligands=ligands, pseudo_group=pseudo_group)
        restricted_mol_types = [x[0] for x in base_filters.items() if not x[1]]
        in_groups = [x for x in self.filter_mol_types(restricted_mol_types)]

        pdb_header = 'HEADER {:<80}\n'.format(
            'ISAMBARD Model {}'.format(self.id)) if header else ''
        pdb_body = ''.join([x.make_pdb(
            alt_states=alt_states, inc_ligands=ligands) + '{:<80}\n'.format('TER') for x in in_groups])
        pdb_footer = '{:<80}\n'.format('END') if footer else ''
        pdb_str = ''.join([pdb_header, pdb_body, pdb_footer])
        return pdb_str