在 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」altloc 位置很簡單。甚至可以基於其他原子屬性進行更複雜的選擇。關鍵是產生一個為給定原子返回 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 結構。