|
本帖最后由 2877321934 于 2024-9-1 01:59 编辑
本人最近在进行二聚体的研究,发现搭建二聚体有时候需要两个朝向不同的分子,这时候往往需要手动转向,往往难以转动准确,gaussview自带的对称化功能调整又十分有限,在复杂二聚体中点群工具容易判断不出来正确的点群,故写了个能自动调整结构使结构具有中心对称性的python代码。
首先我们准备好含有原子元素及坐标的txt文件(将二聚体分子的gjf文件中的原子坐标粘贴至txt文件),命名为input.txt,注意将代码中的“保存的路径”改为实际路径(可打开终端用pwd查看)运行以下代码(使用终端或IDLE)
- import numpy as np
- def read_and_parse_data(filepath):
- with open(filepath, 'r') as file:
- data = file.readlines()
- coordinates = []
- labels = []
- for line in data:
- parts = line.split()
- label = parts[0]
- coords = np.array(list(map(float, parts[1:])))
- labels.append(label)
- coordinates.append(coords)
- return labels, np.array(coordinates)
- def calculate_symmetry_center(coordinates):
- return np.mean(coordinates, axis=0)
- def adjust_coordinates(labels, coordinates, center):
- adjusted_coords = []
- for coord in coordinates:
- adjusted_coord = center + (center - coord)
- adjusted_coords.append(adjusted_coord)
- return adjusted_coords
- def write_adjusted_data(filepath, labels, adjusted_coords):
- max_widths = np.max([[len(format(x, '.8f')) for x in coord] for coord in adjusted_coords], axis=0)
- with open(filepath, 'w') as file:
- for label, coord in zip(labels, adjusted_coords):
- line = f"{label} " + ' '.join(format(x, f'>{max_widths[i]+1}.8f') for i, x in enumerate(coord)) + "\n"
- file.write(line)
- def adjust_symmetry(filepath, output_filepath):
- labels, coordinates = read_and_parse_data(filepath)
- center = calculate_symmetry_center(coordinates)
- adjusted_coords = adjust_coordinates(labels, coordinates, center)
- write_adjusted_data(output_filepath, labels, adjusted_coords)
- input_filepath = r"保存的路径\input.txt"
- output_filepath = r"保存的路径\adjusted_output.txt"
- adjust_symmetry(input_filepath, output_filepath)
复制代码
得到adjusted_output.txt,注意,当存在元素名称为双字母时(如Zn),adjusted_output.txt中的原子坐标的末位不与单字母元素(如C,N)的原子坐标末位对齐,此时需要手动调整,将txt文件中的坐标粘贴到gjf后,用gaussview打开,再使用对称工具,就能得到对称性较强的二聚体了。
注:本人是本科生,是计算机及计算化学半新手,故可能出现对Gaussview功能的了解不充分,该代码有一部分由chatgpt修改补充以解决bug及实现部分功能,还请诸位大佬指正
|
评分 Rate
-
查看全部评分 View all ratings
|