見出し画像

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

この記事が気に入ったらサポートをしてみませんか?