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 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
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 !')
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()
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 !' )
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()