资讯动态

RDKit FingerprintUtils 深度解析:分子数据库指纹构建、分层预筛与反序列化机制

发布时间:2026/10/13 12:22:30 来源:尧图企业网站定制
科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载rdkit.Chem.MolDb.FingerprintUtils是 RDKit 分子数据库MolDb工具链中的指纹构建中枢模块官方 API 文档页见 Docs/Book/source/rdkit.Chem.MolDb.FingerprintUtils.rst该页通过automodule指令直接展开 rdkit/Chem/MolDb/FingerprintUtils.py 的源码文档。本文以该模块为核心完整讲解其提供的七种指纹构建函数、LayeredOptions分层指纹预筛机制与DepickleFP反序列化逻辑并结合 Projects/DbCLI/CreateDb.py 与 Projects/DbCLI/SearchDb.py 两个 CLI 脚本还原“建库 → 检索 → 输出”的完整工作流帮助读者掌握 RDKit 相似度数据库的底层实现细节。需要特别留意该模块已被标记为弃用。rdkit/Chem/MolDb/init.py 在导入时即发出DeprecationWarning提示 the rdkit.Chem.MolDb module is deprecated两个 CLI 入口 Projects/DbCLI/CreateDb.py 与 Projects/DbCLI/SearchDb.py 同样带有弃用警告。理解其内部机制对维护既有数据库工具链仍然重要但新项目应优先考虑rdkit.Chem.Fingerprints等现代接口。similarityMethods指纹类型与数据结构类的映射表模块顶部定义了一张核心映射表 FingerprintUtils.py#L9-L17similarityMethods { RDK: DataStructs.ExplicitBitVect, AtomPairs: DataStructs.IntSparseIntVect, TopologicalTorsions: DataStructs.LongSparseIntVect, Pharm2D: DataStructs.SparseBitVect, Gobbi2D: DataStructs.SparseBitVect, Morgan: DataStructs.UIntSparseIntVect, Avalon: DataStructs.ExplicitBitVect, } supportedSimilarityMethods list(iter(similarityMethods))这张表把七个“指纹类型名”映射到rdkit.DataStructs中对应的 C 封装指纹类是整个模块的“类型契约”它同时服务于两个方向写入方向CreateDb用BuildXxxFP函数生成指纹后调用 C 层的ToBinary()序列化成二进制文本存入 SQLite 的blob列读取方向DepickleFP见后文根据列中数据所属的指纹类型查表取出正确的类进行反序列化。各类型与其数据结构的对应关系可以总结为指纹类型数据结构类特性默认相似度度量SearchDb 中RDKExplicitBitVect定长位向量2048 位FingerprintSimilarityTanimotoAtomPairsIntSparseIntVect32 位整型稀疏计数向量DiceSimilarityTopologicalTorsionsLongSparseIntVect64 位整型稀疏计数向量DiceSimilarityPharm2DSparseBitVect稀疏位向量DiceSimilarityGobbi2DSparseBitVect稀疏位向量TanimotoSimilarityMorganUIntSparseIntVect无符号整型稀疏计数向量DiceSimilarityAvalonExplicitBitVect定长位向量—SearchDb 未实现 Avalon 分支见后文supportedSimilarityMethods正是由该映射表的键推导而来Projects/DbCLI/SearchDb.py 的--similarityType命令行参数的choices就取自它因此用户可选值被严格限定为上表所列名称。各指纹构建函数逐一解析BuildRDKitFP经典 ECFP 风格拓扑指纹def BuildRDKitFP(mol): return Chem.RDKFingerprint(mol, nBitsPerHash1)见 FingerprintUtils.py#L85-L86。这里nBitsPerHash1意味着每个 hash 槽只映射 1 个比特即采用“无碰撞计数降级为 0/1”的设定得到的指纹语义上等价于只保留命中与否的 ECFP 风格指纹。在 Projects/DbCLI/CreateDb.py#L350-L354 中该函数生成的指纹经ToBinary()后写入rdkitfps表的rdkfp列。BuildAtomPairFP / BuildTorsionsFP基于距离计数的指纹def BuildAtomPairFP(mol): from rdkit.Chem.AtomPairs import Pairs fp Pairs.GetAtomPairFingerprintAsIntVect(mol) fp._sumCache fp.GetTotalVal() return fp def BuildTorsionsFP(mol): from rdkit.Chem.AtomPairs import Torsions fp Torsions.GetTopologicalTorsionFingerprintAsIntVect(mol) fp._sumCache fp.GetTotalVal() return fp见 FingerprintUtils.py#L71-L82。值得注意的是两个函数都手动预置了fp._sumCache fp.GetTotalVal()——这是稀疏整型向量在计算 Dice 相似度时需要用到的分量两个向量的值之和。预计算并缓存这个值可以省去后续每次比较时的重复求和属于典型的性能优化。两类指纹在CreateDb中会一起写入同一个atompairs表的atompairfp与torsionfp两个 blob 列见 CreateDb.py#L237-L239。BuildPharm2DFP 与 BuildSigFactory药效团指纹及其分箱工厂def BuildSigFactory(optionsNone, fdefFileNone, bins[(2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 100)], skipFeats(LumpedHydrophobe, ZnBinder)): if options: fdefFile options.fdefFile if not fdefFile: raise ValueError(bad fdef file) from rdkit.Chem import ChemicalFeatures from rdkit.Chem.Pharm2D import SigFactory featFactory ChemicalFeatures.BuildFeatureFactory(fdefFile) sigFactory SigFactory.SigFactory(featFactory, skipFeatsskipFeats, trianglePruneBinsFalse) sigFactory.SetBins(bins) return sigFactory见 FingerprintUtils.py#L56-L68。该函数构建 Pharm2D 药效团签名工厂关键参数为fdefFile特征定义文件可为绝对路径也可由命令行选项options.fdefFile提供缺失时抛出ValueError(bad fdef file)。SearchDb的--fdefFile参数默认指向RDDataDir/Novartis1.fdef见 SearchDb.py#L603-L605bins距离分箱边界列表默认从 2 Å 到 100 Å 共 7 个区间。分箱决定特征对之间的距离如何被离散化SetBins的接口定义见 rdkit/Chem/Pharm2D/SigFactory.pyskipFeats默认跳过LumpedHydrophobe与ZnBinder两类特征。def BuildPharm2DFP(mol): global sigFactory from rdkit.Chem.Pharm2D import Generate try: fp Generate.Gen2DFingerprint(mol, sigFactory) except IndexError: print(FAIL:, Chem.MolToSmiles(mol, True)) raise return fp见 FingerprintUtils.py#L89-L97。此函数依赖模块级全局变量sigFactory调用者必须先在外部把它赋好值。这一点在 CLI 中得到印证CreateDb在--doPharm2D分支中执行FingerprintUtils.sigFactory BuildSigFactory(options)见 CreateDb.py#L364-L365SearchDb在 Pharm2D 分支执行同样的赋值见 SearchDb.py#L188而 Gobbi2D 分支则改为注入Gobbi_Pharm2D.factory见 SearchDb.py#L198从而复用同一个BuildPharm2DFP生成不同特征集下的指纹。IndexError分支会把导致失败的分子以 SMILES 打印出来再原样抛出便于定位坏结构。BuildMorganFP二阶圆形指纹def BuildMorganFP(mol): from rdkit.Chem import rdMolDescriptors fp rdMolDescriptors.GetMorganFingerprint(mol, 2) fp._sumCache fp.GetTotalVal() return fp见 FingerprintUtils.py#L100-L104。这里radius2的 Morgan 指纹以UIntSparseIntVect返回保留了环上原子出现的计数值而非单纯 0/1因此同样需要预置_sumCache并在检索时与DiceSimilarity搭配使用。BuildAvalonFP可选的 Avalon 指纹def BuildAvalonFP(mol, smilesNone): from rdkit.Avalon import pyAvalonTools if smiles is None: return pyAvalonTools.GetAvalonFP(mol) return pyAvalonTools.GetAvalonFP(smiles, True)见 FingerprintUtils.py#L107-L111。它支持从Mol对象或字符串 SMILES第二参数True表示输入为 SMILES两种途径生成 Avalon 指纹。从源码结构看similarityMethods表中包含Avalon但 SearchDb.py 的RunSearch并未实现对应的elif options.similarityType Avalon分支——即 CLI 层面实际可用的检索类型是 RDK、AtomPairs、TopologicalTorsions、Pharm2D、Gobbi2D、Morgan 六种Avalon 仅作为库函数可用。LayeredOptions分层指纹预筛的完整实现LayeredOptionsFingerprintUtils.py#L21-L53是本模块最具工程价值的设计它把Chem.LayeredFingerprint分层拓扑指纹用作子结构检索前的数据库级预筛class LayeredOptions: loadLayerFlags 0xFFFFFFFF searchLayerFlags 0x7 minPath 1 maxPath 6 fpSize 1024 wordSize 32 nWords fpSize // wordSize staticmethod def GetFingerprint(mol, queryTrue): if query: flags LayeredOptions.searchLayerFlags else: flags LayeredOptions.loadLayerFlags return Chem.LayeredFingerprint(mol, layerFlagsflags, minPathLayeredOptions.minPath, maxPathLayeredOptions.maxPath, fpSizeLayeredOptions.fpSize)各常量的含义loadLayerFlags 0xFFFFFFFF建库时为分子启用的全部指纹层保证信息完整searchLayerFlags 0x7查询时只取前 3 层二进制0b111层数越少生成的比特越少、越保守——只要查询分子含有子结构的骨架路径这些低层比特在库分子上大概率同样置位因此适合做“宁滥勿缺”的预筛minPath / maxPath 1 / 6参与指纹生成的路径长度范围fpSize 1024、wordSize 32指纹共 1024 位恰好拆成nWords 32个 32 位字。建库侧CreateDb.py#L265-L270 按nWords建出layeredfps表每行 32 个整型列Col_1Col_32每个分子用LayeredOptions.GetWords(mol)得到 32 个十进制整数逐列插入。GetWords的实现是把指纹转成比特字符串后每 32 位切段再按二进制转 intstaticmethod def GetWords(mol, queryTrue): txt LayeredOptions.GetFingerprint(mol, queryquery).ToBitString() return [int(txt[x:x 32], 2) for x in range(0, len(txt), 32)]查询侧GetQueryText 把查询分子指纹用searchLayerFlags生成的非零字拼接为一条 SQLite 谓词staticmethod def GetQueryText(mol, queryTrue): words LayeredOptions.GetWords(mol, queryquery) colqs [] for idx, word in enumerate(words): if not word: continue colqs.append(f{word}Col_{idx 1}{word}) return and .join(colqs)生成的 SQL 形如321Col_2321 and 15Col_915语义是“查询指纹中每个非零位所在的字库分子对应列必须按位包含全部这些位”位与运算。SearchDb.py#L316-L331 中若指纹数据库里存在layeredfps表且非否定查询就attach指纹库并join该表把GetQueryText的结果追加进WHERE子句从而在数据库层面先筛掉一批不可能匹配的分子随后仍对剩余候选逐一执行m.HasSubstructMatch(options.queryMol)精确验证SearchDb.py#L344-L346。搜索完成时还会打印指纹预筛的淘汰率Fingerprint screenout rate: N of M (%.2f)SearchDb.py#L357-L360。这套“粗筛 精确验证”的分级检索是子结构大规模数据库查询的标准做法。DepickleFP指纹反序列化与回退策略def DepickleFP(pkl, similarityMethod): if not isinstance(pkl, (bytes, str)): pkl str(pkl) try: klass similarityMethods[similarityMethod] fp klass(pkl) except Exception: import traceback traceback.print_exc() fp pickle.loads(pkl) return fp见 FingerprintUtils.py#L114-L124。其工作机制输入pkl是 SQLite blob 列中取出的二进制文本ToBinary()的产物。注意函数把非二进制输入如旧版数据库中直接存的 pickle 字节串统一转成字符串处理优先路径查similarityMethods表得到类调用该类的字符串构造函数直接重建指纹。以稀疏位向量为例C 端存在专门的文本构造器SparseBitVect::SparseBitVect(const std::string s)内部走initFromText解析见 Code/DataStructs/SparseBitVect.cpp#L29-L33ExplicitBitVect同样提供ExplicitBitVect(const std::string pkl)构造见 Code/DataStructs/ExplicitBitVect.h#L42。这类“二进制文本 → 指纹对象”的直接构造比通用 pickle 反序列化更快、更安全回退路径若构造失败如旧版库里存的是标准 pickle 对象打印堆栈后改用pickle.loads恢复。在SearchDb中DepickleFP由poolFromCurs生成器逐行调用SearchDb.py#L399-L405把游标产出的(id, pkl)行流变成(id, fp)指纹流再交给GetNeighborLists做批量相似度计算。建库与检索的完整工作流建库CreateDb 中的指纹列生产Projects/DbCLI/CreateDb.py 是数据库生产端。默认表结构为分子主库Compounds.sqlt的molecules表--molDbName/--regName主键guid列与用户自定义键列compound_id--molIdNameAtomPairs.sqlt的atompairs表atompairfp、torsionfp两个 blob 列--noPairs默认开启即默认跳过需显式关闭才计算——参数写法为store_false的--noPairsFingerprints.sqlt中rdkitfpsRDK 指纹、layeredfps32 个整数列、pharm2dfps、gobbi2dfps、morganfps--noMorganFps/--noCircularFps控制。逐行生产逻辑集中在 CreateDb.py#L343-L380每 500 行批量executemany插入并提交一次各 blob 列统一用DbModule.binaryHolder(fp.ToBinary())包裹存储。典型建库命令python Projects/DbCLI/CreateDb.py \ --outDir mydb --noPairs --noMorganFps \ --fdefFile $(python -c from rdkit import RDConfig; print(RDConfig.RDDataDir))/Novartis1.fdef \ doPharm2D.sdf注意各--noXxx开关默认即为“跳过”--noExtras可一次性关闭全部附属数据库见 CreateDb.py#L181-L188。检索SearchDb 的邻居搜索Projects/DbCLI/SearchDb.py 是检索端支持四类输入查询分子文件--molFormat smiles|sdf、--smilesQuery/--smartsQuery子结构查询、--propQuery属性查询且可组合先子结构/属性筛选缩小 id 集再在指纹库中做 topN 邻居搜索通过临时表_tmpTbljoin 实现见 SearchDb.py#L379-L397。关键参数--similarityType默认RDK可选值来自supportedSimilarityMethods--similarityMetrictanimoto/dice/tversky附--tverskyA、--tverskyB默认 0.5/0.5不指定时按指纹类型取内置默认见前文表格逻辑在 SearchDb.py#L160-L214--topN默认 20与--simThresh默认 -1二者互斥使用——simThresh 0时每个探针保留 topN 邻居否则按阈值无限量收集SearchDb.py#L84-L87相似度计算优先走批量接口BulkDiceSimilarity/BulkTanimotoSimilarity/BulkTverskySimilaritySearchDb.py#L94-L117非内置度量则回退到逐对计算输出CSV 风格文本--outputDelim分隔--transpose转置为“邻居为行、探针为列”的矩阵、--sdfOut/--smilesOut导出命中分子。一个典型检索命令python Projects/DbCLI/SearchDb.py \ --dbDir mydb --similarityType AtomPairs \ --similarityMetric dice --topN 10 \ probes.sdf小结FingerprintUtils虽然只有百余行 Python 代码却定义了 RDKit 指纹数据库工具链的三组核心契约similarityMethods映射表指纹类型 ↔ 数据结构类、各BuildXxxFP构建函数含_sumCache预置与全局sigFactory注入两个易错点、以及LayeredOptionsDepickleFP支撑的“分层位列粗筛 精确子结构验证 文本二进制反序列化”检索管线。Projects/DbCLI 下的 CreateDb/SearchDb 展示了这些契约在真实 SQLite 数据库上的落地方式。由于整个MolDb子系统已发出弃用警告本文更适合作为理解 RDKit 指纹数据库设计思想的参考对新系统而言可直接复用其中的思想——用rdkit.Chem.Fingerprints建指纹、用低层指纹做预筛、用 blob 存ToBinary()文本——而不必依赖这套遗留接口。赞分享科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相关推荐RDKit rdkit.Chem.MolCatalog构建、序列化与层级化分子目录RDKit rdkit.Chem.MolCatalog构建、序列化与层级化分子目录 本文基于 RDKit 官方文档页 Docs/Book/source/rdk科学计算科研机器学习RDKit 分子指纹工具包 rdkit.Chem.Fingerprints 全解析批量指纹生成、相似性筛选与层次聚类RDKit 分子指纹工具包 rdkit.Chem.Fingerprints 全解析批量指纹生成、相似性筛选与层次聚类 本文以 RDKit 官方文档 rdkit科学计算科研机器学习DiboSoftware/diboot序列化与反序列化机制深度解析DiboSoftware/diboot序列化与反序列化机制深度解析 引言为什么需要专业的序列化机制 在企业级应用开发中数据序列化与反序列化是前后端通信、后端低代码代码生成开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价 →
↑