openmm / pdbfixer

PDBFixer fixes problems in PDB files
Other
461 stars 115 forks source link

Fail to find missing residues on PDB retrieved from OPM database #183

Open ajsilveira opened 5 years ago

ajsilveira commented 5 years ago

Hi,

PDBFixer is not finding the missing residues in 3sy7.pdb as retrieved from the OPM database, while it did work for the 3sy7.pdb taken from the RCSB database. The SEQRES section is identical in both pdbs. I uploaded both files in https://gist.github.com/ajsilveira/8663ac3c1287e9d994c82fa0dd424b10

from pdbfixer import PDBFixer
from simtk.openmm.app import PDBFile
fixer = PDBFixer(filename='3sy7_rcsb.pdb')
fixer.findMissingResidues()
fixer.missingResidues
{(0, 31): ['GLY', 'LYS', 'SER', 'GLY', 'SER', 'GLY'], 
(0, 70): ['SER', 'ASP', 'LYS', 'THR', 'GLY', 'THR', 'GLY', 'ASN', 'LEU', 'PRO', 'VAL', 'MET', 'ASN', 'ASP', 'GLY', 'LYS', 'PRO', 'ARG'], 
(0, 135): ['GLY', 'LYS', 'GLU', 'PRO', 'THR', 'THR', 'VAL', 'LYS', 'SER', 'ARG', 'GLY'], (0, 251): ['ARG', 'ASN', 'GLY', 'SER'], 
(0, 382): ['GLY', 'HIS', 'HIS', 'HIS', 'HIS', 'HIS', 'HIS']}

When using the pdb retrieved from OPM, I get

from pdbfixer import PDBFixer
from simtk.openmm.app import PDBFile
fixer = PDBFixer(filename='3sy7_opm.pdb')
fixer.findMissingResidues()
fixer.missingResidues
{}
jchodera commented 5 years ago

The issue seems to be that, in the RCSB file, all the residues in chain A are amino acids from the one polypeptide chain. In the OPM file, C8E and HOH residues are added at the end of the same chain:

['ASP', 'ALA', 'PHE', 'VAL', 'SER', 'ASP', 'GLN', 'ALA', 'GLU', 'ALA', 'LYS', 'GLY', 'PHE', 'ILE', 'GLU', 'ASP', 'SER', 'SER', 'LEU', 'ASP', 'LEU', 'LEU', 'LEU', 'ARG', 'ASN', 'TYR', 'TYR', 'PHE', 'ASN', 'ARG', 'ASP', None, None, None, None, None, None, 'ASP', 'ARG', 'VAL', 'ASP', 'TRP', 'THR', 'GLN', 'GLY', 'PHE', 'LEU', 'THR', 'THR', 'TYR', 'GLU', 'SER', 'GLY', 'PHE', 'THR', 'GLN', 'GLY', 'THR', 'VAL', 'GLY', 'PHE', 'GLY', 'VAL', 'ASP', 'ALA', 'PHE', 'GLY', 'TYR', 'LEU', 'GLY', 'LEU', 'LYS', 'LEU', 'ASP', 'GLY', 'THR', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'ASP', 'ASP', 'TYR', 'SER', 'ARG', 'ALA', 'GLY', 'GLY', 'ALA', 'VAL', 'LYS', 'VAL', 'ARG', 'ILE', 'SER', 'LYS', 'THR', 'MET', 'LEU', 'LYS', 'TRP', 'GLY', 'GLU', 'MET', 'GLN', 'PRO', 'THR', 'ALA', 'PRO', 'VAL', 'PHE', 'ALA', 'ALA', 'GLY', 'GLY', 'SER', 'ARG', 'LEU', 'PHE', 'PRO', 'GLN', 'THR', 'ALA', 'THR', 'GLY', 'VAL', 'GLN', 'LEU', 'GLN', 'SER', 'SER', 'GLU', 'PHE', 'GLU', 'GLY', 'LEU', 'ASP', 'LEU', 'GLU', 'ALA', 'GLY', 'HIS', 'PHE', 'THR', 'GLU', None, None, None, None, None, None, None, None, None, None, None, 'GLU', 'LEU', 'TYR', 'ALA', 'THR', 'TYR', 'ALA', 'GLY', 'GLU', 'THR', 'ALA', 'LYS', 'SER', 'ALA', 'ASP', 'PHE', 'ILE', 'GLY', 'GLY', 'ARG', 'TYR', 'ALA', 'ILE', 'THR', 'ASP', 'ASN', 'LEU', 'SER', 'ALA', 'SER', 'LEU', 'TYR', 'GLY', 'ALA', 'GLU', 'LEU', 'GLU', 'ASP', 'ILE', 'TYR', 'ARG', 'GLN', 'TYR', 'TYR', 'LEU', 'ASN', 'SER', 'ASN', 'TYR', 'THR', 'ILE', 'PRO', 'LEU', 'ALA', 'SER', 'ASP', 'GLN', 'SER', 'LEU', 'GLY', 'PHE', 'ASP', 'PHE', 'ASN', 'ILE', 'TYR', 'ARG', 'THR', 'ASN', 'ASP', 'GLU', 'GLY', 'LYS', 'ALA', 'LYS', 'ALA', 'GLY', 'ASP', 'ILE', 'SER', 'ASN', 'THR', 'THR', 'TRP', 'SER', 'LEU', 'ALA', 'ALA', 'ALA', 'TYR', 'THR', 'LEU', 'ASP', 'ALA', 'HIS', 'THR', 'PHE', 'THR', 'LEU', 'ALA', 'TYR', 'GLN', 'LYS', 'VAL', 'HIS', 'GLY', 'ASP', 'GLN', 'PRO', 'PHE', 'ASP', 'TYR', 'ILE', 'GLY', 'PHE', 'GLY', None, None, None, None, 'GLY', 'ALA', 'GLY', 'GLY', 'ASP', 'SER', 'ILE', 'PHE', 'LEU', 'ALA', 'ASN', 'SER', 'VAL', 'GLN', 'TYR', 'SER', 'ASP', 'PHE', 'ASN', 'GLY', 'PRO', 'GLY', 'GLU', 'LYS', 'SER', 'TRP', 'GLN', 'ALA', 'ARG', 'TYR', 'ASP', 'LEU', 'ASN', 'LEU', 'ALA', 'SER', 'TYR', 'GLY', 'VAL', 'PRO', 'GLY', 'LEU', 'THR', 'PHE', 'MET', 'VAL', 'ARG', 'TYR', 'ILE', 'ASN', 'GLY', 'LYS', 'ASP', 'ILE', 'ASP', 'GLY', 'THR', 'LYS', 'MET', 'SER', 'ASP', 'ASN', 'ASN', 'VAL', 'GLY', 'TYR', 'LYS', 'ASN', 'TYR', 'GLY', 'TYR', 'GLY', 'GLU', 'ASP', 'GLY', 'LYS', 'HIS', 'HIS', 'GLU', 'THR', 'ASN', 'LEU', 'GLU', 'ALA', 'LYS', 'TYR', 'VAL', 'VAL', 'GLN', 'SER', 'GLY', 'PRO', 'ALA', 'LYS', 'ASP', 'LEU', 'SER', 'PHE', 'ARG', 'ILE', 'ARG', 'GLN', 'ALA', 'TRP', 'HIS', 'ARG', 'ALA', 'ASN', 'ALA', 'ASP', 'GLN', 'GLY', 'GLU', 'GLY', 'ASP', 'GLN', 'ASN', 'GLU', 'PHE', 'ARG', 'LEU', 'ILE', 'VAL', 'ASP', 'TYR', 'PRO', 'LEU', 'SER', 'ILE', 'LEU', 'GLY', None, None, None, None, None, None, None, 'C8E', 'C8E', 'C8E', 'C8E', 'C8E', 'C8E', 'C8E', 'C8E', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH', 'HOH']

As a result, pdbfixer can't align the SEQRES to the sequence found in the RCSB file. If you move the C8E and HOH residues to a different chain name, things work:

>>> from pdbfixer import PDBFixer
>>> from simtk.openmm.app import PDBFile
>>> fixer = PDBFixer(filename='3sy7_opm_newchains.pdb')
>>> fixer.findMissingResidues()
['ASP', 'ALA', 'PHE', 'VAL', 'SER', 'ASP', 'GLN', 'ALA', 'GLU', 'ALA', 'LYS', 'GLY', 'PHE', 'ILE', 'GLU', 'ASP', 'SER', 'SER', 'LEU', 'ASP', 'LEU', 'LEU', 'LEU', 'ARG', 'ASN', 'TYR', 'TYR', 'PHE', 'ASN', 'ARG', 'ASP', None, None, None, None, None, None, 'ASP', 'ARG', 'VAL', 'ASP', 'TRP', 'THR', 'GLN', 'GLY', 'PHE', 'LEU', 'THR', 'THR', 'TYR', 'GLU', 'SER', 'GLY', 'PHE', 'THR', 'GLN', 'GLY', 'THR', 'VAL', 'GLY', 'PHE', 'GLY', 'VAL', 'ASP', 'ALA', 'PHE', 'GLY', 'TYR', 'LEU', 'GLY', 'LEU', 'LYS', 'LEU', 'ASP', 'GLY', 'THR', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'ASP', 'ASP', 'TYR', 'SER', 'ARG', 'ALA', 'GLY', 'GLY', 'ALA', 'VAL', 'LYS', 'VAL', 'ARG', 'ILE', 'SER', 'LYS', 'THR', 'MET', 'LEU', 'LYS', 'TRP', 'GLY', 'GLU', 'MET', 'GLN', 'PRO', 'THR', 'ALA', 'PRO', 'VAL', 'PHE', 'ALA', 'ALA', 'GLY', 'GLY', 'SER', 'ARG', 'LEU', 'PHE', 'PRO', 'GLN', 'THR', 'ALA', 'THR', 'GLY', 'VAL', 'GLN', 'LEU', 'GLN', 'SER', 'SER', 'GLU', 'PHE', 'GLU', 'GLY', 'LEU', 'ASP', 'LEU', 'GLU', 'ALA', 'GLY', 'HIS', 'PHE', 'THR', 'GLU', None, None, None, None, None, None, None, None, None, None, None, 'GLU', 'LEU', 'TYR', 'ALA', 'THR', 'TYR', 'ALA', 'GLY', 'GLU', 'THR', 'ALA', 'LYS', 'SER', 'ALA', 'ASP', 'PHE', 'ILE', 'GLY', 'GLY', 'ARG', 'TYR', 'ALA', 'ILE', 'THR', 'ASP', 'ASN', 'LEU', 'SER', 'ALA', 'SER', 'LEU', 'TYR', 'GLY', 'ALA', 'GLU', 'LEU', 'GLU', 'ASP', 'ILE', 'TYR', 'ARG', 'GLN', 'TYR', 'TYR', 'LEU', 'ASN', 'SER', 'ASN', 'TYR', 'THR', 'ILE', 'PRO', 'LEU', 'ALA', 'SER', 'ASP', 'GLN', 'SER', 'LEU', 'GLY', 'PHE', 'ASP', 'PHE', 'ASN', 'ILE', 'TYR', 'ARG', 'THR', 'ASN', 'ASP', 'GLU', 'GLY', 'LYS', 'ALA', 'LYS', 'ALA', 'GLY', 'ASP', 'ILE', 'SER', 'ASN', 'THR', 'THR', 'TRP', 'SER', 'LEU', 'ALA', 'ALA', 'ALA', 'TYR', 'THR', 'LEU', 'ASP', 'ALA', 'HIS', 'THR', 'PHE', 'THR', 'LEU', 'ALA', 'TYR', 'GLN', 'LYS', 'VAL', 'HIS', 'GLY', 'ASP', 'GLN', 'PRO', 'PHE', 'ASP', 'TYR', 'ILE', 'GLY', 'PHE', 'GLY', None, None, None, None, 'GLY', 'ALA', 'GLY', 'GLY', 'ASP', 'SER', 'ILE', 'PHE', 'LEU', 'ALA', 'ASN', 'SER', 'VAL', 'GLN', 'TYR', 'SER', 'ASP', 'PHE', 'ASN', 'GLY', 'PRO', 'GLY', 'GLU', 'LYS', 'SER', 'TRP', 'GLN', 'ALA', 'ARG', 'TYR', 'ASP', 'LEU', 'ASN', 'LEU', 'ALA', 'SER', 'TYR', 'GLY', 'VAL', 'PRO', 'GLY', 'LEU', 'THR', 'PHE', 'MET', 'VAL', 'ARG', 'TYR', 'ILE', 'ASN', 'GLY', 'LYS', 'ASP', 'ILE', 'ASP', 'GLY', 'THR', 'LYS', 'MET', 'SER', 'ASP', 'ASN', 'ASN', 'VAL', 'GLY', 'TYR', 'LYS', 'ASN', 'TYR', 'GLY', 'TYR', 'GLY', 'GLU', 'ASP', 'GLY', 'LYS', 'HIS', 'HIS', 'GLU', 'THR', 'ASN', 'LEU', 'GLU', 'ALA', 'LYS', 'TYR', 'VAL', 'VAL', 'GLN', 'SER', 'GLY', 'PRO', 'ALA', 'LYS', 'ASP', 'LEU', 'SER', 'PHE', 'ARG', 'ILE', 'ARG', 'GLN', 'ALA', 'TRP', 'HIS', 'ARG', 'ALA', 'ASN', 'ALA', 'ASP', 'GLN', 'GLY', 'GLU', 'GLY', 'ASP', 'GLN', 'ASN', 'GLU', 'PHE', 'ARG', 'LEU', 'ILE', 'VAL', 'ASP', 'TYR', 'PRO', 'LEU', 'SER', 'ILE', 'LEU', 'GLY']
>>> fixer.missingResidues
{(0, 31): ['GLY', 'LYS', 'SER', 'GLY', 'SER', 'GLY'], (0, 70): ['SER', 'ASP', 'LYS', 'THR', 'GLY', 'THR', 'GLY', 'ASN', 'LEU', 'PRO', 'VAL', 'MET', 'ASN', 'ASP', 'GLY', 'LYS', 'PRO', 'ARG'], (0, 135): ['GLY', 'LYS', 'GLU', 'PRO', 'THR', 'THR', 'VAL', 'LYS', 'SER', 'ARG', 'GLY'], (0, 251): ['ARG', 'ASN', 'GLY', 'SER'], (0, 382): ['GLY', 'HIS', 'HIS', 'HIS', 'HIS', 'HIS', 'HIS']}

3sy7_opm_newchains.pdb.zip

ajsilveira commented 5 years ago

Thanks! Are you able to visualize correctly the secondary structure of that pdb with new chains?

jchodera commented 5 years ago

Yes! Though I would not recommend building N- and C-terminal residues, since they just stick into solvent: output.pdb.zip