
你在做先导化合物优化时想在几分钟内看到候选分子的静电势ESP表面而不是排队等 DFT你想给 espsim、MMGBSA 或者可视化软件喂一套近 DFT 质量的原子电荷而不是粗糙的 Gasteiger你找到 Astex 2019 年开源的 ESP-DNN 图卷积模型结果发现官方仓库是 Python 2.7 TF 1.10 的化石python -m esp_dnn.predict第一行就报 SyntaxError。本文带你从 git clone 开始用 6 处最小补丁把 ESP_DNN 搬到 Python 3.11 TF 2.15跑通 ligand / protein 双模式4 个配体 2 个蛋白的 PQR 输出与官方 ground truthmd5 逐字节一致阿司匹林 / 咖啡因新分子全链 0.2–0.3 秒出结果。关键词ESP-DNN、静电势表面、图卷积网络、Astex、PQR、PLI、off-center 电荷、Python 3 迁移相关教程与核心文献资源链接与本文关系AstexUK/ESP_DNN 仓库github.com/AstexUK/ESP_DNN部署对象DNN 模型 PLI 二进制 示例Rathi P, Ludlow RF, Verdonk ML,J. Med. Chem.2020, 63(16), 8778–879010.1021/acs.jmedchem.9b01129原始论文online 2019-09-25NGL Viewernglviewer.org/ngl官方推荐的 ESP 表面可视化AstexUK/esp-surface-generatorgithub.com/AstexUK/esp-surface-generatorNGL 表面网格导出脚本PQR 格式说明apbs-pdb2pqr 文档输出格式坐标电荷半径先看看文章中模型的效果训练集以及测试集上的验证针对训练集生成的DFT-fp对DNN模型进行了训练。 上图显示了DFT-fp Δq值相对于训练集的预测DNN-fp值的曲线图。 显然该模型能够很好地描述训练集分子的点电荷R2 0.996RMSE Δq 0.010e。 此外在整个训练集中RMSEV平均值为3.30 kcal / molDNN-fp 模型生成的ESP表面质量近似于DFT-fp计算出的ESP表面。 将DNN-fp模型在测试集中的表现显示DNN-fp和DFT-fpΔq值之间具有良好的相关性其中R2 0.981RMSE Δq 0.022e。通过DNN-fp模型生成的ESP表面积§1. 这个工具解决什么问题众所周知分子的静电性质可以用于预测化学反应性及分子间相互作用。常规流程是在分子表面移动单位电荷探针、逐点算 ESP 再着色得到 ESP 表面。药物研发中静电互补优化至关重要——但 ESP 表面质量基本取决于底层静电模型而蛋白-配体相互作用的静电效应只有量子力学QM计算能准确捕获DFT 单分子动辄小时级没法当常规药物设计工具用。行业折中一直很尴尬电荷模型速度质量问题Gasteiger / MMFF毫秒粗糙σ-hole、孤对方向性几乎不体现AM1-BCC分钟级中等仍是半经验拟合非 ESP 直接拟合RESP / DFT-fp小时级精确无法交互式使用ESP-DNN~0.2 s/分子近 DFT需本地部署 Py2 迁移ESP-DNN 的卖点是给配体预测的原子电荷外加 off-center 虚拟电荷点孤对、σ-hole、p 轨道位置一起写进 PQR 文件直接喂 NGL/APBS 生成近 DFT 质量的 ESP 表面——化学家在可视化软件里编辑结构的间隙ESP 表面就能刷新。§2. 方法速览图卷积 DNN 怎么学静电势论文的构建路线也是用户实测背景素材的对应关系训练集从 eMolecules 和 Sigma-Aldrich 可购买化合物中选取最大程度覆盖化学空间约束 HAC≤17、仅含 B/Br/C/Cl/F/H/I/N/O/P/S共100,500 个分子测试集从 ChEMBL 构建共4,815 个。标签生成对每个分子1DFT 算电子密度 →2生成分子表面 →3在表面逐点算 ESP 值 →4拟合超额点电荷 Δq含 off-center 位点得到 DFT-fp 参照。模型图卷积网络输入原子特征 邻居矩阵输出每个原子的 Δq。论文数字测试集DNN-fp 与 DFT-fp 的 Δq 相关性R² 0.981RMSE 0.022 e训练集 R² 0.996RMSE 0.010 e测试集 ESP 表面平均 RMSE_V3.27 kcal/mol与 DFT-fp 自身的 3.15 几乎持平显著优于 AM1-BCC ESP。速度上比 DFT 快 4 个数量级。推理链路部署后实际跑的就是这条.mol → RDKit MolToPDBBlock → pdb → DNN 预测重原子 Δq → dq.dat → PLI 二进制加 off-center 点→ .pqr带电分子的处理模型只在中性分子上训练推理时先把输入中性化再预测随后apply_charge_correction对形式电荷原子加 0.4×formal-charge 增量、等价原子羧酸根两个 O 等电荷取平均。这意味着对带电配体它的 ESP 形貌预测有系统性局限后文 §10。§3. 本地部署从 clone 到跑通4.1 系统要求README 写仅支持 64 位 Linux——严格说这是 PLI 二进制的要求ext/pli/bin/pli是静态链接 ELFfile输出statically linked5.3 MB任何 x86-64 Linux 直接 exec无需装任何动态库Windows 用户走 WSL2 即可。Python 部分纯跨平台。4.2 克隆仓库git clone --depth 1 https://github.com/AstexUK/ESP_DNN.git cd ESP_DNN实测 20,909 个文件、311 MB——大头是 PLI 的 pdbdict 和模型文件esp_dnn/model/trained_model.h5约 300 MB 级 h5 norm_params.pkl。clone 一次几分钟。4.3 建环境Py3.11 TF 2.15官方 environment.yml 是化石级配置# 官方 environment.yml2019 python2.7.15, rdkit2018.09.3, keras2.2.4, tensorflow1.10.0, numpy1.16.2, xarray0.11.3Py2.7 环境在 2026 年的机器上已经没有维护意义直接建 Py3 环境TF 2.15 的 wheel 只到 Python 3.11这是版本锚点# venvuv 或 python -m venv 均可 uv venv --python 3.11 ./venv uv pip install --python ./venv/bin/python \ numpy1.26.4 pandas xarray \ tensorflow2.15.0 rdkit scipyGPU 非必需本机实测纯 CPU 推理单分子 0.2–0.3 s消费级机器完全够用模型也小加载 1.9 s。4.4 第一跑SyntaxErrorpython -m esp_dnn.predict -m ligand -i examples/ligandsFile .../esp_dnn/predict.py, line 412 except AIChargeError, e: ^^^^^^^^^^^^^^^^ SyntaxError: multiple exception types must be parenthesizedPy2 的except X, e:语法Py3.11 连 import 都过不去。这就是需要补丁的信号。§4. 6 处最小补丁Py2/TF1 → Py3.11/TF2.15原则只改兼容性不动算法逻辑改完以官方 ground truth 的 md5 做回归验证。共 6 处按文件分组#文件Py2/TF1 原写法Py3/TF2.15 修法不改会怎样1predict.pyexcept AIChargeError, e:except AIChargeError as e:SyntaxError第一步就死2predict.pypickle.load(f)文本模式open(..., rb)pickle.load(f, encodinglatin1)norm_params.pkl 是 Py2 写的Py3 默认 ASCII 解码直接 UnicodeDecodeError3predict.pytf.get_default_graph()with self.graph.as_default():删除直接self.model.predict(...)TF2 无 default graph 概念AttributeError4predict.pyself.featurizer.get_mol_fetaures(mol)get_mol_features(mol)与修好的 featurize.py 统一AttributeError原名就是拼写错误5atom_features.py / graph_conv.py / model_factory.pyfrom rdkit.Chem.AtomPairs.Utils import NumPiElectronsfrom keras.engine.topology import Layerkeras.optimizers.AdamRDKit 2024:rdchem.GetNumPiElectronsTF2:tensorflow.keras.layers.Layertensorflow.keras.optimizers.legacy.Adam另range(1,19)[None]→list(range(1,19))[None]ImportError 逐个爆6data_processing.pypickle.load(f)同 #2 加encodinglatin1同 #2几点说明最隐蔽的是 #2 的latin1Py2 pickle 里 str 是原生字节Py3 默认按 ASCII 解码文件头几个字节就抛 UnicodeDecodeError报错位置还不在业务代码里容易误判成文件损坏。TF2 的 Adam 落点tf.keras.optimizers.Adam在 TF 2.16 整体移到optimizers.legacyTF 2.15 环境两者都可但写 legacy 路径向下兼容更稳。graph_conv.py里 TF1 的tf.Print调试层在 TF2 已删随 #5 一起清理。模型 h5 本身不需要任何转换——Keras 2.15 的load_model配合自定义层注册能直接读 2019 年的权重这是这次迁移成本低的关键。打完补丁先做语法检查python -m py_compile esp_dnn/predict.py esp_dnn/atom_features.py \ esp_dnn/graph_conv.py esp_dnn/model_factory.py \ esp_dnn/data_processing.py esp_dnn/featurize.py§5. 安装测试md5 逐字节复现官方结果验证标准仓库examples/里每个输入都带*.pqr.saved官方输出本地跑完md5sum逐字节对比。字节级一致 补丁没有引入任何数值偏差浮点都一样说明 DNN 前向传播 PLI 参数链完全复现。6.1 ligand 模式README 官方命令cd ESP_DNN python -m esp_dnn.predict -m ligand -i examples/ligands -o ./out_lig # out_lig 需先 mkdir python -m esp_dnn.predict -m protein -i examples/proteins -o ./out_prot实测结果消费级 CPU2026-09-30模式输入输出md5 vs 官方 saved耗时ligandlig1.pdblig1.pdb.pqr63 行一致全批 4 分子 3.0 s含模型加载ligandlig2.pdblig2.pdb.pqr62 行一致—ligandlig3.pdblig3.pdb.pqr65 行一致—ligandlig1_charged.pdblig1_charged.pdb.pqr63 行一致—protein1akg_neutral.pdb27,619 B一致全批 0.56 sprotein5c7a_charged.pdb177,926 B一致—6/6 全部 md5 一致。protein 模式不经过 DNN氨基酸用参数化电荷由 PLI 直接处理所以更快5c7a_charged 这种上千原子的蛋白也在半秒内完成。注意 ligand 模式如果输入目录里有.mol文件examples 自带程序会先用 RDKit 转出.mol.pdb再统一处理——所以 examples 里 4 个配体实际产出的 PQR 文件名是lig1.mol.pdb.pqr系和*.saved的 md5 是对得上的lig1.pdb.pqr.saved与lig1.mol.pdb.pqr内容一致两条路殊途同归。§6. 新分子实测阿司匹林与咖啡因示例复现只能证明补丁无害还要看对新分子的泛化。从 SMILES 出发走完整链路这是实际使用时的标准姿势from rdkit import Chem from rdkit.Chem import AllChem for name, smi in { aspirin: CC(O)Oc1ccccc1C(O)O, caffeine: CN1CNC2C1C(O)N(C)C(O)N2C, # C8H10N4O2, 24 原子 }.items(): m Chem.AddHs(Chem.MolFromSmiles(smi)) AllChem.EmbedMolecule(m, randomSeed42) w Chem.SDWriter(f{name}.mol); w.write(m); w.close()然后把这两个.mol放进一个空目录目录里不要有别的 pdb从仓库根目录跑python -m esp_dnn.predict -m ligand -i /path/to/mols实测暖模型后逐分子计时分子原子数PQR 行数构成总电荷单分子耗时阿司匹林214913 重原子 8 H 8 Hlp 20 Hp−0.0009 e260 ms咖啡因245114 重原子 10 H 5 Hlp 22 Hp0.0001 e216 ms总电荷归零到 10⁻³ e 量级推理后减均值 等价原子平均off-center 点数量随杂原子数变化——咖啡因 4 个 N 出 5 个孤对位阿司匹林酯/羧酸 O 出 8 个。一个小坑提醒写 SMILES 时先CalcMolFormula核一遍分子式再往下走我第一版咖啡因 SMILES 手滑多写了一个 N29 原子的咖啡因照样全链跑通——工具不会替你检查化学合理性。速度上模型加载 1.92 s一次性之后每个分子 0.2–0.3 sDNN 前向 PLI确实到了交互式刷新 ESP的量级和论文宣传一致。§7. PQR 输出解读与可视化PQR 每行 PDB 坐标 电荷occupancy 列 半径bfactor 列。三种虚拟原子的命名语义从ext/pli/params/features.pli实查H前缀表示伪原子名称含义来源Hh真实氢原子带 DNN/Gasteiger 链路的电荷on-atomHlp孤对lone pairoff-center 点如 N/O 孤对方向ftype lp lone pair off-centredHpp 轨道 off-center 点芳香/共轭体系 π 分布ftype pHshσ-hole off-center 点卤素/硫反键方向ftype sh sigma hole off-centred阿司匹林 PQR 节选第 2 列电荷HETATM 12 O3 UNL _ 1 0.786 -2.058 0.526 -0.4164 1.6000 # 羰基 O, 负电荷集中 HETATM 19 Hlp UNL _ 1 -2.694 -0.726 1.877 -0.0060 0.8700 # 孤对虚拟点 HETATM 43 Hlp UNL _ 1 1.013 -2.773 0.805 -0.0074 0.8700可视化按 README 走 NGL Viewernglviewer.org/nglFile 打开 PQR → 添加 surface 表示 →surfaceTypeav、radiusTypeexplicit、colorSchemeelectrostaticcolorDomain 建议 [-50, 50] kcal/molcolorScalerwb。Jupyter 内用 nglview 同参数。要导出表面网格数据顶点ESP 值就用官方配套的 NodeJS 脚本 esp-surface-generator。对药化工作流这套 PQR 还有两个下游用法电荷列直接作为 espsim 的自定义电荷算 ESP 相似度或与蛋白 PQRprotein 模式产物一起做静电互补定性检查。§8. 踩坑清单#症状根因修复1SyntaxError: multiple exception types must be parenthesizedPy2except X, e:语法§5 补丁 #12UnicodeDecodeError加载 norm_params.pklPy2 pickle 字节流 vs Py3 ASCII 默认解码open(...,rb)encodinglatin13AttributeError: module tensorflow has no attribute get_default_graphTF1 graph API 在 TF2 删除删掉 graph 上下文直接 predict4OSError: Bad output file .../lig2.mol.pdb-o输出目录不会自动创建先mkdir -p输出目录5-o指定独立目录时只产出.mol.pdb中间文件没有 PQR日志末尾No input files found源码两阶段 glob 脱节.mol→.pdb写进输出目录但第二阶段 glob*.pdb只扫输入目录。官方 examples 能跑通纯粹因为仓库自带.pdb不用-o让输入输出同目录PQR 会产在.mol旁边或先把.mol转成.pdb后放入输入目录6ModuleNotFoundError: No module named esp_dnnpython -m需要仓库根在sys.pathcd进仓库根再跑README 有说明或pip install -e .7Windows git clone 报设备名错误仓库cif/CON/CON.cif、cif/PRN/PRN.cif撞 Windows 保留设备名用 codeload tarball unzip 绕过8想设PLI_DIR环境变量其实不必须predict.py 自动探测esp_dnn/ext/pli只有挪动二进制时才需要设坑 5 是这次实测抓到的最有价值的一个它不是报错而是静默空转exit 0、无 PQR、只有一行 INFO 级No input files found如果不在 examples 之外的目录试新分子根本发现不了。§9. 局限与适用边界训练集全中性 HAC≤17 11 种元素带电配体的电荷预测靠中性化0.4 修正近似ESP 形貌对净电荷差异不敏感此前实测同一骨架 ±0.4 e 对ESP 相似度仍高达 0.9判别力丢失超出元素/大小域的分子金属配体、大环慎用。模型是 2019 年定格的仓库 6 年未更新主模型后续有 EspalomaCharge 等 GNN 电荷新工作可作对比但off-center 点 蛋白参数化电荷 NGL 交互这套完整链路仍是 Astex 独家。PLI 二进制闭源静态 ELF 可执行参数表elements.pli/features.pli可读但不可改想自定义 off-center 类型或扩元素只能等上游。何时该切换任务要绝对精确 → 直接 DFT/RESP要蛋白-配体互补性打分→ 这套 PQR 定性看可以定量要上 APBS 类求解器。参考来源资源链接AstexUK/ESP_DNNgithub.com/AstexUK/ESP_DNNRathi 等J. Med. Chem.2020, 63(16), 8778–879010.1021/acs.jmedchem.9b01129NGL Viewernglviewer.org/nglesp-surface-generatorgithub.com/AstexUK/esp-surface-generatorPQR 格式apbs-pdb2pqr.readthedocs.ioiwatobipen ESP_DNN Py3 fork早期参照github.com/iwatobipen/ESP_DNN系列导航本专栏为CADD 中的机器学习模型本文是静电势预测模型部署方向专栏全集点 这里。更多专栏蛋白 / 多肽分子模拟 / 动力学分子对接 / CADD / 工具其他开源蛋白结构推理预测分子模拟基础UCSF DOCK系列agent智能体系列开源蛋白生成方法实践分子动力学模拟-AmberrDock系列化学大模型介绍2025蛋白药物设计-原理与案例剖析分子动力学模拟-GromacsLeDock系列我胡师兄说药开源多肽设计模型和方法实践結合自由能CADD中的机器学习模型siRNA药物设计模型开源多肽性质预测高效计算基本配置小分子药物设计-原理与案例剖析ASO药物设计模型多肽药物设计-原理与案例剖析作用于DNA/RNA的药物设计实践开源小分子生成和设计实践开源药代动力学模拟软件抗体设计-原理与案例剖析免疫学计算-原理与案例剖析合成生物学-原理与案例剖析AI制药-原理与案例剖析