diff --git a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py index 5d22268cef13ddf4c19ff241778eb1f4d3aba9ee..0c19119925da1001bfd9cb4bb183da8a92c95376 100644 --- a/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py +++ b/scripts/Engineering/gui/engineering_diffraction/engineering_diffraction.py @@ -33,6 +33,7 @@ class EngineeringDiffractionGui(QtWidgets.QMainWindow, Ui_main_window): self.calibration_presenter = None self.set_on_help_clicked(self.open_help_window) + # Setup Tabs self.setup_calibration() def setup_calibration(self): diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/model.py index be536df1f753cad588066deb7a1b4615e65be2bd..b7fd4c60d96aea38090ad3ce84ae350ecd9d8643 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/model.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/model.py @@ -7,7 +7,46 @@ from __future__ import (absolute_import, division, print_function) +from Engineering.gui.engineering_diffraction.tabs.common import vanadium_corrections +from mantid.simpleapi import EnggFocus, Load, logger + +SAMPLE_RUN_WORKSPACE_NAME = "engggui_focusing_input_ws" +FOCUSED_OUTPUT_WORKSPACE_NAME = "engggui_focusing_output_ws_bank_" + class FocusModel(object): - def focus_run(self, run_number, banks, plot_output, instrument, rb_number): - pass + def focus_run(self, sample_path, banks, plot_output, instrument, rb_number, current_calib): + vanadium_path = current_calib["vanadium_path"] + if vanadium_path is None: + return + integration_workspace, curves_workspace = vanadium_corrections.fetch_correction_workspaces( + vanadium_path, instrument) + sample_workspace = self._load_focus_sample_run(sample_path) + for name in banks: + output_workspace_name = FOCUSED_OUTPUT_WORKSPACE_NAME + str(name) + self._run_focus(sample_workspace, output_workspace_name, integration_workspace, curves_workspace, name) + + @staticmethod + def _run_focus(input_workspace, output_workspace, vanadium_integration_ws, + vanadium_curves_ws, bank): + try: + return EnggFocus(InputWorkspace=input_workspace, + OutputWorkspace=output_workspace, + VanIntegrationWorkspace=vanadium_integration_ws, + VanCurvesWorkspace=vanadium_curves_ws, + Bank=bank) + except RuntimeError as e: + logger.error( + "Error in focusing, Could not run the EnggFocus algorithm successfully for bank " + + str(bank) + ". Error Description: " + str(e)) + raise RuntimeError() + + @staticmethod + def _load_focus_sample_run(sample_path): + try: + return Load(Filename=sample_path, OutputWorkspace=SAMPLE_RUN_WORKSPACE_NAME) + except RuntimeError as e: + logger.error( + "Error while loading sample data for focusing. Could not load the sample with filename: " + + sample_path + ". Error Description: " + str(e)) + raise RuntimeError diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/test/test_model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/test/test_model.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3257003c89eb14bf09bb973ac04baf2452a80f91 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/focus/test/test_model.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/focus/test/test_model.py @@ -0,0 +1,51 @@ +# Mantid Repository : https://github.com/mantidproject/mantid +# +# Copyright © 2019 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 Engineering.gui.engineering_diffraction.tabs.focus import model + +file_path = "Engineering.gui.engineering_diffraction.tabs.focus.model" + + +class FocusModelTest(unittest.TestCase): + def setUp(self): + self.model = model.FocusModel() + self.current_calibration = { + "vanadium_path": "/mocked/out/anyway", + "ceria_path": "this_is_mocked_out_too" + } + + @patch(file_path + ".vanadium_corrections.fetch_correction_workspaces") + def test_fails_on_invalid_sample_number(self, fetch_van): + fetch_van.return_value = ("mocked_integ", "mocked_curves") + self.assertRaises(ValueError, self.model.focus_run, "FAIL", ["1", "2"], False, "ENGINX", + "0", self.current_calibration) + fetch_van.assert_called_with("/mocked/out/anyway", "ENGINX") + + @patch(file_path + ".vanadium_corrections.fetch_correction_workspaces") + def test_focus_cancelled_when_calibration_is_not_set(self, fetch_van): + fetch_van.return_value = ("mocked_integ", "mocked_curves") + blank_calibration = {"vanadium_path": None, "ceria_path": None} + self.model.focus_run("305761", ["1", "2"], False, "ENGINX", "0", blank_calibration) + self.assertEqual(fetch_van.call_count, 0) + + @patch(file_path + ".FocusModel._run_focus") + @patch(file_path + ".FocusModel._load_focus_sample_run") + @patch(file_path + ".vanadium_corrections.fetch_correction_workspaces") + def test_focus_run_for_each_bank(self, fetch_van, load_focus, run_focus): + fetch_van.return_value = ("mocked_integ", "mocked_curves") + banks = ["1", "2"] + load_focus.return_value = "mocked_sample" + self.model.focus_run("305761", banks, False, "ENGINX", "0", self.current_calibration) + self.assertEqual(len(banks), run_focus.call_count) + run_focus.assert_called_with("mocked_sample", + model.FOCUSED_OUTPUT_WORKSPACE_NAME + banks[-1], + "mocked_integ", "mocked_curves", banks[-1])