diff --git a/Framework/Algorithms/inc/MantidAlgorithms/ReflectometryReductionOneAuto2.h b/Framework/Algorithms/inc/MantidAlgorithms/ReflectometryReductionOneAuto2.h index 7b59d63b16054bfb3592c4d3021341e0249d4fba..bfc297e4ca12323e6d188d90810d61310abb68f7 100644 --- a/Framework/Algorithms/inc/MantidAlgorithms/ReflectometryReductionOneAuto2.h +++ b/Framework/Algorithms/inc/MantidAlgorithms/ReflectometryReductionOneAuto2.h @@ -35,9 +35,18 @@ public: bool processGroups() override; private: + // Utility class to store output workspace names + struct WorkspaceNames { + std::string iVsQ; + std::string iVsQBinned; + std::string iVsLam; + }; + void init() override; void exec() override; - // Set default names for output workspaces + std::string + getRunNumberForWorkspaceGroup(WorkspaceGroup_const_sptr workspace); + WorkspaceNames getOutputWorkspaceNames(); void setDefaultOutputWorkspaceNames(); /// Get the name of the detectors of interest based on processing instructions std::vector<std::string> diff --git a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp index 4a6ddcd9135ead281b38df1c827fb3499397d61f..b8ca368f44cf63d5269c9b68b07a692ea3f0ab3b 100644 --- a/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp +++ b/Framework/Algorithms/src/ReflectometryReductionOneAuto2.cpp @@ -172,22 +172,75 @@ ReflectometryReductionOneAuto2::validateInputs() { return results; } +std::string ReflectometryReductionOneAuto2::getRunNumberForWorkspaceGroup( + WorkspaceGroup_const_sptr group) { + // Return the run number for the first child workspace + if (!group) + throw std::runtime_error("Invalid workspace group type"); + + if (group->getNumberOfEntries() < 1) + throw std::runtime_error("Cannot run algorithm on empty group"); + + auto childWs = group->getItem(0); + auto childMatrixWs = boost::dynamic_pointer_cast<MatrixWorkspace>(childWs); + + if (!childMatrixWs) + throw std::runtime_error("Child workspace is not a MatrixWorkspace"); + + return getRunNumber(*childMatrixWs); +} + +// Get output workspace names from the user-specified properties, or default +// names +// if the properties were not specified +auto ReflectometryReductionOneAuto2::getOutputWorkspaceNames() + -> WorkspaceNames { + WorkspaceNames result; + MatrixWorkspace_const_sptr matrixWs = getProperty("InputWorkspace"); + + std::string runNumber; + if (matrixWs) + runNumber = getRunNumber(*matrixWs); + else { + // Casting to WorkspaceGroup doesn't work - I think because InputWorkspace + // is + // declared as a MatrixWorkspace - so get it from the ADS instead + auto groupWs = AnalysisDataService::Instance().retrieveWS<WorkspaceGroup>( + getPropertyValue("InputWorkspace")); + runNumber = getRunNumberForWorkspaceGroup(groupWs); + } + + if (isDefault("OutputWorkspaceBinned")) + result.iVsQBinned = OUTPUT_WORKSPACE_BINNED_DEFAULT_PREFIX + runNumber; + else + result.iVsQBinned = getPropertyValue("OutputWorkspaceBinned"); + + if (isDefault("OutputWorkspace")) + result.iVsQ = OUTPUT_WORKSPACE_DEFAULT_PREFIX + runNumber; + else + result.iVsQ = getPropertyValue("OutputWorkspace"); + + if (isDefault("OutputWorkspaceWavelength")) + result.iVsLam = OUTPUT_WORKSPACE_WAVELENGTH_DEFAULT_PREFIX + runNumber; + else + result.iVsLam = getPropertyValue("OutputWorkspaceWavelength"); + + return result; +} + // Set default names for output workspaces void ReflectometryReductionOneAuto2::setDefaultOutputWorkspaceNames() { bool const isDebug = getProperty("Debug"); - MatrixWorkspace_sptr ws = getProperty("InputWorkspace"); - auto const runNumber = getRunNumber(*ws); + auto outputNames = getOutputWorkspaceNames(); + if (isDefault("OutputWorkspaceBinned")) { - setPropertyValue("OutputWorkspaceBinned", - OUTPUT_WORKSPACE_BINNED_DEFAULT_PREFIX + runNumber); + setPropertyValue("OutputWorkspaceBinned", outputNames.iVsQBinned); } if (isDefault("OutputWorkspace")) { - setPropertyValue("OutputWorkspace", - OUTPUT_WORKSPACE_DEFAULT_PREFIX + runNumber); + setPropertyValue("OutputWorkspace", outputNames.iVsQ); } if (isDebug && isDefault("OutputWorkspaceWavelength")) { - setPropertyValue("OutputWorkspaceWavelength", - OUTPUT_WORKSPACE_WAVELENGTH_DEFAULT_PREFIX + runNumber); + setPropertyValue("OutputWorkspaceWavelength", outputNames.iVsLam); } } @@ -753,14 +806,8 @@ bool ReflectometryReductionOneAuto2::processGroups() { // Get our input workspace group auto group = AnalysisDataService::Instance().retrieveWS<WorkspaceGroup>( getPropertyValue("InputWorkspace")); - // Get name of IvsQ workspace (native binning) - const std::string outputIvsQ = getPropertyValue("OutputWorkspace"); - // Get name of IvsQ (native binning) workspace - const std::string outputIvsQBinned = - getPropertyValue("OutputWorkspaceBinned"); - // Get name of IvsLam workspace - const std::string outputIvsLam = - getPropertyValue("OutputWorkspaceWavelength"); + // Get the output workspace names + auto const output = getOutputWorkspaceNames(); // Create a copy of ourselves Algorithm_sptr alg = @@ -814,15 +861,15 @@ bool ReflectometryReductionOneAuto2::processGroups() { } } - std::vector<std::string> IvsQGroup, IvsQUnbinnedGroup, IvsLamGroup; + std::vector<std::string> IvsQBinnedGroup, IvsQGroup, IvsLamGroup; // Execute algorithm over each group member for (size_t i = 0; i < group->size(); ++i) { - const std::string IvsQName = outputIvsQ + "_" + std::to_string(i + 1); + const std::string IvsQName = output.iVsQ + "_" + std::to_string(i + 1); const std::string IvsQBinnedName = - outputIvsQBinned + "_" + std::to_string(i + 1); - const std::string IvsLamName = outputIvsLam + "_" + std::to_string(i + 1); + output.iVsQBinned + "_" + std::to_string(i + 1); + const std::string IvsLamName = output.iVsLam + "_" + std::to_string(i + 1); alg->setProperty("InputWorkspace", group->getItem(i)->getName()); alg->setProperty("Debug", true); @@ -848,14 +895,14 @@ bool ReflectometryReductionOneAuto2::processGroups() { groupAlg->setRethrows(true); if (!IvsLamGroup.empty()) { groupAlg->setProperty("InputWorkspaces", IvsLamGroup); - groupAlg->setProperty("OutputWorkspace", outputIvsLam); + groupAlg->setProperty("OutputWorkspace", output.iVsLam); groupAlg->execute(); } groupAlg->setProperty("InputWorkspaces", IvsQGroup); - groupAlg->setProperty("OutputWorkspace", outputIvsQ); + groupAlg->setProperty("OutputWorkspace", output.iVsQ); groupAlg->execute(); groupAlg->setProperty("InputWorkspaces", IvsQUnbinnedGroup); - groupAlg->setProperty("OutputWorkspace", outputIvsQBinned); + groupAlg->setProperty("OutputWorkspace", output.iVsQBinned); groupAlg->execute(); // Set other properties so they can be updated in the Reflectometry interface @@ -868,15 +915,15 @@ bool ReflectometryReductionOneAuto2::processGroups() { alg->getPropertyValue("MomentumTransferStep")); setPropertyValue("ScaleFactor", alg->getPropertyValue("ScaleFactor")); - setOutputWorkspaces(IvsLamGroup, outputIvsLam, IvsQGroup, outputIvsQBinned, - IvsQUnbinnedGroup, outputIvsQ); + setOutputWorkspaces(IvsLamGroup, output.iVsLam, IvsQGroup, output.iVsQBinned, + IvsQUnbinnedGroup, output.iVsQ); if (!polarizationAnalysisOn) { // No polarization analysis. Reduction stops here return true; } - applyPolarizationCorrection(outputIvsLam); + applyPolarizationCorrection(output.iVsLam); // Polarization correction may have changed the number of workspaces in the // groups @@ -890,11 +937,11 @@ bool ReflectometryReductionOneAuto2::processGroups() { alg->setProperty("SecondTransmissionRun", ""); alg->setProperty("CorrectionAlgorithm", "None"); - auto outputIvsLamNames = workspaceNamesInGroup(outputIvsLam); + auto outputIvsLamNames = workspaceNamesInGroup(output.iVsLam); for (size_t i = 0; i < outputIvsLamNames.size(); ++i) { - const std::string IvsQName = outputIvsQ + "_" + std::to_string(i + 1); + const std::string IvsQName = output.iVsQ + "_" + std::to_string(i + 1); const std::string IvsQBinnedName = - outputIvsQBinned + "_" + std::to_string(i + 1); + output.iVsQBinned + "_" + std::to_string(i + 1); const std::string IvsLamName = outputIvsLamNames[i]; // Find the spectrum processing instructions for ws index 0 @@ -914,8 +961,8 @@ bool ReflectometryReductionOneAuto2::processGroups() { } } - setOutputWorkspaces(IvsLamGroup, outputIvsLam, IvsQGroup, outputIvsQBinned, - IvsQUnbinnedGroup, outputIvsQ); + setOutputWorkspaces(IvsLamGroup, output.iVsLam, IvsQGroup, output.iVsQBinned, + IvsQUnbinnedGroup, output.iVsQ); return true; }