def _do_modify_data(self, uuid, dataname, dims, shape, offset): """ Respond to a POST request to modify a subvolume of data. All parameters are strings from the REST string. """ dataset = self._get_h5_dataset(uuid, dataname) roi_start, roi_stop = self._determine_request_roi( dataset, dims, shape, offset ) # Prepend channel to make "full" roi full_roi_start = (0,) + roi_start full_roi_stop = (dataset.shape[0],) + roi_stop full_roi_shape = numpy.subtract(full_roi_stop, full_roi_start) slicing = tuple( slice(x,y) for x,y in zip(full_roi_start, full_roi_stop) ) # If the user is writing data beoyond the current extents of the dataset, # resize the dataset first. if (numpy.array(full_roi_stop) > dataset.shape).any(): dataset.resize( full_roi_stop ) voxels_metadata = VoxelsMetadata.create_from_h5_dataset(dataset) codec = VoxelsNddataCodec( voxels_metadata ) data = codec.decode_to_ndarray(self.rfile, full_roi_shape) dataset[slicing] = data self.server.h5_file.flush() #self.send_response(httplib.NO_CONTENT) # "No Content" (accepted) self.send_response(httplib.OK) self.send_header("Content-length", 0 ) self.end_headers()
def _do_modify_data(self, uuid, dataname, dims, shape, offset): """ Respond to a POST request to modify a subvolume of data. All parameters are strings from the REST string. """ dataset = self._get_h5_dataset(uuid, dataname) roi_start, roi_stop = self._determine_request_roi( dataset, dims, shape, offset) # Prepend channel to make "full" roi full_roi_start = (0, ) + roi_start full_roi_stop = (dataset.shape[0], ) + roi_stop full_roi_shape = numpy.subtract(full_roi_stop, full_roi_start) slicing = tuple( slice(x, y) for x, y in zip(full_roi_start, full_roi_stop)) if 'dvid_metadata' in dataset.attrs: voxels_metadata = VoxelsMetadata(dataset.attrs['dvid_metadata']) del dataset.attrs['dvid_metadata'] else: voxels_metadata = VoxelsMetadata.create_from_h5_dataset(dataset) # If the user is writing data beyond the current extents of the dataset, # resize the dataset first. if (numpy.array(full_roi_stop) > dataset.shape).any(): dataset.resize(numpy.maximum(full_roi_stop, dataset.shape)) voxels_metadata.shape = tuple( map(int, numpy.maximum(voxels_metadata.shape, full_roi_stop))) # Overwrite minindex is needed if (numpy.array(full_roi_start) < voxels_metadata.minindex).any(): voxels_metadata.minindex = tuple( numpy.minimum(voxels_metadata.minindex, full_roi_start)) dataset.attrs['dvid_metadata'] = voxels_metadata.to_json() # Must read the entire message body, even if it isn't used below. codec = VoxelsNddataCodec(dataset.dtype) data = codec.decode_to_ndarray(self.rfile, full_roi_shape) if (numpy.array(roi_start) < 0).any(): # We don't support negative coordinates in this mock server. # But as a compromise, we don't choke here. # Instead, we simply do nothing. pass else: dataset[slicing] = data self.server.h5_file.flush() #self.send_response(httplib.NO_CONTENT) # "No Content" (accepted) self.send_response(httplib.OK) self.send_header("Content-length", 0) self.end_headers()
def _do_modify_data(self, uuid, dataname, dims, shape, offset): """ Respond to a POST request to modify a subvolume of data. All parameters are strings from the REST string. """ dataset = self._get_h5_dataset(uuid, dataname) roi_start, roi_stop = self._determine_request_roi( dataset, dims, shape, offset ) # Prepend channel to make "full" roi full_roi_start = (0,) + roi_start full_roi_stop = (dataset.shape[0],) + roi_stop full_roi_shape = numpy.subtract(full_roi_stop, full_roi_start) slicing = tuple( slice(x,y) for x,y in zip(full_roi_start, full_roi_stop) ) if 'dvid_metadata' in dataset.attrs: voxels_metadata = VoxelsMetadata(dataset.attrs['dvid_metadata']) del dataset.attrs['dvid_metadata'] else: voxels_metadata = VoxelsMetadata.create_from_h5_dataset(dataset) # If the user is writing data beyond the current extents of the dataset, # resize the dataset first. if (numpy.array(full_roi_stop) > dataset.shape).any(): dataset.resize( numpy.maximum(full_roi_stop, dataset.shape) ) voxels_metadata.shape = tuple( map(int, numpy.maximum( voxels_metadata.shape, full_roi_stop )) ) # Overwrite minindex is needed if (numpy.array(full_roi_start) < voxels_metadata.minindex).any(): voxels_metadata.minindex = tuple( numpy.minimum( voxels_metadata.minindex, full_roi_start ) ) dataset.attrs['dvid_metadata'] = voxels_metadata.to_json() # Must read the entire message body, even if it isn't used below. codec = VoxelsNddataCodec( dataset.dtype ) data = codec.decode_to_ndarray(self.rfile, full_roi_shape) if (numpy.array(roi_start) < 0).any(): # We don't support negative coordinates in this mock server. # But as a compromise, we don't choke here. # Instead, we simply do nothing. pass else: dataset[slicing] = data self.server.h5_file.flush() #self.send_response(httplib.NO_CONTENT) # "No Content" (accepted) self.send_response(httplib.OK) self.send_header("Content-length", 0 ) self.end_headers()