點(diǎn)詳解:在虛擬化合物庫管線中輸出規(guī)范 SMILES)
科學(xué)計(jì)算科研機(jī)器學(xué)習(xí)【免費(fèi)下載鏈接】rdkitThe official sources for the RDKit library項(xiàng)目地址https://gitcode.com/gh_mirrors/rd/rdkit點(diǎn)擊查看免費(fèi)下載導(dǎo)讀rdkit.VLib.NodeLib.SmilesOutput是 RDKit 虛擬化合物庫Virtual Library簡(jiǎn)稱 VLib框架中的輸出節(jié)點(diǎn)負(fù)責(zé)把遍歷管線得到的分子對(duì)象序列化為規(guī)范的 SMILES 文本并寫入任意支持write()方法的文件對(duì)象。本文以該模塊的實(shí)現(xiàn)源碼rdkit/VLib/NodeLib/SmilesOutput.py與其 Sphinx 文檔頁Docs/Book/source/rdkit.VLib.NodeLib.SmilesOutput.rst為核心結(jié)合基類實(shí)現(xiàn)與倉庫內(nèi)單元測(cè)試講解OutputNode的構(gòu)造參數(shù)、輸出行格式邏輯、多父節(jié)點(diǎn) lockstep 協(xié)作方式并給出可直接運(yùn)行的示例與完整流水線組合方案。讀完本文你將能夠把任意 RDKit 分子迭代器SupplyNode、文件型 Supplier 等的輸出統(tǒng)一落盤為帶標(biāo)簽的 SMILES 表格。VLib 框架與輸出節(jié)點(diǎn)的定位RDKit 的rdkit.VLib包提供了一套節(jié)點(diǎn)圖node graph式的虛擬庫構(gòu)建框架每個(gè)分子處理步驟讀取、過濾、變換、去重、輸出都是一個(gè)節(jié)點(diǎn)節(jié)點(diǎn)之間通過AddParent/AddChild組成有向圖整個(gè)圖按lockstep齊步方式迭代——每個(gè)節(jié)點(diǎn)調(diào)用一次next()會(huì)依次驅(qū)動(dòng)其所有父節(jié)點(diǎn)各推進(jìn)一個(gè)元素。在這一框架中節(jié)點(diǎn)被劃分為四類角色對(duì)應(yīng)四個(gè)基礎(chǔ)類見 rdkit/VLib/init.py 與 Docs/Book/source/rdkit.VLib.rst 的模塊清單角色基類源碼職責(zé)供應(yīng)SupplyNoderdkit/VLib/Supply.py無父節(jié)點(diǎn)從內(nèi)存列表或文件供給分子過濾FilterNoderdkit/VLib/Filter.py按謂詞函數(shù)決定元素是否放行變換TransformNoderdkit/VLib/Transform.py對(duì)元素做任意映射轉(zhuǎn)換輸出OutputNoderdkit/VLib/Output.py把元素序列化為字符串并寫入destSmilesOutput.OutputNode就是輸出角色的 SMILES 專屬實(shí)現(xiàn)它繼承自rdkit.VLib.Output的OutputNode源碼中寫作BaseOutputNode后者再繼承自所有節(jié)點(diǎn)的公共基類VLibNoderdkit/VLib/Node.py。因此它天然擁有AddParent、GetParents、reset、Destroy等全套圖操作能力并遵循VLibNode定義的迭代協(xié)議__iter__先reset()再返回自身OutputNode.__next__ OutputNode.next見 rdkit/VLib/Output.py。構(gòu)造參數(shù)詳解OutputNode的構(gòu)造函數(shù)簽名rdkit/VLib/NodeLib/SmilesOutput.pydef __init__(self, destNone, delim\t, idFieldNone, **kwargs): BaseOutputNode.__init__(self, destdest, strFuncself.smilesOut) self._dest dest self._idField idField self._delim delim self._nDumped 0各參數(shù)含義與默認(rèn)值如下參數(shù)類型默認(rèn)值作用dest文件類對(duì)象必須支持write()None輸出目標(biāo)??梢允钦鎸?shí)文件句柄也可以是io.StringIO等內(nèi)存對(duì)象模塊 docstring 明確聲明了這一假設(shè)destination supports a write() methoddelimstr\t制表符行內(nèi)字段之間的分隔符。默認(rèn)輸出為標(biāo)簽 SMILES兩列接入多個(gè)父節(jié)點(diǎn)后可擴(kuò)展為多列idFieldstrNone分子屬性名。若分子帶有該屬性則用屬性值作為行首標(biāo)簽否則退化為內(nèi)部計(jì)數(shù)器生成的數(shù)字標(biāo)簽注意構(gòu)造函數(shù)把strFunc綁定為self.smilesOut后傳入基類——基類OutputNode在每次next()時(shí)調(diào)用該函數(shù)獲得字符串并dest.write()rdkit/VLib/Output.pySmilesOutput只需專注如何把分子變成一行文本。輸出行格式與smilesOut生成邏輯每次迭代觸發(fā)smilesOut(mol)rdkit/VLib/NodeLib/SmilesOutput.py其核心邏輯按以下順序執(zhí)行遞增計(jì)數(shù)self._nDumped 1計(jì)數(shù)器從 0 開始第一個(gè)輸出的分子編號(hào)為 1。解包多父輸入若mol是tuple/list多父節(jié)點(diǎn)齊步輸出的結(jié)果取第一個(gè)元素作為真正的分子其余元素作為附加字段存入args最終拼接到 SMILES 之后。決定行標(biāo)簽若idField非空且分子存在該屬性mol.HasProp(self._idField)取mol.GetProp(self._idField)作為標(biāo)簽否則用計(jì)數(shù)器str(self._nDumped)。生成規(guī)范 SMILESsmi Chem.MolToSmiles(mol)。注意這里輸出的是canonical SMILES輸入寫法會(huì)被重新排列——例如輸入NCC會(huì)輸出CCN。組裝并返回outp [label, smi] args用delim連接后追加換行符return %s\n % (self._delim.join(outp))。由此單父節(jié)點(diǎn)場(chǎng)景下每行固定為兩列l(wèi)abeldelimcanonical-smiles\n多父節(jié)點(diǎn)場(chǎng)景下每行擴(kuò)展為label smiles 其余父節(jié)點(diǎn)元素即附加父節(jié)點(diǎn)提供的值會(huì)被當(dāng)作額外列拼接。重置語義reset()在調(diào)用基類reset()它會(huì)遞歸重置所有父節(jié)點(diǎn)見 rdkit/VLib/Node.py之外額外把計(jì)數(shù)器歸零rdkit/VLib/NodeLib/SmilesOutput.py。這意味著每次重新迭代數(shù)字標(biāo)簽都會(huì)從 1 重新編號(hào)若要保證標(biāo)簽全局唯一應(yīng)改用idField指向穩(wěn)定的分子屬性。兩個(gè)可直接運(yùn)行的示例示例一單父節(jié)點(diǎn)模塊 docstring 自帶 doctest模塊 docstring 給出了完整的最小示例rdkit/VLib/NodeLib/SmilesOutput.py該示例同時(shí)是doctest用例被_runDoctests()直接執(zhí)行 smis [C1CCC1,C1CC1,CO,NCC] mols [Chem.MolFromSmiles(x) for x in smis] from rdkit.VLib.Supply import SupplyNode suppl SupplyNode(contentsmols) from io import StringIO sio StringIO() node OutputNode(destsio,delim, ) node.AddParent(suppl) ms [x for x in node] len(ms) 4 txt sio.getvalue() repr(txt) 1, C1CCC1\\n2, C1CC1\\n3, CO\\n4, CCN\\n觀察輸出可驗(yàn)證上述邏輯標(biāo)簽為計(jì)數(shù)器 14分隔符為, NCC被規(guī)范化為CCN每行以\n結(jié)尾。遍歷node返回的ms與輸入分子數(shù)量一致4 個(gè)說明輸出節(jié)點(diǎn)不消費(fèi)、不改變數(shù)據(jù)流只是旁路寫出——這正是輸出節(jié)點(diǎn)與過濾節(jié)點(diǎn)的本質(zhì)區(qū)別。示例二多父節(jié)點(diǎn)與idField倉庫單測(cè)rdkit/VLib/NodeLib/UnitTestNodeLib.py 中的test_SmilesOutput展示了多父節(jié)點(diǎn)用法smis [C1CCC1, C1CC1, CO, CCN] mols [Chem.MolFromSmiles(x) for x in smis] for i, mol in enumerate(mols, 100): mol.SetProp(ID, str(i)) suppl1 SupplyNode(contentsmols) suppl2 SupplyNode(contentsabcd) sio StringIO() node SmilesOutput.OutputNode(idFieldID, destsio, delim, ) node.AddParent(suppl1) node.AddParent(suppl2) list(node) self.assertEqual(sio.getvalue(), 100, C1CCC1, a\n101, C1CC1, b\n102, CO, c\n103, CCN, d\n)關(guān)鍵點(diǎn)多父齊步suppl2提供字符串a(chǎn)bcd與suppl1的分子一一對(duì)齊基類OutputNode.next()對(duì)每個(gè)父節(jié)點(diǎn)各取一個(gè)元素只有一個(gè)父節(jié)點(diǎn)時(shí)解包成單個(gè)值多個(gè)時(shí)組成tuplerdkit/VLib/Output.py。smilesOut因此收到(mol, a)形式的元組并把a(bǔ)作為附加列。idField生效四個(gè)分子都設(shè)置了ID屬性100103輸出行首標(biāo)簽即為屬性值而非計(jì)數(shù)器。輸出驗(yàn)證每行三列l(wèi)abel, smiles, extra與預(yù)期完全一致。該測(cè)試在load_tests中注冊(cè)了SmilesOutput模塊的 doctestrdkit/VLib/NodeLib/UnitTestNodeLib.py可隨倉庫測(cè)試套件一鍵運(yùn)行。組合到完整虛擬庫流水線倉庫中的 rdkit/VLib/NodeLib/demo.py 演示了SmilesOutput在真實(shí)管線末端的用法SupplyNode內(nèi)存分子→SmartsMolFilter過濾金屬→SmartsRemover去鹽→FilterNode原子數(shù) 1→DupeFilter規(guī)范 SMILES 去重→SmilesOutput.OutputNode# 7 個(gè)分子其中包含含金屬、含鹽等需要清理的條目 smis [CCOC, CCO.Cl, CC(O)[O-].[Na], CC[Cu]CC, OCC, CN(C)C.[Cl-], [Na].[Cl-]] mols [Chem.MolFromSmiles(x) for x in smis] for i in range(len(mols)): mols[i].SetProp(Name, Mol-%d % (i 1)) supplier Supply.SupplyNode(contentsmols) metals [#21,#22,...] # 過渡金屬/鑭系 SMARTS smaFilter SmartsMolFilter.SmartsFilter(patterns[metals], counts[1]) smaFilter.SetNegate(1) smaFilter.AddParent(supplier) salts [[Cl;H1X1,-], [Na], [O;H2,H1-,X0-2]] remover SmartsRemover.SmartsRemover(patternssalts) remover.AddParent(smaFilter) atsFilter Filter.FilterNode(funclambda x: x.GetNumAtoms() 1) atsFilter.AddParent(remover) dupeFilter SmilesDupeFilter.DupeFilter() dupeFilter.AddParent(atsFilter) io StringIO() output SmilesOutput.OutputNode(destio, delim, , idFieldName) output.AddParent(dupeFilter) list(output) print(io.getvalue())流水線逐級(jí)打印的統(tǒng)計(jì)為初始 7 → 過濾金屬后 6 → 去鹽且原子數(shù) 1 后 5 → 去重后 4。最終OutputNode以Name屬性為標(biāo)簽把去重后的 4 個(gè)分子以Name, canonical-smiles形式寫入io。這個(gè)例子說明輸出節(jié)點(diǎn)應(yīng)該放在管線的末端前面疊加任意數(shù)量的過濾與變換節(jié)點(diǎn)都不會(huì)影響它逐行寫出的職責(zé)因?yàn)?lockstep 迭代保證每個(gè)上游節(jié)點(diǎn)只推進(jìn)一個(gè)元素。適用場(chǎng)景與注意事項(xiàng)典型用途把虛擬庫篩選/枚舉的結(jié)果批量導(dǎo)出為帶 ID 的 SMILES 表格供下游建模、建庫或人工審閱使用dest指向真實(shí)文件時(shí)即得到可直接落盤的文本文件。dest必須支持write()模塊與基類 docstring 都將其列為前置假設(shè)。傳入不滿足該接口的對(duì)象會(huì)在首次next()時(shí)拋出AttributeError。標(biāo)簽唯一性不設(shè)idField時(shí)數(shù)字標(biāo)簽在每次reset()后重新從 1 編號(hào)需要跨輪次穩(wěn)定的行 ID請(qǐng)預(yù)先用mol.SetProp()寫入屬性。輸出為規(guī)范 SMILESChem.MolToSmiles會(huì)重排原子與片段順序因此輸出行不一定與輸入寫法一致如NCC→CCN這是刻意設(shè)計(jì)保證同構(gòu)分子輸出完全一致也便于與SmilesDupeFilter的去重邏輯同樣基于Chem.MolToSmiles見 rdkit/VLib/NodeLib/SmilesDupeFilter.py銜接。API 文檔定位本文所依據(jù)的 Sphinx 文檔頁 Docs/Book/source/rdkit.VLib.NodeLib.SmilesOutput.rst 通過automodule指令自動(dòng)渲染本模塊的全部成員與 docstring與其配套的 rdkit.VLib.NodeLib.rst、rdkit.VLib.Output.rst 分別涵蓋了同包其他節(jié)點(diǎn)與輸出基類的 API可交叉查閱。綜上SmilesOutput.OutputNode是 VLib 框架中最簡(jiǎn)潔也最常用的收尾節(jié)點(diǎn)構(gòu)造時(shí)指定目標(biāo)、分隔符與 ID 屬性AddParent掛到管線末端隨后遍歷節(jié)點(diǎn)即可把虛擬庫結(jié)果以規(guī)范 SMILES 表格的形式穩(wěn)定輸出。贊分享科學(xué)計(jì)算科研機(jī)器學(xué)習(xí)【免費(fèi)下載鏈接】rdkitThe official sources for the RDKit library項(xiàng)目地址https://gitcode.com/gh_mirrors/rd/rdkit點(diǎn)擊查看免費(fèi)下載相關(guān)推薦ImageGlass照片加載管道全解從文件解碼到渲染的完整鏈路剖析ImageGlass照片加載管道全解從文件解碼到渲染的完整鏈路剖析 ImageGlass 是一款跨 Windows、macOS、Linux 的開源圖片查看器科學(xué)計(jì)算科研機(jī)器學(xué)習(xí)RDKit VLib 虛擬化合物庫構(gòu)建框架節(jié)點(diǎn)化流水線架構(gòu)與實(shí)戰(zhàn)指南RDKit VLib 虛擬化合物庫構(gòu)建框架節(jié)點(diǎn)化流水線架構(gòu)與實(shí)戰(zhàn)指南 導(dǎo)讀 RDKit 的 rdkit.VLib 是一個(gè)面向虛擬化合物庫Virtual科學(xué)計(jì)算科研機(jī)器學(xué)習(xí)RDKit SimpleEnum 虛擬庫枚舉基于化學(xué)反應(yīng)與功能基團(tuán)的化合物庫快速生成指南RDKit SimpleEnum 虛擬庫枚舉基于化學(xué)反應(yīng)與功能基團(tuán)的化合物庫快速生成指南 導(dǎo)讀 rdkit.Chem.SimpleEnum 是 RDKit 中科學(xué)計(jì)算科研機(jī)器學(xué)習(xí)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考