3. MOPACの計算ファイルの読み取り
google driveへの接続
実行した結果のファイルを確認するためにgoogle driveに接続します。(すでに接続してある場合には必要ありません。)
from google.colab import drive
drive.mount('/content/drive')
1つの分子の読み取り
arcファイルの読み取り確認を行います。
目で見て確認する場合には、ファイルをクリックしてかくにんしたら、catコマンドで確認したりしましたが、プログラミングで数値を読み取るために文字列を読み込みます。
pythonでは 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')