Chapter 45

MOPACの計算ファイルの読み取り

poclabweb
poclabweb
2022.11.04に更新

3. MOPACの計算ファイルの読み取り

google driveへの接続

実行した結果のファイルを確認するためにgoogle driveに接続します。(すでに接続してある場合には必要ありません。)

from google.colab import drive
drive.mount('/content/drive')

1つの分子の読み取り

arcファイルの読み取り確認を行います。
目で見て確認する場合には、ファイルをクリックしてかくにんしたら、catコマンドで確認したりしましたが、プログラミングで数値を読み取るために文字列を読み込みます。

pythonでは open()やwithによりファイルを開いて、様々な数字や文字列を読み取ることができます。
https://note.nkmk.me/python-file-io-open-with/

練習として、ファイルの全てを読み取ったあとに、文字列を表示させてみます。
ここまで同じようにファイルをMOPACのファイルを作成してgoogle driveに保存させていれば、以下のコードでファイルが読み込めると思います。

with open('/content/drive/MyDrive/data/mopac/AGBQKNBQESQNJD-SSDOTTSWSA-N.out', mode='r') as f:
    lines = f.readlines()
    for line in lines:
        print(line, end='')

このプログラムを実行させると以下のように表示されます。

outファイルは計算結果や過程などを出力している。一方でarcのファイルは、計算結果がまとめて表示されています。

with open('/content/drive/MyDrive/data/mopac/AGBQKNBQESQNJD-SSDOTTSWSA-N.arc', mode='r') as f:
    lines = f.readlines()
    for line in lines:
        print(line, end='')

arcファイルの SUMMARY OF PM7 CALCULATIONは、以下の通りになります。

この中で、HOMOの情報を取得してみたいと思います。

また、ファイル名としてコメントで記載したsmilesやinchiの情報および、ファイル名にしたinchiKeyの情報も取得したいと思います。

ファイル名の取得には、標準ライブラリーのosのos.path.basenameを使用しています。
その後、メモとして残したsmilesとinchiの行を出力させています。また、HOMOという文字列があるところを探し出して、その行のHOMOの値を取得しています。

import os
file_path = "/content/drive/MyDrive/data/mopac/AGBQKNBQESQNJD-SSDOTTSWSA-N.arc"
# ファイル名の取得
name = os.path.splitext(os.path.basename(file_path))[0]
# 取得したファイル名をプリント
print(name)

with open(file_path, mode='r') as f:
    lines = f.readlines()
    #stripメソッドで空白や特定文字の削除
    lines_strip = [line.strip() for line in lines]
    print(lines[10].replace('\n', '')) # 11行目を取得してプリント
    print(lines[11].replace('\n', '')) # 12行目を取得してプリント
    #特定の文字列があるかを判定
    HOMO_line = [line for line in lines_strip if 'HOMO' in line]
    if HOMO_line != []:
      HOMO=float(str(HOMO_line[0][30:39]))
      print("HOMO: " + str(HOMO))

実行すると、inchiKey、smiles、inchi、HOMOの情報が確認できます。これをおうようすれば、ほかの情報も取得できると思います。

複数分子の読み取り

for文で指定したフォルダーの中にあるファイルを読み取って、読み取ったファイルの中にある InChIKey, inchi, smiles, HOMOをリストに入れる操作を行います。

# 空のリストをそれぞれ作成する。
InChIKey = []
inchi = []
smiles = []
HOMO = []

# どこのフォルダーのファイルを読み取るのかを指定する。
folder_path = "/content/drive/MyDrive/data/mopac/"

# globで指定したフォルダーの中にある`.arc`という名前のファイルを全て取得する。
for file_path in glob.glob(folder_path + "*.arc"):
  InChIKey.append(os.path.splitext(os.path.basename(file_path))[0])
  
  with open(file_path) as f:
    lines = f.readlines()

  lines_strip = [line.strip() for line in lines]
  smiles.append(lines[10].replace('\n', ''))
  inchi.append(lines[11].replace('\n', ''))
    
  HOMO_line = [line for line in lines_strip if 'HOMO' in line]
  if HOMO_line != []:
    HOMO.append(float(str(HOMO_line[0][30:39])))

また、読み取ったあとのリストを、その後の処理が行いやすいようにpandasのデータフレームに入れのは、以下の用に行います。

import pandas as pd

mylist = list(zip(InChIKey, inchi, smiles, HOMO))
df = pd.DataFrame(mylist, columns=["InChIKey", "inchi", "smiles", "HOMO"])
df

以上のプログラムを実行すると、dataframeにそれぞれの情報が入ったのが確認できる。

データの保存

フォルダ名(/content/drive/MyDrive/)のあとに続けてファイル名を指定するとgoogle driveに保存されます。この場合は、HOMO_output.csvという名前にしました。

df.to_csv('/content/drive/MyDrive/HOMO_output.csv')