diff --git a/qt/python/mantidqt/_common.sip b/qt/python/mantidqt/_common.sip index 21157ef1a53467789f85b28e09ab0e3137511513..fba1e1c2e1bd3acd0c48948b588f75929d538061 100644 --- a/qt/python/mantidqt/_common.sip +++ b/qt/python/mantidqt/_common.sip @@ -833,10 +833,9 @@ public: double getParameter(const QString ¶mName) const; }; -// --- -// -// --- - +// --------------------------------- +// MWRunFiles +// --------------------------------- class MWRunFiles : QWidget { %TypeHeaderCode @@ -844,13 +843,18 @@ class MWRunFiles : QWidget %End public: MWRunFiles(QWidget *parent = nullptr); + +void setLabelText(const QString &text); void setLabelMinWidth(const int); void liveButtonSetChecked(bool); bool liveButtonIsChecked(); -QString getText() /PyName=text/; +QString getText(); +QString getFirstFilename() const; bool isValid(); void setUserInput(const QVariant &); void setText(const QString&); +void setInstrumentOverride(const QString &instName); + signals: void fileEditingFinished(); void fileFindingFinished(); diff --git a/qt/python/mantidqt/utils/asynchronous.py b/qt/python/mantidqt/utils/asynchronous.py index 1da5f09b4c7012688228fcba003b56a20c89bf70..44b87f2f5d097fa8fd46b51a72c341c1be51a165 100644 --- a/qt/python/mantidqt/utils/asynchronous.py +++ b/qt/python/mantidqt/utils/asynchronous.py @@ -58,7 +58,9 @@ class AsyncTask(threading.Thread): return time.time() - start def run(self): - + """ + DO NOT CALL DIRECTLY. Use .start() to begin the thread execution. + """ time_start = time.time() try: diff --git a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py index 6c7de92a3073d560db24b05e3b8a9fc3afde0755..7d4e6f65a8aa5f73e7aec133ad5082133c5d4b43 100644 --- a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py +++ b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py @@ -8,9 +8,11 @@ from __future__ import (absolute_import, division, print_function) from qtpy import QtCore, QtWidgets -from Engineering.gui.engineering_diffraction.tabs.calibration.presenter import CalibrationPresenter, CalibrationView, \ - CalibrationModel +from .tabs.calibration.presenter import CalibrationPresenter +from .tabs.calibration.view import CalibrationView +from .tabs.calibration.model import CalibrationModel +from mantidqt.interfacemanager import InterfaceManager from mantidqt.utils.qt import load_ui Ui_main_window, _ = load_ui(__file__, "main_window.ui") @@ -27,9 +29,18 @@ class EngineeringDiffractionGui(QtWidgets.QMainWindow, Ui_main_window): self.setupUi(self) self.tabs = self.tab_main self.setFocusPolicy(QtCore.Qt.StrongFocus) + self.calibration_presenter = None - # Calibration Tab + self.setup_calibration() + + def setup_calibration(self): cal_model = CalibrationModel() cal_view = CalibrationView(parent=self.tabs) self.calibration_presenter = CalibrationPresenter(cal_model, cal_view) self.tabs.addTab(cal_view, "Calibration") + + def on_help_clicked(self): + self.pushButton_help.connect(self.open_help_window) + + def open_help_window(self): + InterfaceManager().showCustomInterfaceHelp(self.doc) diff --git a/scripts/Engineering/gui/engineering_diffraction/main_window.ui b/scripts/Engineering/gui/engineering_diffraction/main_window.ui index 9154ca2abfb63d1aa0563d66312811b28e437c42..b01ed27e38219c68a110ef6ff6cc6873702087a1 100644 --- a/scripts/Engineering/gui/engineering_diffraction/main_window.ui +++ b/scripts/Engineering/gui/engineering_diffraction/main_window.ui @@ -117,5 +117,22 @@ </widget> </widget> <resources/> - <connections/> + <connections> + <connection> + <sender>pushButton_close</sender> + <signal>pressed()</signal> + <receiver>EngDIffMainGUI</receiver> + <slot>close()</slot> + <hints> + <hint type="sourcelabel"> + <x>589</x> + <y>174</y> + </hint> + <hint type="destinationlabel"> + <x>319</x> + <y>98</y> + </hint> + </hints> + </connection> + </connections> </ui> diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/calibration_tab.ui b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/calibration_tab.ui index b3a7a15d335510ad3d540c3224aba15e94995033..af73c8395d7d7e9417a450b1b596f4c074118868 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/calibration_tab.ui +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/calibration_tab.ui @@ -81,7 +81,7 @@ QGroupBox:title { <number>6</number> </property> <item row="6" column="0" colspan="2"> - <widget class="QCheckBox" name="check_plotCalibWsp"> + <widget class="QCheckBox" name="check_plotOutput"> <property name="text"> <string>Plot Calibrated Workspace</string> </property> @@ -172,7 +172,7 @@ QGroupBox:title { </customwidgets> <tabstops> <tabstop>radio_newCalib</tabstop> - <tabstop>check_plotCalibWsp</tabstop> + <tabstop>check_plotOutput</tabstop> <tabstop>button_calibrate</tabstop> </tabstops> <resources/> diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py index 1ef299eabc490f4bec1deaf6ac183f5b1f68cc99..a032686f8b247ad16f03a56adf341d6638abcfe6 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py @@ -12,7 +12,6 @@ from mantid.kernel import logger from mantid.simpleapi import Load, EnggVanadiumCorrections, EnggCalibrate, DeleteWorkspace, CloneWorkspace, \ CreateWorkspace, AppendSpectra from mantidqt.plotting.functions import plot -from qtpy import QtCore class CalibrationModel(object): @@ -26,11 +25,13 @@ class CalibrationModel(object): van_integration = vanadium_corrections[0] van_curves = vanadium_corrections[1] ceria_workspace = self.load_ceria(ceria_run_no) - difc, tzero = [0] * 2 - self.run_calibration(ceria_workspace, van_integration, van_curves, difc, tzero) + output = self.run_calibration(ceria_workspace, van_integration, van_curves) if plot_output: self.plot_vanadium_curves() - self._plot_difc_zero(difc, tzero) + for i in range(2): + difc = [output[i].DIFC] + tzero = [output[i].TZERO] + self._plot_difc_zero(difc, tzero) @staticmethod def plot_vanadium_curves(): @@ -42,11 +43,13 @@ class CalibrationModel(object): van_curves_ws = Ads.retrieve(van_curve_twin_ws) for i in range(1, 3): if i == 1: - curve_plot_bank_1 = plot([van_curves_ws], [0, 1, 2]).activeLayer() - curve_plot_bank_1.setTitle("Engg GUI Vanadium Curves Bank 1") + curve_plot_bank_1 = plot([van_curves_ws], [0, 1, 2]) + curve_plot_bank_1.gca().set_title("Engg GUI Vanadium Curves Bank 1") + curve_plot_bank_1.gca().legend(["Data", "Calc", "Diff"]) if i == 2: - curve_plot_bank_2 = plot([van_curves_ws], [3, 4, 5]).activeLayer() - curve_plot_bank_2.setTitle("Engg GUI Vanadium Curves Bank 2") + curve_plot_bank_2 = plot([van_curves_ws], [3, 4, 5]) + curve_plot_bank_2.gca().set_title("Engg GUI Vanadium Curves Bank 2") + curve_plot_bank_2.gca().legend(["Data", "Calc", "Diff"]) @staticmethod def _plot_difc_zero(difc, tzero): @@ -57,12 +60,8 @@ class CalibrationModel(object): y_val = [] y2_val = [] - if i == 1: - difc_to_plot = difc[0] - tzero_to_plot = tzero[0] - else: - difc_to_plot = difc[1] - tzero_to_plot = tzero[1] + difc_to_plot = difc[0] + tzero_to_plot = tzero[0] for irow in range(0, bank_ws.rowCount()): x_val.append(bank_ws.cell(irow, 0)) @@ -83,14 +82,17 @@ class CalibrationModel(object): DeleteWorkspace(ws1) DeleteWorkspace(ws2) - difc_zero_ws = Ads.retreive(output_ws) + difc_zero_ws = Ads.retrieve(output_ws) # Create plot - difc_zero_plot = plot(difc_zero_ws, [0, 1]).activeLayer() - difc_zero_plot.setTitle("Engg Gui Difc Zero Peaks Bank " + str(i)) - difc_zero_plot.setCurveTitle(0, "Peaks Fitted") - difc_zero_plot.setCurveTitle(1, "DifC/TZero Fitted Straight Line") - difc_zero_plot.xlabel("Expected Peaks Centre(dSpacing, A)") - difc_zero_plot.setCurveLineStyly(0, QtCore.Qt.DotLine) + difc_zero_plot = plot([difc_zero_ws], [0, 1], + plot_kwargs={ + "linestyle": "--", + "marker": "o", + "markersize": "3" + }) + difc_zero_plot.gca().set_title("Engg Gui Difc Zero Peaks Bank " + str(i)) + difc_zero_plot.gca().legend(("Peaks Fitted", "DifC/TZero Fitted Straight Line")) + difc_zero_plot.gca().set_xlabel("Expected Peaks Centre(dSpacing, A)") def load_ceria(self, ceria_run_no): try: @@ -102,17 +104,17 @@ class CalibrationModel(object): " Please check also the previous log messages for details.") raise RuntimeError - def run_calibration(self, ceria_ws, van_integration, van_curves, difc, tzero): + def run_calibration(self, ceria_ws, van_integration, van_curves): + output = [None] * 2 for i in range(2): table_name = self._generate_table_workspace_name(i) - EnggCalibrate(InputWorkspace=ceria_ws, - VanIntegrationWorkspace=van_integration, - VanCurvesWorkspace=van_curves, - Bank=i, - FittedPeaks=table_name, - OutputParametersTableName=table_name, - DIFC=difc[i], - TZERO=tzero[i]) + output[i] = EnggCalibrate(InputWorkspace=ceria_ws, + VanIntegrationWorkspace=van_integration, + VanCurvesWorkspace=van_curves, + Bank=str(i + 1), + FittedPeaks=table_name, + OutputParametersTableName=table_name) + return output def calculate_vanadium_correction(self, vanadium_run_no): try: @@ -126,7 +128,7 @@ class CalibrationModel(object): OutIntegrationWorkspace=self.INTEGRATED_WORKSPACE_NAME, OutCurvesWorkspace=self.CURVES_WORKSPACE_NAME) Ads.remove(self.VANADIUM_INPUT_WORKSPACE_NAME) - integrated_workspace = Ads.Instance().retrive(self.INTEGRATED_WORKSPACE_NAME) + integrated_workspace = Ads.Instance().retrieve(self.INTEGRATED_WORKSPACE_NAME) curves_workspace = Ads.Instance().retrieve(self.CURVES_WORKSPACE_NAME) return integrated_workspace, curves_workspace diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py index d251e85d3a21c4a385175876e1f38d14d5d694ec..b3adb63ee15c4ec7b035eb01cff27853326777fd 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py @@ -6,15 +6,29 @@ # SPDX - License - Identifier: GPL - 3.0 + # pylint: disable=invalid-name from __future__ import (absolute_import, division, print_function) - -from Engineering.gui.engineering_diffraction.tabs.calibration.model import CalibrationModel -from Engineering.gui.engineering_diffraction.tabs.calibration.view import CalibrationView +from mantidqt.utils.asynchronous import AsyncTask +from mantid.simpleapi import logger class CalibrationPresenter(object): def __init__(self, model, view): self.model = model self.view = view + self.view.set_on_calibrate_clicked(self.on_calibrate_clicked) + self.worker = None + def on_calibrate_clicked(self): + vanadium_no = self.view.get_vanadium_filename() + calib_no = self.view.get_calib_filename() + plot_output = self.view.get_plot_output() + self.start_calibration_worker(vanadium_no, calib_no, plot_output) + def start_calibration_worker(self, vanadium_no, calib_no, plot_output): + self.worker = AsyncTask(self.model.create_new_calibration, (vanadium_no, calib_no), + {"plot_output": plot_output}, + error_cb=self._on_error) + self.worker.start() + @staticmethod + def _on_error(failure_info): + logger.warning(str(failure_info)) diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_model.py index e1ae5491361bf1cad6c6346b0fd783e6eade42c6..1189f5b1f6ac18becd3db8df0a3612cb4b78a505 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_model.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_model.py @@ -9,7 +9,7 @@ from __future__ import (absolute_import, division, print_function) import unittest -from mantid.py3compat.mock import patch, MagicMock +from mantid.py3compat.mock import patch from Engineering.gui.engineering_diffraction.tabs.calibration.model import CalibrationModel VANADIUM_NUMBER = 307521 @@ -53,7 +53,7 @@ class CalibrationModelTest(unittest.TestCase): plot_difc_zero.assert_not_called() self.model.create_new_calibration(VANADIUM_NUMBER, CERIUM_NUMBER, True) plot_van.assert_called_once() - plot_difc_zero.assert_called_once() + self.assertEqual(plot_difc_zero.call_count, 2) if __name__ == '__main__': diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py new file mode 100644 index 0000000000000000000000000000000000000000..f66b5da29d8b0abbb14d2b301b949cc9fcb0bbed --- /dev/null +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py @@ -0,0 +1,36 @@ +# Mantid Repository : https://github.com/mantidproject/mantid +# +# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# NScD Oak Ridge National Laboratory, European Spallation Source +# & Institut Laue - Langevin +# SPDX - License - Identifier: GPL - 3.0 + + +from __future__ import (absolute_import, division, print_function) + +import unittest + +from mantid.py3compat.mock import patch +from mantid.py3compat import mock +from Engineering.gui.engineering_diffraction.tabs.calibration import view, model, presenter + +tab_path = 'Engineering.gui.engineering_diffraction.tabs.calibration' + + +class CalibrationPresenterTest(unittest.TestCase): + def setUp(self): + self.view = mock.create_autospec(view.CalibrationView) + self.model = mock.create_autospec(model.CalibrationModel) + + @patch(tab_path + ".presenter.CalibrationPresenter.start_calibration_worker") + def test_worker_started_with_right_params(self, worker_method): + # Given + self.presenter = presenter.CalibrationPresenter(self.model, self.view) + + # When + self.view.get_vanadium_filename.return_value = "307521" + self.view.get_calib_filename.return_value = "305738" + self.view.get_plot_output.return_value = True + + # Then + self.presenter.on_calibrate_clicked() + worker_method.assert_called_with("307521", "305738", True) diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py index 8bb820f371e562d7f99656ac6079841827481172..c613620cd448734ddfa8fa636982ff44d0e5d9ac 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py @@ -18,13 +18,25 @@ class CalibrationView(QtWidgets.QWidget, Ui_calib): def __init__(self, parent=None): super(CalibrationView, self).__init__(parent) self.setupUi(self) + self.finder_calib.setLabelText("Calibration Sample #") + self.finder_calib.setInstrumentOverride("ENGINX") - def on_browse_vanadium_clicked(self, slot): - self.button_browseVanadium.clicked.connect(slot) + self.finder_vanadium.setLabelText("Vanadium #") + self.finder_vanadium.setInstrumentOverride("ENGINX") + self.setup_tabbing_order() + def set_on_calibrate_clicked(self, slot): + self.button_calibrate.clicked.connect(slot) - def on_browse_calibration_clicked(self, slot): - self.button_browseCalib.clicked.connect(slot) + def get_vanadium_filename(self): + return self.finder_vanadium.getFirstFilename() - def on_calibrate_clicked(self, slot): - self.button_calibrate.clicked.connect(slot) + def get_calib_filename(self): + return self.finder_calib.getFirstFilename() + + def get_plot_output(self): + return self.check_plotOutput.isChecked() + + def setup_tabbing_order(self): + # TODO + print()