科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载RDKit 的增强立体化学Enhanced Stereochemistry机制用于表达样品中立体化学信息不确定的情形一个分子是多种非对映体的混合物还是立体化学只知其相对、不知其绝对的单一未知物。本文以仓库设计文档 Docs/Code/EnhancedStereo.md 为骨架结合 StereoGroup.h、EnumerateStereoisomers.py、ReactionRunner.cpp 等源码实现系统讲解其数据结构、V3000 mol 文件往返、异构体枚举、反应传递、搜索与描绘能力。读完本文你将掌握如何在 RDKit 中读入、检查、枚举并写出带ABS/AND/OR立体化学标记的分子。设计动机V3000 mol 文件中的增强立体化学该特性最初由 Greg Landrum 于 2018 年 9 月提出Docs/Code/EnhancedStereo.md原文档标注为 DRAFT但仓库内已形成完整实现。初始实现遵循V3kV3000mol 文件中的增强立体化学表示将具有指定立体化学关系的原子构成一组并用ABS、AND或OR标记说明我们对这组原子立体化学的已知程度。其核心语义非常明确AND表示混合物mixture样品中同时存在多种立体异构体OR表示未知的单一物质unknown single substance样品是某一种异构体但不确定是哪一种ABS表示绝对构型absolute这组原子的立体化学是确定的。例如AND 两组各 1 个手性中心意味着 4 种组合都存在OR 组则只可能是其中某一种构型。这一区分对药物研发中的外消旋体 vs 单一未知构型场景至关重要前者应表示为混合物后者虽然构型未知但样品本身是纯的。各种组合的语义对照原文档用一组所画结构 → 展开含义的对照图说明了AND/OR/ABS各组合的语义。下表完整保留该对照关系Mixture? 列表示该表示是否描述混合物所画结构是否为混合物含义展开mixturemixturemixturesinglesinglesinglemixturesingle可见OR组虽然所画结构与AND组相同但语义完全不同AND展开后是并存mixtureOR展开后仍是单一化合物single。ABS则表达这组原子中某些构型已知为绝对、其余为相对未知的混合信息例如ABS AND是绝对构型确定部分与混合部分的组合。核心数据结构StereoGroup枚举类型与成员在分子内部增强立体化学存储为一个StereoGroup对象的向量原文档Representation一节Stored as a vector ofStereoGroupobjects。其定义位于 Code/GraphMol/StereoGroup.henum class StereoGroupType { STEREO_ABSOLUTE 0, // ABS STEREO_OR 1, // OR STEREO_AND 2 // AND };StereoGroup类的成员包括d_grouptype组类型ABS/OR/ANDd_atoms参与该立体化学关系的原子指针向量d_bonds参与该关系的键指针向量在后续版本中加入用于支持 atropisomer 等轴手性场景d_readId/d_writeId组 ID。读取 ID来自输入文件V3000 的STEREL1、STERAC1等后缀编号写入 ID在输出时使用。0表示未定义。注意组 ID 在ABS组中没有意义StereoGroup.h中注释The group ID for AND/OR groups (it has no meaning in ABS groups)。存取与 ABS 组自动合并ROMol通过getStereoGroups()/setStereoGroups()存取这些组见 Code/GraphMol/ROMol.h 的d_stereo_groups成员。setStereoGroups的实现Code/GraphMol/ROMol.cpp有一个值得注意的行为当传入多个ABS组时会自动合并为单个ABS组原子与键分别拼接以保持一个分子至多一个绝对构型组的语义一致性。原子/键被移除时的维护原文档指出We will need to adjust this when atoms are removed or replaced.原子被移除或替换时需要调整组。这一需求在 StereoGroup.cpp 中实现为一组自由函数removeAtomFromGroups(atom, groups)从各组中删除该原子若组同时为空则整体移除removeBondFromGroups(bond, groups)从各组中删除该键removeGroupsWithAtom(atom, groups)/removeGroupsWithAtoms(atoms, groups)删除包含该原子任一原子的整个组对应地还有removeGroupsWithBond/removeGroupsWithBonds。这些函数在ROMol的原子/键删除流程中被调用确保分子编辑后立体化学组不会悬挂失效指针。此外构造函数会对原子、键做重复检查重复成员会抛出ValueErrorExceptionDuplicate atom/bond in StereoGroup。组 ID 的分配与转发assignStereoGroupIds(groups)为所有未分配写 ID 的AND/OR组按顺序分配输出 ID若发现重复 ID 会警告并重新分配StereoGroup.cpp中storeIdsInUse/assignMissingIds逻辑。forwardStereoGroupIds(mol)将各组的读 ID 复制为写 ID保证读入的组编号在导出时不丢失这正是原文档round trip 不丢数据目标的直接实现。StereoGroup还重载了operator可将组以ABS/OR /AND rId: x wId: y atoms: { 1 2 } bonds: { }形式输出到流便于调试。文件往返V3000 mol 文件解析与写出原文档的首要目标Use cases是V3k mol → RDKit → V3k mol 往返不丢数据操作、描绘与搜索为次要目标。解析MDLV30/STEABS、STEREL、STERACV3000 mol 文件中增强立体化学位于M V30 BEGIN COLLECTION块内行格式如下M V30 MDLV30/STEABS ATOMS(2 2 3) M V30 MDLV30/STEREL1 ATOMS(1 12) M V30 MDLV30/STERAC1 ATOMS(1 12)STEABS→ABS组STERELn→OR组编号nSTERACn→AND组编号n。解析器parseEnhancedStereo位于 Code/GraphMol/FileParsers/MolFileParser.cpp使用正则MDLV30/STE(...)([0-9]*) ATOMS\(([0-9]) (.*)\)匹配。其行为细节原子在 mol 文件中是 1 索引的解析时转换为 0 索引index - 1同一个原子在组中出现两次会发出警告严格解析模式下抛FileParseException一个分子中出现第二个ABS组会给出警告严格模式下报错不认识的 collection 类型如MDLV30/HILITE会被跳过并警告。写出appendEnhancedStereoGroups写出逻辑位于 Code/GraphMol/FileParsers/MolFileWriter.cpp先调用assignStereoGroupIds确保每个AND/OR组都有合法写 ID然后按类型写出STEABS/STEREL{id}/STERAC{id}ATOMS(n ...)中原子为 1 索引行长度接近 78 字符时自动续行-\nM V30。对于 atropisomer 场景还会通过Atropisomers::getAllAtomIdsForStereoGroup展开相关的轴原子。MolPicklerRDKit 二进制 pickle增强立体化学也已纳入 RDKit 自身的分子 pickle 协议MolPickler::_pickleStereo/_depickleStereo见 Code/GraphMol/MolPickler.cpp序列化组类型、写 ID对非ABS组、原子索引和键索引。其中键列表自 pickle 版本 16000起支持AND/OR组的组 ID 自版本 14010起读写。因此无需依赖 mol 文件即可在 RDKit 内部完整保留立体化学组。CXSMILES 扩展在 SMILES 的 CXSMILES 扩展中增强立体化学组通过/sg:语法表达解析与写出分别位于 Code/GraphMol/SmilesParse/CXSmilesOps.cpp 与 Code/GraphMol/SmilesParse/SmilesWrite.cpp。例如NCHCHO |sg:1:2,3|表示原子 2、30 索引构成 1 号组默认AND。此外 CanonicalizeStereoGroups.cpp 实现了组的标准排序与去重使同一组的不同内部顺序能输出为一致的标准 SMILES。立体异构体枚举把AND/OR展开为具体异构体原文档Enumeration一节指出Python 函数rdkit.Chem.EnumerateStereoisomers.EnumerateStereoisomers可枚举 StereoGroup 所代表的全部立体异构体并且可以只枚举 StereoGroup 相关的异构体忽略其它未指定立体中心。选项参数StereoEnumerationOptionsPython 版定义于 rdkit/Chem/EnumerateStereoisomers.pyC 版David Cosgrove 于 2025 年移植额外支持 atropisomer定义于 Code/GraphMol/EnumerateStereoisomers/EnumerateStereoisomers.h。两者参数一致参数默认值含义onlyUnassignedTrue只扰动未指定立体化学的中心已指定构型的中心不改变除非它属于某个相对立体化学组onlyStereoGroupsFalse若为True只枚举在分子 StereoGroup 处存在差异的异构体——对应原文档只枚举 Stereo Groups的能力uniqueTrue只返回 canonical SMILES 不同的异构体去除冗余maxIsomers1024Python/0C最大产出数超出时随机抽样子集0表示全部产出。每个额外立体中心会使结果数翻倍需注意控制tryEmbeddingFalse对每个异构体尝试用距离几何生成构象失败则视为不可物理存在而丢弃。计算开销大且只是启发式可能误删异构体rand/randomSeedNone/-1随机数种子Python 版为randC 版为randomSeed用于可复现的随机采样实现原理Flipper 机制EnumerateStereoisomers的实现基于翻转器flipper_AtomFlipper翻转四面体手性原子的CHI_TETRAHEDRAL_CW/CHI_TETRAHEDRAL_CCW标记_BondFlipper翻转双键的STEREOCIS/STEREOTRANS_StereoGroupFlipper整体翻转组内所有原子的手性标记原构型 ↔ 镜像构型这正是展开AND/OR组的机制。组合这些翻转器的位掩码即可遍历全部构型组合。默认onlyUnassignedTrue时已指定构型的中心不被扰动但对AND/OR组_getFlippers会额外添加_StereoGroupFlipper见 EnumerateStereoisomers.py。枚举出的每个异构体随后会移除自身携带的 StereoGroupisomer.SetStereoGroups([])因为此时组信息已被具体构型替代。使用示例from rdkit import Chem from rdkit.Chem.EnumerateStereoisomers import ( EnumerateStereoisomers, StereoEnumerationOptions, GetStereoisomerCount, ) # 估计上界立体异构体数量含双键立体化学 m Chem.MolFromSmiles(BrC(Cl)(F)CCC(O)C) print(GetStereoisomerCount(m)) # 8 # 枚举全部异构体3 个手性原子 1 个手性双键 16 种理论异构体 m Chem.MolFromSmiles(BrCCC1OC(C2)(F)C2(Cl)C1) isomers tuple(EnumerateStereoisomers(m)) print(len(isomers)) # 16 # 用距离几何过滤掉无法成构象不物理的异构体 opts StereoEnumerationOptions(tryEmbeddingTrue) isomers tuple(EnumerateStereoisomers(m, optionsopts)) print(len(isomers)) # 8 # 只展开 StereoGroup 相关的立体化学忽略其它未指定中心 opts StereoEnumerationOptions(onlyStereoGroupsTrue) # 大规模分子惰性生成器逐条产出或随机抽样固定数量带种子保证可复现 m Chem.MolFromSmiles(Br CH * 20 F) opts StereoEnumerationOptions(maxIsomers3, rand0xf00d) for smi in EnumerateStereoisomers(m, optionsopts): print(Chem.MolToSmiles(smi))从源码 doctest同一文件的文档字符串可以看到GetStereoisomerCount返回的是上界估计2 ** len(flippers)实际可存在的异构体可能更少——用tryEmbeddingTrue可进一步筛选。化学反应中的传递规则原文档Reactions一节给出三条规则① 反应执行器感知分子上的 StereoGroup反应物组中的原子会复制到所有包含该原子的产物中除非反应在该原子处创建或破坏了立体化学② 若反应物组中的某个原子在产物中出现多次其所有副本进入同一个产物 StereoGroup③ 反应模板RXN文件中的组也会被复制到产物。实现位于 Code/GraphMol/ChemReactions/ReactionRunner.cpp 的copyEnhancedStereoGroups依据ReactantProductAtomMapping将反应物原子映射到产物原子若产物原子的手性标记变为CHI_UNSPECIFIED立体化学被反应破坏跳过该原子若产物原子带有molInversionFlag 4反应明确定义了该原子的立体化学/构型翻转跳过该原子——即反应创建了立体化学时不再继承反应物的组关系其余产物原子连同原组类型sg.getGroupType()与读 IDsg.getReadId()一起重建为新的StereoGroup并合并进产物已有的组。此外copyTemplateStereoGroupsToMol同文件第 1414 行起处理 RXN 模板自身的 StereoGroup模板组中的原子会复制到对应的产物原子并确保不与从反应物继承的组冲突。源码注释也诚实指出虽然已为 atropisomer 增加了存储与 canonicalization搜索尚未支持届时需要将组的键部分按需复制到产物——即键类组在反应传递中目前仍未完整实现。搜索从枚举到 MolBundle原文档Searching一节给出的方案是通过枚举代码生成 MolBundle 对象再对 MolBundle 进行搜索。也就是把带增强立体化学的分子匹配转化为对枚举展开得到的若干具体异构体进行匹配——若查询分子能匹配其中任意一个展开异构体则命中。原文档同时说明Substructure searching and canonicalization do not yet support stereo groups.从当前仓库源码看这一限制在后续版本中已有部分解除canonicalization 已支持CanonicalizeStereoGroups.cpp提供canonicalizeStereoGroups含StereoGroupAbsOptions、maxStereoGroups等选项与cleanupStereoGroups可将异构体枚举的结果规范化输出子结构搜索仍以 MolBundle 为主要路径SubstructMatch中已包含StereoGroup相关引用见 Code/GraphMol/Substruct/SubstructMatch.cpp仓库注释明确表示搜索尚待完整支持实际操作中应沿用先枚举、再匹配 MolBundle的路线。描绘让组在结构图中可见原文档Depiction一节指出需要在描绘代码中添加让组可见的能力。当前实现位于 Code/GraphMol/MolDraw2D/DrawMol.cppDrawOptions.addStereoGroupAnnotation在结构图上绘制立体化学组的注释extractStereoGroups会遍历组并标注类型与编号DrawOptions.simplifiedStereoGroupLabel对非ABS组使用简化标签若开启简化标签会调用Chirality::simplifyEnhancedStereoCode/GraphMol/Chirality.cpp在绘制副本上合并/简化组并可选择移除受影响组。Python 端对应rdkit.Chem.Draw.MolDraw2DOptions的addStereoGroupAnnotation/simplifiedStereoGroupLabel属性。这使研究者可以在图上直观看到AND/OR组及其成员原子而无需依赖文本文件。从 2018 草案到当前实现能力现状小结原文档是 2018 年的草案仓库中的实现已远超其描述。按设计文档为纲、源码为证的视角当前状态可归纳为原文档要点当前实现状态采用 V3k mol 的ABS/AND/OR表示✅ 已实现解析/写出见MolFileParser.cpp、MolFileWriter.cpp存储为StereoGroup对象向量✅StereoGroup.hROMol::get/setStereoGroups原子移除/替换时调整组✅removeAtomFromGroups等辅助函数并在ROMol删除流程中调用V3k mol → RDKit → V3k mol 往返不丢数据✅ 读 ID → 写 ID 转发forwardStereoGroupIds pickle 协议支持EnumerateStereoisomers枚举组代表的异构体✅ Python 版含onlyStereoGroups C 版2025 年移植支持 atropisomer反应执行器感知并传递组✅copyEnhancedStereoGroups破坏/新建立体化学时不继承搜索枚举生成 MolBundle 后匹配✅ 作为推荐路径canonicalization 亦已支持描绘让组可见✅addStereoGroupAnnotation/simplifiedStereoGroupLabel实用建议若你的数据源是 V3000 mol 文件含MDLV30/STE*collection 块RDKit 现在可以无损读入并写出若需基于立体化学组做下游分析如混合物展开、反应产物预测可组合使用GetStereoGroups()检查、EnumerateStereoisomers必要时onlyStereoGroupsTrue枚举、以及 MolBundle 匹配完成检索。需要注意的是本文所描述的行为以当前仓库Code/GraphMol与rdkit/Chem的实现为准maxIsomers默认值在 Python 版与 C 版之间存在差异1024 vs 0跨语言使用时需显式指定。赞分享科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相关推荐RDKit rdkit.Chem.rdEnumerateStereoisomersC 驱动的立体异构体枚举模块详解RDKit rdkit.Chem.rdEnumerateStereoisomersC 驱动的立体异构体枚举模块详解 本篇技术指南围绕 RDKit 中由 C科学计算科研机器学习RDKit SimpleEnum 虚拟库枚举基于化学反应与功能基团的化合物库快速生成指南RDKit SimpleEnum 虚拟库枚举基于化学反应与功能基团的化合物库快速生成指南 导读 rdkit.Chem.SimpleEnum 是 RDKit 中科学计算科研机器学习TypeScript 枚举Enum完全指南数字枚举、字符串枚举、常量枚举与反向映射TypeScript 枚举Enum完全指南数字枚举、字符串枚举、常量枚举与反向映射 枚举 enum 是 TypeScript 提供的一组具名常量值集合文档教程上一篇MLflow LlamaIndex Flavor 实战指南从索引日志、引擎部署到自动追踪下一篇Qwen Code DaemonSessionClient 的 clientId 自愈机制基于 invalid_client_id 的会话重注册与单次重试设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考