def weakWaterCleanup(self): # #pose, cutoff_weak = -0.35, cutoff_strong=-0.5, interact_dist=3.5 ): """ clean-up extra_weak waters (increment ['water_rec_over_penalty'], if necessary""" org_waters = len(self.pose['water_bridge']) #ignore_types = ['HD'] lone_water = [] interact_dist = self.interact_dist**2 hb_types = ['OA', 'NA', 'SA', 'N', 'O', 'OA', 'NA', 'SA'] hb_types += hf.METALS for idx in range(len(self.pose['water_bridge'])): water = self.pose['water_bridge'][idx] score = self.pose['water_bridge_scores'][idx] # analyze only waters that are not ranked strong if score >= self.cutoff_strong: atom_pool = [ a for a in self.pose['water_bridge_contacts'][idx] if hf.getAtype(a) in hb_types] if self.debug: hf.writeList('ATOM_POOL_%d_HB_%d.pdb' % (idx, sess), atom_pool, addNewLine=True) lone_water.append(water) try: for a in atom_pool: if (dist(water, a, sq=0)<= interact_dist): #print "FOUND MATE", #print dist(water, a, sq=True) #print a.strip() #print "------------------" raise self.qs #print "NO MATE FOR THIS", score #print water.strip() except: lone_water.remove(water) for w in lone_water: idx = self.pose['water_bridge'].index(w) del self.pose['water_bridge'][idx] del self.pose['water_bridge_contacts'][idx] # EXPERIMENTAL #w_score = self.pose['water_bridge_scores'][idx] #if w_score > # XXX THIS shouldn't happen: # a weakly bound water could be hanging in the bulk, but it should be accounted for # ...? # how to describe the bulk solvent? # combine desolv map + discrete waters? # self.pose['water_over_rec_penalty'].append( -self.pose['water_bridge_scores'].pop(idx) ) # update PDBQT text #print pose['water_over_rec_penalty'] # XXX text_idx = self.pose['text'].index(w) del self.pose['text'][text_idx] if self.debug: print "LONE WATERS # REMOVED: ", (org_waters- len(self.pose['water_bridge']) )