资讯动态

RDKit RegistrationHash 模块详解:基于化学结构的分层分子哈希与去重方案

发布时间:2026/10/14 2:56:49 来源:尧图企业网站定制
科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载导读rdkit.Chem.RegistrationHash是 RDKit 中用于化学注册系统的核心模块它为分子生成基于化学结构唯一性的哈希码只要两个分子在化学意义上相同就应当得到相同的哈希。与直接使用 SMILES 相比该模块能够忽略原子映射号等化学上无意义的 SMILES 特征、统一增强立体化学enhanced stereochemistry基团、并规范化 S 基团SGroup如聚合物数据从而为化合物登记、去重、归并提供稳定可靠的判等依据。读完本文你将掌握该模块的分层哈希架构HashLayer、三种哈希方案HashScheme的取舍、GetMolLayers/GetMolHash的完整参数语义以及如何基于仓库中的测试用例在真实项目中落地分子注册与去重。模块定位为化学注册系统补齐最后一块拼图该模块随 RDKit 2022.09 版本引入官方发布说明将其列为该版本的核心亮点The new RegistrationHash module provides one of the last pieces required to build a registration system with the RDKit见 ReleaseNotes.md。同年发布的还有一项关键前置工作开放了 Schrödinger 实现的 molhash 源码ReleaseNotes.md即本文即将介绍的 C 底层rdMolHash模块。模块的 Python 源码位于 rdkit/Chem/RegistrationHash.py其模块级 docstring 直接阐述了核心设计意图Generate a unique hash code for a molecule based on chemistry. If two molecules are chemically the same, they should have the same hash.使用 molhash 相对 SMILES 的增值点在于rdkit/Chem/RegistrationHash.py忽略 SMILES 中不具化学意义的特征例如原子映射号atom map numbers统一增强立体化学基团的规范形式例如CCHCC |1:1|与CCHCC |1:1|具有相同的 molhash规范化 S 基团SGroup数据例如聚合物数据。模块内置两套哈希方案默认方案以及将互变异构体tautomer视为等价的方案。分层哈希架构HashLayer 枚举RegistrationHash 的核心思想是分层先把分子拆解成多个互相独立的信息层layer每一层描述分子的一种化学侧面最后再把选中的层组合起来生成最终哈希。分层设计使得用户可以灵活决定哪些信息参与判等、哪些信息忽略。HashLayer枚举定义了全部 7 个层rdkit/Chem/RegistrationHash.py枚举成员docstring 含义数据示例取自测试CANONICAL_SMILESRDKit 规范 SMILES不含增强立体信息C[CH]1CCHc2cc3c(C(F)(F)F)cc(O)nc3cc2N1 \|o1:1,3\|ESCAPE用户附加的任意其他信息默认空串FORMULA分子的简单分子式C15H15F3N2ONO_STEREO_SMILES去除全部立体信息的规范 SMILESCC1CC(C)c2cc3c(C(F)(F)F)cc(O)nc3cc2N1NO_STEREO_TAUTOMER_HASH去除全部立体的互变异构哈希CC1CC(C)[C]2[CH][C]3C[N]C[CH][C]3C(F)(F)F_2_0SGROUP_DATA全部 S 基团数据的规范化形式[]JSON 序列化TAUTOMER_HASH面向通用互变异构形态的 SMILES 式表示C[CH]1CCH[C]2[CH][C]3C[N]C[CH][C]3C(F)(F)F_2_0 \|o1:1,3\|每个层的具体取值可通过GetMolLayers得到见下文。注意CANONICAL_SMILES层实际输出的是带 CX 扩展的规范 SMILES含增强立体等扩展信息因此它本身也承载立体信息NO_STEREO_*系列层则专门用于忽略立体的判等场景。哈希方案HashScheme 枚举HashScheme决定在生成最终哈希时使用哪些层rdkit/Chem/RegistrationHash.py。它共提供三种方案ALL_LAYERS最严格的全层方案使用全部 7 个HashLayer是默认方案。立体异构体、互变异构体、S 基团数据均参与判等最适合化学结构严格相同的登记场景。STEREO_INSENSITIVE_LAYERS立体不敏感方案仅使用以下层rdkit/Chem/RegistrationHash.pyESCAPEFORMULANO_STEREO_SMILESNO_STEREO_TAUTOMER_HASHSGROUP_DATA该方案排除了所有立体敏感层CANONICAL_SMILES、TAUTOMER_HASH因此纯立体异构体含增强立体基团在此方案下哈希相同。仓库测试还专门验证STEREO_INSENSITIVE_LAYERS中每个层的取值都不含、/、\等 SMILES 立体标记rdkit/Chem/UnitTestRegistrationHash.py。TAUTOMER_INSENSITIVE_LAYERS互变异构不敏感方案仅使用以下层rdkit/Chem/RegistrationHash.pyESCAPEFORMULANO_STEREO_TAUTOMER_HASHSGROUP_DATATAUTOMER_HASH该方案包含互变异构哈希层TAUTOMER_HASH与NO_STEREO_TAUTOMER_HASH而不含CANONICAL_SMILES因此将互变异构体视为等价同时它仍区分立体信息保留了带立体的TAUTOMER_HASH。模块 docstring 的建议是Typically the ALL_LAYERS scheme is used, but some users may want the TAUTOMER_INSENSITIVE_LAYERS schemerdkit/Chem/RegistrationHash.py。核心 APIGetMolLayers 与 GetMolHashGetMolLayers生成各信息层函数签名rdkit/Chem/RegistrationHash.pydef GetMolLayers(original_molecule: Chem.rdchem.Mol, data_field_names: Optional[Iterable] None, escape: Optional[str] None, cxflagDEFAULT_CXFLAG, enable_tautomer_hash_v2False) - Dict[HashLayer, str]:参数语义参数默认值说明original_molecule—待计算哈希的分子RDKitMol对象data_field_namesNone实际回退为[Atrop]可选需要纳入哈希的 SGroup DAT 字段名序列escapeNone实际回退为空串可选携带任意附加信息的字段cxflagDEFAULT_CXFLAG控制 CXSMILES 中保留哪些扩展信息位掩码enable_tautomer_hash_v2False是否使用 v2 版互变异构哈希其中DEFAULT_CXFLAG定义为rdkit/Chem/RegistrationHash.pyDEFAULT_CXFLAG (Chem.CXSmilesFields.CX_ATOM_LABELS | Chem.CXSmilesFields.CX_ENHANCEDSTEREO | Chem.CXSmilesFields.CX_BOND_ATROPISOMER)即默认保留原子标签、增强立体和键轴手性atropisomer三类 CX 信息。底层 CX 位标志的完整集合定义于 Code/GraphMol/SmilesParse/SmilesWrite.h包括CX_ATOM_LABELS、CX_COORDS、CX_RADICALS、CX_ENHANCEDSTEREO、CX_SGROUPS、CX_BOND_ATROPISOMER等可通过Chem.CXSmilesFields在 Python 侧访问。内部处理流程rdkit/Chem/RegistrationHash.py依次为复制分子并调用_RemoveUnnecessaryHs去除非立体决定性的氢preserve_stereogenic_hsTrue保留立体中心氢与氢同位素见 rdkit/Chem/RegistrationHash.py_StripAtomMapLabels清除所有原子的molAtomMapNumber属性从而让带/不带原子映射号的同一分子得到相同哈希若cxflag中包含CX_ENHANCEDSTEREO则调用Chem.CanonicalizeEnhancedStereo(mol)将增强立体基团规范化为标准形式依次计算分子式rdMolHash.MolHash(mol, rdMolHash.HashFunction.MolFormula)、CXSMILES、立体互变异构哈希、规范化 S 基团数据以及无立体层组装并返回{HashLayer: str}字典。GetMolHash由层字典生成最终哈希函数签名与实现rdkit/Chem/RegistrationHash.pydef GetMolHash(all_layers, hash_scheme: HashScheme HashScheme.ALL_LAYERS) - str: h hashlib.sha1() for layer in hash_scheme.value: if layer in all_layers: h.update(all_layers[layer].encode()) return h.hexdigest()它按hash_scheme指定的层顺序将各层字符串依次喂给 SHA-1 摘要算法最终返回40 位十六进制的哈希串测试中对此有显式断言见 rdkit/Chem/UnitTestRegistrationHash.py。由于 SHA-1 对字节序列敏感层的顺序是哈希一致性的重要前提因此HashScheme以元组形式固定了层的排列次序。典型用法是将两步串联from rdkit import Chem from rdkit.Chem import RegistrationHash mol Chem.MolFromSmiles(C[CH]1CC(CCHCHO)CCHC1 |o1:1,11,o2:5,7|) layers RegistrationHash.GetMolLayers(mol) # 得到分层字典 h RegistrationHash.GetMolHash(layers) # 默认 ALL_LAYERS h_nostereo RegistrationHash.GetMolHash( layers, RegistrationHash.HashScheme.STEREO_INSENSITIVE_LAYERS) # 忽略立体底层实现rdMolHash 与 HashFunctionRegistrationHash是 Python 层的编排者真正的哈希计算由 C 模块rdMolHash承担。其头文件位于 Code/GraphMol/MolHash/MolHash.h内容来自 NextMove Software 的 molhashBSD 许可核心接口为 Code/GraphMol/MolHash/nmmolhash.hstd::string MolHash(RWMol *mol, HashFunction func, bool useCXSmiles false, unsigned cxFlagsToSkip 0);Python 包装Code/GraphMol/MolHash/Wrap/rdMolHash.cpp将其暴露为rdMolHash.MolHash(mol, func, useCxSmilesFalse, cxFlagsToSkip0)。HashFunction枚举共有 19 个成员Code/GraphMol/MolHash/nmmolhash.hRegistrationHash用到其中三个CanonicalSmiles规范 SMILESMolFormula按 Hill 顺序有机分子为 C、H 后按字母序输出分子式并附加净电荷后缀见 Code/GraphMol/MolHash/hashfunctions.cppHetAtomTautomer/HetAtomTautomerv2互变异构哈希。v1TautomerHash将参与互变异构的键统一为单键、清除芳香性并统计杂原子 H 数与电荷输出形如..._hcount_charge的后缀Code/GraphMol/MolHash/hashfunctions.cppv2TautomerHashv2则先识别共轭互变异构体系候选原子、起始键、共轭体系扩展等再把体系内键改为芳香键输出时显式列出所有原子与键allBondsExplicit/allHsExplicit见 Code/GraphMol/MolHash/hashfunctions.cpp。v2 哈希的一个显著区别体现在测试用例中对于正庚烷CCCCCCCv1 的互变异构哈希为CCCCCCC_0_0而 v2 为[CH3]-[CH2]-[CH2]-[CH2]-[CH2]-[CH2]-[CH3]_0_0见 rdkit/Chem/UnitTestRegistrationHash.py。另外头文件还定义了excludeFromTautomerismProp属性带该属性的原子/键在HetAtomTautomerv2/HetAtomProtomerv2中不会参与互变异构Code/GraphMol/MolHash/nmmolhash.h。实战从测试用例看各层输出与判等行为仓库的单元测试 rdkit/Chem/UnitTestRegistrationHash.py 聚焦SMILES 不同但化学上相同的分子是最佳的实战参考。以下提炼几类关键行为1. 端到端分层示例对包含增强立体基团的手性稠环分子GetMolLayers的完整输出如下rdkit/Chem/UnitTestRegistrationHash.py{ HashLayer.CANONICAL_SMILES: C[CH]1CCHc2cc3c(C(F)(F)F)cc(O)nc3cc2N1 |o1:1,3|, HashLayer.ESCAPE: , HashLayer.FORMULA: C15H15F3N2O, HashLayer.NO_STEREO_SMILES: CC1CC(C)c2cc3c(C(F)(F)F)cc(O)nc3cc2N1, HashLayer.NO_STEREO_TAUTOMER_HASH: CC1CC(C)[C]2[CH][C]3C[N]C[CH][C]3C(F)(F)F_2_0, HashLayer.SGROUP_DATA: [], HashLayer.TAUTOMER_HASH: C[CH]1CCH[C]2[CH][C]3C[N]C[CH][C]3C(F)(F)F_2_0 |o1:1,3|, }可以直观看到FORMULA是分子式TAUTOMER_HASH相比CANONICAL_SMILES多了互变异构后缀_2_0表示杂原子 H 数与净电荷并保留了 CX 立体扩展NO_STEREO_*两层完全不含立体标记。2. 三种方案在判等上的差异测试test_hash_schemesrdkit/Chem/UnitTestRegistrationHash.py系统验证了三种方案的判等行为待比较对象ALL_LAYERSSTEREO_INSENSITIVETAUTOMER_INSENSITIVE同一分子不同写法相等相等相等立体异构体不相等相等不相等互变异构体嘌呤类不相等不相等相等带/不带 S 基团\|Sg:n:5,3,4::ht\|不相等不相等不相等最后一行说明无论采用哪种方案可规范化的 S 基团数据都会参与判等。3. 原子映射号被剥离测试test_atom_map_numbersrdkit/Chem/UnitTestRegistrationHash.py验证Oc1cc([*:1])ccn1与Oc1cc([*])ccn1的CANONICAL_SMILES层相同——这正是_StripAtomMapLabels的效果。4. 互变异构体在 TAUTOMER_INSENSITIVE 方案下判等测试test_tautomer_v2_hashrdkit/Chem/UnitTestRegistrationHash.py展示了烯醇CCCO与酮CCCO默认v1方案下两者的TAUTOMER_HASH、NO_STEREO_TAUTOMER_HASH均不相等使用enable_tautomer_hash_v2True后两者的互变异构哈希层相等且TAUTOMER_INSENSITIVE_LAYERS方案下最终哈希相等。这提示v1 与 v2 的互变异构识别范围存在差异v2 识别更广的互变异构体系选择哪一版取决于业务对互变异构等价边界的定义。5. 同位素与伪原子标签碳同位素被区分c1ccccc1与[13c]1ccccc1的所有层都不同rdkit/Chem/UnitTestRegistrationHash.py氢同位素被保留[2H]c1ccccc1的各层均保留[2H]标记rdkit/Chem/UnitTestRegistrationHash.py因为_RemoveUnnecessaryHs专门保留氢同位素伪原子标签参与判等Pol、Mod、C三种标签产生三个互不相同的哈希而同一标签如两个Pol分子哈希相同rdkit/Chem/UnitTestRegistrationHash.py。6. S 基团数据DAT/SRU/COP 的规范化SGROUP_DATA层由_CanonicalizeSGroups生成rdkit/Chem/RegistrationHash.py处理三类 S 基团DAT 数据基团仅当FIELDNAME出现在data_field_names中时才纳入哈希默认只认Atrop。测试test_sgroup_data_hashes演示了把STEREOLABEL/stereolabel数据字段纳入后R/S 值不同的分子哈希随之不同rdkit/Chem/UnitTestRegistrationHash.pySRU 重复单元基团规范化CONNECT、LABEL、index、PARENT、XBHEAD、XBCORR等属性并保证 XBHEAD/XBCORR 中键的书写顺序不影响哈希rdkit/Chem/UnitTestRegistrationHash.pyCOP 共聚物基团刻意不包含LABEL 属性——因为 Marvin 会写而 Biovia Draw 不写忽略它才能保证跨工具的判等一致rdkit/Chem/RegistrationHash.py。此外SGROUP_DATA的原子/键引用统一转换为规范原子排序_GetCanonicalAtomRanksAndBonds默认按规范 SMILES 原子顺序见 rdkit/Chem/RegistrationHash.py使同一基团的书写顺序差异不影响结果当存在多个 S 基团时还会排序并重编号index/PARENT。7. 增强立体基团规范化与键轴手性增强立体基团AND/OR/ABSOLUTE 类型在CanonicalizeEnhancedStereo处理后得到统一表示测试test_enhanced_stereo_canonicalizer验证了多组 SMILES 写法映射到同一条规范 CXSMILESrdkit/Chem/UnitTestRegistrationHash.py同时ENHANCED_STEREO_GROUP_WEIGHTSAND1000、OR2000、ABSOLUTE3000见 rdkit/Chem/RegistrationHash.py在EnhancedStereoUpdateMode中被用于权衡轴手性atropisomerDEFAULT_CXFLAG含CX_BOND_ATROPISOMER测试testAtropisomer显示一对轴手性异构体的CANONICAL_SMILES与TAUTOMER_HASH主体相同、但 CX 扩展分别为|wD:10.9|与|wD:10.20|从而哈希不同rdkit/Chem/UnitTestRegistrationHash.py。边界情况与历史演进模块在演进中处理了大量边界情况这些在测试与发布说明中均有记录可作为使用时的注意事项空分子GetMolLayers(Chem.Mol())不抛异常空分子的互变异构哈希固定为_0_0EMPTY_MOL_TAUTOMER_HASH见 rdkit/Chem/RegistrationHash.py 与 rdkit/Chem/UnitTestRegistrationHash.py显式氢与隐式氢等价CCHC(O)O与[H]C(N)C(O)O的各层完全一致rdkit/Chem/UnitTestRegistrationHash.py坏的键方向bond direction重复施加楔形键方向不应导致异常rdkit/Chem/UnitTestRegistrationHash.py立体不明双键视为无立体带STEREOANY/EITHERDOUBLE的双键与STEREONONE等价rdkit/Chem/UnitTestRegistrationHash.py历史修复记录发布说明中记载了RegistrationHash 不能区分轴手性异构体ReleaseNotes.md、v2 互变异构哈希未过滤 CX 扩展ReleaseNotes.md、对坏键方向的分子抛异常ReleaseNotes.md、支持 Pol/Mod 伪原子ReleaseNotes.md、对不同输入产生不同哈希ReleaseNotes.md等问题的修复说明该模块仍在持续打磨跨版本升级时建议回归测试哈希一致性。典型应用场景与工程建议综合模块设计、源码与测试rdkit.Chem.RegistrationHash的典型落地场景包括化合物登记系统registration system对入库分子计算ALL_LAYERS哈希作为唯一键重复提交时直接命中已有记录化合物库去重/归并按业务需要选择方案——需要区分立体异构体用ALL_LAYERS只关心骨架与官能团可用STEREO_INSENSITIVE_LAYERS需要合并互变异构体如嘌呤/嘧啶类互变用TAUTOMER_INSENSITIVE_LAYERS或enable_tautomer_hash_v2True跨工具数据的归一化通过SGROUP_DATA层规范化聚合物与数据基团兼容 Marvin、Biovia Draw 等工具书写差异附加业务字段利用ESCAPE层携带注册号、批次号等业务信息使最终哈希同时绑定化学结构与业务上下文。工程建议缓存分层结果GetMolLayers相对昂贵涉及去除氢、立体规范化、互变异构哈希等而GetMolHash只是 SHA-1 运算对同一分子做多种方案的哈希时应只调用一次GetMolLayers再对多个HashScheme分别调用GetMolHash固定参数cxflag、data_field_names、enable_tautomer_hash_v2会影响哈希结果同一注册库内必须全局统一否则会产生假阴性同一分子不同哈希关注版本演进v2 互变异构哈希、增强立体规范化等行为在不同 RDKit 版本间存在差异见 ReleaseNotes.md升级前应对照测试 rdkit/Chem/UnitTestRegistrationHash.py 回归验证。参考链接模块源码rdkit/Chem/RegistrationHash.py单元测试rdkit/Chem/UnitTestRegistrationHash.pyC 底层接口Code/GraphMol/MolHash/nmmolhash.h、Code/GraphMol/MolHash/MolHash.hC 哈希实现Code/GraphMol/MolHash/hashfunctions.cppPython 包装Code/GraphMol/MolHash/Wrap/rdMolHash.cppCX 位标志定义Code/GraphMol/SmilesParse/SmilesWrite.h发布说明ReleaseNotes.md赞分享科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相关推荐AutoResearchClaw 化学域技能实战基于 RDKit 的分子分析、指纹与子结构搜索最佳实践AutoResearchClaw 化学域技能实战基于 RDKit 的分子分析、指纹与子结构搜索最佳实践 导读 本文以 AutoResearchClaw 内置的人工智能大模型AI Agent自主智能体深度研究科研MCP 服务后端RDKit 分子分解利器rdkit.Chem.Recap 模块详解与实战RDKit 分子分解利器rdkit.Chem.Recap 模块详解与实战 本文围绕 RDKit 开源化学信息学库中的 rdkit.Chem.Recap 模块展科学计算科研机器学习RDKit FragmentCatalog 模块实战构建分子片段目录并生成层次化分子指纹RDKit FragmentCatalog 模块实战构建分子片段目录并生成层次化分子指纹 rdkit.Chem.FragmentCatalog 是 RDKit科学计算科研机器学习上一篇Citra模拟器终极指南在PC上完美运行任天堂3DS游戏下一篇XPipe 15.7.1 版本更新详解Tailscale SSH 接入、动态图标源与原生包管理器仓库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑