def __init__(self, hostname, 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__( hostname, uuid, data_name, *args, **kwargs )
def _update_subvol_widget(self, node_uuid, dataname, typename): """ Update the subvolume widget with the min/max extents of the given node and dataname. Note: The node and dataname do not necessarily have to match the currently selected node and dataname. This enables the right-click behavior, which can be used to limit your data volume to the size of a different data volume. """ error_msg = None try: if typename == "roi": node_service = DVIDNodeService(self._hostname, str(node_uuid)) roi_blocks_zyx = numpy.array( node_service.get_roi(str(dataname))) maxindex = tuple(DVID_BLOCK_WIDTH * (1 + numpy.max(roi_blocks_zyx, axis=0))) minindex = (0, 0, 0) # Rois are always 3D axiskeys = "zyx" # If the current selection is a dataset, then include a channel dimension if self.get_selection().typename != "roi": axiskeys = "zyxc" minindex = minindex + (0, ) maxindex = maxindex + ( 1, ) # FIXME: This assumes that the selected data has only 1 channel... else: # Query the server raw_metadata = VoxelsAccessor.get_metadata( self._hostname, node_uuid, dataname) voxels_metadata = VoxelsMetadata(raw_metadata) maxindex = voxels_metadata.shape minindex = voxels_metadata.minindex axiskeys = voxels_metadata.axiskeys # If the current selection is a roi, then remove the channel dimension if self.get_selection().typename == "roi": axiskeys = "zyx" minindex = minindex[:-1] maxindex = maxindex[:-1] except (DVIDException, ErrMsg) as ex: error_msg = str(ex) log_exception(logger) else: self._buttonbox.button(QDialogButtonBox.Ok).setEnabled(True) if error_msg: self._buttonbox.button(QDialogButtonBox.Ok).setEnabled(False) QMessageBox.critical(self, "DVID Error", error_msg) self._subvol_widget.initWithExtents("", (), (), ()) return self._subvol_widget.initWithExtents(axiskeys, maxindex, minindex, maxindex)
def get_metadata( hostname, uuid, data_name ): """ Query the voxels metadata for the given node/data_name. """ connection = DVIDConnection(hostname) rest_query = "/node/{uuid}/{data_name}/metadata".format( uuid=uuid, data_name=data_name ) status, response_body, _err_msg = connection.make_request( rest_query, ConnectionMethod.GET ) try: json_data = json.loads(response_body) except ValueError: raise RuntimeError("Response body could not be parsed as valid json:\n" "GET " + rest_query + "\n" + response_body) return VoxelsMetadata( json_data )
def _update_display(self): super(DvidDataSelectionBrowser, self)._update_display() hostname, dset_uuid, dataname, node_uuid = self.get_selection() enable_contents = self._repos_info is not None and dataname != "" and node_uuid != "" self._roi_groupbox.setEnabled(enable_contents) if not dataname or not node_uuid: self._roi_widget.initWithExtents("", (), (), ()) return error_msg = None try: # Query the server raw_metadata = VoxelsAccessor.get_metadata(hostname, node_uuid, dataname) voxels_metadata = VoxelsMetadata(raw_metadata) except DVIDException as ex: error_msg = ex.message except ErrMsg as ex: error_msg = str(ErrMsg) except VoxelsAccessor.BadRequestError as ex: # DVID will return an error if the selected dataset # isn't a 'voxels' dataset and thus has no voxels metadata self._buttonbox.button(QDialogButtonBox.Ok).setEnabled(False) return else: self._buttonbox.button(QDialogButtonBox.Ok).setEnabled(True) if error_msg: QMessageBox.critical(self, "DVID Error", error_msg) self._roi_widget.initWithExtents("", (), (), ()) return self._roi_widget.initWithExtents(voxels_metadata.axiskeys, voxels_metadata.shape, voxels_metadata.minindex, voxels_metadata.shape)