Talk:Mod:Hunt Research Group/build freq
Appearance
python script to build frequency file from optimisation output
- copy the code into a script called "energy.py"
- to execute the script type "python build_freq.py file_name step
- if you have your execute directory in your path, you can alter the first line to your python executable and then you can just type "build_freq.py filename step"
- if step is not given the last structure from the optimisation file will be used
- if step is given the geometry from that step will be used
- NOTE: you will need to alter the string which prints the job key words into the gaussian input file
#!/opt/local/bin/python3
#
# build_freq.py
#
# python script to extract a given step structure, or the last structure from a gaussian log file and build a frequency input file
# to run the script type:
#
# python build_freq.py input_file_name step_no
#
# if no step_no is given the last geometry will be used
#
import sys
import os
dir=os.getcwd()
#==set up FILES ==
# if there are 2 arguments to use the last step (of the optimisation)
# if there are 3 arguments then use a specific step_no from the optimisation
if len(sys.argv) == 2:
infile=str(sys.argv[1])
step_no=int(0)
elif len(sys.argv) == 3:
infile=str(sys.argv[1])
step_no=int(sys.argv[2])
#since counting starts from zero
step_no=step_no-1
#endif
# if there is less or more arguments something is wrong
else:
print('to run the script please type: python build_freq.py input_file_name step_no')
sys.exit()
#endif
# check to see if the user has used the .log extenion or not
# find returns -1 if the sub-string is not found, or the index of where the sub-string starts
# we cut out the .log part if .log is found
i_infile=infile.find('.log')
if (i_infile == -1):
base=infile
else:
base=infile[:i_infile]
#endif
# now set up the base file names
log_file=base+'.log'
geom_file=base+'.xyz'
# if opt is not in the filename add freq to the filename
# if opt is already in the file change this to freq
i_opt=base.find('opt')
i_optf=base.find('optf')
if 'opt' in base:
print ('yes')
if 'optf' in base:
base2=base.replace('optf','freq')
else:
base2=base.replace('opt','freq')
# endif
else:
base2=base + '_freq'
#endif
com_file=base2+'.com'
# print out some reference information
s='directory is '
print('{0:}{1:}'.format(s,dir))
s='input file is '
print('{0:}{1:}'.format(s,infile))
s='output file is '
print('{0:}{1:}'.format(s,com_file))
#sys.exit()
#
#==set some DEFAULTS ==
col_num=[]
col_atom=[]
col_type=[]
col_x=[]
col_y=[]
col_z=[]
rep=0
n=0
go=False
atom_total=0
geom_count=0
#
#==start READING THE FILE ==
# open file and read lines one by one
f=open(log_file,"r")
# line is a variable which contains the line
line =f.readline()
while line :
line =f.readline()
# print('{0:}'.format(line))
#==extract GEOMETRY ==
# check for standard orientation text set 'go' if the text appears
# geom_count is the number of the geometry stored
# atom_total will be the number of atoms
# n will be stepping through the lines in std orientation section so set to zero for each time through
# if this is the first geometry print that a geometry is found
if 'Standard orientation:' in line:
go=True
s='Structure in standard orientation found '
n=1
geom_count=geom_count+1
if geom_count == 1 : print('{0:}'.format(s))
s='geometry count= '
# print('{0:}{1:}'.format(s,geom_count))
# endif
#
# if go is on then we need to extract and store the structure
# skip the next 4 lines, on the 5th start collecting structure
# m is our switch to stop, we stop once we get to the Rotational constants line
# m is also our switch to not print the lines of dashes
# we need to know how many atoms there are in total as well
# we simply append each data list into the arrays col which has components num,atom,type,x,y,z
while go:
n = n+1
m = 0
line =f.readline()
if 'Rotational constants (GHZ):' in line: m=-1
if '---------' in line: m=1
if n > 4 and m == 0 :
# print('line: {0:}'.format(line))
if geom_count == 1 : atom_total=atom_total+1
a1,b1,c1,d1,e1,f1=line.rstrip().split()
col_num.append(int(a1))
col_atom.append(int(b1))
col_type.append(int(c1))
col_x.append(float(d1))
col_y.append(float(e1))
col_z.append(float(f1))
if m == -1 : go=False
# close while
#close while
#== build COM FILE ==
# first give all the comp details
c=open(com_file,"w")
s="%nprocshared=48\n%mem=122000MB\n"
c.write('{0:}'.format(s))
s='%chk='+base2+'.chk\n'
c.write('{0:}'.format(s))
s="# freq m06/6-311G(d,p) geom=cartesian int=ultrafine scf=conver=10 \n\n"
c.write('{0:}'.format(s))
s="Title Card Required\n\n0 1\n"
c.write('{0:}'.format(s))
#other options are
#s="# freq b3lyp/gen pseudo=cards empiricaldispersion=gd3bj geom=cartesian \n "
#s="gfinput int=ultrafine scf=conver=10 test\n\n"
# now put in the coordinates
# if step_no is zero we only use the last geometry
# if step_no is given, we use that geometry
# geom_count is the number of geometries
# atom_total is the numer of atoms
# if taking the last geometry count backwards
# n is the internal counter
# n_start defines where to start printing
# n_stop defines wher to stop printing
#
n=0
n_start=0
n_stop=0
#print ('{0:}{1:}'.format('step_no=',step_no))
#print ('{0:}{1:}'.format('atom_total=',atom_total))
#print ('{0:}{1:}'.format('geom_count=',geom_count))
if step_no == 0 :
n_start=len(col_num)-atom_total
n_stop=len(col_num)
s=' structures found only the last is used'
print('{0:}{1:}'.format(geom_count,s))
else:
n_start=atom_total*step_no
n_stop=n_start+atom_total
print('{0:}{1:}{2:}{3:}'.format('using structure ',step_no+1,' of ',geom_count))
# endif
#print ('{0:}{1:}'.format('n_start=',n_start))
#print ('{0:}{1:}'.format('n_stop=',n_stop))
n=n_start
while n >= n_start and n < n_stop:
c.write('{0:>4d} {1: 09.6f} {2: 09.6f} {3: 09.6f} \n'.format(col_atom[n],col_x[n],col_y[n],col_z[n]))
# print('{0:>4d} {1:>4d} {2: 09.6f} {3: 09.6f} {4: 09.6f}'.format(col_num[n],col_atom[n],col_x[n],col_y[n],col_z[n]))
n=n + 1
#close while
# now put in the gen information
#s="\nCl 0\n6-311+G(d,p)\n****\n"
#t="In 0\nLANL2DZ\n****\n\n"
#u="In 0\nLANL2DZ\n\n\n"
#c.write('{0:}{1:}{2:}'.format(s,t,u))
# and add the last blank lines
s=" \n\n"
c.write('{0:}'.format(s))
# close all open files
f.close()
c.close()
#