第4章 受体准备:从PDB文件到PDBQT格式的转换
做分子对接的人都知道,刚下载的PDB文件就像一块毛坯石头——水分子、配体、金属离子乱七八糟堆一起,氢原子残缺不全,电荷模型压根没有。说白了,AutoDock Vina根本不认这种原始PDB。它要的是PDBQT格式,里面包含了原子类型、电荷、旋转键信息。这一步我称之为“洗数据”,做不好,后面全白搭。
转换的核心任务有三个:第一,补氢;第二,分配原子类型和电荷;第三,确定可旋转键。你可以用MGLTools里的ADT(AutoDock Tools)点点鼠标完成,也可以直接用Python脚本批量处理。我个人倾向脚本方式,尤其当你有一堆受体要处理时,脚本能救命。
为什么非转不可?
咱们先搞明白一个事:Vina的评分函数依赖特定的力场参数(比如AD4力场)。这个力场认的不是元素符号,而是ATYPE(原子类型)。你想想看,一个碳原子在芳环和脂肪链里,行为能一样吗?必须区分开。另外,氢原子的位置决定氢键方向,缺了氢,对接结果基本瞎猜。
我曾有个项目,用了一个从蛋白质数据库直接拿来的结构,没加氢就跑了对接,结果能量低得离谱。后来发现Vina把带负电的羧基当成中性处理了。从那以后,我养成了规矩:不管多熟悉的体系,必须先检查加氢和电荷。
方法一:用ADT交互式转换
如果你只处理一两个蛋白,ADT挺好用的。打开软件,File → Read Molecule,加载PDB。然后按下面步骤走:
- Edit → Delete Water Molecules,去掉水(除非你特意保留结合位水)。
- Edit → Hydrogen → Add,加氢。默认会加极性氢,我一般选全部加。
- Edit → Charges → Compute Gasteiger,计算电荷。
- Edit → Check Atom Types → Set All to AD4 Type,分配原子类型。
- File → Save As → PDBQT,保存。
每一步ADT都有对话框提示,但有几个坑我要提醒你。加氢的时候,ADT默认按pH=7.4处理组氨酸、天冬氨酸这些残基的质子化状态,如果你的实验条件不一样(比如pH=5.0),记得手动调一下。
方法二:用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取代标准加氢 |
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的整体思路:
验证转换结果
转换完了别急着跑对接。先打开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这一步,能说的就这些。接下来你就该考虑怎么根据你的对接目标选择一个“干净”的受体了——要不要糖链?要不要指定链?这些都是前面提到的问题,实际做的时候多留个心眼就行。