Source code for est.gui.roiselector
"""Tools to visualize spectra"""
from silx.gui import qt
from silx.gui.plot.items.roi import RectangleROI
from silx.gui.plot.tools.roi import RegionOfInterestManager
from silx.gui.plot.tools.roi import RegionOfInterestTableWidget
from ewokscore.missing_data import is_missing_data
from est.gui.XasObjectViewer import MapViewer
[docs]
class ROISelector(qt.QWidget):
"""
Used to defined a roi on a spectra map
"""
sigRoiUpdated = qt.Signal()
"""signal emit when the roi is updated"""
def __init__(self, parent=None):
qt.QWidget.__init__(self, parent)
self.setLayout(qt.QVBoxLayout())
# TODO: if data starts to be quiet large then we can load only part of
# if. There is some code to do this on tomwer.
self._xas_object_map = MapViewer(keys=["mu"])
self.layout().addWidget(self._xas_object_map)
self._plot = self._xas_object_map.getPlot()
# Create the object controlling the ROIs and set it up
self._roiManager = RegionOfInterestManager(self._plot)
self._roiManager.setColor("red") # Set the color of ROI
self._roiManager.sigRoiAdded.connect(self.updateAddedRegionOfInterest)
# Add a rectangular region of interest
self._roi = RectangleROI()
self._roi.setGeometry(origin=(0, 0), size=(2, 2))
self._roi.setName("ROI")
self._roiManager.addRoi(self._roi)
self.__roi_first_definition = True
"""flag used make sure the roi is clearly visible at least during the first processing"""
# Create the table widget displaying
self._roiTable = RegionOfInterestTableWidget()
self._roiTable.setRegionOfInterestManager(self._roiManager)
self._roi.sigRegionChanged.connect(self._propagateROISig)
# Add the region of interest table and the buttons to a dock widget
widget = qt.QWidget()
layout = qt.QVBoxLayout()
widget.setLayout(layout)
layout.addWidget(self._roiTable)
layout.addWidget(self._xas_object_map.keySelectionDocker)
dock = qt.QDockWidget("Image ROI")
dock.setWidget(widget)
self._plot.addDockWidget(qt.Qt.RightDockWidgetArea, dock)
# expose API
self.setColormap = self._plot.setDefaultColormap
def _propagateROISig(self, *args, **kwargs):
self.sigRoiUpdated.emit()
[docs]
def setXasObject(self, xas_obj):
if xas_obj is None or is_missing_data(xas_obj):
return
self._xas_object_map.setXasObject(xas_obj=xas_obj)
if self.__roi_first_definition is True:
origin = (0, 0)
size = (xas_obj.spectra.shape[1], xas_obj.spectra.shape[0])
self.setROI(origin=origin, size=size)
self._roi.setEditable(True)
[docs]
def getXasObject(self):
return self._xas_object_map._xasObj
[docs]
def updateAddedRegionOfInterest(self, roi):
"""Called for each added region of interest: set the name"""
if roi.getName() == "":
roi.setName("ROI %d" % len(self._roiManager.getRois()))
[docs]
def setROI(self, origin, size):
self._roi.setGeometry(origin=origin, size=size)
[docs]
def setOrigin(self, origin):
self._roi.setOrigin(origin)
[docs]
def setSize(self, size):
self._roi.setSize(size)
[docs]
def getROI(self):
return self._roi
[docs]
class ROISelectorDialog(qt.QDialog):
"""Dialog embedding the SoiSelector"""
def __init__(self, parent=None):
qt.QDialog.__init__(self, parent)
self._mainWindow = ROISelector(parent=self)
self.setWindowTitle("Roi selection")
self.setWindowFlags(qt.Qt.Widget)
types = qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel
_buttons = qt.QDialogButtonBox(parent=self)
_buttons.setStandardButtons(types)
self.setLayout(qt.QVBoxLayout())
self.layout().addWidget(self._mainWindow)
self.layout().addWidget(_buttons)
_buttons.accepted.connect(self.accept)
_buttons.rejected.connect(self.reject)
[docs]
def setXasObject(self, *args, **kwargs):
self._mainWindow.setXasObject(*args, **kwargs)
[docs]
def getXasObject(self):
return self._mainWindow.getXasObject()
[docs]
def getROI(self):
return self._mainWindow.getROI()
[docs]
def setROI(self, *args, **kwargs):
self._mainWindow.setROI(*args, **kwargs)
[docs]
def setColormap(self, *args, **kwargs):
self._mainWindow.setColormap(*args, **kwargs)
if __name__ == "__main__":
from est.core.types import XASObject
from est.tests.data import example_spectra
from est.core.process.roi import ROIProcess, _ROI
from silx.gui.colors import Colormap
energy, spectra = example_spectra(shape=(256, 32, 64))
xas_obj = XASObject(spectra=spectra, energy=energy, configuration=None)
app = qt.QApplication([])
class ROISelectorDialogTest(ROISelectorDialog):
"""Infinite update the xas obj according to ROI"""
def accept(self):
roi_process = ROIProcess()
roi_ = _ROI.from_silx_def(self.getROI())
roi_process.set_properties({"roi": roi_.to_dict()})
update_xas_object = roi_process.process(self.getXasObject())
self.setXasObject(update_xas_object)
self.show()
roiSelector = ROISelectorDialogTest()
# keep colormap
roiSelector.setColormap(Colormap(name="temperature", vmin=0, vmax=10))
roiSelector.setXasObject(xas_obj=xas_obj)
roiSelector.show()
app.exec_()