diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py index d6d0c8cbad25b8bc1ec2fd15019f9de4648313e3..75bc5735c66b2628039c38a4ddacb909b8037f45 100644 --- a/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/calibration/model.py @@ -15,6 +15,8 @@ from mantid.simpleapi import Load, EnggVanadiumCorrections, EnggCalibrate, Delet CreateWorkspace, AppendSpectra, CreateEmptyTableWorkspace from mantidqt.plotting.functions import plot from Engineering.EnggUtils import write_ENGINX_GSAS_iparam_file +from Engineering.gui.engineering_diffraction.tabs.common import vanadium_corrections +from Engineering.gui.engineering_diffraction.tabs.common import path_handling VANADIUM_INPUT_WORKSPACE_NAME = "engggui_vanadium_ws" @@ -22,8 +24,7 @@ CURVES_WORKSPACE_NAME = "engggui_vanadium_curves" INTEGRATED_WORKSPACE_NAME = "engggui_vanadium_integration" CALIB_PARAMS_WORKSPACE_NAME = "engggui_calibration_banks_parameters" -OUT_FILES_ROOT_DIR = path.join(path.expanduser("~"), "Engineering_Mantid") -CALIBRATION_DIR = path.join(OUT_FILES_ROOT_DIR, "Calibration", "") +CALIBRATION_DIR = path.join(path_handling.OUT_FILES_ROOT_DIR, "Calibration", "") NORTH_BANK_TEMPLATE_FILE = "template_ENGINX_241391_236516_North_bank.prm" SOUTH_BANK_TEMPLATE_FILE = "template_ENGINX_241391_236516_South_bank.prm" @@ -44,9 +45,7 @@ class CalibrationModel(object): :param instrument: The instrument the data relates to. :param rb_num: The RB number for file creation. """ - vanadium_corrections = self.calculate_vanadium_correction(vanadium_path) - van_integration = vanadium_corrections[0] - van_curves = vanadium_corrections[1] + van_integration, van_curves = vanadium_corrections.fetch_correction_workspaces(vanadium_path, instrument) ceria_workspace = self.load_ceria(ceria_path) output = self.run_calibration(ceria_workspace, van_integration, van_curves) if plot_output: @@ -66,7 +65,7 @@ class CalibrationModel(object): self.create_output_files(CALIBRATION_DIR, difc, tzero, ceria_path, vanadium_path, instrument) if rb_num: - user_calib_dir = path.join(OUT_FILES_ROOT_DIR, "User", rb_num, "Calibration", "") + user_calib_dir = path.join(path_handling.OUT_FILES_ROOT_DIR, "User", rb_num, "Calibration", "") self.create_output_files(user_calib_dir, difc, tzero, ceria_path, vanadium_path, instrument) @@ -180,28 +179,6 @@ class CalibrationModel(object): OutputParametersTableName=table_name) return output - @staticmethod - def calculate_vanadium_correction(vanadium_path): - """ - Runs the vanadium correction algorithm. - :param vanadium_path: The path to the vanadium data. - :return: The integrated workspace and the curves generated by the algorithm. - """ - try: - Load(Filename=vanadium_path, OutputWorkspace=VANADIUM_INPUT_WORKSPACE_NAME) - except Exception as e: - logger.error("Error when loading vanadium sample data. " - "Could not run Load algorithm with vanadium run number: " + - str(vanadium_path) + ". Error description: " + str(e)) - raise RuntimeError - EnggVanadiumCorrections(VanadiumWorkspace=VANADIUM_INPUT_WORKSPACE_NAME, - OutIntegrationWorkspace=INTEGRATED_WORKSPACE_NAME, - OutCurvesWorkspace=CURVES_WORKSPACE_NAME) - Ads.remove(VANADIUM_INPUT_WORKSPACE_NAME) - integrated_workspace = Ads.Instance().retrieve(INTEGRATED_WORKSPACE_NAME) - curves_workspace = Ads.Instance().retrieve(CURVES_WORKSPACE_NAME) - return integrated_workspace, curves_workspace - def create_output_files(self, calibration_dir, difc, tzero, ceria_path, vanadium_path, instrument): """ @@ -257,8 +234,8 @@ class CalibrationModel(object): :param bank: The bank being saved. :return: The filename, the vanadium run number, and ceria run number. """ - vanadium_no = path.splitext(path.basename(vanadium_path))[0].replace(instrument, '').lstrip('0') - ceria_no = path.splitext(path.basename(ceria_path))[0].replace(instrument, '').lstrip('0') + vanadium_no = path_handling.get_run_number_from_path(vanadium_path, instrument) + ceria_no = path_handling.get_run_number_from_path(ceria_path, instrument) filename = instrument + "_" + vanadium_no + "_" + ceria_no + "_" if bank == "all": filename = filename + "all_banks.prm" diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/common/__init__.py b/scripts/Engineering/gui/engineering_diffraction/tabs/common/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/common/path_handling.py b/scripts/Engineering/gui/engineering_diffraction/tabs/common/path_handling.py new file mode 100644 index 0000000000000000000000000000000000000000..35da5482bfb72effedfcd22855f0363533fd28c5 --- /dev/null +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/common/path_handling.py @@ -0,0 +1,16 @@ +# 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) + +from os import path + +OUT_FILES_ROOT_DIR = path.join(path.expanduser("~"), "Engineering_Mantid") + + +def get_run_number_from_path(run_path, instrument): + return path.splitext(path.basename(run_path))[0].replace(instrument, '').lstrip('0') diff --git a/scripts/Engineering/gui/engineering_diffraction/tabs/common/vanadium_corrections.py b/scripts/Engineering/gui/engineering_diffraction/tabs/common/vanadium_corrections.py new file mode 100644 index 0000000000000000000000000000000000000000..5c479608e6e7f43ed93e034a5f642c797dc5eaed --- /dev/null +++ b/scripts/Engineering/gui/engineering_diffraction/tabs/common/vanadium_corrections.py @@ -0,0 +1,76 @@ +# 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) + +from os import path +from os import makedirs + +from mantid.simpleapi import logger, Load, EnggVanadiumCorrections, SaveNexus +from mantid.simpleapi import AnalysisDataService as Ads + +from Engineering.gui.engineering_diffraction.tabs.common import path_handling + +VANADIUM_INPUT_WORKSPACE_NAME = "engggui_vanadium_ws" +CURVES_WORKSPACE_NAME = "engggui_vanadium_curves" +INTEGRATED_WORKSPACE_NAME = "engggui_vanadium_integration" + +SAVED_FILE_CURVE_SUFFIX = "_precalculated_vanadium_run_bank_curves.nxs" +SAVED_FILE_INTEG_SUFFIX = "_precalculated_vanadium_run_integration.nxs" + + +def _calculate_vanadium_correction(vanadium_path): + """ + Runs the vanadium correction algorithm. + :param vanadium_path: The path to the vanadium data. + :return: The integrated workspace and the curves generated by the algorithm. + """ + try: + Load(Filename=vanadium_path, OutputWorkspace=VANADIUM_INPUT_WORKSPACE_NAME) + except Exception as e: + logger.error("Error when loading vanadium sample data. " + "Could not run Load algorithm with vanadium run number: " + + str(vanadium_path) + ". Error description: " + str(e)) + raise RuntimeError + EnggVanadiumCorrections(VanadiumWorkspace=VANADIUM_INPUT_WORKSPACE_NAME, + OutIntegrationWorkspace=INTEGRATED_WORKSPACE_NAME, + OutCurvesWorkspace=CURVES_WORKSPACE_NAME) + Ads.remove(VANADIUM_INPUT_WORKSPACE_NAME) + integrated_workspace = Ads.Instance().retrieve(INTEGRATED_WORKSPACE_NAME) + curves_workspace = Ads.Instance().retrieve(CURVES_WORKSPACE_NAME) + return integrated_workspace, curves_workspace + + +def fetch_correction_workspaces(vanadium_path, instrument): + vanadium_number = path_handling.get_run_number_from_path(vanadium_path, instrument) + integ_path, curves_path = _generate_saved_workspace_file_paths(vanadium_number) + if path.exists(curves_path) and path.exists(integ_path): # Check if the cached files exist. + try: + integ_workspace = Load(Filename=integ_path, OutputWorkspace=INTEGRATED_WORKSPACE_NAME) + curves_workspace = Load(Filename=curves_path, OutputWorkspace=CURVES_WORKSPACE_NAME) + return integ_workspace, curves_workspace + except RuntimeError as e: + logger.error( + "Problem loading existing vanadium calculations. Creating new cached files. Description: " + + str(e)) + integ_workspace, curves_workspace = _calculate_vanadium_correction(vanadium_path) + _save_correction_files(integ_workspace, integ_path, curves_workspace, curves_path) + return integ_workspace, curves_workspace + + +def _save_correction_files(integration_workspace, integration_path, curves_workspace, curves_path): + SaveNexus(InputWorkspace=integration_workspace, Filename=integration_path) + SaveNexus(InputWorkspace=curves_workspace, Filename=curves_path) + + +def _generate_saved_workspace_file_paths(vanadium_number): + integrated_filename = vanadium_number + SAVED_FILE_INTEG_SUFFIX + curves_filename = vanadium_number + SAVED_FILE_CURVE_SUFFIX + vanadium_dir = path.join(path_handling.OUT_FILES_ROOT_DIR, "Vanadium_Runs") + if not path.exists(vanadium_dir): + makedirs(vanadium_dir) + return path.join(vanadium_dir, integrated_filename), path.join(vanadium_dir, curves_filename)