コード例 #1
0
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