技术背景

在前面的几篇文章中,我们分别介绍了MindSponge的软件架构MindSponge的安装与使用如何在MindSponge中定义一个分子系统。那么就像深度学习中的损失函数,或者目标函数,这里分子力学的主要目标函数就是势能(也有动能项,但动能项更多的来源于分子动力学模拟的过程,而不是实验中的参数)。这篇文章我们主要探讨一下,在MindSponge中如何计算给定体系的单点能。

浅析ForceField类

ForceField是用于构建分子力场的基础类,首先我们还是来看一下ForceField这个类的内部实现,主要关注下需要哪些输入,以及这些输入的含义是什么。

class ForceField(ForceFieldBase):
r"""Potential energy of classical force field. It is a subclass of `ForceFieldBase`. The `ForceField` class use force field parameter files to build the potential energy. Args: system (Molecule): Simulation system. parameters (Union[dict, str, List[Union[dict, str]]]):
Force field parameters. It can be a `dict` of force field parameters,
a `str` of filename of a force field file in MindSPONGE YAML format,
or a `list` or `tuple` containing multiple `dict` or `str`.
If a filename is given, it will first look for a file with the same name
in the current directory. If the file does not exist, it will search
in MindSPONGE's built-in force field.
If multiple sets of parameters are given and the same atom type
is present in different parameters, then the atom type in the parameter
at the back of the array will replace the one at the front. cutoff (float): Cutoff distance. Default: None rebuild_system (bool): Whether to rebuild the atom types and bond connection of the system
based on the template in parameters.
Default: True length_unit (str): Length unit. If None is given, it will be assigned with the global length unit.
Default: None energy_unit (str): Energy unit. If None is given, it will be assigned with the global energy unit.
Default: None Returns: energy (Tensor): Tensor of shape `(B, E)`. Data type is float. Supported Platforms: ``Ascend`` ``GPU`` Symbols: B: Batchsize, i.e. number of walkers in simulation.
E: Number of energy terms. """

在这里面重点关注下这三个输入信息:

  1. 分子系统。这里面包含了原子类型、成键关系等构建力场所必须的参数,因此我们可以直接把构建好的Molecule对象直接传入ForceField。
  2. 力场参数。我们已经在MindSponge内部转化了一些常用的Amber力场参数文件,包含amber.ff03,amber.ff14sb,amber.ff96和amber.gaff等,还有两个常用的水分子力场spce和tip3p。我们在构建ForceField对象的时候,只需要用字符串给parameters这一项赋值即可调用相关的力场文件。如果是自己做了一个力场文件,那么传入该力场文件的绝对路径即可。能被成功调用的前提条件是,完全按照MindSponge的力场文件格式要求做的力场。
  3. 截断半径。在力场里面的长程相互作用力的计算中会使用到近邻表的计算,因为对大体系而言我们不太可能考虑全连接图,因此需要用一个截断半径对长程相互作用的范围进行一定的截断。

除了ForceField类之外,我们还需要关注一个相关的类是MindSponge中的WithEnergyCell,这也是在计算单点能中一个非常重要的类。

class WithEnergyCell(Cell):
r"""
Cell that wraps the simulation system with the potential energy function.
This Cell calculates the value of the potential energy of the system at the current coordinates and returns it. Args:
system(Molecule): Simulation system.
potential(PotentialCell): Potential energy function cell.
bias(Union[Bias, List[Bias]]): Bias potential function cell. Default: None
cutoff(float): Cut-off distance for neighbour list. If None is given, it will be assigned
as the cutoff value of the of potential energy.
Defulat: None
neighbour_list(NeighbourList): Neighbour list. Default: None
wrapper(EnergyWrapper): Network to wrap and process potential and bias.
Default: None Inputs:
- **\*inputs** (Tuple(Tensor)) - Tuple of input tensors of 'WithEnergyCell'. Outputs:
energy, Tensor of shape `(B, 1)`. Data type is float. Total potential energy. Supported Platforms:
``Ascend`` ``GPU`` Symbols:
B: Batchsize, i.e. number of walkers of the simulation.
A: Number of the atoms in the simulation system.
N: Number of the maximum neighbouring atoms.
U: Number of potential energy terms.
V: Number of bias potential terms.
"""

在前面一部我们构建好的ForceField里面,实际上更多的是建模过程,在分子构象空间和拓扑连接性上面查找相应的对象,并匹配到相应的力场参数,最终作为一个能量计算环节的参数输入。而WithEnergyCell则可以根据system和forcefield两者提供的信息,直接计算能量。关于WithEnergyCell类的输入,我们重点关注下这几个参数:

  1. 分子系统。就是前面构造好的system参数,或者Molecule对象。
  2. 力场模型。根据上一个介绍的ForceField类中构建的力场模型,有了这个力场模型,就可以直接计算各项力场的能量和力的大小。
  3. 偏置势。这一项虽然看起来只是一个参数,但其实最能够体现使用AI框架来做分子动力学模拟的优势,后面会专门写一篇文章来介绍。其主要作用是添加一些偏置势能项,用于约束分子系统,向期望的方向演化。比如我们可以添加一个球形谐振子势,把体系约束在一个给定体积大小的球体中。也可以通过bias添加Meta Dynamics,用于快速模拟化学反应的过程。
  4. 近邻表。相比于给定一个cutoff,这里给定一个近邻表会更加直接。由于近邻表在分子模拟的过程中有可能直接决定了分子模拟的速度,或者是可模拟体系的大小,因为近邻表所产生的最大Tensor维度有可能为(B,A,N,D),是所有Tensor中最大的。熟悉GPU计算的童鞋可能都知道,在GPU上占用显存过大有可能导致不可计算的问题。
  5. 修饰器。wrapper这个参数,为力场的使用增添了许多的灵活性。跟bias的功能是很相似的,但是bias相当于是添加了一个新的势能函数,而wrapper则是直接对原始力场的能量进行修饰。

以上,就是ForceField和WithEnergyCell的基本介绍,有了这两个工具,我们就可以导入一些已有的力场,来完成单点能的计算。

计算单点能

给定一个初始的分子构象,求这个构象的分子势能。一般情况,这个问题可能需要通过计算化学的方式来进行求解,比如CCSD(T)之类的方法。但是我们做分子模拟,需要快速的演化和迭代,如果使用计算化学的方法,速度是无法满足计算的需求的。因此将实验数据或者是计算化学的数据拟合成一系列的力场参数,目前来说还是一个相对比较快速而且不损失太多精度的方案。接下来我们展示一下如何使用MindSponge来计算单点能。

from sponge import Protein, ForceField, WithEnergyCell
system = Protein('case1.pdb', rebuild_hydrogen=True)
energy = ForceField(system, parameters='amber.ff14sb')
with_energy = WithEnergyCell(system, energy)
print (with_energy.energy_names)
print (with_energy.calc_energies())

在上面这个案例中,先是用MindSponge内置的Protein类加载了case1.pdb这个案例作为示例。这个pdb文件的内容为:

REMARK   Generated By Xponge (Molecule)
ATOM 1 N ALA 1 -0.095 -11.436 -0.780
ATOM 2 CA ALA 1 -0.171 -10.015 -0.507
ATOM 3 CB ALA 1 1.201 -9.359 -0.628
ATOM 4 C ALA 1 -1.107 -9.319 -1.485
ATOM 5 O ALA 1 -1.682 -9.960 -2.362
TER

运行结束之后会在case1.pdb同路径下生成一个补氢的文件case1_addH.pdb,内容如下所示:

MODEL     1
ATOM 1 N ALA A 1 -0.095 -11.436 -0.780 1.0 0.0 N
ATOM 2 CA ALA A 1 -0.171 -10.015 -0.507 1.0 0.0 C
ATOM 3 CB ALA A 1 1.201 -9.359 -0.628 1.0 0.0 C
ATOM 4 C ALA A 1 -1.107 -9.319 -1.485 1.0 0.0 C
ATOM 5 O ALA A 1 -1.682 -9.960 -2.362 1.0 0.0 O
ATOM 6 H ALA A 1 -0.994 -11.866 -0.701 1.0 0.0 H
ATOM 7 HA ALA A 1 -0.767 -9.928 0.292 1.0 0.0 H
ATOM 8 HB1 ALA A 1 1.816 -9.816 0.015 1.0 0.0 H
ATOM 9 HB2 ALA A 1 1.407 -8.427 -0.329 1.0 0.0 H
ATOM 10 HB3 ALA A 1 1.797 -9.446 -1.427 1.0 0.0 H
TER
ENDMDL
END

上述单点能的计算结果如下所示:

[MindSPONGE] Adding 10 hydrogen atoms for the protein molecule in 0.003 seconds.
Warrning! The head_atom of residue 0 is not None but the tail_atom of residue -1 is None.
Warrning! The head_atom of residue 0 is not None but the tail_atom of residue -1 is None.
['bond_energy', 'angle_energy', 'dihedral_energy', 'coulomb_energy', 'lj_energy', 'nb_pair_energy']
[[ 45.856487 76.87538 2.9642215 -100.20307 -0.50251234
206.13483 ]]

而这里如果我们还是依旧使用这个代码,只是替换一个输入的pdb文件,比如如下的一个多肽:

REMARK   Generated By Xponge (Molecule)
ATOM 1 N ALA 1 -0.095 -11.436 -0.780
ATOM 2 CA ALA 1 -0.171 -10.015 -0.507
ATOM 3 CB ALA 1 1.201 -9.359 -0.628
ATOM 4 C ALA 1 -1.107 -9.319 -1.485
ATOM 5 O ALA 1 -1.682 -9.960 -2.362
ATOM 6 N ARG 2 -1.303 -8.037 -1.397
ATOM 7 CA ARG 2 -2.194 -7.375 -2.328
ATOM 8 CB ARG 2 -3.606 -7.943 -2.235
ATOM 9 CG ARG 2 -4.510 -7.221 -3.228
ATOM 10 CD ARG 2 -5.923 -7.789 -3.136
ATOM 11 NE ARG 2 -6.831 -7.111 -4.087
ATOM 12 CZ ARG 2 -8.119 -7.421 -4.205
ATOM 13 NH1 ARG 2 -8.686 -8.371 -3.468
ATOM 14 NH2 ARG 2 -8.844 -6.747 -5.093
ATOM 15 C ARG 2 -2.273 -5.882 -2.042
ATOM 16 O ARG 2 -1.630 -5.388 -1.119
ATOM 17 N ALA 3 -3.027 -5.119 -2.777
ATOM 18 CA ALA 3 -3.103 -3.697 -2.505
ATOM 19 CB ALA 3 -1.731 -3.041 -2.625
ATOM 20 C ALA 3 -4.039 -3.001 -3.483
ATOM 21 O ALA 3 -4.614 -3.643 -4.359
ATOM 22 N ALA 4 -4.235 -1.719 -3.394
ATOM 23 CA ALA 4 -5.126 -1.057 -4.325
ATOM 24 CB ALA 4 -6.538 -1.625 -4.233
ATOM 25 C ALA 4 -5.205 0.436 -4.039
ATOM 26 O ALA 4 -4.561 0.930 -3.116
ATOM 27 OXT ALA 4 -5.915 1.166 -4.728
TER

这样得到的单点能的计算结果如下所示:

[MindSPONGE] Adding 57 hydrogen atoms for the protein molecule in 0.008 seconds.
['bond_energy', 'angle_energy', 'dihedral_energy', 'improper_energy', 'coulomb_energy', 'lj_energy', 'nb_pair_energy']
[[ 231.55423 1049.3224 194.43379 20.708637 -689.10315 4051.5076
163.09871 ]]

在MindSponge的单点能的计算过程中,我们保留了每一项能量的name和value,便于结果的比对。

需要注意的是,不同的分子模拟软件所使用的默认输出单位也是不一样的。所以我们用MindSponge进行分子模拟的时候,最好在代码的最前头把单位配置加上:

from sponge import set_global_units
set_global_units('nm', 'kj/mol')

比如像上面这样操作一下,就把全局的能量单位配置成了kj/mol,全局的长度单位配置成了nm。常用的长度单位还有A,常用的能量单位还有kcal/mol,主要就是这里两组单位之间进行切换。

总结概要

本文主要衔接前面的文章,继“MindSponge的安装与使用”、“MindSponge软件架构”以及“MindSponge中定义一个分子系统”系列文章之后,再讲解一下如何根据一个定义好的分子系统进行力场建模,使用力场来计算单点能,就是一个比较简单的案例。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/single-point-energy.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

MindSponge分子动力学模拟——计算单点能(2023.08)的更多相关文章

  1. Gromacs分子动力学模拟流程概述

    Gromacs分子动力学模拟主要可以分为以下几个步骤,不同的体系步骤可能略有不同. 在开始之前,先简单了解一下预平衡: 分子动力学模拟的最终目的是对体系进行抽样,然后计算体系的能量,各种化学键,成分分 ...

  2. 分子动力学模拟之基于自动微分的LINCS约束

    技术背景 在分子动力学模拟的过程中,考虑到运动过程实际上是遵守牛顿第二定律的.而牛顿第二定律告诉我们,粒子的动力学过程仅跟受到的力场有关系,但是在模拟的过程中,有一些参量我们是不希望他们被更新或者改变 ...

  3. 分子动力学模拟之SETTLE约束算法

    技术背景 在上一篇文章中,我们讨论了在分子动力学里面使用LINCS约束算法及其在具备自动微分能力的Jax框架下的代码实现.约束算法,在分子动力学模拟的过程中时常会使用到,用于固定一些既定的成键关系.例 ...

  4. 分子动力学模拟软件VMD的安装与使用

    技术背景 在分子动力学模拟过程中会遇到一些拓扑结构非常复杂的分子模型,所谓的复杂不仅仅是包含众多的原子,还有各种原子之间的成键关系与成键类型等.这时候就非常能够体现一个好的可视化软件的重要性了,这里我 ...

  5. ZOJ 3778 Talented Chef(找规律,模拟计算,11届ACM省赛,简单)

    题目链接 2014年浙江省赛C题,当时觉得难,现在想想这题真水.. 找规律: 若   最大的那个步骤数*m-总和>=0,那么答案就是 最大的那个步骤数 . 否则  就要另加上不够的数量,具体看代 ...

  6. 【GROMACS】分子动力学模拟①——环境搭建

    系统环境 Win11 22H2 企业版 开启虚拟化.window subsystem for liunx等虚拟机相关的功能 应用商店中安装WSL2 安装步骤 打开Ubuntu,输入sudo apt f ...

  7. PAT甲题题解-1081. Rational Sum (20)-模拟分数计算

    模拟计算一些分数的和,结果以带分数的形式输出注意一些细节即可 #include <iostream> #include <cstdio> #include <algori ...

  8. 2017NOIP模拟赛-科普基地

    今天回来打的第一场NOIP难度的试题,结果惨不忍睹.写一下每道题的做法,然后每道题犯的__弱智__错误 UPD:2018.9.15 突然这篇题解就变成很多大佬要看的了,因为之前是写给自己看的,所以写的 ...

  9. 2021年【线上】lammps分子动力学技术实战培训班

    材料模拟分子动力学课程 3月19号--22号 远程在线课 lammps分子动力学课程 3月12号--15号 远程在线课 第一性原理VASP实战课 3月25号-28号 远程在线课 量子化学Gaussia ...

  10. Python的GPU编程实例——近邻表计算

    技术背景 GPU加速是现代工业各种场景中非常常用的一种技术,这得益于GPU计算的高度并行化.在Python中存在有多种GPU并行优化的解决方案,包括之前的博客中提到的cupy.pycuda和numba ...

随机推荐

  1. 【.NET】C#/.NET新建项目sln,增加src和test文件夹问题和解决方案

    ​ 问题介绍 经常逛github找优秀的.NET项目看,看到github上的项目的层级有src test,sln放在外层.如下图: 发现自己再Visaul Studio新建的项目即使添加了src和te ...

  2. 搭建自动化 Web 页面性能检测系统 —— 设计篇

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值.. 本文作者:琉易 liuxianyu.cn 页面性能对于用户体验.用 ...

  3. 测序数据学习笔记:bcl2fastq 安装

    相比二进制的 bcl2fastq2,基于 Perl 语言的 bcl2fastq-1.8.4 或许是从源码层面学习了解 Illumina 测序数据处理一个不错的选择.源码版本的 bcl2fastq-1. ...

  4. 【Azure K8S】AKS升级 Kubernetes version 失败问题的分析与解决

    问题描述 创建Azure Kubernetes Service服务后,需要升级AKS集群的 kubernetes version.在AKS页面的 Cluster configuration 页面中,选 ...

  5. HttpURLConnection调用webservice,c#、java、python等HTTP调用webservice,简单的webservice调用

    以前调用webservice一般使用axis.axis2先生成java类后,直接引用,多方便.但是有的webservice接口非常的函数,生成的java类非常多,有没有一种非常简化的方法. axis2 ...

  6. Vue跨域配置异常采坑:Request failed with status code 401

    本地用Express作为服务端,前端Vue项目配置跨域代理,调用服务端api接口始终报错"Request failed with status code 401".原来发现是端口3 ...

  7. [MAUI]弧形进度条与弧形滑块的交互实现

    @ 目录 弧形基类 定义 绘制弧 弧形进度条(ProgressBar) 添加动画 宽度补偿 文本 弧形滑块(Slider) 创建控制柄 拖动事件处理 项目地址 进度条(ProgressBar)用于展示 ...

  8. tSNE算法在自然语言处理中的应用:文本降维和可视化

    目录 技术原理及概念 t-SNE(Toeplitz-Stochastic Neural Network)是一种常用的文本降维和可视化算法,它的核心思想是将高维文本数据映射到低维空间,同时保持数据的一致 ...

  9. 【原创】C++中vector的remove()函数

    话不多说,直接来 remove()干了什么: 把要删除元素后面的值移动到前面,返回最后一个被改变值的下一个迭代器. 举栗: // 首先,定义一个vector vector<int> dem ...

  10. ERP开发流程

    一.使用Xshell连线执行r.r adzi140 或 助记码r.t 都可以打开数据表设计器 表格建完后,DBA前三个需要点一下,如果表格显示需要表格重建,点最后一个,表格新建完成后,记得点击执行异动 ...