def setUp(self): self.graph = Graph() self.operator_split = OpSplitMaskArray(graph=self.graph) self.operator_split.Input.meta.axistags = vigra.AxisTags("txyzc")
class TestOpSplitMaskArray(object): def setUp(self): self.graph = Graph() self.operator_split = OpSplitMaskArray(graph=self.graph) self.operator_split.Input.meta.axistags = vigra.AxisTags("txyzc") def test1(self): # Generate a random dataset and see if it we get the right masking from the operator. data = numpy.random.random((4, 5, 6, 7, 3)).astype(numpy.float32) mask = numpy.zeros(data.shape, dtype=bool) # Mask borders of the expected output. left_slicing = (mask.ndim - 1) * (slice(None),) + (slice(None, 1),) right_slicing = (mask.ndim - 1) * (slice(None),) + (slice(-1, None),) for i in xrange(mask.ndim): left_slicing = left_slicing[-1:] + left_slicing[:-1] right_slicing = right_slicing[-1:] + right_slicing[:-1] mask[left_slicing] = True mask[right_slicing] = True data = numpy.ma.masked_array( data, mask=mask, fill_value=data.dtype.type(numpy.nan), shrink=False ) # Provide input read all output. self.operator_split.Input.setValue(data) output_array = self.operator_split.OutputArray[None].wait() output_mask = self.operator_split.OutputMask[None].wait() output_fill_value = self.operator_split.OutputFillValue[None].wait() assert not isinstance(output_array, numpy.ma.masked_array) assert not isinstance(output_mask, numpy.ma.masked_array) assert not isinstance(output_fill_value, numpy.ma.masked_array) assert output_array.dtype.type == data.dtype.type assert output_mask.dtype.type == data.mask.dtype assert output_fill_value.dtype.type == data.dtype.type assert ( (data.data == output_array) | (numpy.isnan(data.data) & numpy.isnan(output_array)) ).all() assert (data.mask == output_mask).all() assert ( (data.fill_value[()] == output_fill_value) | (numpy.isnan(data.fill_value[()]) & numpy.isnan(output_fill_value)) ).all() def test2(self): # Generate a dataset and grab chunks of it from the operator. The result should be the same as above. data = numpy.random.random((4, 5, 6, 7, 3)).astype(numpy.float32) mask = numpy.zeros(data.shape, dtype=bool) # Mask borders of the expected output. left_slicing = (mask.ndim - 1) * (slice(None),) + (slice(None, 1),) right_slicing = (mask.ndim - 1) * (slice(None),) + (slice(-1, None),) for i in xrange(mask.ndim): left_slicing = left_slicing[-1:] + left_slicing[:-1] right_slicing = right_slicing[-1:] + right_slicing[:-1] mask[left_slicing] = True mask[right_slicing] = True data = numpy.ma.masked_array( data, mask=mask, fill_value=data.dtype.type(numpy.nan), shrink=False ) # Create array to store results. Don't keep original data. output_array = data.data.copy() output_array[:] = 0 output_mask = data.mask.copy() output_mask[:] = False # Provide input and grab chunks. self.operator_split.Input.setValue(data) output_array[:2] = self.operator_split.OutputArray[:2].wait() output_mask[:2] = self.operator_split.OutputMask[:2].wait() output_array[2:] = self.operator_split.OutputArray[2:].wait() output_mask[2:] = self.operator_split.OutputMask[2:].wait() output_fill_value = self.operator_split.OutputFillValue[None].wait() assert not isinstance(output_array, numpy.ma.masked_array) assert not isinstance(output_mask, numpy.ma.masked_array) assert not isinstance(output_fill_value, numpy.ma.masked_array) assert output_array.dtype.type == data.dtype.type assert output_mask.dtype.type == data.mask.dtype assert output_fill_value.dtype.type == data.dtype.type assert ( (data.data == output_array) | (numpy.isnan(data.data) & numpy.isnan(output_array)) ).all() assert (data.mask == output_mask).all() assert ( (data.fill_value[()] == output_fill_value) | (numpy.isnan(data.fill_value[()]) & numpy.isnan(output_fill_value)) ).all() def tearDown(self): # Take down operators self.operator_split.Input.disconnect() self.operator_split.OutputArray.disconnect() self.operator_split.OutputMask.disconnect() self.operator_split.OutputFillValue.disconnect() self.operator_split.cleanUp()