diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Stitch1DMany.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Stitch1DMany.py index 0df51343437f5cb9d66bc324e2d2ae671413640a..23711c51a6c9c48580c8586133cc3b7708caf723 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Stitch1DMany.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Stitch1DMany.py @@ -1,14 +1,12 @@ -#from mantid.simpleapi import * - from mantid.simpleapi import * from mantid.api import * from mantid.kernel import * import numpy as np -class Stitch1DMany(PythonAlgorithm): +class Stitch1DMany(DataProcessorAlgorithm): def category(self): - return "Reflectometry\\ISIS;PythonAlgorithms" + return "Reflectometry\\ISIS;" def name(self): return "Stitch1D" @@ -20,13 +18,13 @@ class Stitch1DMany(PythonAlgorithm): input_validator = StringMandatoryValidator() self.declareProperty(name="InputWorkspaces", defaultValue="", direction=Direction.Input, validator=input_validator, doc="Input workspaces") self.declareProperty(WorkspaceProperty("OutputWorkspace", "", Direction.Output), "Output stitched workspace") - self.declareProperty(FloatArrayProperty(name="StartOverlaps", values=[]), doc="Overlap in Q.") - self.declareProperty(FloatArrayProperty(name="EndOverlaps", values=[]), doc="End overlap in Q.") + self.declareProperty(FloatArrayProperty(name="StartOverlaps", values=[]), doc="Start overlaps for stitched workspaces.") + self.declareProperty(FloatArrayProperty(name="EndOverlaps", values=[]), doc="End overlap for stitched workspaces.") self.declareProperty(FloatArrayProperty(name="Params", validator=FloatArrayMandatoryValidator()), doc="Rebinning Parameters. See Rebin for format.") self.declareProperty(name="ScaleRHSWorkspace", defaultValue=True, doc="Scaling either with respect to workspace 1 or workspace 2.") self.declareProperty(name="UseManualScaleFactor", defaultValue=False, doc="True to use a provided value for the scale factor.") self.declareProperty(name="ManualScaleFactor", defaultValue=1.0, doc="Provided value for the scale factor.") - self.declareProperty(name="OutScaleFactor", defaultValue=-2.0, direction = Direction.Output, doc="The actual used value for the scaling factor.") + self.declareProperty(FloatArrayProperty(name="OutScaleFactors", direction = Direction.Output), doc="The actual used values for the scaling factors at each stitch step.") def __workspace_from_split_name(self, list_of_names, index): return mtd[list_of_names[index].strip()] @@ -115,7 +113,7 @@ class Stitch1DMany(PythonAlgorithm): raise ValueError("Wrong number of StartOverlaps, should be %i not %i" % (numberOfWorkspaces - 1, startOverlaps)) self.__check_workspaces_are_common(inputWorkspaces) - scaleFactor = None + scaleFactors = list() comma_separator = "," no_separator = str() @@ -142,10 +140,13 @@ class Stitch1DMany(PythonAlgorithm): startOverlaps = self.getProperty("StartOverlaps").value endOverlaps = self.getProperty("EndOverlaps").value - stitched, scaleFactor = Stitch1DMany(InputWorkspaces=to_process, OutputWorkspace=out_name, StartOverlaps=startOverlaps, EndOverlaps=endOverlaps, + stitched, scaleFactorsOfIndex = Stitch1DMany(InputWorkspaces=to_process, OutputWorkspace=out_name, StartOverlaps=startOverlaps, EndOverlaps=endOverlaps, Params=params, ScaleRHSWorkspace=scaleRHSWorkspace, UseManualScaleFactor=useManualScaleFactor, ManualScaleFactor=manualScaleFactor) - + # Flatten out scale factors. + for sf in scaleFactorsOfIndex: + scaleFactors.append(sf) + out_group_workspaces += out_group_separator + out_name out_group_separator = comma_separator @@ -162,6 +163,7 @@ class Stitch1DMany(PythonAlgorithm): for i in range(1, numberOfWorkspaces, 1): rhsWS = self.__workspace_from_split_name(inputWorkspaces, i) lhsWS, scaleFactor = self.__do_stitch_workspace(lhsWS, rhsWS, startOverlaps[i-1], endOverlaps[i-1], params, scaleRHSWorkspace, useManualScaleFactor, manualScaleFactor) + scaleFactors.append(scaleFactor) self.setProperty('OutputWorkspace', lhsWS) # Iterate backwards through the workspaces. @@ -170,9 +172,10 @@ class Stitch1DMany(PythonAlgorithm): for i in range(0, numberOfWorkspaces-1, 1): lhsWS = self.__workspace_from_split_name(inputWorkspaces, i) rhsWS, scaleFactor = Stitch1D(LHSWorkspace=lhsWS, RHSWorkspace=rhsWS, StartOverlap=startOverlaps[i-1], EndOverlap=endOverlaps[i-1], Params=params, ScaleRHSWorkspace=scaleRHSWorkspace, UseManualScaleFactor=useManualScaleFactor, ManualScaleFactor=manualScaleFactor) + scaleFactors.append(scaleFactor) self.setProperty('OutputWorkspace', rhsWS) - self.setProperty('OutScaleFactor', scaleFactor) + self.setProperty('OutScaleFactors', scaleFactors) return None diff --git a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/Stitch1DManyTest.py b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/Stitch1DManyTest.py index d76ebabd375ca4931a4d4a5c5d1aa138aee46070..aa4c26b171bec5a61a8ef31fb2bc94daab76fee5 100644 --- a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/Stitch1DManyTest.py +++ b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/Stitch1DManyTest.py @@ -96,8 +96,10 @@ class Stitch1DManyTest(unittest.TestCase): def test_stitches_two(self): stitchedViaStitchMany, scaleFactorMany = Stitch1DMany(InputWorkspaces='a, b', StartOverlaps=[-0.4], EndOverlaps=[0.4], Params=[0.2]) stitchedViaStitchTwo, scaleFactorTwo = Stitch1D(LHSWorkspace=self.a, RHSWorkspace=self.b, StartOverlap=-0.4, EndOverlap=0.4, Params=[0.2]) - self.assertEquals(scaleFactorTwo, scaleFactorMany) - + self.assertTrue(isinstance(scaleFactorMany, numpy.ndarray), "Should be returning a list of scale factors") + self.assertEqual(1, scaleFactorMany.size) + self.assertEquals(scaleFactorTwo, scaleFactorMany[0]) + expectedYData = [0,0,0,3,3,3,3,0,0,0] self.do_check_ydata(expectedYData, stitchedViaStitchMany) @@ -113,11 +115,13 @@ class Stitch1DManyTest(unittest.TestCase): ws1 = CreateWorkspace(UnitX="1/q", DataX=self.x, DataY=[3.0, 3.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], NSpec=1, DataE=self.e) ws2 = CreateWorkspace(UnitX="1/q", DataX=self.x, DataY=[0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 0.0], NSpec=1, DataE=self.e) ws3 = CreateWorkspace(UnitX="1/q", DataX=self.x, DataY=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0], NSpec=1, DataE=self.e) - stitchedViaStitchMany, sf = Stitch1DMany(InputWorkspaces='ws1, ws2, ws3', StartOverlaps=[-0.4,0.2], EndOverlaps=[-0.2,0.4], Params=0.2) + stitchedViaStitchMany, sfs = Stitch1DMany(InputWorkspaces='ws1, ws2, ws3', StartOverlaps=[-0.4,0.2], EndOverlaps=[-0.2,0.4], Params=0.2) expectedYData = [3,3,3,3,3,3,3,3,3,3] self.do_check_ydata(expectedYData, stitchedViaStitchMany) - self.assertEquals(3.0, round(sf, 6)) + self.assertEqual(2, sfs.size) + self.assertEquals(1.5, round(sfs[0], 6)) + self.assertEquals(3.0, round(sfs[1], 6)) DeleteWorkspace(ws1) DeleteWorkspace(ws2) @@ -143,10 +147,11 @@ class Stitch1DManyTest(unittest.TestCase): ws3 = CreateWorkspace(UnitX="1/q", DataX=self.x, DataY=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0], NSpec=1, DataE=self.e) input_group_1 = GroupWorkspaces(InputWorkspaces="%s,%s,%s" % (ws1.name(), ws2.name(), ws3.name())) input_group_2 = GroupWorkspaces(InputWorkspaces="%s,%s,%s" % (ws1.name(), ws2.name(), ws3.name())) - stitched, sf = Stitch1DMany(InputWorkspaces='%s,%s' % (input_group_1.name(), input_group_2.name()), Params=0.2) + stitched, sfs = Stitch1DMany(InputWorkspaces='%s,%s' % (input_group_1.name(), input_group_2.name()), Params=0.2) self.assertTrue(isinstance(stitched, WorkspaceGroup), "Output should be a group workspace") self.assertEqual(stitched.size(), 3, "Output should contain 3 workspaces") self.assertEqual(stitched.name(), "stitched", "Output not named correctly") + self.assertEquals(input_group_1.size(), sfs.size) DeleteWorkspace(input_group_1)