AutoDock Vina批量对接结果太分散?一个脚本帮你把所有log.txt合并成Excel表格
AutoDock Vina批量对接结果高效整合从分散log到结构化Excel的自动化方案每次运行完AutoDock Vina批量分子对接后面对几十甚至上百个分散在各文件夹中的log.txt文件你是否也经历过这样的困境手动打开每个文件复制粘贴数据不仅耗时耗力还容易出错。更重要的是这些零散的数据难以进行整体分析和可视化比较。本文将带你开发一套完整的自动化解决方案用Python脚本实现log文件关键信息提取、多维度数据整合以及一键生成结构化Excel报告的全流程。1. 为什么需要自动化处理批量对接结果分子对接实验通常需要测试数十个配体与受体的相互作用AutoDock Vina会为每个配体生成独立的输出文件夹包含log.txt和out.pdbqt两个核心文件。其中log.txt记录了对接过程的详细信息和最终结果包括结合亲和力Affinity单位为kcal/molRMSD值衡量对接构象差异的指标最佳对接构象的坐标信息各对接模式的能量排名传统手动收集这些数据存在三大痛点效率低下打开每个文件复制粘贴、容易出错人工操作难免失误和分析受限难以进行跨配体比较。我们的自动化方案将解决这些问题实现# 伪代码展示自动化流程概览 def auto_process(): log_files 查找所有log.txt文件() extracted_data 提取关键信息(log_files) df 转换为结构化数据(extracted_data) df.to_excel(汇总结果.xlsx) 生成可视化图表(df)2. 环境准备与脚本基础框架在开始编写脚本前需要确保工作环境已配置妥当。这套方案支持Windows和Linux/macOS系统核心依赖仅需Python 3.6和几个常用科学计算库。2.1 安装必要Python库打开终端或命令提示符执行以下安装命令pip install pandas openpyxl matplotlib提示建议使用conda或venv创建独立的Python环境避免库版本冲突2.2 项目目录结构规范为保持工作区整洁推荐按以下结构组织文件项目根目录/ │── 配体文件夹_1/ │ ├── log.txt │ └── out.pdbqt │── 配体文件夹_2/ │ ├── log.txt │ └── out.pdbqt ├── collect_logs.py (我们的主脚本) └── 汇总结果.xlsx (脚本运行后生成)3. 核心脚本开发从log提取到Excel生成现在进入最关键的脚本编写环节。我们将分步骤构建一个健壮的log处理器不仅能处理标准情况还能应对各种边缘案例。3.1 递归查找所有log文件首先需要定位所有待处理的log.txt文件考虑到它们可能分布在多级子目录中import os from pathlib import Path def find_log_files(root_dir): 递归查找目录下所有log.txt文件 log_files [] for dirpath, _, filenames in os.walk(root_dir): if log.txt in filenames: log_files.append(Path(dirpath) / log.txt) return sorted(log_files) # 按字母顺序排序便于后续处理3.2 解析单个log文件的关键信息每个log.txt的结构相对固定关键信息集中在文件末尾。我们需要提取配体名称从文件夹名获取各对接模式的亲和力最佳结合构象的RMSD值def parse_log_file(log_path): 解析单个log.txt文件返回结构化数据 data { ligand: log_path.parent.name, affinities: [], best_rmsd: None } with open(log_path, r) as f: lines f.readlines() # 提取亲和力数据通常在最后9行 for line in lines[-9:]: if line.startswith(-----): continue parts line.strip().split() if len(parts) 4: try: affinity float(parts[3]) data[affinities].append(affinity) except (ValueError, IndexError): pass # 提取RMSD数据如果存在 for line in lines: if RMSD from best mode in line: data[best_rmsd] float(line.split()[-1]) return data3.3 数据整合与Excel导出收集所有log文件数据后使用pandas进行结构化处理和Excel导出import pandas as pd def save_to_excel(data_list, output_file): 将提取的数据保存为Excel文件 # 构建DataFrame rows [] for data in data_list: row { Ligand: data[ligand], Best_Affinity: min(data[affinities]) if data[affinities] else None, Avg_Affinity: sum(data[affinities])/len(data[affinities]) if data[affinities] else None, Best_RMSD: data[best_rmsd] } # 添加各模式亲和力 for i, aff in enumerate(data[affinities], 1): row[fMode_{i}_Affinity] aff rows.append(row) df pd.DataFrame(rows) # 保存Excel with pd.ExcelWriter(output_file, engineopenpyxl) as writer: df.to_excel(writer, indexFalse, sheet_nameSummary) # 添加数据透视表 pivot df.pivot_table(values[Best_Affinity, Avg_Affinity], indexLigand, aggfuncfirst) pivot.to_excel(writer, sheet_namePivot) return df4. 进阶功能自动化分析与可视化基础数据处理完成后我们可以进一步添加分析功能帮助快速识别潜在候选分子。4.1 亲和力分布直方图import matplotlib.pyplot as plt def plot_affinity_distribution(df, output_dir): 生成亲和力分布直方图 plt.figure(figsize(10, 6)) plt.hist(df[Best_Affinity].dropna(), bins20, colorskyblue, edgecolorblack) plt.title(Distribution of Best Affinity Scores) plt.xlabel(Affinity (kcal/mol)) plt.ylabel(Frequency) plt.grid(True, alpha0.3) plot_path Path(output_dir) / affinity_distribution.png plt.savefig(plot_path, dpi300, bbox_inchestight) plt.close() return plot_path4.2 亲和力与RMSD散点图def plot_affinity_vs_rmsd(df, output_dir): 生成亲和力-RMSD关系图 plt.figure(figsize(10, 6)) plt.scatter(df[Best_Affinity], df[Best_RMSD], alpha0.6, colorcoral) plt.title(Affinity vs RMSD) plt.xlabel(Best Affinity (kcal/mol)) plt.ylabel(RMSD from best mode) plt.grid(True, alpha0.3) plot_path Path(output_dir) / affinity_vs_rmsd.png plt.savefig(plot_path, dpi300, bbox_inchestight) plt.close() return plot_path5. 完整脚本集成与使用示例将上述功能整合成完整的命令行工具import argparse def main(): parser argparse.ArgumentParser(descriptionAutoDock Vina log文件处理器) parser.add_argument(input_dir, help包含log.txt的根目录) parser.add_argument(-o, --output, defaultvina_results.xlsx, help输出Excel文件名) args parser.parse_args() print(f正在处理目录: {args.input_dir}) log_files find_log_files(args.input_dir) print(f找到 {len(log_files)} 个log文件) all_data [] for log_file in log_files: try: data parse_log_file(log_file) all_data.append(data) except Exception as e: print(f处理 {log_file} 时出错: {str(e)}) df save_to_excel(all_data, args.output) print(f结果已保存到 {args.output}) # 生成可视化图表 plot_affinity_distribution(df, args.input_dir) plot_affinity_vs_rmsd(df, args.input_dir) print(分析图表已生成) if __name__ __main__: main()使用方式python collect_logs.py 对接结果根目录 -o 我的分析结果.xlsx6. 错误处理与特殊情况应对在实际应用中可能会遇到各种异常情况。我们的脚本需要具备足够的健壮性缺失log文件跳过并记录警告格式不规范的log尝试恢复关键数据不同Vina版本差异自动检测并适配大规模数据处理添加进度条和内存优化# 增强版的错误处理示例 def robust_parse(log_path): try: data parse_log_file(log_path) if not data[affinities]: raise ValueError(未找到有效的亲和力数据) return data except Exception as e: print(f警告: 无法完全解析 {log_path} - {str(e)}) # 尝试最小化恢复 return { ligand: log_path.parent.name, affinities: [], best_rmsd: None }7. 性能优化与大规模数据处理当处理数百个对接结果时需要考虑性能优化并行处理使用多进程加速文件解析内存管理分批处理极大文件集合缓存机制避免重复处理相同文件from multiprocessing import Pool def parallel_parse(log_files, workers4): 并行解析多个log文件 with Pool(workers) as p: results p.map(robust_parse, log_files) return [r for r in results if r[affinities]] # 过滤空结果这套方案不仅解决了原始问题还提供了数据分析、可视化和性能优化的完整工具链。根据实际项目需求可以进一步扩展功能如添加3D结合构象的自动截图集成分子相似性分析对接结果与实验数据的关联分析构建自动化报告生成系统