关于 sar-analysis
sar-analysis 是一项基于 RDKit 的化合物构效关系分析指南技能,面向研究化合物系列的人员。它介绍骨架与 R 基分析、结构对齐报告,以及依据实测活性进行比较的方法。
主要功能
- 01用 MCS 查找共有骨架
- 02将分子拆解为 R 基
- 03按母体结构对齐片段
- 04生成活性热图报告
- 05用成对比较支持 SAR 结论
适用场景
- 01比较类似物之间的取代基效应
- 02检查化合物系列的活性变化
- 03制作供药物化学分析的对齐结构报告
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jaechang-hits/ sciagent-skills --skill sar-analysis安装后在 Claude Code 中输入/sar-analysis确认已加载。
详细介绍
SAR 分析
元数据
简短描述:使用 RDKit 进行构效关系(SAR)分析的全面指南。
作者:Ohagent Team
版本:1.0
最后更新:2025 年 12 月
许可证:CC BY 4.0
商业用途:✅ 允许
概述
构效关系(SAR)分析是一项核心的药物化学工作流,旨在将一个化合物系列的系统性结构变化与生物活性变化联系起来。其目标是:(1)识别一系列类似物共享的共同骨架(最大公共子结构,MCS);(2)将每个分子拆分为骨架和 R 基取代基;(3)对齐所有分子,使同一位置的取代基在视觉上可以直接比较;(4)将取代基变化与效力联系起来,从而得出可检验的设计假设。
本指南规范了一套可复现的、基于 RDKit 的 SAR 工作流,可生成交互式 HTML 报告(包含对齐后的核心结构 / R 基表格和活性热图),并撰写 SAR 叙述,明确比较同一 R 位点上的不同取代基。本指南适用于包含 SMILES、化合物标识符和数值效力指标(IC50、Ki、EC50、%inhibition 等)的活性数据表。
核心概念
最大公共子结构(MCS)
MCS 是一组分子中所有分子(或达到可配置阈值的分子)共有的最大连通子结构。RDKit 的 rdFMCS.FindMCS 会根据可调节的原子 / 键比较规则搜索该骨架。对于 SAR,MCS 提供一个锚定模板,以便拆分并对齐每个类似物。threshold=0.8 表示即使候选子结构只存在于 80% 的分子中,也可以将其定义为 MCS;与 threshold=1.0 相比,这种设置对离群值更稳健。ringMatchesRingOnly=True 和 completeRingsOnly=True 可避免产生在化学意义上不合理的部分环片段。
R 基拆分
R 基拆分(rdRGroupDecomposition.RGroupDecompose)会将每个分子映射到 MCS 核心结构,并将非核心片段分配到依次编号的 R 位点(R1、R2、……)。输出是一个逐分子字典 {Core, R1, R2, …}。恒定的 R 位点(即每个分子都带有相同片段的位点)对 SAR 没有参考价值,应从报告中剔除,以便将注意力集中在真正影响活性的可变位点上。
用于 2D 图示比较的子结构对齐
要使 SAR 可视化结果具有可读性,核心结构和每个 R 基都必须以与母体分子相同的方向绘制。建议按顺序采用三种回退策略:(1)直接使用 GetSubstructMatch;(2)使用 AdjustQueryProperties(makeDummiesQueries=True) 将 R 基虚原子视为查询原子后重新匹配;(3)最后尝试使用 useChirality=False。找到匹配后,将母体构象的原子坐标复制到片段上。否则,R 基单元格将以任意的规范方向绘制,几乎无法读取视觉化的 SAR 信息。
活性热图与比较分析
在活性列上使用对数尺度的颜色渐变(绿色 = 高效力 / 低 IC50,红色 = 低效力 / 高 IC50),读者便可一眼发现该系列中的趋势。配套的叙述必须通过同一 R 位点上的明确成对比较来佐证有关取代基作用的每一项结论——SAR 证据的基本单位是“化合物 A(R1=X,IC50=……)与化合物 B(R1=Y,IC50=……)的比较”,而不是缺乏依据的泛化结论。
决策框架
SAR analysis pipeline
└── Have SMILES + activity for >= 4 analogues?
├── No -> Insufficient data; collect more analogues first
└── Yes -> Run rdFMCS.FindMCS(threshold=0.8, ringMatchesRingOnly=True)
├── MCS too small (<5 atoms) -> Series is too diverse;
│ cluster first, then run SAR per cluster
└── MCS reasonable -> RGroupDecompose
└── For each fragment alignment to parent:
├── Strategy 1: GetSubstructMatch(direct) -- works for canonical cases
│ └── No match -> Strategy 2
├── Strategy 2: AdjustQueryProperties(makeDummiesQueries=True)
│ -- handles dummy R-group atoms
│ └── No match -> Strategy 3
├── Strategy 3: GetSubstructMatch(useChirality=False)
│ -- handles stereochemistry mismatches
│ └── No match -> Compute2DCoords as fallback (lose alignment)
└── Drop constant R-positions, build HTML, draw with DrawMoleculeACS1996
| 情况 | 推荐选择 | 理由 |
|---|---|---|
| 具有明确骨架的标准同系物系列 | MCS threshold=0.8,ringMatchesRingOnly=True,completeRingsOnly=True | 容许少数离群值,同时保持环结构完整 |
| 高度多样化的集合(例如 HTS 命中列表) | 先聚类(Tanimoto/Murcko),再按簇进行 SAR 分析 | 单一 MCS 对多样化的化学型而言会过小,无法发挥作用 |
| 系列中包含立体异构体 | 先尝试策略 1;若不适用,再使用策略 3(useChirality=False) | 手性差异不应影响结构示意图的对齐 |
| 查询中带有 R 基团连接虚原子的类似物 | 使用 AdjustQueryProperties(makeDummiesQueries=True) 的策略 2 | 虚原子会被视为查询原子,因此能够与真实重原子匹配 |
| 所有类似物中某个 R 位点均保持不变 | 从报告和核心结构示意图中移除 | 不变位点没有信息价值,只会让表格更杂乱 |
| 活性跨越多个数量级 | 使用 log10(activity) 绘制颜色热图 | 线性尺度会在视觉上压缩动态范围 |
| 用于发表或报告的绘图 | 通过 MolDraw2DSVG 使用 DrawMoleculeACS1996 | ACS1996 是药物化学图表中事实上的标准 |
最佳实践
- 先检查 dataframe,再假定列名。 真实世界的活性表格各不相同;应从
df.head()自动检测 SMILES、活性和 ID 列,而不是硬编码列名。这样可以避免在用户数据上出现静默失败。 - 在 MCS 之前显式添加氢原子。
Chem.AddHs能让 MCS 正确处理重原子的价态和环闭合;若不添加氢原子,可能会遗漏其他方面完全相同的骨架。 - 剔除不变的 R 位点。 如果某个 R 位点的片段在所有类似物中都相同,它就不包含 SAR 信息;应从表格中删除该列,并从核心结构示意图中移除这个不变的连接点,以突出可变位点。
- 始终将片段对齐到母体分子,而不是反过来。 通过匹配原子映射,将坐标从母体分子复制到每个片段上。先绘制规范化的母体分子,再从头绘制片段,会失去各行之间的可比性。
- 使用对数尺度的活性热图。 效力通常跨越 2–4 个数量级;线性色标会压缩有意义的低 IC50 区域。将绿色映射为低 IC50(高效力),红色映射为高 IC50(低效力)。
- 每项 SAR 结论都要用同一 R 位点的成对对比来佐证。 “小的吸电子基团能提高 R1 位点的活性”之类的表述,必须有直接对比作为依据,例如“化合物 7(R1=F,IC50=0.5 µM)与化合物 1(R1=Me,IC50=5.2 µM)的对比”。没有依据的泛化不能作为证据。
- 每个设计假设测试 3–4 个类似物。 单一取代基变化可能受到实验噪声的干扰;在同一位点测试多个类似物,才能得出可靠的趋势。
- 使用
DrawMoleculeACS1996进行绘图。 ACS1996 样式能生成符合药物化学出版规范的统一键长、原子标签和字体;避免在同一份报告中混用不同样式。
常见陷阱
-
陷阱:硬编码列名,例如
"SMILES"或"IC50"。 不同供应商和 ELN 导出的表头各不相同;如果用户使用Smiles或Standard Value,脚本就会出错。- 避免方法:检查
df.columns和df.head(),根据内容(有效 SMILES 的解析率、数值、唯一字符串)检测 SMILES、活性和 ID 列。
- 避免方法:检查
-
陷阱:在 MCS 之前跳过
Chem.AddHs。 隐式氢分子可能产生比预期更小的 MCS,因为价态和环的识别方式不同。- 避免方法:调用
rdFMCS.FindMCS之前,务必使用mols_for_mcs = [Chem.AddHs(m) for m in mols]进行预处理。
- 避免方法:调用
-
陷阱:对含噪系列设置
threshold=1.0。 一个具有特殊骨架的离群值就会使 MCS 缩减为很小的片段,导致其他所有化合物的 R 基团分解失效。- 避免方法:使用
threshold=0.8(或更低),使 MCS 在该系列中有 80% 的化合物包含它时即可确定;单独检查离群值。
- 避免方法:使用
-
陷阱:使用
Compute2DCoords独立绘制每个片段。 每个片段都会获得自己的规范化二维布局,因此相同行中的等价原子位置不同,导致 SAR 可视化难以阅读。- 避免方法:将每个片段与母体匹配(使用 3 种策略的回退机制),并将母体构象中的坐标复制到片段的构象中。
-
陷阱:无法处理虚拟 R 基团原子。 当片段包含 R 基团虚拟原子(
*)时,GetSubstructMatch会返回无匹配结果,因为默认情况下虚拟原子不会被视为查询原子。- 避免方法:重试匹配前,使用
makeDummiesQueries=True应用AdjustQueryProperties(params)(策略 2)。
- 避免方法:重试匹配前,使用
-
陷阱:只报告一个误差指标(例如仅报告均值)。 不报告离散程度的趋势无法解读;同样,不基于相同位置的对比来讨论取代基效应,也不算 SAR。
- 避免方法:对于每个 R 位点,列出每种唯一取代基及含有该取代基的化合物的活性;所有结论都应来自成对比较。
-
陷阱:对以 nM 为单位的 IC50 使用线性尺度热图。 大多数有意义的效力范围会挤在一两个颜色区间内。
- 避免方法:按
log10(IC50)或pIC50 = -log10(IC50_in_M)着色;这样在不同数量级之间可以均匀区分颜色。
- 避免方法:按
-
陷阱:将 R 基团分解中的每一列都视为 SAR 轴。 恒定的 R 位点(每个类似物都有相同的片段)和核心本身都不是 SAR 变量。
- 避免方法:分解后,以编程方式删除所有条目均相同的列,并从核心图像中移除这些连接点。
工作流
你是 Cheminformatics 和 Python 方面的专家。使用 RDKit 执行 SAR(结构-活性关系)分析。
任务要求:
-
数据加载: 加载 CSV 文件。不要假定列名固定;应检查数据框(例如,使用
df.head()),自动识别化合物标识(例如,'Compound Key'、'ID'、'Name')、活性(例如,'Standard Value'、'IC50'、'Activity')和 SMILES(例如,'Smiles'、'SMILES'、'Structure')对应的列。 -
核心识别(MCS):
- 使用
rdFMCS.FindMCS查找显著的共同骨架。 - 预处理: 在查找 MCS 之前,对分子应用
Chem.AddHs。 - 参考代码: 使用以下参数设置,以稳健地识别核心:
mols_for_mcs = [Chem.AddHs(m) for m in mols] mcs_res = rdFMCS.FindMCS( mols_for_mcs, threshold=0.8, ringMatchesRingOnly=True, completeRingsOnly=True, atomCompare=rdFMCS.AtomCompare.CompareElements, bondCompare=rdFMCS.BondCompare.CompareOrder ) core_mol = Chem.MolFromSmarts(mcs_res.smartsString) AllChem.Compute2DCoords(core_mol)
- 使用
-
R 基团拆分与优化:
- 根据核心结构进行拆分。
- 优化: 排除所有分子中都相同(恒定)的 R 基团列。同时,从核心结构可视化中移除这些恒定点。
-
图像生成与对齐(严格提取坐标):
-
目标: 确保核心结构和 R 基团与原始分子在视觉上完全重叠。
-
绘图样式: 绘制分子时,始终使用 DrawMoleculeACS1996,以确保可视化效果一致且专业:
from rdkit.Chem.Draw import rdMolDraw2D drawer = rdMolDraw2D.MolDraw2DSVG(-1, -1) rdMolDraw2D.DrawMoleculeACS1996(drawer, mol) drawer.FinishDrawing() svg = drawer.GetDrawingText() svg = svg.replace("width='", "width='100%' data-original-width='") svg = svg.replace("height='", "height='100%' data-original-height='") -
参考实现: 使用以下特定对齐逻辑,确保完美叠加:
matches, unmatched_indices = rdRGroupDecomposition.RGroupDecompose([core_mol], mols, asSmiles=False, asRows=False)def align_substructure_to_parent(sub, parent): if not sub or not parent: return False try: # Strategy 1: Direct match match = parent.GetSubstructMatch(sub) # Strategy 2: Convert dummies to queries (handle R-group attachment points) if not match: params = Chem.AdjustQueryParameters() params.makeDummiesQueries = True params.adjustDegree = False params.adjustRingCount = False sub_query = Chem.AdjustQueryProperties(sub, params) match = parent.GetSubstructMatch(sub_query) # Strategy 3: Try without chirality if not match: match = parent.GetSubstructMatch(sub, useChirality=False) if match: conf_parent = parent.GetConformer() conf_sub = Chem.Conformer(sub.GetNumAtoms()) for sub_idx, parent_idx in enumerate(match): pos = conf_parent.GetAtomPosition(parent_idx) conf_sub.SetAtomPosition(sub_idx, pos) sub.RemoveAllConformers() sub.AddConformer(conf_sub) return True except: pass return False # Usage in loop: # 1. Align Original Molecule to Core template try: AllChem.GenerateDepictionMatching2DStructure(m, core_mol) except: AllChem.Compute2DCoords(m) # 2. Align fragments (Core/R-groups) to Original Molecule # Copy coords FROM original molecule TO fragment if not align_substructure_to_parent(fragment, m): AllChem.Compute2DCoords(fragment)match_core = matches['Core'][i] align_substructure_to_parent(this_core, mol) core_img = mol_to_base64(this_core)
-
-
HTML 输出(
sar_analysis_report.html):- **设计:**使用 CSS 样式创建简洁、现代且美观的 HTML 页面。运用现代 CSS 特性(例如,柔和的阴影、平滑的过渡效果、清晰的排版、合适的配色方案和响应式设计),提升可读性和视觉效果。最重要的是,确保表格列宽足够大,能够清晰展示结构。对于包含图像的列(Original、Core、R-groups),设置至少 300px 的
min-width(例如,min-width: 300px;),避免分子图像被缩小,使其易于辨认。 - 表格结构:
Compound Key、Activity、Original Molecule、Core和可变的 R-groups。 - **活性热图:**使用对数刻度为 Activity 单元格应用背景颜色渐变(低值/高效力用绿色表示,高值/低效力用红色表示)。
- 图像处理:
- 将分子转换为 SVG(首选)或 Base64 PNG 字符串。
- **验证:**检查图像是否成功生成。仅嵌入有效图像;否则,使用文本占位符(
<td>No Image</td>)。
- 交互式排序:
- 在 HTML 页面中添加“切换排序顺序”按钮。
- 功能:点击按钮可在三个视图间循环切换:默认视图(CSV 原始顺序)、活性升序视图(按 Activity 值从低到高排序)和活性降序视图(按 Activity 值从高到低排序)。
- **实现:**使用 JavaScript 在客户端处理排序逻辑。确保将 Activity 列的值解析为数字,以便正确排序。
- **摘要:**简要概述 SAR 结果(R-groups 与活性之间的相关性)。
- **设计:**使用 CSS 样式创建简洁、现代且美观的 HTML 页面。运用现代 CSS 特性(例如,柔和的阴影、平滑的过渡效果、清晰的排版、合适的配色方案和响应式设计),提升可读性和视觉效果。最重要的是,确保表格列宽足够大,能够清晰展示结构。对于包含图像的列(Original、Core、R-groups),设置至少 300px 的
-
分析文本输出:
-
根据分析结果,生成简洁的 SAR 结果文本分析。
-
**输出格式:**直接在对话中输出此文本(不要保存到文件)。
-
**说明:**分析文本必须严格遵循以下指南:
你是一名专攻构效关系(SAR)分析的科学助手。你的任务是分析提供的分子数据,并生成简洁的 SAR 报告。报告必须包含分子 ID,帮助用户理解 SAR 分析。
根据提供的数据,分析以下分子的 SAR。
核心说明:
-
识别骨架和取代基:
- 确定共有的核心结构,并将可变位置标记为 R1、R2 等。始终一致地使用这些标记。
-
进行比较分析:
- 🚨 关键要求:必须通过明确对比同一位置上导致不同活性的其他取代基,来证明所有关于取代基影响的说法。描述的每种活性趋势都必须有化合物之间的直接比较作为依据。不接受缺乏依据的泛化结论。🚨
-
推断作用机制:
- 考虑位阻、电子效应和潜在的分子间相互作用(例如,氢键、疏水作用),提出活性变化的合理原因。
-
评估数据完整性并提出类似物(强制评估步骤):
-
作为分析的最后一个强制步骤,你必须批判性地评估所提供 SAR 数据的完整性。
-
仅当你发现关键化合物缺少明确的对应化合物,导致无法稳健地得出 SAR 结论且存在重大歧义时,才必须提出一个新的类似物来消除歧义。
-
任何提议的理由仍必须遵循以下具体逻辑:
-
指出歧义:说明导致不确定性的具体化合物及其数据。
-
指出缺失的对照物:说明需要进行什么比较,但目前无法进行。
-
提出解决方案:给出能够消除歧义的确切类似物。
-
如果你认定数据充足,只需在下方专门的部分中说明这一点。
-
-
-
总结:
- 总结 SAR 的关键发现,并指出最有前景的类似物。
输出格式和风格:
- 直截了当: 立即开始分析。不要使用“我将进行分析……”或“以下是分析……”之类的对话式开场白。
- 开篇陈述: 用一个句子概述主要的结构修饰和关键发现。
- 科学语气: 使用准确、审慎的措辞(例如“表明……”“可能是由于……”)。
- 格式: 使用 Markdown 提高清晰度(例如加粗、项目符号)。
- 专门的建议部分: 在分析末尾,必须另设一个标题为
### Suggestions for Further Study的部分。- 在此部分中,列出根据指令 #4 提出的类似物。
- 如果你认定所提供的数据已经充足,无需新的类似物,仍必须包含此部分,并写明:“所提供的类似物已为已探索的位置提供了充分的比较数据,足以支持稳健的初步 SAR 分析。”这样可确保不会跳过此步骤。
- 简洁: 仅提供所要求的 SAR 分析。
- 主动跟进: 在回复最末尾(总结之后),必须以面向用户的直接提问形式明确建议下一步操作或分析(例如:“您希望我……吗?”)。
输出结构示例:
对所提供化合物的 SAR 分析表明,R1 位上的小型吸电子基团对抗菌活性至关重要。例如,类似物 7(R1=F,IC50 = 0.5 µM)相比母体化合物 1(R1=Me,IC50 = 5.2 µM)活性提高了 10 倍,表明该基团可能在空间受限的区域内形成了关键相互作用。相反,类似物 12 中的苯基等体积较大的 R1 取代基会使活性完全消失。
Suggestions for Further Study
为验证 R1 位上的位阻体积不利于活性的假设,建议合成该位置为氢的类似物(即化合物 1 的去甲基版本)。这将为未取代骨架的活性建立基线,并确认结合口袋的空间限制。
您希望我为拟议的去甲基类似物设计合成路线吗?
-
-
输出:
- 提供最终的
sar_analysis_report.html文件。 - 在聊天中打印分析文本。
参考资料
- RDKit 文档 — 最大公共子结构:https://www.rdkit.org/docs/source/rdkit.Chem.rdFMCS.html
- RDKit 文档 — R 基团分解:https://www.rdkit.org/docs/source/rdkit.Chem.rdRGroupDecomposition.html
- RDKit 文档 —
MolDraw2D和DrawMoleculeACS1996:https://www.rdkit.org/docs/source/rdkit.Chem.Draw.rdMolDraw2D.html - Dalke A, Hastings J. “FMCS:一种用于多重 MCS 问题的新算法。” J Cheminform. 2013;5(Suppl 1):O6. https://doi.org/10.1186/1758-2946-5-S1-O6
- Lewell XQ, Judd DB, Watson SP, Hann MM. “RECAP——逆合成组合分析程序。” J Chem Inf Comput Sci. 1998;38(3):511-522. https://doi.org/10.1021/ci970429i
- Stumpfe D, Bajorath J. “探索药物化学中的活性悬崖。” J Med Chem. 2012;55(7):2932-2942. https://doi.org/10.1021/jm201706b
- Allen FH, Bellard S, Brice MD, et al. ACS 文档标准(ACS1996 绘图风格参考):https://pubs.acs.org/doi/10.1021/ci00027a005