PDBFixer进行分子动力学模拟前处理

在分子动力学模拟之前,通常需要对蛋白的结构进行预处理,如补全残基等。使用斯坦福大学 Pande 课题组的小工具 PDBFixer 便能通过 GUI 或者命令行轻松解决这一问题。

PDBFixer 能够解决的问题包括:

  • 添加缺失的重原子
  • 添加缺失的氢原子
  • 添加缺失的 loop
  • 将非标准残基转换为对应的标准残基
  • 对于某些原子,选择多个备选位置中的一个位置
  • 删除不需要的蛋白质链
  • 删除不需要的 heterogens
  • 添加水盒子和离子

Notes:

  • 补全 loop 时,缺失的残基序列是从 pdb 文件开头的 SEQRES records 中获取
  • fixer.replaceNonstandardResidues() 用来突变氨基酸

安装

PDBFixer 可以通过 Omnia 套件进行安装,自动安装其它依赖条件。例如:

# Add conda-forge and omnia to your channel list
conda config --add channels omnia --add channels conda-forge
# Install the 'pdbfixer' a package
conda install pdbfixer

简单使用

PDBFixer 具有 GUI, Command Line 和 Python API 三种使用模式。

GUI 操作

在终端中输入 pdbfixer, 然后在浏览器中打开 http://localhost:8000 。之后按照提示进行操作即可。默认输出文件为 output.pdb

Command Line 操作

PDBFixer 也可以通过命令行进行操作,但部分功能受限。当在终端中输入 pdbfixer 且带有任意选项或参数,即可使用命令行形式。

pdbfixer --help

Usage: pdbfixer
       pdbfixer [options] filename

Options:
  -h, --help            show this help message and exit
  --pdbid=PDBID         PDB id to retrieve from RCSB [default: None]
  --url=URL             URL to retrieve PDB from [default: None]
  --output=FILENAME     output pdb file [default: output.pdb]
  --add-atoms=ATOMS     which missing atoms to add: all, heavy, hydrogen, or
                        none [default: all]
  --keep-heterogens=OPTION
                        which heterogens to keep: all, water, or none
                        [default: all]
  --replace-nonstandard
                        replace nonstandard residues with standard equivalents
  --add-residues        add missing residues
  --water-box=X Y Z     add a water box. The value is the box dimensions in nm
                        [example: --water-box=2.5 2.4 3.0]
  --ph=PH               the pH to use for adding missing hydrogens [default:
                        7.0]
  --positive-ion=ION    positive ion to include in the water box: Cs+, K+,
                        Li+, Na+, or Rb+ [default: Na+]
  --negative-ion=ION    negative ion to include in the water box: Cl-, Br-,
                        F-, or I- [default: Cl-]
  --ionic-strength=STRENGTH
                        molar concentration of ions to add to the water box
                        [default: 0.0]
pdbfixer myfile.pdb --keep-heterogens=water --replace-nonstandard --water-box=4.0 4.0 3.0

以上命令会自动为输入文件添加缺失的氢原子和重原子(但不会添加缺失的残基),加氢使用默认的 pH 7.0。如果文件中包含非标准氨基酸或核酸,会转换为最接近的标准氨基酸。文件中的水分子会保留,而其它杂原子将会被清除。最后,会输出文件 ‘output.pdb’。
--add-residues选项会依据初始pdb中的SEQRES 字段来补全缺失的残基,故可以在此SEQRES字段中增加或减少残基来确定 —add-residues 参数要添加哪些残基。

Python API 操作

这种方式是 PDBFixer 最为复杂也是功能最为完善同时也便于控制每一个细节的使用方式。
PDBFixer 基于 OpenMM,同时也使用它的 API。所以最好是提前了解 OpenMM 的 API。(然而并不了解,那就先强学一波… )
主要流程为导入结构,进行处理,之后再保存结构。所以脚本的框架为:

from pdbfixer import PDBFixer
from simtk.openmm.app import PDBFile

fixer = PDBFixer(filename='myfile.pdb')
# ...
# Call various methods on the PDBFixer
# ...
PDBFile.writeFile(fixer.topology, fixer.positions, open('output.pdb', 'w'))

Notes:

  • 以下所列处理步骤并不全是必需的,可以选用部分步骤。
  • 不能改变这些步骤的顺序!

Remove Chains

fixer.remove(indices)

indices 为欲移除的链,是一个列表。

Identify Missing Residues

fixer.findMissingResidues()    # 确定缺失的残基(从 pdb 文件开头的 SEQRES records 中获取) 

结果保存在 missingResidues,为一个字典,字典的 key 为一个 tuple,包含链的 index,缺失残基在此链中应插入位置的index(会在这个 index 之前进行插入)。对应的 value 是一个列表,包含缺失残基的 name。

此后,可以通过修改这个字典的内容来指定插入残基的名称。比如,可以通过删除一条记录来表明不添加这个残基。如果不希望添加任何残基,只需:

fixer.missingResidues = {}

缺失的残基会在调用 addMissingAtoms() 之后才进行添加。

Replace Nonstandard Residues

fixer.findNonstandardResidues()
fixer.replaceNonstandardResidues()

findNonstandardResidues() 会将结果保存在 nonstandardResidues field(一个列表)。每一条记录都是一个 tuple,其第一个元素是一个 Residue object,第二个元素是替换之后的 Residue name。我们也可以修改这个列表。
比如,如果不希望某个非标准氨基酸被替换,只需要修改其对应的目标氨基酸即可。同理,我们也可以突变其它的氨基酸。

Remove Heterogens

fixer.removeHeterogens(False)

参数 False 表示移除包括水在内的所有杂原子, True 表示保留水但移除其它所有杂原子。

Add Missing Heavy Atoms

fixer.findMissingAtoms()
fixer.addMissingAtoms()

findMissingAtoms() 确定所有缺失的重原子,然后保存在 missingAtoms 和 missingTerminals 中。二者的类型都是字典,key 是 Residue objects,value 是 atom names 构成的列表。  

missingAtoms 包括在标准氨基酸中应当存在的原子,missingTerminals 包含在端基中应当存在的原子,可以在 addMissingAtoms() 可以进行修改。

addMissingAtoms() 调用之后,会添加之前确定的所有重原子,包括 findMissingAtoms() 和 findMissingResidues() 所确定的。
此外,当你调用 replaceNonstandardResidues() 的时候,只是删去了不属于目标残基的原子,并没有实时添加新的原子。只有在调用 addMissingAtoms() 之后才会真正的进行添加。

Add Missing Hydrogens

fixer.addMissingHydrogens(7.0)

会基于对应的 pH 值来进行质子化。

Add Water

addSolvent()    # 添加水盒子 

addSolvent(self, boxSize, positiveIon='Na+', negativeIon='Cl-', ionicStrength=0*molar)    # 完整调用 

boxSize 是一个 Vec3 object,用来指定水盒子的维度。阳离子和阴离子分别包括Cs+, K+, Li+, Na+, and Rb+; Cl-, Br-, F-, and I-

fixer.addSolvent(Vec3(5, 5, 5)*nanometer, positiveIon='K+', ionicStrength=0.1*molar) # builds a 5 nm cube of 0.1 molar potassium chloride:

Examples

添加所有缺失的原子(包括缺失的重原子,缺失的残基,和氢原子),将非标准氨基酸全部替换为对应的标准氨基酸,然后删去除了水以外的所有杂原子。再添加与 crystallographic unit cell 匹配的水盒子。最后,保存为 output.pdb:

from pdbfixer import PDBFixer
from simtk.openmm.app import PDBFile

fixer = PDBFixer(filename='myfile.pdb')
fixer.findMissingResidues()
fixer.findNonstandardResidues()
fixer.replaceNonstandardResidues()
fixer.removeHeterogens(True)
fixer.findMissingAtoms()
fixer.addMissingAtoms()
fixer.addMissingHydrogens(7.0)
fixer.addSolvent(fixer.topology.getUnitCellDimensions())
PDBFile.writeFile(fixer.topology, fixer.positions, open('output.pdb', 'w'))

只保留第一条链,删除其它所有链:

fixer = PDBFixer(filename='myfile.pdb')
numChains = len(list(fixer.topology.chains()))
fixer.removeChains(range(1, numChains))
fixer.findMissingResidues()

只添加链中间缺失的残基,而不添加链两端缺失的残基。通过在调用 findMissingResidues() 之后修改 missingResidues 来实现:

fixer.findMissingResidues()
chains = list(fixer.topology.chains())
keys = fixer.missingResidues.keys()
for key in keys:
    chain = chains[key[0]]
    if key[1] == 0 or key[1] == len(list(chain.residues())):
        del fixer.missingResidues[key]
fixer.findNonstandardResidues()

不添加与 crystallographic unit cell 相匹配的水盒子,而是添加足够大的水盒子。比如,先计算蛋白在每个坐标轴上的投影,设置盒子的长度与最大的投影一致:

fixer.addMissingHydrogens(7.0)
maxSize = max(max((pos[i] for pos in fixer.positions))-min((pos[i] for pos in fixer.positions)) for i in range(3))
boxSize = maxSize*Vec3(1, 1, 1)
fixer.addSolvent(boxSize)
PDBFile.writeFile(fixer.topology, fixer.positions, open('output.pdb', 'w'))

将所有非标准氨基酸突变为丙氨酸:

fixer.findNonstandardResidues()
fixer.nonstandardResidues = [(residue, 'ALA') for residue, replacement in fixer.nonstandardResidues]
fixer.replaceNonstandardResidues()

Others

###################################
fixer.sequences                  

fixer.templates     

fixer.source

fixer.topology  
fixer.positions 

##########
fixer.removeChains() 

fixer.findMissingResidues()  
fixer.missingResidues  

fixer.findNonstandardResidues()     
fixer.nonstandardResidues   
fixer.replaceNonstandardResidues()

fixer.modifiedResidues 
fixer.applyMutations  


fixer.removeHeterogens()   


fixer.findMissingAtoms()  
fixer.missingAtoms                 
fixer.missingTerminals
fixer.addMissingAtoms()   

fixer.addMissingHydrogens()  

fixer.addSolvent()   
###################################

Ref: