Jump to content

Talk:Mod:Hunt Research Group/extract ESP charges

From ChemWiki

python script to extract ESP ie CHelpG charges

  • copy the code into a script called "extract_charges.py"
  • to execute the script type "python extract_charges.py file_name (without extension)
  • this will print to terminal the charges and create a file file_name.chg
  • if there are multiple sets of charges only the last set are printed to the file
#!/usr/bin/python
# extract_charges.py
#
# python script to extract and print ESP and NBO charges from a gaussian log file
# to run the script type python extract_charges.py file_name (without extension)
# charges will be printed and sent to file_name.chg
#
import sys
import os
dir=os.getcwd()
#
if len(sys.argv) == 1:
  print('to run the script please type: python extract_charges.py file_name (without extension)')
  sys.exit()
else:
  base=str(sys.argv[1])
  if base.endswith('log'):
    file=base
    base=base[0:-4]
  else:
    file=base+'.log'
# endif
  out=base+'.chg'
  s='directory is '
  print('{0:}{1:}'.format(s,dir))
  s='input file is '
  print('{0:}{1:}'.format(s,file))
  s='output file is '
  print('{0:}{1:}'.format(s,out))
#close if

#set some defaults
go=False
totalN=0
totalE=0
total=0
esp=0
nbo=0
col_Enum=[]
col_Eatom=[]
col_Eesp=[]
col_Nnum=[]
col_Natom=[]
col_Nnbo=[]

# open file and read lines one by one
f=open(file,"r")
c=open(out,"w")

line =f.readline()
while line:
# read a line from the file
  line =f.readline()

#==ESP charges==
# check for key text for ESP and set go if the text appears
# print and write fit error to out file
  if 'Charges from ESP fit' in line:
    go=True
    s='Charges from ESP fit '
    print('{0:}{1:}'.format(s,line[22:-1]))
    c.write('{0:}{1:} \n'.format(s,line[22:-1]))
    esp=esp+1 
    n=0
    m=0
# close if

# if go is on then read through the next section and print out the charges
# put the numbers in an array for atom number, atom type and esp value
# but also check if the charges are finished and exit if they are
# if see sum of ESP then stop
  while go:
    n = n+1
    line =f.readline()
    if 'Sum of ESP charges' in line: m=1    
    if n > 2 and m == 0 :
      a1,b1,c1=line.rstrip().split()
      col_Enum.append(int(a1))
      col_Eatom.append(b1)
      col_Eesp.append(float(c1))
      print('{0:>3s}  {1:>3s}  {2:>10s}'.format(a1,b1,c1))
#   close if
    if m == 1 : 
      go=False
      totalE=n-3
#   close if
# close while
#
# now keep going to search for NBO charges

#==NBO charges==
# check for key text set go if the text appears
# print and write key lines to out file
  if 'Summary of Natural Population Analysis:' in line:
    go=True
    s='Charges from NBO '
    print('{0:}'.format(s))
    p=0
    n=0
    nbo=nbo+1
# close if

# if go is on then print out the charges
# but also check if the charges are finished and exit if they are
  while go:
    n = n+1
    line =f.readline()
    if ' ======================' in line: p=1
    if n > 5 and p == 0 : 
      a1,b1,c1,d1,e1,f1,g1=line.rstrip().split()
      col_Natom.append(a1)
      col_Nnum.append(int(b1))
      col_Nnbo.append(float(c1))
      print('{0:>3s}  {1:>3s}  {2:>10s}'.format(a1,b1,c1))
    if p == 1 : 
      go=False
      totalN=n-6
#   close if
# close while

#now write to the .chg file
#formating decimal, total length=8 with 6 after decimal point leading zero to add space for plus
#formating the ^ means place in middle
#formating the > means right justify 
#
# we could have only ESP or only NBO
# also if there has been more than one set of charges advance counter to last set of charges

if totalE > 0 and totalN == 0 : 
  n=0
  total=totalE
  if esp != 0 : 
    n=len(col_Enum)-total
    total=total*esp
    s='only printing last set of charges'
#    c.write('{0:} \n'.format(s))
    print('{0:}'.format(s))
# endif
# print 0 into the NBO charges
  x=0
  while x < total :
    col_Nnbo.append(0.0)
    x=x+1
# close while
  c.write('{0:>4s}{1:>4s}  {2:^9s} \n'.format('no.','atm','ESP'))
  while n < total :
    c.write('{0:>4d}{1:>4s}  {2: 08.6f} \n'.format(col_Enum[n],col_Eatom[n],col_Eesp[n]))
    n=n + 1
# close while
#close if
#endif   

if totalE == 0 and totalN > 0 : 
  n=0
  total=totalN
  if nbo != 0 : 
    n=len(col_Nnum)-total
    total=total*nbo
    s=' sets of charges only printing last set of charges'
    c.write('{0:}{0:} \n'.format(nbo,s))
    print('{0:}'.format(s))
# endif
  x=0
  while x < total :
    col_Enum[x]=col_Nnum[x]
    col_Eatom[x]=col_Natom[x]
    col_Eesp.append(0.0)
    x=x+1
# close while
  c.write('{0:>4s}{1:>4s}  {2:^9s} \n'.format('no.','atm','NBO'))
  while n < total :
    c.write('{0:>4d}{1:>4s}  {2: 08.6f} \n'.format(col_Enum[n],col_Eatom[n],col_Nnbo[n]))
    n=n + 1
#  close while
#close if

if totalN > 0 and totalE > 0 : 
  n=0
  total=totalE
  if esp != 0 : 
    n=len(col_Enum)-total
    total=total*esp
    s=' sets of charges only writing last set of charges'
    print('{0:}{1:}'.format(nbo,s))
    c.write('{0:}{1:} \n'.format(nbo,s))
# endif
#
# now write out
#
  c.write('{0:>4s}{1:>4s}  {2:^9s}  {3:^9s} \n'.format('no.','atm','ESP','NBO'))
  while n < total :
    c.write('{0:>4d}{1:>4s}  {2: 08.6f}  {3: 08.6f} \n'.format(col_Enum[n],col_Eatom[n],col_Eesp[n],col_Nnbo[n]))
    n=n + 1
#  close while
#close if

# close all open files
c.close()
f.close()
#