Gaussian の Scan 計算から結果を抽出する
Gaussian の Scan 計算は、分子構造の一部(結合長、結合角、二面角など)を段階的に変化させながら、各ステップで構造最適化を行う計算方法です。これにより、異性化などの分子構造変化プロセスに伴うエネルギー変化を調べることができます。
Scan 計算の実行方法
Scan 計算を実行するには、Gaussian の入力ファイルで以下のように指示します:
# b3lyp/6-31g(d) opt=modredundant
butadiene cis/trans isomerization
0 1
C 1.17156555 -1.44912161 0.00000000
H 2.10009025 -0.91738667 0.00000000
H 1.16991827 -2.51912042 0.00000000
C -0.00237085 -0.77203916 0.00000000
H -0.93089555 -1.30377410 0.00000000
C 0.00000000 0.76795913 0.00000000
H 0.92852470 1.29969407 0.00000000
C -1.16989285 1.45200445 0.00000000
H -2.10156042 0.92579563 0.00000000
H -1.16188831 2.52197459 0.00000000
D 8 6 4 1 S 18 10.000000
この例では、ブタジエンの中心C-C結合周りの二面角を操作します。trans型を出発構造とし、二面角を10度ずつ変化させながら、各点で構造最適化を行います。
Scan 計算結果の抽出
Scan 計算の結果は Gaussian の出力ファイルに記録されていますが、その読み取りはやや煩雑です。Gaussian の GUI である GaussView を使えば構造やエネルギーの変化を可視化できますが、変化する座標データを直接出力する方法はないようです(私の知識不足かもしれません🤔)。
そこで、各ステップの最適化構造を抽出するために、以下のような Python スクリプトを作成しました。このコードをextract_structures.py
などの名前で保存してください。
import re
import argparse
def parse_arguments():
parser = argparse.ArgumentParser(description='Extract optimized structures from Gaussian output file.')
parser.add_argument('gaussian_output', help='Path to the Gaussian output file')
parser.add_argument('coordinate_file', help='Path to save the XYZ file')
return parser.parse_args()
atomic_symbols = {
1: "H", 2: "He", 3: "Li", 4: "Be", 5: "B", 6: "C", 7: "N", 8: "O", 9: "F", 10: "Ne",
11: "Na", 12: "Mg", 13: "Al", 14: "Si", 15: "P", 16: "S", 17: "Cl", 18: "Ar", 19: "K", 20: "Ca",
}
def extract_structures(input_file_path):
structures = []
with open(input_file_path, 'r') as file:
lines = file.readlines()
i = 0
current_structure = None
while i < len(lines):
if "Standard orientation" in lines[i]:
i += 5
coordinates_block = []
while "---" not in lines[i]:
coordinates_block.append(lines[i].strip())
i += 1
current_structure = "\\n".join(coordinates_block)
if "Stationary point found" in lines[i]:
if current_structure:
structures.append(current_structure)
current_structure = None
i += 1
return structures
def write_xyz_file(structures, xyz_file_path):
xyz_content = ""
for scan_point, structure in enumerate(structures, 1):
atom_lines = structure.strip().splitlines()
atom_count = len(atom_lines)
xyz_content += f"{atom_count}\\nScan point {scan_point}\\n"
for line in atom_lines:
parts = line.split()
atomic_number = int(parts[1])
atomic_symbol = atomic_symbols.get(atomic_number, "X")
x, y, z = float(parts[3]), float(parts[4]), float(parts[5])
xyz_content += f"{atomic_symbol} {x:12.6f} {y:12.6f} {z:12.6f}\\n"
with open(xyz_file_path, 'w') as xyz_file:
xyz_file.write(xyz_content)
def main():
args = parse_arguments()
structures = extract_structures(args.gaussian_output)
write_xyz_file(structures, args.coordinate_file)
print(f"Found {len(structures)} optimized structures")
print(f"XYZ file saved as: {args.coordinate_file}")
if __name__ == "__main__":
main()
スクリプトの動作
- Gaussian出力ファイルを開き、各行を順に読み込みます。
Standard orientation
という文字列を検索し、直後の座標ブロックを抽出します。Stationary point found
という文字列を検出したら、直前の構造を最適化構造として保存します。- 抽出したすべての最適化構造をXYZ形式に変換し、ファイルに出力します。
スクリプトの使い方
この Python スクリプトを実行するには、コマンドラインで以下のように入力します:
python extract_structures.py gaussian_output.log coordinate_file.xyz
ここで、gaussian_output.log
は Gaussian の出力ファイル、coordinate_file.xyz
は読み取った XYZ 座標を記録したファイルです。
スクリプトを実行すると、Scan 計算の各ステップにおける最適化構造が XYZ 形式で保存されます。得られた結果は以下のように活用できます:
- 分子構造可視化ソフトウェア(例:VMD、PyMOL)での表示と構造変化のアニメーション作成
- 特定の原子間距離や角度の変化の詳細な解析
- 他の計算ソフトウェアへの入力データとしての利用