3. 准备配体文件:PDBQT格式、加氢、电荷计算
配体文件的准备,说白了就是给分子“梳洗打扮”,让AutoDock能认出它、理解它、计算它。这一步要是马虎了,后面跑再多的参数优化都是白搭。我个人习惯把配体准备拆成三个核心动作:格式转换、加氢、电荷计算。咱们一个个来看。
3.1 为什么非得是PDBQT?
PDBQT,全称是 Protein Data Bank, Partial Charge (Q), Atom Type (T)。它跟普通的PDB文件最大的区别在于——它把分子对接需要的两类额外信息直接塞进了文件里:部分电荷和原子类型。
我在2021年做一个激酶抑制剂项目时,有个同事直接拿PDB文件去跑AutoDock,结果跑出来一堆离谱的结合姿势。后来一查,原来是PDB文件里没有电荷信息,AutoDock把电负性原子全当成了中性粒子处理。你想想看,那结果能对吗?
| 文件格式 | 包含电荷? | 包含原子类型? | 可旋转键信息? | 能否直接用于对接 |
|---|---|---|---|---|
| PDB | ❌ 否 | ❌ 否 | ❌ 否 | ❌ 不能 |
| PDBQT | ✅ 是 | ✅ 是 | ✅ 是 | ✅ 能 |
| MOL2 | ✅ 是 | ⚠️ 部分 | ❌ 否 | ❌ 需转换 |
| SDF | ⚠️ 可选 | ❌ 否 | ❌ 否 | ❌ 需转换 |
3.2 加氢:别小看这个氢原子
加氢真的只是加个原子那么简单吗?
不是的。AutoDock在对接时,氢键的贡献直接决定了配体与受体之间的结合强度。而氢原子本身很不稳定——它会电离、会成键、会改变方向。我们加的氢,其实是在目标pH条件下的优势质子化状态。
举个例子:组氨酸的咪唑环。在中性pH下,它的Nε2原子是质子化的,而Nδ1原子是未质子化的。如果你随便加个全氢,这两个氮上都带了氢,对接时模型就完全错了。
我建议的操作流程:
- 确定目标pH值(通常7.4,但酶活性位点可能不同)
- 使用Open Babel的
--pH选项计算质子化状态 - 检查羧基、氨基、咪唑基、巯基等可电离基团
具体命令长这样:
# 使用Open Babel加氢并设定pH=7.4
obabel ligand.pdb -O ligand.pdbqt --gen3d -p 7.4
3.3 电荷计算:Gasteiger还是MMFF94?
电荷计算是配体准备里最容易踩坑的地方。我见过太多人直接照着教程跑一遍 prepare_ligand4.py,然后用默认电荷结果做了大半年对接,后来发现数据集里有一半的分子电荷分配逻辑是错的。
AutoDock 4.x默认使用 Gasteiger电荷。它的特点:
- 计算速度极快,适合高通量虚拟筛选
- 仅基于原子电负性和拓扑结构,不依赖量子力学计算
- 对极性基团的电荷分配偏保守
而 MMFF94电荷 来自Merck分子力场,对有机小分子的电荷分布描述更精确。但它只支持元素周期表前四周期元素,含金属离子或碘原子的配体就用不了。
我踩过的一个坑:有一次做一个含氟配体的项目,用Gasteiger电荷做了五轮对接,结果实验验证全灭。后来改用MMFF94电荷重新算了一次,结合自由能跟实验值的相关系数直接从0.3跳到了0.75。氟原子的强电负性,Gasteiger没算准。
- 普通有机小分子(C, H, O, N, S, P)→ Gasteiger 够用,快
- 含F, Cl, Br等卤素 → 优先用MMFF94
- 含金属 → 只能做Gasteiger(MMFF94不支持)
- 高通量筛选(>10万分子)→ 必须用Gasteiger
在ADT里切换电荷方法:
# 使用prepare_ligand4.py,默认Gasteiger
prepare_ligand4.py -l ligand.pdb -o ligand.pdbqt
# 指定MMFF94电荷
prepare_ligand4.py -l ligand.pdb -o ligand.pdbqt -C
-C 参数就是告诉ADT用MMFF94电荷替代Gasteiger。
3.4 检验PDBQT文件是否合格
文件准备好了,怎么知道它是好的?我一般做三件事:
- 数原子数:原PDB的原子数和生成的PDBQT是否一致?如果少了很多,说明结构有问题没被识别。
- 查看电荷和:中性分子的净电荷应该接近0。如果总和超过0.5或低于-0.5,大概率是某个官能团质子化状态错了。
- 检查可旋转键:在ADT里加载PDBQT文件,打开Ligand -> Torsion Tree,确认可旋转键的数量和类型是正确的。
3.5 一键完成的脚本化准备
到了项目后期,你会有成百上千个配体需要准备。这时候手工点ADT的界面就太慢了。我写过一个简单的Shell脚本,把整个过程串起来:
#!/bin/bash
# 批量准备配体,输出PDBQT
# 用法: bash prepare_ligands.sh ligands/
INPUT_DIR=$1
OUTPUT_DIR="${INPUT_DIR}/pdbqt"
mkdir -p $OUTPUT_DIR
for mol in $INPUT_DIR/*.pdb; do
base=$(basename "$mol" .pdb)
echo "Processing: $base"
# 加氢并生成3D结构
obabel "$mol" -O "${OUTPUT_DIR}/${base}_h.pdb" --gen3d -p 7.4
# 使用ADT工具生成PDBQT,指定MMFF94电荷(-C)
prepare_ligand4.py -l "${OUTPUT_DIR}/${base}_h.pdb" \
-o "${OUTPUT_DIR}/${base}.pdbqt" \
-C
# 检查电荷和,如果接近0则跳过
charge_sum=$(grep -oP 'BR CHARGE=\K[0-9.-]+' "${OUTPUT_DIR}/${base}.pdbqt" | paste -sd+ | bc -l)
echo " Charge sum: $charge_sum"
if (( $(echo "$charge_sum > 0.5 || $charge_sum < -0.5" | bc -l) )); then
echo " ⚠️ Warning: Abnormal charge sum!"
fi
done
echo "Done!"
这个脚本里我在最后加了一步电荷和检查。为什么?因为现实中PDB文件质量参差不齐,有些文件里残缺不全,加氢后电荷失衡。这一步就是个快速过滤,帮你第一时间发现问题配体。