第4章 受体准备:从PDB文件到PDBQT格式的转换

做分子对接的人都知道,刚下载的PDB文件就像一块毛坯石头——水分子、配体、金属离子乱七八糟堆一起,氢原子残缺不全,电荷模型压根没有。说白了,AutoDock Vina根本不认这种原始PDB。它要的是PDBQT格式,里面包含了原子类型、电荷、旋转键信息。这一步我称之为“洗数据”,做不好,后面全白搭。

转换的核心任务有三个:第一,补氢;第二,分配原子类型和电荷;第三,确定可旋转键。你可以用MGLTools里的ADT(AutoDock Tools)点点鼠标完成,也可以直接用Python脚本批量处理。我个人倾向脚本方式,尤其当你有一堆受体要处理时,脚本能救命。

为什么非转不可?

咱们先搞明白一个事:Vina的评分函数依赖特定的力场参数(比如AD4力场)。这个力场认的不是元素符号,而是ATYPE(原子类型)。你想想看,一个碳原子在芳环和脂肪链里,行为能一样吗?必须区分开。另外,氢原子的位置决定氢键方向,缺了氢,对接结果基本瞎猜。

我曾有个项目,用了一个从蛋白质数据库直接拿来的结构,没加氢就跑了对接,结果能量低得离谱。后来发现Vina把带负电的羧基当成中性处理了。从那以后,我养成了规矩:不管多熟悉的体系,必须先检查加氢和电荷。

方法一:用ADT交互式转换

如果你只处理一两个蛋白,ADT挺好用的。打开软件,File → Read Molecule,加载PDB。然后按下面步骤走:

  1. Edit → Delete Water Molecules,去掉水(除非你特意保留结合位水)。
  2. Edit → Hydrogen → Add,加氢。默认会加极性氢,我一般选全部加。
  3. Edit → Charges → Compute Gasteiger,计算电荷。
  4. Edit → Check Atom Types → Set All to AD4 Type,分配原子类型。
  5. File → Save As → PDBQT,保存。

每一步ADT都有对话框提示,但有几个坑我要提醒你。加氢的时候,ADT默认按pH=7.4处理组氨酸、天冬氨酸这些残基的质子化状态,如果你的实验条件不一样(比如pH=5.0),记得手动调一下。

注意:ADT对大的蛋白(超过几千个原子)会非常卡,有时候直接崩。我遇到过100k原子的蛋白质,选择“Add All Hydrogens”后等了半小时还不动,硬生生把电脑拖死。这种情况还是用脚本吧。

方法二:用prepare_receptor4.py脚本批量转换

这是MGLTools自带的Python脚本,位于MGLToolsPckgs/AutoDockTools/Utilities24/下。用法很简单:

pythonsh prepare_receptor4.py -r receptor.pdb -o receptor.pdbqt

常用的参数还不少。我给你列几个我经常用的:

# 保留所有水分子(很少用,除非你想试)
pythonsh prepare_receptor4.py -r rec.pdb -o rec_w.pdbqt -A bonds_hydrogens

# 去除所有水,加氢,计算电荷
pythonsh prepare_receptor4.py -r rec.pdb -o rec.pdbqt

# 手动指定配体位置(用于去除配体)
pythonsh prepare_receptor4.py -r rec_with_lig.pdb -o rec.pdbqt -l ligand_filename

# 保留特定链(比如只保留A链)
pythonsh prepare_receptor4.py -r rec.pdb -o chainA.pdbqt -C

参数解释:

参数作用
-r输入PDB文件
-o输出PDBQT文件
-A加氢模式,bonds_hydrogens 加所有氢
-l指定配体文件,脚本会从受体中移除该配体
-C保留所有链(默认只保留第一条链)
-U使用USC取代标准加氢
小技巧:如果你是批处理,可以写个简单的shell循环。比如:
for pdb in *.pdb; do
    pythonsh prepare_receptor4.py -r "$pdb" -o "${pdb%.pdb}.pdbqt"
done

转换过程中容易踩的坑

我踩过的坑,一个个说给你听。

1. 水分子要小心

很多教程说必须删水。但实际上,有些水处于结合位点,形成桥接氢键,删了会影响对接精度。我的一般做法:先保留关键水,把水从PDB中单独摘出来,转换成PDBQT,然后把水当作受体的一部分(或者当成配体)参与对接。这个后面章节会细讲。

2. 金属离子的处理

锌、镁、铁这些金属离子,AD4力场有专门的原子类型(比如Zn、Mg)。但脚本并不会自动正确分配。我见过有人直接跑,结果脚本把锌当成普通C,电荷算错,对接结果完全不对。建议手动在PDBQT里核对,或者用-x参数排除金属。

3. 组氨酸的质子化状态

组氨酸有三个可能形态:HID(HD1上质子)、HIE(HE2上质子)、HIP(双质子)。脚本默认根据pH判断,但不一定符合你的实验。如果你知道结构里组氨酸的具体角色(比如与金属配位),最好手动用ADT或编辑PDBQT的ATYPE。

4. 大蛋白的内存问题

prepare_receptor4.py脚本本身是Python写的,处理大蛋白时内存占用很高。我曾经处理一个4000多残基的复合物,跑了一个多小时才转换完。如果等不及,可以考虑用reduce工具加氢,再用pdb4amber等工具辅助,但这样流程就复杂了。

完整的转换流程示意图

下面这张SVG图帮你理清从原始PDB到PDBQT的整体思路:

PDB → PDBQT 转化流程 原始PDB文件 去除水分子 / 配体 / 金属 (保留关键水可选) 添加氢原子 (指定pH质子化状态) 计算Gasteiger电荷 (分配AD4原子类型) 输出PDBQT文件 常用工具 • ADT(图形界面) • prepare_receptor4.py • reduce / pdb4amber 检查关键点 • 金属离子原子类型 • 组氨酸质子化 • 配体是否移除干净

验证转换结果

转换完了别急着跑对接。先打开PDBQT文件看一眼头部信息。合格的PDBQT长这样:

REMARK  small molecule ...
ATOM      1  N   TYR A   1       8.760  13.492  10.240  0.00  0.00   -0.461 +0.000
ATOM      2  CA  TYR A   1       9.206  12.153  10.663  0.00  0.00    0.013 +0.000
...
ATOM   2000 HZ   TYR A  90       6.824   8.425  12.129  0.00  0.00    0.113 +0.000
END

注意看最后一列,那是Gasteiger电荷和内部旋转能量信息。如果全是0.000,说明电荷没成功计算。我遇到过好几次,后来发现是Python版本不兼容,换回Python2.7就正常了。

快速检查法:在终端里用 grep "REMARK" receptor.pdbqt | head -5 看注释行,如果出现"Active torsions"等字样,说明旋转键信息也写进去了。

批量一致性检查的思考

当你需要处理几十个甚至上百个受体时,手工转换肯定不现实。这时候就得靠脚本。但是脚本的默认参数能不能保证每个受体都处理正确?不一定。比如有的体系含磷酸根,有的含糖基,脚本可能识别不了,需要加--include-atoms手动指定。所以我的建议是:先挑3-5个代表性结构手动转换验证,确认脚本参数没问题,再全量跑。

另外,不同版本的prepare_receptor4.py行为也有差异。旧版本遇到未知原子类型会直接报错,新版本会尝试用近似的类型替代。如果你要批量跑,最好固定一个版本,避免结果不一致。我在团队里一般用conda装一个固定版本的autodock-vina环境,各成员都用一个镜像,省得扯皮。

好了,受体转PDBQT这一步,能说的就这些。接下来你就该考虑怎么根据你的对接目标选择一个“干净”的受体了——要不要糖链?要不要指定链?这些都是前面提到的问题,实际做的时候多留个心眼就行。