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

RE #27012 Refactor vanadium corrections into common package

Vanadium corrections are used across the various
tabs, so the functionality is refactored out of the
calibration tab's model.
parent cea9e939
No related branches found
No related tags found
No related merge requests found
......@@ -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"
......
# 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')
# 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)
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