def test_parse(self): metadata = VoxelsMetadata(self.metadata_json) assert metadata.shape == (3, 100, 200, 400), "Wrong shape: {}".format( metadata.shape) assert metadata.dtype == numpy.uint8 assert metadata.axiskeys == 'cxyz' assert metadata['Axes'][0]["Resolution"] == 3.1 assert metadata['Axes'][1]["Resolution"] == 3.1 assert metadata['Axes'][2]["Resolution"] == 40
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 test_create_axistags(self): try: import vigra except ImportError: raise nose.SkipTest metadata = VoxelsMetadata(self.metadata_json) tags = metadata.create_axistags() assert tags['x'].resolution == 3.1 assert tags['y'].resolution == 3.1 assert tags['z'].resolution == 40 assert tags.channelLabels == [ "intensity-R", "intensity-G", "intensity-B" ]
def __init__(self, connection, uuid, data_name, *args, **kwargs): """ Create a new VoxelsAccessor with all the same properties as the current instance, except that it accesses a roi mask volume. """ # Create default mask metadata. mask_metadata = {} mask_metadata["Properties"] = { "Values": [{ "DataType": "uint8", "Label": "roi-mask" }] } # For now, we hardcode XYZ order # The size/offset are left as None, because that doesn't apply to ROI data. default_axis_info = { "Label": "", "Resolution": 1, "Units": "", "Size": 0, "Offset": 0 } mask_metadata["Axes"] = [ copy.copy(default_axis_info), copy.copy(default_axis_info), copy.copy(default_axis_info) ] mask_metadata["Axes"][0]["Label"] = "X" mask_metadata["Axes"][1]["Label"] = "Y" mask_metadata["Axes"][2]["Label"] = "Z" assert '_metadata' not in kwargs or kwargs['_metadata'] is None kwargs['_metadata'] = VoxelsMetadata(mask_metadata) assert '_access_type' not in kwargs or kwargs['_access_type'] is None kwargs['_access_type'] = 'mask' # Init base class with pre-formed metadata instead of querying for it. super(RoiMaskAccessor, self).__init__(connection, uuid, data_name, *args, **kwargs)