第2章 输入文件准备:受体与配体结构文件格式(PDBQT)

做分子对接,第一步不是点开Vina就开始跑。

真正的工作,从准备输入文件开始。我见过太多新手——甚至一些老手——直接把PDB丢进Vina,然后对着报错日志发呆。说白了,Vina不认识普通PDB,它只吃PDBQT。

PDBQT是什么?就是在PDB基础上加了三点东西:原子类型(AutoDook类型)、电荷、还有扭转信息。受体不需要扭转,配体必须要有可旋转键的标记。没有这些,Vina没法算。

这一章,咱们把格式讲透,把转换工具用熟。你准备好了吗?

2.1 PDBQT 与普通 PDB 的核心差异

先看一张表,一目了然:

项目 普通PDB PDBQT
原子类型 元素名(C,N,O,S) AutoDook原子类型(C.3,N.3,O.3等)
电荷 无(可选放B-factor列) 第10列写入Gasteiger电荷
扭转信息 无 配体记录可旋转键(ROOT/BRANCH/END)
氢原子 通常省略或部分 明确添加极性氢
适用场景 可视化、分子动力学 对接、柔性侧链扫描

一句话记住:Vina只看PDBQT。没有准备就运行,报错是必然的。

2.2 受体 PDBQT 的准备:坐标 + 氢 + 电荷

受体的PDBQT相对简单。它不需要描述可旋转键,但必须包含所有非极性氢和完整的电荷。

我个人的习惯是:先用原始PDB做一次结构检查,去掉溶剂分子、配体、离子(除非你特意保留)。然后加氢、分配电荷、最后导出PDBQT。

为什么强调加氢?因为对接时,氢键的方向性非常重要。Vina算力不低,但你不能指望它自己猜出氢在哪。

2.2.1 使用 AutoDock Tools (ADT) 准备受体

ADT是图形界面的主力。步骤如下:

  1. 打开ADT,读入受体PDB:File → Read Molecule。
  2. 删除水和其他非标准残基:Edit → Delete → Delete Water,再手动删掉配体。
  3. 加氢:Edit → Hydrogens → Add → All Hydrogens。
  4. 分配电荷:Edit → Charges → Compute Gasteiger。
  5. 设定原子类型(ADT自动完成):Edit → Atoms → Assign AD4 type。
  6. 保存为PDBQT:File → Save → Write PDBQT。
# 命令行状态下,你也可以用prepare_receptor4.py(来自ADFR Suite)
# 假设我们有一个受体 1n1l_protein.pdb
prepare_receptor4.py -r 1n1l_protein.pdb -o 1n1l_protein.pdbqt -A checkhydrogens

我曾经踩过的坑:用ADT自动加氢时,如果不先删除水,水分子上的氢会混在受体里,导致对接时多出一堆假氢键。后来我养成习惯——先删水,再加氢。

2.2.2 使用 OpenBabel 准备受体(快速但有限)

OpenBabel也可以做加氢和导出PDBQT,但 原子类型和电荷分配的精度不如ADT。我建议只在大规划批量处理时用它做初步准备,最终还应该用ADT校准一次。

# OpenBabel 转换代码(加氢 + 导出pdbqt)
obabel 1n1l_protein.pdb -O 1n1l_protein.pdbqt -xh --partialcharge gasteiger

参数说明:-xh 加氢,--partialcharge gasteiger 计算Gasteiger电荷。

2.3 配体 PDBQT 的准备:扭转信息是关键

配体的PDBQT比受体复杂。它不仅要有正确的原子类型和电荷,还必须描述 可旋转键(ROOT, BRANCH, END)。Vina通过这个信息知道哪些键可以旋转,从而进行构象搜索。

没有扭转信息的配体PDBQT,Vina只会把它当刚体处理——那就失去对接的意义了。

2.3.1 使用 ADT 准备配体

  1. 打开ADT,读入配体分子(MOL2/SDF/PDB格式都行)。
  2. 检测扭转:Ligand → Torsion Tree → Detect Root。ADT会自动找最合适的根原子。
  3. 设定可旋转键(通常保持ADT自动检测的结果即可):Ligand → Torsion Tree → Choose Torsions。
  4. 加氢和电荷:Edit → Hydrogens → Add → All Hydrogens,Edit → Charges → Compute Gasteiger。
  5. 保存PDBQT:Ligand → Output → Save as PDBQT。
# 命令行准备配体(prepare_ligand4.py)
prepare_ligand4.py -l ligand.mol2 -o ligand.pdbqt -B frag

小技巧:配体文件最好用MOL2格式,因为它自带原子类型和连接表,ADT转换时更容易保留电荷。PDB格式没有连接表,容易丢失环信息。

2.3.2 使用 OpenBabel 准备配体(需手动确认扭转)

OpenBabel也能用,但生成的PDBQT有时候会把环上的单键也算作可旋转键——这会导致非常离谱的对接结果。我建议你用OpenBabel转换后,用文本编辑器打开PDBQT检查“ROOT”和“BRANCH”段是否合理。

# OpenBabel 配体转换(先加氢,再输出pdbqt)
obabel ligand.sdf -O ligand.pdbqt -xh --partialcharge gasteiger

转换完成后,用grep快速检查扭转数量:

grep -c "BRANCH" ligand.pdbqt

如果BRANCH段数远多于你预期的可旋转键数量(比如一个苯环有6个BRANCH),说明默认检测把环内单键错判了。此时应该回到ADT重新处理。

2.4 PDBQT 文件结构示意

看一个实际的配体PDBQT片段,理解它的结构:

ROOT
ATOM      1  C1  LIG     1       2.345   3.456   4.567  0.00  0.00   0.000 C.3
ATOM      2  C2  LIG     1       2.567   3.678   4.789  0.00  0.00   0.000 C.3
ATOM      3  C3  LIG     1       2.789   3.890   4.901  0.00  0.00   0.000 C.3
ENDROOT
BRANCH   1   4
ATOM      4  C4  LIG     1       2.901   4.012   5.123  0.00  0.00   0.000 C.3
ATOM      5  C5  LIG     1       3.123   4.234   5.345  0.00  0.00   0.000 C.3
ENDBRANCH
BRANCH   1   6
ATOM      6  O1  LIG     1       2.123   3.234   4.456  0.00  0.00  -0.350 O.3
ENDBRANCH

这里ROOT是刚性的核心(原子1~3),BRANCH标识从原子1分出去的两条侧链。Vina在对接时会旋转BRANCH中的单键,从根原子开始遍历构象空间。

2.5 转换流程总览(SVG)

输入文件准备流程 原始受体PDB 加氢 + 计算电荷 分配AD4原子类型 受体PDBQT 原始配体(MOL2/SDF/PDB) 检测扭转 + 加氢 + 电荷 定义ROOT/BRANCH 配体PDBQT 两者最终汇入Vina

2.6 常见问题与避坑指南

  • 受体加氢后出现奇怪的原子:偶尔遇到ADT把H加到金属离子上。检查一下,如果受体含金属离子,需要手动处理——通常金属离子的配位水要保留,但水分子电荷要清掉。
  • 配体扭转检测与预期不符:我遇到过环戊烷被检测出5个BRANCH(每个C-H都当成分支)。解决办法:在ADT中打开“Torsion Tree”,手动把环上的单键设为不可旋转。
  • 电荷不收敛:Gasteiger电荷计算时如果分子太大,可能报“charge iteration not converged”。增大迭代次数,或者先用MOPAC/antechamber计算更准确的电荷,再导入。
  • OpenBabel和ADT转换结果不一致:这很常见。我建议以ADT为准,OpenBabel只用作批量预处理,最终用ADT再检查一次。

记住:准备文件花20分钟,能省掉后面调试一周的时间。别偷懒。

2.7 本讲小结