基于片段的药物发现(FBDD)用「小而简单」的分子作为起点。它的核心逻辑是:小分子在化学空间中的覆盖效率远高于大分子——用几千个片段能探索的化学空间,用大分子需要几百万个。
片段的定义
| 参数 | 「三规则」范围 | 对比:类药规则(见 064《Lipinski 五规则》) |
|---|---|---|
| 分子量 | < 300 | < 500 |
| cLogP | ≤ 3 | ≤ 5 |
| 氢键供体 | ≤ 3 | ≤ 5 |
| 氢键受体 | ≤ 3 | ≤ 10 |
| 可旋转键 | ≤ 3 | — |
| TPSA | ≤ 60 | — |
为什么用片段
# 【核心优势一:化学空间的覆盖效率】
# 分子越大,可能的结构数量指数增长
# → 用大分子筛选,覆盖率极低
# → 【小片段能更高效地探索】
#
# 【核心优势二:配体高效性高】(见 071)
# 片段虽然亲和力弱(通常 μM~mM),
# 但【每个原子贡献的结合能高】
# → LE = -ΔG / 重原子数
# → 片段的 LE 常常 > 0.4,而类药分子多在 0.3 左右
# → 【从高 LE 的起点出发,优化空间更大】
#
# 【核心优势三:结合模式清晰】
# 片段小,通常只结合口袋的一个亚位点
# → 【结合模式相对明确】
# → 便于结构指导的生长
#
# 【代价】:
# 1) 亲和力弱 → 【需要灵敏的检测方法】
# 常规的酶活筛选检测不到 mM 级的结合
# → 需要 SPR、NMR、ITC、热迁移、
# 【晶体学片段筛选】
# 2) 需要结构信息指导生长
# → 【没有结构的靶点做 FBDD 很困难】
# 3) 从片段到先导物的路径长
FBDD 的典型流程
# 【第 1 步:片段库设计】
# 规模:500 ~ 5000 个片段(远小于 HTS 库)
# 要求:
# - 【极高的多样性】(见 053)
# - 高溶解度(筛选浓度高,常 1 mM 以上)
# - 【可衍生化】:有明确的生长向量
# - 化学稳定
# - 无反应性基团
# - 【结构简单,便于解析结合模式】
#
# 【第 2 步:片段筛选】
# 方法(按灵敏度与信息量):
# 热迁移(TSA):便宜、高通量、假阳性多
# SPR:定量、中通量
# NMR(配体观测/蛋白观测):灵敏、能给结合位点信息
# 【晶体学筛选】:直接给出结合模式,信息量最大
# ITC:热力学参数完整,通量低
# → 【通常组合使用:粗筛 + 结构确证】
#
# 【第 3 步:命中确证】
# 多方法验证(避免假阳性)
# 剂量响应
# 【获得共晶结构】← 这是关键
#
# 【第 4 步:片段生长/连接/融合】
# 生长(growing):从片段延伸出取代基
# → 【最常用】
# 连接(linking):把两个结合在相邻亚位点的片段连起来
# → 理论上能获得超加性的亲和力
# → 【实际很难:连接子的构象代价大】
# 融合(merging):把重叠的片段合并
#
# 【第 5 步:优化】
# 进入常规的先导优化流程(见 405)
#
# 【全程的关键指标:配体高效性】
# → 【生长过程中 LE 不应下降太多】
# → LE 下降说明新加的原子没有贡献结合能
片段数据进入 AI 流程
# 【片段数据的特点与挑战】:
#
# 1) 【活性范围窄且弱】
# 多数在 100 μM ~ 10 mM
# → 动态范围小,建模困难
# → 【很多是「结合/不结合」的二分数据】
#
# 2) 【假阴性率高】
# 弱结合难以检测
# → 「未命中」不等于「不结合」
# → 【训练数据的负样本不可靠】
#
# 3) 【数据量小】
# 片段库本身就只有几千个
#
# 4) 【但结构信息丰富】
# 晶体学筛选能给出大量共晶结构
# → 【这是 AI 可以利用的宝贵资源】
#
# 【AI 能做什么】:
# ---- 应用一:片段库设计 ----
# 用多样性算法选片段(见 053)
# 优化覆盖率与可衍生化
# ---- 应用二:片段生长的建议 ----
# 给定片段的结合姿势,
# 生成可能的生长方向与取代基
def fragment_growing_vectors(fragment_sdf, receptor_pdb):
"""找出片段可以生长的方向"""
from rdkit import Chem
# 1) 识别片段上可衍生化的位置(有氢的碳/氮)
# 2) 对每个位置,检查该方向上蛋白口袋是否有空间
# 3) 排序:空间大且有相互作用机会的方向优先
pass
# ---- 应用三:约束对接(片段生长的核心工具)----
# 【保持片段部分的姿势不变,只对接新增部分】
from rdkit import Chem
from rdkit.Chem import AllChem
def constrained_grow(core_sdf, grown_smiles, seed=0xf00d):
"""以片段的已知姿势为约束生成生长后分子的构象"""
core = Chem.MolFromMolFile(core_sdf) # 片段的晶体姿势
mol = Chem.AddHs(Chem.MolFromSmiles(grown_smiles))
try:
AllChem.ConstrainedEmbed(mol, core, randomseed=seed)
except Exception:
return None
return mol
# 然后用 smina --minimize 优化(见 100)
# ---- 应用四:从片段共晶结构学习 ----
# 大量的片段-蛋白共晶结构
# → 训练数据(见 240)
# → 或用于验证对接方法
# ---- 应用五:虚拟片段筛选 ----
# 【难点】:对接打分函数对弱结合的片段
# 判别力很差(见 095)
# → 富集能力有限
# → 【实验筛选仍是主流】
片段生长中的关键指标
from rdkit import Chem
from rdkit.Chem import Descriptors
import numpy as np
def efficiency_metrics(smiles, pActivity):
"""计算配体效率指标(见 071、072)"""
mol = Chem.MolFromSmiles(smiles)
if mol is None:
return None
n_heavy = mol.GetNumHeavyAtoms()
logp = Descriptors.MolLogP(mol)
# 【LE:配体高效性】
# LE = 1.37 * pActivity / 重原子数
le = 1.37 * pActivity / n_heavy
# 【LLE:脂溶性配体效率】
# LLE = pActivity - logP
lle = pActivity - logp
# 【LELP】
lelp = logp / le if le > 0 else np.nan
return {
"n_heavy": n_heavy, "pActivity": pActivity,
"logP": round(logp, 2),
"LE": round(le, 3),
"LLE": round(lle, 2),
"LELP": round(lelp, 2),
}
# 【片段生长的判据】:
#
# 起点片段:MW 200, pIC50 4.0, 14 重原子
# → LE = 1.37 * 4.0 / 14 = 0.39
#
# 生长后:MW 400, pIC50 7.0, 28 重原子
# → LE = 1.37 * 7.0 / 28 = 0.34
#
# 【判读】:
# 活性提升了 1000 倍,但 LE 略有下降
# → 【可接受】(LE 通常会随分子增大略降)
#
# 如果 LE 大幅下降(如 0.39 → 0.20):
# → 【新加的原子基本没贡献结合能】
# → 只是「靠体积堆出来的活性」
# → 后续会遇到成药性问题(分子太大)
#
# 【一个实用的做法】:
# 在生长的每一步记录 LE 与 LLE
# 画出「重原子数 vs LE」的轨迹
# → 【一眼看出优化是否高效】
关键要点
- 核心逻辑是小分子在化学空间中的覆盖效率远高于大分子;
- 片段亲和力弱(μM~mM),需要 SPR、NMR、晶体学等灵敏方法检测;
- 没有结构信息的靶点做 FBDD 很困难——生长需要结构指导;
- 全程跟踪配体高效性(LE)——LE 大幅下降说明新原子没贡献结合能。
延伸资源
- 配体效率:071《配体效率 Ligand Efficiency》、072《脂溶性配体效率 LLE》;多样性:053《分子多样性评估》;
- 约束对接:100《Smina》;口袋分析:091《蛋白口袋 Protein Pocket》;先导优化:405《Lead Optimization》。