Skip to content

Commit

Permalink
Refs #5549 fix final rebin
Browse files Browse the repository at this point in the history
  • Loading branch information
VickieLynch committed Jul 20, 2012
1 parent e699bfe commit 4e51c2c
Showing 1 changed file with 77 additions and 53 deletions.
130 changes: 77 additions & 53 deletions Code/Mantid/Framework/WorkflowAlgorithms/src/AlignAndFocusPowder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#include "MantidDataObjects/MaskWorkspace.h"
#include "MantidDataObjects/OffsetsWorkspace.h"
#include "MantidDataObjects/Workspace2D.h"
#include "MantidKernel/ArrayProperty.h"
#include "MantidKernel/RebinParamsValidator.h"
#include "MantidKernel/System.h"

using Mantid::Geometry::Instrument_const_sptr;
Expand Down Expand Up @@ -59,7 +61,10 @@ void AlignAndFocusPowder::init()
"Optional: An OffsetsWorkspace workspace giving the detector calibration values.");
declareProperty(new WorkspaceProperty<MatrixWorkspace>("MaskWorkspace","",Direction::Input, PropertyMode::Optional),
"Optional: An Workspace workspace giving which detectors are masked.");
declareProperty("Params","-0.004","The binning parameters: Positive is linear bins, negative is logarithmic (Default:-0.004)");
declareProperty(new ArrayProperty<double>("Params", boost::make_shared<RebinParamsValidator>()),
"A comma separated list of first bin boundary, width, last bin boundary. Optionally\n"
"this can be followed by a comma and more widths and last boundary pairs.\n"
"Negative width values indicate logarithmic binning.");
declareProperty("Dspacing", true,"Bin in Dspace. (Default true)");
declareProperty("CropMin", 0.0, "Minimum for Cropping TOF or dspace axis. (Default 0.) ");
declareProperty("CropMax", 0.0, "Maximum for Croping TOF or dspace axis. (Default 0.) ");
Expand Down Expand Up @@ -96,7 +101,7 @@ void AlignAndFocusPowder::exec()
// retrieve the properties
m_inputW = getProperty("InputWorkspace");
m_eventW = boost::dynamic_pointer_cast<EventWorkspace>( m_inputW );
if (m_eventW != NULL)
if ((m_eventW != NULL))
{
if (getProperty("PreserveEvents"))
{
Expand All @@ -110,7 +115,7 @@ void AlignAndFocusPowder::exec()
OffsetsWorkspace_sptr offsetsWS = getProperty("OffsetsWorkspace");
MatrixWorkspace_sptr maskWS = getProperty("MaskWorkspace");
GroupingWorkspace_sptr groupWS = getProperty("GroupingWorkspace");
std::string params = getProperty("Params");
std::vector<double> params=getProperty("Params");
bool dspace = getProperty("DSpacing");
double xmin = getProperty("CropMin");
double xmax = getProperty("CropMax");
Expand All @@ -120,7 +125,6 @@ void AlignAndFocusPowder::exec()
double tmin = getProperty("TMin");
double tmax = getProperty("TMax");


// Get the input workspace
if ((!offsetsWS || !maskWS || !groupWS) && !calFileName.empty())
{
Expand All @@ -137,19 +141,25 @@ void AlignAndFocusPowder::exec()
AnalysisDataService::Instance().addOrReplace(instName+"_offsets", offsetsWS);
AnalysisDataService::Instance().addOrReplace(instName+"_mask", maskWS);
}
// Now create the output workspace
m_outputW = getProperty("OutputWorkspace");
if ( m_outputW != m_inputW )
{
m_outputW = WorkspaceFactory::Instance().create(m_inputW);
}

if (xmin > 0. || xmax > 0.)
{
API::IAlgorithm_sptr cropAlg = createSubAlgorithm("CropWorkspace");
cropAlg->setProperty("InputWorkspace", m_inputW);
cropAlg->setProperty("InputWorkspace", m_outputW);
if (xmin > 0.)cropAlg->setProperty("Xmin", xmin);
if (xmax > 0.)cropAlg->setProperty("Xmax", xmax);
cropAlg->executeAsSubAlg();
m_inputW = cropAlg->getProperty("OutputWorkspace");
m_outputW = cropAlg->getProperty("OutputWorkspace");
}

API::IAlgorithm_sptr maskAlg = createSubAlgorithm("MaskDetectors");
maskAlg->setProperty("Workspace", m_inputW);
maskAlg->setProperty("Workspace", m_outputW);
maskAlg->setProperty("MaskedWorkspace", instName+"_mask");
maskAlg->executeAsSubAlg();
m_outputW = maskAlg->getProperty("Workspace");
Expand All @@ -161,7 +171,6 @@ void AlignAndFocusPowder::exec()
rebinAlg->setProperty("Params",params);
rebinAlg->executeAsSubAlg();
m_outputW = rebinAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}

API::IAlgorithm_sptr alignAlg = createSubAlgorithm("AlignDetectors");
Expand All @@ -172,23 +181,22 @@ void AlignAndFocusPowder::exec()

if(LRef > 0. || minwl > 0. || DIFCref > 0.)
{
API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
convertAlg->setProperty("InputWorkspace", m_outputW);
convertAlg->setProperty("Target","TOF");
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");
API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
convertAlg->setProperty("InputWorkspace", m_outputW);
convertAlg->setProperty("Target","TOF");
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");
}

if(LRef > 0.)
{
API::IAlgorithm_sptr removeAlg = createSubAlgorithm("RemoveLowResTOF");
API::IAlgorithm_sptr removeAlg = createSubAlgorithm("UnwrapSNS");
removeAlg->setProperty("InputWorkspace", m_outputW);
removeAlg->setProperty("LRef",LRef);
removeAlg->setProperty("Tmin",tmin);
removeAlg->setProperty("Tmax",tmax);
removeAlg->executeAsSubAlg();
m_outputW = removeAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}

if(minwl > 0.)
Expand All @@ -199,7 +207,6 @@ void AlignAndFocusPowder::exec()
removeAlg->setProperty("Tmin",tmin);
removeAlg->executeAsSubAlg();
m_outputW = removeAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}
else if(DIFCref > 0.)
{
Expand All @@ -210,16 +217,15 @@ void AlignAndFocusPowder::exec()
removeAlg->setProperty("Tmin",tmin);
removeAlg->executeAsSubAlg();
m_outputW = removeAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}

if(LRef > 0. || minwl > 0. || DIFCref > 0.)
{
API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
convertAlg->setProperty("InputWorkspace", m_outputW);
convertAlg->setProperty("Target","dSpacing");
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");
API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
convertAlg->setProperty("InputWorkspace", m_outputW);
convertAlg->setProperty("Target","dSpacing");
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");
}

if(dspace)
Expand All @@ -229,7 +235,6 @@ void AlignAndFocusPowder::exec()
rebinAlg->setProperty("Params",params);
rebinAlg->executeAsSubAlg();
m_outputW = rebinAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}

API::IAlgorithm_sptr focusAlg = createSubAlgorithm("DiffractionFocussing");
Expand All @@ -245,6 +250,8 @@ void AlignAndFocusPowder::exec()
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");

params.erase(params.begin());
params.pop_back();
API::IAlgorithm_sptr rebinAlg = createSubAlgorithm("Rebin");
rebinAlg->setProperty("InputWorkspace", m_outputW);
rebinAlg->setProperty("Params",params);
Expand All @@ -267,7 +274,7 @@ void AlignAndFocusPowder::execEvent()
OffsetsWorkspace_sptr offsetsWS = getProperty("OffsetsWorkspace");
MatrixWorkspace_sptr maskWS = getProperty("MaskWorkspace");
GroupingWorkspace_sptr groupWS = getProperty("GroupingWorkspace");
std::string params = getProperty("Params");
std::vector<double> params=getProperty("Params");
bool dspace = getProperty("DSpacing");
double xmin = getProperty("CropMin");
double xmax = getProperty("CropMax");
Expand Down Expand Up @@ -299,55 +306,75 @@ void AlignAndFocusPowder::execEvent()
AnalysisDataService::Instance().addOrReplace(instName+"_offsets", offsetsWS);
AnalysisDataService::Instance().addOrReplace(instName+"_mask", maskWS);
}
Progress progress(this,0.0,1.0,m_eventW->getNumberHistograms());

// generate the output workspace pointer
m_outputW = this->getProperty("OutputWorkspace");
EventWorkspace_sptr m_outputEventW;
if (m_outputW == m_inputW)
m_outputEventW = boost::dynamic_pointer_cast<EventWorkspace>(m_outputW);
else
{
//Make a brand new EventWorkspace
m_outputEventW = boost::dynamic_pointer_cast<EventWorkspace>(
WorkspaceFactory::Instance().create("EventWorkspace", m_eventW->getNumberHistograms(), 2, 1));
//Copy geometry over.
WorkspaceFactory::Instance().initializeFromParent(m_eventW, m_outputEventW, false);
//You need to copy over the data as well.
m_outputEventW->copyDataFrom( (*m_eventW) );

//Cast to the matrixOutputWS and save it
m_outputW = boost::dynamic_pointer_cast<MatrixWorkspace>(m_outputEventW);
}

if (filterBadPulses)
{
API::IAlgorithm_sptr filterAlg = createSubAlgorithm("FilterBadPulses");
filterAlg->setProperty("InputWorkspace", m_eventW);
filterAlg->setProperty("InputWorkspace", m_outputEventW);
filterAlg->executeAsSubAlg();
m_eventW = filterAlg->getProperty("OutputWorkspace");
m_outputEventW = filterAlg->getProperty("OutputWorkspace");
}

if (removePromptPulseWidth > 0.)
{
API::IAlgorithm_sptr filterAlg = createSubAlgorithm("RemovePromptPulse");
filterAlg->setProperty("InputWorkspace", m_eventW);
filterAlg->setProperty("InputWorkspace", m_outputEventW);
filterAlg->setProperty("Width", removePromptPulseWidth);
filterAlg->executeAsSubAlg();
m_eventW = filterAlg->getProperty("OutputWorkspace");
m_outputEventW = filterAlg->getProperty("OutputWorkspace");
}

if (!filterName.empty())
{
API::IAlgorithm_sptr filterLogsAlg = createSubAlgorithm("FilterByLogValue");
filterLogsAlg->setProperty("InputWorkspace", m_eventW);
filterLogsAlg->setProperty("InputWorkspace", m_outputEventW);
filterLogsAlg->setProperty("LogName", filterName);
filterLogsAlg->setProperty("MinimumValue", filterMin);
filterLogsAlg->setProperty("MaximumValue", filterMax);
filterLogsAlg->executeAsSubAlg();
m_eventW = filterLogsAlg->getProperty("OutputWorkspace");
m_outputEventW = filterLogsAlg->getProperty("OutputWorkspace");
}

API::IAlgorithm_sptr compressAlg = createSubAlgorithm("CompressEvents");
compressAlg->setProperty("InputWorkspace", m_eventW);
compressAlg->setProperty("InputWorkspace", m_outputEventW);
compressAlg->setProperty("Tolerance",tolerance);
compressAlg->executeAsSubAlg();
m_eventW = compressAlg->getProperty("OutputWorkspace");
m_outputEventW = compressAlg->getProperty("OutputWorkspace");

m_eventW->sortAll(TOF_SORT, NULL);
m_outputEventW->sortAll(TOF_SORT, NULL);

if (xmin > 0. || xmax > 0.)
{
API::IAlgorithm_sptr cropAlg = createSubAlgorithm("CropWorkspace");
cropAlg->setProperty("InputWorkspace", m_inputW);
cropAlg->setProperty("InputWorkspace", m_outputW);
if (xmin > 0.)cropAlg->setProperty("Xmin", xmin);
if (xmax > 0.)cropAlg->setProperty("Xmax", xmax);
cropAlg->executeAsSubAlg();
m_inputW = cropAlg->getProperty("OutputWorkspace");
}

API::IAlgorithm_sptr maskAlg = createSubAlgorithm("MaskDetectors");
maskAlg->setProperty("Workspace", m_inputW);
maskAlg->setProperty("Workspace", m_outputW);
maskAlg->setProperty("MaskedWorkspace", instName+"_mask");
maskAlg->executeAsSubAlg();
m_outputW = maskAlg->getProperty("Workspace");
Expand All @@ -359,7 +386,6 @@ void AlignAndFocusPowder::execEvent()
rebinAlg->setProperty("Params",params);
rebinAlg->executeAsSubAlg();
m_outputW = rebinAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}

API::IAlgorithm_sptr alignAlg = createSubAlgorithm("AlignDetectors");
Expand All @@ -370,23 +396,22 @@ void AlignAndFocusPowder::execEvent()

if(LRef > 0. || minwl > 0. || DIFCref > 0.)
{
API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
convertAlg->setProperty("InputWorkspace", m_outputW);
convertAlg->setProperty("Target","TOF");
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");
API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
convertAlg->setProperty("InputWorkspace", m_outputW);
convertAlg->setProperty("Target","TOF");
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");
}

if(LRef > 0.)
{
API::IAlgorithm_sptr removeAlg = createSubAlgorithm("RemoveLowResTOF");
API::IAlgorithm_sptr removeAlg = createSubAlgorithm("UnwrapSNS");
removeAlg->setProperty("InputWorkspace", m_outputW);
removeAlg->setProperty("LRef",LRef);
removeAlg->setProperty("Tmin",tmin);
removeAlg->setProperty("Tmax",tmax);
removeAlg->executeAsSubAlg();
m_outputW = removeAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}

if(minwl > 0.)
Expand All @@ -397,7 +422,6 @@ void AlignAndFocusPowder::execEvent()
removeAlg->setProperty("Tmin",tmin);
removeAlg->executeAsSubAlg();
m_outputW = removeAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}
else if(DIFCref > 0.)
{
Expand All @@ -408,16 +432,15 @@ void AlignAndFocusPowder::execEvent()
removeAlg->setProperty("Tmin",tmin);
removeAlg->executeAsSubAlg();
m_outputW = removeAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}

if(LRef > 0. || minwl > 0. || DIFCref > 0.)
{
API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
convertAlg->setProperty("InputWorkspace", m_outputW);
convertAlg->setProperty("Target","dSpacing");
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");
API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
convertAlg->setProperty("InputWorkspace", m_outputW);
convertAlg->setProperty("Target","dSpacing");
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");
}

if(dspace)
Expand All @@ -427,10 +450,9 @@ void AlignAndFocusPowder::execEvent()
rebinAlg->setProperty("Params",params);
rebinAlg->executeAsSubAlg();
m_outputW = rebinAlg->getProperty("OutputWorkspace");
setProperty("OutputWorkspace",m_outputW);
}

m_eventW->sortAll(TOF_SORT, NULL);
m_outputEventW->sortAll(TOF_SORT, NULL);

API::IAlgorithm_sptr focusAlg = createSubAlgorithm("DiffractionFocussing");
focusAlg->setProperty("InputWorkspace", m_outputW);
Expand All @@ -439,14 +461,16 @@ void AlignAndFocusPowder::execEvent()
focusAlg->executeAsSubAlg();
m_outputW = focusAlg->getProperty("OutputWorkspace");

m_eventW->sortAll(TOF_SORT, NULL);
m_outputEventW->sortAll(TOF_SORT, NULL);

API::IAlgorithm_sptr convertAlg = createSubAlgorithm("ConvertUnits");
convertAlg->setProperty("InputWorkspace", m_outputW);
convertAlg->setProperty("Target","TOF");
convertAlg->executeAsSubAlg();
m_outputW = convertAlg->getProperty("OutputWorkspace");

params.erase(params.begin());
params.pop_back();
API::IAlgorithm_sptr rebinAlg = createSubAlgorithm("Rebin");
rebinAlg->setProperty("InputWorkspace", m_outputW);
rebinAlg->setProperty("Params",params);
Expand Down

0 comments on commit 4e51c2c

Please sign in to comment.