#!/usr/bin/env python

from openeye.oechem import *
import os,sys

ifs = oemolistream()
ofs = oemolostream()

if(ifs.open(sys.argv[1]) == 1):

  if (ofs.open(sys.argv[2]) == 1):

    nam = {}
    csyn = {}
    nsyn = {}
    csum = {}
    pc = {}
    z = {}

    for mol in ifs.GetOEGraphMols():

      OEPerceiveSymmetry(mol)

      i=0
      j=0
      k=0
      l=0
      m=0
      n1=0
      sc = 0
      csum1=0.0
      csum2=0.0
      diff=0.0
      rounded=0.0
     
      for atom in mol.GetAtoms():
        i=i+1
        nam[i]=""
        csyn[i]=0
        csum[i]=0.0
        nsyn[i]=0

      for atom in mol.GetAtoms():
        j=j+1
        pc[j]=atom.GetPartialCharge()
        nam[j]=atom.GetName()
        csyn[j]=atom.GetSymmetryClass()
        csum[atom.GetSymmetryClass()]+=atom.GetPartialCharge()
        nsyn[atom.GetSymmetryClass()]+=1

      for atom in mol.GetAtoms():
        k=k+1
        sc = atom.GetSymmetryClass()
        x = float(csum[sc])
        y = float(nsyn[sc])
        z[k]=x/y
        a = "%12.4f" % z[k]
        csum1 += float(a)

      rounded = round(csum1)
      diff = csum1-rounded

#      sys.stdout.write("csum1: %12.5f\n" % csum1)

      for atom in mol.GetAtoms():
        l=l+1
        if nsyn[l] == 1 and n1 < 1:
          n1+=1
          z[l]-=diff
        a = "%12.4f" % z[l]
        csum2 += float(a)
        z[l]=float(a)

#      sys.stdout.write("csum2: %12.6f\n" % csum2)

      for atom in mol.GetAtoms():
        m=m+1
        atom.SetPartialCharge(z[m])

      OEWriteMolecule(ofs, mol)

  else:
    sys.stderr.write("Unable to open output file\n")

else:
  sys.stderr.write("Unable to open input file\n")
