コード例 #1
0
    def clusterWaters(self):  #pose, clust_tolerance=2.0, desolvEntropy=0):
        # cluster waters
        # XXX
        # energy from the cluster?
        # once 3 waters are reclustered (3->1)
        # two desolvEntropy penalties should be issued?
        # XXX
        unclustered_waters = self.pose[
            'water_bridge'][:]  # XXX NOT SURE IT"S NECESSARY

        # cluster waters
        water_clusters = hf.clusterAtoms(unclustered_waters,
                                         tol=self.clust_tol)

        # calculate clustering energy
        self.pose['water_cluster_penalty'] = []
        remove_from_text = []
        for pop in water_clusters:
            if len(pop) > 1:
                this_cluster_centroid = hf.avgCoord(pop)
                this_cluster_penalty = -self.desolvEntropy * (len(pop) - 1)
                this_cluster_energy = 0
                this_cluster_contacts = []
                closest_to_centroid = None
                closest_dist = 999999
                for w in pop:
                    # get the w_index + w_score
                    idx = self.pose['water_bridge'].index(w)
                    this_cluster_energy += self.pose['water_bridge_scores'][
                        idx]
                    remove_from_text.append(w)
                    # find water closest to centroid (to be conserved)
                    # get the distance from the cluster average
                    centr_dist = hf.quickdist(hf.atomCoord(w),
                                              this_cluster_centroid,
                                              sq=False)
                    a = [hf.makePdb(coord=this_cluster_centroid)]
                    #writeList('centroid.pdb', a)
                    if centr_dist <= closest_dist:
                        closest_dist = centr_dist
                        closest_to_centroid = w
                    del self.pose['water_bridge'][idx]
                    del self.pose['water_bridge_scores'][idx]
                    # update contacts
                    for a in self.pose['water_bridge_contacts'][idx]:
                        if not a in this_cluster_contacts:
                            this_cluster_contacts.append(a)
                    del self.pose['water_bridge_contacts'][idx]
                # update PDBQT text
                # XXX DEBUGGINGH
                #print type(remove_from_text), remove_from_text[0]
                #writeList('REMOVING_WATERS.pdb', remove_from_text)
                #writeList('current_ligand.pdbqt', pose['text'])

                for w in remove_from_text:
                    if not w == closest_to_centroid:
                        try:
                            text_idx = self.pose['text'].index(w)

                            del self.pose['text'][text_idx]
                        except:
                            pass
                # use the closest to be updated with clustering coords
                closest_index = self.pose['text'].index(closest_to_centroid)
                water = self.pose['text'][closest_index]
                coord_text = "%8.3f%8.3f%8.3f" % (this_cluster_centroid[0],
                                                  this_cluster_centroid[1],
                                                  this_cluster_centroid[2])
                cluster_water = water[0:30] + coord_text + water[
                    54:]  # XXX ugly, but it works...
                self.pose['text'][closest_index] = cluster_water
                # update water_bridge list+score, water_cluster_penalty list
                self.pose['water_bridge'].append(cluster_water)
                self.pose['water_bridge_scores'].append(this_cluster_energy)
                self.pose['water_cluster_penalty'].append(this_cluster_penalty)
                self.pose['water_bridge_contacts'].append(
                    this_cluster_contacts)
                if self.debug:
                    print "CLUSTER SIZE", len(pop)
                    print "CLUSTER ENRG", this_cluster_energy
                    print "CLUSTER PENL", this_cluster_penalty
                    #print "CLUSTER FINL", clust_energy+clust_penalty
                    print "=============="
コード例 #2
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 
コード例 #3
0
ファイル: WaterProcessing.py プロジェクト: damjanmk/Raccoon2
    def clusterWaters(self): #pose, clust_tolerance=2.0, desolvEntropy=0):
        # cluster waters
        # XXX
        # energy from the cluster?
        # once 3 waters are reclustered (3->1)
        # two desolvEntropy penalties should be issued?
        # XXX
        unclustered_waters = self.pose['water_bridge'][:] # XXX NOT SURE IT"S NECESSARY

        # cluster waters
        water_clusters = hf.clusterAtoms(unclustered_waters, tol=self.clust_tol)

        # calculate clustering energy
        self.pose['water_cluster_penalty'] = []
        remove_from_text = []
        for pop in water_clusters:
            if len(pop)>1:
                this_cluster_centroid = hf.avgCoord(pop)
                this_cluster_penalty = -self.desolvEntropy * (len(pop)-1)
                this_cluster_energy = 0
                this_cluster_contacts = []
                closest_to_centroid = None
                closest_dist = 999999
                for w in pop:
                    # get the w_index + w_score
                    idx = self.pose['water_bridge'].index(w)
                    this_cluster_energy += self.pose['water_bridge_scores'][idx]
                    remove_from_text.append(w)
                    # find water closest to centroid (to be conserved)
                    # get the distance from the cluster average
                    centr_dist =  hf.quickdist( hf.atomCoord(w), this_cluster_centroid, sq = False)
                    a = [ hf.makePdb(coord=this_cluster_centroid) ]
                    #writeList('centroid.pdb', a)
                    if centr_dist <= closest_dist:
                        closest_dist = centr_dist
                        closest_to_centroid = w
                    del self.pose['water_bridge'][idx]
                    del self.pose['water_bridge_scores'][idx]
                    # update contacts
                    for a in self.pose['water_bridge_contacts'][idx]:
                        if not a in this_cluster_contacts:
                            this_cluster_contacts.append(a)
                    del self.pose['water_bridge_contacts'][idx]
                # update PDBQT text
                # XXX DEBUGGINGH
                #print type(remove_from_text), remove_from_text[0]
                #writeList('REMOVING_WATERS.pdb', remove_from_text)
                #writeList('current_ligand.pdbqt', pose['text'])

                for w in remove_from_text:
                    if not w == closest_to_centroid:
                        try:
                            text_idx = self.pose['text'].index(w)

                            del self.pose['text'][text_idx]
                        except:
                            pass
                # use the closest to be updated with clustering coords
                closest_index = self.pose['text'].index(closest_to_centroid)
                water = self.pose['text'][closest_index]
                coord_text = "%8.3f%8.3f%8.3f" % (this_cluster_centroid[0], 
                                                  this_cluster_centroid[1],
                                                  this_cluster_centroid[2])
                cluster_water = water[0:30]+coord_text+water[54:] # XXX ugly, but it works...
                self.pose['text'][closest_index] = cluster_water
                # update water_bridge list+score, water_cluster_penalty list
                self.pose['water_bridge'].append(cluster_water)
                self.pose['water_bridge_scores'].append(this_cluster_energy)
                self.pose['water_cluster_penalty'].append(this_cluster_penalty)
                self.pose['water_bridge_contacts'].append(this_cluster_contacts)
                if self.debug:
                    print "CLUSTER SIZE", len(pop)
                    print "CLUSTER ENRG", this_cluster_energy
                    print "CLUSTER PENL", this_cluster_penalty
                    #print "CLUSTER FINL", clust_energy+clust_penalty
                    print "=============="