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