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

资讯详情

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

DeepChem 分子对接(Docking)API 完全指南:结合口袋发现、姿态生成与评分函数

DeepChem 分子对接(Docking)API 完全指南:结合口袋发现、姿态生成与评分函数 DeepChem 分子对接DockingAPI 完全指南结合口袋发现、姿态生成与评分函数【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem导读本篇围绕 DeepChem 的deepchem.dock模块展开系统讲解分子对接Molecular Docking在蛋白质-小分子相互作用研究中的完整技术路径——从基于凸包几何的结合口袋自动发现Binding Pocket Discovery到调用 AutoDock Vina 与 GNINA 外部引擎的姿态生成Pose Generation再到模块化的Docker 通用对接引擎与纯 Python 实现的Vina 能量评分函数Pose Scoring。读完本文你将掌握 DeepChem 中整套对接 API 的类层级、核心参数语义与调用方式并能在自己的结构生物学/药物发现任务中直接复用这套工作流。得益于冷冻电镜Cryo-EM与 X 射线晶体学等生物物理技术的进步我们常常能够解析出蛋白质的三维结构。这些结构是设计小分子时强有力的辅助工具。分子对接Molecular Docking技术通过几何计算寻找小分子与目标蛋白在合适结合口袋binding pocket即蛋白表面可供小分子嵌入的沟槽区域中的结合姿态binding pose。本文介绍的就是 DeepChem 中围绕这一目标提供的完整工具链对应源码位于 deepchem/dock/公开 API 汇总于 docs/source/api_reference/docking.rst。关于对接算法本身的更多细节可以参考 AutoDock Vina 的原始论文Trott, Oleg, and Arthur J. Olson. AutoDock Vina: improving the speed and accuracy of docking with a new scoring function, efficient optimization, and multithreading. Journal of computational chemistry 31.2 (2010): 455-461.模块总览四层抽象架构从源码结构与包导出见 deepchem/dock/init.py可以看出deepchem.dock对外暴露了五个核心类PoseGenerator、VinaPoseGenerator、GninaPoseGenerator、Docker、ConvexHullPocketFinder它们恰好对应对接流水线的四个环节环节核心类/函数职责口袋发现BindingPocketFinder、ConvexHullPocketFinder、extract_active_site自动在蛋白表面定位候选结合区域姿态生成PoseGenerator、VinaPoseGenerator、GninaPoseGenerator生成小分子与蛋白的低能构象pose通用对接引擎Docker将姿态生成与打分能力组装成通用对接流程姿态评分vina_energy_term等 8 个函数纯 Python 复现 Vina 评分函数其中姿态生成是一个复杂过程当前版本中 DeepChem 依赖并自动调用外部软件AutoDock Vina、GNINA完成Python 侧只负责文件准备、进程调用与结果解析而姿态评分的核心数学函数则以 NumPy 直接实现可在 Python 中独立计算。结合口袋发现Binding Pocket Discovery处理一个新蛋白时往往并不清楚大分子的哪些区域可能是配体或其他分子的良好相互作用位点。DeepChem 提供了一些工具来自动发现蛋白上的候选结合口袋。目前这些工具还比较简单官方文档明确表示会在后续版本中持续改进。BindingPocketFinder口袋检测的抽象基类BindingPocketFinder源码是所有结合口袋检测器的抽象超类。它不规定具体的检测技术只定义一个接口方法class BindingPocketFinder(object): def find_pockets(self, molecule): Finds potential binding pockets in proteins. raise NotImplementedError任何子类只需实现find_pockets(molecule)即可接入 DeepChem 的对接流水线返回的口袋以CoordinateBox列表形式表达。ConvexHullPocketFinder基于凸包的实现ConvexHullPocketFinder是当前仓库中唯一的算法实现其思路来自基于蛋白凸包convex hull几何寻找口袋的文献方法。构造参数如下ConvexHullPocketFinder(scoring_modelNone, pad5.0)scoring_model可选若指定则用该模型对候选口袋做剪枝pruning。pad默认 5.0单位 Å即围绕口袋原子的盒子的外扩量。该类的关键方法finder dc.dock.ConvexHullPocketFinder() # 返回蛋白表面所有凸包面对应的候选盒不做合并 all_pockets finder.find_all_pockets(1jld_protein.pdb) # 返回经过重叠合并、更适合对接的口袋列表 pockets finder.find_pockets(1jld_protein.pdb)其底层原理可以从 deepchem/utils/coordinate_box_utils.py 中看到完整实现链路get_face_boxes(coords, pad)用scipy.spatial.ConvexHull计算蛋白原子坐标的凸包对凸包的每个三角面片hull.simplices构造一个包围盒即面盒子merge_overlapping_boxes(boxes, threshold0.8)按体积重叠比例默认 0.8合并相交的盒子得到更紧凑的候选口袋每个结果都是一个CoordinateBox其center()方法可给出盒心坐标x_range/y_range/z_range给出三轴边界这些信息正是后续 Vina 对接所需的中心与盒子尺寸源码注释中也指出 Vina 会按盒尺寸的一半计算。测试 deepchem/dock/tests/test_binding_pocket.py 验证了上述行为find_pockets返回的口袋数严格少于find_all_pockets合并生效且每个口袋都是合法的CoordinateBox。extract_active_site从已知复合物提取活性位点除了自动发现DeepChem 还提供extract_active_site(protein_file, ligand_file, cutoff4.0)源码——当已知蛋白-配体复合物结构时用它提取真实活性位点的盒子蛋白以add_hydrogensFalse加载配体以add_hydrogensTrue, calc_chargesTrue加载通过get_contact_atom_indices找出 cutoff默认 4.0 Å范围内与配体接触的蛋白原子返回(CoordinateBox, np.ndarray)其中数组形状为(N, 3)N为活性位点内原子数。该函数在测试中用于验证自动发现的口袋与真实结合位点是否强重叠见 test_binding_pocket.py 的test_extract_active_site。姿态生成Pose Generation姿态生成的任务是寻找小分子与蛋白相互作用的几何构象——即姿态pose。这是计算结合自由能的关键前置步骤。由于过程复杂DeepChem 当前依赖外部软件完成并在底层自动安装与调用这些程序。PoseGenerator抽象基类PoseGenerator源码定义统一的生成接口核心参数如下molecular_complex: Tuple[str, str]分子复合物表示即(protein_file, ligand_file)centroid对接中心缺省时自动计算box_dims形状为(3,)的对接盒子尺寸缺省时取分子复合物尺寸加若干 Åexhaustiveness默认 10控制姿态生成的穷尽程度越大计算越充分num_modes默认 9每次调用生成的最大结合模式数num_pockets若指定则必须同时设置pocket_finder只对前num_pockets个口袋生成姿态out_dir指定时把生成姿态写入该目录generate_scores默认False为True时返回打分常用于调用会输出分数的外部对接程序。VinaPoseGeneratorAutoDock Vina 封装VinaPoseGenerator(pocket_finderNone)源码调用 AutoDock Vina 预测结合姿态官方示例import deepchem as dc vpg dc.dock.VinaPoseGenerator(pocket_finderNone) protein_file 1jld_protein.pdb ligand_file 1jld_ligand.sdf poses, scores vpg.generate_poses( (protein_file, ligand_file), exhaustiveness1, num_modes1, out_dirtmp, generate_scoresTrue)其内部执行流程源码可见依次为蛋白预处理RDKit 加载、加氢、计算电荷必要时写入.pdbqt文件→确定对接区域若给定centroid/box_dims则直接使用否则若无口袋查找器则用整蛋白质心与范围加 5 Å若有则对每个发现的口袋计算中心与盒尺寸→配体预处理转为.pdbqt→构造 Vina conf 文件并逐一在每个口袋中执行vina.dock()与write_poses()→解析结果。除基类参数外Vina 还支持以下kwargs透传给vina.Vina引擎参数默认值含义cpu0使用的 CPU 核数min_rmsd1.0不同模式间的最小 RMSD 阈值max_evals0最大评估次数0 表示由 Vina 自行决定energy_range3.0输出姿态的能量范围kcal/mol返回值有两种形态传入 PDB/SDF 时返回(docked_poses, scores)其中docked_poses是(protein_mol, ligand_mol)的 RDKit 分子对列表scores为 Vina 预测的结合自由能列表kcal/mol若输入已是.pdbqt文件则只返回分数列表。两种文件格式均支持.pdbqt输入直接跳过转换。平台限制该类要求安装 RDKit 与 vina截至仓库注释2022-03-09Vina 不支持 Windows因此该工具目前仅适用于 Ubuntu 与 macOS。若设置num_pockets却未在构造时提供pocket_finder会抛出ValueErrorpose_generation.py。GninaPoseGeneratorGNINA 深度学习对接封装GninaPoseGenerator源码使用 GNINA面向分子对接的深度学习框架生成结合姿态。GNINA 使用预训练的卷积神经网络CNN评分函数基于 3D 蛋白-配体相互作用的习得表示对姿态排序在虚拟筛选场景中表现优于 AutoDock Vina该论断源自类文档引用的论文 [1] M Ragoza, J Hochuli, E Idrobo, J Sunseri, DR Koes. Protein–Ligand Scoring with Convolutional Neural Networks. JCIM (2017)。若使用 GNINA 引擎请按其官方指引引用相关文献。运行机制初始化时从 GitHub Release 下载 GNINA 可执行文件到DEEPCHEM_DATA_DIR环境变量指向的目录Linux 平台随后通过子进程以--config conf.txt --log xxx_log.txt --out xxx_docked.pdbqt方式调用并用read_gnina_log解析日志获得打分。关键注意点仅支持 Linux非 Linux 平台构造时直接抛出ValueError要求 CUDA 10.1 以获得快速 CNN 评分蛋白文件必须是.pdb配体必须是.sdf否则报错generate_scores默认True返回的scores数组包含 GNINA 预测的结合亲和力kcal/mol、CNN pose score 与 CNN affinity 三类分数官方文档提示为兼容性打包导致性能下降生产环境建议从源码自行编译 GNINA。测试 deepchem/dock/tests/test_pose_generation.py 覆盖了 Vina/GNINA 的初始化、带分数/不带分数的姿态生成、指定质心对接以及口袋驱动对接num_pockets2产出 2 个姿态等场景可作调用范本参考。通用对接引擎Dockerdc.dock.docking模块提供一种通用的对接实现Docker源码。大多数对接软件是命令行工具而Docker的目标是提供一套干净的 Python API 以编程方式完成分子对接。该实现轻量且通用——绝大部分重活由传入的姿态生成与评分组件完成Docker(pose_generator, featurizerNone, scoring_modelNone)pose_generator必选负责姿态生成featurizer与scoring_model配套的复合物特征化器ComplexFeaturizerscoring_model对分子复合物做预测的模型。约束featurizer与scoring_model必须同时提供或同时为None否则构造时报ValueError。核心方法docker.dock(...)的参数与姿态生成器对齐centroid、box_dims、exhaustiveness、num_modes、num_pockets、out_dir另有一个专属参数use_pose_generator_scores默认False若为True则要求姿态生成器同时输出分数该参数与scoring_model互斥同时设置会抛ValueError因为两者都产出分数。返回值是一个生成器generator按三种模式产出不同内容仅姿态模式scoring_modelNone且use_pose_generator_scoresFalse逐个 yieldposed_complex姿态生成器打分模式use_pose_generator_scoresTrue逐个 yield(posed_complex, score)自定义模型打分模式提供了featurizer与scoring_model对每个姿态用featurizer.featurize()提取复合物特征、构造NumpyDataset再经scoring_model.predict()打分后 yield(posed_complex, score)。测试 deepchem/dock/tests/test_docking.py 展示了四种典型用法仅对接、use_pose_generator_scoresTrue取分、指定centroid(10,10,10)box_dims(10,10,10)定点对接、ConvexHullPocketFinder找口袋后num_pockets1对接以及用自定义DummyFeaturizer/DummyModel/DummyPoseGenerator验证模型打分链路的端到端调用。姿态评分Pose Scoring纯 Python 的 Vina 能量函数该模块提供直接在 Python 中计算对接评分函数的工具源码。目前自定义打分支持有限但 Vina 评分函数的各个数学组件均已用 NumPy 完整复现且全部是逐元素运算、可向量化便于批处理。几何与截断基础pairwise_distances(coords1, coords2) # (N,3) 与 (M,3) 坐标 → (N,M) 欧氏距离矩阵 cutoff_filter(d, x, cutoff8.0) # 距离大于 cutoff 的位置置 0其余保留cutoff_filter默认截断距离 8 Å对应 Vina 中相互作用仅在一定范围内有效的物理假设。Vina 五项相互作用项以下函数输入均为表面距离矩阵d形状(N,M)函数数学形式物理含义vina_repulsion(d)d0 时为 d²否则 0排斥项距离为负原子互相穿透时产生强惩罚vina_hydrophobic(d)d0.5 为 10.5≤d1.5 为 1.5-d否则 0疏水相互作用分段线性曲线vina_hbond(d)d-0.7 为 1-0.7≤d0 为 -d/0.7否则 0氢键相互作用分段线性曲线vina_gaussian_first(d)exp(-(d/0.5)²)第一个高斯项近程吸引vina_gaussian_second(d)exp(-((d-3)/2)²)第二个高斯项中程吸引峰值在 3 Å 附近其中疏水与氢键项的定义源自 Jain 的经典可微打分函数论文Jain, Ajay N. Scoring noncovalent protein-ligand interactions: a continuous differentiable function tuned to compute binding affinities. JCAMD 10.5 (1996): 427-440。组装与非线性缩放weighted_linear_sum(w, x) # 权重向量 (5,) 与五项张量 (5,N,M) 的张量积 → (N,M) vina_nonlinearity(c, w, Nrot) # c / (1 w * Nrot)按可旋转键数 Nrot 缩放完整能量项vina_energy_term(coords1, coords2, weights, wrot, Nrot)将上述全部组件串联为标量自由能计算两分子坐标的成对距离矩阵分别计算排斥、疏水、氢键、两个高斯项用weights形状(5,)依次为五项权重做加权线性组合用cutoff_filter默认 8 Å截断远处相互作用经vina_nonlinearity按旋转键数缩放后求和返回标量。测试 deepchem/dock/tests/test_pose_scoring.py 对每个函数做了数值验证如d0时疏水项为 1、氢键项为 0两个高斯项在其峰值处取 1vina_energy_term对正权重输出正能量可直接作为理解各函数行为的参考。实现说明源码注释TODO(rbharath)指出AutoDock Vina 原始实现计算的是考虑各原子类型 van der Waals 半径的表面距离surface distances而当前 DeepChem 版本直接使用欧氏距离作为近似这一差异在使用纯 Python 评分时需要注意。完整对接流水线实战示例综合以上模块一条典型的 DeepChem 对接流水线如下可对照测试 test_pocket_docker_dockimport deepchem as dc # 1. 发现候选结合口袋 pocket_finder dc.dock.ConvexHullPocketFinder() # 2. 构造带口袋查找器的 Vina 姿态生成器 vpg dc.dock.VinaPoseGenerator(pocket_finderpocket_finder) # 3. 组装通用对接引擎 docker dc.dock.Docker(vpg) # 4. 执行对接在找到的前 1 个口袋中生成 1 个姿态 docked_outputs docker.dock( (1jld_protein.pdb, 1jld_ligand.sdf), exhaustiveness1, num_modes1, num_pockets1, out_dir/tmp) for posed_complex in docked_outputs: protein, ligand posed_complex # 均为 RDKit Mol若需要打分将use_pose_generator_scoresTrue传入dock()即可得到(posed_complex, score)元组若已有自己的复合物特征化器与打分模型则可传入Docker(pose_generator, featurizer, scoring_model)让模型对每个姿态打分。环境与测试参考对接相关单元测试集中于 deepchem/dock/tests/test_binding_pocket.py、test_pose_generation.py、test_docking.py、test_pose_scoring.py其中 Vina/GNINA 的实机对接测试均标记为pytest.mark.slowVina 测试在 Windows 上跳过GNINA 测试仅在 Linux 上运行测试使用的示例复合物为仓库内的1jld_protein.pdb/1jld_ligand.sdf对接测试目录下可找到1iep_receptor.pdbqt/1iep_ligand.pdbqt等 PDBQT 样本社区还提供了端到端的 Vina 对接示例含 PDBQT 文件见 contrib/vina_model/vina_model.py 与 contrib/vina_model/test_vina_model.py。总体而言DeepChem 的deepchem.dock模块把找口袋 → 生成姿态 → 打分 → 组装流水线四个环节解耦为清晰的小型 API外部引擎Vina、GNINA被封装在姿态生成层而评分数学在 Python 侧完全透明、可逐项验证——这正是将分子对接嵌入深度学习工作流如用自定义ComplexFeaturizer 模型对姿态重打分的理想起点。【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表