骨架跃迁(scaffold hopping):保留关键取代基与它们的空间排布,把中间的母核换掉。动机可能是改善性质、规避专利、提升选择性或简化合成。这篇给出几条可操作的技术路线。
路线一:基于三维形状与药效团
核心洞察是真正重要的不是核心本身,而是它把取代基「摆在什么位置、什么朝向」。
from rdkit import Chem
from rdkit.Chem import AllChem, rdShapeHelpers, rdMolAlign
import numpy as np
def shape_similarity(ref_mol, probe_smiles, n_confs=50, seed=0xf00d):
"""计算候选分子与参考分子的最佳三维形状相似度"""
probe = Chem.AddHs(Chem.MolFromSmiles(probe_smiles))
p = AllChem.ETKDGv3(); p.randomSeed = seed; p.pruneRmsThresh = 0.5
cids = AllChem.EmbedMultipleConfs(probe, numConfs=n_confs, params=p)
if not cids:
return 0.0
AllChem.MMFFOptimizeMoleculeConfs(probe, maxIters=500)
best = 0.0
for cid in cids:
try:
AllChem.AlignMol(probe, ref_mol, prbCid=cid)
sim = 1.0 - rdShapeHelpers.ShapeTanimotoDist(
probe, ref_mol, confId1=cid, confId2=0)
best = max(best, sim)
except Exception:
continue
return best
# 参考:已知活性分子的结合构象(最好来自共晶结构)
ref = Chem.MolFromMolFile("ref_ligand.sdf", removeHs=False)
for cand in candidate_smiles:
print(f"{shape_similarity(ref, cand):.3f} {cand}")
路线二:R 基团分解 + 核心替换
from rdkit.Chem import rdRGroupDecomposition as rgd
# 1) 把已知活性分子按核心分解
core = Chem.MolFromSmarts("c1ccc2[nH]ccc2c1") # 原核心:吲哚
res, unmatched = rgd.RGroupDecompose([core], active_mols,
asSmiles=True, asRows=True)
print(f"分解成功 {len(res)},未匹配 {len(unmatched)}")
for r in res[:3]:
print(r) # {'Core': '...', 'R1': '...', 'R2': '...'}
# 2) 准备候选新核心(保持相同的连接点数与相对几何)
new_cores = [
"c1ccc2occc2c1", # 苯并呋喃
"c1ccc2sccc2c1", # 苯并噻吩
"c1cnc2[nH]ccc2c1", # 氮杂吲哚
"c1ccc2c(c1)cc[nH]2", # 异吲哚
"C1CCc2ccccc2C1", # 四氢萘(饱和替换)
]
# 3) 用反应模板重组
from rdkit.Chem import AllChem
def graft_rgroups(core_smiles, rgroups):
"""把 R 基团接到新核心上(需按连接点编号对应)"""
# 实践中用带原子映射的 SMARTS 反应,或用 RDKit 的 ReplaceCore/ReplaceSidechains
combined = core_smiles
for i, r in enumerate(rgroups, start=1):
combined = combined.replace(f"[*:{i}]", r.replace(f"[*:{i}]", ""))
m = Chem.MolFromSmiles(combined)
return Chem.MolToSmiles(m) if m else None
路线三:从数据中挖掘真实发生过的替换(推荐)
# mmpdb:匹配分子对分析,从数据中学习「哪些替换实际保持了活性」
pip install mmpdb
# 1) 从 ChEMBL 或内部数据构建 MMP 数据库
mmpdb fragment chembl_compounds.smi -o fragments.fragdb
mmpdb index fragments.fragdb -o mmp.mmpdb
# 2) 加载活性数据
mmpdb loadprops -p activities.csv mmp.mmpdb
# 3) 查询:给定一个分子,看有哪些已知的转换
mmpdb transform --smiles "c1ccc2[nH]ccc2c1CCN" \
--property pIC50 mmp.mmpdb
MMP 分析是最值得自建的能力:它给出的不是理论上的可能替换,而是「在真实数据中,这个替换平均让活性变化多少」。用自家历史数据做 MMP,得到的知识比任何通用规则都贴合实际。
路线四:生成模型 + 相似性约束
# REINVENT4 的 Mol2Mol 模式:在相似性约束下生成变体
# 通过控制相似性下限,可以做「适度跃迁」
[[stage.scoring.component]]
[stage.scoring.component.TanimotoDistance]
[[stage.scoring.component.TanimotoDistance.endpoint]]
name = "similarity_window"
weight = 1.0
params.smiles = ["原始活性分子的 SMILES"]
# 用 double_sigmoid 设一个「相似度窗口」:
# 太相似 → 不是跃迁
# 太不相似 → 可能失活
transform.type = "double_sigmoid"
transform.low = 0.35
transform.high = 0.60
transform.coef_div = 1.0
成功的关键前提
- 必须知道正确的结合姿势:出口向量是从三维结构中读出的。没有共晶结构或可靠对接姿势,几何约束无从谈起。
- 判断哪些取代基是关键的:形成关键氢键、盐桥、占据关键疏水口袋的取代基必须保住位置;伸向溶剂的部分容差大。用 PLIP 或 ProLIF 先分析清楚(见 338《用 ProLIF 提取相互作用指纹》、339《用 PLIP 生成蛋白-配体相互作用报告》)。
- 核心本身是否参与相互作用:如果原核心与蛋白有直接接触(如芳环 π 堆积),换掉它风险大得多。
- 构象刚性的影响:新核心的柔性不同会改变取代基的构象分布,即使静态几何匹配也可能活性下降。
验证流程
# 候选新核心的分级验证
# 1) 几何可行性:约束嵌入检查
from rdkit.Chem import AllChem
def geometric_feasibility(new_mol, ref_mol, key_atom_map):
"""检查新分子能否让关键取代基落在参考位置"""
try:
AllChem.ConstrainedEmbed(new_mol, ref_mol, randomseed=0xf00d)
rmsd = float(new_mol.GetProp("EmbedRMS"))
return rmsd < 1.0, rmsd
except Exception as e:
return False, str(e)
# 2) 对接验证:新分子能否复现关键相互作用(见 338)
# 3) 性质检查:新核心是否真的改善了目标性质
# 4) 合成可行性:逆合成分析 + 合成化学家评审
# 5) 专利检索:SureChEMBL 初筛(见 234),
# 但 FTO 判断必须由专利律师完成
现实的成功率
骨架跃迁的成功率不高,要有心理准备。几何匹配只是必要条件,实际活性还受构象熵、局部静电、去溶剂化代价等多重因素影响。很多「理论上完美」的替换在实验中活性大跌。务实的做法是一次准备多个候选核心,接受大部分会失败。
常见坑与提示
- 前提是已知正确结合姿势,并先分析清楚哪些取代基是关键的;
- MMP 分析(mmpdb)从真实数据挖掘有效替换,比理论规则可靠;
- 核心本身若参与关键相互作用,跃迁风险大得多;
- 成功率有限,一次准备多个候选并接受大部分失败。