Answers.Body: <h2>PDB file readability</h2>
  <p>It is a question of implementation.
  For example:</p>
  <pre class="lang-py prettyprint-override"><code>from rdkit import Chem
  
  mol = Chem.MolFromSmiles('[Og]')
  pdbblock = Chem.MolToPDBBlock(mol)
  
  import pymol2
  
  with pymol2.PyMOL() as pymol:
      pymol.cmd.read_pdbstr(pdbblock, 'Oganesson')
  </code></pre>
  <p>shows that both RDKit and PyMol can deal with oganesson.
  However, this is just handling the atoms in coordinate space. But as soon as we touch it in molecular mechanics way things blow up:</p>
  <pre class="lang-py prettyprint-override"><code>from rdkit.Chem import AllChem
  
  AllChem.EmbedMolecule(mol)  # UFFTYPER: Unrecognized atom type: Og (0)
  </code></pre>
  <p>But generally most molecular mechanics tools struggle with coordinated iron or similar. Take the mangled case of <a href="https://www.rcsb.org/ligand/SIR" rel="nofollow noreferrer">https://www.rcsb.org/ligand/SIR</a> which ought to have been planar...</p>
  <h2>PDB DB</h2>
  <p>In the PDB polymeric units and ligands are called chemical components.
  They have a 3 letter code. The list is easily parsable.
  The problem is that some lists are incomplete: <a href="https://ftp.ebi.ac.uk/pub/databases/pdb/data/component-models/complete/chem_comp_model.cif.gz" rel="nofollow noreferrer">https://ftp.ebi.ac.uk/pub/databases/pdb/data/component-models/complete/chem_comp_model.cif.gz</a>
  when read</p>
  <pre class="lang-py prettyprint-override"><code>from pdbecif.mmcif_tools import MMCIF2Dict
  models: dict = MMCIF2Dict().parse('chem_comp_model.cif')
  </code></pre>
  <p>has a large number of entries missing because of &lt;reasons&gt;.</p>
  <p>So using a more crude approach and simply querying component by component:</p>
  <pre class="lang-py prettyprint-override"><code>with open('chem_comp.list') as fh:  # this is from somewhere else in the ftp
      chem_resns = *map(str.strip, fh),
      
  import requests
  import re
  elements = set()
  for i in range(len(chem_resns)//100):
      response = requests.post('https://www.ebi.ac.uk/pdbe/api/pdb/compound/summary/', ','.join(list(mia)[100*i:100*(i+1)]))
      response.raise_for_status()
      for resn in response.json().values():
          for entry in resn:
              if entry['formula'] is None: # the unknown ligand/ions etc.
                  continue
              elements.update(re.findall('[^\d ]+', entry['formula']))
  </code></pre>
  <p>Gives the following elements that are present:</p>
  <pre><code>{'Ag',
   'Al',
   'Am',
   'Ar',
   'As',
   'Au',
   'B',
   'Ba',
   'Be',
   'Bi',
   'Br',
   'C',
   'Ca',
   'Cd',
   'Ce',
   'Cf',
   'Cl',
   'Cm',
   'Co',
   'Cr',
   'Cs',
   'Cu',
   'D',
   'Dy',
   'Er',
   'Eu',
   'F',
   'Fe',
   'Ga',
   'Gd',
   'H',
   'Hf',
   'Hg',
   'Ho',
   'I',
   'In',
   'Ir',
   'K',
   'Kr',
   'La',
   'Li',
   'Lu',
   'Mg',
   'Mn',
   'Mo',
   'N',
   'Na',
   'Nd',
   'Ni',
   'O',
   'Os',
   'P',
   'Pb',
   'Pd',
   'Pr',
   'Pt',
   'Pu',
   'Rb',
   'Re',
   'Rh',
   'Ru',
   'S',
   'Sb',
   'Sc',
   'Se',
   'Si',
   'Sm',
   'Sn',
   'Sr',
   'Ta',
   'Tb',
   'Te',
   'Th',
   'Ti',
   'Tl',
   'U',
   'V',
   'W',
   'X',
   'Xe',
   'Y',
   'Yb',
   'Zn',
   'Zr'}
  </code></pre>
  <p>While those that are absent are:</p>
  <pre class="lang-py prettyprint-override"><code>pt = Chem.GetPeriodicTable()
  full = set(map(pt.GetElementSymbol, range(1, 118+1)))
  missing = full - elements
  for m in sorted(missing, key=pt.GetAtomicNumber):
      print(pt.GetAtomicNumber(m), m)
  </code></pre>
  <pre><code>2 He
  10 Ne
  32 Ge
  41 Nb
  43 Tc
  61 Pm
  69 Tm
  84 Po
  85 At
  86 Rn
  87 Fr
  88 Ra
  89 Ac
  91 Pa
  93 Np
  97 Bk
  99 Es
  100 Fm
  101 Md
  102 No
  103 Lr
  104 Rf
  105 Db
  106 Sg
  107 Bh
  108 Hs
  109 Mt
  110 Ds
  111 Rg
  112 Cn
  113 Nh
  114 Fl
  115 Mc
  116 Lv
  117 Ts
  118 Og
  </code></pre>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2022-06-29T17:28:41.850Z
Answers.LastActivityDate: 2022-06-30T19:42:22.480Z
Answers.LastEditDate: 2022-06-30T19:42:22.480Z
Answers.UserDisplayName: Matteo Ferla
Body: <p>I am developing an educational Bioinformatics framework, I need to know</p>
  <ul>
  <li>Which atoms are absolutely not found in any PDB files?</li>
  </ul>
  <p>in the following list -</p>
  <ul>
  <li><a href="https://en.wikipedia.org/wiki/Atomic_radii_of_the_elements_(data_page)" rel="nofollow noreferrer">Atomic radii of the elements (data page)</a></li>
  </ul>
  
Tags: <pdb>
Title: Which atoms are not found in protein PDB files?
ThreadText: # Which atoms are not found in protein PDB files?
  
  (Asked by: username_0 on 2022-06-29)
  
  I am developing an educational Bioinformatics framework, I need to know
  
  * Which atoms are absolutely not found in any PDB files?
  
  in the following list -
  
  * [Atomic radii of the elements (data page)](https://en.wikipedia.org/wiki/Atomic_radii_of_the_elements_(data_page))
  
  **Tags:** pdb
  
  
  ---
  
  ## 1 answers
  
  ### Answer by username_1 on 2022-06-29. Score: 4 | Accepted answer
  
  ## PDB file readability
  
  It is a question of implementation.
  For example:
  
  ```py
  from rdkit import Chem
  
  mol = Chem.MolFromSmiles('[Og]')
  pdbblock = Chem.MolToPDBBlock(mol)
  
  import pymol2
  
  with pymol2.PyMOL() as pymol:
      pymol.cmd.read_pdbstr(pdbblock, 'Oganesson')
  
  ```
  
  shows that both RDKit and PyMol can deal with oganesson.
  However, this is just handling the atoms in coordinate space. But as soon as we touch it in molecular mechanics way things blow up:
  
  ```py
  from rdkit.Chem import AllChem
  
  AllChem.EmbedMolecule(mol)  # UFFTYPER: Unrecognized atom type: Og (0)
  
  ```
  
  But generally most molecular mechanics tools struggle with coordinated iron or similar. Take the mangled case of <https://www.rcsb.org/ligand/SIR> which ought to have been planar...
  
  ## PDB DB
  
  In the PDB polymeric units and ligands are called chemical components.
  They have a 3 letter code. The list is easily parsable.
  The problem is that some lists are incomplete: <https://ftp.ebi.ac.uk/pub/databases/pdb/data/component-models/complete/chem_comp_model.cif.gz>
  when read
  
  ```py
  from pdbecif.mmcif_tools import MMCIF2Dict
  models: dict = MMCIF2Dict().parse('chem_comp_model.cif')
  
  ```
  
  has a large number of entries missing because of <reasons>.
  
  So using a more crude approach and simply querying component by component:
  
  ```py
  with open('chem_comp.list') as fh:  # this is from somewhere else in the ftp
      chem_resns = *map(str.strip, fh),
      
  import requests
  import re
  elements = set()
  for i in range(len(chem_resns)//100):
      response = requests.post('https://www.ebi.ac.uk/pdbe/api/pdb/compound/summary/', ','.join(list(mia)[100*i:100*(i+1)]))
      response.raise_for_status()
      for resn in response.json().values():
          for entry in resn:
              if entry['formula'] is None: # the unknown ligand/ions etc.
                  continue
              elements.update(re.findall('[^\d ]+', entry['formula']))
  
  ```
  
  Gives the following elements that are present:
  
  ```
  {'Ag',
   'Al',
   'Am',
   'Ar',
   'As',
   'Au',
   'B',
   'Ba',
   'Be',
   'Bi',
   'Br',
   'C',
   'Ca',
   'Cd',
   'Ce',
   'Cf',
   'Cl',
   'Cm',
   'Co',
   'Cr',
   'Cs',
   'Cu',
   'D',
   'Dy',
   'Er',
   'Eu',
   'F',
   'Fe',
   'Ga',
   'Gd',
   'H',
   'Hf',
   'Hg',
   'Ho',
   'I',
   'In',
   'Ir',
   'K',
   'Kr',
   'La',
   'Li',
   'Lu',
   'Mg',
   'Mn',
   'Mo',
   'N',
   'Na',
   'Nd',
   'Ni',
   'O',
   'Os',
   'P',
   'Pb',
   'Pd',
   'Pr',
   'Pt',
   'Pu',
   'Rb',
   'Re',
   'Rh',
   'Ru',
   'S',
   'Sb',
   'Sc',
   'Se',
   'Si',
   'Sm',
   'Sn',
   'Sr',
   'Ta',
   'Tb',
   'Te',
   'Th',
   'Ti',
   'Tl',
   'U',
   'V',
   'W',
   'X',
   'Xe',
   'Y',
   'Yb',
   'Zn',
   'Zr'}
  
  ```
  
  While those that are absent are:
  
  ```py
  pt = Chem.GetPeriodicTable()
  full = set(map(pt.GetElementSymbol, range(1, 118+1)))
  missing = full - elements
  for m in sorted(missing, key=pt.GetAtomicNumber):
      print(pt.GetAtomicNumber(m), m)
  
  ```
  
  ```
  2 He
  10 Ne
  32 Ge
  41 Nb
  43 Tc
  61 Pm
  69 Tm
  84 Po
  85 At
  86 Rn
  87 Fr
  88 Ra
  89 Ac
  91 Pa
  93 Np
  97 Bk
  99 Es
  100 Fm
  101 Md
  102 No
  103 Lr
  104 Rf
  105 Db
  106 Sg
  107 Bh
  108 Hs
  109 Mt
  110 Ds
  111 Rg
  112 Cn
  113 Nh
  114 Fl
  115 Mc
  116 Lv
  117 Ts
  118 Og
  
  ```
  
  
  ---
  
  