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 ⚠️ 可选 ❌ 否 ❌ 否 ❌ 需转换
⚠️ 注意:千万不要用直接从PDB库下载的小分子PDB文件做对接。那些文件只记录了原子坐标和连接关系,缺少AutoDock需要的电荷和原子类型字段。硬跑的话,结果基本可以扔进垃圾桶。

3.2 加氢:别小看这个氢原子

加氢真的只是加个原子那么简单吗?

不是的。AutoDock在对接时,氢键的贡献直接决定了配体与受体之间的结合强度。而氢原子本身很不稳定——它会电离、会成键、会改变方向。我们加的氢,其实是在目标pH条件下的优势质子化状态。

举个例子:组氨酸的咪唑环。在中性pH下,它的Nε2原子是质子化的,而Nδ1原子是未质子化的。如果你随便加个全氢,这两个氮上都带了氢,对接时模型就完全错了。

我建议的操作流程:

  1. 确定目标pH值(通常7.4,但酶活性位点可能不同)
  2. 使用Open Babel的 --pH 选项计算质子化状态
  3. 检查羧基、氨基、咪唑基、巯基等可电离基团

具体命令长这样:

# 使用Open Babel加氢并设定pH=7.4
obabel ligand.pdb -O ligand.pdbqt --gen3d -p 7.4
💡 小技巧:如果你用的是AutoDock Tools (ADT),加载小分子后,在Edit -> Add Hydrogens里可以手动选择质子化状态。我个人习惯在这里看一眼再点确定,因为自动计算偶尔会翻车。

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文件是否合格

文件准备好了,怎么知道它是好的?我一般做三件事:

  1. 数原子数:原PDB的原子数和生成的PDBQT是否一致?如果少了很多,说明结构有问题没被识别。
  2. 查看电荷和:中性分子的净电荷应该接近0。如果总和超过0.5或低于-0.5,大概率是某个官能团质子化状态错了。
  3. 检查可旋转键:在ADT里加载PDBQT文件,打开Ligand -> Torsion Tree,确认可旋转键的数量和类型是正确的。
⚠️ 警告:PDBQT文件中每一行的第69-76列是电荷字段。如果你打开文件发现这一列全是0.000,那说明电荷根本没写进去。这种文件对出来的结果毫无意义。别问我怎么知道的...我曾经用这样的文件跑了一周。
配体文件准备:从原始结构到PDBQT 原始小分子结构 加氢 + 质子化状态调整 (pH 7.4) 电荷计算:选Gasteiger还是MMFF94? Gasteiger:快速,兼容性好 MMFF94:精确,极性基团更准 输出PDBQT文件

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文件质量参差不齐,有些文件里残缺不全,加氢后电荷失衡。这一步就是个快速过滤,帮你第一时间发现问题配体。