Remove PDB disordered atoms

(Difference between revisions)
Jump to: navigation, search
Line 27: Line 27:
  
 
== Discussion ==
 
== Discussion ==
It is trivial to change that to save 'B' altloc positions. One can even do more complicated selections based on other atom propertied. The key is to generate a class that returns True or False for a given atom.  
+
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  
 
One could also think of  
 
Remark also that the apparently simple trick to delete atoms with 'B' values in atom.altloc  
 
Remark also that the apparently simple trick to delete atoms with 'B' values in atom.altloc  

Revision as of 15:42, 15 July 2009

Problem

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.

Solution

[|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 *
parser=PDBParser()
struct=parser.get_structure('my_pdb', 'my_pdb.pdb')
io=PDBIO()
 
class NotDisordered(Select):
    def accept_atom(self, atom):
        if not atom.is_disordered():
            return True
        elif atom.get_altloc()=='A':
            return True
        else:
            return False
 
io=PDBIO()
 
io.set_structure(s)
io.save("ordered.pdb", select=NotDisordered())

Discussion

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 Remark also that the apparently simple trick to delete atoms with 'B' values in atom.altloc

for atom in 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
Namespaces
Variants
Actions
Navigation
Toolbox