diff --git a/Testing/SystemTests/tests/analysis/ISIS_WISHPowderReductionTest.py b/Testing/SystemTests/tests/analysis/ISIS_WISHPowderReductionTest.py
index 7fa8cc873388a3ece3cff55fc90842eaae821727..d2b71ba292a95285c4245d540bcfb1fb51578513 100644
--- a/Testing/SystemTests/tests/analysis/ISIS_WISHPowderReductionTest.py
+++ b/Testing/SystemTests/tests/analysis/ISIS_WISHPowderReductionTest.py
@@ -1,5 +1,5 @@
 from systemtesting import MantidSystemTest
-from wish.reduce import Wish_Run
+from wish.reduce import Wish
 
 from mantid import config
 import mantid.simpleapi as mantid
@@ -48,18 +48,19 @@ class WISHPowderReductionTest(MantidSystemTest):
 
     def runTest(self):
         os.makedirs(output_dir)
-        Wish_Run("__main__", calibration_dir+"/", input_dir, output_dir, True)
+        wish_test = Wish("__main__", calibration_dir+"/", output_dir + "/", True, input_dir)
+        wish_test.reduce()
         self.clearWorkspaces()
 
     def validate(self):
-        return "w40503-1_10foc", "WISH40503-1_10raw.nxs", \
-               "w40503-2_9foc",  "WISH40503-2_9raw.nxs", \
-               "w40503-3_8foc",  "WISH40503-3_8raw.nxs", \
-               "w40503-4_7foc",  "WISH40503-4_7raw.nxs", \
-               "w40503-5_6foc",  "WISH40503-5_6raw.nxs"
+        #return "w40503-1_10foc", "WISH40503-1_10raw.nxs", \
+        #       "w40503-2_9foc",  "WISH40503-2_9raw.nxs", \
+        #       "w40503-3_8foc",  "WISH40503-3_8raw.nxs", \
+        #       "w40503-4_7foc",  "WISH40503-4_7raw.nxs", \
+        return "w40503-5_6foc",  "WISH40503-5_6raw.nxs"
 
     def clearWorkspaces(self):
-        deletews = ["w40503-" + str(i) + "foc" for i in range(1, 11)]
+        deletews = ["w40503-" + str(i) + "foc" for i in range(5, 7)]
         for ws in deletews:
             mantid.DeleteWorkspace(ws)
             mantid.DeleteWorkspace(ws + "-d")
diff --git a/scripts/wish/reduce.py b/scripts/wish/reduce.py
index 71a6372c5e92e23cb1371a97139055bf70a1d156..6cb8a2cb7c3804a5df13c602ba30217e8880a53e 100644
--- a/scripts/wish/reduce.py
+++ b/scripts/wish/reduce.py
@@ -1,98 +1,80 @@
 # Set of routines to normalise WISH data- new look Mantid with mantidsimple removed
 import mantid.simpleapi as mantid
-import matplotlib.pyplot as p
+import os
 import numpy as n
 
 
-def Wish_Run(input_mode, calibration_folder, input_dir, output_dir, deleteWorkspace):
-    wish_dir = ""
-
-    # Get the valid wavelength range, i.e. excluding regions where choppers cut
-    def WISH_getlambdarange():
-        return 0.7, 10.35
-
-    def WISH_setuser(usern):
-        global username
-        username = usern
-
-    def WISH_setdatadir(directory="/archive/ndxwish/Instrument/data/cycle_09_5/"):
-        global wish_datadir
-        wish_datadir = directory
-
-    def WISH_setuserdir(directory):
-        global wish_userdir
-        wish_userdir = directory
-
-    def WISH_datadir():
-        return wish_datadir
-
-    def WISH_userdir(cycle='cycle_10_1'):
-        return wish_userdir
-
-    def WISH_calibration(cycle="11_4"):
-        return "/home/sjenkins/Work/Build-1/ExternalData/Testing/Data/SystemTest/WISH/input/Cal/"
-
-    def WISH_startup(usern, cycle='14_3'):
-        global userdatadir
-        global userdataprocessed
-        global mtdplt
-        import sys
-        sys.path.append('/data/' + usern + '/Scripts/')
-        #	import Mantid_plotting as mtdplt
-        #	userdatadir="/data/rawdata/"
-        userdatadir = "/archive/ndxwish/Instrument/data/cycle_" + cycle + '/'
-        WISH_setdatadir(userdatadir)
-        print "Raw Data in :   ", userdatadir
-        userdataprocessed = "/home/sjenkins/Work/Build-1/ExternalData/Testing/Data/SystemTest/WISH/output/"
-        WISH_setuserdir(directory=userdataprocessed)
-        print "Processed Data in :   ", userdataprocessed
-        return
+class Wish:
+    NUM_PANELS = 11
+    NUM_MONITORS = 6
+    LAMBDA_RANGE = (0.7, 10.35)
+
+    def __init__(self, input_mode, cal_directory, output_folder, delete_workspace,
+                 user_directory="/archive/ndxwish/Instrument/data/cycle_"):
+        self.name = input_mode
+        self.cal_dir = cal_directory
+        self.use_folder = user_directory
+        self.out_folder = output_folder
+        self.deleteWorkspace = delete_workspace
+        self.username = None
+        self.data_directory = None
+        self.user_directory = None
+        self.datafile = None
+        self.userdatadir = None
+        self.userdataprocessed = None
+        self.return_panel = {
+            1: (6, 19461),
+            2: (19462, 38917),
+            3: (38918, 58373),
+            4: (58374, 77829),
+            5: (77830, 97285),
+            6: (97286, 116741),
+            7: (116742, 136197),
+            8: (136198, 155653),
+            9: (155654, 175109),
+            10: (175110, 194565),
+            0: (6, 194565)
+        }
+
+    def set_user_name(self, username):
+        self.username = username
+
+    def set_data_directory(self, directory="/archive/ndxwish/Instrument/data/cycle_09_5/"):
+        self.data_directory = directory
+
+    def set_user_directory(self, directory):
+        self.user_directory = directory
+
+    def startup(self, cycle='14_3'):
+        user_data_directory = self.use_folder + cycle + '/'
+        self.set_data_directory(user_data_directory)
+        print "Raw Data in :   ", user_data_directory
+        user_data_processed = self.out_folder
+        self.set_user_directory(directory=user_data_processed)
+        print "Processed Data in :   ", user_data_processed
 
     # Returns the calibration filename
-    def WISH_cal(panel):
-        return WISH_calibration() + "WISH_cycle_10_3_noends_10to10.cal"
-
-    # return "/data/mp43/Desktop/Si_Mar15/test_detOffsets_SiMar15_noends.cal"
-    # return "/data/ryb18365/Desktop/WISH_cycle_10_3_noends_10to10_dodgytubesremoved.cal"
-    # return "/data/mp43/Calibration/Cycle_11_4/test3_VX4.cal"
-    # return "/data/mp43/Desktop/sputnik_NiSbF6/sapphire_masked_sputnik.cal"
+    def get_cal(self):
+        return self.cal_dir + "WISH_cycle_10_3_noends_10to10.cal"
 
     # Returns the grouping filename
-    def WISH_group():
-        return WISH_calibration() + "WISH_cycle_10_3_noends_10to10.cal"
-
-    # return "/data/mp43/Desktop/Si_Mar15/test_detOffsets_SiMar15_noends.cal"
-    # return "/data/ryb18365/Desktop/WISH_cycle_10_3_noends_10to10_dodgytubesremoved.cal"
-    # return "/data/mp43/Calibration/Cycle_11_4/test3_VX4.cal"
-    # return "/data/mp43/Desktop/sputnik_NiSbF6/sapphire_masked_sputnik.cal"
-
-    def WISH_getvana(panel, SE="candlestick", cycle="09_4"):
-        if (SE == "candlestick"):
-            if (cycle == "09_2"):
-                return WISH_calibration() + "vana318-" + str(panel) + "foc-rmbins-smooth50.nx5"
-            if (cycle == "09_3"):
-                return WISH_calibration(cycle) + "vana935-" + str(panel) + "foc-SS.nx5"
-            if (cycle == "09_4"):
-                return WISH_calibration(cycle) + "vana3123-" + str(panel) + "foc-SS.nx5"
-            if (cycle == "09_5"):
-                return WISH_calibration(cycle) + "vana3123-" + str(panel) + "foc-SS.nx5"
-            if (cycle == "11_4"):
-                return WISH_calibration(cycle) + "vana19612-" + str(panel) + "foc-SF-SS.nxs"
-        if (SE == "WISHcryo"):
-            if (cycle == "09_2"):
-                return WISH_calibration() + "vana318-" + str(panel) + "foc-rmbins-smooth50.nx5"
-            if (cycle == "09_3"):
-                return WISH_calibration(cycle) + "vana935-" + str(panel) + "foc-SS.nx5"
-            if (cycle == "09_4"):
-                return WISH_calibration(cycle) + "vana3123-" + str(panel) + "foc-SS.nx5"
-            if (cycle == "11_1"):
-                return WISH_calibration(cycle) + "vana17718-" + str(panel) + "foc-SS.nxs"
-            if (cycle == "11_2"):
-                return WISH_calibration(cycle) + "vana16812-" + str(panel) + "foc-SS.nx5"
-            if (cycle == "11_3"):
-                return WISH_calibration(cycle) + "vana18590-" + str(panel) + "foc-SS-new.nxs"
-
-    def split_string(t):
+    def get_group_file(self):
+        return self.cal_dir + "WISH_cycle_10_3_noends_10to10.cal"
+
+    def get_vanadium(self, panel, cycle="09_4"):
+        vanadium_string = {
+            "09_2": "vana318-{}foc-rmbins-smooth50.nx5",
+            "09_3": "vana935-{}foc-SS.nx5",
+            "09_4": "vana3123-{}foc-SS.nx5",
+            "09_5": "vana3123-{}foc-SS.nx5",
+            "11_1": "vana17718-{}foc-SS.nxs",
+            "11_2": "vana16812-{}foc-SS.nx5",
+            "11_3": "vana18590-{}foc-SS-new.nxs",
+            "11_4": "vana19612-{}foc-SF-SS.nxs",
+        }
+        return self.cal_dir + vanadium_string.get(cycle).format(panel)
+
+    def split_string(self, t):
         indxp = 0
         for i in range(0, len(t)):
             if (t[i] == "+"):
@@ -100,132 +82,42 @@ def Wish_Run(input_mode, calibration_folder, input_dir, output_dir, deleteWorksp
         if (indxp != 0):
             return int(t[0:indxp]), int(t[indxp + 1:len(t)])
 
-    def WISH_getemptyinstrument(panel, cycle="09_4"):
-        if (cycle == "09_4"):
-            return WISH_calibration(cycle) + "emptyinst3120-" + str(panel) + "foc.nx5"
-
-    def WISH_getempty(panel, SE="WISHcryo", cycle="09_4"):
-        if (SE == "WISHcryo"):
-            if (cycle == "09_2"):
-                return WISH_calibration(cycle) + "emptycryo322-" + str(panel) + "-smooth50.nx5"
-            if (cycle == "09_3"):
-                return WISH_calibration(cycle) + "emptycryo1725-" + str(panel) + "foc.nx5"
-            if (cycle == "09_4"):
-                return WISH_calibration(cycle) + "emptycryo3307-" + str(panel) + "foc.nx5"
-            if (cycle == "09_5"):
-                return WISH_calibration(cycle) + "emptycryo16759-" + str(panel) + "foc.nx5"
-            if (cycle == "11_1"):
-                return WISH_calibration(cycle) + "emptycryo17712-" + str(panel) + "foc-SS.nxs"
-            if (cycle == "11_2"):
-                return WISH_calibration(cycle) + "emptycryo16759-" + str(panel) + "foc-SS.nx5"
-            if (cycle == "11_3"):
-                return WISH_calibration(cycle) + "emptycryo17712-" + str(panel) + "foc-SS-new.nxs"
-            if (cycle == "11_4"):
-                return WISH_calibration(cycle) + "empty_mag20620-" + str(panel) + "foc-HR-SF.nxs"
-        if (SE == "candlestick"):
-            if (cycle == "09_4"):
-                return WISH_calibration(cycle) + "emptyinst3120-" + str(panel) + "foc.nxs"
-            if (cycle == "09_3"):
-                return WISH_calibration(cycle) + "emptyinst1726-" + str(panel) + "foc-monitor.nxs"
-            if (cycle == "11_4"):
-                return WISH_calibration(cycle) + "emptyinst19618-" + str(panel) + "foc-SF-S.nxs"
-
-    def WISH_getfilename(run_number, ext):
-        if (ext[0] != 's'):
-            data_dir = WISH_datadir()
+    def get_file_name(self, run_number, extension):
+        if extension[0] != 's':
+            data_dir = self.data_directory
         else:
-            # data_dir="/datad/ndxwish/"
-            data_dir = WISH_datadir()
+            data_dir = self.data_directory
         digit = len(str(run_number))
-        filename = data_dir + "WISH"
-        for i in range(0, 8 - digit):
+        filename = os.path.join(data_dir, "WISH")
+        for i in range(8 - digit):
             filename = filename + "0"
-        filename += str(run_number) + "." + ext
+        filename += str(run_number) + "." + extension
         return filename
 
-    def WISH_returnpanel(panel):
-        if (panel == 1):
-            min = 6
 
-    def WISH_getfilename(run_number, ext):
-        if (ext[0] != 's'):
-            data_dir = WISH_datadir()
-        else:
-            # data_dir="/datad/ndxwish/"
-            data_dir = WISH_datadir()
-        digit = len(str(run_number))
-        filename = data_dir + "WISH"
-        for i in range(0, 8 - digit):
-            filename = filename + "0"
-        filename += str(run_number) + "." + ext
-        return filename
 
-    def WISH_returnpanel(panel):
-        if (panel == 1):
-            min = 6
-            max = 19461
-        elif (panel == 2):
-            min = 19462
-            max = 38917
-        elif (panel == 3):
-            min = 38918
-            max = 58373
-        elif (panel == 4):
-            min = 58374
-            max = 77829
-        elif (panel == 5):
-            min = 77830
-            max = 97285
-        elif (panel == 6):
-            min = 97286
-            max = 116741
-        elif (panel == 7):
-            min = 116742
-            max = 136197
-        elif (panel == 8):
-            min = 136198
-            max = 155653
-        elif (panel == 9):
-            min = 155654
-            max = 175109
-        elif (panel == 10):
-            min = 175110
-            max = 194565
-        elif (panel == 0):
-            min = 6
-            max = 194565
-        return min, max
+
+
 
     # Reads a wish data file return a workspace with a short name
-    def WISH_read(number, panel, ext):
+    def WISH_read(self, number, panel, ext):
         if type(number) is int:
-            filename = WISH_getfilename(number, ext)
-            if (ext[0:10] == "nxs_event"):
-                filename = WISH_getfilename(number, "nxs")
+            filename = self.datafile
             print "will be reading filename..." + filename
-            min, max = WISH_returnpanel(panel)
-            if (panel != 0):
-                output = "w" + str(number) + "-" + str(panel)
+            spectra_min, spectra_max = self.return_panel.get(panel)
+            if panel != 0:
+                output = "w{0}-{1}".format(number, panel)
             else:
-                output = "w" + str(number)
-            if (ext == "raw"):
-                mantid.LoadRaw(Filename=filename, OutputWorkspace=output, SpectrumMin=str(min), SpectrumMax=str(max),
-                               LoadLogFiles="0")
-                mantid.MaskBins(InputWorkspace=output, OutputWorkspace=output, XMin=99900, XMax=106000)
-                print "standard raw file loaded"
-            if (ext[0] == "s"):
-                mantid.LoadRaw(Filename=filename, OutputWorkspace=output, SpectrumMin=str(min), SpectrumMax=str(max),
-                               LoadLogFiles="0")
-                mantid.MaskBins(InputWorkspace=output, OutputWorkspace=output, XMin=99900, XMax=106000)
-                print "sav file loaded"
+                output = "w{}".format(number)
+            shared_load_files(ext, filename,output,spectra_max,spectra_min,False)
             if (ext == "nxs_event"):
                 mantid.LoadEventNexus(Filename=filename, OutputWorkspace=output, LoadMonitors='1')
                 mantid.RenameWorkspace(output + "_monitors", "w" + str(number) + "_monitors")
                 mantid.Rebin(InputWorkspace=output, OutputWorkspace=output, Params='6000,-0.00063,110000')
                 mantid.ConvertToMatrixWorkspace(output, output)
-                min, max = WISH_returnpanel(panel)
-                mantid.CropWorkspace(InputWorkspace=output, OutputWorkspace=output, StartWorkspaceIndex=min - 6,
-                                     EndWorkspaceIndex=max - 6)
+                spectra_min, spectra_max = self.return_panel.get(panel)
+                mantid.CropWorkspace(InputWorkspace=output, OutputWorkspace=output, StartWorkspaceIndex=spectra_min - 6,
+                                     EndWorkspaceIndex=spectra_max - 6)
                 mantid.MaskBins(InputWorkspace=output, OutputWorkspace=output, XMin=99900, XMax=106000)
                 print "full nexus eventfile loaded"
             if (ext[0:10] == "nxs_event_"):
@@ -244,37 +136,33 @@ def Wish_Run(input_mode, calibration_folder, input_dir, output_dir, deleteWorksp
                 print "renaming monitors done!"
                 mantid.Rebin(InputWorkspace=output, OutputWorkspace=output, Params='6000,-0.00063,110000')
                 mantid.ConvertToMatrixWorkspace(output, output)
-                min, max = WISH_returnpanel(panel)
-                mantid.CropWorkspace(InputWorkspace=output, OutputWorkspace=output, StartWorkspaceIndex=min - 6,
-                                     EndWorkspaceIndex=max - 6)
+                spectra_min, spectra_max = self.return_panel.get(panel)
+                mantid.CropWorkspace(InputWorkspace=output, OutputWorkspace=output, StartWorkspaceIndex=spectra_min - 6,
+                                     EndWorkspaceIndex=spectra_max - 6)
                 mantid.MaskBins(output, output, XMin=99900, XMax=106000)
                 print "nexus event file chopped"
-            if (ext == "nxs"):
-                mantid.LoadNexus(Filename=filename, OutputWorkspace=output, SpectrumMin=str(min), SpectrumMax=str(max))
-                mantid.MaskBins(InputWorkspace=output, OutputWorkspace=output, XMin=99900, XMax=106000)
-                print "standard histo nxs file loaded"
         else:
-            n1, n2 = split_string(number)
+            n1, n2 = self.split_string(number)
             output = "w" + str(n1) + "_" + str(n2) + "-" + str(panel)
-            filename = WISH_getfilename(n1, ext)
+            filename = self.get_file_name(n1, ext)
             print "reading filename..." + filename
-            min, max = WISH_returnpanel(panel)
+            spectra_min, spectra_max = self.return_panel.get(panel)
             output1 = "w" + str(n1) + "-" + str(panel)
-            mantid.LoadRaw(Filename=filename, OutputWorkspace=output1, SpectrumMin=str(min), SpectrumMax=str(max),
+            mantid.LoadRaw(Filename=filename, OutputWorkspace=output1, SpectrumMin=str(spectra_min), SpectrumMax=str(spectra_max),
                            LoadLogFiles="0")
-            filename = WISH_getfilename(n2, ext)
+            filename = self.get_file_name(n2, ext)
             print "reading filename..." + filename
-            min, max = WISH_returnpanel(panel)
+            spectra_min, spectra_max = self.return_panel.get(panel)
             output2 = "w" + str(n2) + "-" + str(panel)
-            mantid.LoadRaw(Filename=filename, OutputWorkspace=output2, SpectrumMin=str(min), SpectrumMax=str(max),
+            mantid.LoadRaw(Filename=filename, OutputWorkspace=output2, SpectrumMin=str(spectra_min), SpectrumMax=str(spectra_max),
                            LoadLogFiles="0")
             mantid.MergeRuns(output1 + "," + output2, output)
             mantid.DeleteWorkspace(output1)
             mantid.DeleteWorkspace(output2)
         mantid.ConvertUnits(InputWorkspace=output, OutputWorkspace=output, Target="Wavelength", Emode="Elastic")
-        lmin, lmax = WISH_getlambdarange()
+        lmin, lmax = Wish.LAMBDA_RANGE
         mantid.CropWorkspace(InputWorkspace=output, OutputWorkspace=output, XMin=lmin, XMax=lmax)
-        monitor = WISH_process_incidentmon(number, ext, spline_terms=70, debug=False)
+        monitor = self.WISH_process_incidentmon(number, ext, spline_terms=70)
         print "first norm to be done"
         mantid.NormaliseToMonitor(InputWorkspace=output, OutputWorkspace=output + "norm1", MonitorWorkspace=monitor)
         print "second norm to be done"
@@ -291,33 +179,32 @@ def Wish_Run(input_mode, calibration_folder, input_dir, output_dir, deleteWorksp
         return output
 
     # Focus dataset for a given panel and return the workspace
-    def WISH_focus_onepanel(work, focus, panel):
-        mantid.AlignDetectors(InputWorkspace=work, OutputWorkspace=work, CalibrationFile=WISH_cal(panel))
-        mantid.DiffractionFocussing(InputWorkspace=work, OutputWorkspace=focus, GroupingFileName=WISH_group())
+    def WISH_focus_onepanel(self, work, focus, panel):
+        mantid.AlignDetectors(InputWorkspace=work, OutputWorkspace=work, CalibrationFile=self.get_cal())
+        mantid.DiffractionFocussing(InputWorkspace=work, OutputWorkspace=focus, GroupingFileName=self.get_group_file())
+        if (self.deleteWorkspace):
+            mantid.DeleteWorkspace(work)
         if (panel == 5 or panel == 6):
             mantid.CropWorkspace(InputWorkspace=focus, OutputWorkspace=focus, XMin=0.3)
-            mantid.DeleteWorkspace(work)
         return focus
 
-    def WISH_split(focus):
+    def WISH_split(self, focus):
         for i in range(0, 11):
             out = focus[0:len(focus) - 3] + "-" + str(i + 1) + "foc"
             mantid.ExtractSingleSpectrum(InputWorkspace=focus, OutputWorkspace=out, WorkspaceIndex=i)
             mantid.DeleteWorkspace(focus)
         return
 
-    def WISH_focus(work, panel):
+    def WISH_focus(self, work, panel):
         focus = work + "foc"
         if (panel != 0):
-            WISH_focus_onepanel(work, focus, panel)
+            return self.WISH_focus_onepanel(work, focus, panel)
         else:
-            WISH_focus_onepanel(work, focus, panel)
-            WISH_split(focus)
+            self.WISH_focus_onepanel(work, focus, panel)
+            self.WISH_split(focus)
 
-    def WISH_process(number, panel, ext, SEsample="WISHcryo", emptySEcycle="09_4", SEvana="candlestick",
-                     cyclevana="09_4",
-                     absorb=False, nd=0.0, Xs=0.0, Xa=0.0, h=0.0, r=0.0):
-        w = WISH_read(number, panel, ext)
+    def WISH_process(self, number, panel, ext, cyclevana="09_4", absorb=False, nd=0.0, Xs=0.0, Xa=0.0, h=0.0, r=0.0):
+        w = self.WISH_read(number, panel, ext)
         print "file read and normalized"
         if (absorb):
             mantid.ConvertUnits(InputWorkspace=w, OutputWorkspace=w, Target="Wavelength", EMode="Elastic")
@@ -329,61 +216,32 @@ def Wish_Run(input_mode, calibration_folder, input_dir, output_dir, deleteWorksp
             mantid.Divide(LHSWorkspace=w, RHSWorkspace="T", OutputWorkspace=w)
             mantid.DeleteWorkspace("T")
             mantid.ConvertUnits(InputWorkspace=w, OutputWorkspace=w, Target="TOF", EMode="Elastic")
-        wfoc = WISH_focus(w, panel)
+        wfocname = self.WISH_focus(w, panel)
         print "focussing done!"
-        if type(number) is int:
-            wfocname = "w" + str(number) + "-" + str(panel) + "foc"
-            if (len(ext) > 9):
-                label, tmin, tmax = split_string_event(ext)
-                wfocname = "w" + str(number) + "-" + str(panel) + "_" + label + "foc"
-        else:
-            n1, n2 = split_string(number)
-            wfocname = "w" + str(n1) + "_" + str(n2) + "-" + str(panel) + "foc"
-        if (panel == 1):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.80, XMax=53.3)
-        elif (panel == 2):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=13.1)
-        elif (panel == 3):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=7.77)
-        elif (panel == 4):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.40, XMax=5.86)
-        elif (panel == 5):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.35, XMax=4.99)
-        elif (panel == 6):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.35, XMax=4.99)
-        elif (panel == 7):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.40, XMax=5.86)
-        elif (panel == 8):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=7.77)
-        elif (panel == 9):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=13.1)
-        elif (panel == 10):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.80, XMax=53.3)
-
-        if (panel == 0):
-            for i in range(1, 11):
+
+        panel_crop = {
+            1: (0.8, 53.3),
+            2: (0.5, 13.1),
+            3: (0.5, 7.77),
+            4: (0.4, 5.86),
+            5: (0.35, 4.99),
+            6: (0.35, 4.99),
+            7: (0.4, 5.86),
+            8: (0.5, 7.77),
+            9: (0.5, 13.1),
+            10: (0.8, 53.3)
+        }
+        d_min, d_max = panel_crop.get(panel)
+        mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=d_min, XMax=d_max)
+
+        if panel == 0:
+            for i in range(Wish.NUM_PANELS):
                 wfocname = "w" + str(number) + "-" + str(i) + "foc"
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.80, XMax=53.3)
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=13.1)
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=7.77)
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.40, XMax=5.86)
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.35, XMax=4.99)
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.35, XMax=4.99)
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.40, XMax=5.86)
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=7.77)
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=13.1)
-                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.80, XMax=53.3)
-        # print "will try to load an empty with the name:"
-        print WISH_getempty(panel, SEsample, emptySEcycle)
-        if (panel == 0):
-            for i in range(1, 11):
+                mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=d_min, XMax=d_max)
+            for i in range(Wish.NUM_PANELS):
                 wfocname = "w" + str(number) + "-" + str(i) + "foc"
-                mantid.LoadNexusProcessed(Filename=WISH_getempty(i, SEsample, emptySEcycle), OutputWorkspace="empty")
-                mantid.RebinToWorkspace(WorkspaceToRebin="empty", WorkspaceToMatch=wfocname, OutputWorkspace="empty")
-                # Minus(LHSWorkspace=wfocname,RHSWorkspace="empty",OutputWorkspace=wfocname)
-                mantid.DeleteWorkspace("empty")
-                print "will try to load a vanadium with the name:" + WISH_getvana(i, SEvana, cyclevana)
-                mantid.LoadNexusProcessed(Filename=WISH_getvana(i, SEvana, cyclevana), OutputWorkspace="vana")
+                print "will try to load a vanadium with the name:" + self.get_vanadium(i,  cyclevana)
+                mantid.LoadNexusProcessed(Filename=self.get_vanadium(i,  cyclevana), OutputWorkspace="vana")
                 mantid.RebinToWorkspace(WorkspaceToRebin="vana", WorkspaceToMatch=wfocname, OutputWorkspace="vana")
                 mantid.Divide(LHSWorkspace=wfocname, RHSWorkspace="vana", OutputWorkspace=wfocname)
                 mantid.DeleteWorkspace("vana")
@@ -392,17 +250,13 @@ def Wish_Run(input_mode, calibration_folder, input_dir, output_dir, deleteWorksp
                                             NaNError=0.0,
                                             InfinityValue=0.0, InfinityError=0.0)
                 mantid.SaveGSS(InputWorkspace=wfocname,
-                               Filename=WISH_userdir() + str(number) + "-" + str(i) + ext + ".gss",
+                               Filename=self.user_directory + str(number) + "-" + str(i) + ext + ".gss",
                                Append=False, Bank=1)
-                mantid.SaveFocusedXYE(wfocname, WISH_userdir() + str(number) + "-" + str(i) + ext + ".dat")
-                mantid.SaveNexusProcessed(wfocname, WISH_userdir() + str(number) + "-" + str(i) + ext + ".nxs")
+                mantid.SaveFocusedXYE(wfocname, self.user_directory + str(number) + "-" + str(i) + ext + ".dat")
+                mantid.SaveNexusProcessed(wfocname, self.user_directory + str(number) + "-" + str(i) + ext + ".nxs")
         else:
-            mantid.LoadNexusProcessed(Filename=WISH_getempty(panel, SEsample, emptySEcycle), OutputWorkspace="empty")
-            mantid.RebinToWorkspace(WorkspaceToRebin="empty", WorkspaceToMatch=wfocname, OutputWorkspace="empty")
-            # Minus(LHSWorkspace=wfocname,RHSWorkspace="empty",OutputWorkspace=wfocname)
-            mantid.DeleteWorkspace("empty")
-            print "will try to load a vanadium with the name:" + WISH_getvana(panel, SEvana, cyclevana)
-            mantid.LoadNexusProcessed(Filename=WISH_getvana(panel, SEvana, cyclevana), OutputWorkspace="vana")
+            print "will try to load a vanadium with the name:" + self.get_vanadium(panel,  cyclevana)
+            mantid.LoadNexusProcessed(Filename=self.get_vanadium(panel, cyclevana), OutputWorkspace="vana")
             mantid.RebinToWorkspace(WorkspaceToRebin="vana", WorkspaceToMatch=wfocname, OutputWorkspace="vana")
             mantid.Divide(LHSWorkspace=wfocname, RHSWorkspace="vana", OutputWorkspace=wfocname)
             mantid.DeleteWorkspace("vana")
@@ -410,47 +264,37 @@ def Wish_Run(input_mode, calibration_folder, input_dir, output_dir, deleteWorksp
             mantid.ReplaceSpecialValues(InputWorkspace=wfocname, OutputWorkspace=wfocname, NaNValue=0.0, NaNError=0.0,
                                         InfinityValue=0.0, InfinityError=0.0)
             mantid.SaveGSS(InputWorkspace=wfocname,
-                           Filename=WISH_userdir() + str(number) + "-" + str(panel) + ext + ".gss",
+                           Filename=self.user_directory + str(number) + "-" + str(panel) + ext + ".gss",
                            Append=False, Bank=1)
-            mantid.SaveFocusedXYE(wfocname, WISH_userdir() + str(number) + "-" + str(panel) + ext + ".dat")
-            mantid.SaveNexusProcessed(wfocname, WISH_userdir() + str(number) + "-" + str(panel) + ext + ".nxs")
+            mantid.SaveFocusedXYE(wfocname, self.user_directory + str(number) + "-" + str(panel) + ext + ".dat")
+            mantid.SaveNexusProcessed(wfocname, self.user_directory + str(number) + "-" + str(panel) + ext + ".nxs")
         return wfocname
 
     # Create a corrected vanadium (normalise,corrected for attenuation and empty, strip peaks) and
     # save a a nexus processed file.
     # It looks like smoothing of 100 works quite well
-    def WISH_createvan(van, empty, panel, smoothing, vh, vr, cycle_van="09_3", cycle_empty="09_3"):
-        WISH_setdatadir("/archive/ndxwish/Instrument/data/cycle_" + cycle_van + "/")
-        wvan = WISH_read(van, panel, "nxs_event")
-        WISH_setdatadir("/archive/ndxwish/Instrument/data/cycle_" + cycle_empty + "/")
-        wempty = WISH_read(empty, panel, "nxs_event")
-        mantid.Minus(LHSWorkspace=wvan, RHSWorkspace=wempty, OutputWorkspace=wvan)
-        print "read van and empty"
-        mantid.DeleteWorkspace(wempty)
-        mantid.ConvertUnits(InputWorkspace=wvan, OutputWorkspace=wvan, Target="Wavelength", EMode="Elastic")
-        mantid.CylinderAbsorption(InputWorkspace=wvan, OutputWorkspace="T",
-                                  CylinderSampleHeight=str(vh), CylinderSampleRadius=str(vr),
-                                  AttenuationXSection="4.8756",
-                                  ScatteringXSection="5.16", SampleNumberDensity="0.07118",
-                                  NumberOfSlices="10", NumberOfAnnuli="10", NumberOfWavelengthPoints="25",
-                                  ExpMethod="Normal")
-        mantid.Divide(LHSWorkspace=wvan, RHSWorkspace="T", OutputWorkspave=wvan)
-        mantid.DeleteWorkspace("T")
-        mantid.ConvertUnits(InputWorkspace=wvan, OutputWorkspace=wvan, Target="TOF", EMode="Elastic")
-        vanfoc = WISH_focus(wvan, panel)
-        mantid.DeleteWorkspace(wvan)
-        # StripPeaks(vanfoc,vanfoc)
-        # SmoothData(vanfoc,vanfoc,str(smoothing))
-        return
-
-    def WISH_createempty(empty, panel):
-        wempty = WISH_read(empty, panel, "raw")
-        emptyfoc = WISH_focus(wempty, panel)
-        return emptyfoc
-
-    def WISH_monitors(rb, ext):
-        data_dir = WISH_dir()
-        file = WISH_getfilename(rb, ext)
+    #def WISH_createvan(self, van, empty, panel, smoothing, vh, vr, cycle_van="09_3", cycle_empty="09_3"):
+    #    WISH_setdatadir("/archive/ndxwish/Instrument/data/cycle_" + cycle_van + "/")
+    #    wvan = WISH_read(van, panel, "nxs_event")
+    #    WISH_setdatadir("/archive/ndxwish/Instrument/data/cycle_" + cycle_empty + "/")
+    #    mantid.ConvertUnits(InputWorkspace=wvan, OutputWorkspace=wvan, Target="Wavelength", EMode="Elastic")
+    #    mantid.CylinderAbsorption(InputWorkspace=wvan, OutputWorkspace="T",
+    #                              CylinderSampleHeight=str(vh), CylinderSampleRadius=str(vr),
+    #                              AttenuationXSection="4.8756",
+    #                              ScatteringXSection="5.16", SampleNumberDensity="0.07118",
+    #                              NumberOfSlices="10", NumberOfAnnuli="10", NumberOfWavelengthPoints="25",
+    #                              ExpMethod="Normal")
+    #    mantid.Divide(LHSWorkspace=wvan, RHSWorkspace="T", OutputWorkspave=wvan)
+    #    mantid.DeleteWorkspace("T")
+    #    mantid.ConvertUnits(InputWorkspace=wvan, OutputWorkspace=wvan, Target="TOF", EMode="Elastic")
+    #    vanfoc = WISH_focus(wvan, panel)
+    #    mantid.DeleteWorkspace(wvan)
+    #    # StripPeaks(vanfoc,vanfoc)
+    #    # SmoothData(vanfoc,vanfoc,str(smoothing))
+    #    return
+
+    def WISH_monitors(self, rb, ext):
+        file = self.get_file_name(rb, ext)
         wout = "w" + str(rb)
         print "reading File..." + file
         mantid.LoadRaw(Filename=file, OutputWorkspace=wout, SpectrumMin=str(1), SpectrumMax=str(5), LoadLogFiles="0")
@@ -458,123 +302,31 @@ def Wish_Run(input_mode, calibration_folder, input_dir, output_dir, deleteWorksp
         mantid.ConvertToDistribution(wout)
         return wout
 
-    def WISH_PH_TOF(runnumber, tubemin):
-        min = 6 + (tubenumber - 1) * 128
-        max = min + 128
-        file = WISH_getfilename(runnumber, tubemin)
-        output = "Run" + str(runnumber) + "tube" + str(tubenumber)
-        w = WISH_read(number, panel, ext)
-        print "file read and normalized"
-        if (absorb):
-            mantid.ConvertUnits(w, w, "Wavelength")
-            mantid.CylinderAbsorption(InputWorkspace=w, OutputWorkspace="T",
-                                      CylinderSampleHeight=h, CylinderSampleRadius=r, AttenuationXSection=Xa,
-                                      ScatteringXSection=Xs, SampleNumberDensity=nd,
-                                      NumberOfSlices="10", NumberOfAnnuli="10", NumberOfWavelengthPoints="25",
-                                      ExpMethod="Normal")
-            mantid.Divide(w, "T", w)
-            mantid.DeleteWorkspace("T")
-            mantid.ConvertUnits(InputWorkspace=w, OutputWorkspace=w, Target="TOF", EMode="Elastic")
-        wfoc = WISH_focus(w, panel)
-        print "focussing done!"
-        if type(number) is int:
-            wfocname = "w" + str(number) + "-" + str(panel) + "foc"
-            if (len(ext) > 9):
-                label, tmin, tmax = split_string_event(ext)
-                wfocname = "w" + str(number) + "-" + str(panel) + "_" + label + "foc"
-        else:
-            n1, n2 = split_string(number)
-            wfocname = "w" + str(n1) + "_" + str(n2) + "-" + str(panel) + "foc"
-        if (panel == 1):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.80, XMax=53.3)
-        elif (panel == 2):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=13.1)
-        elif (panel == 3):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=7.77)
-        elif (panel == 4):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.40, XMax=5.86)
-        elif (panel == 5):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.35, XMax=4.99)
-        if (panel == 10):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.80, XMax=53.3)
-        elif (panel == 9):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=13.1)
-        elif (panel == 8):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.50, XMax=7.77)
-        elif (panel == 7):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.40, XMax=5.86)
-        elif (panel == 6):
-            mantid.CropWorkspace(InputWorkspace=wfocname, OutputWorkspace=wfocname, XMin=0.35, XMax=4.99)
-        # print "will try to load an empty with the name:"
-        print WISH_getempty(panel, SEsample, emptySEcycle)
-        if (panel == 0):
-            for i in range(1, 11):
-                mantid.LoadNexusProcessed(Filename=WISH_getempty(i, SEsample, emptySEcycle), OutputWorkspace="empty")
-                mantid.RebinToWorkspace(WorkspaceToRebin="empty", WorkspaceToMatch=wfocname, OutputWorkspace="empty")
-                mantid.Minus(LHSWorkspace=wfocname, RHSWorkspace="empty", OutputWorkspace=wfocname)
-                mantid.DeleteWorkspace("empty")
-                print "will try to load a vanadium with the name:" + WISH_getvana(i, SEvana, cyclevana)
-                mantid.LoadNexusProcessed(Filename=WISH_getvana(i, SEvana, cyclevana), OutputWorkspace="vana")
-                mantid.RebinToWorkspace(WorkspaceToRebin="vana", WorkspaceToMatch=wfocname, OutputWorkspace="vana")
-                mantid.Divide(LHSWorkspace=wfocname, RHSWorkspace="vana", OutputWorkspace=wfocname)
-                mantid.DeleteWorkspace("vana")
-                mantid.ConvertUnits(InputWorkspace=wfocname, OutputWorkspace=wfocname, Target="TOF", EMode="Elastic")
-        #			SaveGSS(InputWorkspace=wfocname,Filename=WISH_userdir()+str(number)+"-"+str(i)+ext+".gss",Append=False,Bank=1)
-        #			SaveFocusedXYE(wfocname,WISH_userdir()+str(number)+"-"+str(i)+ext+".dat")
-        else:
-            mantid.LoadNexusProcessed(Filename=WISH_getempty(panel, SEsample, emptySEcycle), OutputWorkspace="empty")
-            mantid.RebinToWorkspace(WorkspaceToRebin="empty", WorkspaceToMatch=wfocname, OutputWorkspace="empty")
-            # Minus(LHSWorkspace=wfocname,RHSWorkspace="empty",OutputWorkspace=wfocname)
-            mantid.DeleteWorkspace("empty")
-            print "will try to load a vanadium with the name:" + WISH_getvana(panel, SEvana, cyclevana)
-            mantid.LoadNexusProcessed(Filename=WISH_getvana(panel, SEvana, cyclevana), OutputWorkspace="vana")
-            mantid.RebinToWorkspace(WorkspaceToRebin="vana", WorkspaceToMatch=wfocname, OutputWorkspace="vana")
-            mantid.Divide(LHSWorkspace=wfocname, RHSWorkspace="vana", OutputWorkspace=wfocname)
-            mantid.DeleteWorkspace("vana")
-            mantid.ConvertUnits(InputWorkspace=wfocname, OutputWorkspace=wfocname, Target="TOF", EMode="Elastic")
-        #		SaveGSS(InputWorkspace=wfocname,Filename=WISH_userdir()+str(number)+"-"+str(panel)+ext+".gss",Append=False,Bank=1)
-        #		SaveFocusedXYE(wfocname,WISH_userdir()+str(number)+"-"+str(panel)+ext+".dat")
-        return wfocname
-        LoadRaw(Filename=file, OutputWorkspace=output, spectrummin=str(min), spectrummax=str(max), LoadLogFiles="0")
-        Integration(InputWorkspace=output, OutputWorkspace=output + "int")
-        g = plotTimeBin(output + "int", 0)
-
-    # Smoothing the incident beam monitor using a spline function.  Regions around Bragg edges are masked, before fitting with a  spline function.
-    # Returns a smooth monitor spectrum
-
-    def WISH_process_incidentmon(number, ext, spline_terms=20, debug=False):
+    def WISH_process_incidentmon(self, number, ext, spline_terms=20):
         if type(number) is int:
-            fname = WISH_getfilename(number, ext)
+            fname = self.get_file_name(number, ext)
             works = "monitor" + str(number)
-            if (ext == "raw"):
-                works = "monitor" + str(number)
-                mantid.LoadRaw(Filename=fname, OutputWorkspace=works, SpectrumMin=4, SpectrumMax=4, LoadLogFiles="0")
-            if (ext[0] == "s"):
-                works = "monitor" + str(number)
-                mantid.LoadRaw(Filename=fname, OutputWorkspace=works, SpectrumMin=4, SpectrumMax=4, LoadLogFiles="0")
-            if (ext == "nxs"):
-                works = "monitor" + str(number)
-                mantid.LoadNexus(Filename=fname, OutputWorkspace=works, SpectrumMin=4, SpectrumMax=4)
-            if (ext[0:9] == "nxs_event"):
+            shared_load_files(ext, fname, works, 4, 4, True)
+            if ext[:9] == "nxs_event":
                 temp = "w" + str(number) + "_monitors"
                 works = "w" + str(number) + "_monitor4"
                 mantid.Rebin(InputWorkspace=temp, OutputWorkspace=temp, Params='6000,-0.00063,110000',
                              PreserveEvents=False)
                 mantid.ExtractSingleSpectrum(InputWorkspace=temp, OutputWorkspace=works, WorkspaceIndex=3)
         else:
-            n1, n2 = split_string(number)
+            n1, n2 = self.split_string(number)
             works = "monitor" + str(n1) + "_" + str(n2)
-            fname = WISH_getfilename(n1, ext)
+            fname = self.get_file_name(n1, ext)
             works1 = "monitor" + str(n1)
             mantid.LoadRaw(Filename=fname, OutputWorkspace=works1, SpectrumMin=4, SpectrumMax=4, LoadLogFiles="0")
-            fname = WISH_getfilename(n2, ext)
+            fname = self.get_file_name(n2, ext)
             works2 = "monitor" + str(n2)
             mantid.LoadRaw(Filename=fname, OutputWorkspace=works2, SpectrumMin=4, SpectrumMax=4, LoadLogFiles="0")
             mantid.MergeRuns(InputWorkspaces=works1 + "," + works2, OutputWorkspace=works)
             mantid.DeleteWorkspace(works1)
             mantid.DeleteWorkspace(works2)
         mantid.ConvertUnits(InputWorkspace=works, OutputWorkspace=works, Target="Wavelength", Emode="Elastic")
-        lmin, lmax = WISH_getlambdarange()
+        lmin, lmax = Wish.LAMBDA_RANGE
         mantid.CropWorkspace(InputWorkspace=works, OutputWorkspace=works, XMin=lmin, XMax=lmax)
         ex_regions = n.zeros((2, 4))
         ex_regions[:, 0] = [4.57, 4.76]
@@ -582,134 +334,98 @@ def Wish_Run(input_mode, calibration_folder, input_dir, output_dir, deleteWorksp
         ex_regions[:, 2] = [2.75, 2.91]
         ex_regions[:, 3] = [2.24, 2.50]
         mantid.ConvertToDistribution(works)
-        if (debug):
-            x, y, z = mtdplt.getnarray(works, 0)
-            p.plot(x, y)
+
         for reg in range(0, 4):
             mantid.MaskBins(InputWorkspace=works, OutputWorkspace=works, XMin=ex_regions[0, reg],
                             XMax=ex_regions[1, reg])
-        if (debug):
-            x, y, z = mtdplt.getnarray(works, LoadRaw0)
-            p.plot(x, y)
-            
+
         mantid.SplineBackground(InputWorkspace=works, OutputWorkspace=works, WorkspaceIndex=0, NCoeff=spline_terms)
-        if (debug):
-            x, y, z = mtdplt.getnarray(works, 0)
-            p.plot(x, y)
-        p.show()
+
         mantid.SmoothData(InputWorkspace=works, OutputWorkspace=works, NPoints=40)
         mantid.ConvertFromDistribution(works)
         return works
 
     # removes the peaks in a vanadium  run, then performs a spline and a smooth
-    def Removepeaks_spline_smooth_empty(works, panel, debug=False):
-        if (panel == 1):
-            splineterms = 0
+    def Removepeaks_spline_smooth_empty(self, works, panel):
+        if panel == 1:
             smoothterms = 30
-        if (panel == 2):
-            splineterms = 0
+        if panel == 2:
             smoothterms = 10
-        if (panel == 3):
-            splineterms = 0
+        if panel == 3:
             smoothterms = 15
-        if (panel == 4):
-            splineterms = 0
+        if panel == 4:
             smoothterms = 15
-        if (panel == 5):
-            splineterms = 0
+        if panel == 5:
             smoothterms = 10
-        if (debug):
-            x, y, z = getnarray(works, 0)
-            p.plot(x, y)
-        if (splineterms != 0):
-            mantid.SplineBackground(InputWorkspace=works, OutputWorkspace=works, WorkspaceIndex=0, NCoeff=splineterms)
-        if (debug):
-            x, y, z = getnarray(works, 0)
-            p.plot(x, y)
-            mantid.SmoothData(InputWorkspace=works, OutputWorkspace=works, NPoints=smoothterms)
-        if (debug):
-            x, y, z = getnarray(works, 0)
-            p.plot(x, y)
-        p.show()
+
+        mantid.SmoothData(InputWorkspace=works, OutputWorkspace=works, NPoints=smoothterms)
+
         return works
 
-    def split_string_event(t):
-        # this assumes the form nxs_event_label_tmin_tmax
-        indx_ = []
-        for i in range(10, len(t)):
-            if (t[i] == "_"):
-                indx_.append(i)
-        label = t[10:indx_[0]]
-        tmin = t[indx_[0] + 1:indx_[1]]
-        tmax = t[indx_[1] + 1:len(t)]
-        return label, tmin, tmax
-
-    def minus_emptycans(runno, empty):
-        panel_list = ['-1foc', '-2foc', '-3foc', '-4foc', '-5foc', '-6foc', '-7foc', '-8foc', '-9foc', '-10foc',
-                      '-1_10foc',
-                      '-2_9foc', '-3_8foc', '-4_7foc', '-5_6foc']
-        for p in panel_list:
-            mantid.Minus(LHSWorkspace='w' + str(runno) + p, RHSWorkspace='w' + str(empty) + p,
-                         OutputWorkspace='w' + str(runno) + 'minus' + str(empty) + p)
-            mantid.ConvertUnits(InputWorkspace='w' + str(runno) + 'minus' + str(empty) + p,
-                                OutputWorkspace='w' + str(runno) + 'minus' + str(empty) + p + '-d', Target='dSpacing')
-            mantid.SaveGSS("w" + str(runno) + 'minus' + str(empty) + p, WISH_userdir() + str(i) + p + ".gss",
-                           Append=False, Bank=1)
 
-    WISH_startup("mp43", "18_1")
-
-    for i in range(40503, 40504):
-        for j in range(1, 11):
-            wout = WISH_process(i, j, "raw", "candlestick", "11_4", "candlestick", "11_4", absorb=True, nd=0.025,
-                                Xs=5.463,
-                                Xa=2.595, h=4.0, r=0.55)
-            mantid.ConvertUnits(InputWorkspace=wout, OutputWorkspace=wout + "-d", Target="dSpacing", EMode="Elastic")
-        #	SaveGSS("w"+str(i)+"-1foc",WISH_userdir()+str(i)+"-1foc"+".gss",Append=False,Bank=1)
-        #	SaveFocusedXYE("w"+str(i)+"-1foc",WISH_userdir()+str(i)+"-1foc"+".dat")
-        #	SaveGSS("w"+str(i)+"-2foc",WISH_userdir()+str(i)+"-2foc"+".gss",Append=False,Bank=1)
-        #	SaveFocusedXYE("w"+str(i)+"-2foc",WISH_userdir()+str(i)+"-2foc"+".dat")
-        mantid.RebinToWorkspace(WorkspaceToRebin="w" + str(i) + "-6foc", WorkspaceToMatch="w" + str(i) + "-5foc",
-                                OutputWorkspace="w" + str(i) + "-6foc", PreserveEvents='0')
-        mantid.Plus(LHSWorkspace="w" + str(i) + "-5foc", RHSWorkspace="w" + str(i) + "-6foc",
-                    OutputWorkspace="w" + str(i) + "-5_6foc")
-        mantid.ConvertUnits(InputWorkspace="w" + str(i) + "-5_6foc", OutputWorkspace="w" + str(i) + "-5_6foc" + "-d",
-                            Target="dSpacing", EMode="Elastic")
-        mantid.SaveGSS("w" + str(i) + "-5_6foc", WISH_userdir() + str(i) + "-5_6raw" + ".gss", Append=False, Bank=1)
-        mantid.SaveFocusedXYE("w" + str(i) + "-5_6foc", WISH_userdir() + str(i) + "-5_6raw" + ".dat")
-        mantid.SaveNexusProcessed("w" + str(i) + "-5_6foc", WISH_userdir() + str(i) + "-5_6raw" + ".nxs")
-        mantid.RebinToWorkspace(WorkspaceToRebin="w" + str(i) + "-7foc", WorkspaceToMatch="w" + str(i) + "-4foc",
-                                OutputWorkspace="w" + str(i) + "-7foc", PreserveEvents='0')
-        mantid.Plus(LHSWorkspace="w" + str(i) + "-4foc", RHSWorkspace="w" + str(i) + "-7foc",
-                    OutputWorkspace="w" + str(i) + "-4_7foc")
-        mantid.ConvertUnits(InputWorkspace="w" + str(i) + "-4_7foc", OutputWorkspace="w" + str(i) + "-4_7foc" + "-d",
-                            Target="dSpacing", EMode="Elastic")
-        mantid.SaveGSS("w" + str(i) + "-4_7foc", WISH_userdir() + str(i) + "-4_7raw" + ".gss", Append=False, Bank=1)
-        mantid.SaveFocusedXYE("w" + str(i) + "-4_7foc", WISH_userdir() + str(i) + "-4_7raw" + ".dat")
-        mantid.SaveNexusProcessed("w" + str(i) + "-4_7foc", WISH_userdir() + str(i) + "-4_7raw" + ".nxs")
-        mantid.RebinToWorkspace(WorkspaceToRebin="w" + str(i) + "-8foc", WorkspaceToMatch="w" + str(i) + "-3foc",
-                                OutputWorkspace="w" + str(i) + "-8foc", PreserveEvents='0')
-        mantid.Plus(LHSWorkspace="w" + str(i) + "-3foc", RHSWorkspace="w" + str(i) + "-8foc",
-                    OutputWorkspace="w" + str(i) + "-3_8foc")
-        mantid.ConvertUnits(InputWorkspace="w" + str(i) + "-3_8foc", OutputWorkspace="w" + str(i) + "-3_8foc" + "-d",
-                            Target="dSpacing", EMode="Elastic")
-        mantid.SaveGSS("w" + str(i) + "-3_8foc", WISH_userdir() + str(i) + "-3_8raw" + ".gss", Append=False, Bank=1)
-        mantid.SaveFocusedXYE("w" + str(i) + "-3_8foc", WISH_userdir() + str(i) + "-3_8raw" + ".dat")
-        mantid.SaveNexusProcessed("w" + str(i) + "-3_8foc", WISH_userdir() + str(i) + "-3_8raw" + ".nxs")
-        mantid.RebinToWorkspace(WorkspaceToRebin="w" + str(i) + "-9foc", WorkspaceToMatch="w" + str(i) + "-2foc",
-                                OutputWorkspace="w" + str(i) + "-9foc", PreserveEvents='0')
-        mantid.Plus(LHSWorkspace="w" + str(i) + "-2foc", RHSWorkspace="w" + str(i) + "-9foc",
-                    OutputWorkspace="w" + str(i) + "-2_9foc")
-        mantid.ConvertUnits(InputWorkspace="w" + str(i) + "-2_9foc", OutputWorkspace="w" + str(i) + "-2_9foc" + "-d",
-                            Target="dSpacing", EMode="Elastic")
-        mantid.SaveGSS("w" + str(i) + "-2_9foc", WISH_userdir() + str(i) + "-2_9raw" + ".gss", Append=False, Bank=1)
-        mantid.SaveFocusedXYE("w" + str(i) + "-2_9foc", WISH_userdir() + str(i) + "-2_9raw" + ".dat")
-        mantid.SaveNexusProcessed("w" + str(i) + "-2_9foc", WISH_userdir() + str(i) + "-2_9raw" + ".nxs")
-        mantid.RebinToWorkspace(WorkspaceToRebin="w" + str(i) + "-10foc", WorkspaceToMatch="w" + str(i) + "-1foc",
-                                OutputWorkspace="w" + str(i) + "-10foc", PreserveEvents='0')
-        mantid.Plus(LHSWorkspace="w" + str(i) + "-1foc", RHSWorkspace="w" + str(i) + "-10foc",
-                    OutputWorkspace="w" + str(i) + "-1_10foc")
-        mantid.ConvertUnits(InputWorkspace="w" + str(i) + "-1_10foc", OutputWorkspace="w" + str(i) + "-1_10foc" + "-d",
-                            Target="dSpacing", EMode="Elastic")
-        mantid.SaveGSS("w" + str(i) + "-1_10foc", WISH_userdir() + str(i) + "-1_10raw" + ".gss", Append=False, Bank=1)
-        mantid.SaveFocusedXYE("w" + str(i) + "-1_10foc", WISH_userdir() + str(i) + "-1_10raw" + ".dat")
-        mantid.SaveNexusProcessed("w" + str(i) + "-1_10foc", WISH_userdir() + str(i) + "-1_10raw" + ".nxs")
+
+    def reduce(self):
+
+        self.startup("18_1")
+        for i in range(40503, 40504):
+            self.datafile = self.get_file_name(i, "raw")
+            for j in range(5, 7):
+                wout = self.WISH_process(i, j, "raw", "11_4", absorb=True, nd=0.025, Xs=5.463, Xa=2.595, h=4.0, r=0.55)
+                mantid.ConvertUnits(InputWorkspace=wout, OutputWorkspace=wout + "-d", Target="dSpacing", EMode="Elastic")
+
+            for panel in range(5, 6):
+                self.save_combined_panel(i, panel)
+
+    def save_combined_panel(self, run, panel):
+        panel_combination = {
+            5: "6",
+            4: "7",
+            3: "8",
+            2: "9",
+            1: "10"
+        }
+        input_workspace1 = "w{0}-{1}foc".format(run, panel)
+        input_workspace2 = "w{0}-{1}foc".format(run, panel_combination.get(panel))
+        combined = "{0}{1}-{2}_{3}foc{4}".format("{0}", run, panel, panel_combination.get(panel), "{1}")
+        combined_save = combined.format("", "{}")
+        combined_ws = combined.format("w", "")
+
+        mantid.RebinToWorkspace(WorkspaceToRebin=input_workspace2, WorkspaceToMatch=input_workspace1,
+                                OutputWorkspace=input_workspace2, PreserveEvents='0')
+        mantid.Plus(LHSWorkspace=input_workspace1, RHSWorkspace=input_workspace2,
+                    OutputWorkspace=combined_ws)
+        mantid.ConvertUnits(InputWorkspace=combined_ws, OutputWorkspace=combined_ws + "-d",
+                            Target="dSpacing",
+                            EMode="Elastic")
+
+        mantid.SaveGSS(combined_ws, os.path.join(self.user_directory, combined_save.format("raw.gss")),
+                       Append=False,
+                       Bank=1)
+        mantid.SaveFocusedXYE(combined_ws,
+                              os.path.join(self.user_directory, combined_save.format("raw.dat")))
+        mantid.SaveNexusProcessed(combined_ws, os.path.join(self.user_directory, combined_save.format("raw.nxs")))
+
+
+def split_string_event(t):
+    # this assumes the form nxs_event_label_tmin_tmax
+    indx_ = []
+    for i in range(10, len(t)):
+        if (t[i] == "_"):
+            indx_.append(i)
+    label = t[10:indx_[0]]
+    tmin = t[indx_[0] + 1:indx_[1]]
+    tmax = t[indx_[1] + 1:len(t)]
+    return label, tmin, tmax
+
+def shared_load_files(extension, filename, output, spectrum_max, spectrum_min, is_monitor):
+    if not (extension == "nxs" or extension == "raw" or extension[0] == "s"):
+        return False
+    if extension == "nxs":
+        mantid.Load(Filename=filename, OutputWorkspace=output, SpectrumMin=spectrum_min,
+                    SpectrumMax=spectrum_min)
+    else:
+        mantid.LoadRaw(Filename=filename, OutputWorkspace=output, SpectrumMin=spectrum_min, SpectrumMax=spectrum_max,
+                       LoadLogFiles="0")
+    if not is_monitor:
+        mantid.MaskBins(InputWorkspace=output,  OutputWorkspace=output, XMin=99900, XMax=106000)
+    return True