尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RDKit 原子对指纹(AtomPairs)完全指南:Atom Pair、Topological Torsion 与生理化学性质指纹的原理与实战

RDKit 原子对指纹(AtomPairs)完全指南:Atom Pair、Topological Torsion 与生理化学性质指纹的原理与实战 科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载rdkit.Chem.AtomPairs是 RDKit 中负责拓扑描述符类分子指纹的 Python 包它以三篇经典文献Carhart 1985、Nilakantan 1987、Kearsley 1996为算法依据提供原子对Atom Pair、拓扑扭转Topological Torsion以及基于 PATTY 原子类型的生理化学性质指纹BP/BT。本文以该包的 API 参考文档Docs/Book/source/rdkit.Chem.AtomPairs.rst为主线结合仓库内四个子模块的源码与 doctest 测试用例带你掌握这些指纹的位编码原理、全部公开函数签名、相似度度量工具以及可直接复制的实战代码。包结构与文档脉络一个包、四个子模块rdkit.Chem.AtomPairs的 API 文档是一份典型的 Sphinxautomodule索引页它把包拆分为四个可独立引用的子模块并为每个子模块生成了独立的参考页子模块文档页面核心指纹类型算法文献Pairsrdkit.Chem.AtomPairs.Pairs.rst原子对Atom PairCarhart et al.,JCICS25, 64–73 (1985)Torsionsrdkit.Chem.AtomPairs.Torsions.rst拓扑扭转Topological TorsionNilakantan et al.,JCICS27, 82–85 (1987)Utilsrdkit.Chem.AtomPairs.Utils.rst原子编码与相似度工具—Sheridanrdkit.Chem.AtomPairs.Sheridan.rst生理化学性质指纹BP/BTKearsley et al.,J. Chem. Inf. Model.36, 118–127 (1996)包入口文件 rdkit/Chem/AtomPairs/init.py 本身为空不导出任何符号所有功能均需通过上述四个子模块或rdkit.Chem.rdMolDescriptors导入——这也解释了为什么文档把四个子模块单独成页。在代码层面Pairs、Torsions中的绝大多数指纹生成函数是对 C 实现rdkit.Chem.rdMolDescriptors的薄封装而位级编码、解释与相似度计算则保留了纯 Python 实现便于阅读、调试和二次开发。原子对指纹Pairs以原子类型 拓扑距离为特征算法背景与包内定位原子对指纹最初由 Carhart、Smith 与 Venkataraghavan 于 1985 年提出核心思想是把分子中任意两个原子组成一个原子对用「各自的原子描述符 两者间的拓扑距离」三元组来描述分子指纹即为所有原子对描述符的集合。它天然保留了对分子拓扑结构的敏感度且不依赖环大小或具体骨架因此常用于结构-活性关系SAR分析与相似性检索。在 RDKit 中Pairs子模块文档明确给出了四个公开入口见 rdkit/Chem/AtomPairs/Pairs.py 的模块 docstringGetAtomPairFingerprint(mol)——返回计数型原子对指纹SparseIntVect每个非零元素记录该原子对出现的次数符合原始文献用计数而非只记录存在的定义GetHashedAtomPairFingerprint(mol)——哈希版本文档说明其与GetAtomPairFingerprint返回内容一致实际实现中二者均为 rdMolDescriptors 的 C 函数哈希版用于需要固定长度的场景GetAtomPairFingerprintAsIntVect(mol)——别名直接指向rdMolDescriptors.GetAtomPairFingerprintGetAtomPairFingerprintAsBitVect(mol)——转换为位向量版本SparseBitVect注意源码特别注释这种只记出现与否的形式不符合原子对的原始定义原始定义使用计数。典型用法from rdkit import Chem from rdkit.Chem.AtomPairs import Pairs mol Chem.MolFromSmiles(CCCCC) # 计数型原子对指纹SparseIntVect fp_int Pairs.GetAtomPairFingerprint(mol) print(fp_int.GetNonzeroElements()) # {score: count, ...} # 位向量版 fp_bv Pairs.GetAtomPairFingerprintAsBitVect(mol) print(list(fp_bv.GetOnBits()))位编码细节pyScorePair揭示的比特布局对指纹内部的数值score编码方式包内提供了纯 Python 参考实现pyScorePair(at1, at2, dist, atomCodesNone, includeChiralityFalse)。从 Pairs.py 的源码可以看到完整的比特分配规则accum int(dist) % _maxPathLen # 低位拓扑距离 accum | min(code1, code2) numPathBits # 中位较小原子码 accum | max(code1, code2) (codeSize numPathBits) # 高位较大原子码其中numPathBits与codeSize均取自rdMolDescriptors.AtomPairsParameters_maxPathLen (1 numPathBits) - 1用于把超出上限的距离截断取模。整个 score 的布局为比特段内容说明低numPathBits位拓扑距离距离大于最大值时取模截断中间codeSize位较小的原子码用min保证顺序无关最高codeSize位较大的原子码用max保证顺序无关同时文档与源码强调两个特性顺序无关pyScorePair(atom0, atom1, 1)与pyScorePair(atom1, atom0, 1)产生完全相同的 scoredoctest 已验证可选手性当includeChiralityTrue时原子码会多出numChiralBits位用于记录手性此时编码段长度变为codeSize numChiralBits。原子码本身由Utils.GetAtomCode即 C 的rdMolDescriptors.GetAtomPairAtomCode生成详情见下文Utils小节。逆解析ExplainPairScore给定一个 score可以用ExplainPairScore(score, includeChiralityFalse)把它还原成人类可读的三元组(原子描述1, 距离, 原子描述2)每个原子描述是一个(元素符号, 分支度, π电子数)元组开启手性后变为四元组(元素符号, 分支度, π电子数, 手性标记)。仓库中的 doctest 给出了直观示例Pairs.py from rdkit import Chem from rdkit.Chem.AtomPairs import Pairs, Utils m Chem.MolFromSmiles(CCHCl) score Pairs.pyScorePair(m.GetAtomWithIdx(0), m.GetAtomWithIdx(1), 1, includeChiralityTrue) Pairs.ExplainPairScore(score, includeChiralityTrue) ((C, 1, 0, ), 1, (C, 3, 0, R))这在调试指纹、或需要向用户解释某个指纹位对应分子中的哪段结构时非常实用。拓扑扭转指纹Torsions四原子路径的线性编码算法背景与入口函数拓扑扭转指纹由 Nilakantan 等人于 1987 年提出把分子中**连续的四原子路径沿键遍历的扭转片段**作为特征单元路径的起点与终点原子各取原子码减 1的编码中间两个原子取原子码减 2的编码再把四个编码按顺序拼接成一个 score。它捕捉的是分子中原子沿拓扑路径的排列信息与原子对指纹形成互补。Torsions子模块的公开入口见 rdkit/Chem/AtomPairs/Torsions.py 的模块 docstringGetTopologicalTorsionFingerprint(mol, targetSize4)——计数型拓扑扭转指纹GetHashedTopologicalTorsionFingerprint(mol)——哈希版本GetTopologicalTorsionFingerprintAsIntVect(mol)——别名等价于GetTopologicalTorsionFingerprintGetTopologicalTorsionFingerprintAsIds(mol, targetSize4)——把每个路径 score 按其出现频次展开成 id 列表便于直接与Utils中的相似度函数配合使用。用法示例from rdkit import Chem from rdkit.Chem.AtomPairs import Torsions mol Chem.MolFromSmiles(CCCCC) fp Torsions.GetTopologicalTorsionFingerprint(mol) print(fp.GetNonzeroElements()) # 展开为 id 列表按频次重复可直接用于 Dice / Cosine 相似度 ids Torsions.GetTopologicalTorsionFingerprintAsIds(mol) print(ids)位编码细节pyScorePathpyScorePath(mol, path, size, atomCodesNone)是纯 Python 参考实现完整展示了路径 score 的拼接方式Torsions.pycodes[i] Utils.GetAtomCode(mol.GetAtomWithIdx(path[i]), sub) # 端点 sub1中间 sub2 # ... accum | code (codeSize * i) # 每个原子码占用 codeSize 位依次左移拼接三个值得注意的工程细节端点减 1、内部减 2路径两端的原子分支度编码减 1中间原子减 2由sub参数控制这样同一个扭转路径在分子中沿两个方向遍历时编码一致方向无关canonicalization源码先对码向量做从两端向中间比较的规范化处理beg/end双向指针若首尾码不同则按大小决定是否reverse()保证pyScorePath(m, (0,1,2,3), 4)与pyScorePath(m, (3,2,1,0), 4)得到相同 score位宽固定每个原子码占据codeSize位size个原子共size * codeSize位targetSize4为默认路径长度。逆解析ExplainPathScoreExplainPathScore(score, size4)把拼接后的 score 按codeSize位切分逐段还原成(元素符号, 分支度, π电子数)元组序列中间原子的分支度会加回被减掉的 2端点加回 1。doctest 验证了方向无关性 m Chem.MolFromSmiles(CCC) Torsions.ExplainPathScore(Torsions.pyScorePath(m, (2, 1, 0), 3), 3) ((C, 1, 0), (C, 2, 1), (C, 1, 1))支撑工具Utils原子码与相似度度量Utils子模块不产生指纹而是为上述两类指纹提供原子级编码与向量相似度工具是理解整套指纹编码的钥匙。原子码的构成与解释GetAtomCode/ExplainAtomCodeUtils.GetAtomCode rdMolDescriptors.GetAtomPairAtomCodeC 实现返回单个原子的整型编码ExplainAtomCode(code, branchSubtract0, includeChiralityFalse)则把编码反解为元组。从 Utils.py 源码可见其比特布局完全由rdMolDescriptors.AtomPairsParameters中的常量控制比特段含义掩码常量低numBranchBits位分支度非氢邻居数branchMask中numPiBits位π 电子计数piMask高numTypeBits位原子类型索引查atomTypes表映射为元素符号typeMask最上numChiralBits位手性码仅includeChiralityTrue时使用chiMaskExplainAtomCode的返回约定默认返回(元素符号, 分支度, π电子数)三元组includeChiralityTrue时返回四元组手性字段取值非手性、R或S见源码中的chiDict {0: , 1: R, 2: S}类型索引超出atomTypes表长度时元素符号回退为X原子码生成时带手性、解释时不带仍然能得到正确的非手性三元组doctest 验证了这一点。相似度度量BitsInCommon/DiceSimilarity/Dot/CosineSimilarity这组函数以排序后的位 id 序列如GetTopologicalTorsionFingerprintAsIds的输出为输入直接在两篇文献原子对、拓扑扭转推荐的度量框架下工作函数公式说明BitsInCommon(v1, v2)交集计数重复位多次计数要求输入已排序重复 id 按出现次数累计DiceSimilarity(v1, v2, boundsNone)2·|v1∩v2| / (|v1||v2|)原子对与拓扑扭转论文推荐度量可选bounds做长度比例下界过滤低于阈值直接返回 0.0Dot(v1, v2)Σ min(c1, c2)²对重复 id 按两向量中该 id 出现次数较小者平方累加CosineSimilarity(v1, v2)Dot(v1,v2) / √(Dot(v1,v1)·Dot(v2,v2))LaSSI 论文推荐度量doctest 中的边界示例很有参考价值两个空向量DiceSimilarity((), ())返回0.0bounds参数在min(len1,len2)/(len1len2)小于阈值时把相似度强制归零用于快速拒绝过短的重叠片段Utils.py。生理化学性质指纹SheridanPATTY 原子类型驱动的 BP/BT算法背景与入口函数Sheridan子模块实现了 Kearsley 等人 1996 年提出的生理化学性质指纹其特点是把传统原子对/拓扑扭转的元素分支度π电子原子描述符替换为基于药效特征pharmacophore的 PATTY 原子类型从而让指纹直接反映氢键供体/受体、电荷、疏水等生理化学性质。公开入口见 rdkit/Chem/AtomPairs/Sheridan.py 的模块 docstringGetBPFingerprint(mol, fpfn_atomPairFingerprintFunc)——基于原子对计数指纹的生理化学性质版本GetBTFingerprint(mol, fpfn_topologicalTorsionsFingerprintFunc)——基于拓扑扭转计数指纹的生理化学性质版本内部直接复用GetBPFingerprint仅替换指纹生成函数。PATTY 类型与AssignPattyTypesPATTY 类型由 SMARTS 规则文件定义仓库中的规则文件位于 Data/SmartsLib/patty_rules.txt。_readPattyDefs会逐行解析该文件格式为SMARTS 类型名把每条 SMARTS 编译成MolFromSmarts匹配器AssignPattyTypes(mol, defnsNone)对分子执行子结构匹配返回每个原子的类型名列表首个命中原子被赋予对应类型匹配顺序即规则文件顺序。类型名与数值编码的映射在源码中写死Sheridan.pyPATTY 类型数值码语义CAT1阳离子cationANI2阴离子anionPOL3极性polarDON4氢键供体donorACC5氢键受体acceptorHYD6疏水hydrophobicOTH7其他otherdoctest 给出了两个直观例子OCC(O)O的 PATTY 类型序列为[POL, HYD, OTH, ANI, ANI]OCC(N)O为[POL, HYD, HYD, CAT, POL]。生成指纹时GetBPFingerprint先调用AssignPattyTypes得到类型序列映射为数值码后作为customAtomInvariants传入rdFingerprintGenerator.GetAtomPairGenerator()的GetSparseCountFingerprintGetBTFingerprint则换成GetTopologicalTorsionGenerator()。这意味着你可以自定义fpfn参数接受(mol, atomInvariants)的函数来替换底层指纹生成器。from rdkit import Chem from rdkit.Chem.AtomPairs import Sheridan mol Chem.MolFromSmiles(OCC(O)O) print(Sheridan.AssignPattyTypes(mol)) # [POL, HYD, OTH, ANI, ANI] fp_bp Sheridan.GetBPFingerprint(mol) print(fp_bp.GetTotalVal(), fp_bp.GetNonzeroElements()) fp_bt Sheridan.GetBTFingerprint(mol) print(fp_bt.GetTotalVal(), fp_bt.GetNonzeroElements())实战要点与验证资源完整的相似性检索示例结合Utils的相似度函数与Torsions.GetTopologicalTorsionFingerprintAsIds可以快速实现一个基于拓扑扭转指纹的相似性比较from rdkit import Chem from rdkit.Chem.AtomPairs import Torsions, Utils def torsion_ids(smiles): mol Chem.MolFromSmiles(smiles) return Torsions.GetTopologicalTorsionFingerprintAsIds(mol) a torsion_ids(CCCC) b torsion_ids(C(C)CC) print(Utils.DiceSimilarity(a, b)) # 0.0~1.0 之间的相似度 print(Utils.CosineSimilarity(a, b))测试与参考数据单元测试rdkit/Chem/AtomPairs/UnitTestDescriptors.py 覆盖原子对与拓扑扭转指纹的正确性参考数据测试目录 rdkit/Chem/AtomPairs/test_data 中提供了 1000 个分子的预计算指纹 picklemols1000.aps.pkl.gz为原子对指纹、mols1000.tts.pkl.gz为拓扑扭转指纹、mols1000.pkl.gz为分子本体可用于离线验证自己的实现与仓库结果一致每个子模块文件末尾均带 doctest 入口_runDoctests可通过python Pairs.py直接运行模块内置的文档测试这些 doctest 本身就是最精确的 API 使用范例。补充说明本文涉及的指纹生成函数GetAtomPairFingerprint、GetTopologicalTorsionFingerprint等本体位于 C 层rdMolDescriptorsPython 层为封装与别名位宽常量numPathBits、codeSize、numTypeBits、numBranchBits、numPiBits、numChiralBits及atomTypes表统一由rdMolDescriptors.AtomPairsParameters提供Python 代码只消费这些常量因此修改编码布局只需改动 C 一处原子对指纹的计数定义与位向量定义是有区别的检索时建议按文献惯例使用计数型GetAtomPairFingerprint并结合Utils中的计数感知相似度函数避免信息丢失。小结rdkit.Chem.AtomPairs用四个职责清晰的子模块覆盖了三代经典的拓扑指纹思想Pairs的原子对描述两原子 距离、Torsions的拓扑扭转描述四原子路径、Sheridan用 PATTY 药效类型替换原子描述符而Utils则是贯穿三者原子码编解码 计数感知相似度的公共基础设施。无论你是要在 SAR 项目中做骨架无关的相似性检索、构建基于药效特征的筛选指纹还是想理解 RDKit 指纹位编码的比特级细节本包的源码与 doctest 都是最可靠的一手教材。赞分享科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相关推荐RDKit 物理化学性质指纹完全指南Sheridan 模块的 BP/BT 指纹与 PATTY 原子类型RDKit 物理化学性质指纹完全指南Sheridan 模块的 BP/BT 指纹与 PATTY 原子类型 导读 本文围绕 RDKit 中 rdkit.Chem.科学计算科研机器学习RDKit 拓扑扭转指纹Topological Torsion完整指南rdkit.Chem.AtomPairs.Torsions 模块解析RDKit 拓扑扭转指纹Topological Torsion完整指南rdkit.Chem.AtomPairs.Torsions 模块解析 本指南围绕 R科学计算科研机器学习RDKit 原子对指纹工具模块解析AtomPairs.Utils 的原子编码位域与相似度度量RDKit 原子对指纹工具模块解析AtomPairs.Utils 的原子编码位域与相似度度量 导读 本文围绕 RDKit 官方文档页 rdkit.Chem.A科学计算科研机器学习上一篇用 Hypothesis 属性测试破解浮点均值从溢出到次正规数的完整实战指南下一篇Instructor 结构化输出完全 FAQ从工作原理、模式选择到验证重试与流式调优创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表