<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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