From 307b02799ba59bb7dd8b5bd3b80f65600f67ff36 Mon Sep 17 00:00:00 2001
From: David Fairbrother <DavidFair@users.noreply.github.com>
Date: Tue, 6 Dec 2016 11:26:07 +0000
Subject: [PATCH] Re #18108 Reworked outputs from vanadium calibration

---
 .../tests/analysis/ISIS_PowderPearlTest.py    |   2 +-
 ...SIS_PowderPEARL95634-95647_Van_Cal.nxs.md5 |   2 +-
 .../Diffraction/isis_powder/abstract_inst.py  |   8 +-
 scripts/Diffraction/isis_powder/pearl.py      |  15 ++-
 .../isis_powder/pearl_routines/pearl_algs.py  |  22 ----
 .../pearl_routines/pearl_output.py            |  18 +--
 .../pearl_routines/pearl_spline.py            | 106 +++++-------------
 scripts/Diffraction/isis_powder/polaris.py    |  21 ++--
 .../polaris_routines/polaris_algs.py          |   8 +-
 .../isis_powder/routines/calibrate.py         |  43 +++----
 .../isis_powder/routines/common.py            |  32 ++++--
 .../Diffraction/isis_powder/routines/focus.py |   2 +-
 12 files changed, 111 insertions(+), 168 deletions(-)

diff --git a/Testing/SystemTests/tests/analysis/ISIS_PowderPearlTest.py b/Testing/SystemTests/tests/analysis/ISIS_PowderPearlTest.py
index 6741ea52e66..e5fb7982302 100644
--- a/Testing/SystemTests/tests/analysis/ISIS_PowderPearlTest.py
+++ b/Testing/SystemTests/tests/analysis/ISIS_PowderPearlTest.py
@@ -10,8 +10,8 @@ from isis_powder.pearl import Pearl
 
 DIRS = config['datasearch.directories'].split(';')
 
-class VanadiumCalibrationTest(stresstesting.MantidStressTest):
 
+class VanadiumCalibrationTest(stresstesting.MantidStressTest):
     calibration_results = None
     existing_config = config['datasearch.directories']
 
diff --git a/Testing/SystemTests/tests/analysis/reference/ISIS_PowderPEARL95634-95647_Van_Cal.nxs.md5 b/Testing/SystemTests/tests/analysis/reference/ISIS_PowderPEARL95634-95647_Van_Cal.nxs.md5
index d5eb27e8f3a..42890acecb3 100644
--- a/Testing/SystemTests/tests/analysis/reference/ISIS_PowderPEARL95634-95647_Van_Cal.nxs.md5
+++ b/Testing/SystemTests/tests/analysis/reference/ISIS_PowderPEARL95634-95647_Van_Cal.nxs.md5
@@ -1 +1 @@
-0fd97ee147b3f8f8ca461e7dbcb65020
+3bca903e6dc91cd658c01efc75e5881a
diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py
index e5de6e83581..b9affec5cf8 100644
--- a/scripts/Diffraction/isis_powder/abstract_inst.py
+++ b/scripts/Diffraction/isis_powder/abstract_inst.py
@@ -65,10 +65,9 @@ class AbstractInst(object):
     # These are to be called from either concrete instruments or common not by users
     # Common steps to all instruments
 
-    def _create_calibration_vanadium(self, vanadium_runs, empty_runs, output_file_name=None,
+    def _create_calibration_vanadium(self, vanadium_runs, empty_runs,
                                      do_absorb_corrections=True, gen_absorb_correction=False):
         return calibrate.create_van(instrument=self, van=vanadium_runs, empty=empty_runs,
-                                    output_van_file_name=output_file_name,
                                     absorb=do_absorb_corrections, gen_absorb=gen_absorb_correction)
 
     def _focus(self, run_number, input_batching, do_attenuation, do_van_normalisation):
@@ -159,9 +158,12 @@ class AbstractInst(object):
     def pearl_rebin_to_workspace(self, ws_to_rebin, ws_to_match):
         return ws_to_rebin
 
-    def spline_vanadium_ws(self, focused_vanadium_ws, instrument_version=''):
+    def spline_vanadium_ws(self, focused_vanadium_ws):
         return None
 
+    def extract_and_crop_spectra(self, focused_ws):
+        raise NotImplemented("Extract spectra and crop in tof not implemented")
+
 
 # ----- Private Implementation ----- #
 # These should only be called by the abstract instrument class
diff --git a/scripts/Diffraction/isis_powder/pearl.py b/scripts/Diffraction/isis_powder/pearl.py
index 36c34a665c9..4a90c2b5f6a 100644
--- a/scripts/Diffraction/isis_powder/pearl.py
+++ b/scripts/Diffraction/isis_powder/pearl.py
@@ -47,7 +47,6 @@ class Pearl(AbstractInst):
         self._spline_coeff = num_of_splines
 
         return self._create_calibration_vanadium(vanadium_runs=vanadium_runs, empty_runs=empty_runs,
-                                                 output_file_name=output_file_name,
                                                  do_absorb_corrections=do_absorb_corrections,
                                                  gen_absorb_correction=gen_absorb_correction)
 
@@ -137,11 +136,10 @@ class Pearl(AbstractInst):
     def get_monitor_spectra_index(self, run_number):
         return get_monitor_spectra(run_number=run_number, focus_mode=self._focus_mode)
 
-    def spline_vanadium_ws(self, focused_vanadium_ws, instrument_version=''):
+    def spline_vanadium_ws(self, focused_vanadium_spectra):
         # TODO move spline number into the class
-        return pearl_spline.spline_vanadium_for_focusing(focused_vanadium_ws=focused_vanadium_ws,
-                                                         spline_number=self._spline_coeff,
-                                                         instrument_version=instrument_version)
+        return pearl_spline.spline_vanadium_for_focusing(focused_vanadium_spectra=focused_vanadium_spectra,
+                                                         num_splines=self._spline_coeff)
 
     def pearl_focus_tof_rebinning(self, workspace):
         out_name = workspace.name() + "_rebinned"
@@ -161,10 +159,15 @@ class Pearl(AbstractInst):
                                                            perform_attenuation=attenuate)
 
     def vanadium_calibration_rebinning(self, vanadium_ws):
-        out_ws = pearl_algs.apply_tof_rebinning(ws_to_rebin=vanadium_ws, tof_params=self._create_van_tof_binning)
+        out_ws = common.crop_in_tof(ws_to_rebin=vanadium_ws, x_min=1500, x_max=19900, is_mixed_binning=True)
 
         return out_ws
 
+    def extract_and_crop_spectra(self, focused_ws):
+        ws_spectra = common.extract_ws_spectra(ws_to_split=focused_ws)
+        ws_spectra = common.crop_in_tof(ws_to_rebin=ws_spectra, x_min=1500, x_max=19900)
+        return ws_spectra
+
     def crop_data_tail(self, ws_to_crop):
         # TODO move this param into advanced config
         out_ws = mantid.CropWorkspace(XMax="19900", InputWorkspace=ws_to_crop, OutputWorkspace=ws_to_crop)
diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py
index c604a9c6d56..052f6608395 100644
--- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py
+++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py
@@ -18,14 +18,6 @@ def attenuate_workspace(attenuation_file_path, ws_to_correct):
     return pearl_attenuated_ws
 
 
-def apply_tof_rebinning(ws_to_rebin, tof_params):
-    previous_units = ws_to_rebin.getAxis(0).getUnit().unitID()
-    ws_to_rebin = mantid.ConvertUnits(InputWorkspace=ws_to_rebin, Target="TOF", OutputWorkspace=ws_to_rebin)
-    rebinned_ws = mantid.Rebin(InputWorkspace=ws_to_rebin, Params=tof_params, OutputWorkspace=ws_to_rebin)
-    rebinned_ws = mantid.ConvertUnits(InputWorkspace=rebinned_ws, Target=previous_units, OutputWorkspace=rebinned_ws)
-    return rebinned_ws
-
-
 def generate_vanadium_absorb_corrections(van_ws):
     raise NotImplementedError("Generating absorption corrections needs to be implemented correctly")
 
@@ -44,20 +36,6 @@ def generate_vanadium_absorb_corrections(van_ws):
     return absorb_ws
 
 
-def get_instrument_ranges(instrument_version):
-    # TODO rename this to get number of banks/save range
-    if instrument_version == "new" or instrument_version == "old":  # New and old have identical ranges
-        num_of_banks = 12
-        save_range = 3
-    elif instrument_version == "new2":
-        num_of_banks = 14
-        save_range = 5
-    else:
-        raise ValueError("Instrument version unknown")
-
-    return num_of_banks, save_range
-
-
 def get_run_details(tt_mode, run_number_string, label, calibration_dir):
     calibration_file, grouping_file, van_absorb, van_file = \
         pearl_calib_factory.get_calibration_filename(cycle=label, tt_mode=tt_mode)
diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_output.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_output.py
index 6566318d5eb..94aa9810b25 100644
--- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_output.py
+++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_output.py
@@ -9,21 +9,16 @@ import isis_powder.routines.common as common
 
 def generate_and_save_focus_output(instrument, processed_spectra, run_details, perform_attenuation, focus_mode=None):
     output_file_paths = instrument._generate_out_file_paths(run_details=run_details)
-    save_range = instrument.get_save_range(run_details.instrument_version)
 
     if focus_mode == "all":
         processed_nexus_files = _focus_mode_all(output_file_paths, processed_spectra)
-
     elif focus_mode == "groups":
-        processed_nexus_files = _focus_mode_groups(run_details.instrument_version, output_file_paths, save_range,
+        processed_nexus_files = _focus_mode_groups(run_details.instrument_version, output_file_paths,
                                                    processed_spectra)
-
     elif focus_mode == "trans":
         processed_nexus_files = _focus_mode_trans(output_file_paths, perform_attenuation, instrument, processed_spectra)
-
     elif focus_mode == "mods":
         processed_nexus_files = _focus_mode_mods(output_file_paths, processed_spectra)
-
     else:
         raise ValueError("Focus mode unknown")
 
@@ -89,7 +84,7 @@ def _focus_mode_trans(output_file_paths, atten, instrument, calibrated_spectra):
     return output_list
 
 
-def _focus_mode_groups(instrument_version, output_file_paths, save_range, calibrated_spectra):
+def _focus_mode_groups(instrument_version, output_file_paths, calibrated_spectra):
     output_list = []
     to_save = _sum_groups_of_three_ws(calibrated_spectra, output_file_paths)
 
@@ -115,6 +110,7 @@ def _focus_mode_groups(instrument_version, output_file_paths, save_range, calibr
         append = True
         index += 1
 
+    save_range = 5
     for i in range(0, save_range):
         monitor_ws_name = output_file_paths["output_name"] + "_mod" + str(i + 10)
 
@@ -134,10 +130,6 @@ def _focus_mode_all(output_file_paths, processed_spectra):
     summed_spectra_name = output_file_paths["output_name"] + "_mods1-9"
     summed_spectra = mantid.MergeRuns(InputWorkspaces=processed_spectra[:9], OutputWorkspace=summed_spectra_name)
 
-    #summed_spectra = mantid.CloneWorkspace(InputWorkspace=processed_spectra[0], OutputWorkspace=summed_spectra_name)
-    #for ws in processed_spectra[1:9]:
-    #    summed_spectra = mantid.Plus(LHSWorkspace=summed_spectra, RHSWorkspace=ws, OutputWorkspace=summed_spectra_name)
-
     summed_spectra = mantid.Scale(InputWorkspace=summed_spectra, Factor=0.111111111111111,
                                   OutputWorkspace=summed_spectra_name)
     summed_spectra = mantid.ConvertUnits(InputWorkspace=summed_spectra, Target="TOF",
@@ -188,6 +180,6 @@ def _sum_groups_of_three_ws(calibrated_spectra, output_file_names):
         workspace_names = output_file_names["output_name"] + "_mod" + mod_first_number + '-' + mod_last_number
         output_list.append(mantid.Scale(InputWorkspace=workspace_list[outer_loop_count],
                                         OutputWorkspace=workspace_names, Factor=0.333333333333))
-    for ws in workspace_list:
-        common.remove_intermediate_workspace(ws)
+
+    common.remove_intermediate_workspace(workspace_list)
     return output_list
diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_spline.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_spline.py
index dd2ca712329..b8ecc0edb16 100644
--- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_spline.py
+++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_spline.py
@@ -5,83 +5,39 @@ import isis_powder.routines.common as common
 from isis_powder.pearl_routines import pearl_algs
 
 
-def spline_vanadium_for_focusing(focused_vanadium_ws, spline_number, instrument_version):
-    if instrument_version == "new2" or instrument_version == "new":
-        out_list = _van_spline_new_instruments(in_workspace=focused_vanadium_ws, num_splines=spline_number,
-                                               instrument_version=instrument_version)
-    elif instrument_version == "old":
-        out_list = _van_spline_old_instrument(in_workspace=focused_vanadium_ws)
-    else:
-        raise ValueError("Spline Background - PEARL: Instrument version unknown")
-
-    return out_list
-
-
-def _perform_spline_range(num_of_banks, num_splines, stripped_ws):
-    splined_ws_list = []
-    for i in range(0, num_of_banks):
-        out_ws_name = "spline" + str(i + 1)
-        splined_ws_list.append(mantid.SplineBackground(InputWorkspace=stripped_ws, OutputWorkspace=out_ws_name,
-                                                       WorkspaceIndex=i, NCoeff=num_splines))
-    return splined_ws_list
-
-
-def _strip_peaks_new_inst(input_ws, alg_range):
-    van_stripped_ws = mantid.StripPeaks(InputWorkspace=input_ws, FWHM=15, Tolerance=8, WorkspaceIndex=0)
-    for i in range(1, alg_range):
-        van_stripped_ws = mantid.StripPeaks(InputWorkspace=van_stripped_ws, FWHM=15, Tolerance=8,
-                                            WorkspaceIndex=i)
-
-    return van_stripped_ws
-
-
-def _van_spline_new_instruments(in_workspace, num_splines, instrument_version):
+def spline_vanadium_for_focusing(focused_vanadium_spectra, num_splines):
     # remove bragg peaks before spline
-    alg_range, unused = pearl_algs.get_instrument_ranges(instrument_version)
-    van_stripped_ws = _strip_peaks_new_inst(in_workspace, alg_range)
+    stripped_peaks_list = []
+    for ws in focused_vanadium_spectra:
+        out_name = ws.name() + "_stripped"
+        # We have to clone the workspace - if no peaks are found it trashes the list
+        # as it assigns to new name to the previous list
+        stripped_ws = mantid.CloneWorkspace(InputWorkspace=ws, OutputWorkspace=out_name)
+        stripped_peaks_list.append(mantid.StripPeaks(InputWorkspace=stripped_ws, FWHM=15, Tolerance=8,
+                                                     OutputWorkspace=out_name))
+
+    # run twice on low angle as peaks are very broad
+    for i in range(0, 2):
+        mantid.StripPeaks(InputWorkspace=stripped_peaks_list[12], FWHM=100, Tolerance=10,
+                          OutputWorkspace=stripped_peaks_list[12])
+
+        mantid.StripPeaks(InputWorkspace=stripped_peaks_list[13], FWHM=60, Tolerance=10,
+                          OutputWorkspace=stripped_peaks_list[13])
+
+    tof_ws_list = []
+    for ws in stripped_peaks_list:
+        out_name = ws.name() + "_TOF"
+        tof_ws_list.append(mantid.ConvertUnits(InputWorkspace=ws, Target="TOF", OutputWorkspace=out_name))
+        common.remove_intermediate_workspace(ws)
 
-    if instrument_version == "new2":
-        # run twice on low angle as peaks are very broad
-        for i in range(0, 2):
-            van_stripped_ws = mantid.StripPeaks(InputWorkspace=van_stripped_ws, FWHM=100, Tolerance=10,
-                                                WorkspaceIndex=12)
-            van_stripped_ws = mantid.StripPeaks(InputWorkspace=van_stripped_ws, FWHM=60, Tolerance=10,
-                                                WorkspaceIndex=13)
-
-    van_stripped_ws = mantid.ConvertUnits(InputWorkspace=van_stripped_ws, Target="TOF")
+    splined_ws_list = []
+    bank_index = 0
+    for ws in tof_ws_list:
+        bank_index += 1
+        out_ws_name = "spline_bank_" + str(bank_index + 1)
+        splined_ws_list.append(mantid.SplineBackground(InputWorkspace=ws, OutputWorkspace=out_ws_name,
+                                                       NCoeff=num_splines))
+        common.remove_intermediate_workspace(ws)
 
-    splined_ws_list = _perform_spline_range(alg_range, num_splines, van_stripped_ws)
-    common.remove_intermediate_workspace(van_stripped_ws)
     return splined_ws_list
 
-
-def _van_spline_old_instrument(in_workspace):
-    van_stripped = mantid.ConvertUnits(InputWorkspace=in_workspace, Target="dSpacing")
-
-    # remove bragg peaks before spline
-    van_stripped = mantid.StripPeaks(InputWorkspace=van_stripped, FWHM=15, Tolerance=6, WorkspaceIndex=0)
-    van_stripped = mantid.StripPeaks(InputWorkspace=van_stripped, FWHM=15, Tolerance=6, WorkspaceIndex=2)
-    van_stripped = mantid.StripPeaks(InputWorkspace=van_stripped, FWHM=15, Tolerance=6, WorkspaceIndex=3)
-    van_stripped = mantid.StripPeaks(InputWorkspace=van_stripped, FWHM=40, Tolerance=12, WorkspaceIndex=1)
-    van_stripped = mantid.StripPeaks(InputWorkspace=van_stripped, FWHM=60, Tolerance=12, WorkspaceIndex=1)
-
-    # Mask low d region that is zero before spline
-    for reg in range(0, 4):
-        if reg == 1:
-            van_stripped = mantid.MaskBins(InputWorkspace=van_stripped, XMin=0, XMax=0.14, SpectraList=reg)
-        else:
-            van_stripped = mantid.MaskBins(InputWorkspace=van_stripped, XMin=0, XMax=0.06, SpectraList=reg)
-
-    van_stripped = mantid.ConvertUnits(InputWorkspace=van_stripped, Target="TOF")
-
-    splined_ws_list = []
-    for i in range(0, 4):
-        out_ws_name = "spline" + str(i+1)
-        if i == 1:
-            coeff = 80
-        else:
-            coeff = 100
-        splined_ws_list.append(mantid.SplineBackground(InputWorkspace=van_stripped, OutputWorkspace=out_ws_name,
-                                                       WorkspaceIndex=i, NCoeff=coeff))
-    common.remove_intermediate_workspace(van_stripped)
-    return splined_ws_list
diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py
index 3f4ad09d093..6281972c261 100644
--- a/scripts/Diffraction/isis_powder/polaris.py
+++ b/scripts/Diffraction/isis_powder/polaris.py
@@ -106,36 +106,41 @@ class Polaris(AbstractInst):
 
         return spectra_name
 
-    def spline_vanadium_ws(self, focused_vanadium_ws, instrument_version=''):
-        extracted_spectra = common.extract_bank_spectra(focused_vanadium_ws, self._number_of_banks)
+    def spline_vanadium_ws(self, focused_vanadium_spectra, instrument_version=''):
         mode = "spline"
 
         masking_file_path = os.path.join(self.calibration_dir, self._masking_file_name)
-        output = polaris_algs.process_vanadium_for_focusing(bank_spectra=extracted_spectra,
+        output = polaris_algs.process_vanadium_for_focusing(bank_spectra=focused_vanadium_spectra,
                                                             spline_number=self._spline_coeff,
                                                             mode=mode, mask_path=masking_file_path)
 
-        for ws in extracted_spectra:
-            common.remove_intermediate_workspace(ws)
-
         return output
 
     def generate_vanadium_absorb_corrections(self, calibration_full_paths, ws_to_match):
         return polaris_algs.generate_absorb_corrections(ws_to_match=ws_to_match)
 
+    def vanadium_calibration_rebinning(self, vanadium_ws):
+        common.crop_in_tof(ws_to_rebin=vanadium_ws, x_max=19900, is_mixed_binning=True)
+        # TODO find out maximum TOF value for POLARIS
+
+    def extract_and_crop_spectra(self, focused_ws):
+        ws_spectra = common.extract_ws_spectra(ws_to_split=focused_ws)
+        ws_spectra = common.crop_in_tof(ws_to_rebin=ws_spectra, x_min=800, x_max=20000)
+        return ws_spectra
+
     def calculate_focus_binning_params(self, sample):
         calculated_binning_params = polaris_algs.calculate_focus_binning_params(sample_ws=sample,
                                                                                 num_of_banks=self._number_of_banks)
         return calculated_binning_params
 
-    def output_focused_ws(self, processed_spectra, run_details, attenuate=False):
+    def output_focused_ws(self, processed_spectra, run_details, output_mode=None, attenuate=False):
         d_spacing_group, tof_group = polaris_algs.split_into_tof_d_spacing_groups(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=run_details.run_number)
 
-        return d_spacing_group, tof_group
+        return d_spacing_group
 
 
 def _set_kwargs_from_basic_config_file(config_path, kwargs):
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
index 2fc5aea0f3f..a789dd5ab7c 100644
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
+++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
@@ -103,6 +103,8 @@ def get_run_details(chopper_on, sac_on, run_number_string, calibration_dir, mapp
 
 
 def split_into_tof_d_spacing_groups(processed_spectra):
+    import pydevd
+    pydevd.settrace('localhost', port=51205, stdoutToServer=True, stderrToServer=True)
     name_index = 1
     d_spacing_output = []
     tof_output = []
@@ -110,9 +112,9 @@ def split_into_tof_d_spacing_groups(processed_spectra):
         d_spacing_out_name = "ResultD-" + str(name_index)
         tof_out_name = "ResultTOF-" + str(name_index)
         name_index += 1
-        # Rename d-spacing workspaces
-        d_spacing_output.append(mantid.CloneWorkspace(InputWorkspace=ws, OutputWorkspace=d_spacing_out_name))
-        # Convert to TOF
+
+        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
diff --git a/scripts/Diffraction/isis_powder/routines/calibrate.py b/scripts/Diffraction/isis_powder/routines/calibrate.py
index 162849662f0..13f27f962ad 100644
--- a/scripts/Diffraction/isis_powder/routines/calibrate.py
+++ b/scripts/Diffraction/isis_powder/routines/calibrate.py
@@ -1,14 +1,12 @@
 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.common_enums import InputBatchingEnum
 
 
-def create_van(instrument, van, empty, output_van_file_name, absorb, gen_absorb):
+def create_van(instrument, van, empty, absorb, gen_absorb):
     run_details = instrument.get_run_details(run_number=van)
     # 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,
@@ -17,7 +15,7 @@ def create_van(instrument, van, empty, output_van_file_name, absorb, gen_absorb)
     corrected_van_ws = common.subtract_sample_empty(ws_to_correct=input_van_ws, empty_sample_ws_string=empty,
                                                     instrument=instrument)
 
-    # TODO get POLARIS to crop the tail end of data here
+    # Crop the tail end of the data on PEARL if they are not capturing slow neutrons
     corrected_van_ws = instrument.crop_data_tail(ws_to_crop=corrected_van_ws)
 
     corrected_van_ws = mantid.AlignDetectors(InputWorkspace=corrected_van_ws,
@@ -30,21 +28,23 @@ def create_van(instrument, van, empty, output_van_file_name, absorb, gen_absorb)
                                                      run_details=run_details,
                                                      corrected_van_ws=corrected_van_ws, gen_absorb=gen_absorb)
 
-    focused_van_file = mantid.DiffractionFocussing(InputWorkspace=corrected_van_ws,
+    focused_vanadium = mantid.DiffractionFocussing(InputWorkspace=corrected_van_ws,
                                                    GroupingFileName=run_details.grouping)
-    # TODO get POLARIS to apply rebinning here too
-    focused_van_file = instrument. vanadium_calibration_rebinning(vanadium_ws=focused_van_file)
 
-    focused_output = _save_focused_vanadium(instrument=instrument, run_details=run_details,
-                                            focused_vanadium_ws=focused_van_file)
+    focused_cropped_spectra = instrument.extract_and_crop_spectra(focused_ws=focused_vanadium)
+    d_spacing_group = _save_focused_vanadium(instrument=instrument, run_details=run_details,
+                                             cropped_spectra=focused_cropped_spectra)
+    _create_vanadium_splines(focused_cropped_spectra, instrument, run_details)
+
     common.remove_intermediate_workspace(corrected_van_ws)
+    common.remove_intermediate_workspace(focused_vanadium)
+    common.remove_intermediate_workspace(focused_cropped_spectra)
 
-    _create_vanadium_splines(focused_van_file, instrument, run_details)
-    return focused_output
+    return d_spacing_group
 
 
-def _create_vanadium_splines(focused_van_file, instrument, run_details):
-    splined_ws_list = instrument.spline_vanadium_ws(focused_van_file, run_details.instrument_version)
+def _create_vanadium_splines(focused_spectra, instrument, run_details):
+    splined_ws_list = instrument.spline_vanadium_ws(focused_spectra)
     out_spline_van_file_path = run_details.splined_vanadium
     append = False
     for ws in splined_ws_list:
@@ -72,16 +72,7 @@ def _apply_absorb_corrections(instrument, run_details, corrected_van_ws, gen_abs
     return corrected_van_ws
 
 
-def _save_focused_vanadium(instrument, run_details, focused_vanadium_ws):
-    number_of_spectra = focused_vanadium_ws.getNumberHistograms()
-    ws_spectra_list = []
-    for i in range(0, number_of_spectra):
-        out_spectra_name = focused_vanadium_ws.name() + "_bank-" + str(i + 1)
-        ws_spectra_list.append(mantid.ExtractSingleSpectrum(InputWorkspace=focused_vanadium_ws, WorkspaceIndex=i,
-                                                            OutputWorkspace=out_spectra_name))
-    output_list = instrument.output_focused_ws(processed_spectra=ws_spectra_list, run_details=run_details,
-                                               output_mode="all")
-    common.remove_intermediate_workspace(ws_spectra_list)
-
-    group_name = instrument.generate_inst_file_name(run_details.run_number) + "_focused"
-    return mantid.GroupWorkspaces(InputWorkspaces=output_list, OutputWorkspace=group_name)
+def _save_focused_vanadium(instrument, run_details, cropped_spectra):
+    d_spacing_group = instrument.output_focused_ws(processed_spectra=cropped_spectra,
+                                                   run_details=run_details, output_mode="all")
+    return d_spacing_group
diff --git a/scripts/Diffraction/isis_powder/routines/common.py b/scripts/Diffraction/isis_powder/routines/common.py
index ea18d0e3693..5cc77f59134 100644
--- a/scripts/Diffraction/isis_powder/routines/common.py
+++ b/scripts/Diffraction/isis_powder/routines/common.py
@@ -18,6 +18,25 @@ def create_calibration_by_names(calibration_runs, startup_objects, grouping_file
                            out_grouping_file_name=grouping_file_name, instrument=startup_objects)
 
 
+def crop_in_tof(ws_to_rebin, x_min=None, x_max=None):
+    if isinstance(ws_to_rebin, list):
+        cropped_ws = []
+        for ws in ws_to_rebin:
+            cropped_ws.append(_crop_single_ws_in_tof(ws, x_max=x_max, x_min=x_min))
+    else:
+        cropped_ws = _crop_single_ws_in_tof(ws_to_rebin, x_max=x_max, x_min=x_min)
+    return cropped_ws
+
+
+def _crop_single_ws_in_tof(ws_to_rebin, x_max, x_min):
+    previous_units = ws_to_rebin.getAxis(0).getUnit().unitID()
+    ws_to_rebin = mantid.ConvertUnits(InputWorkspace=ws_to_rebin, Target="TOF", OutputWorkspace=ws_to_rebin)
+    cropped_ws = mantid.CropWorkspace(InputWorkspace=ws_to_rebin, OutputWorkspace=ws_to_rebin,
+                                      XMin=x_min, XMax=x_max)
+    cropped_ws = mantid.ConvertUnits(InputWorkspace=cropped_ws, Target=previous_units, OutputWorkspace=cropped_ws)
+    return cropped_ws
+
+
 def dictionary_key_helper(dictionary, key, throws=True, exception_msg=None):
     if key in dictionary:
         return dictionary[key]
@@ -32,9 +51,10 @@ def dictionary_key_helper(dictionary, key, throws=True, exception_msg=None):
         return this_throws  # Never gets this far just makes linters happy
 
 
-def extract_bank_spectra(ws_to_split, num_banks):
+def extract_ws_spectra(ws_to_split):
+    num_spectra = ws_to_split.getNumberHistograms()
     spectra_bank_list = []
-    for i in range(0, num_banks):
+    for i in range(0, num_spectra):
         output_name = "bank-" + str(i + 1)
         # Have to use crop workspace as extract single spectrum struggles with the variable bin widths
         spectra_bank_list.append(mantid.CropWorkspace(InputWorkspace=ws_to_split, OutputWorkspace=output_name,
@@ -153,13 +173,7 @@ def _load_list_of_files(run_numbers_list, instrument):
 def _sum_ws_range(ws_list):
     # Sum all workspaces
     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:]:
-        summed_ws = mantid.Plus(LHSWorkspace=summed_ws, RHSWorkspace=ws, OutputWorkspace=out_ws_name)
-
-    # summed_ws = mantid.MergeRuns(InputWorkspaces=ws_list, OutputWorkspace=out_ws_name)
+    summed_ws = mantid.MergeRuns(InputWorkspaces=ws_list, OutputWorkspace=out_ws_name)
     return summed_ws
 
 
diff --git a/scripts/Diffraction/isis_powder/routines/focus.py b/scripts/Diffraction/isis_powder/routines/focus.py
index 210ee2d36a0..0a1984a96c1 100644
--- a/scripts/Diffraction/isis_powder/routines/focus.py
+++ b/scripts/Diffraction/isis_powder/routines/focus.py
@@ -30,7 +30,7 @@ def _divide_sample_by_vanadium(instrument, run_number, input_workspace, perform_
     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)
+    split_ws = common.extract_ws_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)
-- 
GitLab