Esempio n. 1
0
class OpRESTfulBlockwiseFilesetReader(Operator):
    """
    Adapter that provides an operator interface to the BlockwiseFileset class for reading ONLY.
    """
    name = "OpRESTfulBlockwiseFilesetReader"

    DescriptionFilePath = InputSlot(stype='filestring')
    Output = OutputSlot()

    class MissingDatasetError(Exception):
        pass

    def __init__(self, *args, **kwargs):
        super(OpRESTfulBlockwiseFilesetReader, self).__init__(*args, **kwargs)
        self._blockwiseFileset = None

    def setupOutputs(self):
        if not os.path.exists(self.DescriptionFilePath.value):
            raise OpRESTfulBlockwiseFilesetReader.MissingDatasetError(
                "Dataset description not found: {}".format(
                    self.DescriptionFilePath.value))

        # Load up the class that does the real work
        self._blockwiseFileset = RESTfulBlockwiseFileset(
            self.DescriptionFilePath.value)

        # Check for errors in the description file
        localDescription = self._blockwiseFileset.compositeDescription.local_description
        axes = localDescription.axes
        assert False not in map(
            lambda a: a in 'txyzc',
            axes), "Unknown axis type.  Known axes: txyzc  Your axes:".format(
                axes)

        self.Output.meta.shape = tuple(localDescription.view_shape)
        self.Output.meta.dtype = localDescription.dtype
        self.Output.meta.axistags = vigra.defaultAxistags(
            localDescription.axes)
        drange = localDescription.drange
        if drange is not None:
            self.Output.meta.drange = drange

    def execute(self, slot, subindex, roi, result):
        assert slot == self.Output, "Unknown output slot"
        self._blockwiseFileset.readData((roi.start, roi.stop), result)
        return result

    def propagateDirty(self, slot, subindex, roi):
        assert slot == self.DescriptionFilePath, "Unknown input slot."
        self.Output.setDirty(slice(None))

    def cleanUp(self):
        import sys
        if self._blockwiseFileset is not None:
            self._blockwiseFileset.close()
        super(OpRESTfulBlockwiseFilesetReader, self).cleanUp()
class OpRESTfulBlockwiseFilesetReader(Operator):
    """
    Adapter that provides an operator interface to the BlockwiseFileset class for reading ONLY.
    """
    name = "OpRESTfulBlockwiseFilesetReader"

    DescriptionFilePath = InputSlot(stype='filestring')
    Output = OutputSlot()

    class MissingDatasetError(Exception):
        pass

    def __init__(self, *args, **kwargs):
        super(OpRESTfulBlockwiseFilesetReader, self).__init__(*args, **kwargs)
        self._blockwiseFileset = None

    def setupOutputs(self):
        if not os.path.exists(self.DescriptionFilePath.value):
            raise OpRESTfulBlockwiseFilesetReader.MissingDatasetError("Dataset description not found: {}".format( self.DescriptionFilePath.value ) )
        
        # Load up the class that does the real work
        self._blockwiseFileset = RESTfulBlockwiseFileset( self.DescriptionFilePath.value )

        # Check for errors in the description file
        localDescription = self._blockwiseFileset.compositeDescription.local_description
        axes = localDescription.axes
        assert False not in map(lambda a: a in 'txyzc', axes), "Unknown axis type.  Known axes: txyzc  Your axes:".format(axes)

        self.Output.meta.shape = tuple(localDescription.view_shape)
        self.Output.meta.dtype = localDescription.dtype
        self.Output.meta.axistags = vigra.defaultAxistags(localDescription.axes)
        drange = localDescription.drange
        if drange is not None:
            self.Output.meta.drange = drange

    def execute(self, slot, subindex, roi, result):
        assert slot == self.Output, "Unknown output slot"
        self._blockwiseFileset.readData( (roi.start, roi.stop), result )
        return result

    def propagateDirty(self, slot, subindex, roi):
        assert slot == self.DescriptionFilePath, "Unknown input slot."
        self.Output.setDirty( slice(None) )
        
    def cleanUp(self):
        import sys
        if self._blockwiseFileset is not None:
            self._blockwiseFileset.close()
        super(OpRESTfulBlockwiseFilesetReader, self).cleanUp()
    def test_4_OffsetDownload(self):
        volume = RESTfulBlockwiseFileset( self.descriptionFilePath )

        slicing = numpy.s_[20:40, 20:40, 20:40]
        roi = sliceToRoi(slicing, volume.description.shape)        
        data = volume.readData( roi )
        assert data.shape == (20,20,20)
        assert volume.getBlockStatus( ([20,20,20]) ) == BlockwiseFileset.BLOCK_AVAILABLE

        offsetVolume = RESTfulBlockwiseFileset( self.descriptionFilePath_offset )
        offsetSlicing = numpy.s_[20:40, 0:20, 20:40] # Note middle slice is offset (see view_origin in setupClass)
        offsetRoi = sliceToRoi(offsetSlicing, offsetVolume.description.shape)        
        offsetData = offsetVolume.readData( offsetRoi )
        assert offsetData.shape == (20,20,20)
        assert offsetVolume.getBlockStatus( ([20,0,20]) ) == BlockwiseFileset.BLOCK_AVAILABLE
        
        # Data should be the same
        assert (offsetData == data).all()
    def test_1_SingleDownload(self):
        volume = RESTfulBlockwiseFileset( self.descriptionFilePath )

        slicing = numpy.s_[0:20, 0:20, 0:20]
        roi = sliceToRoi(slicing, volume.description.shape)        
        data = volume.readData( roi )
        assert data.shape == (20,20,20)

        assert volume.getBlockStatus( ([0,0,0]) ) == BlockwiseFileset.BLOCK_AVAILABLE
    def test_4_OffsetDownload(self):
        volume = RESTfulBlockwiseFileset( self.descriptionFilePath )

        slicing = numpy.s_[20:40, 20:40, 20:40]
        roi = sliceToRoi(slicing, volume.description.shape)        
        data = volume.readData( roi )
        assert data.shape == (20,20,20)
        assert volume.getBlockStatus( ([20,20,20]) ) == BlockwiseFileset.BLOCK_AVAILABLE

        offsetVolume = RESTfulBlockwiseFileset( self.descriptionFilePath_offset )
        offsetSlicing = numpy.s_[20:40, 0:20, 20:40] # Note middle slice is offset (see view_origin in setupClass)
        offsetRoi = sliceToRoi(offsetSlicing, offsetVolume.description.shape)        
        offsetData = offsetVolume.readData( offsetRoi )
        assert offsetData.shape == (20,20,20)
        assert offsetVolume.getBlockStatus( ([20,0,20]) ) == BlockwiseFileset.BLOCK_AVAILABLE
        
        # Data should be the same
        assert (offsetData == data).all()
    def test_1_SingleDownload(self):
        volume = RESTfulBlockwiseFileset( self.descriptionFilePath )

        slicing = numpy.s_[0:20, 0:20, 0:20]
        roi = sliceToRoi(slicing, volume.description.shape)        
        data = volume.readData( roi )
        assert data.shape == (20,20,20)

        assert volume.getBlockStatus( ([0,0,0]) ) == BlockwiseFileset.BLOCK_AVAILABLE