分子动力学后处理自编程系列(4)---氢键统计

2024-01-16 11:59

本文主要是介绍分子动力学后处理自编程系列(4)---氢键统计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分子动力学后处理自编程系列(4)---氢键统计

  • 1、编程思路
  • 2、计算步骤
    • (1) 读取dump文件
    • (2) 几何判断参数设置
    • (3) 选出形成氢键相关的O和H原子
    • (4) 选出每个donor的acceptor
    • (5) 氢键数目统计
    • (6) 结果验证
  • 3、结语

在这里插入图片描述

氢键是一种特殊的静电作用,是除范德华力外的另一种分子间作用力,在小分子(水、离子溶液等)及聚合物(DNA、蛋白质、无机材料等) 的三维结构和特性方面起着重要作用。氢键的大小介于化学键与范德华力间,不属于化学键,但有键长、键能,氢键具有饱和性、方向性。本程序利用LAMMPS输出的dump文件,统计水中氢键数量。

本程序的优势主要表现在:
💖输入明确:dump文件(包含Type、mol-ID以及x,y,z)
💖简单易修改:程序思路清晰,可根据自己需求在本程序基础上进行修改实现特性需求计算,例如氢键键长分布、键角分布等。

1、编程思路

(1)读取dump文件,将每一帧的原子信息存储为变量atom_data;
(2)在帧循环条件下,按照O和H两种原子将data信息拆分;
(3)选出潜在的能够当做供体的O原子,并确定与氧原子相连接的H原子;
(4)根据O-O之间的距离大于2.5,小于R判断供体O对应的潜在的能够当做受体的O原子;
(5)循环供体O,计算该供体O连接的H与潜在受体O之间的夹角α 来判断是否形成氢键;
(6)记录所有帧下氢键数目并写出供体、受体信息;
(7)根据需要完成特性信息筛选。

2、计算步骤

(1) 读取dump文件

dump的读取和该系列之前的读取代码一致,请移步之前的教程,复制该部分代码,为了避免教程冗长,在后续的教程中该部分一并省略。

(2) 几何判断参数设置

% 输入判断条件
R = 3.5;                   	% 几何规则距离判断条件
aplha = 30;                 % 几何规则角度判断条件

(3) 选出形成氢键相关的O和H原子

% Type 1 ------ O
% Type 2 ------ Hfor i = 1 : frame_numn = 0;                                          m = 0;                                          for j = 1 : num_atomsif (atom_data(j,2,i) == 1)                  n = n + 1;data_Oxygen(n,:,i) = atom_data(j,:,i);XYZ_Oxygen(n,:,i) = atom_data(j,3:5,i);Type_Oxygen(n,:,i) = atom_data(j,2,i);elseif (atom_data(j,2,i) == 2)m = m + 1;data_Hydrogen(m,:,i) = atom_data(j,:,i);XYZ_Hydrogen(m,:,i)  = atom_data(j,3:5,i);                         Type_Hydrogen(m,:,i) = atom_data(j,2,i);                           endend
end% No.3 选出每个donor对应的H
for i = 1 : frame_num                                                       for j = 1 : n                                                                                                         k = 0;                                                              for v = 1 : m                                                          dx = XYZ_Oxygen(j,1,i) - XYZ_Hydrogen(v,1,i);dy = XYZ_Oxygen(j,2,i) - XYZ_Hydrogen(v,2,i);dz = XYZ_Oxygen(j,3,i) - XYZ_Hydrogen(v,3,i);distance = sqrt(dx^2 + dy^2 + dz^2);if ( 0.90<distance && distance< 1.10)k = k + 1;donor_H(k,:,j,i) = data_Hydrogen(v,:,i);                         endendend
end

(4) 选出每个donor的acceptor

% No.4 选出每个donor的acceptor
for i = 1 : frame_numfor j = 1 : n                                                           y = 0;                                                               for x = 1 : n                                                        d_x = XYZ_Oxygen(j,1,i) - XYZ_Oxygen(x,1,i);d_y = XYZ_Oxygen(j,2,i) - XYZ_Oxygen(x,2,i);d_z = XYZ_Oxygen(j,3,i) - XYZ_Oxygen(x,3,i);distance_0 = sqrt(d_x^2 + d_y^2 + d_z^2);if ( distance_0 < R )  y = y + 1;donor_A(y,:,j,i) = data_Oxygen(x,:,i);end         endend
end

(5) 氢键数目统计

% No.5 氢键初统计
for i = 1 : frame_numn_hbonds(i) = 0;											% 氢键数for j = 1 : n                                                           XYZ_donor_now = XYZ_Oxygen(j,:,i);n_H(j,i) = sum(donor_H(:,1,j,i)~=0);                               for ii = 1 : n_H(j,i)                                               XYZ_H_now = donor_H(ii,3:5,j,i);O_H = XYZ_H_now - XYZ_donor_now;n_A(j,i) = sum(donor_A(:,1,j,i)~=0);                            for jj = 1 : n_A(j,i)                                           XYZ_A_now = donor_A(jj,3:5,j,i);O_O = XYZ_A_now - XYZ_donor_now;sita = (180/pi)*acos(dot(O_H,O_O)/(norm(O_H)*norm(O_O)));if (sita < aplha)n_hbonds(i) = n_hbonds(i) + 1;% 存储氢键的信息,行数为氢键数,% 第一列为供体TYPE,第二列为供体H的TYPE,第三列为受体TYPE,第四列为供体原子ID,第五列为供体H原子ID,第六列为受体原子ID;Hbonds_info(n_hbonds(i),1,i) = Type_Oxygen(j,1,i);Hbonds_info(n_hbonds(i),2,i) = donor_H(ii,2,j,i);Hbonds_info(n_hbonds(i),3,i) = donor_A(jj,2,j,i);                    Hbonds_info(n_hbonds(i),4,i) = data_Oxygen(j,1,i);Hbonds_info(n_hbonds(i),5,i) = donor_H(ii,1,j,i);Hbonds_info(n_hbonds(i),6,i) = donor_A(jj,1,j,i);               endendendend
end

(6) 结果验证

在这里插入图片描述

3、结语

后续我们会开发一个免费的氢键统计APP,功能强大,操作简单,开发完成会在本账号和微信公众号“分子模拟CLUB”上发布,敬请期待。

这篇关于分子动力学后处理自编程系列(4)---氢键统计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612520

相关文章

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.