计算化学公社

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

[辅助/分析程序] 分享能调整结构对称性的一个方法

[复制链接 Copy URL]

160

帖子

0

威望

619

eV
积分
779

Level 4 (黑子)

迷茫的本科生一枚

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 2877321934 于 2024-9-1 01:59 编辑

本人最近在进行二聚体的研究,发现搭建二聚体有时候需要两个朝向不同的分子,这时候往往需要手动转向,往往难以转动准确,gaussview自带的对称化功能调整又十分有限,在复杂二聚体中点群工具容易判断不出来正确的点群,故写了个能自动调整结构使结构具有中心对称性的python代码。


首先我们准备好含有原子元素及坐标的txt文件(将二聚体分子的gjf文件中的原子坐标粘贴至txt文件),命名为input.txt,注意将代码中的“保存的路径”改为实际路径(可打开终端用pwd查看)运行以下代码(使用终端或IDLE)
  1. import numpy as np

  2. def read_and_parse_data(filepath):
  3.     with open(filepath, 'r') as file:
  4.         data = file.readlines()
  5.     coordinates = []
  6.     labels = []
  7.     for line in data:
  8.         parts = line.split()
  9.         label = parts[0]
  10.         coords = np.array(list(map(float, parts[1:])))
  11.         labels.append(label)
  12.         coordinates.append(coords)
  13.     return labels, np.array(coordinates)

  14. def calculate_symmetry_center(coordinates):
  15.     return np.mean(coordinates, axis=0)

  16. def adjust_coordinates(labels, coordinates, center):
  17.     adjusted_coords = []
  18.     for coord in coordinates:
  19.         adjusted_coord = center + (center - coord)
  20.         adjusted_coords.append(adjusted_coord)
  21.     return adjusted_coords

  22. def write_adjusted_data(filepath, labels, adjusted_coords):
  23.     max_widths = np.max([[len(format(x, '.8f')) for x in coord] for coord in adjusted_coords], axis=0)
  24.     with open(filepath, 'w') as file:
  25.         for label, coord in zip(labels, adjusted_coords):
  26.             line = f"{label} " + ' '.join(format(x, f'>{max_widths[i]+1}.8f') for i, x in enumerate(coord)) + "\n"
  27.             file.write(line)

  28. def adjust_symmetry(filepath, output_filepath):
  29.     labels, coordinates = read_and_parse_data(filepath)
  30.     center = calculate_symmetry_center(coordinates)
  31.     adjusted_coords = adjust_coordinates(labels, coordinates, center)
  32.     write_adjusted_data(output_filepath, labels, adjusted_coords)

  33. input_filepath = r"保存的路径\input.txt"
  34. output_filepath = r"保存的路径\adjusted_output.txt"
  35. adjust_symmetry(input_filepath, output_filepath)
复制代码


得到adjusted_output.txt,注意,当存在元素名称为双字母时(如Zn),adjusted_output.txt中的原子坐标的末位不与单字母元素(如C,N)的原子坐标末位对齐,此时需要手动调整,将txt文件中的坐标粘贴到gjf后,用gaussview打开,再使用对称工具,就能得到对称性较强的二聚体了。

注:本人是本科生,是计算机及计算化学半新手,故可能出现对Gaussview功能的了解不充分,该代码有一部分由chatgpt修改补充以解决bug及实现部分功能,还请诸位大佬指正



评分 Rate

参与人数
Participants 1
eV +10 收起 理由
Reason
sobereva + 10

查看全部评分 View all ratings

放下

本版积分规则 Credits rule

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

GMT+8, 2024-11-23 23:30 , Processed in 0.249832 second(s), 22 queries , Gzip On.

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