Files
vina_docking_batch/scripts/batch_docking.sh
lingyuzeng 05ce8823f8 first add
2025-08-02 21:54:31 +08:00

162 lines
5.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 批量对接脚本(带日志记录)
# 用法:
# ./batch_docking.sh receptor.pdbqt config.txt ligands_dir output_dir [log_file] [vina_path] [exhaustiveness] [num_modes] [energy_range]
if [ $# -lt 4 ] || [ $# -gt 9 ]; then
echo "用法: $0 <受体PDBQT文件> <配置文件> <配体目录> <输出目录> [日志文件] [vina路径] [exhaustiveness] [num_modes] [energy_range]"
exit 1
fi
RECEPTOR="$1"
CONFIG="$2"
LIGANDS_DIR="$3"
OUTPUT_DIR="$4"
LOG_FILE="${5:-batch_docking.log}"
VINA_CMD="${6:-vina}"
EXHAUSTIVENESS="${7:-32}"
NUM_MODES="${8:-20}"
ENERGY_RANGE="${9:-5.0}"
# 创建输出目录和日志文件
mkdir -p "$OUTPUT_DIR"
mkdir -p "$(dirname "$LOG_FILE")"
# 初始化日志文件
echo "=== 批量对接日志 ===" > "$LOG_FILE"
echo "开始时间: $(date)" >> "$LOG_FILE"
echo "受体文件: $RECEPTOR" >> "$LOG_FILE"
echo "配置文件: $CONFIG" >> "$LOG_FILE"
echo "配体目录: $LIGANDS_DIR" >> "$LOG_FILE"
echo "输出目录: $OUTPUT_DIR" >> "$LOG_FILE"
echo "vina路径: $VINA_CMD" >> "$LOG_FILE"
echo "exhaustiveness: $EXHAUSTIVENESS" >> "$LOG_FILE"
echo "num_modes: $NUM_MODES" >> "$LOG_FILE"
echo "energy_range: $ENERGY_RANGE" >> "$LOG_FILE"
echo "================================" >> "$LOG_FILE"
# 检查输入文件
if [ ! -f "$RECEPTOR" ]; then
error_msg="错误: 受体文件不存在: $RECEPTOR"
echo "$error_msg"
echo "[ERROR] $(date): $error_msg" >> "$LOG_FILE"
exit 1
fi
if [ ! -f "$CONFIG" ]; then
error_msg="错误: 配置文件不存在: $CONFIG"
echo "$error_msg"
echo "[ERROR] $(date): $error_msg" >> "$LOG_FILE"
exit 1
fi
if [ ! -d "$LIGANDS_DIR" ]; then
error_msg="错误: 配体目录不存在: $LIGANDS_DIR"
echo "$error_msg"
echo "[ERROR] $(date): $error_msg" >> "$LOG_FILE"
exit 1
fi
# 检查配体文件数量
ligand_count=$(find "$LIGANDS_DIR" -name "*.pdbqt" | wc -l)
if [ "$ligand_count" -eq 0 ]; then
error_msg="错误: 在 $LIGANDS_DIR 中未找到任何 .pdbqt 文件"
echo "$error_msg"
echo "[ERROR] $(date): $error_msg" >> "$LOG_FILE"
exit 1
fi
echo "开始批量对接..."
echo "受体: $RECEPTOR"
echo "配置: $CONFIG"
echo "配体目录: $LIGANDS_DIR (找到 $ligand_count 个配体文件)"
echo "输出目录: $OUTPUT_DIR"
echo "日志文件: $LOG_FILE"
echo "[INFO] $(date): 找到 $ligand_count 个配体文件" >> "$LOG_FILE"
# 创建临时错误文件
error_file=$(mktemp)
# 使用Vina的批量模式捕获错误输出
echo "[INFO] $(date): 开始执行 vina 命令" >> "$LOG_FILE"
if "$VINA_CMD" --receptor "$RECEPTOR" \
--batch "$LIGANDS_DIR" \
--config "$CONFIG" \
--dir "$OUTPUT_DIR" \
--exhaustiveness="$EXHAUSTIVENESS" \
--num_modes="$NUM_MODES" \
--energy_range="$ENERGY_RANGE" 2>"$error_file"; then
echo "批量对接完成!"
echo "结果保存在: $OUTPUT_DIR"
echo "[SUCCESS] $(date): 批量对接成功完成" >> "$LOG_FILE"
# 统计成功生成的输出文件
output_count=$(find "$OUTPUT_DIR" -name "*_out.pdbqt" | wc -l)
echo "[INFO] $(date): 生成了 $output_count 个输出文件" >> "$LOG_FILE"
else
echo "批量对接失败!"
echo "[FAILED] $(date): 批量对接执行失败" >> "$LOG_FILE"
echo " 命令: $VINA_CMD --receptor $RECEPTOR --batch $LIGANDS_DIR --config $CONFIG --dir $OUTPUT_DIR --exhaustiveness=$EXHAUSTIVENESS --num_modes=$NUM_MODES --energy_range=$ENERGY_RANGE" >> "$LOG_FILE"
echo " 错误信息:" >> "$LOG_FILE"
# 将错误信息写入日志
if [ -s "$error_file" ]; then
sed 's/^/ /' "$error_file" >> "$LOG_FILE"
else
echo " 未捕获到具体错误信息" >> "$LOG_FILE"
fi
# 检查可能的问题
echo " 可能的问题排查:" >> "$LOG_FILE"
# 检查受体文件
if [ ! -s "$RECEPTOR" ]; then
echo " - 受体文件为空或不可读" >> "$LOG_FILE"
fi
# 检查配置文件格式
if ! grep -q "center_" "$CONFIG" 2>/dev/null; then
echo " - 配置文件可能格式不正确缺少center_参数" >> "$LOG_FILE"
fi
# 检查配体文件
invalid_ligands=0
for ligand in "$LIGANDS_DIR"/*.pdbqt; do
if [ -f "$ligand" ] && [ ! -s "$ligand" ]; then
echo " - 发现空的配体文件: $(basename "$ligand")" >> "$LOG_FILE"
((invalid_ligands++))
fi
done
if [ "$invalid_ligands" -gt 0 ]; then
echo " - 发现 $invalid_ligands 个无效的配体文件" >> "$LOG_FILE"
fi
rm -f "$error_file"
exit 1
fi
# 记录汇总信息
echo "================================" >> "$LOG_FILE"
echo "结束时间: $(date)" >> "$LOG_FILE"
# 统计最终结果
final_output_count=$(find "$OUTPUT_DIR" -name "*_out.pdbqt" | wc -l)
echo "最终输出文件数量: $final_output_count" >> "$LOG_FILE"
if [ "$final_output_count" -lt "$ligand_count" ]; then
missing_count=$((ligand_count - final_output_count))
echo "警告: 有 $missing_count 个配体可能对接失败" >> "$LOG_FILE"
fi
# 清理临时文件
rm -f "$error_file"
echo "详细日志请查看: $LOG_FILE"