From a221d192a258f6654837e6008c294a9029492d30 Mon Sep 17 00:00:00 2001
From: David Fairbrother <DavidFair@users.noreply.github.com>
Date: Fri, 17 Feb 2017 17:48:13 +0000
Subject: [PATCH] Re #18643 Implement output for GEM Calibration

---
 .../Diffraction/isis_powder/abstract_inst.py  | 11 +++-
 scripts/Diffraction/isis_powder/gem.py        |  2 +-
 .../isis_powder/gem_routines/gem_algs.py      |  5 ++
 .../isis_powder/pearl_routines/pearl_algs.py  | 16 ++----
 scripts/Diffraction/isis_powder/polaris.py    | 19 +------
 .../polaris_routines/polaris_algs.py          | 36 ++-----------
 .../polaris_routines/polaris_output.py        | 30 -----------
 .../isis_powder/routines/calibrate.py         |  1 +
 .../isis_powder/routines/common.py            | 17 +++++++
 .../isis_powder/routines/common_output.py     | 51 +++++++++++++++++++
 10 files changed, 95 insertions(+), 93 deletions(-)
 delete mode 100644 scripts/Diffraction/isis_powder/polaris_routines/polaris_output.py
 create mode 100644 scripts/Diffraction/isis_powder/routines/common_output.py

diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py
index daa33153ab7..0d3718a2a04 100644
--- a/scripts/Diffraction/isis_powder/abstract_inst.py
+++ b/scripts/Diffraction/isis_powder/abstract_inst.py
@@ -1,7 +1,7 @@
 from __future__ import (absolute_import, division, print_function)
 
 import os
-from isis_powder.routines import calibrate, focus, common, common_enums
+from isis_powder.routines import calibrate, focus, common, common_enums, common_output
 
 
 # This class provides common hooks for instruments to override
@@ -193,7 +193,14 @@ class AbstractInst(object):
         :param output_mode: Optional - Sets additional saving/grouping behaviour depending on the instrument
         :return: d-spacing group of the processed output workspaces
         """
-        return None
+        d_spacing_group, tof_group = common_output.split_into_tof_d_spacing_groups(run_details=run_details,
+                                                                                   processed_spectra=processed_spectra)
+        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",
+                                        run_number_string=run_details.user_input_run_number)
+        return d_spacing_group
 
     # Steps applicable to all instruments
 
diff --git a/scripts/Diffraction/isis_powder/gem.py b/scripts/Diffraction/isis_powder/gem.py
index 773c575c9fc..c7cba00a89e 100644
--- a/scripts/Diffraction/isis_powder/gem.py
+++ b/scripts/Diffraction/isis_powder/gem.py
@@ -42,7 +42,7 @@ class Gem(AbstractInst):
         raise NotImplementedError()
 
     def _generate_output_file_name(self, run_number_string):
-        raise NotImplementedError()
+        return self._generate_input_file_name(run_number_string)
 
     @staticmethod
     def _generate_input_file_name(run_number):
diff --git a/scripts/Diffraction/isis_powder/gem_routines/gem_algs.py b/scripts/Diffraction/isis_powder/gem_routines/gem_algs.py
index b6935fc26bc..f5001cca8c7 100644
--- a/scripts/Diffraction/isis_powder/gem_routines/gem_algs.py
+++ b/scripts/Diffraction/isis_powder/gem_routines/gem_algs.py
@@ -21,7 +21,10 @@ def get_run_details(run_number_string, inst_settings):
     calibration_folder = os.path.normpath(os.path.expanduser(inst_settings.calibration_dir))
     label_calibration_folder = os.path.join(calibration_folder, label)
 
+    splined_vanadium_name = common.generate_splined_name(vanadium_runs, offset_file_name)
+
     offset_file_path = os.path.join(label_calibration_folder, offset_file_name)
+    splined_file_path = os.path.join(label_calibration_folder, splined_vanadium_name)
 
     # TODO generate splined vanadium name from common
 
@@ -34,4 +37,6 @@ def get_run_details(run_number_string, inst_settings):
     run_details.grouping_file_path = offset_file_path
     run_details.offset_file_path = offset_file_path
 
+    run_details.splined_vanadium_file_path = splined_file_path
+
     return run_details
diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py
index 021f8861574..770159e86d2 100644
--- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py
+++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py
@@ -79,10 +79,11 @@ def get_run_details(run_number_string, inst_settings):
     label = common.cal_map_dictionary_key_helper(mapping_dict, "label")
     vanadium_run_numbers = common.cal_map_dictionary_key_helper(mapping_dict, "vanadium_run_numbers")
 
-    splined_vanadium_name = _generate_splined_van_name(absorb_on=inst_settings.absorb_corrections,
-                                                       vanadium_run_string=vanadium_run_numbers,
-                                                       long_mode_on=inst_settings.long_mode,
-                                                       tt_mode=inst_settings.tt_mode)
+    # Use generate out name to provide the unique fingerprint for this file
+    splined_vanadium_name = common.generate_splined_name(
+        generate_out_name(run_number_string=vanadium_run_numbers,
+                          absorb_on=inst_settings.absorb_corrections,
+                          long_mode_on=inst_settings.long_mode, tt_mode=inst_settings.tt_mode))
 
     calibration_dir = inst_settings.calibration_dir
     cycle_calibration_dir = os.path.join(calibration_dir, label)
@@ -158,10 +159,3 @@ def strip_bragg_peaks(ws_list_to_correct):
                                                    OutputWorkspace=ws_list_to_correct[13], FWHM=60, Tolerance=10)
 
     return ws_list_to_correct
-
-
-def _generate_splined_van_name(vanadium_run_string, absorb_on, long_mode_on, tt_mode):
-    generated_out_name = generate_out_name(run_number_string=vanadium_run_string, absorb_on=absorb_on,
-                                           long_mode_on=long_mode_on, tt_mode=tt_mode)
-    output_string = "SplinedVan_" + generated_out_name + ".nxs"
-    return output_string
diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py
index 833cfccc071..32352f86eba 100644
--- a/scripts/Diffraction/isis_powder/polaris.py
+++ b/scripts/Diffraction/isis_powder/polaris.py
@@ -2,12 +2,9 @@ from __future__ import (absolute_import, division, print_function)
 
 import os
 
-import mantid.simpleapi as mantid
-
-import isis_powder.routines.common as common
-from isis_powder.routines import yaml_parser, InstrumentSettings
+from isis_powder.routines import common, common_output, InstrumentSettings, yaml_parser
 from isis_powder.abstract_inst import AbstractInst
-from isis_powder.polaris_routines import polaris_advanced_config, polaris_algs, polaris_output, polaris_param_mapping
+from isis_powder.polaris_routines import polaris_advanced_config, polaris_algs, polaris_param_mapping
 
 
 class Polaris(AbstractInst):
@@ -41,7 +38,6 @@ class Polaris(AbstractInst):
                                      do_absorb_corrections=self._inst_settings.do_absorb_corrections)
 
     # Overrides
-
     def _apply_absorb_corrections(self, run_details, van_ws):
         return polaris_algs.calculate_absorb_corrections(ws_to_correct=van_ws,
                                                          multiple_scattering=self._inst_settings.multiple_scattering)
@@ -117,14 +113,3 @@ class Polaris(AbstractInst):
                                                             spline_number=spline_coeff,
                                                             mask_path=masking_file_path)
         return output
-
-    def _output_focused_ws(self, processed_spectra, run_details, output_mode=None):
-        d_spacing_group, tof_group = polaris_algs.split_into_tof_d_spacing_groups(run_details=run_details,
-                                                                                  processed_spectra=processed_spectra)
-        output_paths = self._generate_out_file_paths(run_details=run_details)
-
-        polaris_output.save_polaris_focused_data(d_spacing_group=d_spacing_group, tof_group=tof_group,
-                                                 output_paths=output_paths,
-                                                 run_number_string=run_details.user_input_run_number)
-        return d_spacing_group
-
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
index e410ec51f07..77824e200ba 100644
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
+++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
@@ -47,10 +47,11 @@ def get_run_details(run_number_string, inst_settings):
 
     in_calib_dir = os.path.join(inst_settings.calibration_dir, label)
     offsets_file_full_path = os.path.join(in_calib_dir, offset_file_name)
+
     # Generate the name of the splined file we will either be loading or saving
-    splined_vanadium_name = _generate_splined_van_filename(chopper_on=inst_settings.chopper_on,
-                                                           vanadium_run_string=vanadium_runs,
-                                                           offset_file_name=offset_file_name)
+    chopper_status = "On" if inst_settings.chopper_on else "Off"
+    splined_vanadium_name = common.generate_splined_name(vanadium_runs, chopper_status, offset_file_name)
+
     splined_vanadium = os.path.join(in_calib_dir, splined_vanadium_name)
 
     run_details = RunDetails(run_number=run_number)
@@ -66,27 +67,6 @@ def get_run_details(run_number_string, inst_settings):
     return run_details
 
 
-def split_into_tof_d_spacing_groups(run_details, processed_spectra):
-    d_spacing_output = []
-    tof_output = []
-    run_number = str(run_details.user_input_run_number)
-    for name_index, ws in enumerate(processed_spectra):
-        d_spacing_out_name = run_number + "-ResultD-" + str(name_index + 1)
-        tof_out_name = run_number + "-ResultTOF-" + str(name_index + 1)
-
-        d_spacing_output.append(mantid.ConvertUnits(InputWorkspace=ws, OutputWorkspace=d_spacing_out_name,
-                                                    Target="dSpacing"))
-        tof_output.append(mantid.ConvertUnits(InputWorkspace=ws, OutputWorkspace=tof_out_name, Target="TOF"))
-
-    # Group the outputs
-    d_spacing_group_name = run_number + "-Results-D-Grp"
-    d_spacing_group = mantid.GroupWorkspaces(InputWorkspaces=d_spacing_output, OutputWorkspace=d_spacing_group_name)
-    tof_group_name = run_number + "-Results-TOF-Grp"
-    tof_group = mantid.GroupWorkspaces(InputWorkspaces=tof_output, OutputWorkspace=tof_group_name)
-
-    return d_spacing_group, tof_group
-
-
 def process_vanadium_for_focusing(bank_spectra, mask_path, spline_number):
     bragg_masking_list = _read_masking_file(mask_path)
     masked_workspace_list = _apply_bragg_peaks_masking(bank_spectra, mask_list=bragg_masking_list)
@@ -108,14 +88,6 @@ def _apply_bragg_peaks_masking(workspaces_to_mask, mask_list):
     return output_workspaces
 
 
-def _generate_splined_van_filename(chopper_on, vanadium_run_string, offset_file_name):
-    output_string = "SplinedVan_" + str(vanadium_run_string) + "_chopper"
-    output_string += "On" if chopper_on else "Off"
-    output_string += '_' + offset_file_name
-    output_string += ".nxs"
-    return output_string
-
-
 def _read_masking_file(masking_file_path):
     all_banks_masking_list = []
     bank_masking_list = []
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_output.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_output.py
deleted file mode 100644
index bb9997c1757..00000000000
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_output.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from __future__ import (absolute_import, division, print_function)
-
-import mantid.simpleapi as mantid
-import os
-
-
-def save_polaris_focused_data(d_spacing_group, tof_group, output_paths, run_number_string):
-    mantid.SaveGSS(InputWorkspace=tof_group, Filename=output_paths["gss_filename"], SplitFiles=False, Append=False)
-    mantid.SaveNexusProcessed(InputWorkspace=tof_group, Filename=output_paths["nxs_filename"], Append=False)
-
-    dat_folder_name = "dat_files"
-    dat_file_destination = os.path.join(output_paths["output_folder"], dat_folder_name)
-    if not os.path.exists(dat_file_destination):
-        os.makedirs(dat_file_destination)
-
-    _save_xye(ws_group=d_spacing_group, ws_units="d", run_number=run_number_string,
-              output_folder=dat_file_destination)
-    _save_xye(ws_group=tof_group, ws_units="TOF", run_number=run_number_string,
-              output_folder=dat_file_destination)
-
-
-def _save_xye(ws_group, ws_units, run_number, output_folder):
-    bank_index = 1
-    prefix_filename = "POL" + str(run_number)
-    for ws in ws_group:
-        outfile_name = prefix_filename + "-b_" + str(bank_index) + "-" + ws_units + ".dat"
-        bank_index += 1
-        full_file_path = os.path.join(output_folder, outfile_name)
-
-        mantid.SaveFocusedXYE(InputWorkspace=ws, Filename=full_file_path, SplitFiles=False, IncludeHeader=False)
diff --git a/scripts/Diffraction/isis_powder/routines/calibrate.py b/scripts/Diffraction/isis_powder/routines/calibrate.py
index e0e00e2bb66..58e5d913b93 100644
--- a/scripts/Diffraction/isis_powder/routines/calibrate.py
+++ b/scripts/Diffraction/isis_powder/routines/calibrate.py
@@ -52,6 +52,7 @@ def _create_vanadium_splines(focused_spectra, instrument, run_details):
     for ws in splined_ws_list:
         mantid.SaveNexus(Filename=out_spline_van_file_path, InputWorkspace=ws, Append=append)
         append = True
+    # Group for user convenience
     mantid.GroupWorkspaces(InputWorkspaces=splined_ws_list, OutputWorkspace="Van_spline_data")
 
 
diff --git a/scripts/Diffraction/isis_powder/routines/common.py b/scripts/Diffraction/isis_powder/routines/common.py
index 939b5dba995..7d951e2c1fd 100644
--- a/scripts/Diffraction/isis_powder/routines/common.py
+++ b/scripts/Diffraction/isis_powder/routines/common.py
@@ -134,6 +134,23 @@ def generate_run_numbers(run_number_string):
     return run_list
 
 
+def generate_splined_name(vanadium_string, *args):
+    """
+    Generates a unique splined vanadium name which encapsulates
+    any properties passed into this method so that the vanadium
+    can be later loaded.
+    :param vanadium_string: The name of this vanadium run
+    :param args: Any identifying properties to append to the name
+    :return: The splined vanadium name
+    """
+    out_name = "VanSplined" + '_' + str(vanadium_string)
+    for value in args:
+        out_name += '_' + str(value)
+
+    out_name += ".nxs"
+    return out_name
+
+
 def get_first_run_number(run_number_string):
     """
     Takes a run number string and returns the first user specified run from that string
diff --git a/scripts/Diffraction/isis_powder/routines/common_output.py b/scripts/Diffraction/isis_powder/routines/common_output.py
new file mode 100644
index 00000000000..e1870604f7a
--- /dev/null
+++ b/scripts/Diffraction/isis_powder/routines/common_output.py
@@ -0,0 +1,51 @@
+from __future__ import (absolute_import, division, print_function)
+
+import mantid.simpleapi as mantid
+import os
+
+
+def split_into_tof_d_spacing_groups(run_details, processed_spectra):
+    d_spacing_output = []
+    tof_output = []
+    run_number = str(run_details.user_input_run_number)
+    for name_index, ws in enumerate(processed_spectra):
+        d_spacing_out_name = run_number + "-ResultD-" + str(name_index + 1)
+        tof_out_name = run_number + "-ResultTOF-" + str(name_index + 1)
+
+        d_spacing_output.append(mantid.ConvertUnits(InputWorkspace=ws, OutputWorkspace=d_spacing_out_name,
+                                                    Target="dSpacing"))
+        tof_output.append(mantid.ConvertUnits(InputWorkspace=ws, OutputWorkspace=tof_out_name, Target="TOF"))
+
+    # Group the outputs
+    d_spacing_group_name = run_number + "-Results-D-Grp"
+    d_spacing_group = mantid.GroupWorkspaces(InputWorkspaces=d_spacing_output, OutputWorkspace=d_spacing_group_name)
+    tof_group_name = run_number + "-Results-TOF-Grp"
+    tof_group = mantid.GroupWorkspaces(InputWorkspaces=tof_output, OutputWorkspace=tof_group_name)
+
+    return d_spacing_group, tof_group
+
+
+def save_focused_data(d_spacing_group, tof_group, output_paths, run_number_string, inst_prefix):
+    mantid.SaveGSS(InputWorkspace=tof_group, Filename=output_paths["gss_filename"], SplitFiles=False, Append=False)
+    mantid.SaveNexusProcessed(InputWorkspace=tof_group, Filename=output_paths["nxs_filename"], Append=False)
+
+    dat_folder_name = "dat_files"
+    dat_file_destination = os.path.join(output_paths["output_folder"], dat_folder_name)
+    if not os.path.exists(dat_file_destination):
+        os.makedirs(dat_file_destination)
+
+    _save_xye(ws_group=d_spacing_group, ws_units="d", run_number=run_number_string,
+              output_folder=dat_file_destination, inst_prefix=inst_prefix)
+    _save_xye(ws_group=tof_group, ws_units="TOF", run_number=run_number_string,
+              output_folder=dat_file_destination, inst_prefix=inst_prefix)
+
+
+def _save_xye(ws_group, ws_units, run_number, output_folder, inst_prefix):
+    bank_index = 1
+    prefix_filename = str(inst_prefix) + str(run_number)
+    for ws in ws_group:
+        outfile_name = prefix_filename + "-b_" + str(bank_index) + "-" + ws_units + ".dat"
+        bank_index += 1
+        full_file_path = os.path.join(output_folder, outfile_name)
+
+        mantid.SaveFocusedXYE(InputWorkspace=ws, Filename=full_file_path, SplitFiles=False, IncludeHeader=False)
-- 
GitLab