mcpField
S
sar-analysis

sar-analysis

github.com/jaechang-hits数据与数据库38469 次安装6 天前更新
代码仓库

关于 sar-analysis

sar-analysis 是一项基于 RDKit 的化合物构效关系分析指南技能,面向研究化合物系列的人员。它介绍骨架与 R 基分析、结构对齐报告,以及依据实测活性进行比较的方法。

主要功能

  1. 01用 MCS 查找共有骨架
  2. 02将分子拆解为 R 基
  3. 03按母体结构对齐片段
  4. 04生成活性热图报告
  5. 05用成对比较支持 SAR 结论

适用场景

  1. 01比较类似物之间的取代基效应
  2. 02检查化合物系列的活性变化
  3. 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 使用 DrawMoleculeACS1996ACS1996 是药物化学图表中事实上的标准

最佳实践

  1. 先检查 dataframe,再假定列名。 真实世界的活性表格各不相同;应从 df.head() 自动检测 SMILES、活性和 ID 列,而不是硬编码列名。这样可以避免在用户数据上出现静默失败。
  2. 在 MCS 之前显式添加氢原子。 Chem.AddHs 能让 MCS 正确处理重原子的价态和环闭合;若不添加氢原子,可能会遗漏其他方面完全相同的骨架。
  3. 剔除不变的 R 位点。 如果某个 R 位点的片段在所有类似物中都相同,它就不包含 SAR 信息;应从表格中删除该列,并从核心结构示意图中移除这个不变的连接点,以突出可变位点。
  4. 始终将片段对齐到母体分子,而不是反过来。 通过匹配原子映射,将坐标从母体分子复制到每个片段上。先绘制规范化的母体分子,再从头绘制片段,会失去各行之间的可比性。
  5. 使用对数尺度的活性热图。 效力通常跨越 2–4 个数量级;线性色标会压缩有意义的低 IC50 区域。将绿色映射为低 IC50(高效力),红色映射为高 IC50(低效力)。
  6. 每项 SAR 结论都要用同一 R 位点的成对对比来佐证。 “小的吸电子基团能提高 R1 位点的活性”之类的表述,必须有直接对比作为依据,例如“化合物 7(R1=F,IC50=0.5 µM)与化合物 1(R1=Me,IC50=5.2 µM)的对比”。没有依据的泛化不能作为证据。
  7. 每个设计假设测试 3–4 个类似物。 单一取代基变化可能受到实验噪声的干扰;在同一位点测试多个类似物,才能得出可靠的趋势。
  8. 使用 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(结构-活性关系)分析。

任务要求:

  1. 数据加载: 加载 CSV 文件。不要假定列名固定;应检查数据框(例如,使用 df.head()),自动识别化合物标识(例如,'Compound Key'、'ID'、'Name')、活性(例如,'Standard Value'、'IC50'、'Activity')和 SMILES(例如,'Smiles'、'SMILES'、'Structure')对应的列。

  2. 核心识别(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)
      
  3. R 基团拆分与优化:

    • 根据核心结构进行拆分。
    • 优化: 排除所有分子中都相同(恒定)的 R 基团列。同时,从核心结构可视化中移除这些恒定点。
  4. 图像生成与对齐(严格提取坐标):

    • 目标: 确保核心结构和 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)
      
  5. 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 与活性之间的相关性)。
  6. 分析文本输出:

    • 根据分析结果,生成简洁的 SAR 结果文本分析。

    • **输出格式:**直接在对话中输出此文本(不要保存到文件)。

    • **说明:**分析文本必须严格遵循以下指南:

      你是一名专攻构效关系(SAR)分析的科学助手。你的任务是分析提供的分子数据,并生成简洁的 SAR 报告。报告必须包含分子 ID,帮助用户理解 SAR 分析。

      根据提供的数据,分析以下分子的 SAR。

      核心说明:

      1. 识别骨架和取代基:

        • 确定共有的核心结构,并将可变位置标记为 R1、R2 等。始终一致地使用这些标记。
      2. 进行比较分析:

        • 🚨 关键要求:必须通过明确对比同一位置上导致不同活性的其他取代基,来证明所有关于取代基影响的说法。描述的每种活性趋势都必须有化合物之间的直接比较作为依据。不接受缺乏依据的泛化结论。🚨
      3. 推断作用机制:

        • 考虑位阻、电子效应和潜在的分子间相互作用(例如,氢键、疏水作用),提出活性变化的合理原因。
      4. 评估数据完整性并提出类似物(强制评估步骤):

        • 作为分析的最后一个强制步骤,你必须批判性地评估所提供 SAR 数据的完整性。

        • 仅当你发现关键化合物缺少明确的对应化合物,导致无法稳健地得出 SAR 结论且存在重大歧义时,才必须提出一个新的类似物来消除歧义。

        • 任何提议的理由仍必须遵循以下具体逻辑:

          • 指出歧义:说明导致不确定性的具体化合物及其数据。

          • 指出缺失的对照物:说明需要进行什么比较,但目前无法进行。

          • 提出解决方案:给出能够消除歧义的确切类似物。

          • 如果你认定数据充足,只需在下方专门的部分中说明这一点。

      5. 总结:

        • 总结 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 文件。
  • 在聊天中打印分析文本。

参考资料

评论

支持 Markdown