PythonでGaussianのlogからHOMOとLUMOのエネルギーを抽出してcsvにまとめる
アプリケーション化する都合でnumpyとか使わずに書いてたり,色々複雑になってます。
#!/usr/bin/env python
# coding: utf-8
import os
from os import chdir
import sys
import argparse
import openpyxl
from openpyxl.styles import numbers
import openpyxl.drawing.image
from io import BytesIO
import glob
def data_extraction(f):で,その下に書いたコードの操作を定義しています。同じコード内であれば,data_extraction(f)として操作を呼び出せます。
with open(f, 'r') as XXX:でファイル開いて,s = XXX.read()でsに開いたテキストを入れてます。
以後に共通しますが,シンプルに書くならtry/exceptとかは不要。
def data_extraction(f):
try:
with open(f, 'r') as glog:
s = glog.read()
return s
except:
print("Error for " + f)
E1 = s .rfind('KEYWORD')で,sの中のどこをキーワードとして引っ掛けて拾ってくるかの指定と,tot_ene = s[E1:E2]で,実際にsの中の指定したキーワードに挟まれた範囲をtot_eneに入れてます。
rfindはテキストの最後尾から探します。findはテキストの先頭から探します。
replaceで不要な文字を削除したり,countで数を数えたり(HOMOを取ってくるために),splitでスペースだけで区切られた文字列分けたりなど。
上手い人が上手いこと書けばもっと綺麗に書けると思われます。
def text_extraction(s):
try:
E1 = s .rfind(' SCF Done:')
E2 = s .rfind(' A.U. after')
P1 = s .rfind(' Occupied')
P2 = s .rfind(' Virtual')
P3 = s .rfind(' The electronic state is')
P4 = s .rfind(' Condensed to atoms (all electrons):')
tot_ene = s[E1:E2]
occ_num = s[P1:P2]
virt_num = s[P2:P3]
ene = s[P3:P4]
E3 = tot_ene .rfind('-')
P5 = ene .rfind(' The electronic state is')
P6 = ene .find(' Alpha virt. eigenvalues --')
P7 = ene .rfind(' Condensed to atoms (all electrons):')
tot_ene = tot_ene[E3:]
occ_ene = ene[P5:P6]
virt_ene = ene[P6:P7]
tot_ene = tot_ene.replace(' ','')
occ_num = occ_num.count(' (')
occ_num = int(occ_num)
virt_num = virt_num.count(' (')
virt_num = int(virt_num)
occ_ene = occ_ene.replace('The electronic state is 1-A.', '')
occ_ene = occ_ene.replace('Alpha occ. eigenvalues -- ','')
occ_ene = occ_ene.replace('¥n ',' ')
occ_ene = occ_ene.split()
HOMO = occ_ene[occ_num - 1]
virt_ene = virt_ene.replace('Alpha virt. eigenvalues --','')
virt_ene = virt_ene.replace('¥n ',' ')
virt_ene = virt_ene.split()
LUMO = virt_ene[0]
au_ev = 27.211
HOMO_eV = float(HOMO) * au_ev
LUMO_eV = float(LUMO) * au_ev
tot_HL = str(tot_ene) + ',' + str(HOMO) + ',' + str(HOMO_eV) + ',' + str(LUMO) + ',' + str(LUMO_eV)
return tot_HL
except:
tot_HL = 'error' + ',' + 'error' + ',' + 'error'
return tot_HL
for f in flist:でflistの中のfに対して,上で定義したdata_extractionなどの操作を実行する操作を定義
def HOMO_LUMO_extraction(flist):
output = ''
for f in flist:
s = data_extraction(f)
tot_HL = text_extraction(s)
out = str(f.replace('.log','')) + ',' + tot_HL + '\n'
output = output + out
return output
現在の階層にある.logを探して,flistに入れ,flistに対して上で定義した操作を実行し,RESULT.csvに出力する操作を定義
ここから先は
500字
¥ 100
この記事が気に入ったらサポートをしてみませんか?