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 "=============="
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
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 "=============="