From 5e472783ea1d45ed7b9fc1683c5fb8ab0314831a Mon Sep 17 00:00:00 2001
From: Sam Jenkins <s.jenkins@stfc.ac.uk>
Date: Tue, 11 Sep 2018 09:30:29 +0100
Subject: [PATCH] Re #23214 Added check for gem, and function to crop focused
 workspace

function cropsworkspace at values less than 1% of the max value.
---
 .../Diffraction/isis_powder/abstract_inst.py  |  3 +
 .../Diffraction/isis_powder/routines/focus.py | 56 ++++++++++++++++---
 2 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py
index 93235a291a2..72b6efd7c26 100644
--- a/scripts/Diffraction/isis_powder/abstract_inst.py
+++ b/scripts/Diffraction/isis_powder/abstract_inst.py
@@ -183,6 +183,9 @@ class AbstractInst(object):
         """
         return None
 
+    def get_instrument_prefix(self):
+        return self._inst_prefix
+
     def _get_input_batching_mode(self):
         """
         Returns the user specified input batching (e.g. summed or individual processing). This is set to summed
diff --git a/scripts/Diffraction/isis_powder/routines/focus.py b/scripts/Diffraction/isis_powder/routines/focus.py
index 3c60a251e00..f2c0c6b4fbc 100644
--- a/scripts/Diffraction/isis_powder/routines/focus.py
+++ b/scripts/Diffraction/isis_powder/routines/focus.py
@@ -55,7 +55,8 @@ def _focus_one_ws(input_workspace, run_number, instrument, perform_vanadium_norm
     focused_ws = mantid.DiffractionFocussing(InputWorkspace=aligned_ws,
                                              GroupingFileName=run_details.grouping_file_path)
 
-    calibrated_spectra = _apply_vanadium_corrections(input_workspace=focused_ws,
+    calibrated_spectra = _apply_vanadium_corrections(instrument=instrument,
+                                                     input_workspace=focused_ws,
                                                      perform_vanadium_norm=perform_vanadium_norm,
                                                      vanadium_splines=vanadium_path)
 
@@ -82,13 +83,14 @@ def _focus_one_ws(input_workspace, run_number, instrument, perform_vanadium_norm
     return d_spacing_group
 
 
-def _apply_vanadium_corrections(input_workspace, perform_vanadium_norm, vanadium_splines):
+def _apply_vanadium_corrections(instrument, input_workspace, perform_vanadium_norm, vanadium_splines):
     input_workspace = mantid.ConvertUnits(InputWorkspace=input_workspace, OutputWorkspace=input_workspace, Target="TOF")
     split_data_spectra = common.extract_ws_spectra(input_workspace)
 
     if perform_vanadium_norm:
         processed_spectra = _divide_by_vanadium_splines(spectra_list=split_data_spectra,
-                                                        vanadium_splines=vanadium_splines)
+                                                        vanadium_splines=vanadium_splines,
+                                                        instrument=instrument)
     else:
         processed_spectra = split_data_spectra
 
@@ -111,16 +113,21 @@ def _batched_run_focusing(instrument, perform_vanadium_norm, run_number_string,
     return output
 
 
-def _divide_one_spectrum_by_spline(spectrum, spline):
+def _divide_one_spectrum_by_spline(spectrum, spline,instrument):
     rebinned_spline = mantid.RebinToWorkspace(WorkspaceToRebin=spline, WorkspaceToMatch=spectrum, StoreInADS=False)
 
+    print(instrument.get_instrument_prefix())
+    if instrument.get_instrument_prefix() == "GEM":
+        divided = mantid.Divide(LHSWorkspace=spectrum, RHSWorkspace=rebinned_spline, OutputWorkspace=spectrum,
+                                StoreInADS=False)
+        output = _crop_spline_to_percent_of_max(rebinned_spline, divided)
+        mantid.mtd['output'] = output
+        return output
     divided = mantid.Divide(LHSWorkspace=spectrum, RHSWorkspace=rebinned_spline, OutputWorkspace=spectrum)
-    divided = mantid.ReplaceSpecialValues(rebinned_spline, InfinityValue=0, OutputWorkspace=spectrum)
     return divided
 
 
-def _divide_by_vanadium_splines(spectra_list, vanadium_splines):
-
+def _divide_by_vanadium_splines(spectra_list, vanadium_splines, instrument):
     if hasattr(vanadium_splines, "OutputWorkspace"):  # vanadium_splines is a group
         vanadium_splines = vanadium_splines.OutputWorkspace
 
@@ -131,7 +138,7 @@ def _divide_by_vanadium_splines(spectra_list, vanadium_splines):
             raise RuntimeError("Mismatch between number of banks in vanadium and number of banks in workspace to focus"
                                "\nThere are {} banks for vanadium but {} for the run".format(num_splines, num_spectra))
 
-        output_list = [_divide_one_spectrum_by_spline(data_ws, van_ws)
+        output_list = [_divide_one_spectrum_by_spline(data_ws, van_ws, instrument)
                        for data_ws, van_ws in zip(spectra_list, vanadium_splines)]
         return output_list
 
@@ -162,3 +169,36 @@ def _test_splined_vanadium_exists(instrument, run_details):
         raise ValueError("Processed vanadium runs not found at this path: "
                          + str(run_details.splined_vanadium_file_path) +
                          " \nHave you run the method to create a Vanadium spline with these settings yet?\n")
+
+
+def _crop_spline_to_percent_of_max(spline, input_ws):
+    print("Cropping")
+    y_val = 0
+    spline_spectrum = spline.readY(0)
+
+    for i in range(spline.blocksize()):
+        temp = spline_spectrum[i]
+        if float(y_val) < float(temp):
+            y_val = temp
+    print("y_max = "+str(y_val))
+    y_val = y_val/100
+    x_min = 0
+    before_min = True
+    x_list = input_ws.readX(0)
+    x_max = x_list[-1]
+    for i in range(spline.blocksize()):
+        if before_min:
+
+            if float(y_val) > float(spline_spectrum[i]):
+                x_min = x_list[i]
+            else:
+                print("y_val: " + str(y_val) + "< x_val: "+str(spline_spectrum[i]))
+                before_min = False
+        else:
+            if float(y_val) < float(spline_spectrum[i]):
+                x_max = x_list[i]
+    print("block_size = "+str(input_ws.blocksize()))
+    print("x_min = "+str(x_min))
+    print("x_max = "+str(x_max))
+    output = mantid.CropWorkspace(inputWorkspace=input_ws, XMin=x_min, XMax=x_max, StoreInADS=False)
+    return output
-- 
GitLab