docs: def map_uniprot_to_pdb(self, seq_ident_cutoff=0.0, outdir=None, force_rerun=False):
          """Map the representative sequence's UniProt ID to PDB IDs using the PDBe "Best Structures" API.
          Will save a JSON file of the results to the protein 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
  
          """
          if not self.representative_sequence:
              log.error('{}: no representative sequence set, cannot use best structures API'.format(self.id))
              return None
  
          # Check if a UniProt ID is attached to the representative sequence
          uniprot_id = self.representative_sequence.uniprot
          if not uniprot_id:
              log.error('{}: no representative UniProt ID set, cannot use best structures API'.format(self.id))
              return None
  
          if '-' in uniprot_id:
              log.debug('{}: "-" detected in UniProt ID, isoform specific sequences are ignored with best structures API'.format(self.id))
              uniprot_id = uniprot_id.split('-')[0]
  
          if not outdir:
              outdir = self.sequence_dir
              if not outdir:
                  raise ValueError('Output directory must be specified')
  
          best_structures = ssbio.databases.pdb.best_structures(uniprot_id,
                                                                outname='{}_best_structures'.format(custom_slugify(uniprot_id)),
                                                                outdir=outdir,
                                                                seq_ident_cutoff=seq_ident_cutoff,
                                                                force_rerun=force_rerun)
  
          new_pdbs = []
          if best_structures:
              rank = 1
              for best_structure in best_structures:
                  currpdb = str(best_structure['pdb_id'].lower())
                  new_pdbs.append(currpdb)
                  currchain = str(best_structure['chain_id'])
  
                  # load_pdb will append this protein to the list
                  new_pdb = self.load_pdb(pdb_id=currpdb, mapped_chains=currchain)
  
                  # Also add this chain to the chains attribute so we can save the
                  # info we get from best_structures
                  new_pdb.add_chain_ids(currchain)
  
                  pdb_specific_keys = ['experimental_method', 'resolution']
                  chain_specific_keys = ['coverage', 'start', 'end', 'unp_start', 'unp_end']
  
                  new_pdb.update(best_structure, only_keys=pdb_specific_keys)
                  new_chain = new_pdb.chains.get_by_id(currchain)
                  new_chain.update(best_structure, only_keys=chain_specific_keys)
                  new_chain.update({'rank': rank})
  
                  rank += 1
  
              log.debug('{}, {}: {} PDB/chain pairs mapped'.format(self.id, uniprot_id, len(best_structures)))
          else:
              log.debug('{}, {}: no PDB/chain pairs mapped'.format(self.id, uniprot_id))
  
          return new_pdbs