Beispiel #1
0
 def initModules(self):
     self.module = PropertyMgr(self)
     oldModuleName = self._currentModuleName
     for m in BaseModuleMgr.__subclasses__():
         print "DataMgr initializing module:", m.name
         self._currentModuleName = m.name
         self.module[m.name] = m(self)
     self._currentModuleName = oldModuleName
Beispiel #2
0
    def initModules(self):
        self.module = PropertyMgr(self)

        mods = BaseModuleDataItemMgr.__subclasses__()

        for m in mods:
            self.module[m.name] = m(self)
            self.module[m.name].overlayMgr = self.overlayMgr
Beispiel #3
0
 def initModules(self):
     self.module = PropertyMgr(self)
     oldModuleName = self._currentModuleName
     for m in BaseModuleMgr.__subclasses__():
         print "DataMgr initializing module:", m.name
         self._currentModuleName = m.name
         self.module[m.name] = m(self)
     self._currentModuleName = oldModuleName
Beispiel #4
0
 def initModules(self):
     self.module = PropertyMgr(self)
     
     mods = BaseModuleDataItemMgr.__subclasses__()
     
     for m in mods:
         self.module[m.name] = m(self) 
         self.module[m.name].overlayMgr = self.overlayMgr
Beispiel #5
0
class DataMgr():
    """
    Manages Project structure and associated files, e.g. images volumedata
    """
    # does not unload _data, maybe implement some sort of reference 
    # counting if memory scarceness manifests itself
    
    def __init__(self, featureCacheFile=None):
        self._dataItems = []            
        self.featureLock = threading.Semaphore(1) #prevent chaining of _activeImageNumber during thread stuff
        self._dataItemsLoaded = []
        self.channels = -1
        self._activeImage = None
        self._activeImageNumber = 0
        self._currentModuleName = None
        
        self.initModules()
        
        
    def initModules(self):
        self.module = PropertyMgr(self)
        oldModuleName = self._currentModuleName
        for m in BaseModuleMgr.__subclasses__():
            print "DataMgr initializing module:", m.name
            self._currentModuleName = m.name
            self.module[m.name] = m(self)
        self._currentModuleName = oldModuleName
                
    
    def onNewImage(self, dataItemImage):
        if len(self._dataItems) == 1:
            self._activeImage = self._dataItems[0]
            
        dataItemImage.overlayMgr.dataMgr = self
        oldModuleName = self._currentModuleName
        for v in dataItemImage.module.values():
            v.globalMgr = self.module[v.name]
        for v in self.module.values():
            self._currentModuleName = v.__class__.name
            v.onNewImage(dataItemImage)
        self._currentModuleName = oldModuleName

    def onRemoveImage(self, dataItemIndex):
        self._dataItems[dataItemIndex].overlayMgr.dataMgr = self
        oldModuleName = self._currentModuleName
        for v in self.module.values():
            self._currentModuleName = v.__class__.name
            v.onDeleteImage(self._dataItems[dataItemIndex])
        self._currentModuleName = oldModuleName
    
    def append(self, dataItem, alreadyLoaded=False):

        dataItem.dataMgr = self
        
        if alreadyLoaded == False:
            try:
                dataItem.loadFromFile()
            except Exception, e:
                print e
                traceback.print_exc(file=sys.stdout)
                QtGui.QErrorMessage.qtHandler().showMessage("Not enough Memory to load this file !")
                raise e

            alreadyLoaded = True
            
        if self.channels == -1 or dataItem.shape[-1] == self.channels:
            self.channels = dataItem.shape[-1]
            
            self.selectedChannels = range(self.channels)
            
            self._dataItems.append(dataItem)
            self._dataItemsLoaded.append(alreadyLoaded)
            self.onNewImage(dataItem)
        else:
            raise TypeError('DataMgr.append: DataItem has wrong number of channels, a project can contain only images that have the same number of channels !')
Beispiel #6
0
class DataItemImage(DataItemBase):
    def __init__(self, fileName):
        DataItemBase.__init__(self, fileName)
        self._dataVol = None
        self._featureM = None
        
        self._readBegin = (0,0,0)
        self._readEnd = (0,0,0)
        
        self._writeBegin = (0,0,0)
        self._writeEnd = (0,0,0)
        
        self.overlayMgr = overlayMgr.OverlayMgr(self)

        self.dataMgr = None        
        
        self.initModules()
    
    def initModules(self):
        self.module = PropertyMgr(self)
        
        mods = BaseModuleDataItemMgr.__subclasses__()
        
        for m in mods:
            self.module[m.name] = m(self) 
            self.module[m.name].overlayMgr = self.overlayMgr
         

                
    def setDataVol(self, dataVol):
        self._dataVol = dataVol
        self._writeBegin = (0,0,0)
        self._writeEnd = (dataVol.shape[1], dataVol.shape[2], dataVol.shape[3])
        
    def setReadBounds(self, begin, end):
        self._readBegin = begin
        self._readEnd  = end
    
    def setWriteBounds(self, begin, end, shape):
        self._writeBegin = begin
        self._writeEnd  = end
        self._writeShape = shape
    

    def __getitem__(self, args):
        return self._dataVol._data[args]
            
    def __setitem__(self, args, data):
        self._dataVol._data[args] = data


    def __getattr__(self, name):
        if name == "dtype":
            return self._dataVol._data.dtype
        elif name == "shape":
            return self._dataVol._data.shape
        else:
            raise AttributeError, name
        
    def unLoadData(self):
        # TODO: delete permanently here for better garbage collection
        self._dataVol = None
        self._data = None
        
     
    def loadFromFile(self):
        f = h5py.File(self.fileName, 'r')
        g = f["volume"]
        self.deserialize(g)
    
    def serialize(self, h5G, destbegin = (0,0,0), destend = (0,0,0), srcbegin = (0,0,0), srcend = (0,0,0), destshape = (0,0,0) ):
        if destend != (0,0,0):
            self._dataVol.serialize(h5G, destbegin, destend, srcbegin, srcend, destshape)
        elif self._writeEnd != (0,0,0):
            
            destbegin = self._writeBegin
            destend =  self._writeEnd
            srcbegin =  self._readBegin
            srcend =  self._readEnd
            destshape = self._writeShape
            
            self._dataVol.serialize(h5G, "data", destbegin, destend, srcbegin, srcend, destshape)
        else:
            self._dataVol.serialize(h5G)
            
        for k in self.module.keys():
            if hasattr(self.module[k], "serialize"):
                print "serializing ", k
                try:
                    self.module[k].serialize(h5G, destbegin, destend, srcbegin, srcend, destshape)
                except Exception as e:
                    print e
                    print traceback.print_exc()
                    print "couldn't serialize something"
                    
    def updateOverlays(self):
        ov = overlayMgr.OverlayItem(self._dataVol._data, color = QtGui.QColor(255, 255, 255), alpha = 1.0, colorTable = None, autoAdd = True, autoVisible = True, autoAlphaChannel = False, min = 0, max = 255)
        self.overlayMgr["Raw Data"] = ov


            
    def deserialize(self, h5G, offsets = (0,0,0), shape = (0,0,0)):
        self._dataVol = DataAccessor.deserialize(h5G, "data", offsets, shape)
        
        #load obsolete file format parts (pre version 0.5)
        #and store them in the properties
        #the responsible modules will take care of them
            
        for k in self.module.keys():
            if hasattr(self.module[k], "deserialize"):
                print "Deserializing", k
                self.module[k].deserialize(h5G, offsets, shape)

        self.updateOverlays()
Beispiel #7
0
class DataMgr():
    """
    Manages Project structure and associated files, e.g. images volumedata
    """

    # does not unload _data, maybe implement some sort of reference
    # counting if memory scarceness manifests itself

    def __init__(self, featureCacheFile=None):
        self._dataItems = []
        self.featureLock = threading.Semaphore(
            1)  #prevent chaining of _activeImageNumber during thread stuff
        self._dataItemsLoaded = []
        self.channels = -1
        self._activeImage = None
        self._activeImageNumber = 0
        self._currentModuleName = None

        self.initModules()

    def initModules(self):
        self.module = PropertyMgr(self)
        oldModuleName = self._currentModuleName
        for m in BaseModuleMgr.__subclasses__():
            print "DataMgr initializing module:", m.name
            self._currentModuleName = m.name
            self.module[m.name] = m(self)
        self._currentModuleName = oldModuleName

    def onNewImage(self, dataItemImage):
        if len(self._dataItems) == 1:
            self._activeImage = self._dataItems[0]

        dataItemImage.overlayMgr.dataMgr = self
        oldModuleName = self._currentModuleName
        for v in dataItemImage.module.values():
            v.globalMgr = self.module[v.name]
        for v in self.module.values():
            self._currentModuleName = v.__class__.name
            v.onNewImage(dataItemImage)
        self._currentModuleName = oldModuleName

    def onRemoveImage(self, dataItemIndex):
        self._dataItems[dataItemIndex].overlayMgr.dataMgr = self
        oldModuleName = self._currentModuleName
        for v in self.module.values():
            self._currentModuleName = v.__class__.name
            v.onDeleteImage(self._dataItems[dataItemIndex])
        self._currentModuleName = oldModuleName

    def append(self, dataItem, alreadyLoaded=False):

        dataItem.dataMgr = self

        if alreadyLoaded == False:
            try:
                dataItem.loadFromFile()
            except Exception, e:
                print e
                traceback.print_exc(file=sys.stdout)
                QtGui.QErrorMessage.qtHandler().showMessage(
                    "Not enough Memory to load this file !")
                raise e

            alreadyLoaded = True

        if self.channels == -1 or dataItem.shape[-1] == self.channels:
            self.channels = dataItem.shape[-1]

            self.selectedChannels = range(self.channels)

            self._dataItems.append(dataItem)
            self._dataItemsLoaded.append(alreadyLoaded)
            self.onNewImage(dataItem)
        else:
            raise TypeError(
                'DataMgr.append: DataItem has wrong number of channels, a project can contain only images that have the same number of channels !'
            )
Beispiel #8
0
class DataItemImage(DataItemBase):
    def __init__(self, fileName):
        DataItemBase.__init__(self, fileName)
        self._dataVol = None
        self._featureM = None

        self._readBegin = (0, 0, 0)
        self._readEnd = (0, 0, 0)

        self._writeBegin = (0, 0, 0)
        self._writeEnd = (0, 0, 0)

        self.overlayMgr = overlayMgr.OverlayMgr(self)

        self.dataMgr = None

        self.initModules()

    def initModules(self):
        self.module = PropertyMgr(self)

        mods = BaseModuleDataItemMgr.__subclasses__()

        for m in mods:
            self.module[m.name] = m(self)
            self.module[m.name].overlayMgr = self.overlayMgr

    def setDataVol(self, dataVol):
        self._dataVol = dataVol
        self._writeBegin = (0, 0, 0)
        self._writeEnd = (dataVol.shape[1], dataVol.shape[2], dataVol.shape[3])

    def setReadBounds(self, begin, end):
        self._readBegin = begin
        self._readEnd = end

    def setWriteBounds(self, begin, end, shape):
        self._writeBegin = begin
        self._writeEnd = end
        self._writeShape = shape

    def __getitem__(self, args):
        return self._dataVol._data[args]

    def __setitem__(self, args, data):
        self._dataVol._data[args] = data

    def __getattr__(self, name):
        if name == "dtype":
            return self._dataVol._data.dtype
        elif name == "shape":
            return self._dataVol._data.shape
        else:
            raise AttributeError, name

    def unLoadData(self):
        # TODO: delete permanently here for better garbage collection
        self._dataVol = None
        self._data = None

    def loadFromFile(self):
        f = h5py.File(self.fileName, 'r')
        g = f["volume"]
        self.deserialize(g)

    def serialize(self,
                  h5G,
                  destbegin=(0, 0, 0),
                  destend=(0, 0, 0),
                  srcbegin=(0, 0, 0),
                  srcend=(0, 0, 0),
                  destshape=(0, 0, 0)):
        if destend != (0, 0, 0):
            self._dataVol.serialize(h5G, destbegin, destend, srcbegin, srcend,
                                    destshape)
        elif self._writeEnd != (0, 0, 0):

            destbegin = self._writeBegin
            destend = self._writeEnd
            srcbegin = self._readBegin
            srcend = self._readEnd
            destshape = self._writeShape

            self._dataVol.serialize(h5G, "data", destbegin, destend, srcbegin,
                                    srcend, destshape)
        else:
            self._dataVol.serialize(h5G)

        for k in self.module.keys():
            if hasattr(self.module[k], "serialize"):
                print "serializing ", k
                try:
                    self.module[k].serialize(h5G, destbegin, destend, srcbegin,
                                             srcend, destshape)
                except Exception as e:
                    print e
                    print traceback.print_exc()
                    print "couldn't serialize something"

    def updateOverlays(self):
        ov = overlayMgr.OverlayItem(self._dataVol._data,
                                    color=QtGui.QColor(255, 255, 255),
                                    alpha=1.0,
                                    colorTable=None,
                                    autoAdd=True,
                                    autoVisible=True,
                                    autoAlphaChannel=False,
                                    min=0,
                                    max=255)
        self.overlayMgr["Raw Data"] = ov

    def deserialize(self, h5G, offsets=(0, 0, 0), shape=(0, 0, 0)):
        self._dataVol = DataAccessor.deserialize(h5G, "data", offsets, shape)

        #load obsolete file format parts (pre version 0.5)
        #and store them in the properties
        #the responsible modules will take care of them

        for k in self.module.keys():
            if hasattr(self.module[k], "deserialize"):
                print "Deserializing", k
                self.module[k].deserialize(h5G, offsets, shape)

        self.updateOverlays()