Mod:Hunt Research Group/charge arm
Appearance
CArm code
- make a file called CArm.py and copy the following into it
- this code needs some editing to make it general!!
- it reads data from cube files, nbo analysis, mulliken analysis ...
#!/usr/bin/python import sys, re def main(): global atoms global charge #print(atoms) #print(charge) print("=====================main=====================") CoM=[0,0,0] mass=0 for i in atoms: CoM[0]=CoM[0]+i[2]*masses[i[0]] CoM[1]=CoM[1]+i[3]*masses[i[0]] CoM[2]=CoM[2]+i[4]*masses[i[0]] mass=mass+masses[i[0]] #print(mass) CoM[0] = CoM[0] / mass CoM[1] = CoM[1] / mass CoM[2] = CoM[2] / mass print "center of mass:", CoM CoC=[0,0,0] COCC=0 uCOCC=0 for i in charge: #print(i) CoC[0]=CoC[0]+i[0]*i[3] CoC[1]=CoC[1]+i[1]*i[3] CoC[2]=CoC[2]+i[2]*i[3] COCC=COCC+i[3] uCOCC=uCOCC+abs(i[3]) #print(COCC) print "charge:", COCC CoC[0] = (CoC[0] / COCC) - CoM[0] CoC[1] = (CoC[1] / COCC) - CoM[0] CoC[2] = (CoC[2] / COCC) - CoM[0] #print(CoC) norm=(CoC[0]**2+CoC[1]**2+CoC[2]**2)**.5*0.529177 print "length:", norm CoC[0] = CoC[0] / norm CoC[1] = CoC[1] / norm CoC[2] = CoC[2] / norm print "direction:", CoC def cuberead(): print("===================cuberead===================") global atoms global charge cube=open("OTf-_FREQ.cube",'r') line=cube.readline() #print(line) line=cube.readline() #print(line) line=cube.readline() items=line.split() NAtoms=int(items[0]) origin=[0,0,0] origin[0]=float(items[1]) origin[1]=float(items[2]) origin[2]=float(items[3]) print(origin) line=cube.readline() items=line.split() Xstep=int(items[0]) Xvec=[0,0,0] Xvec[0]=float(items[1]) Xvec[1]=float(items[2]) Xvec[2]=float(items[3]) print(Xvec) line=cube.readline() items=line.split() Ystep=int(items[0]) Yvec=[0,0,0] Yvec[0]=float(items[1]) Yvec[1]=float(items[2]) Yvec[2]=float(items[3]) print(Yvec) line=cube.readline() items=line.split() Zstep=int(items[0]) Zvec=[0,0,0] Zvec[0]=float(items[1]) Zvec[1]=float(items[2]) Zvec[2]=float(items[3]) print(Zvec) atoms=[] for i in range(0,NAtoms): line=cube.readline() items=line.split() atoms.append([int(items[0]),float(items[1]),float(items[2]),float(items[3]),float(items[4])]) charge=[[0,0,0,0]] CSum=0 XfaceA=0 XfaceB=0 YfaceA=0 YfaceB=0 ZfaceA=0 ZfaceB=0 for x in range(0,Xstep): #print(x) for y in range(0,Ystep): z=0 while True: line=cube.readline() items=line.split() for j in items: #if x==0 : # XfaceA=XfaceA + float(j) #if x==Xstep-1 : # XfaceB=XfaceB + float(j) #if y==0 : # YfaceA=YfaceA + float(j) #if y==Ystep-1 : # YfaceB=YfaceB + float(j) #if z==0 : # ZfaceA=ZfaceA + float(j) #if z==Zstep-1 : # ZfaceB=ZfaceB + float(j) #charge.append([x*Xvec[0]+origin[0]+y*Yvec[0]+z*Zvec[0],x*Xvec[1]+y*Yvec[1]+z*Zvec[1]+origin[1],x*Xvec[2]+y*Yvec[2]+z*Zvec[2]+origin[2],float(j)]) charge=[[charge[0][0]+(x*Xvec[0]+y*Yvec[0]+z*Zvec[0]+origin[0])*float(j),charge[0][1]+(x*Xvec[1]+y*Yvec[1]+z*Zvec[1]+origin[1])*float(j),charge[0][2]+(x*Xvec[2]+y*Yvec[2]+z*Zvec[2]+origin[2])*float(j),float(j)+charge[0][3]]] z=z+1 #CSum=CSum-float(j)*Xvec[0]*Yvec[1]*Zvec[2] CSum=CSum-float(j) if z == Zstep : break #print(x+1,'of', Xstep) charge[0]=[charge[0][0]/abs(CSum),charge[0][1]/abs(CSum),charge[0][2]/abs(CSum),CSum*Xvec[0]*Yvec[1]*Zvec[2]] #print(XfaceA) #print(XfaceB) #print(YfaceA) #print(YfaceB) #print(ZfaceA) #print(ZfaceB) #print(CSum) #print(charge) for i in atoms: charge.append([i[2],i[3],i[4],i[1]]) #print(charge) #print([i[2],i[3],i[4],float(items[2])]) #print(CSum/Xvec[0]/Yvec[1]/Zvec[2]) return() def mullread(): print("===================mullread===================") global atoms global charge mull=open("OTf-_FREQ.log",'r') while True: line=mull.readline() if 'Standard orientation' in line: #print("hurra") atoms=[] for i in range(0,5): line=mull.readline() #print(line) while True: if '--' in line: break items=line.split() atoms.append([int(items[1]),float(items[1]),float(items[3])/0.529177,float(items[4])/0.529177,float(items[5])/0.529177]) line=mull.readline() #print(atoms) if "Mulliken atomic charges" in line: charge=[] for i in range(0,2): line=mull.readline() #print(line) for i in atoms: items=line.split() charge.append([i[2],i[3],i[4],float(items[2])]) line=mull.readline() #print(charge) if line=='': break return() def helpread(): print("===================helpread===================") global atoms global charge atoms=[] charge=[] mull=open("OTf-_FREQ.log",'r') while True: line=mull.readline() if 'Standard orientation' in line: #print("hurra") atoms=[] for i in range(0,5): line=mull.readline() #print(line) while True: if '--' in line: break items=line.split() atoms.append([int(items[1]),float(items[1]),float(items[3])/0.529177,float(items[4])/0.529177,float(items[5])/0.529177]) line=mull.readline() #print(atoms) if "Charges from ESP fit" in line: charge=[] for i in range(0,3): line=mull.readline() #print(line) for i in atoms: items=line.split() charge.append([i[2],i[3],i[4],float(items[2])]) line=mull.readline() #print(charge) if line=='': break return() def naturead(): print("===================naturead===================") global atoms global charge mull=open("OTf-_FREQ.log",'r') while True: line=mull.readline() if 'Standard orientation' in line: #print("hurra") atoms=[] for i in range(0,5): line=mull.readline() #print(line) while True: if '--' in line: break items=line.split() atoms.append([int(items[1]),float(items[1]),float(items[3])/0.529177,float(items[4])/0.529177,float(items[5])/0.529177]) line=mull.readline() #print(atoms) if "Summary of Natural Population Analysis" in line: charge=[] for i in range(0,6): line=mull.readline() #print(line) for i in atoms: items=line.split() charge.append([i[2],i[3],i[4],float(items[2])]) #print([i[2],i[3],i[4],float(items[2])]) line=mull.readline() #print(charge) if line=='': break return() masses = {7:14.00674, 16:32.066, 9:18.9984032, 1:1.00794, 6:12.0107, 14:28.0855, 17:35.4527, 8:15.9994} cuberead() main() #print(atoms) #print(charge) mullread() main() #print(atoms) #print(charge) naturead() main() #print(atoms) #print(charge) helpread() main() #print(atoms) #print(charge) quit()