受体准备工作:从PDB文件到pdbqt格式的转换技巧

写代码多年,我养成了一个习惯:准备永远比计算更重要。搞分子对接也一样。你准备好了参数,但受体文件本身有问题——结果肯定一塌糊涂。我刚入行那会儿,就因为pdbqt文件少了几根键,排查了一整周。

说白了,pdbqt格式包含两个关键信息:原子坐标和原子类型。AutoDock Vina用这套信息来计算结合自由能。如果受体里缺了原子或者类型标错了,对接结果就是瞎猜。

PDB文件到手后,先做这几步

我的习惯:每次拿到新PDB文件,先在脑子里过一遍“三步检查法”——缺失原子、多构象、配体分离。这三步不走完,我绝不动手转换。

1. 检查缺失原子

晶体结构不一定完整。尤其是柔性侧链和溶剂暴露区域,电子密度模糊,PDB里会直接跳过这些原子。怎么办?

  • 用 pdb4amber 或 WHAT IF 补全缺失侧链
  • 或者手动编辑,但结构生物学基础不牢的话,不建议手动动刀

你想想看,如果活性位点缺了个关键残基的侧链,对接出来的pose能准吗?答案显而易见。

2. 处理多构象

很多PDB文件里记录着多个构象(ALT A/B/C)。Vina只认第一个构象。所以得把多余构象删掉,只保留占有率最高的那个。

# 用python脚本快速提取alt loc A
from Bio.PDB import PDBParser, PDBIO

parser = PDBParser()
structure = parser.get_structure("receptor", "4hhb.pdb")

for model in structure:
    for chain in model:
        for residue in chain:
            for atom in residue:
                if atom.get_altloc() != " " and atom.get_altloc() != "A":
                    residue.detach_child(atom.get_id())

io = PDBIO()
io.set_structure(structure)
io.save("receptor_clean.pdb")
千万注意:如果活性位点的残基在多构象里都有高占有率,你反而要考虑做柔性对接,而不是简单删掉。这个咱们后面章节会细讲。

3. 移除水分子和配体

大多数情况下,对接前得把结晶水和原始配体去掉。但也不绝对——如果水分子在活性位点里扮演着稳定的桥连角色,那就得保留。

  • 常规做法:grep -v "HOH" receptor.pdb > receptor_dry.pdb
  • 保留关键水:在pyMOL里手动挑出与残基形成两个以上氢键的水分子

pdbqt格式转换的核心逻辑

当初mgltools是唯一的官方转换工具。但它的python 2依赖让人头疼。现在有了更好的选择——meeko 和 AUTODUMMY。

方法一:用ADT(AutoDock Tools)——传统路线

这是AutoDock团队提供的图形界面工具。我早期用过很多次,稳定但慢。

  • 启动ADT → 加载PDB → 加氢 → 计算Gasteiger电荷 → 指定可旋转键 → 保存pdbqt
  • 注意:ADT会把所有非标准残基当成配体,需要手动设置为受体一部分

方法二:用meeko——我现在的首选

meeko是一个纯Python 3的开源库,安装简单,速度快。它把配体和受体转换分开处理。今天我们先说受体部分。

# 安装meeko
pip install meeko

# 转换受体PDB为pdbqt
meeko_prepare_receptor.py --input receptor.pdb --output receptor.pdbqt --pH 7.4 --add_hydrogens
我个人习惯用 --pH 7.4 这个参数。为什么?因为这个pH值对应生理条件。如果你研究的是胃蛋白酶或溶酶体酶,pH得相应调整。我曾经因为忽略pH参数,把组氨酸的质子化状态搞错了,对接结果完全不符合实验数据。

方法三:用AUTODUMMY——自动化处理管道

AUTODUMMY把加氢、电荷计算、pdbqt转换都封装在一个命令里。适合批量处理。

autodummy.py --receptor-pdb receptor.pdb --output-dir ./prepared/

它会自动生成 receptor.pdbqt 和一份日志文件,记录所有处理细节。

氢键和柔性处理——最容易被坑的地方

问题 常见错误 正确做法
组氨酸质子化状态 默认加氢,不区分HID/HIE/HIP 根据pH和氢键网络手动指定
天冬氨酸/谷氨酸 直接加氢不考虑环境 检查活性位点疏水性,决定质子化
柔性残基选择 把整个蛋白设成柔性 只选活性位点侧链,通常3-8个残基
电荷分配 使用+1泛型电荷 用Gasteiger-Marsili半经验方法
重要警告:不要使用ADT的“自动加氢”功能而不做人工复核。我曾因为偷懒,直接点了一键加氢,结果一个关键丝氨酸的羟基方向完全反了,导致整个对接项目重做。这个教训值一个月时间。

我的实用工具链推荐

我用了三年,总结出下面这个组合。实践证明最靠谱:

  1. PDB准备: pyMOL + Bio.Python 脚本(去水、去配体、提取单构象)
  2. 加氢与电荷: reduce(加氢) + meeko(计算电荷并输出pdbqt)
  3. 质量检查: OpenBabel 的 obabel -ipdbqt receptor.pdbqt -O receptor_report.txt --error
  4. 柔性设定: 用脚本提取要柔化的残基坐标,另存为独立的pdbqt

这张图帮你理清整个流程

下面是我自己画的流程图,涵盖从原始PDB到最终pdbqt的完整路径。

PDB到pdbqt转换流程 原始PDB文件 第一步:PDB预处理 补全缺失原子 · 去水 · 去配体 · 单构象提取 第二步:加氢 + 电荷计算 指定pH → 加氢 → 分配Gasteiger电荷 第三步:pdbqt转换 meeko / ADT / AUTODUMMY → 生成pdbqt 第四步:柔性残基设定(可选) 提取活性位点侧链 → 独立pdbqt ✅ 最终pdbqt ❓ 遇到多构象怎么办? 保留第一个构象 或选择高占有率构象 ⚠ pH提醒 生理条件→pH 7.4 胃酶→pH 2.0 🔧 工具推荐 meeko / reduce / obabel

避坑清单:我替你踩过的雷

  • 不要直接对着PDB加氢。 我试过,加出来的氢键方向十有八九是错的。一定要用reduce或meeko这类专用工具。
  • 电荷必须重新计算。 PDB文件里没有电荷信息。如果用旧版工具生成pdbqt但忘了重新分配电荷,原子类型会乱套。
  • 柔性残基的pdbqt需要单独准备。 不能把柔性残基放在受体主文件里一起转。我当时踩过这个坑,Vina报了一个莫名其妙的索引错误,后来发现是同一原子被定义了两次。
  • 组氨酸的质子化状态要手调。 自动工具默认加两个氢(HIP),但多数情况下组氨酸只加一个氢(HID或HIE),甚至不加(HIN)。

最后一条黄金法则:每做完一步转换,用文本编辑器打开pdbqt文件看看。你不需要懂每一行,但至少确认一下坐标范围是否合理,ATOM记录数量是否异常。我在项目里见过有人把溶剂分子当成受体的一部分转进去了,坐标从-100到300,离谱得一塌糊涂。

关于受体准备,核心就这些了。把pdbqt文件准备好,后面的对接参数设置才有意义。不然你费尽心思调盒子大小、设exhaustiveness,结果受体本身有问题——说白了,白忙活。