贡献者:Ramon Crehuet
你有一个包含无序原子的 PDB 文件,即具有不同原子位置和占有率的原子,占有率之和为 100%。你想从这个 PDB 文件创建一个新的 PDB 文件,其中只包含一组无序原子。这对于执行 RMSD 计算或分子动力学模拟来说可能是必要的。
Bio.PDB
擅长处理无序原子。每个无序原子都具有一个属性来指示其备选位置:atom.altloc
。通常只有两个标记为“A”和“B”的备选位置。关键是使用可选的select
参数保存 PDB 文件。此参数需要对要保存的原子返回一个True
值。在以下示例中,我们保存了所有非无序原子和无序原子的“A”位置。
from Bio.PDB import *
parser = PDBParser()
s = parser.get_structure("my_pdb", "my_pdb.pdb")
io = PDBIO()
class NotDisordered(Select):
def accept_atom(self, atom):
return not atom.is_disordered() or atom.get_altloc() == "A"
io = PDBIO()
io.set_structure(s)
io.save("ordered.pdb", select=NotDisordered())
请注意,上面的代码不会删除备选位置标识符(示例中为“A”)。程序员有责任在必要时删除标识符。
keepAltID = ...
class NMROutputSelector2(Select): # Inherit methods from Select class
def accept_atom(self, atom):
if (not atom.is_disordered()) or atom.get_altloc() == keepAltID:
atom.set_altloc(" ") # Eliminate alt location ID before output.
return True
else: # Alt location was not one to be output.
return False
# end of accept_atom()
# end of NMROutputSelector2()
将其更改为保存“B”备选位置非常简单。你甚至可以根据其他原子属性进行更复杂的筛选。关键是生成一个类,该类对于给定原子返回True
或False
。你也可以考虑删除atom.altloc
中具有“B”值的原子。
# Will not work!
for atom in all_atoms: # all_atoms is a list containg all atoms
if atom.altloc == "B":
del atom
但这不起作用,因为它只删除了局部变量,而不是 PDB 结构本身。