Commit af5c9630 authored by payno's avatar payno

[gui][pymca] integrate E0 calculator in the pymca normalization widget

parent d05ecda9
......@@ -42,19 +42,74 @@ from silx.gui import qt
from silx.gui.plot import LegendSelector
from est.gui.XasObjectViewer import (_plot_edge, _plot_norm, _plot_post_edge,
_plot_pre_edge)
import est.core.process.pymca.normalization
from orangecontrib.est.process import _ProcessForOrangeMixIn
from orangecontrib.est.process import ProcessRunnable
from est.core.types import XASObject
from est.gui.XasObjectViewer import XasObjectViewer, ViewType
from orangecontrib.est.widgets.container import _ParameterWindowContainer
from orangecontrib.est.progress import QProgress
from orangecontrib.est.utils import Converter
from ..container import _ParameterWindowContainer
from est.gui.e0calculator import E0CalculatorDialog
from est.core.types import XASObject
from est.gui.XasObjectViewer import XasObjectViewer, ViewType
import est.core.process.pymca.normalization
_logger = logging.getLogger(__file__)
class _XASNormalizationParametersPatched(XASNormalizationParameters):
"""This class will try to patch the XASNormalizationParameters with the
E0Calculation widget"""
sigE0CalculationRequested = qt.Signal()
"""Signal emitted when E0 computation is required"""
def __init__(self, *args, **kwargs):
XASNormalizationParameters.__init__(self, *args, **kwargs)
# add E0CalculationWidget if can
try:
self.__addE0CalculationDialog()
except Exception as e:
_logger.warning('Fail to add the E0CalculationDialog. Reason is', str(e))
else:
self._e0CalcPB.pressed.connect(self._launchE0Calculator)
def setE0(self, e0):
e0_min = self.e0SpinBox.minimum()
e0_max = self.e0SpinBox.maximum()
if not ( e0_min <= e0 <= e0_max):
_logger.warning('given e0 value (e0) is invalid, value should be '
'between %s and %s' % (e0, e0_min, e0_max))
params = self.getParameters()
params["E0Value"] = e0
params["E0Method"] = 'Manual'
self.setParameters(ddict=params, signal=False)
def __addE0CalculationDialog(self):
# check we know where to set the button
for attr in ('e0SpinBox', 'jumpLine', 'e0CheckBox'):
if not hasattr(self, attr):
raise NameError('%s not defined - pymca version not '
'recognized' % attr)
for widget, widget_index in zip((self.e0SpinBox, self.jumpLine), (3, 5)):
if self.layout().indexOf(widget) != widget_index:
raise ValueError('XASNormalizationParameters layout is not recognized.')
style = qt.QApplication.instance().style()
icon = style.standardIcon(qt.QStyle.SP_FileDialogContentsView)
self._e0CalcPB = qt.QPushButton(icon, '', self)
self.layout().addWidget(self._e0CalcPB, 1, 2)
def _launchE0Calculator(self, *args, **kwargs):
self.sigE0CalculationRequested.emit()
class NormalizationWindow(qt.QMainWindow):
"""Widget embedding the pymca parameter window and the display of the
data currently process"""
sigE0CalculationRequested = qt.Signal()
"""Signal emitted when E0 computation is required"""
def __init__(self, parent=None):
qt.QMainWindow.__init__(self, parent)
......@@ -65,7 +120,7 @@ class NormalizationWindow(qt.QMainWindow):
self.xasObjViewer._spectrumViews[0]._plot.getYAxis().setLabel("Absorption (a.u.)")
self.setCentralWidget(self.xasObjViewer)
self._pymcaWindow = _ParameterWindowContainer(parent=self,
parametersWindow=XASNormalizationParameters)
parametersWindow=_XASNormalizationParametersPatched)
dockWidget = qt.QDockWidget(parent=self)
# pymca window
......@@ -91,6 +146,9 @@ class NormalizationWindow(qt.QMainWindow):
self.setWindowFlags(qt.Qt.Widget)
# expose API
self.setE0 = self._pymcaWindow._mainwidget.setE0
# connect signal / slot
self.xasObjViewer.viewTypeChanged.connect(self._updateLegendView)
......@@ -145,12 +203,18 @@ class NormalizationOW(_ProcessForOrangeMixIn, OWWidget):
layout.addWidget(self._window)
self._window.xasObjViewer.setWindowTitle('spectra')
# expose API
self.setE0 = self._window.setE0
# manage settings
if self._pymcaSettings != dict():
self._window._pymcaWindow.setParameters(self._pymcaSettings)
# connect signals / slots
_sig = self._window._pymcaWindow.sigChanged.connect(self._updateProcess)
pymcaWindowContainer = self._window._pymcaWindow
_sig = pymcaWindowContainer.sigChanged.connect(self._updateProcess)
if hasattr(pymcaWindowContainer._mainwidget, 'sigE0CalculationRequested'):
pymcaWindowContainer._mainwidget.sigE0CalculationRequested.connect(self._getE0FrmDialog)
def _updateProcess(self):
self._update_settings()
......@@ -192,6 +256,14 @@ class NormalizationOW(_ProcessForOrangeMixIn, OWWidget):
# start processing
thread.start(priority=qt.QThread.LowPriority)
def _getE0FrmDialog(self):
"""Pop up an instance of E0CalculationDialog and get E0 from it"""
if self._latest_xas_obj is None:
return
dialog = E0CalculatorDialog(xas_obj=self._latest_xas_obj, parent=None)
if dialog.exec_():
self.setE0(dialog.getE0())
class QPyMca_normalization(
est.core.process.pymca.normalization.PyMca_normalization):
......@@ -213,3 +285,26 @@ class QPyMca_normalization(
callback=self._advancement.increaseAdvancement)
self.pool.start(runnable)
self.pool.waitForDone()
if __name__ == '__main__':
from est.core.utils import spectra as spectra_utils
from est.core.types import XASObject
def create_dataset():
dim1, dim2 = 20, 40
energy, spectra = spectra_utils.create_dataset(shape=(256, dim1, dim2),
noise=True)
spectra = spectra * 1000
return XASObject(energy=energy,
spectra=spectra,
dim1=dim1,
dim2=dim2)
xas_object = create_dataset()
app = qt.QApplication([])
widget = NormalizationOW()
widget.process(xas_object)
widget.show()
app.exec_()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment