def findStacking(set1, set2 = None): """ INPUT(set1, set2): scan the sets to find p- and t-stackings INPUT(set1): scan the set to find self-stackings (p-, t-) P-STACKING ---c--- | A V | ---c--- """ DEBUG = 0 MAXDIST_TSTACK = 5.0 # centroids distance (T-stacking)Angstroms MAXDIST_PSTACK = 4.2 # centroids distance (P-stacking) Angstroms MAXDIST_PSTACK = MAXDIST_PSTACK**2 MAXDIST_TSTACK = MAXDIST_TSTACK**2 #MAXDIST = 5.0 # Angstroms #MAXDIST = MAXDIST**2 PTOL = 29.9 # P-stacking plane angle tolerance (degr) TODO test values on a wide set! TTOL = 14.9 # T-stacking plane angle tolerance (degr) TODO test values on a wide set! PLANE_DIST_TSTACK = 2.5 t_accepted = [] p_accepted = [] if not set2: set2 = set1 for g1 in set1.keys(): R1 = set1[g1] for g2 in set2.keys(): if not g1 == g2: # this is for intramolecular stackings (set1 = set2) R2 = set2[g2] if not ([g1,g2] in p_accepted) and not ([g2,g1] in p_accepted): if (not [g1,g2] in t_accepted) and not ([g2,g1] in t_accepted): d = hf.quickdist(R1['centroid'], R2['centroid']) if d <= MAXDIST_TSTACK: #print "GOOD DIST: %2.3f" % sqrt(d), pdist = abs(hf.dot( R1['normal'][0], (R1['centroid']-R2['centroid']) )) pangle = abs(hf.vecAngle( R1['plane'], R2['plane'])) #print "DISTANCE: %2.2f <"% math.sqrt(d), math.sqrt(MAXDIST_TSTACK) #print "PTOL", PTOL #print "PDIST:", pdist #print "PANGLE:", pangle #print "======" #print "PANGLE-180", pangle-180 #print abs(pangle-180)<=PTOL or (pangle-PTOL)<=0 #print "PAANGLE-180 < PTOL", abs(pangle-180)<=PTOL #print "PANGLE-PTOL", pangle-PTOL #print "PANGLE-PTOL < 0", (pangle-PTOL)<=0 #print "\n\n" if d <= MAXDIST_PSTACK and ((abs(pangle-180)<=PTOL) or ((pangle-PTOL)<=0)): p_accepted.append([ g1, g2]) if DEBUG: print " ==> P-stacking", print "%s--%s plane angle: %2.1f | pdist: %2.2f\n\n" % (g1, g2, pangle, pdist), elif (( abs(pangle-90) <= TTOL) or ( abs(pangle-270)<=TTOL) ) and pdist < PLANE_DIST_TSTACK: t_accepted.append([ g1, g2]) print "XXX" if DEBUG: print "== > T-stacking", print "%s--%s plane angle: %2.1f " % (g1, g2, pangle), if ( abs(pangle-90) <= TTOL): print "ANGLE:",abs(pangle-90), "<", TTOL if ( abs(pangle-270)<=TTOL): print "ANGLE:", abs(pangle-270), "<", TTOL print "PLANE:",pdist, "<", PLANE_DIST_TSTACK return p_accepted, t_accepted