From 65cc5105501267d83b29367acf4015f3a8adb5e7 Mon Sep 17 00:00:00 2001
From: David Fairbrother <DavidFair@users.noreply.github.com>
Date: Thu, 1 Dec 2016 11:56:36 +0000
Subject: [PATCH] Re #18108 Add processing mode POLARIS

---
 .../Diffraction/isis_powder/abstract_inst.py  |  4 +-
 .../isis_powder/pearl_routines/pearl_algs.py  |  2 +-
 .../pearl_routines/pearl_calibration_algs.py  |  4 +-
 scripts/Diffraction/isis_powder/polaris.py    |  6 +-
 .../polaris_routines/polaris_algs.py          | 10 ++-
 .../isis_powder/routines/calibrate.py         | 17 ++--
 .../isis_powder/routines/common.py            | 74 ++++++++++-------
 .../isis_powder/routines/common_enums.py      |  6 ++
 .../Diffraction/isis_powder/routines/focus.py | 80 ++++++++++++-------
 9 files changed, 126 insertions(+), 77 deletions(-)
 create mode 100644 scripts/Diffraction/isis_powder/routines/common_enums.py

diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py
index 49281d87a4f..764e8709c8a 100644
--- a/scripts/Diffraction/isis_powder/abstract_inst.py
+++ b/scripts/Diffraction/isis_powder/abstract_inst.py
@@ -71,8 +71,8 @@ class AbstractInst(object):
                                     output_van_file_name=output_file_name,
                                     absorb=do_absorb_corrections, gen_absorb=gen_absorb_correction)
 
-    def _focus(self, run_number, do_attenuation, do_van_normalisation):
-        return focus.focus(run_number=run_number, perform_attenuation=do_attenuation,
+    def _focus(self, run_number, input_batching, do_attenuation, do_van_normalisation):
+        return focus.focus(run_number=run_number, perform_attenuation=do_attenuation, input_batching=input_batching,
                            perform_vanadium_norm=do_van_normalisation, instrument=self)
 
     def _generate_out_file_paths(self, run_details, output_directory=None):
diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py
index 25ff773b51b..277123ce0a7 100644
--- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py
+++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py
@@ -14,7 +14,7 @@ def attenuate_workspace(attenuation_file_path, ws_to_correct):
     wc_attenuated = mantid.RebinToWorkspace(WorkspaceToRebin=wc_attenuated, WorkspaceToMatch=ws_to_correct,
                                             OutputWorkspace=wc_attenuated)
     pearl_attenuated_ws = mantid.Divide(LHSWorkspace=ws_to_correct, RHSWorkspace=wc_attenuated)
-    common.remove_intermediate_workspace(workspace_name=wc_attenuated)
+    common.remove_intermediate_workspace(workspaces=wc_attenuated)
     return pearl_attenuated_ws
 
 
diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_calibration_algs.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_calibration_algs.py
index 80713c22cb0..1ab806f0a37 100644
--- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_calibration_algs.py
+++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_calibration_algs.py
@@ -8,7 +8,7 @@ import isis_powder.routines.common as common
 
 
 def create_calibration(self, calibration_runs, offset_file_name, grouping_file_name):
-    input_ws = common.load_current_normalised_ws(run_number_string=calibration_runs, instrument=self)
+    input_ws = common.load_current_normalised_ws_list(run_number_string=calibration_runs, instrument=self)
     run_details = self.get_run_details(calibration_runs)
 
     if run_details.instrument_version == "new" or run_details.instrument_version == "new2":
@@ -49,7 +49,7 @@ def create_calibration(self, calibration_runs, offset_file_name, grouping_file_n
 
 def do_silicon_calibration(self, runs_to_process, cal_file_name, grouping_file_name):
     # TODO fix all of this as the script is too limited to be useful
-    create_si_ws = common.load_current_normalised_ws(run_number_string=runs_to_process, instrument=self)
+    create_si_ws = common.load_current_normalised_ws_list(run_number_string=runs_to_process, instrument=self)
     cycle_details = self._get_label_information(runs_to_process)
     instrument_version = cycle_details["instrument_version"]
 
diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py
index 7c8ee08e6fd..28987b7ab38 100644
--- a/scripts/Diffraction/isis_powder/polaris.py
+++ b/scripts/Diffraction/isis_powder/polaris.py
@@ -33,8 +33,8 @@ class Polaris(AbstractInst):
 
         self._ads_workaround = 0
 
-    def focus(self, run_number, do_attenuation=True, do_van_normalisation=True):
-        return self._focus(run_number=run_number, do_attenuation=do_attenuation,
+    def focus(self, run_number, input_mode, do_attenuation=True, do_van_normalisation=True):
+        return self._focus(run_number=run_number, input_batching=input_mode, do_attenuation=do_attenuation,
                            do_van_normalisation=do_van_normalisation)
 
     def create_calibration_vanadium(self, run_in_range, do_absorb_corrections=True, gen_absorb_correction=False):
@@ -74,7 +74,7 @@ class Polaris(AbstractInst):
         return self._number_of_banks
 
     def normalise_ws(self, ws_to_correct, run_details=None):
-        normalised_ws = mantid.NormaliseByCurrent(InputWorkspace=ws_to_correct)
+        normalised_ws = mantid.NormaliseByCurrent(InputWorkspace=ws_to_correct, OutputWorkspace=ws_to_correct)
         return normalised_ws
 
     def apply_solid_angle_efficiency_corr(self, ws_to_correct, run_details):
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
index 9be2b07e265..74e827da88b 100644
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
+++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
@@ -3,6 +3,7 @@ from __future__ import (absolute_import, division, print_function)
 import mantid.simpleapi as mantid
 import os
 import isis_powder.routines.common as common
+from isis_powder.routines.common_enums import InputBatchingEnum
 from isis_powder.polaris_routines import polaris_calib_parser
 from isis_powder.routines.RunDetails import RunDetails
 
@@ -59,8 +60,9 @@ def generate_absorb_corrections(ws_to_match):
 
 
 def generate_solid_angle_corrections(run_details, instrument):
-    vanadium_ws = common.load_current_normalised_ws(run_number_string=run_details.vanadium, instrument=instrument)
-    corrections = _calculate_solid_angle_efficiency_corrections(vanadium_ws)
+    vanadium_ws = common.load_current_normalised_ws_list(run_number_string=run_details.vanadium, instrument=instrument,
+                                                         input_batching=InputBatchingEnum.Summed)
+    corrections = _calculate_solid_angle_efficiency_corrections(vanadium_ws[0])
     mantid.SaveNexusProcessed(InputWorkspace=corrections, Filename=run_details.solid_angle_corr)
     common.remove_intermediate_workspace(vanadium_ws)
     return corrections
@@ -180,9 +182,9 @@ def _calculate_solid_angle_efficiency_corrections(vanadium_ws):
 
 def _generate_solid_angle_file_name(chopper_on, vanadium_run_string):
     if chopper_on:
-        return "SAC_chopperOn_" + vanadium_run_string + ".nxs"
+        return "SAC_" + vanadium_run_string + "_chopperOn"
     else:
-        return "SAC_chopperOff_" + vanadium_run_string + ".nxs"
+        return "SAC_" + vanadium_run_string + "_chopperOff"
 
 
 def _generate_splined_van_name(chopper_on, sac_applied, vanadium_run_string):
diff --git a/scripts/Diffraction/isis_powder/routines/calibrate.py b/scripts/Diffraction/isis_powder/routines/calibrate.py
index 8563d94fee4..dacda3d8788 100644
--- a/scripts/Diffraction/isis_powder/routines/calibrate.py
+++ b/scripts/Diffraction/isis_powder/routines/calibrate.py
@@ -5,20 +5,25 @@ import os
 import mantid.simpleapi as mantid
 
 import isis_powder.routines.common as common
+from isis_powder.routines.common_enums import InputBatchingEnum
 
 
 def create_van(instrument, van, empty, output_van_file_name, absorb, gen_absorb):
 
-    input_van_ws = common.load_current_normalised_ws(run_number_string=van, instrument=instrument)
+    # Always sum a range of inputs as its a vanadium run over multiple captures
+    input_van_ws_list = common.load_current_normalised_ws_list(run_number_string=van, instrument=instrument,
+                                                               input_batching=InputBatchingEnum.Summed)
+
+    input_van_ws = input_van_ws_list[0]  # As we asked for a summed ws there should only be one returned
+
     corrected_van_ws = common.subtract_sample_empty(ws_to_correct=input_van_ws, empty_sample_ws_string=empty,
                                                     instrument=instrument)
-
     common.remove_intermediate_workspace(input_van_ws)
 
     run_details = instrument.get_run_details(run_number=van)
 
-    # corrected_van_ws = instrument. pearl_van_calibration_tof_rebinning(vanadium_ws=corrected_van_ws,
-    #                                                                    tof_rebin_pass=1, return_units="TOF")
+    corrected_van_ws = instrument. pearl_van_calibration_tof_rebinning(vanadium_ws=corrected_van_ws,
+                                                                       tof_rebin_pass=1, return_units="TOF")
 
     corrected_van_ws = mantid.AlignDetectors(InputWorkspace=corrected_van_ws,
                                              CalibrationFile=run_details.calibration)
@@ -34,8 +39,8 @@ def create_van(instrument, van, empty, output_van_file_name, absorb, gen_absorb)
                                                    GroupingFileName=run_details.grouping)
 
     # Optional
-    #  focused_van_file = instrument. pearl_van_calibration_tof_rebinning(vanadium_ws=focused_van_file,
-    #                                                                     tof_rebin_pass=2, return_units="dSpacing")
+    focused_van_file = instrument. pearl_van_calibration_tof_rebinning(vanadium_ws=focused_van_file,
+                                                                       tof_rebin_pass=2, return_units="dSpacing")
 
     common.remove_intermediate_workspace(corrected_van_ws)
 
diff --git a/scripts/Diffraction/isis_powder/routines/common.py b/scripts/Diffraction/isis_powder/routines/common.py
index ceb8066c47b..db8a942a0bd 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
 
 # A small workaround to ensure when reading workspaces in a loop
 # the previous workspace does not got overridden
@@ -62,46 +62,56 @@ def get_monitor_ws(ws_to_process, run_number_string, instrument):
     return load_monitor_ws
 
 
-def load_current_normalised_ws(run_number_string, instrument):
+def load_current_normalised_ws_list(run_number_string, instrument, input_batching):
     run_information = instrument.get_run_details(run_number=run_number_string)
-    read_in_ws = _load_raw_files(run_number_string=run_number_string, instrument=instrument)
-    read_ws = instrument.normalise_ws(ws_to_correct=read_in_ws, run_details=run_information)
+    raw_ws_list = _load_raw_files(run_number_string=run_number_string, instrument=instrument)
+
+    if input_batching.lower() == InputBatchingEnum.Summed.lower():
+        summed_ws = _sum_ws_range(ws_list=raw_ws_list)
+        remove_intermediate_workspace(raw_ws_list)
+        raw_ws_list = [summed_ws]
 
-    output_name = "read_ws_output-" + str(g_ads_workaround["read_ws"])
-    g_ads_workaround["read_ws"] += 1
-    read_ws = mantid.RenameWorkspace(InputWorkspace=read_ws, OutputWorkspace=output_name)
+    normalised_ws_list = _normalise_workspaces(ws_list=raw_ws_list, run_information=run_information,
+                                               instrument=instrument)
 
-    remove_intermediate_workspace(read_in_ws)
-    return read_ws
+    return normalised_ws_list
 
 
-def remove_intermediate_workspace(workspace_name):
-    #if mantid.mtd.doesExist(workspace_name):
-    mantid.DeleteWorkspace(workspace_name)
-    #    del workspace_name  # Mark it as deleted so that more information is preserved on throw
-    #else:
-    #    raise RuntimeError("Tried to remove non-existent workspace: " + str(workspace_name))
+def remove_intermediate_workspace(workspaces):
+    if isinstance(workspaces, list):
+        for ws in workspaces:
+            mantid.DeleteWorkspace(ws)
+    else:
+        mantid.DeleteWorkspace(workspaces)
 
 
 def subtract_sample_empty(ws_to_correct, empty_sample_ws_string, instrument):
-    output = ws_to_correct
     if empty_sample_ws_string:
-        empty_sample = load_current_normalised_ws(run_number_string=empty_sample_ws_string, instrument=instrument)
-        corrected_ws = mantid.Minus(LHSWorkspace=ws_to_correct, RHSWorkspace=empty_sample)
+        empty_sample = load_current_normalised_ws_list(run_number_string=empty_sample_ws_string, instrument=instrument,
+                                                       input_batching=InputBatchingEnum.Summed)
+        mantid.Minus(LHSWorkspace=ws_to_correct, RHSWorkspace=empty_sample[0], OutputWorkspace=ws_to_correct)
         remove_intermediate_workspace(empty_sample)
-        output = corrected_ws
-    return output
+
+    return ws_to_correct
+
+
+def _normalise_workspaces(ws_list, instrument, run_information):
+    output_list = []
+    for ws in ws_list:
+        output_list.append(instrument.normalise_ws(ws_to_correct=ws, run_details=run_information))
+
+    return output_list
 
 
 def _check_load_range(list_of_runs_to_load):
-    MAXIMUM_RANGE_LEN = 20  # If more than this number of runs is entered probably wrong
+    MAXIMUM_RANGE_LEN = 1000  # If more than this number of runs is entered probably wrong
     if len(list_of_runs_to_load) > MAXIMUM_RANGE_LEN:
         raise ValueError("More than " + str(MAXIMUM_RANGE_LEN) + " runs were selected."
                          " Found " + str(len(list_of_runs_to_load)) + " Aborting.")
 
 
 def _create_blank_cal_file(calibration_runs, out_grouping_file_name, instrument, group_names):
-    input_ws = load_current_normalised_ws(calibration_runs, instrument)
+    input_ws = load_current_normalised_ws_list(calibration_runs, instrument, input_batching=InputBatchingEnum.Summed)
     calibration_d_spacing_ws = mantid.ConvertUnits(InputWorkspace=input_ws, Target="dSpacing")
     mantid.CreateCalFileByNames(InstrumentWorkspace=calibration_d_spacing_ws,
                                 GroupingFileName=out_grouping_file_name, GroupNames=group_names)
@@ -112,27 +122,29 @@ def _create_blank_cal_file(calibration_runs, out_grouping_file_name, instrument,
 def _load_raw_files(run_number_string, instrument):
     run_number_list = generate_run_numbers(run_number_string=run_number_string)
     instrument._old_api_pearl_setup_input_dirs(run_number=run_number_list[0])
-    load_raw_ws = _load_sum_file_range(run_number_list, instrument)
+    load_raw_ws = _load_list_of_files(run_number_list, instrument)
     return load_raw_ws
 
 
-def _load_sum_file_range(run_numbers_list, instrument):
+def _load_list_of_files(run_numbers_list, instrument):
     read_ws_list = []
-
     _check_load_range(list_of_runs_to_load=run_numbers_list)
 
     for run_number in run_numbers_list:
         file_name = instrument.generate_inst_file_name(run_number=run_number)
-        read_ws = mantid.Load(Filename=file_name, LoadLogFiles="0")
+        read_ws = mantid.Load(Filename=file_name)
         read_ws_list.append(mantid.RenameWorkspace(InputWorkspace=read_ws, OutputWorkspace=str(file_name)))
 
+    return read_ws_list
+
+
+def _sum_ws_range(ws_list):
     # Sum all workspaces
-    out_ws_name = "summed_range_load-" + str(g_ads_workaround["read_ws"])
-    g_ads_workaround["read_ws"] += 1
-    summed_ws = mantid.RenameWorkspace(InputWorkspace=read_ws_list[0], OutputWorkspace=out_ws_name)
-    for ws in read_ws_list[1:]:  # Skip first member
+    out_ws_name = "summed_" + ws_list[0].name() + '_' + ws_list[-1].name()
+
+    summed_ws = mantid.CloneWorkspace(InputWorkspace=ws_list[0], OutputWorkspace=out_ws_name)
+    for ws in ws_list[1:]:  # Skip the first element
         summed_ws = mantid.Plus(LHSWorkspace=summed_ws, RHSWorkspace=ws, OutputWorkspace=out_ws_name)
-        remove_intermediate_workspace(ws)
 
     return summed_ws
 
diff --git a/scripts/Diffraction/isis_powder/routines/common_enums.py b/scripts/Diffraction/isis_powder/routines/common_enums.py
new file mode 100644
index 00000000000..1261755dc4b
--- /dev/null
+++ b/scripts/Diffraction/isis_powder/routines/common_enums.py
@@ -0,0 +1,6 @@
+from __future__ import (absolute_import, division, print_function)
+
+
+class InputBatchingEnum(object):
+    Individual = "Individual"
+    Summed = "Summed"
diff --git a/scripts/Diffraction/isis_powder/routines/focus.py b/scripts/Diffraction/isis_powder/routines/focus.py
index 9bc8cd09846..deaff89ff80 100644
--- a/scripts/Diffraction/isis_powder/routines/focus.py
+++ b/scripts/Diffraction/isis_powder/routines/focus.py
@@ -3,13 +3,52 @@ from __future__ import (absolute_import, division, print_function)
 import mantid.simpleapi as mantid
 
 import isis_powder.routines.common as common
+from isis_powder.routines.common_enums import InputBatchingEnum
 import os
 
 
-def focus(run_number, instrument, perform_attenuation=True, perform_vanadium_norm=True):
-    # Read
+def focus(run_number, instrument, input_batching, perform_attenuation=True, perform_vanadium_norm=True):
+    if input_batching.lower() == InputBatchingEnum.Individual.lower():
+        _individual_run_focusing(input_batching, instrument, perform_attenuation, perform_vanadium_norm, run_number)
+    else:
+        _batched_run_focusing(input_batching, instrument, perform_attenuation, perform_vanadium_norm, run_number)
+
+
+def _batched_run_focusing(input_batching, instrument, perform_attenuation, perform_vanadium_norm, run_number):
+    import pydevd
+    pydevd.settrace('localhost', port=51205, stdoutToServer=True, stderrToServer=True)
+    read_ws_list = common.load_current_normalised_ws_list(run_number_string=run_number,
+                                                          input_batching=input_batching, instrument=instrument)
+    for ws in read_ws_list:
+        _focus_one_ws(ws=ws, run_number=run_number, instrument=instrument, perform_attenuation=perform_attenuation,
+                      perform_vanadium_norm=perform_vanadium_norm)
+        common.remove_intermediate_workspace(ws)
+
+
+def _divide_sample_by_vanadium(instrument, run_number, input_workspace, perform_vanadium_norm):
+    processed_spectra = []
+    run_details = instrument.get_run_details(run_number=run_number)
+    num_of_banks = instrument.get_num_of_banks(run_details.instrument_version)
+    split_ws = common.extract_bank_spectra(ws_to_split=input_workspace, num_banks=num_of_banks)
+
+    if perform_vanadium_norm:
+        vanadium_ws_list = mantid.LoadNexus(Filename=run_details.splined_vanadium)
+        for focus_spectra, van_spectra in zip(split_ws, vanadium_ws_list[1:]):
+            processed_spectra.append(
+                instrument.correct_sample_vanadium(focus_spectra=focus_spectra, vanadium_spectra=van_spectra))
+        common.remove_intermediate_workspace(vanadium_ws_list[0])
+
+    else:
+        for focus_spectra in split_ws:
+            processed_spectra.append(instrument.correct_sample_vanadium(focus_spectra=focus_spectra))
+
+    for ws in split_ws:
+        common.remove_intermediate_workspace(ws)
 
-    read_ws = common.load_current_normalised_ws(run_number_string=run_number, instrument=instrument)
+    return processed_spectra
+
+
+def _focus_one_ws(ws, run_number, instrument, perform_attenuation=True, perform_vanadium_norm=True):
     # input_workspace = instrument.pearl_focus_tof_rebinning(read_ws)  # Rebins for PEARL
     run_details = instrument.get_run_details(run_number=run_number)
 
@@ -20,7 +59,7 @@ def focus(run_number, instrument, perform_attenuation=True, perform_vanadium_nor
                          " \n\nHave you created a vanadium calibration with these settings yet?")
 
     # Compensate for empty sample if specified
-    input_workspace = common.subtract_sample_empty(ws_to_correct=read_ws, instrument=instrument,
+    input_workspace = common.subtract_sample_empty(ws_to_correct=ws, instrument=instrument,
                                                    empty_sample_ws_string=run_details.sample_empty)
 
     # Align / Focus
@@ -47,38 +86,23 @@ def focus(run_number, instrument, perform_attenuation=True, perform_vanadium_nor
                                                          attenuate=perform_attenuation)
 
     # Tidy
-    common.remove_intermediate_workspace(read_ws)
     common.remove_intermediate_workspace(input_workspace)
     common.remove_intermediate_workspace(focused_ws)
-    for ws in calibrated_spectra:
-        common.remove_intermediate_workspace(ws)
-        pass
+    common.remove_intermediate_workspace(calibrated_spectra)
 
     return processed_nexus_files
 
 
-def _divide_sample_by_vanadium(instrument, run_number, input_workspace, perform_vanadium_norm):
-    processed_spectra = []
-    run_details = instrument.get_run_details(run_number=run_number)
-    num_of_banks = instrument.get_num_of_banks(run_details.instrument_version)
-    split_ws = common.extract_bank_spectra(ws_to_split=input_workspace, num_banks=num_of_banks)
-
-    if perform_vanadium_norm:
-        vanadium_ws_list = mantid.LoadNexus(Filename=run_details.splined_vanadium)
-        for focus_spectra, van_spectra in zip(split_ws, vanadium_ws_list[1:]):
-            processed_spectra.append(
-                instrument.correct_sample_vanadium(focus_spectra=focus_spectra, vanadium_spectra=van_spectra))
-        common.remove_intermediate_workspace(vanadium_ws_list[0])
-
-    else:
-        for focus_spectra in split_ws:
-            processed_spectra.append(instrument.correct_sample_vanadium(focus_spectra=focus_spectra))
-
-    for ws in split_ws:
+def _individual_run_focusing(input_batching, instrument, perform_attenuation, perform_vanadium_norm, run_number):
+    # Load and process one by one
+    run_numbers = common.generate_run_numbers(run_number_string=run_number)
+    for run in run_numbers:
+        ws = common.load_current_normalised_ws_list(run_number_string=run, instrument=instrument,
+                                                    input_batching=input_batching)
+        _focus_one_ws(ws=ws[0], run_number=run, instrument=instrument, perform_attenuation=perform_attenuation,
+                      perform_vanadium_norm=perform_vanadium_norm)
         common.remove_intermediate_workspace(ws)
 
-    return processed_spectra
-
 
 def _apply_binning_to_spectra(spectra_list, binning_list):
     if not binning_list:
-- 
GitLab