分子动力学后处理自编程系列(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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import