docs: 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