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 个系列。

延伸资源