本文收录于专栏<CADD 中的机器学习模型>—— 专栏覆盖机器学习打分函数、描述符与相似度方法在药物设计中的落地部署,点击订阅可跟踪后续更新。
你做骨架跃迁或等排体替换时,2D 指纹经常"结构对了分数反而低",对接打分又说不清静电互补。这篇把开源库 espsim 从检索、本地部署到官方测试脚本全流程跑通,附 4 对经典等排体加自对照的实测分数表、Carbo/Tanimoto/MC 积分参数对比,以及 pkg_resources 崩溃等 5 条实测踩坑。你读完可直接照抄命令,给自己手里的类似物系列批量打形状加静电势双相似度分,让假相似分子现形。
关键字:espsim、静电势相似度、ESP、生物电子等排体、骨架跃迁、RDKit、Carbo 指数、虚拟筛选
目录
- §1. 场景:什么时候你需要 ESP 相似度
- §2. 原理:三 Gaussian 展开 + Carbo 指数
- §3. 本地部署(Ubuntu,纯 CPU)
- §4. 安装测试:官方三个脚本
- §5. 实战:4 对经典等排体打分
- §6. API 参数与 5 条实测踩坑
- §7. 局限与展望
- §8. 结语
相关教程与核心文献
| 资源 | 链接 | 与本文关系 |
|---|---|---|
| GitHub 仓库 hesther/espsim | github.com/hesther/espsim | 本文部署与测试的出处(实测 239 star / MIT / 最近更新 2025-08) |
| 官方 README 安装与用法 | README.md | 安装命令、API 语义、目标值 0.85 的出处 |
| espsim 论文:Bolcato G, Heid E, Boström J.JCIM62(6):1388-1398, 2022 | 10.1021/acs.jcim.1c01535 | 工具本身的出处,含 DeepFMPO v3D 骨架跃迁基准 |
| Good AC 等,Gaussian 快速分子相似度,JCICS32:188-191, 1992 | 10.1021/ci00007a002 | 三 Gaussian 拟合库仑势方法的原始文献 |
| Carbo R 等,LCAO–MO 相似度度量,Int. J. Quantum Chem.32:517-545, 1987 | 10.1002/qua.560320412 | Carbo 相似度指数的原始文献 |
§1. 场景:什么时候你需要 ESP 相似度
先导化合物优化走到骨架跃迁或等排体替换时,最常遇到的困境是:两个分子 2D 结构差很远,但药效团和静电谱几乎一样(这正是替换成功的前提);或者反过来,2D 指纹高度相似但关键位点的静电分布已经变了。2D Tanimoto 对这两类情况都无能为力——它根本不看三维空间里的电子分布。
ESP(静电势)相似度就是为这个场景设计的打分:它把两个分子按共同骨架叠合后,比较周围空间静电势场的重叠程度。典型用途:
- 等排体验证:COOH→四氮唑、酰胺→三唑、磺酰胺→磺酰脲,替换后 ESP 谱是否保持;
- 骨架跃迁打分:生成模型或你自己的设计给出大量候选,用 shape + ESP 双分数快速过滤;
- 虚拟筛选精排:对接打分排在 shape/ESP 相似度之后做第二道过滤器;
- 老药新用检索:以已知活性配体为参照,比较库内分子的三维静电谱。
商业工具里这套逻辑的代表是 OpenEye 的 ROCS/EON;espsim 是 MIT Esther Heid 组开源的轻量替代——纯 Python、RDKit 生态、几秒一个分子,适合批量前处理和教学复现。
§2. 原理:三 Gaussian 展开 + Carbo 指数
一句话:把静电势的 1/r 项用三个 Gaussian 函数拟合展开,两个分子 ESP 场的重叠积分就有了解析解,再归一化成相似度指数。
具体分两步(对应上面两篇原始文献):
- ESP 重叠积分:每个原子视为点电荷,库仑势 1/r 用三组 Gaussian 线性组合逼近(Good 1992 的经典做法,也是 shape-only 打分 ROCS 的数学基础)。两个分子 A、B 的 ESP 乘积在全空间的积分就变成一堆双中心 Gaussian 积分的求和——全是解析式,不用数值格点,速度极快。
- 归一化成指数:Carbo 指数 = ∫VA·VB / √(∫VA²·∫VB²),范围 [-1, 1];Tanimoto 变体 = ∫VA·VB / (∫VA²+∫VB²−∫VA·VB),对静电差异惩罚更重。分子完全相同 = 1。
形状分数直接调 RDKit 的ShapeTanimotoDist取 1−d。整个过程在消费级 CPU 上毫秒级完成,不需要 GPU。
§3. 本地部署(Ubuntu,纯 CPU)
仓库自带的environment.yml把 psi4(QM 电荷)、resp、chemprop-atom-bond(ML 电荷)、pytorch 全列进去了,全套 conda solve 又重又慢。核心 ESP + shape 打分只需要 rdkit/numpy/scipy,QM/ML 电荷是可选增强,先跑通再按需补。
# 1. 克隆仓库 cd ~/Desktop/M3 git clone --depth 1 https://github.com/hesther/espsim cd espsim#2. 独立 conda 环境(Python 3.10) conda create -n espsim python=3.10 -y conda install -n espsim -y -c conda-forge rdkit "numpy<2" scipy scikit-learn tqdm说明:环境里的 rdkit 由 conda-forge 提供;如果 conda solve 卡住,
拆开装或用 pip 补:pip install "numpy<2" scipy scikit-learn tqdm
#3. 源码安装 espsim 本体 conda run -n espsim pip install -e .#4. 关键一步:压 setuptools(见 §6 踩坑 1) conda run -n espsim pip install "setuptools<81"装完的版本清单(实测):Python 3.10 / rdkit 2026.03.5 / numpy 1.26.4 / scipy 1.15.3 / espsim 0.0.1 / setuptools 80.10.2。
Windows 用户:rdkit 走conda install -c conda-forge rdkit同样可用,其余命令不变;本文所有测试在 Ubuntu 22.04 完成。
§4. 安装测试:官方三个脚本
仓库scripts/下自带三个测试脚本,装完先跑它们确认环境健康:
cd ~/Desktop/M3/espsim python scripts/test_esp_function.py # ESP 相似度主测试 python scripts/test_imports.py # 导入完整性 python scripts/test_embedalignscore.py # 嵌入+叠合+打分全链路实测结果(Ubuntu 22.04,纯 CPU):
| 脚本 | 实测输出 | 判定 |
|---|---|---|
test_esp_function.py | mol / mol2 / sdf 三种格式读入全部0.85 | 与 README 声明的 target: 0.85 精确一致 |
test_imports.py | Test passed, imports work fine. | 通过 |
test_embedalignscore.py | 8 个苹果酸类似物 shape/ESP 打分表正常输出(如 CCC(C(=O)O)O → 0.95 / 0.77) | 通过 |
test_esp_function.py的 0.85 是最好的环境健康指标——它验证的不只是 import,而是 Gaussian 积分、电荷读取、叠合全链路的数值正确性。
§5. 实战:4 对经典等排体打分
环境通过后,用真实等排体对验证打分行为。以苯甲酸为参照,测 4 个替换方向 + 自对照:
import numpy as np from rdkit import Chem from rdkit.Chem import AllChem from espsim import EmbedAlignScore def prep(smi): m = Chem.AddHs(Chem.MolFromSmiles(smi)) # 必须加氢! AllChem.EmbedMultipleConfs(m, numConfs=10, randomSeed=42) return m ref = prep("O=C(O)c1ccccc1") # 苯甲酸 prb = prep("c1ccc(cc1)c2nnn[nH]2") # 5-苯基四氮唑 shape, esp = EmbedAlignScore(prb, ref) # 返回的是 list! print(f"shape={max(shape):.3f} esp={max(esp):.3f}")实测分数表(Gasteiger 电荷,中性形式,10 构象取最优):
| 对比组 | shape | ESP (carbo) |
|---|---|---|
| 苯甲酸 vs 5-苯基四氮唑(COOH→四氮唑) | 0.859 | 0.496 |
| 苯甲酸 vs 烟酸(间位 CH→N) | 0.987 | 0.782 |
| 苯甲酸 vs 硝基苯(COOH→NO₂,弱等排) | 0.988 | 0.544 |
| 苯甲酸 vs 阿司匹林(酰化 + 邻位取代) | 0.705 | 0.421 |
| 苯甲酸 vs 自身(sanity check) | 1.000 | 1.000 |
三个行为值得注意:
- shape 和 ESP 明显解耦:硝基苯形状 0.988 几乎完美重叠,ESP 却只有 0.544——这正是 2D/shape-only 打分看不见、ESP 打分能抓住的差异;
- 自对照 1.000说明叠合和积分管线无系统偏差;
- 四氮唑的 ESP 分数偏低是电荷模型的锅,不是方法失效:四氮唑作 COOH 等排体的关键在去质子化态的负电分布,而 Gasteiger 在中性形式上算电荷(见 §7)。
同一对分子还能切换积分方式和指标(已叠合构象直接调GetEspSim):
| 配置 | 实测值 | 说明 |
|---|---|---|
metric="carbo"(默认,gauss 积分) | 0.519 | 解析积分,毫秒级 |
metric="tanimoto" | 0.348 | 对静电差异惩罚更重 |
integrate="mc", nMC=5 | 0.579 | Monte Carlo 数值积分,可交叉验证 |
renormalize=True | 0.759 | 重标到 [0,1],跨批次比较友好 |
§6. API 参数与 5 条实测踩坑
GetEspSim的完整签名(源码实测):GetEspSim(prbMol, refMol, prbCid, refCid, prbCharge, refCharge, metric, integrate, partialCharges, renormalize, customrange, marginMC, nMC, basisPsi4, methodPsi4, gridPsi4, ...)。想用 QM 电荷时传partialCharges="psi4"(需另装 psi4),或用chemprop-atom-bond的 ML 电荷模型(需 pytorch)。
踩坑清单(全部实测复现):
| # | 症状 | 根因 | 修复 |
|---|---|---|---|
| 1 | ModuleNotFoundError: No module named 'pkg_resources' | espsim 0.0.1 的helpers.py用了被 setuptools 81 移除的旧 API | pip install "setuptools<81"(实测装 80.10.2 通过) |
| 2 | 分子没加氢,结果异常 + RDKit 警告 | Gasteiger 电荷和 shape 都依赖显式氢 | Chem.AddHs(mol)必须在嵌入前调用 |
| 3 | TypeError: unsupported format string passed to list.__format__ | EmbedAlignScore返回的是构象列表不是标量 | max(shape)/max(esp)取最优构象 |
| 4 | GetEspSim() got unexpected keyword 'prbConfId' | 构象参数名是prbCid不是prbConfId;且GetShapeSim没有metric参数(shape 固定用 RDKit Tanimoto 距离) | 按源码签名传参 |
| 5 | conda 按environment.yml全家桶 solve 超时/卡死 | psi4 + pytorch + resp 通道混合求解空间巨大 | 只装 rdkit/numpy/scipy 核心件,QM 电荷后补 |
§7. 局限与展望
- Gasteiger 电荷是默认天花板:对中性小分子 SAR 排序够用,但带电物种(羧酸/四氮唑的生理态就是阴离子)的 ESP 谱会系统性失真。要过硬结论需换
psi4(RESP 级 QM 电荷)或 chemprop-atom-bond 的 ML 电荷——这也是作者组自己论文里 ML 电荷模型的动机。带电分子务必先用小测试集校验电荷敏感性。 - 单构象叠合假设:
EmbedAlignScore用 RDKit 嵌入 + 对齐,柔性分子需要多构象取最优(本文 10 构象),高柔性大分子的构象采样会成为瓶颈。 - 版本停滞风险:0.0.1 是 PyPI 唯一版本,仓库最近一次推送 2025-08,issue 只有 3 个 open——小而稳,但
pkg_resources这类依赖腐烂要自己扛(好在修复只要一行)。
结语
espsim 的定位很清楚:ROCS/EON 的开源轻量平替,一条 pip 命令就能给你的等排体和骨架跃迁候选加一道静电维度过滤。核心管线三行代码出分数,官方测试 0.85 精确复现说明数值可信。下一步建议:把你手头类似物系列的参照配体挑出来,先跑EmbedAlignScore批量打分,发现 shape 高 ESP 低的"假相似"分子时再上 psi4/ML 电荷复核——这个两段式流程能覆盖大多数先导优化的静电评估需求。
参考来源
- hesther/espsim 仓库:github.com/hesther/espsim(实测 2026-09:239 star / 53 fork / MIT / espsim 0.0.1)
- espsim 论文:Bolcato G, Heid E, Boström J.On the Value of Using 3D Shape and Electrostatic Similarities in Deep Generative Methods. JCIM 62(6):1388-1398, 2022. DOI
- Good AC 等 Gaussian 相似度方法:JCICS32:188-191, 1992. DOI
- Carbo 相似度指数:Carbo R, Arnau M, Leyda L.Int. J. Quantum Chem.32:517-545, 1987. DOI
- 本文全部实测命令与输出:随文资产包
espsim-资产包.zip(demo 脚本 + 实测输出记录,路径已脱敏)
更多专栏:
| 蛋白 / 多肽 | 分子模拟 / 动力学 | 分子对接 / CADD / 工具 | 其他 |
|---|---|---|---|
| 开源蛋白结构推理预测 | 分子模拟基础 | UCSF DOCK系列 | agent智能体系列 |
| 开源蛋白生成方法实践 | 分子动力学模拟-Amber | rDock系列 | 化学大模型介绍(2025) |
| 蛋白药物设计-原理与案例剖析 | 分子动力学模拟-Gromacs | LeDock系列 | 我胡师兄说药 |
| 开源多肽设计模型和方法实践 | 結合自由能 | CADD中的机器学习模型 | siRNA药物设计模型 |
| 开源多肽性质预测 | 高效计算基本配置 | 小分子药物设计-原理与案例剖析 | ASO药物设计模型 |
| 多肽药物设计-原理与案例剖析 | 作用于DNA/RNA的药物设计实践 | 开源小分子生成和设计实践 | 开源药代动力学模拟软件 |