示例#1
0
 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
示例#2
0
    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()
示例#3
0
    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"
        ]
示例#4
0
    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)