diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py index 0d3718a2a0464d3b744b04daf33d966f4c99a82a..30519142326f307c2c96effca300c95471e0e1a8 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 b8a828d0e1f9a5b8e9687a179035d911261157a1..744ec553489ea621a8826199c6660d49ad897015 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 fe71e429191e87f4f8acfea5f41026f6022f662f..29041d4bd508bf50f4465d57c4dee536e0bb1098 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 a2cf089cb359fe3354a437c02fc5cb2f9eaf361c..5fab9608afc8fff15ecc40b484d44eb1fc3887c5 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 c4de5b801c907be1d0e686b7471f4a370a2a7949..18ea4fbb6d0d9d93ff0ec319a4fc54a0ad82a2cb 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 443acce6389d16b0049ffa08452027609dbec742..0070f1215301236244e46bfd6d6c23b7b02dd155 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 a17717929843e9b60d0b4613deca9de9ac5cf77d..d0b64e54e99011dfc482b4127141822019a575c7 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 1261755dc4bc684931f4806d20273f7d6366dd3a..660175376b11b4a9b4b8601cc039a0135e0fe57c 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 27c8883a8a76bf0842a61b08a5e662284f9bdbf7..20d82d638bb2c3e07705a0da933a5c3d7969cd00 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):