融合表面信息和等变扩散的分子对接模型 SurfDock - 评测
SurfDock 是一个几何扩散模型,蛋白质序列、三维结构图、以及表面结构等结构特征,采用的是非欧里几何的范式处理小分子的旋转、平移以及扭转。 SurfaceDock 以蛋白口袋作为条件,从 rdkit 生成的随机小分子构象开始,对平移、旋转、扭转进行去噪。SurfaceDock 内置了一个打分模块(使用相同的表征层,但是读出层不同),对输出的 pose 进行置信度打分 SurfScore(包括,经过/不经过能量最小化。)
一、背景介绍
SurfDock 来源于中国科学院上海药物所的郑明月为通讯作者的文章:《SurfDock is a Surface-Informed Diffusion Generative Model for Reliable and Accurate Protein-ligand Complex Prediction》。文章链接:https://www.biorxiv.org/content/10.1101/2023.12.13.571408v1.full.pdf 。该文章在 2023 年 12 月 13 日发表于 BioRxiv 上。当前,此工作已经于2024 年 11 月 27 日正式发表在 《Nature Methods》上,链接:https://www.nature.com/articles/s41592-024-02516-y
在基于结构的药物设计领域,准确预测配体与蛋白质的结合构象一直是一个长期的目标。尽管近年来深度学习取得了进展,提出了多种预测蛋白质-配体复合物结构的方法,但这些基于人工智能的方法在实际应用中常常不及传统的对接方法,并且经常生成缺乏物理和化学合理性的结构。为克服这些限制,作者提出了 SurfDock,一种先进的几何扩散网络,其特点是能够将多种蛋白质表示(包括蛋白质序列、三维结构图和表面细节)集成到等变架构中。SurfDock 采用一种在非欧几里范式的的生成扩散模型,能够精确优化分子的平移、旋转和扭曲,从而生成可靠的结合构象。配合使用混合全连接层网络进行评分,并利用相同的综合表示,SurfDock 在所有现有方法中显著提高了对接成功率,在准确性和符合物理约束方面表现出色。SurfDock 还配备了可选的对接后能量最小化功能,进一步提高了生成构象的合理性。重要的是,SurfDock 展现了出色的对未知蛋白质的泛化能力,并且在虚拟筛选任务中也能实现最先进的性能。
二、模型介绍
预测小分子如何与蛋白质结合,通常被称为配体对接,仍然面临着巨大的复杂性。这种复杂性源于蛋白质-配体相互作用的动态和多维特性。配体对接通常包括两个阶段:生成对接构象和后续评分。初始阶段旨在识别配体相对于目标蛋白质的可能的结合构象,而评分阶段则根据这些结合构象估算结合亲和力。传统的配体对接方法,如 AutoDock Vina、Glide 和 Gold,采用启发式算法探索潜在的配体构象。然而,这些方法通常难以全面覆盖广阔的构象空间,可能会忽略可行的结合构象。这种不完全的探索可能是由于其固有的算法限制,它们优先考虑计算速度而非全面性。传统方法中的评分算法使用简单的函数项来估算对接构象的结合亲和力。研究人员一直致力于改进基于这些传统搜索技术的评分函数,如 SMINA、GNINA、DeepDock 等其他机器学习评分函数。虽然后续的评分阶段同样重要,但它依赖于生成构象的质量。如果初始的构象生成算法存在缺陷,即使准确的评分系统也可能被误导,导致不理想的配体选择。这一局限性在虚拟筛选任务中特别明显,在这些任务中,识别适合的蛋白质-配体相互作用和配体构象对于已知蛋白质的结合口袋至关重要。因此,开发高效的配体对接算法是非常重要。
在这一过程中,深度学习方法显得尤为宝贵。利用像 PDBBank 这样的高质量数据,深度学习模型可以解读蛋白质与配体之间的复杂相互作用。这一能力增强了蛋白质-配体复合物结构预测的准确性。在构象生成任务上,之前的深度学习方法如 Uni-Mol、EquiBind、E3Bind、TANKBind 和 KarmaDock,主要将其视为回归问题,采用一次性方法预测配体与蛋白质的结合构象。尽管这些方法速度较快,但它们相对于经典方法的准确性提升有限。这一局限性可能源于回归中心方法与配体和靶标蛋白结合实际过程之间的固有不一致性,即配体与目标之间的互动过程,以寻找最适合的结合构象。在这种背景下,Jaakkola 等人的研究提出了一种范式转变,将分子对接视为生成建模问题。与回归方法不同,他们的 DiffDock 通过学习可能的配体构象分布来进行建模。这一方法通过扩散生成模型(DGM)实现,定义了在对接中的关键自由度(平移、旋转和扭转)的扩散过程。近年来,扩散网络在分子生成和构象生成等任务中取得了显著成功。DiffDock 的方法论强调通过从嘈杂的先验到学习到的分布,反复细化配体构象,更新平移、旋转和扭转角度,这与分子相互作用的复杂性质相吻合。
尽管取得了一些进展,但仍然存在挑战。Ke 等人的研究表明,在实际的 SBDD 任务中,当结合口袋已知时,深度学习方法尚未超越传统方法。此外,许多 AI 生成的构象虽然在均方根偏差(RMSD)指标上技术上成功(即,如果生成的配体构象与晶体配体构象的 RMSD 小于 2 Å,认为对接成功),但却表现出生物物理上的不一致性,如分子间的立体冲突或不现实的键或角度。因此,过度依赖 RMSD 进行构象评估的做法越来越被认为是不充分的,它无法捕捉分子相互作用的细微差别以及结合构象的物理现实。
Deane 等人提出了 PoseBusters,一种基于物理和化学合理性评估构象的工具,以及 PoseBusters 基准集,这是一个自 2021 年以来发布的 428 个复合物的新数据集。研究结果表明,在考虑生成构象的合理性时,深度学习方法尚未超越传统技术。此外,该研究还显示,所有深度学习方法在与训练集序列相似度低于 30% 的蛋白质上表现不佳。这两项发现表明,当前的深度学习算法在生成生物物理合理的复合物结构以及在新蛋白质上的泛化能力方面面临挑战。
深度学习方法当前局限性的一个可能原因是它们依赖于粗粒度的、残基级别的蛋白质表示。理想情况下,更准确的全原子表示能够提供更高的精度,但计算需求也相应增加。传统的粗粒度表示往往会简化蛋白质结构,从而将配体构象搜索空间扩展到已被蛋白质原子占据的区域,可能导致分子间冲突。然而,近期的研究表明,结合蛋白质表面信息具有重要的益处,通过将蛋白质建模为具有几何和化学属性的连续形状,提供了更详细的表示。通过利用这些表面信息来更准确地描述结合口袋中的几何空间,预计能够减少分子间冲突的发生。此外,在基于序列的药物设计和蛋白质结构预测中的成功案例也突出了序列信息在蛋白质表示中的价值。基于这些洞察,作者假设,通过利用多模态蛋白质信息和先进的生成建模框架,可能能够解决当前分子对接中的问题,同时保持计算效率。
在本项工作中提出了 SurfDock,一种几何扩散网络,旨在生成可靠的配体结合构象。SurfDock 以蛋白质结合口袋和随机初始配体构象为条件,并包括一个内部评分模块 SurfScore,用于基于晶体蛋白质-配体复合物进行置信度评估。通过将多模态蛋白质信息(表面特征、残基结构特征和预训练的序列级特征)集成到表面节点级表示中,SurfDock 在多个基准测试中的对接成功率表现出色,包括 PDBbind 2020、Astex Diverse Set 和 PoseBusters 基准集。使用 PoseBuster 工具评估生成构象的合理性时,SurfDock 在构象合理性方面显著优于以往的深度学习方法。此外,SurfDock 还引入了一个可选的快速力场松弛步骤,用于蛋白质固定的配体优化,进一步提高了其准确性。这一改进使 SurfDock 在对接成功率和构象合理性方面超越了所有现有的深度学习和传统方法。此外,作者还发现,SurfDock 能够有效地泛化到新蛋白质。在研究的后半部分,对 SurfDock 在虚拟筛选基准数据集 DEKOIS2.0 上进行了全面评估。评估结果清晰地表明,SurfDock 不仅达到了现有对接方法的水平,而且在这一领域超越了它们。这一表现,加上其实际应用性和可靠性,使 SurfDock 成为 SBDD 社区的重要贡献。
2.1 模型框架
配体对接框架 SurfDock 主要由两个阶段组成:用于构象生成的扩散网络和评分模块(SurfScore),并辅以可选的对接后能量最小化模块。生成和评分模块采用相同的蛋白质-配体表示层。
对于蛋白质结合口袋的表示,SurfDock 采用了三层级的方法:序列级、残基图级和表面图。在前两个层级中,SurfDock 使用来自大型语言模型 ESM-2 和残基结构特征的嵌入表示残基。SurfDock 的独特之处在于其整合了结合位点的分子表面表示,这一表面通过 MaSIF 进行多边形网格化表示。该网格包含节点、边和面,这些共同定义了分子表面的形状,其中节点封装了化学和拓扑特征,边则表示节点之间的连接性。序列和残基图的嵌入随后映射到这一分子表面上,如下图 a 所示。SurfDock 中的配体被表示为 3D 原子级图,其中节点表示原子,边表示扩展的原子间距离。
如下图 b 所示,基于这些表示,第一阶段的几何扩散网络学习在结合口袋的条件下,细化(或去噪)一个随机初始化的配体构象。为了学习蛋白质-配体复合物的分布,使用 PDBbind2020 数据集训练扩散生成模块,该数据集包含了与蛋白质靶点结合的配体的实验性 3D 数据和结合亲和力数据,其中蛋白质的结合口袋作为生成配体构象的条件因子。扩散过程逐步向配体构象中引入噪声,涵盖小分子平移、旋转和扭转的变化,同时生成过程学习通过细化噪声改变的结构将配体构象恢复到其真实构象。
如下图 c 所示,第二阶段的评分模块 SurfScore 在表示层与扩散生成模块密切对接。这种集成与以往深度学习方法(如 DiffDock)有所不同,后者通常将构象生成和评分模块分别训练,且各自有不同的训练目标。例如,DiffDock 的评分模块是在二分类基础上进行训练,使用其构象生成模块产生的正负样本。此外,DiffDock 使用粗粒度表示来训练构象生成模块,而评分模块则使用全原子表示。与此不同,SurfScore 不仅与生成模块共享表示层,还共享其训练目标,专注于相同的晶体蛋白质-配体复合物,并通过混合全链接层网络进行评分。这一统一的方法旨在增强构象生成和评分阶段之间的协同效应,从而可能提高配体对接的表现。此外,通过为两个模块使用相同的表示和输入,方法消除了构象生成、格式转换和评分过程的分离需求,简化了整个流程。
SurfDock 的完整端到端配体对接流程包括对接、可选的对接后能量最小化和评分。初始时,模型识别蛋白质结合口袋并初始化由 RDKit 从输入的 2D 分子图或 SMILES(简化分子输入行系统)生成的用户定义数量的随机配体构象。这些随机构象随后通过反向扩散过程进行细化,得出最终构象。如果选择了能量最小化,这些构象将进一步在蛋白质结构的条件下进行细化。最后,SurfScore 对每个构象分配一个置信度评分,并按评分排序。对接-最小化-评分流程提供了一个可靠的系统,用于生成排序的对接构象。这个最小化阶段也可以仅应用于 SurfScore 所选择的 Top N 样本,以便实际应用。在实验中,即使没有对接后最小化阶段,SurfDock 也能实现最先进的对接成功率,彰显其鲁棒性和准确性。可选的最小化阶段进一步提升了配体的合理性,增强了本已卓越的性能。
2.2 模型性能
2.2.1 SurfDock 在多个准测试集上达到了最先进的对接性能
为了展示方法的有效性,作者选择了 PDBbind 2020 时间分割数据集作为基准。在这个数据集中,分子被严格划分,确保训练集和测试集之间没有重叠,从而有效避免了数据泄漏问题。该数据集包含了广泛的分子,包括肽类和小分子,为评估对接能力提供了一个全面的平台。如下表所示,SurfDock 在对接成功率(RMSD <= 2Å)上取得了 68.41% 的显著成绩,远远超过了其他深度学习和传统对接模型。此外,在使用 RMSD 小于 1Å 评估对接结果时,SurfDock 在这一严格标准下的表现依然显著优越,也达到了 37.7%。(即,对接结果中,有三分之一的体系,SurfaceDock 生成的 Pose 于晶体相差在1 A 以内,三分之二的体系 在 2 A 以内。
下图展示了 SurfDock 和传统方法分别在 PDBbind 2020 时间划分的测试集(左)和新颖蛋白(右)的性能表现。其中 SurfDock 的样本与传统对接方法相比,具有更多接近较小 RMSD 的样本。当将 PDBbind 2020 测试集中模型从未见过的新蛋白质分开时,SurfDock 仍然能在 Top1 样本的指标比较中超越所有方法。这个独立的数据集与训练集中的蛋白质没有“硬重叠”,意味着它们不具备相同的结构。这表明,SurfDock 通过融入多模态信息和扩散生成建模,显著提高了模型的泛化能力和对接成功率。
作者还使用 PoseBuster 工具进一步测试了生成姿势的合理性。SurfDock 在姿势合理性方面与传统方法相当。如果配备后对接最小化阶段,SurfDock 生成样本的合理性可以提高约 19% ,同时保持较高的对接成功率,大约在75% 到 90%。
为了更全面地评估 SurfDock 在类药物小分子上的效果,作者使用 PoseBusters 基准集和 Astex Diverse 集进行了评估,如下图所示。这些测试比较了不同方法生成姿势的合理性和泛化能力。值得注意的是,PoseBusters 基准集包含了 428 个 2021 年后发布的类药物分子复合物。考虑到常见的基于 PDBbind 2020 数据集训练的深度学习对接模型未曾接触过这些样本,因此这个数据集为方法比较提供了一个公平的基础。Astex Diverse 集是一个相对容易的集合,发布于 2007 年,其中大部分样本已经出现在 PDBbind 2020 训练集中。在这两个数据集中,SurfDock 在对接性能上显著领先,PoseBusters 集的成功率(图中的阴影条)为78%,Astex Diverse 集为 93% 。与其他深度学习方法相比,SurfDock 在对接成功率和配体有效性方面都表现出色。增加后对接最小化后,SurfDock 的成功率和有效性进一步提升(图中的实心条),超越了所有其他深度学习和传统对接方法。(注:考虑到同源化合物的情况,这些测试体系很有可能在训练集中有类似的,不代表面对真实虚拟筛选的能力)
此外,作者还在 PoseBuster 集上进行了评估,并按照与 PDBbind 2020 的蛋白质序列相似度进行了分类,如下图所示。序列相似度较低的组可以看作与训练集中的蛋白质没有“软重叠”。作者观察到,除了 SurfDock 外,所有其他深度学习方法在蛋白质序列相似度低于 30% 的情况下表现显著下降,无论姿势合理性如何。相反,SurfDock 的表现仅在熟悉蛋白质与不熟悉蛋白质之间有所下降,对接成功率变化不大,大概还保持在 75%。通过后对接最小化阶段的增强,SurfDock 在这些基准测试中的表现已经超越了深度学习和传统方法。SurfDock 在低序列相似度蛋白质上的一致表现凸显了其出色的泛化能力。这是一个至关重要的优势,特别是在实际虚拟筛选任务中,经常会遇到不熟悉的蛋白质靶标。SurfDock 所展示的鲁棒性和适应性,不仅强调了其可靠性,也突出了其在实际虚拟筛选任务中的潜力,在这些任务中,准确识别适合的新靶标的配体至关重要。考虑到 SurfDock 在增加最小化阶段后生成准确可靠的配体姿势的卓越表现,作者在以下实验中使用了最小化阶段。在接下来的实验中,作者提到的“SurfDock”指的是采用“Docking-Minimize-Scoring”策略的 SurfDock,除非另有说明。
2.2.2 评估 SurfDock 的采样效率、姿势选择能力及姿势生成与评分模块之间的协同作用
正如之前强调的,一个对接程序的有效性依赖于两个阶段:构象采样阶段和评分阶段。因此,作者对 SurfDock 的采样效率和 SurfScore 的评分准确性进行了独立评估,使用的是 PDBbind 2020 时间分割测试集。
为了辨别采样数量对整体性能的影响,作者分析了不同采样次数下的结果。具体来说,作者认为如果至少有一个实例符合预设的 RMSD 阈值,则该次采样视为成功。如下图所示,当采样数量达到 10 时,观察到随着额外采样的增加,性能提升的速度变得较慢。这表明,SurfDock 能够通过仅 10 次采样就识别出接近天然的配体构象。换句话说,如果采用 SurfaceDock 生成 10个 pose ,那么有 65% 左右的概率可以获得小分子 pose 与晶体 pose 相差小于 2 A 的构象。
接下来,评估了评分模块 SurfScore 的效能。下图显示,SurfScore 显著提升了 SurfDock 的性能。例如,每个配体生成一个样本时,对接成功率大约为 40% 。然而,生成 40 个样本并应用 SurfScore 选择最佳姿势后,对接成功率提升至 65% 以上。尽管这一结果与“完美选择”——即从所有样本中排名最高的最准确配体姿势——之间仍存在差距,但 SurfScore 目前的能力已足以满足实际应用。
为了更好地说明 SurfScore 如何捕捉蛋白质与配体之间的关键相互作用,作者在下图中展示了一个具体案例。在此案例中,作者分析了一个具有两个可旋转键的配体。通过将晶体配体姿势作为参考点,并改变扭转角度 ω1 和 ω2 ,作者观察了 SurfScore 的评分趋势。将这些评分解读为能量值,揭示了一个围绕参考姿势的能量景观,随着扭转角度的变化,局部最小值呈合理分布。
基于此,作者进一步探讨了对接和评分模块之间的一致性,因为它们共享相同的表示框架,并在相同的晶体蛋白质-配体复合物数据上分别训练。如下图所示,展示了对接输出及其对应的 SurfScore 评估的顺序记录。在 SurfDock 促成的对接过程中,作者注意到一个显著趋势:生成的配体姿势逐步趋向较低的能量状态(或更高的置信度)。这一过程通常涉及穿越并克服局部能量最小值,最终得到的对接姿势与 RDKit 对齐的姿势和晶体配体姿势越来越接近。需要澄清的是,RDKit 对齐的姿势指的是通过 RDKit 与晶体配体姿势对齐生成的构象,并作为作者扩散网络的训练目标。这个对齐姿势可以视为 SurfDock 生成模块在没有进一步精炼时的“理论极限”。然而,通过整合作者的后对接最小化策略,SurfDock 展现出了识别出在作者评分模块估算的能量上超越 RDKit 对齐姿势的配体姿势的潜力。
这些发现突出了对接和评分过程之间的有效协同作用,展示了它们在生成建模过程中捕捉关键蛋白质-配体相互作用的强大能力。尽管这两个模块的训练阶段是独立的,但它们高度一致的表现可以归因于它们共同的目标——学习晶体结构的分布,这可能在它们的协调表现中发挥了关键作用。
2.2.3 配体柔性对对接性能的影响
在分子对接中,配体的柔性对构象采样效率具有关键影响。随着配体中可旋转键和重原子的数量增加,配体柔性与对接性能之间的关系变得更加复杂,因为这扩展了潜在构象的搜索空间。作者统计了 PDBbind 2020 时间分割测试集中可旋转键和重原子的分布情况。结果发现,这些分布范围很广,可旋转键的数量从 0 到 75 个,重原子的数量从 6 到 150 个。因此,这个数据集中的配体柔性对于深度学习(DL)和传统的对接方法来说都具有挑战性。作者的实验结果,如下图 a 和 b 所示,验证了这一趋势,并与 Hou 等人的研究结果一致。作者观察到,当配体拥有 15 个或更多可旋转键,或者大约 35 个重原子时,传统对接方法的性能显著下降,特别是在 PDBbind 2020 时间分割测试集上。然而,SurfDock 在处理这些范围内的配体时表现出显著的能力,通常能够与传统方法相匹配或超越传统方法。另一方面,广泛认为大多数药物和类药物化合物通常包含少于 10 个可旋转键。在这个子集内,SurfDock 的表现尤为突出,成功率接近 80% ,相比传统方法提高了约 20% 。
作者将研究扩展到 PoseBusters 基准集,该数据集主要包含类药物分子。该数据集的可旋转键和重原子的分布较 PDBbind 2020 数据集小。根据类药物化合物的分子特性,SurfDock 在不同数量的可旋转键和重原子下表现出色,如下图 c 和 d 所示。这一表现不仅与作者从 PDBbind 2020 数据集中的观察结果一致,还明显显示出 SurfDock 在处理类药物分子时,至少与传统方法和其他基于深度学习的对接方法相当,甚至表现出更优异的性能。
这些结果凸显了 SurfDock 在药物发现过程中潜力的重要性。尽管这些结果令人鼓舞,但作者也意识到 SurfDock 在处理大分子(如肽类分子)时的局限性。这个局限性可能源自 PDBbind 数据集中缺乏大分子配体的训练数据。解决这一挑战将是未来研究的重点,旨在扩展 SurfDock 在分子对接中的适用性和有效性。
2.2.4 SurfDock可以作为虚拟筛选工具,展现出卓越的性能
为了进一步调查 SurfDock 的虚拟筛选能力,作者使用 DEKOIS 2.0 数据集进行了初步评估。该数据集包含了活性配体和无效诱饵分子,涵盖了 81 个不同的靶标。每个靶标关联 40 种活性化合物和 1200 种无效诱饵分子。这个多样化且具有挑战性的基准数据集,为测试 SurfDock 在辨别活性配体与诱饵分子方面的有效性提供了理想平台。
考虑到在实际虚拟筛选任务中效率非常重要,作者在此采用了“对接-评分-最小化-重新评分”的方法。具体来说,作者首先生成 40 个样本并选择前 10 个样本。接着,作者进一步对这 10 个选中的样本进行最小化,并使用专门为虚拟筛选任务训练的 SurfScore 版本对其重新评分,以便与其他方法进行公平比较。最后,作者选择 Top 1 样本进行评估。结果如下图所示,SurfDock 在当前的对接算法中表现出色。一个显著的亮点是,SurfDock 在 EF 0.5% 的指标上达到了 21.00。这在虚拟筛选中意义重大,尤其是在处理大量化合物库时。在这种情况下,对接算法的主要目标是优先排序或“富集”那些最可能是活性的化合物,从而减少需要在更具资源消耗的实验中进一步测试的化合物数量。SurfDock 在将活性候选分子识别并排在前列的能力,对于大规模虚拟筛选过程至关重要。这一成功与之前的基准结果一致,证明了 SurfDock 在生成准确可靠的配体构象方面的能力。相较之下,虽然 KarmaDock 可能生成不太合理的构象,但它在虚拟筛选任务中出人意料地优于像 Glide SP 这样的传统方法。如 KarmaDock 原文所述,尽管该算法的其他两个版本的构象 plausibility 较低,但在 DEKOIS2.0 数据集上的表现仍然有效。这些结果突显了需要更深入的研究和严格的基准测试,以理解影响对接算法在虚拟筛选中有效性的因素。
接下来,为了评估作者模块 SurfScore 的评分效能,作者使用传统方法生成的构象,并重新使用 SurfScore 评估它们的结合亲和力。此评估结果展示在下图中。将 Glide SP/Surflex-Dock 与 SurfScore 结合使用,显示出与 SurfDock 在所有评估指标上的相当表现,尽管 SurfDock 在 EF 0.5% 的指标上保持领先。这表明,Glide SP 和 Surflex-Dock 在 DEKOIS2.0 基准集上展现出强大的采样能力。与先前的研究结果一致,这些研究突出了 Glide SP 和 Surflex-Dock 在准确采样构象方面的有效性。此外,作者之前的实验,如在 PoseBusters 基准集上的结果所示,也证实了 Glide SP 作为对接算法的优势,特别是在构象较简单的配体组合的基准测试中。这一观察得到下图的支持,后者显示 DEKOIS 2.0 中的大多数配体和诱饵分子包含少于 20 个可旋转键。因此,SurfDock 与 Glide SP 在采样能力上表现相似是合理的。需要注意的是,在这次虚拟筛选实验中,作者选择了不那么精确的“对接-评分-最小化-重新评分”方法,以获得更高效的测试设置。作者预计,通过优化作者的工作流程,SurfDock 在实际虚拟筛选任务中的表现将进一步提升。
三、SurfDock 评测
3.1 下载数据集
在 ./data 文件夹中的文件包括基于时间划分的数据。如果想要训练模型,项目提供预处理好的数据。数据保存在 zenodo 网站,链接是:https://zenodo.org/record/6408497 ,网页截图如下所示:
下载 PDBBind.zip 并上传到 ./data 文件夹中,解压数据集,命令如下:
cd ./data
unzip PDBBind.zip
解压后的数据保存在 ./data/PDBBind_processed 文件夹中,目录结构如下所示。处理好的数据一共包括 19120 个 PDB ID 对应的蛋白。
.
|-- 1a0q
|-- 1a0t
|-- 1a1b
...
|-- 9icd
`-- 9lpr
19120 directories, 0 files
以其中的 1a0q 文件夹为例查看,处理后的数据,目录结构如下。1a0q_ligand.sdf 和 1a0q_ligand.mol2 是配体保存的两种格式结构文件。1a0q_protein_processed.pdb 是删除溶剂和配体等结构保存的蛋白质结构。每个蛋白处理对应的文件夹都包含三个类似的结构文件。
.
|-- 1a0q_ligand.mol2
|-- 1a0q_ligand.sdf
`-- 1a0q_protein_processed.pdb
0 directories, 3 files
3.2 安装环境
复制代码项目:
git clone https://github.com/CAODH/SurfDock.git
根据项目说明文档,创建 SurfDock 环境,安装 python==3.10 并进入环境,安装 mamba,后续主要通过 mamba 安装依赖库,命令如下:
conda create -y -n SurfDock python==3.10
conda activate SurfDock
conda install -y --channel=https://conda.anaconda.org/conda-forge --channel=https://conda.anaconda.org/pytorch --channel=https://conda.anaconda.org/pyg mamba && conda clean -ya
通过 mamba 安装 pytorch pytorch-cuda :
mamba install -y pytorch==2.2.0 pytorch-cuda=11.8 -c pytorch -c nvidia
通过 mamba 安装 numpy==1.20 scipy==1.8.1 pandas==2.1.2 等数据处理相关的依赖库,命令如下:
mamba install -y --channel=https://conda.anaconda.org/conda-forge --channel=https://conda.anaconda.org/pytorch --channel=https://conda.anaconda.org/pyg numpy==1.20 scipy==1.8.1 pandas==2.1.2 &&conda clean -ya
报错如下:
error libmamba Could not solve for environment specs
The following packages are incompatible
├─ numpy ==1.20 * is installable with the potential options
│ ├─ numpy 1.20.0 would require
│ │ └─ python >=3.7,<3.8.0a0 *, which can be installed;
│ ├─ numpy 1.20.0 would require
│ │ └─ python >=3.8,<3.9.0a0 *, which can be installed;
│ └─ numpy 1.20.0 would require
│ └─ python >=3.9,<3.10.0a0 *, which can be installed;
└─ pin on python 3.10.* =* * is not installable because it requires
└─ python =3.10 *, which conflicts with any installable versions previously reported.
critical libmamba Could not solve for environment specs
说明文档中指定的 numpy==1.20 兼容的 python 版本范围是 3.7-3.9,但当前环境中安装的是 python==3.10,所以这里先跳过安装 numpy,安装其他依赖库的时候,会自动匹配适配的版本。使用下面命令安装:
mamba install -y --channel=https://conda.anaconda.org/conda-forge --channel=https://conda.anaconda.org/pytorch --channel=https://conda.anaconda.org/pyg scipy==1.8.1 pandas==2.1.2 &&conda clean -ya
接着安装其他依赖库,命令如下:
mamba install -y --channel=https://conda.anaconda.org/conda-forge --channel=https://conda.anaconda.org/pytorch --channel=https://conda.anaconda.org/pyg openff-toolkit==0.15.2 openmm==8.1.1 openmmforcefields==0.12.0 pdbfixer==1.9 && conda clean -ya
mamba install -y --channel=https://conda.anaconda.org/conda-forge --channel=https://conda.anaconda.org/pytorch --channel=https://conda.anaconda.org/pyg babel==2.13.1 biopandas==0.4.1 openbabel==3.1.1 plyfile==1.0.1 prody==2.4.0 torch-ema==0.3 torchmetrics==1.2.1 && conda clean -ya
mamba install -y pyg -c pyg
mamba install loguru
通过 pip 安装 pyg_lib、torch_scatter、torch_sparse、torch_cluster、torch_spline_conv ,命令如下:
pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch-2.2.0+cu118.html
pip install -U --no-cache-dir spyrmsd scikit-learn==1.3.2 accelerate==0.15.0 biopython==1.79 e3nn==0.5.1 huggingface-hub==0.17.3 mdanalysis==2.4.0 posebusters==0.2.7 rdkit==2023.3.1 tokenizers==0.13.3 transformers==4.29.2 wandb==0.16.1
pip install pymesh
pip install dimorphite_dl
pip install prefetch_generator
安装 pymesh2
pip install https://github.com/nuvolos-cloud/PyMesh/releases/download/v0.3.1/pymesh2-0.3.1-cp310-cp310-linux_x86_64.whl
服务器访问超时,手动下载 pymesh2 的 whl 文件,下载链接是:https://github.com/nuvolos-cloud/PyMesh/releases/download/v0.3.1/pymesh2-0.3.1-cp310-cp310-linux_x86_64.whl ,下载后上传到 ./ 中,通过下面命令安装:
pip install pymesh2-0.3.1-cp310-cp310-linux_x86_64.whl
通过以下命令安装化学计算和数据处理需要的依赖库:
mamba install mx::reduce
mamba install conda-forge::openbabel
通过以下命令查看自动适配的 numpy 版本:
conda list numpy
返回结果如下,自动安装的 numpy 版本是 1.24.4 。
# Name Version Build Channel
numpy 1.24.4 py310ha4c1d20_0 conda-forge
根据说明文档项目运行所需的环境已经安装结束,接下来通过运行脚本测试环境是否可以正常使用:
python train_accelarete.py
注:由于环境比较复杂,更多报错及其解决方案可以看绑定的资源文档,或者后台联系要PDF。
3.3 对接构象生成案例测试
3.3.1 内置案例
项目把 1A0Q 蛋白作为内置的测试案例,配体在口袋中的构象如下所示,蛋白口袋位于表面,配体也有一部分处于溶剂区。
配体的 2D 结构如下所示:
提供处理好的蛋白结构和配体结构文件在 ./data/eval_sample_dirs/test_samples/1a0q 文件夹中,目录文件如下,包含 sdf 格式和 mol2 格式的配体结构文件和蛋白结构文件,蛋白结构已经删除溶剂配体等,只包含蛋白结构。
.
|-- 1a0q_ligand.mol2
|-- 1a0q_ligand.sdf
`-- 1a0q_protein_processed.pdb
0 directories, 3 files
项目准备了内置的测试案例,激活运行环境,进入测试脚本的文件夹,命令如下:
conda activate SurfDock
cd ./bash_scripts/test_scripts
项目提供 eval_samples.sh ,输入蛋白结构和配体结构,进行数据预处理,最后输出预测的对接构象,下面通过解析作者给的示例脚本(./bash_scripts/test_scripts/eval_samples.sh)梳理模型预测的整个流程。同时我们会修改脚本内容,以适应我们本地运行。
在脚本的开头设置输入输出的相关目录位置。通过 conda activate SurfDock 激活运行的虚拟环境,接着获取当前脚本的绝对路径(/workspace/XXXX/projects/SurfDock/bash_scripts/test_scripts/eval_samples.sh)。获取脚本的上上级目录,即项目路径(/workspace/XXXX/projects/SurfDock/),把路径赋给变量 SurfDockdir ,以便后续使用。打印 SurfDockdir ,以供检查路径是否正确。最后指定中间数据处理的临时文件的存放位置,temp 设置为脚本文件的四层上级目录,即 /workspace/XXXX/projects,模型临时文件路径设置为 /workspace/XXXX/projects/SurfDock 。
# This script is used to run SurfDock on test samples
conda activate SurfDock
path=$(readlink -f "$0")
SurfDockdir="$(dirname "$(dirname "$(dirname "$path")")")"
SurfDockdir=${SurfDockdir}
echo SurfDockdir : ${SurfDockdir}
temp="$(dirname "$(dirname "$(dirname "$(dirname "$path")")")")"
model_temp="$(dirname "$(dirname "$(dirname "$path")")")"
设置参数。设置了一个环境变量 precomputed_arrays,指定路径 /workspace/XXXX/projects/precomputed/precomputed_arrays 。我们的机器只有一个 GPU ,所以指定使用编号为 0 的 GPU 。根据 `gpu_array` 中的最后一个元素来设置 main_process_port ,这里是 29510 。我们把项目名称 project_name 设置为 SurfDock_eval_samples/repeat_1A0Q,后续输出的处理处理文件保存在该项目文件夹下。surface_out_dir 指定蛋白表面信息的 ply 文件的保存路径。data_dir 指定保存蛋白结构和配体结构的数据路径。out_csv_file 指定记录输入信息的表格保存的路径。esmbedding_dir 指定路径,用来存储 embedding 文件。
export precomputed_arrays="${temp}/precomputed/precomputed_arrays"
gpu_string="0"
echo "Using GPU devices: ${gpu_string}"
IFS=',' read -ra gpu_array <<< "$gpu_string"
NUM_GPUS=${#gpu_array[@]}
export CUDA_VISIBLE_DEVICES=${gpu_string}
main_process_port=2951${gpu_array[-1]}
project_name='SurfDock_eval_samples/repeat_1A0Q'
surface_out_dir=${SurfDockdir}/data/eval_sample_dirs/${project_name}/test_samples_8A_surface
data_dir=${SurfDockdir}/data/eval_sample_dirs/test_samples
out_csv_file=${SurfDockdir}/data/eval_sample_dirs/${project_name}/input_csv_files/test_samples.csv
esmbedding_dir=${SurfDockdir}/data/eval_sample_dirs/${project_name}/test_samples_esmbedding
创建并进入蛋白表面文件输出文件夹(surface_out_dir),通过 ./comp_surface/prepare_target/computeTargetMesh_test_samples.py 计算靶标蛋白的表面信息。--data_dir 指定要处理的蛋白和配体的结构文件所在的路径。--out_dir 指定生成的蛋白表面信息文件保存的路径。
mkdir -p $surface_out_dir
cd $surface_out_dir
command=`
python ${SurfDockdir}/comp_surface/prepare_target/computeTargetMesh_test_samples.py \
--data_dir ${data_dir} \
--out_dir ${surface_out_dir} \
`
state=$command
运行结束后,我们发现输出文件夹中没有生成蛋白表面信息。排查脚本发现是计算蛋白表面信息的程序(MSMS_BIN, PDB2PQR_BIN,APBS_BIN, MULTIVALUE_BIN)没有正确设置在环境变量中,项目使用的还是作者运行的机器的绝对路径,修改成我们的机器上的路径。即把 ./comp_surface/prepare_target/default_config/global_vars.py 中的
# global_vars.py: Global variables used by MaSIF -- mainly pointing to environment variables of programs used by MaSIF.
# Pablo Gainza - LPDI STI EPFL 2018-2019
# Released under an Apache License 2.0
import os
from IPython.core.debugger import set_trace
epsilon = 1.0e-6
import sys
os.environ['MSMS_BIN']= "/home/caoduanhua/softwares/transfer/APBS-3.4.1.Linux/bin/msms"
if 'MSMS_BIN' in os.environ:
msms_bin = os.environ['MSMS_BIN']
else:
set_trace()
print("ERROR: MSMS_BIN not set. Variable should point to MSMS program.")
sys.exit(1)
os.environ['PDB2PQR_BIN']="/home/caoduanhua/softwares/transfer/pdb2pqr-linux-bin64-2.1.1/pdb2pqr"
if 'PDB2PQR_BIN' in os.environ:
pdb2pqr_bin = os.environ['PDB2PQR_BIN']
else:
print("ERROR: PDB2PQR_BIN not set. Variable should point to PDB2PQR_BIN program.")
sys.exit(1)
os.environ['APBS_BIN']="/home/caoduanhua/softwares/transfer/APBS-3.4.1.Linux/bin/apbs"
if 'APBS_BIN' in os.environ:
apbs_bin = os.environ['APBS_BIN']
else:
print("ERROR: APBS_BIN not set. Variable should point to APBS program.")
sys.exit(1)
os.environ['MULTIVALUE_BIN']="/home/caoduanhua/softwares/transfer/APBS-3.4.1.Linux/share/apbs/tools/bin/multivalue"
if 'MULTIVALUE_BIN' in os.environ:
multivalue_bin = os.environ['MULTIVALUE_BIN']
else:
print("ERROR: MULTIVALUE_BIN not set. Variable should point to MULTIVALUE program.")
sys.exit(1)
class NoSolutionError(Exception):
pass
修改成:
# global_vars.py: Global variables used by MaSIF -- mainly pointing to environment variables of programs used by MaSIF.
# Pablo Gainza - LPDI STI EPFL 2018-2019
# Released under an Apache License 2.0
import os
from IPython.core.debugger import set_trace
epsilon = 1.0e-6
import sys
os.environ['MSMS_BIN']= "/workspace/tools/APBS-3.0.0.Linux/bin/msms"
if 'MSMS_BIN' in os.environ:
msms_bin = os.environ['MSMS_BIN']
else:
set_trace()
print("ERROR: MSMS_BIN not set. Variable should point to MSMS program.")
sys.exit(1)
os.environ['PDB2PQR_BIN']="/workspace/tools/pdb2pqr-linux-bin64-2.1.0/pdb2pqr"
if 'PDB2PQR_BIN' in os.environ:
pdb2pqr_bin = os.environ['PDB2PQR_BIN']
else:
print("ERROR: PDB2PQR_BIN not set. Variable should point to PDB2PQR_BIN program.")
sys.exit(1)
os.environ['APBS_BIN']="/workspace/tools/APBS-3.0.0.Linux/bin/apbs"
if 'APBS_BIN' in os.environ:
apbs_bin = os.environ['APBS_BIN']
else:
print("ERROR: APBS_BIN not set. Variable should point to APBS program.")
sys.exit(1)
os.environ['MULTIVALUE_BIN']="/workspace/tools/APBS-3.0.0.Linux/share/apbs/tools/bin/multivalue"
if 'MULTIVALUE_BIN' in os.environ:
multivalue_bin = os.environ['MULTIVALUE_BIN']
else:
print("ERROR: MULTIVALUE_BIN not set. Variable should point to MULTIVALUE program.")
sys.exit(1)
class NoSolutionError(Exception):
pass
根据原始蛋白和配体结构提取口袋结构(配体周围 8 Å 作为口袋),生成蛋白表面文件,输出文件保存在 ./data/eval_sample_dirs/SurfDock_eval_samples/repeat_1A0Q/test_samples_8A_surface/1a0q 中,如下:
.
|-- 1a0q_protein_processed_8A.pdb
`-- 1a0q_protein_processed_8A.ply
0 directories, 2 files
检查输入文件是否存在,如果不存在就抛出提醒,如果存在,把输入信息保存在一个 CSV 表格中,以供记录查询。命令如下:
command=` python \
${SurfDockdir}/inference_utils/construct_csv_input.py \
--data_dir ${data_dir} \
--surface_out_dir ${surface_out_dir} \
--output_csv_file ${out_csv_file} \
`
state=$command
检查输入文件都存在,没有缺失,把输入文件的路径保存在 ./data/eval_sample_dirs/SurfDock_eval_samples/repeat_1A0Q/input_csv_files/test_samples.csv 表格中,具体内容如下:
protein_path,pocket_path,ref_ligand,ligand_path,protein_surface
/workspace/XXXX/projects/SurfDock/data/eval_sample_dirs/test_samples/1a0q/1a0q_protein_processed.pdb,/workspace/XXXX/projects/SurfDock/data/eval_sample_dirs/SurfDock_eval_samples/repeat_1A0Q/test_samples_8A_surface/1a0q/1a0q_protein_processed_8A.pdb,/workspace/XXXX/projects/SurfDock/data/eval_sample_dirs/test_samples/1a0q/1a0q_ligand.sdf,/workspace/XXXX/projects/SurfDock/data/eval_sample_dirs/test_samples/1a0q/1a0q_ligand.sdf,/workspace/XXXX/projects/SurfDock/data/eval_sample_dirs/SurfDock_eval_samples/repeat_1A0Q/test_samples_8A_surface/1a0q/1a0q_protein_processed_8A.ply
下面,使用 ESM(Evolutionary Scale Modeling)模型来提取蛋白质的嵌入向量,并进一步处理这些嵌入向量以获取蛋白质口袋(pocket)的嵌入。它通过一系列的 Python 脚本执行步骤,最终将蛋白质口袋的 ESM 嵌入保存到文件中,方便后续使用。
定义文件路径和变量。
esm_dir:指向 ESM 模型所在目录。
sequence_out_file:输出的 FASTA 格式文件路径,其中包含了蛋白质的氨基酸序列。
protein_pocket_csv:包含蛋白质口袋信息的 CSV 文件。
full_protein_esm_embedding_dir:存储完整的蛋白质 ESM 嵌入的目录。
pocket_emb_save_dir:存储蛋白质口袋嵌入的目录。
pocket_emb_save_to_single_file:最终保存的包含所有蛋白质口袋嵌入的单个文件路径。
esm_dir=${SurfDockdir}/esm
sequence_out_file="${esmbedding_dir}/test_samples.fasta"
protein_pocket_csv=${out_csv_file}
full_protein_esm_embedding_dir="${esmbedding_dir}/esm_embedding_output"
pocket_emb_save_dir="${esmbedding_dir}/esm_embedding_pocket_output"
pocket_emb_save_to_single_file="${esmbedding_dir}/esm_embedding_pocket_output_for_train/esm2_3billion_pdbbind_embeddings.pt"
提取蛋白质序列(FASTA格式)。调用 esm_embedding_preparation.py 脚本,提取蛋白质的氨基酸序列,并将其保存为 FASTA 格式的文件(test_samples.fasta )。--protein_ligand_csv 参数指向包含蛋白质和配体信息的 CSV 文件,即上一步生成的 test_samples.csv 表格。
# get faste sequence
command=`python ${SurfDockdir}/datasets/esm_embedding_preparation.py \
--out_file ${sequence_out_file} \
--protein_ligand_csv ${protein_pocket_csv}`
state=$command
生成蛋白质的 ESM 嵌入。通过 ESM 模型生成蛋白质的嵌入向量。使用的是 ESM2 模型(esm2_t33_650M_UR50D.pt)。
--repr_layers 33:指定模型的表示层,表示从模型的第 33 层提取嵌入。
--include "per_tok:每个 token(氨基酸)都包括在嵌入中。
--truncation_seq_length 4096:限制序列的最大长度为 4096 个氨基酸,以避免内存溢出。
生成的嵌入将保存在 full_protein_esm_embedding_dir 文件夹中。
# esm embedding preprateion
command=`python ${esm_dir}/scripts/extract.py \
"${esm_dir}/model_weights/.cache/torch/hub/checkpoints/esm2_t33_650M_UR50D.pt" \
${sequence_out_file} \
${full_protein_esm_embedding_dir} \
--repr_layers 33 \
--include "per_tok" \
--truncation_seq_length 4096`
state=$command
映射蛋白质口袋的 ESM 嵌入。从之前生成的蛋白质嵌入中提取与蛋白质口袋相关的嵌入向量。get_pocket_embedding.py 脚本将根据 CSV 文件中的口袋信息,映射出蛋白质口袋的嵌入,并将它们保存到 pocket_emb_save_dir 。
# map pocket esm embedding
command=`python ${SurfDockdir}/datasets/get_pocket_embedding.py \
--protein_pocket_csv ${protein_pocket_csv} \
--embeddings_dir ${full_protein_esm_embedding_dir} \
--pocket_emb_save_dir ${pocket_emb_save_dir}`
state=$command
将口袋嵌入保存为单个文件。最后将从 pocket_emb_save_dir 中提取到的所有口袋嵌入,保存到一个单独的文件中,路径为 pocket_emb_save_to_single_file 。该文件将用于后续的训练或其他分析任务。
# save pocket esm embedding to single file
command=`python ${SurfDockdir}/datasets/esm_pocket_embeddings_to_pt.py \
--esm_embeddings_path ${pocket_emb_save_dir} \
--output_path ${pocket_emb_save_to_single_file}`
state=$command
运行上面的命令获取蛋白质的嵌入向量,报错如下。原因是没有安装 ESM 。
python: can't open file '/workspace/XXXX/projects/SurfDock/esm/scripts/extract.py': [Errno 2] No such file or directory
通过下面命令复制并安装 ESM,保存在项目的主目录 ./ :
git clone https://github.com/facebookresearch/esm
cd esm
pip install -e .
下载 ESM 模型文件,链接是:https://dl.fbaipublicfiles.com/fair-esm/models/esm2_t33_650M_UR50D.pt 。下载 esm2_t33_650M_UR50D-contact-regression.pt,链接是:https://dl.fbaipublicfiles.com/fair-esm/regression/esm2_t33_650M_UR50D-contact-regression.pt 。下载后上传到 ./esm/model_weights/.cache/torch/hub/checkpoints/ 文件夹中。
至此,成功通过 ESM 生成蛋白质的嵌入向量。
采样配体。启动一个用于配体构象采样(Ligand Conformers Sampling)的过程,是配体-蛋白质对接(docking)任务中的一部分。它通过一个基于扩散模型的推理流程,结合配体预测信心模型,生成不同的配体构象,并进行对接结果保存和评估。
定义路径和变量。这些变量定义了输入和输出文件的路径以及一些超参数。
diffusion_model_dir:指向用于对接任务的扩散模型权重目录。
confidence_model_base_dir:指向用于评估配体姿态预测信心的模型权重目录。
protein_embedding:蛋白质的嵌入文件路径,使用之前步骤中的口袋嵌入(`esm_embedding_pocket_output_for_train/esm2_3billion_pdbbind_embeddings.pt`)。
test_data_csv:测试数据的CSV文件,包含了蛋白质-配体数据。
diffusion_model_dir=${model_temp}/model_weights/docking
confidence_model_base_dir=${model_temp}/model_weights/posepredict
protein_embedding=${pocket_emb_save_to_single_file}
test_data_csv=${out_csv_file}
设置MDN距离阈值和版本。定义了 MDN(Mixture Density Network,混合密度网络)距离阈值,并指定了一个数组 dist_arrays=(3) ,用来循环测试不同的距离阈值。
mdn_dist_threshold_test=3.0:初始的距离阈值设定为 3.0,表示对接过程中的最大接受距离(比如,配体和蛋白质之间的距离)。
version=6:版本号,这可能是模型的版本或实验的标识。
dist_arrays=(3):这个数组用于后续的循环,测试不同的MDN阈值。
mdn_dist_threshold_test=3.0
version=6
dist_arrays=(3)
启动配体构象采样过程。这部分是循环执行配体构象采样的主要代码:
for i in ${dist_arrays[@]}:通过遍历 dist_arrays 数组中的值,来测试不同的 MDN 距离阈值。在这个例子中,只有一个值 3 ,但该结构支持多个测试。
accelerate launch:accelerate`是一个用于加速深度学习模型训练和推理的工具,尤其是在多GPU环境下。在这里, accelerate 会启动分布式推理,我们的机器只有一个 GPU,也可以正常使用。下面介绍运行时的主要参数:
--multi_gpu:启用多 GPU 训练或推理。
--main_process_port ${main_process_port}:用于指定主进程的端口,用于多进程通信。
--num_processes ${NUM_GPUS}:使用的 GPU 数量。
--data_csv ${test_data_csv}:提供测试数据的CSV文件,包含了配体-蛋白质对接任务的输入数据。
--model_dir ${diffusion_model_dir}:指向扩散模型的目录,里面包含了模型权重。
--ckpt best_ema_inference_epoch_model.pt:选择的最佳模型权重。
--confidence_model_dir ${confidence_model_base_dir}:指向信心模型的目录,帮助判断配体姿态的质量。
--confidence_ckpt best_model.pt:选择的信心模型权重。
--save_docking_result:指示是否保存对接结果。
--mdn_dist_threshold_test ${mdn_dist_threshold_test}:配体-蛋白质对接中 MDN 的距离阈值(从 dist_arrays 中获取)。
--esm_embeddings_path ${protein_embedding}:蛋白质的 ESM 嵌入路径,之前已经生成。
--run_name ${confidence_model_base_dir}_test_dist_${mdn_dist_threshold_test}:运行名称,通常用于实验跟踪。
--project ${project_name}:项目名称。
--out_dir ${temp}/SurfDock/output/${project_name} :保存对接结果的输出目录。
--batch_size 40:每批次的样本数。
--batch_size_molecule 1:每个分子使用一个样本。
--samples_per_complex 40:每个复合体(蛋白质-配体)生成 40 个样本。
--save_docking_result_number 40:保存的对接结果数目。
--head_index 0 --tail_index 10000:设置对接任务的样本范围(可能是数据子集的范围)。
--inference_mode evaluate:启动评估模式,进行推理。
--wandb_dir ${temp}/docking_result/test_workdir:结果保存的工作目录,用于跟踪实验(如果使用了 Weights & Biases 进行实验管理)。
do
mdn_dist_threshold_test=${i}
command=`accelerate launch \
--multi_gpu \
--main_process_port ${main_process_port} \
--num_processes ${NUM_GPUS} \
${SurfDockdir}/inference_accelerate.py \
--data_csv ${test_data_csv} \
--model_dir ${diffusion_model_dir} \
--ckpt best_ema_inference_epoch_model.pt \
--confidence_model_dir ${confidence_model_base_dir} \
--confidence_ckpt best_model.pt \
--save_docking_result \
--mdn_dist_threshold_test ${mdn_dist_threshold_test} \
--esm_embeddings_path ${protein_embedding} \
--run_name ${confidence_model_base_dir}_test_dist_${mdn_dist_threshold_test} \
--project ${project_name} \
--out_dir ${temp}/SurfDock/output/${project_name} \
--batch_size 40 \
--batch_size_molecule 1 \
--samples_per_complex 40 \
--save_docking_result_number 40 \
--head_index 0 \
--tail_index 10000 \
--inference_mode evaluate \
--wandb_dir ${temp}/docking_result/test_workdir`
state=$command
运行打印如下:
SurfDockdir : /workspace/XXXX/projects/SurfDock
Using GPU devices: 0
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 10866.07it/s]
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 5.49it/s]
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 13486.51it/s]
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 20.21it/s]
0/1 done!: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 10.45it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 1431.99it/s]
The following values were not passed to `accelerate launch` and had defaults used instead:
`--num_machines` was set to a value of `1`
`--mixed_precision` was set to a value of `'no'`
`--dynamo_backend` was set to a value of `'no'`
To avoid this warning pass in values for each of the problematic parameters or run `accelerate config`.
2024-12-08 10:13:26.151 | INFO | __main__:<module>:90 - Runing inference script in path: /workspace/XXXX/projects/SurfDock/data/eval_sample_dirs/SurfDock_eval_samples/repeat_1A0Q/test_samples_8A_surface
2024-12-08 10:13:26.151 | INFO | __main__:<module>:91 - Runing inference with args: Namespace(config=None, data_csv='/workspace/XXXX/projects/SurfDock/data/eval_sample_dirs/SurfDock_eval_samples/repeat_1A0Q/input_csv_files/test_samples.csv', model_dir='/workspace/XXXX/projects/SurfDock/model_weights/docking', ckpt='best_ema_inference_epoch_model.pt', confidence_model_dir='/workspace/XXXX/projects/SurfDock/model_weights/posepredict', confidence_ckpt='best_model.pt', save_docking_result=True, ligand_to_pocket_center=False, keep_input_pose=False, use_noise_to_rank=False, num_cpu=None, run_name='/workspace/XXXX/projects/SurfDock/model_weights/posepredict_test_dist_3', project='SurfDock_eval_samples/repeat_1A0Q', surface_path='~/PDBBind_processed_8A_surface/', esm_embeddings_path='/workspace/XXXX/projects/SurfDock/data/eval_sample_dirs/SurfDock_eval_samples/repeat_1A0Q/test_samples_esmbedding/esm_embedding_pocket_output_for_train/esm2_3billion_pdbbind_embeddings.pt', out_dir='/workspace/XXXX/projects/SurfDock/output/SurfDock_eval_samples/repeat_1A0Q', batch_size=40, batch_size_molecule=1, cache_path='~/PDBBIND/cache_PDBBIND_pocket_8A', data_dir='~/PDBBIND/PDBBind_pocket_8A/', split_path='~/data/splits/timesplit_test', no_overlap_names_path='~/data/splits/timesplit_test_no_rec_overlap', no_model=False, no_random=False, no_final_step_noise=False, ode=False, wandb=False, wandb_dir='/workspace/XXXX/projects/docking_result/test_workdir', inference_steps=20, limit_complexes=0, num_workers=1, num_process=20, tqdm=False, save_visualisation=False, samples_per_complex=40, save_docking_result_number=40, actual_steps=None, inference_mode='evaluate', head_index=0, tail_index=10000, ligandsMaxAtoms=80, random_seed=42, force_optimize=False, mdn_dist_threshold_test=3.0)
2024-12-08 10:13:29.019 | INFO | __main__:main_function:165 - loaded model weight for score model
2024-12-08 10:13:31.695 | INFO | __main__:main_function:188 - t schedule:[1. 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.5 0.45 0.4 0.35
0.3 0.25 0.2 0.15 0.1 0.05]
2024-12-08 10:13:31.696 | INFO | __main__:main_function:189 - Loading data ...........
0%| | 0/1 [00:00<?, ?it/s]2024-12-08 10:13:31.706 | INFO | score_in_place_dataset.score_dataset:get_complex:161 - ligs: /workspace/XXXX/projects/SurfDock/data/eval_sample_dirs/test_samples/1a0q/1a0q_ligand.sdf
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 22.79it/s]
2024-12-08 10:13:31.750 | INFO | score_in_place_dataset.score_dataset:get_complex:171 - Processing 1a0q | 0/1 [00:00<?, ?it/s]
2024-12-08 10:13:31.773 | INFO | datasets.process_mols:extract_receptor_structure:359 - Found 44 LM embeddings for 44 residues
2024-12-08 10:13:32.179 | INFO | __main__:main_function:260 - Protein 1a0q_protein_processed_8A Size of test dataset: 1
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:11<00:00, 11.73s/it]
2024-12-08 10:13:44.284 | INFO | __main__:main_function:441 - Protein 1a0q_protein_processed_8A used time: 12.585251808166504█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:11<00:00, 11.73s/it]
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:12<00:00, 12.59s/it]
2024-12-08 10:13:44.284 | INFO | __main__:main_function:445 - Docking time used for one moleculer: 12.586121082305908
2024-12-08 10:13:44.285 | INFO | __main__:main_function:446 - Docking time used: 12.586121082305908
2024-12-08 10:13:44.285 | INFO | __main__:main_function:447 - Sampling conformers number: 40
2024-12-08 10:13:44.285 | INFO | __main__:main_function:448 - Output conformers number: 40
2024-12-08 10:13:44.285 | INFO | __main__:main_function:449 - Docking output molecule number: 1
脚本运行耗时大约 1 分钟,batch_size 设置为 40,最大显存占用约为 3.5 GB。预测的对接构象保存在 ./output/SurfDock_eval_samples/repeat_1A0Q/SurfDock_docking_result/1a0q_protein_processed_8A_1a0q_ligand 中,其内容包括:
.
├── SurfDock_docking_result
│ └── 1a0q_protein_processed_8A_1a0q_ligand # 40个分子构象文件夹
└── test_samples_head_0_tail_10000_confidence_on_device_cuda:0.csv
2 directories, 1 file
其中, 1a0q_protein_processed_8A_1a0q_ligand 文件夹包含了生成的 40 个对接构象,程序计算了和原始配体的 RMSD ,也计算了构象的打分。生成的构象文件如下,文件名中包含了 RMSD 和 confidence 打分数值,以及根据打分的排名(rank_num)。
.
|-- 1a0q_1a0q_ligand_1a0q_ligand.sdf_file_inner_idx_0_sample_idx_0_rank_29_rmsd_1.1889922989879078_confidence_172.03576118110234.sdf
|-- 1a0q_1a0q_ligand_1a0q_ligand.sdf_file_inner_idx_0_sample_idx_10_rank_12_rmsd_0.8470252315770608_confidence_254.63562784179754.sdf
|-- 1a0q_1a0q_ligand_1a0q_ligand.sdf_file_inner_idx_0_sample_idx_11_rank_26_rmsd_0.8431761414177079_confidence_183.74411559589583.sdf
...
|-- 1a0q_1a0q_ligand_1a0q_ligand.sdf_file_inner_idx_0_sample_idx_8_rank_21_rmsd_0.66152336719217_confidence_205.9979042059361.sdf
`-- 1a0q_1a0q_ligand_1a0q_ligand.sdf_file_inner_idx_0_sample_idx_9_rank_24_rmsd_1.1790995024174815_confidence_198.2011924743954.sdf
0 directories, 40 files
打分排名前三的对接构象的 RMSD 分别为: 0.81、0.44 和 1.04,模型给出的置信度分别为:349,327,319。打分前三的小分子对接构象,在口袋中的位置如下,蓝色表示参考构象。模型预测的对接构象和参考构象基本一致,预测表现良好。
3.3.2 自定义案例(ABL1)
为了测试 SurfaceDock 的真实对接能力,我们设置了 ABL1 体系。6HD6_allo_protein.pdb,属于 Holo 结构,在此结构中,存在两个小分子,一个底物小分子抑制剂 Imatinib,另一个是变构小分子 Compound 6。除了底物分子 Imatinib 和 变构分子 Compound 6,我们还找到了如下分子。其中, Compound 5 和 Compound 7 均属于变构分子,且活性与 Compound 6 有明显的区别。Compound N 则是来源于非激酶体系的变构小分子,是肯定不能结合在底物或者变构位点的。
我们对 SurfDock 的测试在 ABL1 的变构口袋进行。创建 ./data/eval_sample_dirs/ABL1 文件夹,里面存放要对接的 4 个化合物(Compound 5 , Compound 6, Compound 7, Compound N)以及蛋白结构,目录如下:
.
|-- cpd5
| |-- cpd5_ligand.sdf
| `-- cpd5_protein_processed.pdb
|-- cpd6
| |-- cpd6_ligand.sdf
| `-- cpd6_protein_processed.pdb
|-- cpd7
| |-- cpd7_ligand.sdf
| `-- cpd7_protein_processed.pdb
`-- cpdN
|-- cpdN_ligand.sdf
`-- cpdN_protein_processed.pdb
4 directories, 8 files
和内置案例类似,我们也创建 ./bash_scripts/test_scripts/eval_samples_ABL1.sh 脚本处理输入结构,输出对接构象。与内置案例不同的是项目名称(project_name)和数据路径(data_dir),如下所示。除此之外的内容和内置案例一样。
project_name='SurfDock_eval_samples/repeat_ABL1'
data_dir=${SurfDockdir}/data/eval_sample_dirs/ABL1
运行脚本处理数据并预测对接构象:
conda activate SurfDock
cd ./bash_scripts/test_scripts
bash eval_samples_ABL1.sh
脚本运行耗时大约 2 分钟,batch_size 设置为 40,最大显存占用约为 4 GB。脚本输出结果保存在 ./output/SurfDock_eval_samples/repeat_ABL1/SurfDock_docking_result 文件夹中,目录如下,每个分子生成 40 个构象。生成的构象文件名中包含了 RMSD 和 confidence 打分数值,以及根据打分的排名(rank_num)。
.
|-- cpd5_protein_processed_8A_cpd5_ligand
|-- cpd6_protein_processed_8A_cpd6_ligand
|-- cpd7_protein_processed_8A_cpd7_ligand
`-- cpdN_protein_processed_8A_cpdN_ligand
4 directories, 0 files
化合物5的结果
打分 TOP 3 的分子构象在口袋中的位置如下(蓝色是参考分子化合物 6 的晶体结构):
这三个对接构象和化合物 6 晶体结构的 RMSD 和 SurfDock 置信度打分如下表所示:
RMSD | SurfDock 置信度打分 | |
1 | 0.37 | 210.51 |
2 | 0.59 | 209.42 |
3 | 0.56 | 195.53 |
化合物6 的结果
构象 1 与 2 和 3 的 RMSD 分别为 0.64 和 0.63,构象 2 和 3 的 RMSD 为 0.45 。打分 TOP 3 的分子构象在口袋中的位置如下(蓝色是参考分子化合物 6 的晶体结构):
所有分子的对接构象和晶体结构的朝向和位置基本一致,三氟甲基的尾巴叠合很好。
下面展示化合物 6 的晶体结构(蓝色)和对接构象(黄色),对结构象和晶体结构的位置和朝向是一致的,两个构象基本一样,只有靠近溶剂区的片段有轻微摆动,整体预测效果良好。
化合物 5 (紫红色)和 7 (浅粉色)的对接构象、化合物 6 的晶体结构(蓝色)如下所示,口袋中相同的片段基本重合,溶剂区的片段比较灵活摆动。
化合物 N (灰色)和化合物 6 (蓝色)的 2D 结构存在较大差异,所以构象也是差异最大的。
使用 ./pb_screen_mols.py 脚本,通过 PoseBusters 检查分子的对接构象在化学和物理方面的有效性(该脚本的详细介绍可以参考之前介绍 FlexPose 的文章)。创建 ./ABL1_output/ 文件夹,把预测的 TOP 1 构象复制到该文件夹。
以下是 SurfaceDock 在变构口袋上预测的各个小分子与晶体中 Compound 6 的最大公共子片段 RMSD,PoseBusters 检查通过情况以及与原本的 Kd、IC50,具体见下表:
IC50 (uM) | Kd (uM) | RMSD | PoseBusters check | SurfDock 置信度打分 | |
Compound 5 | / | 10 | 0.37 | True | 210.51 |
Compound 6 | 550 | 2 | 0.33 | True | 238.95 |
Compound 7 | 0.0023 | <2 | 0.64 | True | 289.78 |
Compound N | False | False | 1.51 | True | 182.96 |
通过内置案例和自定义案例的测试结果,我们发现 SurfaceDock 预测模型的表现良好。因为根据参考化合物指定了 8 Å 的口袋,并利用了口袋表面信息,限制了化合物的构象空间,所以没有出现和蛋白质口袋残基空间冲突的问题,并且在口袋中的片段和参考构象基本一致。
四、总结
在本文中,作者介绍了 SurfDock ,一种几何扩散网络,旨在生成可靠的配体结合构象,仅需要输入于蛋白质口袋和配体的二维图或 SMILES 结构。SurfDock 还整合了一个全面的内部评分模块 SurfScore,用于置信度估计,适用于虚拟筛选任务。
在文章中,SurfDock 在多个基准测试中展现了卓越的表现,包括 PDBbind 2020 时间分割集、Astex Diverse 集和 PoseBusters 基准集。在模型中,SurfDock 将多模态蛋白质信息(包括表面特征、残基结构和预训练的序列级特征)整合成一个一致的表面节点级表示,这一能力对实现高对接成功率和改善构象合理性起到了重要作用。SurfDock 的另一个特点是其可选的弛豫(构象优化),旨在进行蛋白质固定配体优化,从而显著提高其准确性。这个特性与构象生成和评分功能结合,使得 SurfDock 在对接成功率和构象合理性方面超越了现有的深度学习和传统方法。
在我们的测试中,SurfDock 在 ABL1 体系中,生成的小分子构象还是比较合理的,同时生成的结合模式与晶体非常接近(和之前提到的 UniMol Docking V2 类似),但是 SurfDock 提供了打分模块,可用于虚拟筛选(使用之前需要评测一下)。