From 76d41ed7b37915682e5acdd5c3c4b6d5d0b4ebf4 Mon Sep 17 00:00:00 2001 From: David Fairbrother <DavidFair@users.noreply.github.com> Date: Thu, 9 Mar 2017 16:01:41 +0000 Subject: [PATCH] Re #18643 Added field for keeping only one unit type in output --- .../Diffraction/isis_powder/abstract_inst.py | 15 ++++--- scripts/Diffraction/isis_powder/gem.py | 5 ++- .../gem_routines/gem_param_mapping.py | 1 + scripts/Diffraction/isis_powder/pearl.py | 2 +- scripts/Diffraction/isis_powder/polaris.py | 2 +- .../isis_powder/routines/calibrate.py | 5 ++- .../isis_powder/routines/common.py | 29 ++++++++++++- .../isis_powder/routines/common_enums.py | 41 +++++++++++++++++++ .../Diffraction/isis_powder/routines/focus.py | 9 +++- 9 files changed, 96 insertions(+), 13 deletions(-) diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py index 0d3718a2a04..30519142326 100644 --- a/scripts/Diffraction/isis_powder/abstract_inst.py +++ b/scripts/Diffraction/isis_powder/abstract_inst.py @@ -14,12 +14,13 @@ from isis_powder.routines import calibrate, focus, common, common_enums, common_ # private method for the scripts class AbstractInst(object): - def __init__(self, user_name, calibration_dir, output_dir): + def __init__(self, user_name, calibration_dir, output_dir, inst_prefix): # ----- Properties common to ALL instruments -------- # if user_name is None: raise ValueError("A user name must be specified") self._user_name = user_name self._calibration_dir = calibration_dir + self._inst_prefix = inst_prefix self._output_dir = output_dir @property @@ -37,10 +38,8 @@ class AbstractInst(object): def _create_vanadium(self, run_details, do_absorb_corrections=True): """ Creates a vanadium calibration - should be called by the concrete instrument - :param vanadium_runs: The vanadium run or run in range (depending on instrument) to process - :param empty_runs: The empty run to process + :param run_details: The run details for the run to process :param do_absorb_corrections: Set to true if absorption corrections should be applied - :param gen_absorb_correction: Set to true if absorption corrections should be recalculated :return: d_spacing focused vanadium group """ return calibrate.create_van(instrument=self, run_details=run_details, @@ -147,6 +146,9 @@ class AbstractInst(object): """ return van_ws_to_crop + def _get_unit_to_keep(self): + return None + def _generate_auto_vanadium_calibration(self, run_details): """ Used by focus if a vanadium spline was not found to automatically generate said spline if the instrument @@ -198,9 +200,10 @@ class AbstractInst(object): output_paths = self._generate_out_file_paths(run_details=run_details) common_output.save_focused_data(d_spacing_group=d_spacing_group, tof_group=tof_group, - output_paths=output_paths, inst_prefix="POL", + output_paths=output_paths, inst_prefix=self._inst_prefix, run_number_string=run_details.user_input_run_number) - return d_spacing_group + + return d_spacing_group, tof_group # Steps applicable to all instruments diff --git a/scripts/Diffraction/isis_powder/gem.py b/scripts/Diffraction/isis_powder/gem.py index b8a828d0e1f..744ec553489 100644 --- a/scripts/Diffraction/isis_powder/gem.py +++ b/scripts/Diffraction/isis_powder/gem.py @@ -15,7 +15,7 @@ class Gem(AbstractInst): super(Gem, self).__init__(user_name=self._inst_settings.user_name, calibration_dir=self._inst_settings.calibration_dir, - output_dir=self._inst_settings.output_dir) + output_dir=self._inst_settings.output_dir, inst_prefix="GEM") self._cached_run_details = None self._cached_run_number = None @@ -68,6 +68,9 @@ class Gem(AbstractInst): def _crop_van_to_expected_tof_range(self, van_ws_to_crop): return common.crop_banks_in_tof(van_ws_to_crop, self._inst_settings.vanadium_cropping_values) + def _get_unit_to_keep(self): + return self._inst_settings.unit_to_keep + def check_mode_is_valid(inst_settings): set_mode = str(inst_settings.mode).lower() diff --git a/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py b/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py index fe71e429191..29041d4bd50 100644 --- a/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py +++ b/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py @@ -15,6 +15,7 @@ attr_mapping = [("calibration_directory", "calibration_dir"), ("sample_empty", "sample_empty"), ("spline_coefficient", "spline_coeff"), ("output_directory", "output_dir"), + ("unit_to_keep", "unit_to_keep"), ("user_name", "user_name"), ("vanadium_cropping_values", "vanadium_cropping_values"), ("vanadium_normalisation", "do_van_norm")] diff --git a/scripts/Diffraction/isis_powder/pearl.py b/scripts/Diffraction/isis_powder/pearl.py index a2cf089cb35..5fab9608afc 100644 --- a/scripts/Diffraction/isis_powder/pearl.py +++ b/scripts/Diffraction/isis_powder/pearl.py @@ -18,7 +18,7 @@ class Pearl(AbstractInst): super(Pearl, self).__init__(user_name=self._inst_settings.user_name, calibration_dir=self._inst_settings.calibration_dir, - output_dir=self._inst_settings.output_dir) + output_dir=self._inst_settings.output_dir, inst_prefix="PEARL") self._cached_run_details = None self._cached_run_details_number = None diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py index c4de5b801c9..18ea4fbb6d0 100644 --- a/scripts/Diffraction/isis_powder/polaris.py +++ b/scripts/Diffraction/isis_powder/polaris.py @@ -16,7 +16,7 @@ class Polaris(AbstractInst): super(Polaris, self).__init__(user_name=self._inst_settings.user_name, calibration_dir=self._inst_settings.calibration_dir, - output_dir=self._inst_settings.output_dir) + output_dir=self._inst_settings.output_dir, inst_prefix="POL") # Hold the last dictionary later to avoid us having to keep parsing the YAML self._run_details_last_run_number = None diff --git a/scripts/Diffraction/isis_powder/routines/calibrate.py b/scripts/Diffraction/isis_powder/routines/calibrate.py index 443acce6389..0070f121530 100644 --- a/scripts/Diffraction/isis_powder/routines/calibrate.py +++ b/scripts/Diffraction/isis_powder/routines/calibrate.py @@ -33,11 +33,14 @@ def create_van(instrument, run_details, absorb): focused_spectra = common.extract_ws_spectra(focused_vanadium) focused_spectra = instrument._crop_van_to_expected_tof_range(focused_spectra) - d_spacing_group = _save_focused_vanadium(instrument=instrument, run_details=run_details, + d_spacing_group, tof_group = _save_focused_vanadium(instrument=instrument, run_details=run_details, van_spectra=focused_spectra) _create_vanadium_splines(focused_spectra, instrument, run_details) + common.keep_single_ws_unit(d_spacing_group=d_spacing_group,tof_group=tof_group, + unit_to_keep=instrument._get_unit_to_keep()) + common.remove_intermediate_workspace(corrected_van_ws) common.remove_intermediate_workspace(aligned_ws) common.remove_intermediate_workspace(focused_vanadium) diff --git a/scripts/Diffraction/isis_powder/routines/common.py b/scripts/Diffraction/isis_powder/routines/common.py index a1771792984..d0b64e54e99 100644 --- a/scripts/Diffraction/isis_powder/routines/common.py +++ b/scripts/Diffraction/isis_powder/routines/common.py @@ -2,7 +2,7 @@ from __future__ import (absolute_import, division, print_function) import mantid.kernel as kernel import mantid.simpleapi as mantid -from isis_powder.routines.common_enums import InputBatchingEnum +from isis_powder.routines.common_enums import InputBatchingEnum, WorkspaceUnits def cal_map_dictionary_key_helper(dictionary, key, append_to_error_message=None): @@ -173,6 +173,33 @@ def get_monitor_ws(ws_to_process, run_number_string, instrument): return load_monitor_ws +def keep_single_ws_unit(d_spacing_group, tof_group, unit_to_keep): + """ + Takes variables to the output workspaces in d-spacing and TOF and removes one + of them depending on what the user has selected as their unit to keep. + If a workspace has been deleted it additionally deletes the variable. + If a unit they want to keep has not been specified it does nothing. + :param d_spacing_group: The output workspace group in dSpacing + :param tof_group: The output workspace group in TOF + :param unit_to_keep: The unit to keep from the WorkspaceUnits enum + :return: None + """ + if not unit_to_keep: + # If they do not specify which unit to keep don't do anything + return + + if unit_to_keep == WorkspaceUnits.d_spacing: + remove_intermediate_workspace(tof_group) + del tof_group + + elif unit_to_keep == WorkspaceUnits.tof: + remove_intermediate_workspace(d_spacing_group) + del d_spacing_group + + else: + raise ValueError("The user specified unit to keep is unknown") + + def load_current_normalised_ws_list(run_number_string, instrument, input_batching=None): """ Loads a workspace using Mantid and then performs current normalisation on it. Additionally it will either diff --git a/scripts/Diffraction/isis_powder/routines/common_enums.py b/scripts/Diffraction/isis_powder/routines/common_enums.py index 1261755dc4b..660175376b1 100644 --- a/scripts/Diffraction/isis_powder/routines/common_enums.py +++ b/scripts/Diffraction/isis_powder/routines/common_enums.py @@ -1,6 +1,47 @@ from __future__ import (absolute_import, division, print_function) +from six import iteritems + +# Holds enumeration classes for common values and a method for checking a value is in an enumeration class InputBatchingEnum(object): + enum_friendly_name = "batching modes" Individual = "Individual" Summed = "Summed" + + +class WorkspaceUnits(object): + enum_friendly_name = "workspace units" + d_spacing = "dSpacing" + tof = "TOF" + + +def check_value_is_in_enum(val, enum, enum_friendly_name): + seen_val_in_enum = False + enum_known_keys = [] + lower_string_val = str(val).lower() + + for k, v in iteritems(enum.__dict__): + # Get all class attribute and value pairs except enum_friendly_name + if k.lower == "enum_friendly_name": + continue + + enum_known_keys.append(k) + + if lower_string_val == v.lower(): + val = v # Get the correctly types val + seen_val_in_enum = True + + # Check to see if the value was seen + if seen_val_in_enum: + return val + else: + e_msg = "The user specified value: '" + str(val) + "' is unknown. " + e_msg += "Known values for " + enum_friendly_name + " are:\n" + for key in enum_known_keys: + e_msg += key + '\n' + + raise ValueError(e_msg) + + + diff --git a/scripts/Diffraction/isis_powder/routines/focus.py b/scripts/Diffraction/isis_powder/routines/focus.py index 27c8883a8a7..20d82d638bb 100644 --- a/scripts/Diffraction/isis_powder/routines/focus.py +++ b/scripts/Diffraction/isis_powder/routines/focus.py @@ -41,7 +41,12 @@ def _focus_one_ws(ws, run_number, instrument, perform_vanadium_norm): cropped_spectra = instrument._crop_banks_to_user_tof(calibrated_spectra) # Output - processed_nexus_files = instrument._output_focused_ws(cropped_spectra, run_details=run_details) + d_spacing_group, tof_group = instrument._output_focused_ws(cropped_spectra, run_details=run_details) + + import pydevd + pydevd.settrace('localhost', port=51205, stdoutToServer=True, stderrToServer=True) + common.keep_single_ws_unit(d_spacing_group=d_spacing_group,tof_group=tof_group, + unit_to_keep=instrument._get_unit_to_keep()) # Tidy workspaces from Mantid common.remove_intermediate_workspace(input_workspace) @@ -49,7 +54,7 @@ def _focus_one_ws(ws, run_number, instrument, perform_vanadium_norm): common.remove_intermediate_workspace(focused_ws) common.remove_intermediate_workspace(cropped_spectra) - return processed_nexus_files + return d_spacing_group def _apply_vanadium_corrections(instrument, run_number, input_workspace, perform_vanadium_norm): -- GitLab