课程目标与前置知识

我们为什么要学这门课?

ADMET 这个词,懂点药物设计的同学都不陌生——吸收、分布、代谢、排泄、毒性。说白了,分子能不能成药,不光看活性,还要看它在体内“活”得怎么样。我个人习惯把 ADMET 描述符比作分子的体检报告:溶解度、logP、pKa、渗透性……每一项都是关键指标。

但问题来了:从不同平台、不同版本的工具算出来的描述符,结果往往对不上。比如你用 RDKit 算的 logP 和用 OpenBabel 算的,差 0.5 个 log 单位都很常见。这时候你信哪个?

一致性校验就是为了解决这个“打架”的问题。我早期做虚拟筛选时,就因为没做校验,用了一个偏大的溶解度值,结果后续合成出来的化合物全沉淀了——嗯,那批实验白做,很惨。所以这门课的核心目标,就是帮你建立起一套可复用的校验流程,让你能快速发现不一致、定位原因、统一描述符口径。

你需要具备哪些前置技能?

我建议你至少得能写点 Python,不然后面的自动化脚本跑不起来。下面列了份清单,你对照看看:

技能/工具 最低要求 推荐版本
Python 基础 会写列表推导、字典操作、基本 I/O 3.8+
Pandas 能读写 DataFrame,会用 apply 和 groupby 1.5+
RDKit 能读取 SMILES,计算普通描述符 2023.03+
统计学基础 均值、标准差、相关系数、T 检验 理解即可
命令行 能运行脚本、管理虚拟环境 ——
课前自检小脚本: 把下面这段扔到你环境里跑一下,没报错就说明基本环境 OK。
import pandas as pd
from rdkit import Chem
from rdkit.Chem import Descriptors
print("Pandas:", pd.__version__)
print("RDKit:", Chem.RdkitVersion)
mol = Chem.MolFromSmiles("c1ccccc1")
logP = Descriptors.MolLogP(mol)
print("logP 测试:", logP)

我踩过的一些坑

  • 版本不一致。 我以前接手过一个项目,RDKit 2019 算的 TPSA 和 2023 版的差了 2.3 Ų。查了半天才发现是原子类型定义更新了。所以建议统一版本,或在结果里标注工具版本。
  • 默认参数陷阱。 有的描述符计算函数有隐藏参数。比如 pH 默认是 7.4 还是 7.0?不写清楚,别人复现不了。
  • 浮点数比较。 直接 `if a == b` 判断一致,99% 会翻车。一定要用容差比较,比如 abs(a-b) < 1e-6。
  • 分子输入格式。 SMILES 和 SDF 读出来的描述符可能差一点点,因为二维构象不一样。我建议统一用规范 SMILES 作为输入。

本章知识体系

下面这张图把一致性校验的整个流程串起来了。你先有个全局概念,后续各章会逐个拆解。

ADMET 描述符一致性校验流程 化合物集合(SMILES/SDF) 多工具计算描述符 数据对齐与标准化 一致性校验评估 报告与可视化 统计指标(MAE/RMSE) 异常值检测 一致性汇总表 偏差分布图 核心:对比不同工具/版本下的同一描述符,量化偏差,定位根因,统一口径
为什么我要把它画成流程图? 因为一致性校验不是单个函数就能搞定的,它是一个“输入 → 计算 → 对齐 → 评估 → 报告”的闭环。我在多个项目中,只要按这个流程走,80% 的描述符纠纷都能当场解决。

一句话总结

学完这门课,你将拥有一套能直接复用的 Python 流水线:从读结构文件到输出一致性报告,全自动。但我得先确认一件事——你当前的 Python 环境能跑通上面的自检脚本吗?如果不能,先把环境配好,然后我们再往下走。

注意: 本课程所有代码假设你已安装 pandas、numpy、rdkit、matplotlib、scipy。如果缺包,请用 pip install pandas numpy matplotlib scipy rdkit-pypi 一步到位。千万别用手工编译 RDKit,那太折磨人了。