def getClosestBHtree(coords, mpos): from bhtree import bhtreelib tree = bhtreelib.BHtree(coords, None, 10) index = [] for i in range(len(mpos)): pos = mpos[i] result = numpy.zeros(len(coords)).astype('i') nb = tree.closePoints((pos[0], pos[1], pos[2]), 77.0, result) index.append(result[:nb]) #index = [result[:tree.closePoints((pos[0],pos[1],pos[2]), 77.0, result )] for pos in mpos] return index
def collide_bhtree(residues, matrix, mesh): #object tree from bhtree import bhtreelib v = helper.ApplyMatrix(mesh.getVertices(), matrix.reshape(4, 4)) print len(v), v[0], len(coordinates) tree = bhtreelib.BHtree(tuple(v), None, 10) #lipids positon c = [] at = [] res = [] for r in residues: for a in r: c.append(a.get_coord()) at.append(a) res.append(r) closest = tree.closestPointsArray(numpy.array(c).tolist(), 30, 0) indices = numpy.nonzero(numpy.greater(closest, 0)) indices_close = numpy.take(closest, indices) # collide = False return indices_close[0], at, res
def displayClustersBonds(self, clusters, factor=0.7, ev=1.0): colors = [getattr(upy_colors, name) for name in upy_colors.cnames] centers = [] radiiG = [] radiiM = [] radii = [] if clusters is None: return for i, cluster in enumerate(clusters): centers.append(cluster.centroid.coords) radg = cluster.radiusOfGyration() radm = cluster.encapsualtingRadius() self.radg = radg #added by Graham 4/4/11 self.radm = radm #added by Graham 4/4/11 #rad = radg/0.7 rad = radg + factor * (radm - radg) radiiG.append(radg) radiiM.append(radm) radii.append(rad) ptCoords = [x.coords for x in cluster.points] # Create a bhtree for the ptCoords using a granility of 10 bht = bhtreelib.BHtree(centers, radiiM, 10) # find all pairs of atoms for which the distance is less than 1.1 # times the sum of the radii print("cutoff ", ev) pairs = bht.closePointsPairsInTree(ev) bhtreelib.freeBHtree(bht) # pairs is list of tuple of atom indices. nbc = len(clusters) bonds = {} for i, pair in enumerate(pairs): # 1- Get the atoms corresponding of the indices of the pair cl1 = clusters[int(pair[0])] cl2 = clusters[int(pair[1])] head = cl1.centroid.coords tail = cl2.centroid.coords rad = cl1.radiusOfGyration() + factor * ( cl1.encapsualtingRadius() - cl1.radiusOfGyration() ) #or diameter ? pinstance = self.helper.getObject("BC") if pinstance is None: pinstance = self.helper.Cylinder("BC", radius=1., length=1., res=10, pos=[0., 0., 0.], parent=None)[0] cyl = self.helper.getObject("clbond" + str(i)) if cyl is None: cyl = self.helper.oneCylinder("clbond" + str(i), head, tail, radius=rad, instance=pinstance, material=None, parent=self.CenterSpheres, color=colors[nbc]) else: self.helper.updateOneCylinder("clbond" + str(i), head, tail, radius=rad, color=colors[nbc]) self.clusterCenterCyl["clbond" + str(i)] = [head, tail, rad] if len(self.clusterCenterCyl) > len(pairs): for j in range(len(pairs), len(self.clusterCenterCyl)): # for cy in self.clusterCenterCyl[len(pair):]: # o=self.clusterCenterCyl[] self.helper.deleteObject("clbond" + str(j))
def set_surfPtsBht(self, verts): from bhtree import bhtreelib self.surfPtsBht = None if verts: self.surfPtsBht = bhtreelib.BHtree(verts, None, 10)
# node = pud.addSingleSphereRB(r,name=str(i)) # node.setPos(pos[0],pos[1],pos[2]) # return node #nodes =[addSphere(rads[i],grdPos[i],i) for i in range(NPT) ] #node = pud.addMultiSphereRB(rads,grdPos) #print ("time sphere ",time()-t) #t=time() #add the mesh vertices, faces, fn = tetrahedron(10.0) meshnode = pud.addMeshRB(vertices, faces) #print ("time mesh",time()-t) #computeCollisionTest #t=time() srfPts = vertices from panda3d.core import Mat4, Vec3, Point3 bht = bhtreelib.BHtree(tuple(vertices), None, 10) returnNullIfFail = 0 closest = bht.closestPointsArray(tuple(grdPos), diag, returnNullIfFail) hit = [] for i in range(NPT): start = Point3(grdPos[i][0], grdPos[i][1], grdPos[i][2]) end = Point3(srfPts[closest[i]][0] * diag, srfPts[closest[i]][1] * diag, srfPts[closest[i]][2] * diag) res = pud.world.rayTestAll(start, end) if res.hasHits(): print res.getNumHits() hit.append(res) #meshcontacts = pud.world.contactTest(meshnode.node()) #N=meshcontacts.getNumContacts() #for ct in meshcontacts.getContacts(): # m=ct.getManifoldPoint ()
def set_surfPtsBht(self, verts): from bhtree import bhtreelib self.surfPtsBht = None if verts != None and len(verts): self.surfPtsBht = bhtreelib.BHtree(verts, None, 10) self.nbSurfacePoints = len(verts)