ROCS(Rapid Overlay of Chemical Structures)是 OpenEye 的三维形状相似性筛选工具。它的核心思想很直接:如果两个分子的三维形状和化学特征分布相似,它们很可能结合同一个口袋——即使它们的二维结构完全不同。这让它成为骨架跃迁和无结构筛选的经典工具。
原理
- 形状叠合:把分子的原子表示成高斯函数,通过刚性叠合最大化两个分子的体积重叠。重叠程度用 Shape Tanimoto 量化(0~1)。
- 化学特征匹配:在形状之上叠加化学特征(氢键供体、受体、疏水、阴离子、阳离子、环),用 Color Tanimoto 量化。
- TanimotoCombo:两者之和(0~2),是最常用的综合排序指标。
| TanimotoCombo | 解读 |
|---|---|
| > 1.4 | 非常相似,值得重点关注 |
| 1.0~1.4 | 相似,通常在虚拟筛选的可用区间 |
| < 1.0 | 相似度有限 |
什么时候它比对接更合适
- 没有靶点结构:这是最主要的场景。只要有一个已知活性分子作为查询,就能做筛选,完全不需要蛋白结构。
- 对接效果不佳的靶点:某些体系(高度柔性口袋、金属酶、水介导相互作用为主)对接可靠性差,形状匹配反而更稳。
- 骨架跃迁:二维相似性(如 ECFP + Tanimoto)只能找到结构相近的分子;三维形状匹配能找到二维完全不同但空间形状相似的分子,这正是骨架跃迁的定义。
- 速度要求高:比对接快得多,适合超大库的第一道筛选。
关键前提:构象质量
ROCS 做的是刚性叠合,所以每个分子必须预先生成一组构象。构象集合的质量直接决定筛选效果:
- 构象太少 → 漏掉能匹配的构象,假阴性;
- 构象质量差(高能构象、不合理几何)→ 匹配到不真实的形状;
- 通常每个分子生成 50~200 个构象,柔性大的分子需要更多。
这就是 OMEGA(见 279《OpenEye Omega》)作为配套工具存在的原因。用低质量构象跑 ROCS,等于在错误的形状上做匹配。
查询分子的选择
这一步的重要性常被低估:
- 最好用共晶构象:如果有该配体与靶点的复合物结构,直接用结合构象作为查询,比用计算生成的低能构象可靠得多——结合构象往往不是分子的全局最低能构象。
- 用多个查询分子:不同活性分子代表不同的结合模式,用多个查询分别筛选再合并,覆盖面更好。
- 去掉不参与结合的部分:分子中伸向溶剂的取代基对形状匹配是噪声,可考虑截去。
开源替代方案
from rdkit import Chem
from rdkit.Chem import AllChem, rdShapeHelpers
from rdkit.Chem.FeatMaps import FeatMaps
# RDKit 的形状比较
ref = Chem.AddHs(Chem.MolFromSmiles(query_smiles))
AllChem.EmbedMultipleConfs(ref, numConfs=100, randomSeed=0xf00d)
AllChem.MMFFOptimizeMoleculeConfs(ref)
probe = Chem.AddHs(Chem.MolFromSmiles(target_smiles))
AllChem.EmbedMultipleConfs(probe, numConfs=100, randomSeed=0xf00d)
# 叠合并计算形状相似性
best = 0
for i in range(ref.GetNumConformers()):
for j in range(probe.GetNumConformers()):
AllChem.AlignMol(probe, ref, prbCid=j, refCid=i)
sim = 1 - rdShapeHelpers.ShapeTanimotoDist(probe, ref, confId1=j, confId2=i)
best = max(best, sim)
print("best shape similarity:", round(best, 3))
其他开源选项:Shape-it(Silicos-it,高斯形状叠合)、ESP-Sim(静电相似性)、Pharmit(在线药效团 + 形状筛选)。能力上与 ROCS 有差距,主要体现在速度、叠合算法的鲁棒性和化学特征定义的成熟度上,但对中小规模筛选够用。
提示
商业软件的功能与定价变动较快,本文为方向性介绍,采购前请核对官方最新信息。使用形状筛选时,构象质量与查询分子的选择比工具本身更影响结果。
延伸资源
- 构象生成:279《OpenEye Omega》;平台:277《OpenEye Orion》;
- 骨架跃迁:306《BioSolveIT ReCore》;相似性概念见「分子表示」模块。