计算化学公社

标题: 分享能调整结构对称性的一个方法 [打印本页]

作者
Author:
2877321934    时间: 2024-8-31 23:03
标题: 分享能调整结构对称性的一个方法
本帖最后由 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及实现部分功能,还请诸位大佬指正








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