跳转至

AutoDock Vina — 蛋白质-配体分子对接工具


一句话说明

AutoDock Vina 预测小分子(配体)如何结合到蛋白质(受体)的口袋里,输出结合能(kcal/mol)和对接构象——结合能越负表示结合越紧,是药物发现和虚拟筛选的核心工具。白话理解:模拟"钥匙(小分子药物)插进锁(蛋白质活性位点)"的过程,预测哪把钥匙最合适。


安装与配置

# 方法1:conda 安装(推荐)
conda install -c bioconda autodock-vina  # 安装 AutoDock Vina(当前 v1.2.7)
vina --version  # 确认版本

# 安装辅助工具(准备对接文件)
conda install -c conda-forge -c bioconda openbabel  # 格式转换(SDF→PDBQT)
pip install meeko   # 现代配体准备工具(推荐,替代 MGLTools)

# MGLTools(传统工具,含 prepare_receptor4.py)
conda install -c bioconda mgltools  # 或手动下载

# 安装 AutoDock-GPU(GPU 加速版,高通量筛选时用)
conda install -c bioconda autodock-gpu  # GPU 版本

# 安装 Gnina(深度学习增强版 Vina)
conda install -c bioconda gnina  # 含卷积神经网络评分

核心用法

标准对接流程(3步)

# === 步骤 1:准备受体蛋白(.pdbqt 格式)===

# 先用 PyMOL/ChimeraX 处理 PDB 文件:去水、去配体、加氢
# 然后用 prepare_receptor 脚本转换为 pdbqt 格式
python prepare_receptor4.py \
  -r protein_clean.pdb \     # 清理后的蛋白质 PDB
  -o receptor.pdbqt \        # 输出 pdbqt 格式
  -A hydrogens \             # 添加氢原子
  -U nphs_lps               # 去掉非极性氢

# === 步骤 2:准备配体(.pdbqt 格式)===

# 方法A:用 meeko(现代推荐)
mk_prepare_ligand.py -i ligand.sdf -o ligand.pdbqt  # SDF → PDBQT

# 方法B:用 openbabel
obabel ligand.sdf -O ligand.pdbqt --partialcharge gasteiger  # 加 Gasteiger 电荷

# === 步骤 3:运行对接 ===
vina \
  --receptor receptor.pdbqt \   # 受体文件
  --ligand ligand.pdbqt \       # 配体文件
  --center_x -12.5 \            # 对接盒子中心 X 坐标(Å)
  --center_y 15.2 \             # 对接盒子中心 Y 坐标(Å)
  --center_z 8.7 \              # 对接盒子中心 Z 坐标(Å)
  --size_x 25 \                 # 对接盒子大小 X(Å)
  --size_y 25 \                 # 对接盒子大小 Y(Å)
  --size_z 25 \                 # 对接盒子大小 Z(Å)
  --out ligand_docked.pdbqt \   # 对接结果输出文件
  --log docking_log.txt \       # 日志文件
  --exhaustiveness 8 \          # 搜索穷举程度(8=默认,值越大越准但越慢)
  --num_modes 9                 # 输出构象数量(默认9)

参数详解

参数含义推荐值
--exhaustiveness搜索穷举程度8(默认)/ 32(高精度)
--num_modes输出对接构象数9(默认)
--energy_range输出最优能量范围(kcal/mol)3(默认)
--scoring评分函数vina(默认)/ vinardo
--cpuCPU 线程数自动检测
--seed随机数种子(保证重复性)42

对接盒子定义方法

# 方法1:PyMOL 中查看活性位点坐标
# 在 PyMOL 命令行:get_position   → 获取当前视角中心坐标

# 方法2:用已知配体定义盒子中心
python3 << 'EOF'
from rdkit import Chem            # 导入 RDKit(需安装)
from rdkit.Chem import AllChem   # 化学功能模块
import numpy as np

# 从配体 SDF 文件获取质心作为盒子中心
mol = Chem.SDMolSupplier("reference_ligand.sdf")[0]  # 读取已知配体
conf = mol.GetConformer()         # 获取构象
coords = conf.GetPositions()      # 获取原子坐标 (N, 3)
center = coords.mean(axis=0)      # 计算质心

print(f"盒子中心: X={center[0]:.2f}, Y={center[1]:.2f}, Z={center[2]:.2f}")
# 盒子大小:配体坐标范围 + 各方向各加 8-10 Å
extent = coords.max(axis=0) - coords.min(axis=0) + 10  # 各方向+10Å
print(f"建议盒子大小: X={extent[0]:.1f}, Y={extent[1]:.1f}, Z={extent[2]:.1f}")
EOF

实战案例

案例:虚拟筛选(批量对接多个配体)

# 准备化合物库(转为单个 pdbqt 文件)
mkdir ligand_pdbqt/
for sdf_file in library/*.sdf; do
    basename=$(basename $sdf_file .sdf)   # 提取文件名(不含后缀)
    mk_prepare_ligand.py \
      -i "$sdf_file" \                    # 输入 SDF
      -o "ligand_pdbqt/${basename}.pdbqt" # 输出 PDBQT
done

# 批量对接脚本
python3 << 'EOF'
import subprocess  # 运行系统命令
import pandas as pd  # 结果整理
import re          # 正则表达式提取分数
import os

results = []  # 存储所有结果

for pdbqt in os.listdir("ligand_pdbqt/"):
    if not pdbqt.endswith(".pdbqt"):  # 只处理 pdbqt 文件
        continue

    name = pdbqt.replace(".pdbqt", "")   # 化合物名称
    output = f"docked/{name}_out.pdbqt"  # 对接输出文件

    # 运行 vina
    cmd = [
        "vina",
        "--receptor", "receptor.pdbqt",
        "--ligand", f"ligand_pdbqt/{pdbqt}",
        "--center_x", "-12.5",           # 盒子中心坐标
        "--center_y", "15.2",
        "--center_z", "8.7",
        "--size_x", "25",                # 盒子大小
        "--size_y", "25",
        "--size_z", "25",
        "--out", output,
        "--exhaustiveness", "8"          # 穷举程度
    ]

    result = subprocess.run(cmd, capture_output=True, text=True)
    output_text = result.stdout + result.stderr

    # 提取最佳对接能量(第一个模型的分数)
    match = re.search(r'1\s+([-\d.]+)\s', output_text)
    if match:
        score = float(match.group(1))    # 对接能量(kcal/mol)
        results.append({"compound": name, "docking_score": score})
        print(f"{name}: {score:.2f} kcal/mol")

# 按对接分数排序(越负越好)
df = pd.DataFrame(results).sort_values("docking_score")
df.to_csv("screening_results.csv", index=False)  # 保存排名
print("\n前10名:")
print(df.head(10))  # 显示前10名
EOF

常见报错与解决

报错原因解决方法
Parse error on line X in PDBQT filepdbqt 格式有问题重新用 prepare_receptor/meeko 生成
所有构象分数相同对接盒子太小,搜索空间受限增大 --size_x/y/z
对接结果明显不合理盒子中心偏离活性位点用参考配体重新定义盒子中心
exhaustiveness 时间太长配体太大 / 搜索空间太大先用 8 快速筛查;确认命中后再用 32 精确
氢键位置异常受体加氢不正确reducepdb4amber 重新加氢

速查表

# 安装
conda install -c bioconda autodock-vina
pip install meeko   # 现代配体准备

# 配体准备
mk_prepare_ligand.py -i mol.sdf -o mol.pdbqt

# 受体准备
python prepare_receptor4.py -r protein.pdb -o receptor.pdbqt -A hydrogens

# 基本对接
vina --receptor receptor.pdbqt --ligand ligand.pdbqt \
     --center_x X --center_y Y --center_z Z \
     --size_x 25 --size_y 25 --size_z 25 \
     --out out.pdbqt --exhaustiveness 8

# 结合能解读
# < -9 kcal/mol → 强结合,值得关注
# -7 ~ -9       → 中等结合
# > -5           → 弱结合,一般不考虑

# 当前版本:AutoDock Vina v1.2.7