7.3 ADMET 与类药性过滤 本节摘要:ADMET(吸收、分布、代谢、排泄、毒性)决定一个分子"进得了身体、受得了代谢、不惹麻烦"的能力。本节把类药规则家族(五规则、Veber、极性上限)与常见毒性终点的预测手段整理成一张收口网,并用 RDKit 过滤目录演示"命中列表五百压到八十七"的完整闸门流程——过滤的输出不只是名单,更是每条被过滤原因的记录。 筛选战役的收口工序。7.1、7.2 的命中列表回答"可能与靶点结合",本节的闸门回答"结合之外还活着吗"。两问缺一不可:在虚拟筛选漏斗尽头被 ADMET 卡掉的分子,每多一个都是省下的一轮合成与动物实验。 别让命中死在起跑线上 类药规则是第一层网,全是经验线而非物理定律,判读口径与 4.1 节一致——标记注意,不是枪毙。
本节摘要:ADMET(吸收、分布、代谢、排泄、毒性)决定一个分子"进得了身体、受得了代谢、不惹麻烦"的能力。本节把类药规则家族(五规则、Veber、极性上限)与常见毒性终点的预测手段整理成一张收口网,并用 RDKit 过滤目录演示"命中列表五百压到八十七"的完整闸门流程——过滤的输出不只是名单,更是每条被过滤原因的记录。
筛选战役的收口工序。7.1、7.2 的命中列表回答"可能与靶点结合",本节的闸门回答"结合之外还活着吗"。两问缺一不可:在虚拟筛选漏斗尽头被 ADMET 卡掉的分子,每多一个都是省下的一轮合成与动物实验。
类药规则是第一层网,全是经验线而非物理定律,判读口径与 4.1 节一致——标记注意,不是枪毙。类药五规则(Lipinski)管口服吸收的理化门槛;Veber 补充盯着另外两项与渗透更相关的量:拓扑极性表面积不超过一百四十埃平方、可旋转键不超过十——不少五规则合规的分子倒在 Veber 线上;极性上限(碱性与酸性官能团计数)是中枢药物项目的常设关卡,过血脑屏障的分子极性普遍要收得更紧。规则之外,化学反应性警报(3.2 节的 PAINS 家族)在收口位置再跑一遍——筛选命中里的假阳性大户专靠警报抓。
毒性终点是第二层网,也是计算 ADMET 的主战场。常见终点各有体外实验对应物,业内都有公开数据集与现成模型:
| 终点 | 生物学含义 | 体外对应 | 计算模型形态 |
|---|---|---|---|
| hERG 抑制 | 阻断心脏钾通道,致心律失常 | 膜片钳 | 分类模型,公开数据充足 |
| Ames 致突变 | 细菌回复突变试验阳性 | 沙门氏菌试验 | 分类模型,多标签 |
| CYP 抑制 | 抑制代谢酶,药物相互作用 | 肝微粒体实验 | 按亚型分别建模 |
| 肝毒性 | 肝细胞损伤与胆汁淤积 | 肝细胞试验 | 分类模型,噪声大 |
| P-gp 底物 | 被外排泵泵出,影响脑暴露 | 细胞外排实验 | 分类模型 |
毒性模型的共同脾气是数据不平衡加标签噪声:毒性样本稀少、实验口径不一,模型召回率普遍有限。工程结论是:计算毒性当报警器不当判决书——报警器漏报难免,但每个警报都值得在合成前被看一眼。
背景。7.2 节战役扩编后,命中列表膨胀到五百个分子。合成与验证预算只够一百上下,需要一道既压缩数量、又保留全部决策信息的收口闸门——光给"留下八十七个"不够,必须交代"为什么那一百三十三个被划掉"。
操作。四层过滤依序执行,RDKit 自带的过滤目录负责警报层:
from rdkit import Chem from rdkit.Chem import rdMolDescriptors as rd from rdkit.Chem.FilterCatalog import FilterCatalog, FilterCatalogParams params = FilterCatalogParams() params.AddCatalog(FilterCatalogParams.FilterCatalogs.PAINS) catalog = FilterCatalog(params) survivors, rejected = [], [] for mol in hits: # 五百个命中分子 reasons = [] mw = rd.CalcExactMolWt(mol) tpsa = rd.CalcTPSA(mol) rotb = rd.CalcNumRotatableBonds(mol) if mw > 500: reasons.append("分子量超限") if tpsa > 140: reasons.append("极性表面积超限") if rotb > 10: reasons.append("可旋转键过多") entry = catalog.GetFirstFilterEntry(mol) if entry: reasons.append("反应性警报:" + entry.GetDescription()) (survivors if not reasons else rejected).append( (Chem.MolToSmiles(mol), reasons)) print("幸存:", len(survivors), "淘汰:", len(rejected)) for smi, why in rejected[:5]: print(smi, "->", ";".join(why)) # 淘汰留痕,可人工复核
毒性层(hERG、Ames 模型打分)接在规则层后:模型给出风险分数,超阈值者追加标签;名单按"过滤后分数乘毒性安全系数"重排,取前一百交合成。最终清单八十七个——规则、警报、毒性三层合计划掉四百一十三个,每个都有记录在案的原因。
解读。这份流程的精髓在淘汰留痕。其一,被划掉的分子按原因聚合后,能暴露系统性问题——本例一百多个被划者集中在两个骨架家族,回头看是查询分子自身带了警报结构,相似检索把它的毛病遗传给了命中;这个发现反过来修正了下轮筛选的查询组。其二,警报层保留人工复核通道(比如某警报结构恰是靶点机制所需的亲电弹头,共价药物就该豁免),全自动一刀切会错杀整个策略。其三,收口不是一次性的:合成与验证的数据回流后,毒性模型与阈值本身也要迭代——闸门是活的。
变式。两个方向的升级。多参数优化:把活性、选择性、理化、毒性各目标函数化(desirability 函数加权求和),筛选从"过线与否"变成"综合分排序",配合 10.2 节的项目级决策流程;前药与结构修正:理化差一口气(如极性略超)的强命中,交给药物化学同事做甲基化、成前药等局部手术,而不是直接扔——收口闸门的产出物里,"差一点的可救分子"是单独一类,标注着它与死亡名单的区别。