Skip to content

Commit

Permalink
refs #8951. Move internals to Child Algorithms.
Browse files Browse the repository at this point in the history
This prevents orphaned workspaces from outliving the algorithm.
  • Loading branch information
OwenArnold committed Feb 13, 2014
1 parent fb31e74 commit 63c8631
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 36 deletions.
108 changes: 80 additions & 28 deletions Code/Mantid/Framework/PythonInterface/plugins/algorithms/Stitch1D.py
Expand Up @@ -41,6 +41,35 @@ def has_non_zero_errors(self, ws):
count = len(errors.nonzero()[0])
return count > 0


def __run_algorithm(self, name, **kwargs):
"""Run a named algorithm and return the
algorithm handle
Parameters:
name - The name of the algorithm
kwargs - A dictionary of property name:value pairs
"""
alg = AlgorithmManager.createUnmanaged(name)
alg.initialize()
alg.setChild(True)

if 'OutputWorkspace' in alg:
alg.setPropertyValue("OutputWorkspace","UNUSED_NAME_FOR_CHILD")

alg.setRethrows(True)
for key, value in kwargs.iteritems():
alg.setProperty(key, value)

alg.execute()
return alg

def __to_single_value_ws(self, value):
alg = self.__run_algorithm("CreateSingleValuedWorkspace", DataValue=value)
ws = alg.getProperty("OutputWorkspace").value
return ws


def __find_indexes_start_end(self, startOverlap, endOverlap, workspace):
a1=workspace.binIndexOf(startOverlap)
a2=workspace.binIndexOf(endOverlap)
Expand Down Expand Up @@ -104,8 +133,10 @@ def PyExec(self):

params = self.__create_rebin_parameters()
print params
lhs_rebinned = Rebin(InputWorkspace=self.getProperty("LHSWorkspace").value, Params=params)
rhs_rebinned = Rebin(InputWorkspace=self.getProperty("RHSWorkspace").value, Params=params)
alg = self.__run_algorithm("Rebin", InputWorkspace=self.getProperty("LHSWorkspace").value, Params=params)
lhs_rebinned = alg.getProperty("OutputWorkspace").value
alg = self.__run_algorithm("Rebin", InputWorkspace=self.getProperty("RHSWorkspace").value, Params=params)
rhs_rebinned = alg.getProperty("OutputWorkspace").value

xRange = lhs_rebinned.readX(0)
minX = xRange[0]
Expand All @@ -121,56 +152,77 @@ def PyExec(self):
a1, a2 = self.__find_indexes_start_end(startOverlap, endOverlap, lhs_rebinned)

if not useManualScaleFactor:
lhsOverlapIntegrated = Integration(InputWorkspace=lhs_rebinned, RangeLower=startOverlap, RangeUpper=endOverlap)
rhsOverlapIntegrated = Integration(InputWorkspace=rhs_rebinned, RangeLower=startOverlap, RangeUpper=endOverlap)

alg = self.__run_algorithm("Integration", InputWorkspace=lhs_rebinned, RangeLower=startOverlap, RangeUpper=endOverlap)
lhsOverlapIntegrated = alg.getProperty("OutputWorkspace").value
alg = self.__run_algorithm("Integration", InputWorkspace=rhs_rebinned, RangeLower=startOverlap, RangeUpper=endOverlap)
rhsOverlapIntegrated = alg.getProperty("OutputWorkspace").value

y1=lhsOverlapIntegrated.readY(0)
y2=rhsOverlapIntegrated.readY(0)
if scaleRHSWorkspace:
rhs_rebinned *= (lhsOverlapIntegrated/rhsOverlapIntegrated)
alg = self.__run_algorithm("Divide", LHSWorkspace=lhsOverlapIntegrated, RHSWorkspace=rhsOverlapIntegrated)
ratio = alg.getProperty("OutputWorkspace").value
alg = self.__run_algorithm("Multiply", LHSWorkspace=rhs_rebinned, RHSWorkspace=ratio)
rhs_rebinned = alg.getProperty("OutputWorkspace").value
scalefactor = y1[0]/y2[0]
else:
lhs_rebinned *= (rhsOverlapIntegrated/lhsOverlapIntegrated)

alg = self.__run_algorithm("Divide", RHSWorkspace=lhsOverlapIntegrated, LHSWorkspace=rhsOverlapIntegrated)
ratio = alg.getProperty("OutputWorkspace").value
alg = self.__run_algorithm("Multiply", LHSWorkspace=lhs_rebinned, RHSWorkspace=ratio)
lhs_rebinned = alg.getProperty("OutputWorkspace").value
scalefactor = y2[0]/y1[0]
DeleteWorkspace(lhsOverlapIntegrated)
DeleteWorkspace(rhsOverlapIntegrated)
else:
manualScaleFactorWS = self.__to_single_value_ws(manualScaleFactor)
if scaleRHSWorkspace:
rhs_rebinned *= manualScaleFactor
alg = self.__run_algorithm("Multiply", LHSWorkspace=rhs_rebinned, RHSWorkspace=manualScaleFactorWS)
rhs_rebinned = alg.getProperty("OutputWorkspace").value
else:
lhs_rebinned *= manualScaleFactor
alg = self.__run_algorithm("Multiply", LHSWorkspace=lhs_rebinned, RHSWorkspace=manualScaleFactorWS)
lhs_rebinned = alg.getProperty("OutputWorkspace").value
scalefactor = manualScaleFactor

# Mask out everything BUT the overlap region as a new workspace.
overlap1 = MultiplyRange(InputWorkspace=lhs_rebinned, StartBin=0,EndBin=a1,Factor=0)
overlap1 = MultiplyRange(InputWorkspace=overlap1,StartBin=a2,Factor=0)

alg = self.__run_algorithm("MultiplyRange", InputWorkspace=lhs_rebinned, StartBin=0,EndBin=a1,Factor=0)
overlap1 = alg.getProperty("OutputWorkspace").value
alg = self.__run_algorithm("MultiplyRange", InputWorkspace=overlap1,StartBin=a2,Factor=0)
overlap1 = alg.getProperty("OutputWorkspace").value
# Mask out everything BUT the overlap region as a new workspace.
overlap2 = MultiplyRange(InputWorkspace=rhs_rebinned,StartBin=0,EndBin=a1,Factor=0)#-1
overlap2 = MultiplyRange(InputWorkspace=overlap2,StartBin=a2,Factor=0)
alg = self.__run_algorithm("MultiplyRange", InputWorkspace=rhs_rebinned,StartBin=0,EndBin=a1,Factor=0)
overlap2 = alg.getProperty("OutputWorkspace").value
alg = self.__run_algorithm("MultiplyRange", InputWorkspace=overlap2,StartBin=a2,Factor=0)
overlap2 = alg.getProperty("OutputWorkspace").value

# Mask out everything AFTER the start of the overlap region
lhs_rebinned=MultiplyRange(InputWorkspace=lhs_rebinned, StartBin=a1+1, Factor=0)
alg = self.__run_algorithm("MultiplyRange", InputWorkspace=lhs_rebinned, StartBin=a1+1, Factor=0)
lhs_rebinned = alg.getProperty("OutputWorkspace").value

# Mask out everything BEFORE the end of the overlap region
rhs_rebinned=MultiplyRange(InputWorkspace=rhs_rebinned,StartBin=0,EndBin=a2-1,Factor=0)
alg = self.__run_algorithm("MultiplyRange",InputWorkspace=rhs_rebinned,StartBin=0,EndBin=a2-1,Factor=0)
rhs_rebinned = alg.getProperty("OutputWorkspace").value

# Calculate a weighted mean for the overlap region
overlapave = None
if self.has_non_zero_errors(overlap1) and self.has_non_zero_errors(overlap2):
overlapave = WeightedMean(InputWorkspace1=overlap1,InputWorkspace2=overlap2)
alg = self.__run_algorithm("WeightedMean", InputWorkspace1=overlap1,InputWorkspace2=overlap2)
overlapave = alg.getProperty("OutputWorkspace").value
else:
self.log().information("Using un-weighted mean for Stitch1D overlap mean")
overlapave = (overlap1 + overlap2)/2
# Calculate the mean.
alg = self.__run_algorithm("Plus", LHSWorkspace=overlap1, RHSWorkspace=overlap2)
sum = alg.getProperty("OutputWorkspace").value
denominator = self.__to_single_value_ws(2.0)
alg = self.__run_algorithm("Divide", LHSWorkspace=sum, RHSWorkspace=denominator)

overlapave = alg.getProperty("OutputWorkspace").value

# Add the Three masked workspaces together to create a complete x-range
result = lhs_rebinned + overlapave + rhs_rebinned
RenameWorkspace(InputWorkspace=result, OutputWorkspace=self.getPropertyValue("OutputWorkspace"))

# Cleanup
DeleteWorkspace(lhs_rebinned)
DeleteWorkspace(rhs_rebinned)
DeleteWorkspace(overlap1)
DeleteWorkspace(overlap2)
DeleteWorkspace(overlapave)
alg = self.__run_algorithm("Plus", LHSWorkspace=lhs_rebinned, RHSWorkspace=overlapave)
result = alg.getProperty("OutputWorkspace").value
alg = self.__run_algorithm("Plus", LHSWorkspace=rhs_rebinned, RHSWorkspace=result)
result = alg.getProperty("OutputWorkspace").value
#RenameWorkspace(InputWorkspace=result, OutputWorkspace=self.getPropertyValue("OutputWorkspace"))

self.setProperty('OutputWorkspace', result)
self.setProperty('OutScaleFactor', scalefactor)
Expand Down
Expand Up @@ -62,8 +62,28 @@ def __input_or_safe_default(self, property_name, n_entries):

def __do_stitch_workspace(self, lhs_ws, rhs_ws, start_overlap, end_overlap, params, scale_rhs_ws, use_manual_scale_factor, manual_scale_factor):
out_name = lhs_ws.name() + rhs_ws.name()
out_ws, scale_factor = Stitch1D(LHSWorkspace=lhs_ws, RHSWorkspace=rhs_ws, StartOverlap=start_overlap, EndOverlap=end_overlap,
Params=params, ScaleRHSWorkspace=scale_rhs_ws, UseManualScaleFactor=use_manual_scale_factor, ManualScaleFactor=manual_scale_factor, OutputWorkspace=out_name)

alg = self.createChildAlgorithm("Stitch1D")
alg.initialize()
alg.setProperty("LHSWorkspace", lhs_ws)
alg.setProperty("RHSWorkspace", rhs_ws)
if start_overlap:
alg.setProperty("StartOverlap", start_overlap)
if end_overlap:
alg.setProperty("EndOverlap", end_overlap)
alg.setProperty("Params", params)
alg.setProperty("ScaleRHSWorkspace", scale_rhs_ws)
alg.setProperty("UseManualScaleFactor", use_manual_scale_factor)
if manual_scale_factor:
alg.setProperty("ManualScaleFactor", manual_scale_factor)
alg.setProperty("OutputWorkspace", "from_sub_alg" + out_name)
alg.execute()
out_ws = alg.getProperty("OutputWorkspace").value
scale_factor = alg.getProperty("OutScaleFactor").value


#out_ws, scale_factor = Stitch1D(LHSWorkspace=lhs_ws, RHSWorkspace=rhs_ws, StartOverlap=start_overlap, EndOverlap=end_overlap,
# Params=params, ScaleRHSWorkspace=scale_rhs_ws, UseManualScaleFactor=use_manual_scale_factor, ManualScaleFactor=manual_scale_factor, OutputWorkspace=out_name)
return (out_ws, scale_factor)

def __check_workspaces_are_common(self, input_workspace_names):
Expand Down Expand Up @@ -131,17 +151,21 @@ def PyExec(self):

out_name += ("_" + str(i+1))


startOverlaps = self.getProperty("StartOverlaps").value
endOverlaps = self.getProperty("EndOverlaps").value


stitched, scaleFactor = Stitch1DMany(InputWorkspaces=to_process, OutputWorkspace=out_name, StartOverlaps=startOverlaps, EndOverlaps=endOverlaps,
Params=params, ScaleRHSWorkspace=scaleRHSWorkspace, UseManualScaleFactor=useManualScaleFactor,
ManualScaleFactor=manualScaleFactor)

out_group_workspaces += out_group_separator + out_name
out_group_separator = comma_separator

out_group = GroupWorkspaces(InputWorkspaces=out_group_workspaces)
self.setProperty('OutputWorkspace', out_group)

out_workspace_name = self.getPropertyValue("OutputWorkspace")
out_group = GroupWorkspaces(InputWorkspaces=out_group_workspaces, OutputWorkspace=out_workspace_name)
self.setProperty("OutputWorkspace", out_group)

else:

Expand All @@ -153,7 +177,6 @@ def PyExec(self):
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)
self.setProperty('OutputWorkspace', lhsWS)
DeleteWorkspace(lhsWS)

# Iterate backwards through the workspaces.
else:
Expand All @@ -162,7 +185,6 @@ def PyExec(self):
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)
self.setProperty('OutputWorkspace', rhsWS)
DeleteWorkspace(rhsWS)

self.setProperty('OutScaleFactor', scaleFactor)
return None
Expand Down

0 comments on commit 63c8631

Please sign in to comment.