docs: def map_uniprot_to_pdb(self, seq_ident_cutoff=0.0, outdir=None, force_rerun=False):
          """Map all representative sequences' UniProt ID to PDB IDs using the PDBe "Best Structures" API.
          Will save a JSON file of the results to each protein's ``sequences`` folder.
  
          The "Best structures" API is available at https://www.ebi.ac.uk/pdbe/api/doc/sifts.html
          The list of PDB structures mapping to a UniProt accession sorted by coverage of the protein and,
          if the same, resolution.
  
          Args:
              seq_ident_cutoff (float): Sequence identity cutoff in decimal form
              outdir (str): Output directory to cache JSON results of search
              force_rerun (bool): Force re-downloading of JSON results if they already exist
  
          Returns:
              list: A rank-ordered list of PDBProp objects that map to the UniProt ID
  
          """
  
          # First get all UniProt IDs and check if they have PDBs
          all_representative_uniprots = []
          for g in self.genes_with_a_representative_sequence:
              uniprot_id = g.protein.representative_sequence.uniprot
              if uniprot_id:
                  # TODO: add warning or something for isoform ids?
                  if '-' in uniprot_id:
                      uniprot_id = uniprot_id.split('-')[0]
                  all_representative_uniprots.append(uniprot_id)
          log.info('Mapping UniProt IDs --> PDB IDs...')
          uniprots_to_pdbs = bs_unip.mapping(fr='ACC', to='PDB_ID', query=all_representative_uniprots)
  
          counter = 0
          # Now run the best_structures API for all genes
          for g in tqdm(self.genes_with_a_representative_sequence):
              uniprot_id = g.protein.representative_sequence.uniprot
              if uniprot_id:
                  if '-' in uniprot_id:
                      uniprot_id = uniprot_id.split('-')[0]
                  if uniprot_id in uniprots_to_pdbs:
                      best_structures = g.protein.map_uniprot_to_pdb(seq_ident_cutoff=seq_ident_cutoff, outdir=outdir, force_rerun=force_rerun)
                      if best_structures:
                          counter += 1
                          log.debug('{}: {} PDBs mapped'.format(g.id, len(best_structures)))
                  else:
                      log.debug('{}, {}: no PDBs available'.format(g.id, uniprot_id))
  
          log.info('{}/{}: number of genes with at least one experimental structure'.format(len(self.genes_with_experimental_structures),
                                                                                            len(self.genes)))
          log.info('Completed UniProt --> best PDB mapping. See the "df_pdb_ranking" attribute for a summary dataframe.')