Say you've done a computation along the lines of this:
and want the data in a neat data file, like this:#P rBP86/GEN 5D Pseudo(Read) Opt=() Freq=() SCF=(MaxCycle=999 ) Punch=(MO) Pop=()
33.237 0.0023 0.0536 39.9976 0.0043 0.8305 69.7345 0.0129 0.3348 84.7005 0.0173 0.7027 [..] 3133.0068 6.2938 0.6114 3143.8021 6.3551 0.3775 3164.9242 6.4685 0.8829 3221.8787 6.6972 4.6005
Then you can use the following python (2.x) script, g09freq:
#!/usr/bin/python # Compatible with python 2.7 # Reads frequency output from a g09 (gaussian) calculation # Usage ex.: g09freq g09.log ir.dat import sys def ints2float(integerlist): for n in range(0,len(integerlist)): integerlist[n]=float(integerlist[n]) return integerlist def parse_in(infile): g09output=open(infile,'r') captured=[] for line in g09output: if ('Frequencies' in line) or ('Frc consts' in line) or ('IR Inten' in line): captured+=[line.strip('\n')] g09output.close() return captured def format_captured(captured): vibmatrix=[] steps=len(captured) for n in range(0,steps,3): freqs=ints2float(filter(None,captured[n].split(' '))[2:5]) forces=ints2float(filter(None,captured[n+1].split(' '))[3:6]) intensities=ints2float(filter(None,captured[n+2].split(' '))[3:6]) for m in range(0,3): vibmatrix+=[[freqs[m],forces[m],intensities[m]]] return vibmatrix def write_matrix(vibmatrix,outfile): f=open(outfile,'w') for n in range(0,len(vibmatrix)): item=vibmatrix[n] f.write(str(item[0])+'\t'+str(item[1])+'\t'+str(item[2])+'\n') f.close() return 0 if __name__ == "__main__": infile=sys.argv[1] outfile=sys.argv[2] captured=parse_in(infile) if len(captured)%3==0: vibmatrix=format_captured(captured) else: print 'Number of elements not divisible by 3 (freq+force+intens=3)' exit() success=write_matrix(vibmatrix,outfile) if success==0: print 'Read %s, parsed it, and wrote %s'%(infile,outfile)
Run it as e.g.
g09freq g09.log test.out
The output is compatible with gnuplot:
gnuplot> set xrange [3500:0] gnuplot> set yrange [10:-1] gnuplot> plot './test.out' u 1:2 w impulse
It's trivial to add gaussian broadening (see e.g. this post)
Hi! I'm a beginner in G09 and I found very useful your script; however, I would like to know if you have already tested your script? I am asking you that because my log file has 36 frequencies, but the output from the script only contains 24 data. I would really appreciate your help. Thanks
ReplyDeleteYou're right -- there's a small error with big repercussions:
Deletefor m in range(0,2):
vibmatrix+=[[freqs[m],forces[m],intensities[m]]]
should be
for m in range(0,3):
vibmatrix+=[[freqs[m],forces[m],intensities[m]]]
Otherwise it keeps ignoring the last frequency on each line in the output.
Hi,
ReplyDeleteI think using awk script will make this cleaner.
This is what I would have used to produce the same output.
==========================================
#!/bin/awk -f
/Frequencies/ { for (i=3;i<=NF; i++) { im++; freq[im ]=$i} }
/Frc consts/ { for (i=NF;i>=4; i--) fc[im-(NF-i)]=$i }
/IR Inten/ { for (i=NF;i>=4; i--) ir[im-(NF-i)]=$i }
END { for (i=1;i<=im;i++) print freq[i],fc[i],ir[i] }
==========================================
Hi it is useful script. Thanks for uploading.
ReplyDelete