docs: def pdb_downloader_and_metadata(self, outdir=None, pdb_file_type=None, force_rerun=False):
          """Download ALL mapped experimental structures to the protein structures directory.
  
          Args:
              outdir (str): Path to output directory, if protein structures directory not set or other output directory is
                  desired
              pdb_file_type (str): Type of PDB file to download, if not already set or other format is desired
              force_rerun (bool): If files should be re-downloaded if they already exist
  
          Returns:
              list: List of PDB IDs that were downloaded
  
          Todo:
              * Parse mmtf or PDB file for header information, rather than always getting the cif file for header info
  
          """
          if not outdir:
              outdir = self.structure_dir
              if not outdir:
                  raise ValueError('Output directory must be specified')
  
          if not pdb_file_type:
              pdb_file_type = self.pdb_file_type
  
          # Check if we have any PDBs
          if self.num_structures_experimental == 0:
              log.debug('{}: no structures available - nothing will be downloaded'.format(self.id))
              return
  
          downloaded_pdb_ids = []
          # Download the PDBs
          for s in self.get_experimental_structures():
              log.debug('{}: downloading structure file from the PDB...'.format(s.id))
              s.download_structure_file(outdir=outdir, file_type=pdb_file_type, force_rerun=force_rerun, load_header_metadata=True)
              downloaded_pdb_ids.append(s.id)
  
          return downloaded_pdb_ids