I have a list of around 500 protein targets (human). I only have their protein symbols. As an example:


I want to get structural data (atomic coordinate) from PDB (Protein Data Bank) at once, either programmatically (Python or R) or with a web api. Do you know a clear step by step tutorial for this task or code example?

If that is not available, at least I need to find the PDB IDs of my list of protein symbols at once.


  • 2
    $\begingroup$ Biopython PDB is a good start together with associated documents. It is better to describe the list of proteins for a more detailed answer $\endgroup$
    – M__
    Sep 10, 2019 at 20:53
  • 1
    $\begingroup$ What do you mean by a "protein symbol"? $\endgroup$
    – jgreener
    Sep 10, 2019 at 21:12
  • $\begingroup$ I mean they are like gene symbols. For example, CXCR3, EGFR and so on. $\endgroup$
    – entropy
    Sep 10, 2019 at 21:23
  • $\begingroup$ I think I should have mentioned you @jgreener $\endgroup$
    – entropy
    Sep 10, 2019 at 23:38
  • 2
    $\begingroup$ Please edit your question and add a few lines of your input file with the list of proteins. That way, we can use that to test our answers and we can know what kind of IDs you have. Also, if all you have are things like CXCR3, so gene names and not protein IDs, we will need to know the species. $\endgroup$
    – terdon
    Sep 11, 2019 at 8:33

1 Answer 1


There is not a simple way and there are factor that you also need to consider before starting.

  1. Are you using gene names or gene accession numbers/id (NCBI/Uniprot)?
  2. If not, are the names the current standard ones (e.g. scraped names from old papers is a definite no)
  3. PDB residue index is rarely the same as protein index.
  4. Do you want a perfect match or do you want say 80% homology?
  5. Which PDBs do you want for a protein?

Personal example

For a website I have developed I have a route that gets all the PDBs for a given gene. (enter link description here). The way I did it is that I parsed Uniprot using a custom parser and made a dictionary/DB for each species with many synonyms for a gene going to a Uniprot ID and then from there I have another dictionary/DB that goes from Uniprot to PDBs if any. I went for Uniprot as I needed other data too (e.g. features) to present to the user. Including a renumbering option. All this is way overkill for what you need. However, if you specify the species I can easily share a JSON file online.


If point 3 is important and you have Uniprot IDs I would suggest going with SIFTs. It has the offsets and has mapping for Uniprot IDs (pdb_chain_uniprot.tsv).

Gene names

In terms of mapping gene names to NCBI/Uniprot/Ensembl IDs, there are mapping tables everywhere. But if you may have obscure synonyms, using the NCBI API is a good option. Uniprot data is better for protein and has PDB codes and chains, but the API gives a XML reply which is a bit annoying (I wrote a parser for it, but I think there was going to be one in Biopython).


If you would like homologues, say your organism is human and you are okay with mouse, you can either use the threaded SwissModel models or use the blast query in RCSB PDB (not the PDBe, which has better data normally) or NCBI set to PDB database. Swissmodel actually contains also PDB structures, so that may be a good starting point if your organism is one of those where precompiled exists.


Some proteins, especially mammalian are formed by separate domains linked together, especially the docking scaffolds. In which case you may care for a specific model within the gene, hence the indexing issue and the potential getting features. If you want a single PDB structure for each gene and do not care about the technical I have some Pymol-using py3 code to fuse models together with the N and C termini aligned on line. But I strongly discourage that and would argue for protein feature based routes.

  • $\begingroup$ Thanks for the suggestions. I get some more information but I think I could not get the specific answer. My main problem is this: I have my human protein targets (around 500) as gene names (like EGFR and so on). I also do not mind info from other species as I can input this species info into model as well. I want to develop ML model and predict compound hits for each protein if possible. For this, I need to have structural data for each protein. I want to be able to get it with an R or Python script of possible. If you know of such software or tutorial over a script, I would be glad to hear. $\endgroup$
    – entropy
    Oct 8, 2019 at 17:07
  • $\begingroup$ In which case. Download the Swiss-model collection and see if it suits. It runs off Uniprot IDs, so here is a JSON file, containing a dictionary with key=names and value=uniprot id. As mentioned the Swiss-model file contains both the renumbered structures and threaded structures (=close homologue structures converted to that species basically). $\endgroup$ Oct 9, 2019 at 8:21
  • $\begingroup$ In terms of your application, I am not sure what you mean by "compound hits". You mean epistatic mutations (i.e. one residue change alleviates the strain from another mutation) or is it a typo of compound het? I am assuming the former as the latter makes less sense. To calculate the ΔΔG (the energy of being folding) of a mutation you need forcefield calculations (I'd recommend looking into Rosetta pmut_scan as that has double mutations too. Not sure how ML fits in, but that is your remit. Although it does sound like Tom Blundell's SDM. $\endgroup$ Oct 9, 2019 at 8:30
  • $\begingroup$ I think the JSON file helps answering my question, thanks, and I will accept that. Regarding second comment, there may be a confusion. I am trying to find ligands that bind to my target proteins. $\endgroup$
    – entropy
    Oct 10, 2019 at 16:16
  • $\begingroup$ Ha. That's funny and awkward for me. I talk to folk doing Fragment based screening most days and they say compound hit all the time and I didn't click that it was that. Sorry. $\endgroup$ Oct 10, 2019 at 16:54

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.