Skip to content
Snippets Groups Projects
Commit 9ef90195 authored by Conor Finn's avatar Conor Finn
Browse files

RE #26846 Run model as worker thread and fix model

parent d5bc7e50
No related branches found
No related tags found
No related merge requests found
Showing
with 152 additions and 54 deletions
......@@ -833,10 +833,9 @@ public:
double getParameter(const QString &paramName) 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();
......
......@@ -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:
......
......@@ -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)
......@@ -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>
......@@ -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/>
......
......@@ -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
......
......@@ -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))
......@@ -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__':
......
# Mantid Repository : https://github.com/mantidproject/mantid
#
# Copyright &copy; 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)
......@@ -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()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment