054

药物片段与片段空间:FBDD 数据如何进入 AI 流程

片段筛选用小分子探索化学空间。这篇讲清片段的定义、FBDD 流程与片段数据进入 AI 流程的方式。

基于片段的药物发现(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 大幅下降说明新原子没贡献结合能。

延伸资源