Autodock vina自动化运行

Autodock vina自动化运行
pymol showing of multiple dockings

autodock vina 现在还是比较常用了,虽说config file之类的还是比较直观易懂的,但是一般来说我们做一个东西都要同时dock很多个ligand。下面就是我常用的autodock vina自动化运行脚本。

  • 自动化批量对接(Batch Docking): 自动扫描指定目录下的所有配体文件(.pdbqt),并逐个与受体(Receptor)进行对接。
  • 智能参数记忆(State Persistence): 首次输入参数后,脚本会自动将其缓存到隐藏文件 .dockenv 中。下次运行时直接回车即可跳过输入,极大提升复用效率。
  • 动态生成配置与日志(Auto-Logging): 自动为每个配体生成专属的 config.txt 配置文件,并实时保存带有时间戳的详细运行日志(.out)。
  • 重名防覆盖保护(File Protection): 如果输出目录已存在同名对接结果,脚本会自动给新文件加上序号(如 _1, _2),防止实验数据被意外覆盖。

用户输入内容:

序号允许用户输入的内容 (Input)默认值 (Default)说明 (Notes)
1

Receptor 文件路径


(受体蛋白质文件)

优先使用上次成功运行的受体;


若无历史记录则无默认值,需手动输入。

脚本会自动检查该文件是否存在,不存在会提示重新输入。
2

Ligand 配体目录路径


(存放小分子的文件夹)

优先使用上次的目录;


无历史记录时默认为当前目录 (.)。

脚本会自动扫描该目录下所有的 .pdbqt 文件。
3

Grid Box 尺寸 (Size X Y Z)


(对接盒子的大小)

优先使用上次的尺寸;


无历史记录时默认为 24 24 24

支持简写,例如只输入一个数字 30,脚本会自动将其等同于 30 30 30
4

中心坐标 (Center X Y Z)


(对接盒子的中心位置)

优先使用上次的坐标;


无历史记录时默认为 0 0 0

必须用空格分隔三个坐标值。如果格式输入错误,会自动回退到默认值。

输入准备

  • receptor的pdbqt (只支持一个receptor)
  • 一个文件夹,还有所有你要测试用的ligand的pdbqt(一文件夹得pdbqt)
  • config中的参数,如center xyz,预测口袋size等。

脚本内容

注意!脚本中有module restore 内容,如果你的环境中直接就有autodock vina环境就可以删去,别的直接可以使用!下面是脚本内容:

#!/bin/bash

# 开启严格模式:遇到未定义变量报错,管道错误报错
set -u
set -o pipefail

ENV_FILE=".dockenv"

echo "=================================================="
echo "      AutoDock Vina 批量自动化运行脚本            "
echo "=================================================="

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="${SCRIPT_DIR}/.dockenv"

if [ -f "$ENV_FILE" ]; then
    echo "[INFO] 检测到历史配置文件 $ENV_FILE,正在加载默认值..."
    # 临时关闭 set -u 以防旧环境文件缺失某些变量
    set +u
    source "$ENV_FILE"
    set -u
else
    echo "[INFO] 未在脚本目录检测到历史配置,将使用系统内置默认值。"
fi

# 给所有潜在的变量设置“系统保底默认值”(如果 .dockenv 里没有的话)
DEFAULT_SIZE_X="${LAST_SIZE_X:-24}"
DEFAULT_SIZE_Y="${LAST_SIZE_Y:-24}"
DEFAULT_SIZE_Z="${LAST_SIZE_Z:-24}"
DEFAULT_CENTER_X="${LAST_CENTER_X:-0}"
DEFAULT_CENTER_Y="${LAST_CENTER_Y:-0}"
DEFAULT_CENTER_Z="${LAST_CENTER_Z:-0}"
DEFAULT_LIGAND_DIR="${LAST_LIGAND_DIR:-.}"

# 1. 交互式获取 Receptor (受体文件)
while true; do
    if [ -n "${LAST_RECEPTOR:-}" ]; then
        read -e -p "请输入 Receptor 文件路径 (直接回车默认: $LAST_RECEPTOR): " RECEPTOR
        [ -z "$RECEPTOR" ] && RECEPTOR="$LAST_RECEPTOR"
    else
        read -e -p "请输入 Receptor 文件路径 (e.g., receptor.pdbqt): " RECEPTOR
    fi

    if [ -f "$RECEPTOR" ]; then
        break
    else
        echo "[错误] 找不到该文件,请重新输入!"
    fi
done

# 2. 交互式获取 Ligand 目录 (配体文件夹)
while true; do
    if [ -n "${LAST_LIGAND_DIR:-}" ]; then
        read -e -p "请输入 Ligand 配体目录路径 (直接回车默认: $LAST_LIGAND_DIR): " LIGAND_DIR
        [ -z "$LIGAND_DIR" ] && LIGAND_DIR="$LAST_LIGAND_DIR"
    else
        read -e -p "请输入 Ligand 配体目录路径 (e.g., ./ligands): " LIGAND_DIR
    fi

    if [ -d "$LIGAND_DIR" ]; then
        # 移除末尾的斜杠以保持路径整洁
        LIGAND_DIR="${LIGAND_DIR%/}"
        break
    else
        echo "[错误] 找不到该目录,请重新输入!"
    fi
done

# 3. 检查目录下是否存在 .pdbqt 文件
shopt -s nullglob
LIGANDS=("$LIGAND_DIR"/*.pdbqt)
shopt -u nullglob

TOTAL_LIGANDS=${#LIGANDS[@]}
if [ "$TOTAL_LIGANDS" -eq 0 ]; then
    echo "[错误] 在目录 '$LIGAND_DIR' 下未找到任何 .pdbqt 文件!脚本退出。"
    exit 1
else
    echo "[INFO] 成功识别到 $TOTAL_LIGANDS 个配体分子文件。"
fi

# 4. Grid Box 尺寸 (Size)
read -e -p "请输入 Grid Box 尺寸 Size (直接回车默认: $DEFAULT_SIZE_X $DEFAULT_SIZE_Y $DEFAULT_SIZE_Z): " USER_SIZE
if [ -z "${USER_SIZE}" ]; then
    SIZE_X="$DEFAULT_SIZE_X"
    SIZE_Y="$DEFAULT_SIZE_Y"
    SIZE_Z="$DEFAULT_SIZE_Z"
else
    read -r SIZE_X SIZE_Y SIZE_Z <<< "$USER_SIZE"
    [ -z "$SIZE_Y" ] && SIZE_Y=$SIZE_X
    [ -z "$SIZE_Z" ] && SIZE_Z=$SIZE_X
fi

# 5. 中心坐标 (Center XYZ)
read -e -p "请输入中心坐标 Center X Y Z (空格分隔, 直接回车默认: $DEFAULT_CENTER_X $DEFAULT_CENTER_Y $DEFAULT_CENTER_Z): " USER_CENTER

if [ -z "${USER_CENTER}" ]; then
    CENTER_X="$DEFAULT_CENTER_X"
    CENTER_Y="$DEFAULT_CENTER_Y"
    CENTER_Z="$DEFAULT_CENTER_Z"
else
    read -r CENTER_X CENTER_Y CENTER_Z <<< "$USER_CENTER"
    if [ -z "$CENTER_X" ] || [ -z "$CENTER_Y" ] || [ -z "$CENTER_Z" ]; then
        echo "[错误] 坐标格式不正确!自动回退至上一级默认值。"
        CENTER_X="$DEFAULT_CENTER_X"
        CENTER_Y="$DEFAULT_CENTER_Y"
        CENTER_Z="$DEFAULT_CENTER_Z"
    fi
fi

# ==================================================
# 参数持久化:任务成功前,将当前参数缓存写入 .dockenv
# ==================================================
cat << EOF > "$ENV_FILE"
LAST_RECEPTOR="$RECEPTOR"
LAST_LIGAND_DIR="$LIGAND_DIR"
LAST_SIZE_X="$SIZE_X"
LAST_SIZE_Y="$SIZE_Y"
LAST_SIZE_Z="$SIZE_Z"
LAST_CENTER_X="$CENTER_X"
LAST_CENTER_Y="$CENTER_Y"
LAST_CENTER_Z="$CENTER_Z"
EOF

echo "[INFO] 当前运行参数已成功缓存至 $ENV_FILE"
echo "[INFO] 开始进入批量对接循环流程..."

# 加载环境模块 (只需加载一次)
module --force purge
module restore autodock-vina

# 6. 遍历配体进行批量对接
CURRENT_COUNT=0
for LIGAND in "${LIGANDS[@]}"; do
    ((CURRENT_COUNT++))
    
    # 提取配体文件名(去除路径和后缀)
    LIGAND_BASE=$(basename -- "$LIGAND")
    LIGAND_NAME="${LIGAND_BASE%.pdbqt}"
    
    # 自动命名输出文件:配体名_docking.pdbqt
    FINAL_OUTPUT="${LIGAND_NAME}_docking.pdbqt"
    
    # 自动处理重名逻辑(如果当前目录下已存在,则加计数器)
    if [ -e "$FINAL_OUTPUT" ]; then
        counter=1
        while [ -e "${LIGAND_NAME}_docking_${counter}.pdbqt" ]; do
            ((counter++))
        done
        FINAL_OUTPUT="${LIGAND_NAME}_docking_${counter}.pdbqt"
    fi

    echo ""
    echo "=================================================="
    echo " 正在处理进度: [$CURRENT_COUNT/$TOTAL_LIGANDS] "
    echo " 当前配体: $LIGAND_BASE"
    echo " 输出文件: $FINAL_OUTPUT"
    echo "=================================================="

    # 动态生成当前配体的 config.txt
    cat << EOF > config.txt
# 受体和配体设置
receptor = $RECEPTOR
ligand = $LIGAND
out = $FINAL_OUTPUT

# 网格中心与大小 (Grid Box)
center_x = $CENTER_X
center_y = $CENTER_Y
center_z = $CENTER_Z

size_x = $SIZE_X
size_y = $SIZE_Y
size_z = $SIZE_Z

# 搜索参数
exhaustiveness = 32
num_modes = 20
energy_range = 3
EOF

    # 动态建立日志文件
    TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
    LOG_FILE="autodock_${LIGAND_NAME}_${TIMESTAMP}.out"
    FINAL_OUTPUT_FULL_PATH=$(realpath "$FINAL_OUTPUT")

    cat << EOF > "$LOG_FILE"
==================================================
VINA RUN EXECUTION DETAILS (BATCH MODE)
==================================================
Execution Time: $(date)
Receptor File:  $(realpath "$RECEPTOR")
Ligand File:    $(realpath "$LIGAND")
Output File:    $FINAL_OUTPUT_FULL_PATH
Grid Center:    X=$CENTER_X, Y=$CENTER_Y, Z=$CENTER_Z
Grid Size:      X=$SIZE_X, Y=$SIZE_Y, Z=$SIZE_Z
==================================================
EOF

    # 执行 Vina 对接并将输出同步重定向至日志
    vina --config config.txt --cpu 2 2>&1 | tee -a "$LOG_FILE"

done

# 清理临时生成的最后一个 config.txt
[ -f config.txt ] && rm config.txt

echo ""
echo "=================================================="
echo "    所有配体分子批量对对接任务完成!共 $TOTAL_LIGANDS 个文件。   "
echo "=================================================="

Read more

GroMacs 跑起来!

开始之前感谢一下Justin A. Lemkul, Ph.D.教授的GROMACS Tutorials。现在已经几乎成为新手必学行业标准了。强烈推荐可以去上他的课。这篇blog是我根据他的教程总结出来,并加上了自动化的部分,让一切更加方便! 我们会采用3NPO pdb file 和一个autodock vina对接后的pdbqt文件开始。你可以从下面下载他们,但也可以参考我之前的教程一步一步拿到自己的pdbqt flie: 3NPO3NPO.pdb143 KBdownload-circleKaempferol_dockingKaempferol_docking.pdbqt53 KBdownload-circle 一、准备pdb file 你会发现autodock vina dock之后的pdbqt里面有多个构象,他们都被MODEL分割。如下图: 所以我们处理的第一步就是分割,把这个含有多个model的变成单独的一个model。利用下面几行sh就可以轻松拿到第一个构象。当然,也可以直接用手复制粘贴出来。不过可能使用vina的vina_split会更可靠一些 vina_spl

By Blake Jia
Autodock vina对接!

Autodock vina对接!

相信你已经准备好了两个pdbqt,如果没有可以去看我准备pdbqt的那个blog。如果你想要直接下载,请下载: KaempferolKaempferol.pdbqt2 KBdownload-circle3NPO3NPO.pdbqt122 KBdownload-circle 这个blog采用3NPO作为模拟蛋白,可以在这里看到!上面的pdbqt是处理好的ph=7.0的,Kaempferol就是ligand,3NPO是receptor config file准备 pdbqt是最难准备的,config相对就容易很多。autodock 4的config file准备也很看水平,但是vina把这个过程简化了,就只要最基础的几个事情 # 受体和配体设置 # 应该你已经准备好了两个pdbqt receptor = receptor.pdbqt ligand = ligand.pdbqt out = output.pdbqt # 输出格式也是pdbqt!是包含多个对接结果的pdbqt! # 网格中心与大小 (Grid Box) # 这一部分要看蛋白质的状态! ce

By Blake Jia
Autodock vina の pdbqt准备

Autodock vina の pdbqt准备

这篇blog中假设你毫无autodock经验但是有最最基础linux使用经验,本blog着重描述vina的一些文件和操作流程,以避免以后自己操作的时候犯错。 我们会先从配体准备的软件选择和安装开始,然后会分别讲解ligand和receptor的准备过程。 pdbqt生成-软件的选择和安装 这里的软件指的是从sdf或者pdb文件到pdbqt文件的过程。本质上来说他们都是笛卡尔坐标系xyz的信息储存文件,都可以用文本文档直接打开。 head your_pdbqt.pdbqt 如果你打开看了,就会发现其实pdbqt比pdb多出了两列:也就是q和t。Partial Charge (Q)和Atom Type (T)。Q用于计算静电相互作用,T用于计算van derr waal力和氢键,他们正常pdb是不需要的,但是预测docking的时候非常有用。 一直以来Autodock tools或者MGL tools是比较被推荐的,也是官方标准工具,也是图形化工具。另外也有PyRx等别的第三方pdbqt生成器的库,但是兼容性相对差一点点(生成QT就说白了是很简单的活儿,但是既然有官方的为啥不

By Blake Jia