#Load Modules from xlrd import * from xlwt import * from pandas import * import os import re #Open an excel sheet and import the data into a matrix def open_sesame(file_name,shift1,shift2,wd): inpt = open_workbook(str(wd)+str(file_name)+'.xls', 'r') array = inpt.sheet_by_name('Array') data=[] for i in xrange(array.nrows): row=[] row.append(float(array.cell_value(i, 0))+shift1) row.append(float(array.cell_value(i, 1))+shift2) row.append(float(array.cell_value(i, 2))) data.append(row) #for i in xrange(array.nrows-6): #row=[] #row.append(float(array.cell_value(i+6, 0))+shift1) #row.append(float(array.cell_value(i+6, 1))+shift2) #row.append(float(array.cell_value(i+6, 2))) #data.append(row) #If you are taking our excel files directly from the website, they have 6 extra lines at the top, so the code will not run. #To avoid this, unblocked the lines above with array.nrows-6 and i+6 and block off the lines without them. #If you are generating the data yourself, these 6 lines will not appear as they were manually entered into the PES Arrays. #In this scenario, use the for loop without +/-6 #Get only unique data points. #Part 1: Get every point in the range of 0 - 345 degrees for i in xrange(len(data)): if data[i][0] >= 360 and data[i][1] >= 360: data[i][0]=data[i][0]-360 data[i][1]=data[i][1]-360 elif data[i][0] >= 360 and data[i][1] < 0: data[i][0]=data[i][0]-360 data[i][1]=data[i][1]+360 elif data[i][0] < 0 and data[i][1] >= 360: data[i][0]=data[i][0]+360 data[i][1]=data[i][1]-360 elif data[i][0] < 0 and data[i][1] < 0: data[i][0]=data[i][0]+360 data[i][1]=data[i][1]+360 elif data[i][0] >= 360: data[i][0]=data[i][0]-360 elif data[i][1] >= 360: data[i][1]=data[i][1]-360 elif data[i][0] < 0: data[i][0]=data[i][0]+360 elif data[i][1] < 0: data[i][1]=data[i][1]+360 #Part 2: Sort data=sorted(data) #Part 3: Only keep unique elements new_data=[data[0]] for i in xrange(1,len(data)): if data[i] != data[i-1]: new_data.append(data[i]) return(new_data) #Use the energy matrix to trim the J-Coupling matrix def trim(PES,J,Ecut_off): trimmed_data=[] #check=[] for i in xrange(len(PES)): for k in xrange(len(J)): if PES[i][0] == J[k][1] and PES[i][1] == J[k][0] and PES[i][2] < Ecut_off: trimmed_data.append(J[k]) return(trimmed_data) def trim2(Pucker1,Pucker2,T,Pcut_off): trimmed_data2=[] #check=[] for i in xrange(len(Pucker1)): for k in xrange(len(T)): if Pucker1[i][0] == T[k][0] and Pucker1[i][1] == T[k][1] and Pucker1[i][2] < Pcut_off: trimmed_data2.append(T[k]) T2=trimmed_data2 trimmed_data3=[] for i in xrange(len(Pucker2)): for k in xrange(len(T2)): if Pucker2[i][0] == T2[k][0] and Pucker2[i][1] == T2[k][1] and Pucker2[i][2] < Pcut_off: trimmed_data3.append(T2[k]) return(trimmed_data3) def trimlength(PES,J,Ecut_off,Pucker1,Pucker2,Pcut_off): trimmed_data=[] #check=[] for i in xrange(len(PES)): for k in xrange(len(J)): if PES[i][0] == J[k][1] and PES[i][1] == J[k][0] and PES[i][2] < Ecut_off: trimmed_data.append(J[k]) print "Length of trimmed data by energy= "+ str(len(trimmed_data)) T=trimmed_data trimmed_data2=[] for i in xrange(len(Pucker1)): for k in xrange(len(J)): if Pucker1[i][0] == J[k][0] and Pucker1[i][1] == J[k][1] and Pucker1[i][2] < Pcut_off: trimmed_data2.append(J[k]) T2=trimmed_data2 trimmed_data3=[] for i in xrange(len(Pucker2)): for k in xrange(len(T2)): if Pucker2[i][0] == T2[k][0] and Pucker2[i][1] == T2[k][1] and Pucker2[i][2] < Pcut_off: trimmed_data3.append(T2[k]) print "Length of trimmed data by puckering= "+ str(len(trimmed_data3)) T3=trimmed_data3 trimmed_data4=[] for i in xrange(len(PES)): for k in xrange(len(T3)): if PES[i][0] == T3[k][0] and PES[i][1] == T3[k][1] and PES[i][2] < Ecut_off: trimmed_data4.append(T3[k]) print "Length of trimmed data by energy and puckering= "+ str(len(trimmed_data4)) def write_data(file_name,trimmed): w = Workbook() Array = w.add_sheet('Array') for i in xrange(len(trimmed)): Array.write(i,0,int(trimmed[i][0])) Array.write(i,1,int(trimmed[i][1])) try: Array.write(i,2,float(trimmed[i][2])) except ValueError: Array.write(i,2,str(trimmed[i][2])) w.save(str(wd)+str(file_name)+' trimmed.xls') def run_code(PES_name,Pucker_name1,Pucker_name2,J_name,shift1E,shift2E,Ecut_off,Pcut_off,wd): PES_matrix=open_sesame(PES_name,shift1E,shift2E,wd) Pucker_matrix1=open_sesame2(Pucker_name1,wd) Pucker_matrix2=open_sesame2(Pucker_name2,wd) J_matrix=open_sesame2(J_name,wd) trimmed=trim(PES_matrix,J_matrix,Ecut_off) trimmed2=trim2(Pucker_matrix1,Pucker_matrix2,trimmed,Pcut_off) trimlength(PES_matrix,J_matrix,Ecut_off,Pucker_matrix1,Pucker_matrix2,Pcut_off) write_data(J_name,trimmed2) #Makes the trimmer automated wd = "/Users/seriannilab/Desktop/Workbench/" allFiles = os.listdir(wd) results = [] for f in os.listdir(wd): if f.startswith('Array'): results.append(f) m = [] new=[] for i in xrange(len(results)): m= re.sub(r'(\w+)\s(\w+)\s(\w+.*)(\.xls)',('\g<1> \g<2> \g<3>'), results[i]) new.insert(i, m) f_n = new[i] for i in xrange(len(new)): run_code("PES","Acceptor","Donor",new[i],-120,120,10.0,35.0,wd) data=[] trimmed_data=[] #for i in xrange(len(new)): #run_code(name of PES file,name of Acceptor ring puckering file,name of Donor ring puckering file,new[i],PES shift1,PES shift2,energy cutoff,puckering cutoff,wd) #data=[] #trimmed_data=[] #Similar to the Make Energy Plot code: the shifts correspond to where the torion angle appears in the Optim_Psi#_Phi(fixed).z or Optim_Phi#_Psi(fixed).z file names. #Therefore, if phi is listed first, shift1 is the phi shift and shift2 is the psi shift and vice-versa #run_code("PES", "Array 2J C1-C2-C3",0,0,0,0,10.0,wd) #run_code("PES_Array", "Array 3J H1'-C1'-O3-C3",0,0,0,0,10.0,wd) #run_code("PES_Array", "Array 2J C1'-O3-C3",0,0,0,0,10.0,wd) #run_code("PES_Array", "Array 2J C2'-C1'-H1'",0,0,0,0,10.0,wd) #run_code("PES_Array", "Array 3J C1'-O3-C3-C2",0,0,0,0,10.0,wd) #run_code("PES_Array", "Array 3J C1'-O3-C3-C4",0,0,0,0,10.0,wd) #run_code("PES_Array", "Array 3J C1'-O3-C3-H3",0,0,0,0,10.0,wd) #run_code("PES_Array", "Array 2J C2-C3-H3",0,0,0,0,10.0,wd) #run_code("PES_Array", "Array 2J C4-C3-H3",0,0,0,0,10.0,wd) #run_code("PES_Array", "Array 2J C2-C3-C4",0,0,0,0,10.0,wd) #run_code("PES_Array","Array 1J C3-C4",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 1J C4-C5",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 2J C1'-O4-C4",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 2J C2-C3-C4",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 2J H3-C3-C4",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 2J H4-C4-C3",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 3J C1'-O4-C4-C3",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 3J C1'-O4-C4-C5",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 3J C1'-O4-C4-H4",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 3J C2'-C1'-O4-C4",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 3J H1'-C1'-O4-C4",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 3J H2'-C2'-C1'-H1'",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 3J H2-C2-C3-C4",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 3J H3-C3-C4-H4",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 3J H4-C4-C3-C2",120,0,-120,120,10.0,wd) #run_code("PES_Array","Array 4J H5'-C5'-O5'-C1'-H1'",120,0,-120,120,10.0,wd)