计算化学公社

 找回密码 Forget password
 注册 Register
Views: 242|回复 Reply: 3
打印 Print 上一主题 Last thread 下一主题 Next thread

[CP2K] 求助cp2k计算得到的轨迹文件统计Ca-Oc和Ca-Ow键个数

[复制链接 Copy URL]

23

帖子

0

威望

185

eV
积分
208

Level 3 能力者

采用cp2k软件计算分子动力学,得到轨迹文件。已知一个体系中含有Ca,Si,H,O和C,其中O分为H2O中的Ow和碳酸分子中的Oc,以及Si-(OH)4四面体项链的Osi,现在通过cp2k软件得到一个.xyz的轨迹文件,轨迹文件中没有区分Ow,Oc和Osi,怎么利用python脚本统计Ca-Ow,Ca-Oc和Ca-Osi化学键数量分被是多少呢

202503021816286115..png (269.86 KB, 下载次数 Times of downloads: 0)

202503021816286115..png

464

帖子

11

威望

3954

eV
积分
4638

Level 6 (一方通行)

2#
发表于 Post on 2025-3-3 08:57:17 | 只看该作者 Only view this author
本帖最后由 丁越 于 2025-3-3 09:22 编辑

Oc, Osi, Ow在xyz文件中原子序号是固定不变的,直接通过原子序号查找某类O原子不就行了,再结合VMD的原子选择语法比如index 0 1 2 3选择Ow。之后就是用TCL语法遍历计算选中的原子与体系所有原子的键长,你自己设定一个判据标准,小于多少则视为成键。但缺点是TCL脚本运行起来挺慢。

第二种方法是通过ASE,里面的几何模块中有计算原子间的距离矩阵的函数,下面给你一段代码你自己参考一下:
  1. import numpy as np
  2. from ase import io
  3. from ase.data import covalent_radii
  4. from ase.geometry import get_distances



  5. def coordinated_bonds_num(atoms, index=None, scale=1.15):
  6.     """
  7.     calculate the number of coordinated bonds of each atom, simply based on geometry criteria.

  8.     parameters:
  9.         atoms: an ASE Atoms object.
  10.         index: list.
  11.             atomic index to be calculated.
  12.         scale: float.
  13.             the scale factor of covalent radii.
  14.     return: list.
  15.     """

  16.     _, distances = get_distances(atoms.positions, pbc=atoms.pbc, cell=atoms.cell)
  17.     radiis = (covalent_radii[atoms.get_atomic_numbers()] +
  18.               covalent_radii[atoms.get_atomic_numbers()].reshape(-1, 1))
  19.     distances = np.round(distances, decimals=1)
  20.     radiis = np.round(radiis, decimals=1)
  21.     is_bonded = np.where(distances <= scale * radiis, 1, 0) - np.eye(len(atoms))
  22.     bond_num = np.sum(is_bonded, axis=1)
  23.     if index is not None:
  24.         bond_num = bond_num[index]

  25.     return bond_num
复制代码
最后注意一点是CP2K的MD轨迹是不考虑PBC的,所以不论是拿VMD还是ASE统计都需要把原子卷回到盒子内。比如用ASE,参考下面代码:
  1. def wraped_coord(atoms, cell=None):
  2.     """
  3.     wrap atomic coordinates into unit cell.

  4.     parameters:
  5.         atoms: An Atoms object of ASE.
  6.         cell: 3 * 3 nparray. cell parameters in vector formate.
  7.     return:
  8.         an Atoms object with wrapped coordinates.
  9.     """
  10.     if not all(atoms.pbc):
  11.         if cell is None:
  12.             raise ValueError("Cell parameters must be defined when atoms are wrapped.")
  13.         else:
  14.             atoms.set_cell(cell)
  15.             atoms.pbc = (True, True, True)
  16.             atoms.center(vacuum=7.5, axis=2)
  17.             atoms.wrap(pretty_translation=True)
  18.     return atoms
复制代码



自由发挥,野蛮生长

23

帖子

0

威望

185

eV
积分
208

Level 3 能力者

3#
 楼主 Author| 发表于 Post on 2025-3-3 10:29:20 | 只看该作者 Only view this author
丁越 发表于 2025-3-3 08:57
Oc, Osi, Ow在xyz文件中原子序号是固定不变的,直接通过原子序号查找某类O原子不就行了,再结合VMD的原子选 ...

感谢楼主,这个O原子类型他的原子序号很乱,也不是那种连续的,如果用VMD是挨个确定好原子序号编进去吗

464

帖子

11

威望

3954

eV
积分
4638

Level 6 (一方通行)

4#
发表于 Post on 2025-3-3 10:45:24 | 只看该作者 Only view this author
李思玫 发表于 2025-3-3 10:29
感谢楼主,这个O原子类型他的原子序号很乱,也不是那种连续的,如果用VMD是挨个确定好原子序号编进去吗

轨迹文件中原子序号又不随时间变化。gview也行,自己分类一下O原子类型。
自由发挥,野蛮生长

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2025-8-15 17:00 , Processed in 0.164991 second(s), 23 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list