一、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, QikPropSMILES, SDF
分布 (Distribution)VolSurf+, MOEMOL2, SDF
代谢 (Metabolism)StarDrop, MetaSiteSMILES, SDF
排泄 (Excretion)ADMET Predictor, GastroPlusSMILES, SDF
毒性 (Toxicity)DEREK, TOPKAT, ProTox-IISMILES, SDF

你想想看,如果每个工具都要手动配置输入、执行命令、再整理输出,不只效率低,还容易出错。我在项目中就吃过这个亏——因为手动改错了文件路径,导致一整批结果全作废,又重跑了一遍。

注意:ADMET 预测不是「一个工具干所有事」。不同的性质可能需要不同的模型和工具,每个工具的环境依赖也可能冲突。这正是我们需要工作流管理系统的原因。

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,它就能自动处理依赖、并行、重试等逻辑。

核心区别:传统方式是人盯着流程跑,Snakemake 是流程自动找人来跑。

我记得有次在超级计算中心跑大规模 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 会从最终目标文件开始,反向追溯所有依赖。

我刚开始用 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?说白了就三个理由:

  1. 可重复性:整个流程定义在 Snakefile 里,换个机器、换个人运行,结果一样
  2. 可扩展性:从 10 个化合物扩展到 10 万个化合物,只需要改输入文件路径,不用改流程
  3. 可维护性:某个预测工具升级了,只需修改对应的规则,不影响其他部分

为了让你更直观地理解整个架构,我画了一张图。它展示了一个典型的 ADMET 预测流水线在 Snakemake 下的工作方式。

ADMET 预测 Snakemake 工作流架构 输入:化合物库 SDF 数据预处理(清洗/标准化) Snakemake 自动并行调度:无依赖的任务同时跑 吸收预测 分布预测 代谢预测 毒性预测 汇总结果(CSV/JSON) Snakemake 自动处理依赖、并行调度、失败重试,你只需关注每个预测规则的实现

你应该能看出来,这个结构很清晰。输入文件经过预处理后,Snakemake 自动识别出吸收、分布、代谢、毒性这四个预测任务之间没有依赖关系,于是把它们并行执行。等所有预测任务完成后,再自动触发汇总步骤。

我曾经用这个方法在一个项目上做过实际验证:3500 个化合物,在一台 32 核的服务器上,整个 ADMET 预测流程跑了不到 2 小时。而同样的工作,如果用手动方式,至少需要 3 到 4 天,而且中间一旦出错就得从头再来。

1.5 本章小结

咱们在这一章里聊了 ADMET 预测的基本概念,对比了传统手动方式和 Snakemake 方式的差距,也看了几个简单的 Snakemake 规则示例。核心就一句话:ADMET 预测需要多条并行任务,Snakemake 是管这事的好工具。

记住一点:Snakemake 不是帮你做预测的工具,而是帮你管理预测流程的工具。你依然需要准备各个预测任务的脚本和模型,但 Snakemake 能让这些任务有序、自动地跑起来,不会乱也不会漏。

好,这一章就到这里。技术上的基础框架咱们已经搭好了,接下来就要逐步深入具体实现细节了。