计算化学公社

标题: 请问如何利用VMD统计水在聚合物的扩散过程中的结合水和自由水分子的个数 [打印本页]

作者
Author:
LLLYYHHH    时间: 2022-12-27 15:44
标题: 请问如何利用VMD统计水在聚合物的扩散过程中的结合水和自由水分子的个数
如题,请问是否可以利用VMD统计水在聚合物的扩散过程中的结合水和自由水分子的个数。
如果可以,能否请教一下大致的思路,谢谢各位老师!

作者
Author:
对抗路达摩    时间: 2022-12-27 20:11
首先你要对结合水和自由水下一个定义,MD的分析很多都是基于轨迹的,轨迹的基本单位是帧。首先你要定义一下什么是结合水,比如距离聚合物分子的距离小于一定的cut-off并且维持一定的时间n帧,有了定义才可以对轨迹进行结合水、自由水的分析。
然后有了定义就根据具体的定义写分析脚本,如果你对于分析脚本是0基础,我建议使用python结合库MDAnalysis,python自带非常多的分析库,个人认为是最容易上手的,MDAnalysis的功能也很强大,比如按照我的定义,可以使用MDAnalysis的动态选取功能,每一帧考察聚合物周围距离多少帧内的水都是哪些,再和上一帧的进行对比,最终就能分析出结合水和自由水的个数。
作者
Author:
sobereva    时间: 2022-12-28 03:18
用VMD需要自己写脚本分析,至少据我所致没有现成的脚本
作者
Author:
LLLYYHHH    时间: 2022-12-28 20:21
对抗路达摩 发表于 2022-12-27 20:11
首先你要对结合水和自由水下一个定义,MD的分析很多都是基于轨迹的,轨迹的基本单位是帧。首先你要定义一下 ...

谢谢您的建议~
作者
Author:
LLLYYHHH    时间: 2022-12-28 20:23
sobereva 发表于 2022-12-28 03:18
用VMD需要自己写脚本分析,至少据我所致没有现成的脚本

谢谢sob老师~
作者
Author:
紫丹渡津    时间: 2022-12-29 14:21
本帖最后由 紫丹渡津 于 2022-12-29 14:29 编辑

随手写了一个Python的脚本,并行化计算结合水和自由水的分数,而且你还可以自由扩展计算结合水的状态,比如与聚合物链结合的数目等。
如何使用,脚本里关键的地方都有注释。

  1. import multiprocessing as mp
  2. import functools

  3. import math
  4. import MDAnalysis as mda
  5. import MDAnalysis.analysis.distances as dist
  6. import MDAnalysis.lib.distances as distances
  7. import numpy as np

  8. def assoPrint(filename, data1, data2):  # print association properties
  9.     anaout = open(filename + '.xvg', 'w')
  10.     print('# ' + 'condensed' + ' free', file=anaout)
  11.     for i in range(0, len(data1)):
  12.         print('{:10.5f} {:10.5f}'.format(data1[i], data2[i]), file=anaout)
  13.     anaout.close()


  14. def get_association(top, trj, ag1, ag2, cutoff, frame_id):
  15.     uta = mda.Universe(top, trj)
  16.     group1 = uta.select_atoms("type " + ag1)
  17.     group2 = uta.select_atoms("type " + ag2)
  18.     ts = uta.trajectory[frame_id]
  19.     cell = ts.dimensions
  20.     type1, type2 = [], []
  21.     for atom in range(len(ag1)):
  22.         distpair = distances.capped_distance(ag1.positions[atom], ag2.positions, cutoff, box = cell)[0]
  23.         asso_pair.append(len(distpair))
  24.         if len(distpair) != 0:
  25.             type1.append(atom)
  26.         else:
  27.             type2.append(atom)
  28.     # return the fractions of condensed and free water molecules
  29.     return len(type1) / len(group1), len(type2)  / len(group1)


  30. def main():
  31.     top = "topol.tpr"
  32.     trj = "traj.trr"
  33.     atom_group1 = "AT1" # atom type for the oxygen of water
  34.     atom_group2 = "AT2" # atom type of the given reference on your polymer
  35.     cutoff = 5.0  # cutoff for water - polymer
  36.     nt = 8  # number of processors
  37.     uta = mda.Universe(top, trj)
  38.     # generate the wanted frame_ids
  39.     frame_ids = [ts.frame for ts in uta.trajectory]
  40.     condensed, free = [], []
  41.     do_analyse = functools.partial(get_association, top, trj, atom_group1, atom_group2, cutoff)
  42.     pool = mp.Pool(processes=nt)
  43.     data = pool.imap(do_analyse, frame_ids)
  44.     for f1, f2 in data:
  45.         condensed.append(f1)
  46.         free.append(f2)
  47.     assoPrint('water_fraction', condensed, free)


  48. if __name__ == "__main__":
  49.     main()
复制代码

作者
Author:
LLLYYHHH    时间: 2022-12-29 15:30
紫丹渡津 发表于 2022-12-29 14:21
随手写了一个Python的脚本,并行化计算结合水和自由水的分数,而且你还可以自由扩展计算结合水的状态,比如 ...

谢谢老师!我这边也写了一个tcl的脚本,您的程序我再仔细学习学习
作者
Author:
光下澈    时间: 2024-11-29 13:26
LLLYYHHH 发表于 2022-12-29 15:30
谢谢老师!我这边也写了一个tcl的脚本,您的程序我再仔细学习学习

你好,请教一下,有成功计算出来吗?




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3