diff --git a/cellpack/autopack/Compartment.py b/cellpack/autopack/Compartment.py index bde3833b2..2364e95bd 100644 --- a/cellpack/autopack/Compartment.py +++ b/cellpack/autopack/Compartment.py @@ -1313,13 +1313,14 @@ def BuildGrid_trimesh( self.center, self.encapsulating_radius + env.grid.gridSpacing * 2, return_sorted=True, - ) + ), + dtype=numpy.int32, ) self.log.info(f"GOT POINTS IN SPHERE {len(points_in_encap_sphere)}") point_compartment_ids = compartment_ids[points_in_encap_sphere] point_ids_to_assign = points_in_encap_sphere[point_compartment_ids == 0] - point_positions = master_grid_positions[point_ids_to_assign] + point_positions = numpy.float16(master_grid_positions[point_ids_to_assign]) # check surface points points_on_surface = trimesh_grid_surface.is_filled(point_positions) @@ -1327,6 +1328,7 @@ def BuildGrid_trimesh( # check inside points points_in_mesh = mesh_store.contains_points_mesh(self.gname, point_positions) + points_in_mesh = points_in_mesh & ~points_on_surface compartment_ids[point_ids_to_assign[points_in_mesh]] = -number insidePoints = point_ids_to_assign[points_in_mesh] @@ -2466,7 +2468,7 @@ def find_nearest(self, array, value): # TOD add and store the grid_distances (closest distance for each point). not only inside / outside def getSurfaceInnerPoints_sdf( - self, boundingBox, spacing, display=True, useFix=False + self, boundingBox, spacing, display=False, useFix=False ): """ Only compute the inner point. No grid. @@ -2538,7 +2540,7 @@ def getSurfaceInnerPoints_sdf( return pointinside[0], self.vertices def getSurfaceInnerPoints_kevin( - self, boundingBox, spacing, display=True, superFine=False + self, boundingBox, spacing, display=False, superFine=False ): """ Takes a polyhedron, and builds a grid. In this grid: @@ -2857,7 +2859,7 @@ def getSurfaceInnerPoints_kevin( return insidePoints, surfacePoints def getSurfaceInnerPoints_sdf_interpolate( - self, boundingBox, spacing, display=True, useFix=False + self, boundingBox, spacing, display=False, useFix=False ): """ Only compute the inner point. No grid. @@ -2923,7 +2925,7 @@ def getSurfaceInnerPoints_sdf_interpolate( # need to update the surface. need to create a aligned grid return pointinside[0], self.vertices - def getSurfaceInnerPoints(self, boundingBox, spacing, display=True, useFix=False): + def getSurfaceInnerPoints(self, boundingBox, spacing, display=False, useFix=False): """ Only compute the inner point. No grid. This is independant from the packing. Help build ingredient sphere tree and representation @@ -3208,7 +3210,7 @@ def create_voxelization( return image_data def getSurfaceInnerPointsPandaRay( - self, boundingBox, spacing, display=True, useFix=False + self, boundingBox, spacing, display=False, useFix=False ): """ Only compute the inner point. No grid. @@ -3363,7 +3365,7 @@ def getSurfaceInnerPointsPandaRay( return insidePoints, surfacePoints def getSurfaceInnerPointsPanda( - self, boundingBox, spacing, display=True, useFix=False + self, boundingBox, spacing, display=False, useFix=False ): """ Only compute the inner point. No grid. diff --git a/cellpack/autopack/Environment.py b/cellpack/autopack/Environment.py index 3a97bccf1..80be50ae4 100644 --- a/cellpack/autopack/Environment.py +++ b/cellpack/autopack/Environment.py @@ -213,9 +213,6 @@ def __init__(self, config=None, recipe=None): self.host = None self.afviewer = None - # version of setup used - self.version = "1.0" - # option for packing using host dynamics capability self.windowsSize = 100 self.windowsSize_overwrite = False @@ -2200,7 +2197,7 @@ def pack_grid( stime = time() if self.show_progress_bar: pbar = tqdm(total=totalNumMols, mininterval=0, miniters=1) - pbar.set_description(f"Packing {self.name}") + pbar.set_description(f"Packing {self.name}_{self.version}") while nbFreePoints: self.log.info( ".........At start of while loop, with vRangeStart = %d", vRangeStart diff --git a/cellpack/autopack/MeshStore.py b/cellpack/autopack/MeshStore.py index 0c56f956e..d42cc506f 100644 --- a/cellpack/autopack/MeshStore.py +++ b/cellpack/autopack/MeshStore.py @@ -4,6 +4,8 @@ import trimesh from cellpack import autopack +CHUNK_SIZE = 100000 + class MeshStore: def __init__(self): @@ -267,7 +269,17 @@ def contains_points(self, geomname, points): def contains_points_mesh(self, geomname, points): mesh = self.get_object(geomname) if mesh is not None: - return mesh.contains(points) + if len(points) <= CHUNK_SIZE: + return mesh.contains(points) # TODO: check for memory leak + else: + # chunk the points + for i in range(0, len(points), CHUNK_SIZE): + chunk = points[i : min(i + CHUNK_SIZE, len(points))] + if i == 0: + inside = mesh.contains(chunk) + else: + inside = numpy.append(inside, mesh.contains(chunk)) + return inside return numpy.full(len(points), False) def get_smallest_radius(self, geomname, center):