據(jù)庫指紋構(gòu)建、分層預(yù)篩與反序列化機制)
科學(xué)計算科研機器學(xué)習(xí)【免費下載鏈接】rdkitThe official sources for the RDKit library項目地址https://gitcode.com/gh_mirrors/rd/rdkit點擊查看免費下載rdkit.Chem.MolDb.FingerprintUtils是 RDKit 分子數(shù)據(jù)庫MolDb工具鏈中的指紋構(gòu)建中樞模塊官方 API 文檔頁見 Docs/Book/source/rdkit.Chem.MolDb.FingerprintUtils.rst該頁通過automodule指令直接展開 rdkit/Chem/MolDb/FingerprintUtils.py 的源碼文檔。本文以該模塊為核心完整講解其提供的七種指紋構(gòu)建函數(shù)、LayeredOptions分層指紋預(yù)篩機制與DepickleFP反序列化邏輯并結(jié)合 Projects/DbCLI/CreateDb.py 與 Projects/DbCLI/SearchDb.py 兩個 CLI 腳本還原“建庫 → 檢索 → 輸出”的完整工作流幫助讀者掌握 RDKit 相似度數(shù)據(jù)庫的底層實現(xiàn)細節(jié)。需要特別留意該模塊已被標記為棄用。rdkit/Chem/MolDb/init.py 在導(dǎo)入時即發(fā)出DeprecationWarning提示 the rdkit.Chem.MolDb module is deprecated兩個 CLI 入口 Projects/DbCLI/CreateDb.py 與 Projects/DbCLI/SearchDb.py 同樣帶有棄用警告。理解其內(nèi)部機制對維護既有數(shù)據(jù)庫工具鏈仍然重要但新項目應(yīng)優(yōu)先考慮rdkit.Chem.Fingerprints等現(xiàn)代接口。similarityMethods指紋類型與數(shù)據(jù)結(jié)構(gòu)類的映射表模塊頂部定義了一張核心映射表 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中對應(yīng)的 C 封裝指紋類是整個模塊的“類型契約”它同時服務(wù)于兩個方向?qū)懭敕较駽reateDb用BuildXxxFP函數(shù)生成指紋后調(diào)用 C 層的ToBinary()序列化成二進制文本存入 SQLite 的blob列讀取方向DepickleFP見后文根據(jù)列中數(shù)據(jù)所屬的指紋類型查表取出正確的類進行反序列化。各類型與其數(shù)據(jù)結(jié)構(gòu)的對應(yīng)關(guān)系可以總結(jié)為指紋類型數(shù)據(jù)結(jié)構(gòu)類特性默認相似度度量SearchDb 中RDKExplicitBitVect定長位向量2048 位FingerprintSimilarityTanimotoAtomPairsIntSparseIntVect32 位整型稀疏計數(shù)向量DiceSimilarityTopologicalTorsionsLongSparseIntVect64 位整型稀疏計數(shù)向量DiceSimilarityPharm2DSparseBitVect稀疏位向量DiceSimilarityGobbi2DSparseBitVect稀疏位向量TanimotoSimilarityMorganUIntSparseIntVect無符號整型稀疏計數(shù)向量DiceSimilarityAvalonExplicitBitVect定長位向量—SearchDb 未實現(xiàn) Avalon 分支見后文supportedSimilarityMethods正是由該映射表的鍵推導(dǎo)而來Projects/DbCLI/SearchDb.py 的--similarityType命令行參數(shù)的choices就取自它因此用戶可選值被嚴格限定為上表所列名稱。各指紋構(gòu)建函數(shù)逐一解析BuildRDKitFP經(jīng)典 ECFP 風(fēng)格拓撲指紋def BuildRDKitFP(mol): return Chem.RDKFingerprint(mol, nBitsPerHash1)見 FingerprintUtils.py#L85-L86。這里nBitsPerHash1意味著每個 hash 槽只映射 1 個比特即采用“無碰撞計數(shù)降級為 0/1”的設(shè)定得到的指紋語義上等價于只保留命中與否的 ECFP 風(fēng)格指紋。在 Projects/DbCLI/CreateDb.py#L350-L354 中該函數(shù)生成的指紋經(jīng)ToBinary()后寫入rdkitfps表的rdkfp列。BuildAtomPairFP / BuildTorsionsFP基于距離計數(shù)的指紋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。值得注意的是兩個函數(shù)都手動預(yù)置了fp._sumCache fp.GetTotalVal()——這是稀疏整型向量在計算 Dice 相似度時需要用到的分量兩個向量的值之和。預(yù)計算并緩存這個值可以省去后續(xù)每次比較時的重復(fù)求和屬于典型的性能優(yōu)化。兩類指紋在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。該函數(shù)構(gòu)建 Pharm2D 藥效團簽名工廠關(guān)鍵參數(shù)為fdefFile特征定義文件可為絕對路徑也可由命令行選項options.fdefFile提供缺失時拋出ValueError(bad fdef file)。SearchDb的--fdefFile參數(shù)默認指向RDDataDir/Novartis1.fdef見 SearchDb.py#L603-L605bins距離分箱邊界列表默認從 2 ? 到 100 ? 共 7 個區(qū)間。分箱決定特征對之間的距離如何被離散化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。此函數(shù)依賴模塊級全局變量sigFactory調(diào)用者必須先在外部把它賦好值。這一點在 CLI 中得到印證CreateDb在--doPharm2D分支中執(zhí)行FingerprintUtils.sigFactory BuildSigFactory(options)見 CreateDb.py#L364-L365SearchDb在 Pharm2D 分支執(zhí)行同樣的賦值見 SearchDb.py#L188而 Gobbi2D 分支則改為注入Gobbi_Pharm2D.factory見 SearchDb.py#L198從而復(fù)用同一個BuildPharm2DFP生成不同特征集下的指紋。IndexError分支會把導(dǎo)致失敗的分子以 SMILES 打印出來再原樣拋出便于定位壞結(jié)構(gòu)。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返回保留了環(huán)上原子出現(xiàn)的計數(shù)值而非單純 0/1因此同樣需要預(yù)置_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第二參數(shù)True表示輸入為 SMILES兩種途徑生成 Avalon 指紋。從源碼結(jié)構(gòu)看similarityMethods表中包含Avalon但 SearchDb.py 的RunSearch并未實現(xiàn)對應(yīng)的elif options.similarityType Avalon分支——即 CLI 層面實際可用的檢索類型是 RDK、AtomPairs、TopologicalTorsions、Pharm2D、Gobbi2D、Morgan 六種Avalon 僅作為庫函數(shù)可用。LayeredOptions分層指紋預(yù)篩的完整實現(xiàn)LayeredOptionsFingerprintUtils.py#L21-L53是本模塊最具工程價值的設(shè)計它把Chem.LayeredFingerprint分層拓撲指紋用作子結(jié)構(gòu)檢索前的數(shù)據(jù)庫級預(yù)篩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層數(shù)越少生成的比特越少、越保守——只要查詢分子含有子結(jié)構(gòu)的骨架路徑這些低層比特在庫分子上大概率同樣置位因此適合做“寧濫勿缺”的預(yù)篩minPath / maxPath 1 / 6參與指紋生成的路徑長度范圍fpSize 1024、wordSize 32指紋共 1024 位恰好拆成nWords 32個 32 位字。建庫側(cè)CreateDb.py#L265-L270 按nWords建出layeredfps表每行 32 個整型列Col_1Col_32每個分子用LayeredOptions.GetWords(mol)得到 32 個十進制整數(shù)逐列插入。GetWords的實現(xiàn)是把指紋轉(zhuǎn)成比特字符串后每 32 位切段再按二進制轉(zhuǎn) 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)]查詢側(cè)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語義是“查詢指紋中每個非零位所在的字庫分子對應(yīng)列必須按位包含全部這些位”位與運算。SearchDb.py#L316-L331 中若指紋數(shù)據(jù)庫里存在layeredfps表且非否定查詢就attach指紋庫并join該表把GetQueryText的結(jié)果追加進WHERE子句從而在數(shù)據(jù)庫層面先篩掉一批不可能匹配的分子隨后仍對剩余候選逐一執(zhí)行m.HasSubstructMatch(options.queryMol)精確驗證SearchDb.py#L344-L346。搜索完成時還會打印指紋預(yù)篩的淘汰率Fingerprint screenout rate: N of M (%.2f)SearchDb.py#L357-L360。這套“粗篩 精確驗證”的分級檢索是子結(jié)構(gòu)大規(guī)模數(shù)據(jù)庫查詢的標準做法。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()的產(chǎn)物。注意函數(shù)把非二進制輸入如舊版數(shù)據(jù)庫中直接存的 pickle 字節(jié)串統(tǒng)一轉(zhuǎn)成字符串處理優(yōu)先路徑查similarityMethods表得到類調(diào)用該類的字符串構(gòu)造函數(shù)直接重建指紋。以稀疏位向量為例C 端存在專門的文本構(gòu)造器SparseBitVect::SparseBitVect(const std::string s)內(nèi)部走initFromText解析見 Code/DataStructs/SparseBitVect.cpp#L29-L33ExplicitBitVect同樣提供ExplicitBitVect(const std::string pkl)構(gòu)造見 Code/DataStructs/ExplicitBitVect.h#L42。這類“二進制文本 → 指紋對象”的直接構(gòu)造比通用 pickle 反序列化更快、更安全回退路徑若構(gòu)造失敗如舊版庫里存的是標準 pickle 對象打印堆棧后改用pickle.loads恢復(fù)。在SearchDb中DepickleFP由poolFromCurs生成器逐行調(diào)用SearchDb.py#L399-L405把游標產(chǎn)出的(id, pkl)行流變成(id, fp)指紋流再交給GetNeighborLists做批量相似度計算。建庫與檢索的完整工作流建庫CreateDb 中的指紋列生產(chǎn)Projects/DbCLI/CreateDb.py 是數(shù)據(jù)庫生產(chǎn)端。默認表結(jié)構(gòu)為分子主庫Compounds.sqlt的molecules表--molDbName/--regName主鍵guid列與用戶自定義鍵列compound_id--molIdNameAtomPairs.sqlt的atompairs表atompairfp、torsionfp兩個 blob 列--noPairs默認開啟即默認跳過需顯式關(guān)閉才計算——參數(shù)寫法為store_false的--noPairsFingerprints.sqlt中rdkitfpsRDK 指紋、layeredfps32 個整數(shù)列、pharm2dfps、gobbi2dfps、morganfps--noMorganFps/--noCircularFps控制。逐行生產(chǎn)邏輯集中在 CreateDb.py#L343-L380每 500 行批量executemany插入并提交一次各 blob 列統(tǒng)一用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開關(guān)默認即為“跳過”--noExtras可一次性關(guān)閉全部附屬數(shù)據(jù)庫見 CreateDb.py#L181-L188。檢索SearchDb 的鄰居搜索Projects/DbCLI/SearchDb.py 是檢索端支持四類輸入查詢分子文件--molFormat smiles|sdf、--smilesQuery/--smartsQuery子結(jié)構(gòu)查詢、--propQuery屬性查詢且可組合先子結(jié)構(gòu)/屬性篩選縮小 id 集再在指紋庫中做 topN 鄰居搜索通過臨時表_tmpTbljoin 實現(xiàn)見 SearchDb.py#L379-L397。關(guān)鍵參數(shù)--similarityType默認RDK可選值來自supportedSimilarityMethods--similarityMetrictanimoto/dice/tversky附--tverskyA、--tverskyB默認 0.5/0.5不指定時按指紋類型取內(nèi)置默認見前文表格邏輯在 SearchDb.py#L160-L214--topN默認 20與--simThresh默認 -1二者互斥使用——simThresh 0時每個探針保留 topN 鄰居否則按閾值無限量收集SearchDb.py#L84-L87相似度計算優(yōu)先走批量接口BulkDiceSimilarity/BulkTanimotoSimilarity/BulkTverskySimilaritySearchDb.py#L94-L117非內(nèi)置度量則回退到逐對計算輸出CSV 風(fēng)格文本--outputDelim分隔--transpose轉(zhuǎn)置為“鄰居為行、探針為列”的矩陣、--sdfOut/--smilesOut導(dǎo)出命中分子。一個典型檢索命令python Projects/DbCLI/SearchDb.py \ --dbDir mydb --similarityType AtomPairs \ --similarityMetric dice --topN 10 \ probes.sdf小結(jié)FingerprintUtils雖然只有百余行 Python 代碼卻定義了 RDKit 指紋數(shù)據(jù)庫工具鏈的三組核心契約similarityMethods映射表指紋類型 ? 數(shù)據(jù)結(jié)構(gòu)類、各BuildXxxFP構(gòu)建函數(shù)含_sumCache預(yù)置與全局sigFactory注入兩個易錯點、以及LayeredOptionsDepickleFP支撐的“分層位列粗篩 精確子結(jié)構(gòu)驗證 文本二進制反序列化”檢索管線。Projects/DbCLI 下的 CreateDb/SearchDb 展示了這些契約在真實 SQLite 數(shù)據(jù)庫上的落地方式。由于整個MolDb子系統(tǒng)已發(fā)出棄用警告本文更適合作為理解 RDKit 指紋數(shù)據(jù)庫設(shè)計思想的參考對新系統(tǒng)而言可直接復(fù)用其中的思想——用rdkit.Chem.Fingerprints建指紋、用低層指紋做預(yù)篩、用 blob 存ToBinary()文本——而不必依賴這套遺留接口。贊分享科學(xué)計算科研機器學(xué)習(xí)【免費下載鏈接】rdkitThe official sources for the RDKit library項目地址https://gitcode.com/gh_mirrors/rd/rdkit點擊查看免費下載相關(guān)推薦RDKit rdkit.Chem.MolCatalog構(gòu)建、序列化與層級化分子目錄RDKit rdkit.Chem.MolCatalog構(gòu)建、序列化與層級化分子目錄 本文基于 RDKit 官方文檔頁 Docs/Book/source/rdk科學(xué)計算科研機器學(xué)習(xí)RDKit 分子指紋工具包 rdkit.Chem.Fingerprints 全解析批量指紋生成、相似性篩選與層次聚類RDKit 分子指紋工具包 rdkit.Chem.Fingerprints 全解析批量指紋生成、相似性篩選與層次聚類 本文以 RDKit 官方文檔 rdkit科學(xué)計算科研機器學(xué)習(xí)DiboSoftware/diboot序列化與反序列化機制深度解析DiboSoftware/diboot序列化與反序列化機制深度解析 引言為什么需要專業(yè)的序列化機制 在企業(yè)級應(yīng)用開發(fā)中數(shù)據(jù)序列化與反序列化是前后端通信、后端低代碼代碼生成開發(fā)工具創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考