资讯动态

RDKit rdkit.Chem.MolCatalog:构建、序列化与层级化分子目录

发布时间:2026/10/14 17:43:33 来源:尧图企业网站定制
科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载本文基于 RDKit 官方文档页Docs/Book/source/rdkit.Chem.MolCatalog.rst该页通过 Sphinxautomodule指令展开rdkit.Chem.MolCatalog模块的全部成员撰写。RDKit 中绝大多数数据都以扁平的分子列表形式组织而MolCatalog模块提供了一类更结构化的容器把分子条目entry放进一张带方向的层级图中用边表达父—子关系例如母体分子与其片段、取代基的从属关系并支持整体二进制序列化与 Pythonpickle互转。读完后你可以掌握如何创建目录、录入分子条目、建立层级边、按索引查询上下级关系以及如何把目录持久化为字节串再无损重建。一、模块定位与组成rdkit/Chem/MolCatalog.py的全部实现只有三行它把 C 扩展模块rdMolCatalog的所有符号重导出# Copyright (C) 2006 Greg Landrum # from rdkit.Chem.rdMolCatalog import *也就是说rdkit.Chem.MolCatalog文档页所展开的成员实际由 Boost.Python 包装层 Code/GraphMol/MolCatalog/Wrap/rdMolCatalog.cpp 暴露对应 C 核心位于 Code/GraphMol/MolCatalog/ 目录。模块对外提供三类对象名称类型作用CreateMolCatalog()模块级函数创建一个空的MolCatalog包装层内部以默认MolCatalogParams构造MolCatalog类目录主体管理条目集合与层级边可从 pickle 字节串构造MolCatalogEntry类目录条目持有ROMol分子、描述文本、order编号及序列化状态二、MolCatalogEntry目录条目MolCatalogEntry是目录的最小单元。C 侧定义为 MolCatalogEntry它继承自通用目录条目基类RDCatalog::CatalogEntry内部保存四个成员分子指针dp_mol、属性字典dp_props、层级编号d_order与描述字符串d_descrip。Python 暴露的接口见 rdMolCatalog.cpp 第 119-142 行MolCatalogEntry()创建空条目MolCatalogEntry(pickle)从序列化字节串构造SetMol(mol)/GetMol()存取条目持有的ROMol。注意 Python 层的SetMol会先复制分子new ROMol(*mol)见 包装代码第 70-73 行因此传入的分子后续被销毁也不影响条目C 侧setMol(const ROMol*)则按约定直接接管指针所有权SetDescription(val)/GetDescription()设置/获取条目的文本描述通常是分子名或 SMILES 等标注SetOrder(order)/GetOrder()设置/获取条目的 order 值见后文层级组织Serialize()返回条目的二进制序列化bytes。条目序列化由 MolCatalogEntry.cpp 第 61-75 行 实现先调用MolPickler::pickleMol写出分子再依次写入bitId、order与描述串长度前缀 字符内容。还原时initFromStream按相同顺序读回因此单条条目也可以独立保存。三、MolCatalog条目集合与层级图MolCatalog的 Python 接口见 rdMolCatalog.cpp 第 91-118 行MolCatalog(pickle)从序列化字节串重建目录构造参数即 pickleAddEntry(entry)加入一个条目返回分配给它的无符号编号entry id / index。包装层会先把条目深拷贝一份再交给 C 目录避免 Python 对象生命周期问题AddEdge(id1, id2)在条目id1与id2之间建立一条有向边id1在上、id2在下即声明层级从属关系GetNumEntries()当前条目总数GetFPLength()指纹位长即已分配 bitId 的条目数对普通目录恒等于条目数GetEntryDescription(idx)/GetBitDescription(idx)按条目索引 / 按 bitId 取描述文本GetEntryBitId(idx)由条目索引换取其 bitIdGetBitEntryId(idx)由 bitId 换取条目索引GetEntryDownIds(idx)返回条目idx的直接下级条目索引列表注意是相邻节点不是递归后代Serialize()返回整个目录的二进制序列化bytes。超出索引范围时包装层会转换为 Python 的IndexErrorthrow_index_error。bitId 与 index 的语义差别通用基类 Catalog.h 第 113-133 行 的注释明确解释了二者的区别index指向目录底层结构第 N 个加入的节点bitId指向用户真正关心的位编号。若目录中混入了用户不关心的辅助条目例如搜索优化用的低阶片段两者会错位在 Python 常用路径下二者数值一致所以示例中很少显式区分。一个完整的使用示例下面的流程整合自官方 C 测试 test1.cpp 与 Python 测试 Wrap/rough_test.py演示母体—片段两级目录的搭建import pickle from rdkit import Chem from rdkit.Chem import MolCatalog cat MolCatalog.CreateMolCatalog() # 顶层条目母体分子 top MolCatalog.MolCatalogEntry() top.SetMol(Chem.MolFromSmiles(c1ccc(O)cc1C(O)O)) # aspirin top.SetDescription(top) top.SetOrder(0) cat.AddEntry(top) # 返回 0 # 两个下级条目片段 for smi, desc in ((O, child1), (C(O)O, child2)): e MolCatalog.MolCatalogEntry() e.SetMol(Chem.MolFromSmiles(smi)) e.SetDescription(desc) e.SetOrder(1) cat.AddEntry(e) cat.AddEdge(0, 1) # top - child1 cat.AddEdge(0, 2) # top - child2 print(cat.GetNumEntries()) # 3 print(cat.GetFPLength()) # 3 print(cat.GetEntryDownIds(0)) # [1, 2] print(cat.GetEntryDownIds(1)) # []AddEntry的返回值即条目索引rough_test.py中依次添加三个条目后断言返回值为0、1、2随后用AddEdge建立边、用GetNumEntries()校验计数均可直接对照运行。四、序列化Serialize()、字节构造与 pickleMolCatalog与MolCatalogEntry都提供Serialize()且都支持 Pythonpickledef_pickle注册的序列化套件直接调用Serialize()见 rdMolCatalog.cpp 第 14-30 行。rough_test.py覆盖了三条等价路径# 1) 整目录 pickle 往返 d pickle.dumps(cat) cat2 pickle.loads(d) assert cat2.GetNumEntries() 3 # 2) 二进制字节串往返 pkl cat.Serialize() # bytes cat3 MolCatalog.MolCatalog(pkl) assert cat3.GetNumEntries() 3 # 3) 单条目字节串往返 epkl entry.Serialize() entry2 MolCatalog.MolCatalogEntry(epkl) assert entry2.GetDescription() cyclobutane目录的字节格式由 Catalog.h 第 179-221 行 的toStream决定顺序为头部标识endianId常量0xDEADBEEF与版本号1.0.0versionMajor/Minor/PatchfpLength与条目总数MolCatalogParams的序列化内容全部条目每个条目内部格式即第二节所述分子 pickle bitId order 描述邻接表对每个条目依次写出其下级条目个数与各下级 index。读回时initFromStream按同一顺序恢复参数、条目与边因此层级结构在往返后完整保留test1.cpp在重建后断言getDownEntryList(0).size() 2等。需要注意当前读取端对头部四个整数只做跳过处理源码注释标注 FIX: at the moment we ignore the header info因此该格式没有做严格的大小端/版本兼容校验跨字节序环境交换 pickle 字节串时应保持同一构建约定。五、C 底层HierarchCatalog 与 BGL 图MolCatalog本身没有独立实现它是一个类型别名MolCatalog.h 第 15-17 行//! a hierarchical catalog for holding molecules typedef RDCatalog::HierarchCatalogMolCatalogEntry, MolCatalogParams, int MolCatalog;真正的容器逻辑在模板类RDCatalog::HierarchCatalogCode/Catalogs/Catalog.h中它对entryType/paramType/orderType三个模板参数全开放MolCatalog 只是其中orderType int的一种特化。从源码结构看其关键机制包括BGL 有向图存储条目挂在boost::adjacency_listvecS, vecS, bidirectionalS的顶点属性上Catalog.h 第 147-153 行AddEdge对应的addEdge在添加前会检查边是否已存在以避免重边第 338-353 行GetEntryDownIds对应的getDownEntryList遍历adjacent_vertices因此只返回直接下级order 索引维护addEntry时把新顶点按entry-getOrder()记入d_orderMapstd::maporderType, INT_VECT第 306-326 行C 侧可用getEntriesOfOrder(ord)一次性取出某阶全部条目。test1.cpp中 order 0 的母体与 order 1 的两个片段分别落入不同桶bitId 分配addEntry(entry, updateFPLengthtrue)会把当前fpLength作为新条目的bitId并把fpLength加一第 308-313 行这正是GetFPLength与GetEntryBitId语义的来源参数对象MolCatalogParams继承RDCatalog::CatalogParams但当前实现中toStream/initFromStream均为 no-opMolCatalogParams.cpp 第 18-34 行Serialize()返回空串——test1.cpp第 28-31 行即以此断言MolCatalogParams are currently unused, so testing is easy。可以推断参数类是为未来扩展预留的占位当前版本没有可配置项析构~HierarchCatalog会遍历图顶点并逐个delete条目指针第 446-453 行条目内部则释放分子与属性字典MolCatalogEntry.cpp 第 44-53 行。C 侧完整用例可直接参考 Code/GraphMol/MolCatalog/test1.cpp创建MolCatalogParams→ 新建MolCatalog→ 添加三个条目母体 两个片段→addEdge建立层级 →Serialize后删除原对象 → 从字节串重建并逐项断言getFPLength、getEntriesOfOrder、getDownEntryList与分子原子数。六、使用边界与注意事项GetEntryDownIds只返回直接下级需要递归后代时应自行按返回索引做 BFS/DFSPythonAddEntry/SetMol均会复制对象条目深拷贝、分子new ROMol(*mol)传入后的源对象可自由销毁代价是额外拷贝开销索引语义AddEntry返回值、GetEntryDescription等以条目索引为参数GetBitEntryId/GetBitDescription以 bitId 为参数。当前常规用法下二者数值相同但 API 上应区分MolCatalogParams目前无实际参数目录创建没有可配置项文档映射关系官方文档中Docs/Book/source/rdkit.Chem.MolCatalog.rst与 Docs/Book/source/rdkit.Chem.rdMolCatalog.rst 是同一组 API 的两个文档入口前者是后者的纯 Python 重导出层检索时两页内容等价测试入口Python 行为可用 Code/GraphMol/MolCatalog/Wrap/rough_test.py 的 unittest 验证python rough_test.pyC 行为以test1.cpp为准构建注册见 Code/GraphMol/MolCatalog/CMakeLists.txt 及 Code/GraphMol/MolCatalog/Wrap/CMakeLists.txt。综合来看rdkit.Chem.MolCatalog是一个轻量但完整的带层级关系的分子容器Python 层负责对象生命周期与 pickle 协议C 层的HierarchCatalog用 BGL 有向图 order 桶维护层级结构序列化格式自带头部标识与邻接表。适合在需要把母体分子—片段/取代基等从属关系连同分子本体一起持久化、并在会话间无损恢复的场景中使用。赞分享科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相关推荐RDKit FragmentCatalog 模块实战构建分子片段目录并生成层次化分子指纹RDKit FragmentCatalog 模块实战构建分子片段目录并生成层次化分子指纹 rdkit.Chem.FragmentCatalog 是 RDKit科学计算科研机器学习如何在 JetBrains IDE 装好 Continue新手友好的 AI 编程助手配置指南如何在 JetBrains IDE 装好 Continue新手友好的 AI 编程助手配置指南 如果你常用 IntelliJ IDEA 这类 JetBrains人工智能AI Agent代码智能体开发工具工具调用RAGLeetCode 297 二叉树序列化与反序列化DFS 前序与 BFS 层序双解法实战LeetCode 297 二叉树序列化与反序列化DFS 前序与 BFS 层序双解法实战 本文围绕 LeetCode 297「Serialize and Des示例工程教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价 →
↑