Remove PDB disordered atoms

From Biopython
Revision as of 12:01, 16 July 2009 by Rcrehuet (Talk | contribs)
Jump to: navigation, search

Contributed by Ramon Crehuet


You have a PDB with disordered atoms, i.e. different atomic positions with occupancies that add up to 100%. From this PDB you want to create a new one having only one set of the disordered atoms. This can be necessary if you want to perform RMSD calculations or Molecular Dynamics simulations.


[|Bio.PDB] is proficient in dealing with disordered atoms. Each disordered atom has a property indicating its alternative positions: atom.altloc. Usually there are only two alternative positions labelled 'A' and 'B'. The key is to save a PDB with the optional "select" argument. This argument needs to return a True value for the atoms that have to be saved. In the following example we save all not-disordered atoms and the 'A' positions of the disordered ones.

from Bio.PDB import *
struct=parser.get_structure('my_pdb', 'my_pdb.pdb')
class NotDisordered(Select):
    def accept_atom(self, atom):
        if not atom.is_disordered():
            return True
        elif atom.get_altloc()=='A':
            return True
            return False
io.set_structure(s)"ordered.pdb", select=NotDisordered())


It is trivial to change that to save 'B' altloc positions. One can even do more complicated selections based on other atom properties. The key is to generate a class that returns True or False for a given atom. One could also think of deleting atoms with 'B' values in atom.altloc.

for atom in all_atoms:  # all_atoms is a list containg all atoms
   if atom.altloc=='B': del atom

but that does not work, because it only deletes the local variable and not the PDB structure.

Personal tools