资讯动态

RDKit VLib `SmilesOutput` 节点详解:在虚拟化合物库管线中输出规范 SMILES

发布时间:2026/10/15 18:22:49 来源:尧图企业网站定制
科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载导读rdkit.VLib.NodeLib.SmilesOutput是 RDKit 虚拟化合物库Virtual Library简称 VLib框架中的输出节点负责把遍历管线得到的分子对象序列化为规范的 SMILES 文本并写入任意支持write()方法的文件对象。本文以该模块的实现源码rdkit/VLib/NodeLib/SmilesOutput.py与其 Sphinx 文档页Docs/Book/source/rdkit.VLib.NodeLib.SmilesOutput.rst为核心结合基类实现与仓库内单元测试讲解OutputNode的构造参数、输出行格式逻辑、多父节点 lockstep 协作方式并给出可直接运行的示例与完整流水线组合方案。读完本文你将能够把任意 RDKit 分子迭代器SupplyNode、文件型 Supplier 等的输出统一落盘为带标签的 SMILES 表格。VLib 框架与输出节点的定位RDKit 的rdkit.VLib包提供了一套节点图node graph式的虚拟库构建框架每个分子处理步骤读取、过滤、变换、去重、输出都是一个节点节点之间通过AddParent/AddChild组成有向图整个图按lockstep齐步方式迭代——每个节点调用一次next()会依次驱动其所有父节点各推进一个元素。在这一框架中节点被划分为四类角色对应四个基础类见 rdkit/VLib/init.py 与 Docs/Book/source/rdkit.VLib.rst 的模块清单角色基类源码职责供应SupplyNoderdkit/VLib/Supply.py无父节点从内存列表或文件供给分子过滤FilterNoderdkit/VLib/Filter.py按谓词函数决定元素是否放行变换TransformNoderdkit/VLib/Transform.py对元素做任意映射转换输出OutputNoderdkit/VLib/Output.py把元素序列化为字符串并写入destSmilesOutput.OutputNode就是输出角色的 SMILES 专属实现它继承自rdkit.VLib.Output的OutputNode源码中写作BaseOutputNode后者再继承自所有节点的公共基类VLibNoderdkit/VLib/Node.py。因此它天然拥有AddParent、GetParents、reset、Destroy等全套图操作能力并遵循VLibNode定义的迭代协议__iter__先reset()再返回自身OutputNode.__next__ OutputNode.next见 rdkit/VLib/Output.py。构造参数详解OutputNode的构造函数签名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各参数含义与默认值如下参数类型默认值作用dest文件类对象必须支持write()None输出目标。可以是真实文件句柄也可以是io.StringIO等内存对象模块 docstring 明确声明了这一假设destination supports a write() methoddelimstr\t制表符行内字段之间的分隔符。默认输出为标签 SMILES两列接入多个父节点后可扩展为多列idFieldstrNone分子属性名。若分子带有该属性则用属性值作为行首标签否则退化为内部计数器生成的数字标签注意构造函数把strFunc绑定为self.smilesOut后传入基类——基类OutputNode在每次next()时调用该函数获得字符串并dest.write()rdkit/VLib/Output.pySmilesOutput只需专注如何把分子变成一行文本。输出行格式与smilesOut生成逻辑每次迭代触发smilesOut(mol)rdkit/VLib/NodeLib/SmilesOutput.py其核心逻辑按以下顺序执行递增计数self._nDumped 1计数器从 0 开始第一个输出的分子编号为 1。解包多父输入若mol是tuple/list多父节点齐步输出的结果取第一个元素作为真正的分子其余元素作为附加字段存入args最终拼接到 SMILES 之后。决定行标签若idField非空且分子存在该属性mol.HasProp(self._idField)取mol.GetProp(self._idField)作为标签否则用计数器str(self._nDumped)。生成规范 SMILESsmi Chem.MolToSmiles(mol)。注意这里输出的是canonical SMILES输入写法会被重新排列——例如输入NCC会输出CCN。组装并返回outp [label, smi] args用delim连接后追加换行符return %s\n % (self._delim.join(outp))。由此单父节点场景下每行固定为两列labeldelimcanonical-smiles\n多父节点场景下每行扩展为label smiles 其余父节点元素即附加父节点提供的值会被当作额外列拼接。重置语义reset()在调用基类reset()它会递归重置所有父节点见 rdkit/VLib/Node.py之外额外把计数器归零rdkit/VLib/NodeLib/SmilesOutput.py。这意味着每次重新迭代数字标签都会从 1 重新编号若要保证标签全局唯一应改用idField指向稳定的分子属性。两个可直接运行的示例示例一单父节点模块 docstring 自带 doctest模块 docstring 给出了完整的最小示例rdkit/VLib/NodeLib/SmilesOutput.py该示例同时是doctest用例被_runDoctests()直接执行 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观察输出可验证上述逻辑标签为计数器 14分隔符为, NCC被规范化为CCN每行以\n结尾。遍历node返回的ms与输入分子数量一致4 个说明输出节点不消费、不改变数据流只是旁路写出——这正是输出节点与过滤节点的本质区别。示例二多父节点与idField仓库单测rdkit/VLib/NodeLib/UnitTestNodeLib.py 中的test_SmilesOutput展示了多父节点用法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)关键点多父齐步suppl2提供字符串abcd与suppl1的分子一一对齐基类OutputNode.next()对每个父节点各取一个元素只有一个父节点时解包成单个值多个时组成tuplerdkit/VLib/Output.py。smilesOut因此收到(mol, a)形式的元组并把a作为附加列。idField生效四个分子都设置了ID属性100103输出行首标签即为属性值而非计数器。输出验证每行三列label, smiles, extra与预期完全一致。该测试在load_tests中注册了SmilesOutput模块的 doctestrdkit/VLib/NodeLib/UnitTestNodeLib.py可随仓库测试套件一键运行。组合到完整虚拟库流水线仓库中的 rdkit/VLib/NodeLib/demo.py 演示了SmilesOutput在真实管线末端的用法SupplyNode内存分子→SmartsMolFilter过滤金属→SmartsRemover去盐→FilterNode原子数 1→DupeFilter规范 SMILES 去重→SmilesOutput.OutputNode# 7 个分子其中包含含金属、含盐等需要清理的条目 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())流水线逐级打印的统计为初始 7 → 过滤金属后 6 → 去盐且原子数 1 后 5 → 去重后 4。最终OutputNode以Name属性为标签把去重后的 4 个分子以Name, canonical-smiles形式写入io。这个例子说明输出节点应该放在管线的末端前面叠加任意数量的过滤与变换节点都不会影响它逐行写出的职责因为 lockstep 迭代保证每个上游节点只推进一个元素。适用场景与注意事项典型用途把虚拟库筛选/枚举的结果批量导出为带 ID 的 SMILES 表格供下游建模、建库或人工审阅使用dest指向真实文件时即得到可直接落盘的文本文件。dest必须支持write()模块与基类 docstring 都将其列为前置假设。传入不满足该接口的对象会在首次next()时抛出AttributeError。标签唯一性不设idField时数字标签在每次reset()后重新从 1 编号需要跨轮次稳定的行 ID请预先用mol.SetProp()写入属性。输出为规范 SMILESChem.MolToSmiles会重排原子与片段顺序因此输出行不一定与输入写法一致如NCC→CCN这是刻意设计保证同构分子输出完全一致也便于与SmilesDupeFilter的去重逻辑同样基于Chem.MolToSmiles见 rdkit/VLib/NodeLib/SmilesDupeFilter.py衔接。API 文档定位本文所依据的 Sphinx 文档页 Docs/Book/source/rdkit.VLib.NodeLib.SmilesOutput.rst 通过automodule指令自动渲染本模块的全部成员与 docstring与其配套的 rdkit.VLib.NodeLib.rst、rdkit.VLib.Output.rst 分别涵盖了同包其他节点与输出基类的 API可交叉查阅。综上SmilesOutput.OutputNode是 VLib 框架中最简洁也最常用的收尾节点构造时指定目标、分隔符与 ID 属性AddParent挂到管线末端随后遍历节点即可把虚拟库结果以规范 SMILES 表格的形式稳定输出。赞分享科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相关推荐ImageGlass照片加载管道全解从文件解码到渲染的完整链路剖析ImageGlass照片加载管道全解从文件解码到渲染的完整链路剖析 ImageGlass 是一款跨 Windows、macOS、Linux 的开源图片查看器科学计算科研机器学习RDKit VLib 虚拟化合物库构建框架节点化流水线架构与实战指南RDKit VLib 虚拟化合物库构建框架节点化流水线架构与实战指南 导读 RDKit 的 rdkit.VLib 是一个面向虚拟化合物库Virtual科学计算科研机器学习RDKit SimpleEnum 虚拟库枚举基于化学反应与功能基团的化合物库快速生成指南RDKit SimpleEnum 虚拟库枚举基于化学反应与功能基团的化合物库快速生成指南 导读 rdkit.Chem.SimpleEnum 是 RDKit 中科学计算科研机器学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价 →
↑