def _parse_surface(self, data_arrays, data_arrays_part2, surface_type, should_center): meta_dict = self._get_meta_dict(data_arrays[0]) anatomical_structure_primary = meta_dict.get(self.ASP_ATTR) gid = meta_dict.get(self.UNIQUE_ID_ATTR) subject = meta_dict.get(self.SUBJECT_ATTR) title = meta_dict.get(self.NAME_ATTR) # Now try to determine what type of surface we have # If a surface type is not explicitly given we use the type specified in the metadata if surface_type == OPTION_READ_METADATA: surface_type = anatomical_structure_primary if surface_type is None: raise ParseException("Please specify the type of the surface") surface = make_surface(surface_type) if surface is None: raise ParseException("Could not determine surface type! %s" % surface_type) # Now fill TVB data type with metadata if gid is not None: gid = gid.replace("{", "").replace("}", "") surface.gid = gid if subject is not None: surface.subject = subject if title is not None: surface.title = title surface.storage_path = self.storage_path surface.zero_based_triangles = True # Now fill TVB data type with geometry data vertices = data_arrays[0].data triangles = data_arrays[1].data vertices_in_lh = len(vertices) # If a second file is present append that data if data_arrays_part2 is not None: # offset the indices offset = len(vertices) vertices = np.vstack([vertices, data_arrays_part2[0].data]) triangles = np.vstack( [triangles, offset + data_arrays_part2[1].data]) if should_center: vertices = center_vertices(vertices) # set hemisphere mask if cortex if isinstance(surface, CorticalSurface): # if there was a 2nd file then len(vertices) != vertices_in_lh surface.hemisphere_mask = np.zeros(len(vertices), dtype=np.bool) surface.hemisphere_mask[vertices_in_lh:] = 1 surface.vertices = vertices surface.triangles = triangles return surface
def _parse_surface(self, data_arrays, data_arrays_part2, surface_type, should_center): meta_dict = self._get_meta_dict(data_arrays[0]) anatomical_structure_primary = meta_dict.get(self.ASP_ATTR) gid = meta_dict.get(self.UNIQUE_ID_ATTR) subject = meta_dict.get(self.SUBJECT_ATTR) title = meta_dict.get(self.NAME_ATTR) # Now try to determine what type of surface we have # If a surface type is not explicitly given we use the type specified in the metadata if surface_type == OPTION_READ_METADATA: surface_type = anatomical_structure_primary if surface_type is None: raise ParseException("Please specify the type of the surface") surface = make_surface(surface_type) if surface is None: raise ParseException("Could not determine surface type! %s" % surface_type) # Now fill TVB data type with metadata if gid is not None: gid = gid.replace("{", "").replace("}", "") surface.gid = gid if subject is not None: surface.subject = subject if title is not None: surface.title = title surface.storage_path = self.storage_path surface.set_operation_id(self.operation_id) surface.zero_based_triangles = True # Now fill TVB data type with geometry data vertices = data_arrays[0].data triangles = data_arrays[1].data vertices_in_lh = len(vertices) # If a second file is present append that data if data_arrays_part2 is not None: # offset the indices offset = len(vertices) vertices = np.vstack([vertices, data_arrays_part2[0].data]) triangles = np.vstack([triangles, offset + data_arrays_part2[1].data]) if should_center: vertices = center_vertices(vertices) # set hemisphere mask if cortex if isinstance(surface, CorticalSurface): # if there was a 2nd file then len(vertices) != vertices_in_lh surface.hemisphere_mask = np.zeros(len(vertices), dtype=np.bool) surface.hemisphere_mask[vertices_in_lh:] = 1 surface.vertices = vertices surface.triangles = triangles return surface
def launch(self, view_model): # type: (ObjSurfaceImporterModel) -> [SurfaceIndex] """ Execute import operations: """ try: surface = make_surface(view_model.surface_type) if surface is None: raise ParseException("Could not determine surface type! %s" % view_model.surface_type) surface.zero_based_triangles = True with open(view_model.data_file) as f: obj = ObjSurface(f) if view_model.should_center: vertices = center_vertices(obj.vertices) else: vertices = obj.vertices surface.vertices = vertices surface.triangles = obj.triangles if obj.have_normals: self.log.debug("OBJ came with normals included") surface.vertex_normals = obj.normals else: self.log.warning( "OBJ came without normals. We will try to compute them...") surface.number_of_vertices = surface.vertices.shape[0] surface.number_of_triangles = surface.triangles.shape[0] surface.compute_triangle_normals() surface.compute_vertex_normals() validation_result = surface.validate() if validation_result.warnings: self.add_operation_additional_info(validation_result.summary()) return h5.store_complete(surface, self.storage_path) except ParseException as excep: self.log.exception(excep) raise LaunchException(excep)
def launch(self, surface_type, data_file, should_center=False): """ Execute import operations: """ try: surface = make_surface(surface_type) if surface is None: raise ParseException("Could not determine surface type! %s" % surface_type) surface.storage_path = self.storage_path surface.set_operation_id(self.operation_id) surface.zero_based_triangles = True with open(data_file) as f: obj = ObjSurface(f) if should_center: vertices = center_vertices(obj.vertices) else: vertices = obj.vertices surface.vertices = vertices surface.triangles = obj.triangles if obj.have_normals: self.log.debug("OBJ came with normals included") surface.vertex_normals = obj.normals else: self.log.warning( "OBJ came without normals. We will try to compute them...") validation_result = surface.validate() if validation_result.warnings: self.add_operation_additional_info(validation_result.summary()) return [surface] except ParseException, excep: self.log.exception(excep) raise LaunchException(excep)
def launch(self, surface_type, data_file, should_center=False): """ Execute import operations: """ try: surface = make_surface(surface_type) if surface is None: raise ParseException("Could not determine surface type! %s" % surface_type) surface.storage_path = self.storage_path surface.set_operation_id(self.operation_id) surface.zero_based_triangles = True with open(data_file) as f: obj = ObjSurface(f) if should_center: vertices = center_vertices(obj.vertices) else: vertices = obj.vertices surface.vertices = vertices surface.triangles = obj.triangles if obj.have_normals: self.log.debug("OBJ came with normals included") surface.vertex_normals = obj.normals else: self.log.warning("OBJ came without normals. We will try to compute them...") validation_result = surface.validate() if validation_result.warnings: self.add_operation_additional_info(validation_result.summary()) return [surface] except ParseException, excep: self.log.exception(excep) raise LaunchException(excep)
def launch(self, uploaded, surface_type, zero_based_triangles=False, should_center=False): """ Execute import operations: unpack ZIP and build Surface object as result. :param uploaded: an archive containing the Surface data to be imported :param surface_type: a string from the following\: \ "Skin Air", "Skull Skin", "Brain Skull", "Cortical Surface", "EEG Cap", "Face" :returns: a subclass of `Surface` DataType :raises LaunchException: when * `uploaded` is missing * `surface_type` is invalid :raises RuntimeError: when triangles contain an invalid vertex index """ if uploaded is None: raise LaunchException( "Please select ZIP file which contains data to import") self.logger.debug("Start to import surface: '%s' from file: %s" % (surface_type, uploaded)) try: zip_surface = ZipSurfaceParser(uploaded) except IOError: exception_str = "Did not find the specified ZIP at %s" % uploaded raise LaunchException(exception_str) # Detect and instantiate correct surface type self.logger.debug("Create surface instance") surface = self._make_surface(surface_type) surface.storage_path = self.storage_path surface.zero_based_triangles = zero_based_triangles if should_center: vertices = center_vertices(zip_surface.vertices) else: vertices = zip_surface.vertices surface.vertices = vertices if len(zip_surface.normals) != 0: surface.vertex_normals = zip_surface.normals if zero_based_triangles: surface.triangles = zip_surface.triangles else: surface.triangles = zip_surface.triangles - 1 if zip_surface.bi_hemispheric: self.logger.info("Hemispheres detected") surface.hemisphere_mask = zip_surface.hemisphere_mask surface.triangle_normals = None # Now check if the triangles of the surface are valid triangles_min_vertex = numpy.amin(surface.triangles) if triangles_min_vertex < 0: if triangles_min_vertex == -1 and not zero_based_triangles: raise LaunchException( "Triangles contain a negative vertex index. Maybe you have a ZERO based surface." ) else: raise LaunchException( "Your triangles contain a negative vertex index: %d" % triangles_min_vertex) no_of_vertices = len(surface.vertices) triangles_max_vertex = numpy.amax(surface.triangles) if triangles_max_vertex >= no_of_vertices: if triangles_max_vertex == no_of_vertices and zero_based_triangles: raise LaunchException( "Your triangles contain an invalid vertex index: %d. " "Maybe your surface is NOT ZERO Based." % triangles_max_vertex) else: raise LaunchException( "Your triangles contain an invalid vertex index: %d." % triangles_max_vertex) validation_result = surface.validate() if validation_result.warnings: self.add_operation_additional_info(validation_result.summary()) self.logger.debug("Surface ready to be stored") return surface
def launch(self, view_model): # type: (ZIPSurfaceImporterModel) -> [SurfaceIndex] """ Execute import operations: unpack ZIP and build Surface object as result :raises LaunchException: when * `uploaded` is missing * `surface_type` is invalid :raises RuntimeError: when triangles contain an invalid vertex index """ if view_model.uploaded is None: raise LaunchException( "Please select ZIP file which contains data to import") self.logger.debug("Start to import surface: '%s' from file: %s" % (view_model.surface_type, view_model.uploaded)) try: zip_surface = ZipSurfaceParser(view_model.uploaded) except IOError: exception_str = "Did not find the specified ZIP at %s" % view_model.uploaded raise LaunchException(exception_str) # Detect and instantiate correct surface type self.logger.debug("Create surface instance") surface = self._make_surface(view_model.surface_type) surface.zero_based_triangles = view_model.zero_based_triangles if view_model.should_center: vertices = center_vertices(zip_surface.vertices) else: vertices = zip_surface.vertices surface.vertices = vertices if len(zip_surface.normals) != 0: surface.vertex_normals = zip_surface.normals if view_model.zero_based_triangles: surface.triangles = zip_surface.triangles else: surface.triangles = zip_surface.triangles - 1 if zip_surface.bi_hemispheric: self.logger.info("Hemispheres detected") surface.hemisphere_mask = zip_surface.hemisphere_mask surface.compute_triangle_normals() # Now check if the triangles of the surface are valid triangles_min_vertex = numpy.amin(surface.triangles) if triangles_min_vertex < 0: if triangles_min_vertex == -1 and not view_model.zero_based_triangles: raise LaunchException( "Triangles contain a negative vertex index. Maybe you have a ZERO based surface." ) else: raise LaunchException( "Your triangles contain a negative vertex index: %d" % triangles_min_vertex) no_of_vertices = len(surface.vertices) triangles_max_vertex = numpy.amax(surface.triangles) if triangles_max_vertex >= no_of_vertices: if triangles_max_vertex == no_of_vertices and view_model.zero_based_triangles: raise LaunchException( "Your triangles contain an invalid vertex index: %d. " "Maybe your surface is NOT ZERO Based." % triangles_max_vertex) else: raise LaunchException( "Your triangles contain an invalid vertex index: %d." % triangles_max_vertex) validation_result = surface.validate() if validation_result.warnings: self.add_operation_additional_info(validation_result.summary()) surface.configure() self.logger.debug("Surface ready to be stored") surf_idx = h5.store_complete(surface, self.storage_path) self.generic_attributes.user_tag_1 = surface.surface_type return surf_idx
def launch(self, uploaded, surface_type, zero_based_triangles=False, should_center=False): """ Execute import operations: unpack ZIP and build Surface object as result. :param uploaded: an archive containing the Surface data to be imported :param surface_type: a string from the following\: \ "Skin Air", "Skull Skin", "Brain Skull", "Cortical Surface", "EEG Cap", "Face" :returns: a subclass of `Surface` DataType :raises LaunchException: when * `uploaded` is missing * `surface_type` is invalid :raises RuntimeError: when triangles contain an invalid vertex index """ if uploaded is None: raise LaunchException("Please select ZIP file which contains data to import") self.logger.debug("Start to import surface: '%s' from file: %s" % (surface_type, uploaded)) try: zip_surface = ZipSurfaceParser(uploaded) except IOError: exception_str = "Did not find the specified ZIP at %s" % uploaded raise LaunchException(exception_str) # Detect and instantiate correct surface type self.logger.debug("Create surface instance") surface = self._make_surface(surface_type) surface.storage_path = self.storage_path surface.zero_based_triangles = zero_based_triangles if should_center: vertices = center_vertices(zip_surface.vertices) else: vertices = zip_surface.vertices surface.vertices = vertices if len(zip_surface.normals) != 0: surface.vertex_normals = zip_surface.normals if zero_based_triangles: surface.triangles = zip_surface.triangles else: surface.triangles = zip_surface.triangles - 1 if zip_surface.bi_hemispheric: self.logger.info("Hemispheres detected") surface.hemisphere_mask = zip_surface.hemisphere_mask surface.triangle_normals = None # Now check if the triangles of the surface are valid triangles_min_vertex = numpy.amin(surface.triangles) if triangles_min_vertex < 0: if triangles_min_vertex == -1 and not zero_based_triangles: raise LaunchException("Triangles contain a negative vertex index. Maybe you have a ZERO based surface.") else: raise LaunchException("Your triangles contain a negative vertex index: %d" % triangles_min_vertex) no_of_vertices = len(surface.vertices) triangles_max_vertex = numpy.amax(surface.triangles) if triangles_max_vertex >= no_of_vertices: if triangles_max_vertex == no_of_vertices and zero_based_triangles: raise LaunchException("Your triangles contain an invalid vertex index: %d. " "Maybe your surface is NOT ZERO Based." % triangles_max_vertex) else: raise LaunchException("Your triangles contain an invalid vertex index: %d." % triangles_max_vertex) validation_result = surface.validate() if validation_result.warnings: self.add_operation_additional_info(validation_result.summary()) self.logger.debug("Surface ready to be stored") return surface