MindSponge分子动力学模拟——定义一个分子系统
技术背景
在前面两篇文章中,我们分别介绍了分子动力学模拟软件MindSponge的软件架构和安装与使用。这里我们进入到实用化阶段,假定大家都已经在本地部署好了基于MindSpore的MindSponge的编程环境,开始用MindSponge去做一些真正的分子模拟的工作。那么分子模拟的第一步,我们就需要在MindSponge中去定义一个分子系统Molecule()。
基础类Molecule的解析
我们先来看一下源代码中的Molecule这个类的自我介绍:
class Molecule(Cell):r"""Base class for molecular system, used as the "system module" in MindSPONGE.The `Molecule` Cell can represent a molecule or a system consisting of multiple molecules.The major components of the `Molecule` Cell is the `Residue` Cell. A `Molecule` Cell cancontain multiple `Residue` Cells.Args:atoms(Union[List[Union[str, int]], ndarray]): Array of atoms. The data in array can be str of atomname or int of atomic number. Defulat: Noneatom_name(Union[List[str], ndarray]): Array of atom name with data type `str`. Defulat: Noneatom_type(Union[List[str], ndarray]): Array of atom type with data type `str`. Defulat: Noneatom_mass(Union[Tensor, ndarray, List[float]]): Array of atom mass of shape `(B, A)` with data type`float`. Defulat: Noneatom_charge(Union[Tensor, ndarray, List[float]]): Array of atom charge of shape `(B, A)` with data type`float`. Defulat: Noneatomic_number(Union[Tensor, ndarray, List[float]]): Array of atomic number of shape `(B, A)` with data type`int`. Defulat: Nonebond(Union[Tensor, ndarray, List[int]]): Array of bond connection of shape `(B, b, 2)` with datatype `int`. Defulat: Nonecoordinate(Union[Tensor, ndarray, List[float]]): Tensor of atomic coordinates :math:`R` of shape`(B, A, D)` with data type `float`. Default: Nonepbc_box(Union[Tensor, ndarray, List[float]]): Tensor of box size :math:`\vec{L}` of periodic boundarycondition (PBC). The shape of tensor is `(B, D)`,and the data type is `float`. Default: Nonetemplate(Union[dict, str, List[Union[dict, str]]]): Template for molecule. It can be a `dict` in MindSPONGEtemplate format or a `str` for the filename of aMindSPONGE template file. If a `str` is given,it will first look for a file with the same name in thecurrent directory. If the file does not exist, it willsearch in the built-in template directory ofMindSPONGE (`mindsponge.data.template`).Default: None.residue(Union[Residue, List[Residue]]): Residue or a list of residues. If template is not None,only the residues in the template will be used.Default: None.length_unit(str): Length unit. If `None` is given, the global lengthunits will be used. Default: NoneOutputs:- coordinate, Tensor of shape `(B, A, D)`. Data type is float.- pbc_box, Tensor of shape `(B, D)`. Data type is float.Supported Platforms:``Ascend`` ``GPU``Symbols:B: Batchsize, i.e. number of walkers in simulationA: Number of atoms.b: Number of bonds.D: Spatial dimension of the simulation system. Usually is 3."""
可以先看一下Molecule所接收的信息,其实可以主要分为以下几大类别:
- 原子特征信息。用于区分不同原子之间的差异性,比如atom_name原子名称、atom_type原子类型、atomic_number原子序数等。
- 拓扑信息。在构建Molecule的时候需要传入键连信息bond,否则不带键连关系的Molecule计算出来的力场能量是错误的。
- 构象信息。主要是原子坐标coordinate和周期性边界条件pbc_box,作为近邻表计算和力场能量计算的输入,但不作为拓扑连接信息的输入。
- 模块化信息。除了逐个原子的去构建一个Molecule,还可以定义好一系列完整的残基Residue再输入给Molecule进行构建,或者通过模板template来进行构建。
- 单位信息。主要包含长度单位length_unit和能量单位energy_unit。
上述主要是给Molecule的输入信息,输入给Molecule之后在内部构建build一次,才能得到一个最终的分子系统对象。接下来看看构建之后的Molecule的一些重要内置属性(self.xxx):
- 原子特征信息。除了上述传入的那些信息之外,还有原子数num_atoms,batch数量num_walker以及灵活的维度数量dimension。除了每个原子的基本类型外,还保存了一个heavy_atom_mask重原子的信息,便于快速区分重原子和氢原子。
- 拓扑信息。除了键连关系bonds信息,还有h_bonds氢原子成键的信息。
- 构象信息。主要就是coordinate原子坐标,因为需要在Updater中更新迭代,因此这里的coordinate需要是一个Parameter的类型,而不是普通的Tensor。
- 模块化信息。在构建的过程中,对传入的Residue也都进行了extend,因此最终Residue内部的这些信息,都会被合并到前面提到的Molecule的原子特征信息和拓扑信息、构象信息中,同时会保留一个atom_resid用于追溯原子所在的residue。如果在template模板中有配置一些约束限制,比如settle约束算法相关的参数settle_index和settle_length,也会保存在Molecule的属性中,用于后续约束算法的计算。
- 单位信息。units把相关的单位信息都存储在一个Units对象中,支持从global units中调用,可以随时调用。
除了内置属性,Molecule还有一些内置函数可以关注一下:
- 单位转化。主要是convert_length_from和convert_length_to两个函数,用于执行长度单位的变换。
- 系统扩展函数。比如copy函数,可以用于将本系统拷贝一份,但是该拷贝的过程会生成一个新的对象,而不是原有的Molecule对象。但如果是多个的Molecule对象,可以用内置函数append进行合并。如果需要节省一些麻烦,想对系统进行扩展,可以直接使用内置函数reduplicate,在系统内部复制一份。类似于append的功能,可以使用内置函数add_residue来添加新的residue。上述几种方法主要针对于非周期性的体系,如果是带有周期性边界条件的体系,直接使用repeat_box函数即可完成对体系的快速复制。
- 构建函数。一般情况下对于只是想做MD的童鞋而言,没有必要使用到build_system构建系统和build_space构建构象这些函数,但是如果有需要自行调整Molecule的内容时,就需要重新build一次。
- 补介质函数。一般给定的pdb文件会丢失一些氢原子和溶剂分子的信息,这些都可以在做模拟之前手动补上。目前MindSponge支持的是对体系加水分子fill_water,可以指定溶剂层的厚度,或者指定一个盒子的大小。
- 回调函数。在深度学习或者MindSponge分子动力学模拟的过程中,我们会使用到回调函数CallBack来对输出内容进行追踪。但是CallBack本身是不保存任何体系相关的信息的,因此追踪的内容其实也是从Molecule和ForceField内部进行回调。比如在Molecule中,可以调用get_atoms,get_coordinate,get_pbc_box等等函数,而如果直接使用MindSpore的Cell中所特有的construct函数,这里也会返回coordinate和pbc_box两个信息,这些都可以认为是Molecule类的“回调函数”。
从模板定义一个分子
关于MindSponge的安装和使用,在这里我们就不重复赘述了,假设大家已经完成了MindSponge的安装。但是需要提一句的是,在开始MindSponge模拟前,最好在python脚本的最前面加上这样一些环境变量的配置,否则容易报错:
import os
os.environ['GLOG_v']='4'
os.environ['MS_JIT_MODULES']='sponge'
接下来我们就可以简单的使用模板文件去创建一个新的分子:
from sponge import Molecule
system = Molecule(template='water.spce.yaml')
print ('The number of atoms in the system is: ', system.num_atoms)
print ('All the atom names in the system are: ', system.atom_name)
print ('The coordinates of atoms are: \n{}'.format(system.coordinate.asnumpy()))
输出的结果如下所示:
The number of atoms in the system is: 3
All the atom names in the system are: [['O' 'H1' 'H2']]
The coordinates of atoms are:
[[[ 0. 0. 0. ][ 0.08164904 0.0577359 0. ][-0.08164904 0.0577359 0. ]]]
这里因为water.spce.yaml是一个预置的模板,类似的还有water.tip3p.yaml。这种预置的模板我们可以直接当做template来创建,但如果是用户自行定义的模板文件,最好在这里写清楚yaml文件的绝对路径,否则会导致报错。相关yaml文件的内容如下所示:
template:base: water_3p.yamlWAT:atom_mass: [15.9994, 1.008, 1.008]atom_charge: [-0.8476, 0.4238, 0.4238]settle:mandatory: falselength_unit: nmdistance:OW-HW: 0.1HW-HW: 0.16330
molecule:residue:- WATlength_unit: nmcoordinate:- [0.0, 0.0, 0.0]- [0.081649043, 0.057735897, 0.0]- [-0.081649043, 0.057735897, 0.0]
这里的base是指向了另外一个较为基础的yaml参数文件:
template:WAT:atom_name: [O, H1, H2]atom_type: [OW, HW, HW]atom_mass: [16.00, 1.008, 1.008]atomic_number: [8, 1, 1]bond:- [0, 1]- [0, 2]head_atom: nulltail_atom: null
有了这些参考,用户就可以自行定义一些模板,用于计算。
从文件定义一个分子
MindSponge也支持一些特定格式的分子导入,比如mol2格式的分子和pdb格式的蛋白质分子,这个章节介绍一下如何将文件导入为一个MindSponge的Molecule。比如我这里有一个非常简单的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来读取该pdb文件的方法为[*注:由于一般pdb文件中会忽略氢原子,因此加载的时候需要使用rebuild_hydrogen将其重构成一个完整的分子]:
from sponge import Protein
system = Protein('case1.pdb', rebuild_hydrogen=True)
print ('The number of atoms in the system is: ', system.num_atoms)
print ('All the atom names in the system are: ', system.atom_name)
相应的输出结果为:
[MindSPONGE] Adding 57 hydrogen atoms for the protein molecule in 0.007 seconds.
The number of atoms in the system is: 57
All the atom names in the system are: [['N' 'CA' 'CB' 'C' 'O' 'H1' 'H2' 'H3' 'HA' 'HB1' 'HB2' 'HB3' 'N' 'CA''CB' 'CG' 'CD' 'NE' 'CZ' 'NH1' 'NH2' 'C' 'O' 'H' 'HA' 'HB2' 'HB3' 'HG2''HG3' 'HD2' 'HD3' 'HE' 'HH11' 'HH12' 'HH21' 'HH22' 'N' 'CA' 'CB' 'C''O' 'H' 'HA' 'HB1' 'HB2' 'HB3' 'N' 'CA' 'CB' 'C' 'O' 'OXT' 'H' 'HA''HB1' 'HB2' 'HB3']]
可以看到的是,在对应的位置上,我们将氢原子补在了一个相对合适的位置。一般情况下,重构完氢原子之后,需要对系统进行一个能量极小化,否则会导致初始系统的能量过于不稳定。具体的加氢效果可以看一下这个运行的结果:

其实加氢是很难做到一步到位的,但是我们可以尽可能的将氢原子摆放在一个相对合理的位置,便于后续的能量计算和优化。
自定义分子
由于python这一编程语言的灵活性,使得我们不仅支持从文件和模板文件中去定义一个分子系统,还可以直接用脚本的形式传一系列的python列表给Molecule来构建一个分子系统。比如我们只传原子类型和坐标还有键连关系,就能构建一个简单的水分子:
from sponge import Molecule
system = Molecule(atoms=['O', 'H', 'H'],coordinate=[[0, 0, 0], [0.1, 0, 0], [-0.0333, 0.0943, 0]],bonds=[[[0, 1], [0, 2]]])
print ('The number of atoms in the system is: ', system.num_atoms)
print ('All the atom names in the system are: ', system.atom_name)
print ('The coordinates of atoms are: \n{}'.format(system.coordinate.asnumpy()))
相应的输出结果如下所示:
The number of atoms in the system is: 3
All the atom names in the system are: [['O' 'H' 'H']]
The coordinates of atoms are:
[[[ 0. 0. 0. ][ 0.1 0. 0. ][-0.0333 0.0943 0. ]]]
总结概要
本文通过解析MindSponge的源码实现,详细介绍了在MindSponge中Molecule基础分子类的内置属性和内置函数,以及三种相应的分子系统定义方法:我们既可以使用yaml模板文件来定义一个分子系统,也可以从mol2和pdb文件格式中直接加载一个Molecule,还可以直接使用python列表的形式传入一些手动定义的内容,直接构建一个Molecule。有了最基础的分子系统之后,后面就可以开始定义一些能量项和迭代器,开始分子动力学模拟。
相关文章:
MindSponge分子动力学模拟——定义一个分子系统
技术背景 在前面两篇文章中,我们分别介绍了分子动力学模拟软件MindSponge的软件架构和安装与使用。这里我们进入到实用化阶段,假定大家都已经在本地部署好了基于MindSpore的MindSponge的编程环境,开始用MindSponge去做一些真正的分子模拟的工…...
unity想让方法带一个默认参数怎么写
在C#中,包括Unity使用的C#版本,你可以为方法参数提供默认值。这允许你在调用方法时省略某些参数,并使用这些参数的默认值。以下是如何为一个方法参数设置默认值的示例: using UnityEngine; public class MyClass : MonoBehaviou…...
从零开始的软件测试学习之旅(六)测试网络基础知识
测试网络基础知识 HTTP和HTMLURLDNS客户端和服务器请求方法和状态码面试高频Fiddler抓包工具教学弱网 HTTP和HTML 概念 html: HyperText Markup Language 超文本标记语言 http: HyperText Transfer Protocol 超文本传输协议 超文本: 图片, 音频, 视频 关系:http 可以对 html 的…...
NSS题目练习
[SWPUCTF 2021 新生赛]gift_F12 通过题目提示可以知道flag应该可以在源代码中找到 查看源代码,直接用 ctrlf 搜索flag即可 [SWPUCTF 2021 新生赛]jicao 题目打开后能看到一串php代码,要求是用post传参传入idwllmNB以及用get传参传入json[x]"wllm&q…...
Springboot+vue项目零食销售商城
摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,零食销售商城当然也不能排除在外。零食销售商城是以实际运用为开发背景,运用软件工程原理和开发方法ÿ…...
cesium 雷达遮罩(电弧球效果)
cesium 雷达遮罩(电弧球效果) 以下为源码直接复制可用 1、实现思路 通过修改“material”材质来实现轨迹球效果 2、代码示例 2.1 index.html <!DOCTYPE html> <html lang="en"><head><!...
W801学习笔记二十三:语文和英语学习应用的代码汇总
前面几章,代码经过重构,可能有点乱。这里给个最终版本,以供参考。 1、应用基类: IScean.h enum SceanResult{SceanResult_EXIT 1, SceanResult_Done 2 };class IScean {public:IScean();virtual ~IScean();// 纯虚函数virtu…...
安卓LayoutParams浅析
目录 前言一、使用 LayoutParams 设置宽高二、不设置 LayoutParams2.1 TextView 的 LayoutParams2.2 LinearLayout 的 LayoutParams 三、getLayoutParams 的使用四、setLayoutParams 的作用五、使用 setWidth/setHeight 设置宽高 前言 先来看一个简单的布局,先用 x…...
UltralSO制作启动盘时报错:磁盘/映像容量太小解决办法
UltralSO制作启动盘时报错:磁盘/映像容量太小解决办法 发现网上随便下载的UltralSO制作启动盘时报错:磁盘/映像容量太小,导致制作启动盘出错 解决方案: 去这个地址下载:https://cn.ultraiso.net/xiazai.html 下载正版…...
2024-05-09四月初二周四
2024-05-09四月初二周四 06:40-23:00 深兰Ai第五期 Part1:课时258:00:00:00 12:30-13:00 午饭烧水: 13:30-23:00 机器学习 19:00-20:00 晚饭: 20:00-23:00 coding 2.5 特征降维 unending 23:00-06:30 烧水资料下载...
【微服务】springcloud整合dubbo3使用nacos作为注册中心
目录 一、前言 二、springboot版本升级带来的问题 2.1 springboot为什么需要升级版本...
php中常用的数据类型汇总
在 PHP 中,常用的数据类型主要有以下几种: 标量类型(Scalar Types) integer(整型):用于存储整数,可以是正数或负数。float(浮点型/双精度型):用于…...
【源码阅读】Golang中的go-sql-driver库源码探究
文章目录 前言一、go-sql-driver/mysql1、驱动注册:sql.Register2、驱动实现:MysqlDriver3、RegisterDialContext 二、总结 前言 在上篇文章中我们知道,database/sql只是提供了驱动相关的接口,并没有相关的具体实现,具…...
2024-05-08 postgres-火山模型-执行-记录
摘要: 2024-05-08 postgres-火山模型-执行-记录 上下文: 2024-05-08 postgres-调试及分析-记录-CSDN博客 火山模型: 数据流是在查询树上,自上而下进行拉取,由上而下的调用。树本身就表明了数据的流动。每次执行一个元组,也就类似于迭代器的…...
QT5带UI的常用控件
目录 新建工程,Qmainwindow带UI UI设计器 常用控件区 Buttons 按钮 containers 容器 控件属性区域 对象监视区 布局工具区 信号与槽区 简单例子1 放置一个按钮控件,改文本为发送,该按键为Button1; 按钮关联信号和…...
识货小程序逆向
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872,x30184483x…...
【OceanBase 系列】—— OceanBase v4.3 特性解读:查询性能提升之利器列存储引擎
原文链接:OceanBase 社区 对于分析类查询,列存可以极大地提升查询性能,也是 OceanBase 做好 HTAP 和 OLAP 的一项不可缺少的特性。本文介绍 OceanBase 列存的实现特色。 OceanBase从诞生起就一直坚持LSM-Tree架构,不断打磨功能支…...
【Java开发的我出书啦,各位同仁快过来围观】!!!
文章目录 🔊博主介绍🥤本文内容出书的目的出书的过程书籍的内容 📥博主的话 🔊博主介绍 文章目录 🔊博主介绍🥤本文内容出书的目的出书的过程书籍的内容 📥博主的话 🌾阅读前&#x…...
AI预测福彩3D第10套算法实战化赚米验证第1弹2024年5月5日第1次测试
从今天开始,准备启用第10套算法,来验证下本算法的可行性。因为本算法通过近三十期的内测(内测版没有公开预测结果),发现本算法的预测结果优于其他所有算法的效果。彩票预测只有实战才能检验是否有效,只有真…...
leetcode 2944.购买水果需要的最小金币
思路:dp 这道题一开始想的时候并不会,但是看到了有些水果可以买也可以不买,所以就想到了选择与不选择的思路。 对于每一个水果,我们都有买和不买的选择,但是我们的第一个水果是一定要买的。然后再往后推导。 用dp[]…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
