403

Hit Expansion:命中物扩展的计算与实验策略

Hit Expansion 围绕苗头拓展化学空间,建立初步 SAR。这篇给出计算与实验并行的策略。

确认了一个苗头之后,下一步是围绕它拓展:找结构相关的类似物,建立初步构效关系,判断这个化学系列值不值得深入。

拓展的三个目的

  • 1. 验证 SAR 是否合理:如果一系列类似物的活性毫无规律,说明原始命中可能是非特异性效应;
  • 2. 快速提升活性:初步 SAR 常能带来几倍到几十倍的活性提升;
  • 3. 判断系列潜力:这个骨架有没有优化空间?性质能不能改善?专利空间如何?

拓展策略

策略 做法 速度
相似性检索 在商业库中搜类似物直接购买 最快(1~2 周)
子结构检索 搜含相同核心的化合物 快
SAR by catalog 系统性地买覆盖各取代位点的类似物 快
快速类似物合成 用可靠反应做小规模平行合成 中(数周)
片段生长 从片段苗头向外生长 中
虚拟筛选聚焦库 以苗头为查询做形状/药效团筛选 快(计算)

「SAR by catalog」是最被低估的策略:在商业库中系统性地找出覆盖不同取代位点的类似物,两周内就能拿到几十个数据点,快速勾勒出 SAR 轮廓——而这在自己合成的路径下需要数月。

计算辅助的类似物检索

from rdkit import Chem, DataStructs
from rdkit.Chem import rdFingerprintGenerator, AllChem
from rdkit.Chem.Scaffolds import MurckoScaffold

gen = rdFingerprintGenerator.GetMorganGenerator(radius=2, fpSize=2048)

def find_analogs(hit_smiles, library_smiles, min_sim=0.6, max_sim=0.95):
    """在库中找类似物
       max_sim 上限是为了排除几乎相同的分子(信息量低)"""
    hit = Chem.MolFromSmiles(hit_smiles)
    hit_fp = gen.GetFingerprint(hit)
    hit_scaffold = MurckoScaffold.MurckoScaffoldSmiles(mol=hit)

    results = []
    for smi in library_smiles:
        m = Chem.MolFromSmiles(smi)
        if m is None:
            continue
        sim = DataStructs.TanimotoSimilarity(hit_fp, gen.GetFingerprint(m))
        if min_sim <= sim <= max_sim:
            sc = MurckoScaffold.MurckoScaffoldSmiles(mol=m)
            results.append({
                "smiles": smi, "similarity": sim,
                "same_scaffold": sc == hit_scaffold,
            })
    return sorted(results, key=lambda x: -x["similarity"])

# 关键:既要同骨架的(探索取代基 SAR),
#      也要不同骨架但相似的(探索骨架容忍度)

analogs = find_analogs(hit_smiles, commercial_library)
same_scaffold = [a for a in analogs if a["same_scaffold"]][:30]
diff_scaffold = [a for a in analogs if not a["same_scaffold"]][:20]

系统性覆盖取代位点

from rdkit.Chem import rdRGroupDecomposition as rgd

# 1) 定义核心,看类似物覆盖了哪些位点
core = Chem.MolFromSmarts("c1ccc2c(c1)[nH]c(n2)[*:1]")
res, unmatched = rgd.RGroupDecompose([core], analog_mols,
                                      asSmiles=True, asRows=False)
import pandas as pd
rg_df = pd.DataFrame(res)

# 2) 检查覆盖情况
for col in rg_df.columns:
    if col.startswith("R"):
        print(f"{col}: {rg_df[col].nunique()} 种不同取代基")
        # 覆盖不足的位点 = 需要补充的方向

# 3) 设计补充:每个位点都要有
#    - 小 vs 大
#    - 极性 vs 疏水
#    - 供体 vs 受体
#    - 有电荷 vs 中性
#    这样才能勾勒出该位点的 SAR 轮廓

# 4) 包含「预期失活」的对照
#    如果假设某个基团是关键氢键供体,
#    就做一个把它甲基化的分子验证

结构信息加速拓展

如果能拿到苗头与靶点的共晶结构,拓展效率会大幅提升:

获取共晶结构应该是苗头阶段的高优先级投入:它把后续的优化从「盲目试错」变成「有依据的设计」。

判断系列值不值得深入

信号 好 坏
SAR 规律性 结构变化与活性变化有合理关联 活性随机、无规律
活性提升 初步优化就能提升数倍以上 怎么改都在同一水平
配体高效性 LE 保持或提升 活性靠加大分子堆出来
亲脂高效性(LLE) 提升 活性提升全靠增加 logP
性质 有改善空间 已经在边缘且无法改善
选择性 有可利用的差异 与脱靶无法区分
合成可及性 易衍生化 每个类似物都要重新设计路线
专利空间 有自由度 被严密覆盖

LLE 是特别有价值的指标:如果活性提升完全来自 logP 增加,说明只是在增加非特异性疏水结合,这条路走不远——后期必然遇到溶解度、代谢、hERG 问题。

并行推进多个系列

  • 不要把宝押在一个系列上:苗头阶段应该有 2~3 个结构不同的系列同时推进;
  • 不同系列的失败原因往往不同(一个卡在选择性、一个卡在溶解度),并行能降低整体风险;
  • 资源有限时,可以主推一个、维持一到两个备份;
  • 系列的「化学多样性」比数量重要:三个骨架相近的系列,等于只有一个。

关键要点

  • 「SAR by catalog」是最快的拓展方式,两周就能拿到几十个数据点;
  • SAR 是否有规律,是判断苗头真伪与系列潜力的关键信号;
  • LLE 提升说明优化是实质的,只靠 logP 涨活性走不远;
  • 获取共晶结构是苗头阶段最值得的投入;并行推进 2~3 个系列。

延伸资源