一、ADMET 预测概述与 Snakemake 简介
做药物研发的朋友,不知道你们有没有这个感觉:一个候选化合物在细胞实验里效能很好,可一上动物实验就出问题。不是吸收太差,就是代谢太快,最怕的是肝脏毒性直接让整个项目暂停。这些问题,说白了就是药物的ADMET性质没过关。
ADMET 是 Absorption(吸收)、Distribution(分布)、Metabolism(代谢)、Excretion(排泄)和 Toxicity(毒性)的缩写。我们做计算机辅助药物设计,最终目的就是尽可能早地把这些性质搞清楚,避免后期踩坑。
我自己刚入行时,ADMET 预测基本靠手动跑脚本。一个化合物跑完所有性质预测,得手动配置环境、修改参数、再逐个运行工具。当时一个项目有 5000 个化合物,我连续加了三天班才跑完一轮。后来我发现了 Snakemake 这个工具,它把整个流程变得自动化、可重复。嗯,这次咱们就来聊聊怎么用 Snakemake 构建一套完整的 ADMET 预测流水线。
1.1 什么是 ADMET 预测
ADMET 预测就是通过计算机模型,预测化合物在体内的行为。它不是单一任务,而是一系列独立的预测任务的集合。每个任务背后都有自己的算法和工具。
举个例子,你想预测一个化合物的 肝毒性,可以选择 DEREK、TOPKAT 或者基于机器学习的模型。但不同的模型输入格式可能不同:有的要 SMILES 字符串,有的要 SDF 文件,还有的要 MOE 描述符。手动来回转换格式,非常烦人。
| ADMET 性质 | 常见预测工具 | 输入格式 |
|---|---|---|
| 吸收 (Absorption) | ADMET Predictor, QikProp | SMILES, SDF |
| 分布 (Distribution) | VolSurf+, MOE | MOL2, SDF |
| 代谢 (Metabolism) | StarDrop, MetaSite | SMILES, SDF |
| 排泄 (Excretion) | ADMET Predictor, GastroPlus | SMILES, SDF |
| 毒性 (Toxicity) | DEREK, TOPKAT, ProTox-II | SMILES, SDF |
你想想看,如果每个工具都要手动配置输入、执行命令、再整理输出,不只效率低,还容易出错。我在项目中就吃过这个亏——因为手动改错了文件路径,导致一整批结果全作废,又重跑了一遍。
1.2 传统方式 vs Snakemake 方式
咱们来对比一下这两种方式的差别。先看传统方式是怎么干的。
# 传统方式:手动逐个运行
python predict_absorption.py --input data.sdf --output absorption.csv
python predict_distribution.py --input data.sdf --output distribution.csv
python predict_metabolism.py --input data.sdf --output metabolism.csv
python predict_toxicity.py --input data.sdf --output toxicity.csv
这种方式的问题很明显:
- 你必须等上一个命令跑完才能跑下一个
- 如果中间某个步骤失败,你得重新手动启动
- 换了新的化合物库,你得把整个流程再手动跑一遍
- 想并行跑多个性质?你得自己写 shell 脚本管理后台进程
Snakemake 是怎么干的呢?它会根据你的规则自动编排执行顺序。你只需要写好 Snakefile,它就能自动处理依赖、并行、重试等逻辑。
我记得有次在超级计算中心跑大规模 ADMET 预测,集群有 100 多个核。用 Snakemake 只需要指定可用核数,它会自动把没有依赖关系的任务并行提交。那个项目的 2 万个化合物,原本手动跑至少要一周,换成 Snakemake 后一个晚上就全出结果了。
1.3 Snakemake 的核心概念
Snakemake 的核心其实很简单,就三个东西:规则、输入、输出。每个规则定义了一个计算步骤:输入什么文件,输出什么文件,以及用什么命令来转换。
看一个最基础的例子:
rule predict_absorption:
input:
"data/raw_compounds.sdf"
output:
"results/absorption.csv"
shell:
"python scripts/calc_absorption.py {input} {output}"
这个规则告诉 Snakemake:要生成 results/absorption.csv,必须先有 data/raw_compounds.sdf,然后执行 calc_absorption.py 脚本。Snakemake 会自动检查这些文件是否存在,如果缺少输入文件,它会去寻找生成这个输入文件的规则。
我刚开始用 Snakemake 时,最喜欢的就是它的失败重试机制。在集群上跑预测时,网络不稳定或者工具崩溃是常态。Snakemake 可以设置重试次数:
rule predict_metabolism:
retries: 3
input:
"results/absorption.csv"
output:
"results/metabolism.csv"
shell:
"python scripts/calc_metabolism.py {input} {output}"
当规则执行失败时,Snakemake 会自动重试最多 3 次。如果最终还是失败,它会把错误信息记录在日志里,然后继续执行其他不依赖这个结果的任务。这种容错能力在手动流程里几乎不可能实现。
1.4 为什么用 Snakemake 构建 ADMET 流水线
好,现在咱们把 snakemake 和 ADMET 预测结合起来。为什么要用 Snakemake?说白了就三个理由:
- 可重复性:整个流程定义在 Snakefile 里,换个机器、换个人运行,结果一样
- 可扩展性:从 10 个化合物扩展到 10 万个化合物,只需要改输入文件路径,不用改流程
- 可维护性:某个预测工具升级了,只需修改对应的规则,不影响其他部分
为了让你更直观地理解整个架构,我画了一张图。它展示了一个典型的 ADMET 预测流水线在 Snakemake 下的工作方式。
你应该能看出来,这个结构很清晰。输入文件经过预处理后,Snakemake 自动识别出吸收、分布、代谢、毒性这四个预测任务之间没有依赖关系,于是把它们并行执行。等所有预测任务完成后,再自动触发汇总步骤。
我曾经用这个方法在一个项目上做过实际验证:3500 个化合物,在一台 32 核的服务器上,整个 ADMET 预测流程跑了不到 2 小时。而同样的工作,如果用手动方式,至少需要 3 到 4 天,而且中间一旦出错就得从头再来。
1.5 本章小结
咱们在这一章里聊了 ADMET 预测的基本概念,对比了传统手动方式和 Snakemake 方式的差距,也看了几个简单的 Snakemake 规则示例。核心就一句话:ADMET 预测需要多条并行任务,Snakemake 是管这事的好工具。
好,这一章就到这里。技术上的基础框架咱们已经搭好了,接下来就要逐步深入具体实现细节了。