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