diff --git a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py index 2deffb5a05d616603b9b4e79e768f8dca914f2e1..db15335bc5f7492df9960a08fa395676b754ef46 100644 --- a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py +++ b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py @@ -39,10 +39,21 @@ class EngineeringDiffractionGui(QtWidgets.QMainWindow, Ui_main_window): cal_model = CalibrationModel() cal_view = CalibrationView(parent=self.tabs) self.calibration_presenter = CalibrationPresenter(cal_model, cal_view) + self.set_on_instrument_changed(self.calibration_presenter.set_instrument_override) + self.set_on_rb_num_changed(self.calibration_presenter.set_rb_number) self.tabs.addTab(cal_view, "Calibration") def set_on_help_clicked(self, slot): self.pushButton_help.clicked.connect(slot) + def set_on_rb_num_changed(self, slot): + self.lineEdit_RBNumber.textChanged.connect(slot) + + def set_on_instrument_changed(self, slot): + self.comboBox_instrument.currentTextChanged.connect(slot) + def open_help_window(self): InterfaceManager().showCustomInterfaceHelp(self.doc) + + def get_rb_no(self): + return self.lineEdit_RBNumber.text() diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py index a032686f8b247ad16f03a56adf341d6638abcfe6..01be60fd3a104c4bb96ec49f710fdd6565667eeb 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py @@ -7,11 +7,15 @@ from __future__ import (absolute_import, division, print_function) +from os import path, makedirs +from ntpath import basename + from mantid.api import AnalysisDataService as Ads from mantid.kernel import logger from mantid.simpleapi import Load, EnggVanadiumCorrections, EnggCalibrate, DeleteWorkspace, CloneWorkspace, \ CreateWorkspace, AppendSpectra from mantidqt.plotting.functions import plot +from Engineering.EnggUtils import write_ENGINX_GSAS_iparam_file class CalibrationModel(object): @@ -19,22 +23,38 @@ class CalibrationModel(object): self.VANADIUM_INPUT_WORKSPACE_NAME = "engggui_vanadium_ws" self.CURVES_WORKSPACE_NAME = "engggui_vanadium_curves" self.INTEGRATED_WORKSPACE_NAME = "engggui_vanadium_integration" - - def create_new_calibration(self, vanadium_run_no, ceria_run_no, plot_output): - vanadium_corrections = self.calculate_vanadium_correction(vanadium_run_no) + self.out_files_root_dir = path.join(path.expanduser("~"), "Engineering_Mantid/") + + def create_new_calibration(self, + vanadium_path, + ceria_path, + plot_output, + instrument, + rb_num=None): + vanadium_corrections = self.calculate_vanadium_correction(vanadium_path) van_integration = vanadium_corrections[0] van_curves = vanadium_corrections[1] - ceria_workspace = self.load_ceria(ceria_run_no) + ceria_workspace = self.load_ceria(ceria_path) output = self.run_calibration(ceria_workspace, van_integration, van_curves) if plot_output: - self.plot_vanadium_curves() + self._plot_vanadium_curves() for i in range(2): difc = [output[i].DIFC] tzero = [output[i].TZERO] self._plot_difc_zero(difc, tzero) + difc = [output[0].DIFC, output[1].DIFC] + tzero = [output[0].TZERO, output[1].TZERO] + + calibration_dir = self.out_files_root_dir + "Calibration/" + self.create_output_files(calibration_dir, difc, tzero, ceria_path, vanadium_path, + instrument) + if rb_num: + calibration_dir = self.out_files_root_dir + "User/" + rb_num + "/Calibration/" + self.create_output_files(calibration_dir, difc, tzero, ceria_path, vanadium_path, + instrument) @staticmethod - def plot_vanadium_curves(): + def _plot_vanadium_curves(): van_curve_twin_ws = "__engggui_vanadium_curves_twin_ws" if Ads.doesExist(van_curve_twin_ws): @@ -132,6 +152,53 @@ class CalibrationModel(object): curves_workspace = Ads.Instance().retrieve(self.CURVES_WORKSPACE_NAME) return integrated_workspace, curves_workspace + def create_output_files(self, calibration_dir, difc, tzero, ceria_path, vanadium_path, + instrument): + if not path.exists(calibration_dir): + makedirs(calibration_dir) + filename, vanadium_no, ceria_no = self._generate_output_file_name(ceria_path, + vanadium_path, + instrument, + bank="all") + # Both Banks + file_path = calibration_dir + filename + write_ENGINX_GSAS_iparam_file(file_path, + difc, + tzero, + ceria_run=ceria_no, + vanadium_run=vanadium_no) + # North Bank + file_path = calibration_dir + self._generate_output_file_name( + ceria_path, vanadium_path, instrument, bank="north")[0] + write_ENGINX_GSAS_iparam_file(file_path, [difc[0]], [tzero[0]], + ceria_run=ceria_no, + vanadium_run=vanadium_no, + template_file="template_ENGINX_241391_236516_North_bank.prm", + bank_names=["North"]) + # South Bank + file_path = calibration_dir + self._generate_output_file_name( + ceria_path, vanadium_path, instrument, bank="south")[0] + write_ENGINX_GSAS_iparam_file(file_path, [difc[1]], [tzero[1]], + ceria_run=ceria_no, + vanadium_run=vanadium_no, + template_file="template_ENGINX_241391_236516_South_bank.prm", + bank_names=["South"]) + @staticmethod def _generate_table_workspace_name(bank_num): return "engggui_calibration_bank_" + str(bank_num + 1) + + @staticmethod + def _generate_output_file_name(ceria_path, vanadium_path, instrument, bank): + vanadium_no = path.splitext(basename(vanadium_path))[0].replace(instrument, '').lstrip('0') + ceria_no = path.splitext(basename(ceria_path))[0].replace(instrument, '').lstrip('0') + filename = instrument + "_" + vanadium_no + "_" + ceria_no + "_" + if bank == "all": + filename = filename + "all_banks.prm" + elif bank == "north": + filename = filename + "bank_North.prm" + elif bank == "south": + filename = filename + "bank_South.prm" + else: + raise ValueError("Invalid bank name entered") + return filename, vanadium_no, ceria_no diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py index b3adb63ee15c4ec7b035eb01cff27853326777fd..431b7ca9d93c559fd67cea90d628f41e1007a713 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/presenter.py @@ -6,6 +6,9 @@ # SPDX - License - Identifier: GPL - 3.0 + # pylint: disable=invalid-name from __future__ import (absolute_import, division, print_function) + +from qtpy import QtCore + from mantidqt.utils.asynchronous import AsyncTask from mantid.simpleapi import logger @@ -16,19 +19,37 @@ class CalibrationPresenter(object): self.view = view self.view.set_on_calibrate_clicked(self.on_calibrate_clicked) self.worker = None + self.instrument = "ENGINX" + self.rb_num = 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) + self.start_calibration_worker(vanadium_no, calib_no, plot_output, self.rb_num) - def start_calibration_worker(self, vanadium_no, calib_no, plot_output): + def start_calibration_worker(self, vanadium_no, calib_no, plot_output, rb_num): self.worker = AsyncTask(self.model.create_new_calibration, (vanadium_no, calib_no), - {"plot_output": plot_output}, - error_cb=self._on_error) + {"plot_output": plot_output, "instrument": self.instrument, "rb_num": rb_num}, + error_cb=self._on_error, finished_cb=self.calibration_finished) self.worker.start() + self.calibration_started() + + def set_instrument_override(self, instrument): + self.view.set_instrument_override(instrument) + self.instrument = instrument + + def set_rb_number(self, rb_number): + self.rb_num = rb_number + + def calibration_started(self): + self.view.set_calibrate_button_enabled(False) + self.view.set_check_plot_output_enabled(False) + + def calibration_finished(self): + self.view.set_calibrate_button_enabled(True) + self.view.set_check_plot_output_enabled(True) - @staticmethod - def _on_error(failure_info): + def _on_error(self, failure_info): logger.warning(str(failure_info)) + self.calibration_finished() 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 index f66b5da29d8b0abbb14d2b301b949cc9fcb0bbed..4049f2461429a7ee364edc70714d7fb947f9f278 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/test/test_presenter.py @@ -34,3 +34,24 @@ class CalibrationPresenterTest(unittest.TestCase): # Then self.presenter.on_calibrate_clicked() worker_method.assert_called_with("307521", "305738", True) + + def test_controls_disabled_while_running(self): + self.presenter = presenter.CalibrationPresenter(self.model, self.view) + + self.presenter.calibration_started() + + self.view.set_calibrate_button_enabled.assert_called_with(False) + self.view.set_check_plot_output_enabled.assert_called_with(False) + + def test_controls_enabled_when_done_running(self): + self.presenter = presenter.CalibrationPresenter(self.model, self.view) + + self.presenter.calibration_started() + + self.view.set_calibrate_button_enabled.assert_called_with(False) + self.view.set_check_plot_output_enabled.assert_called_with(False) + + self.presenter.calibration_finished() + + self.view.set_calibrate_button_enabled.assert_called_with(True) + self.view.set_check_plot_output_enabled.assert_called_with(True) diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py index c613620cd448734ddfa8fa636982ff44d0e5d9ac..95855bab1a8f0c012a095cbc83f4abaf46a43e36 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/view.py @@ -7,7 +7,6 @@ # pylint: disable=invalid-name from __future__ import (absolute_import, division, print_function) from qtpy import QtWidgets -from mantidqt.widgets.filefinder import FileFinder from mantidqt.utils.qt import load_ui @@ -15,19 +14,29 @@ Ui_calib, _ = load_ui(__file__, "calibration_tab.ui") class CalibrationView(QtWidgets.QWidget, Ui_calib): - def __init__(self, parent=None): + def __init__(self, parent=None, instrument="ENGINX"): super(CalibrationView, self).__init__(parent) self.setupUi(self) self.finder_calib.setLabelText("Calibration Sample #") - self.finder_calib.setInstrumentOverride("ENGINX") + self.finder_calib.setInstrumentOverride(instrument) self.finder_vanadium.setLabelText("Vanadium #") - self.finder_vanadium.setInstrumentOverride("ENGINX") + self.finder_vanadium.setInstrumentOverride(instrument) self.setup_tabbing_order() def set_on_calibrate_clicked(self, slot): self.button_calibrate.clicked.connect(slot) + def set_calibrate_button_enabled(self, enabled): + self.button_calibrate.setEnabled(enabled) + + def set_check_plot_output_enabled(self, enabled): + self.check_plotOutput.setEnabled(enabled) + + def set_instrument_override(self, instrument): + self.finder_vanadium.setInstrumentOverride(instrument) + self.finder_calib.setInstrumentOverride(instrument) + def get_vanadium_filename(self): return self.finder_vanadium.getFirstFilename() @@ -37,6 +46,5 @@ class CalibrationView(QtWidgets.QWidget, Ui_calib): def get_plot_output(self): return self.check_plotOutput.isChecked() - def setup_tabbing_order(self): - # TODO + def setup_tabbing_order(self): # TODO print()