在 GitHub 上编辑此页面

使用 Bio.PDB 模块移除 PDB 无序原子。

贡献者: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”备选位置非常简单。你甚至可以根据其他原子属性进行更复杂的筛选。关键是生成一个类,该类对于给定原子返回TrueFalse。你也可以考虑删除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 结构本身。