diff --git a/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp b/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp index ca141a21a80ff24e776a4e271f9ebe075f84c709..68f16203dc7ba0e2bc4503e6d504b5462ad706bb 100644 --- a/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp +++ b/Framework/CurveFitting/src/Algorithms/QENSFitSequential.cpp @@ -10,6 +10,7 @@ #include "MantidKernel/BoundedValidator.h" #include "MantidKernel/ListValidator.h" #include "MantidKernel/MandatoryValidator.h" +#include "MantidKernel/UnitFactory.h" #include <boost/cast.hpp> #include <boost/regex.hpp> @@ -278,6 +279,36 @@ createGroup(const std::vector<MatrixWorkspace_sptr> &workspaces) { group->addWorkspace(workspace); return group; } + +IAlgorithm_sptr createProcessIndirectFitParametersAlgorithm( + ITableWorkspace_sptr parameterWorkspace, const std::string &xAxisUnit, + const std::vector<std::string> ¶meterNames) { + auto pifp = + AlgorithmManager::Instance().create("ProcessIndirectFitParameters"); + pifp->setAlwaysStoreInADS(false); + pifp->setProperty("InputWorkspace", parameterWorkspace); + pifp->setProperty("ColumnX", "axis-1"); + pifp->setProperty("XAxisUnit", xAxisUnit); + pifp->setProperty("ParameterNames", parameterNames); + return pifp; +} + +WorkspaceGroup_sptr +runParameterProcessingWithGrouping(IAlgorithm &processingAlgorithm, + const std::vector<std::size_t> &grouping) { + std::vector<MatrixWorkspace_sptr> results; + results.reserve(grouping.size() - 1); + for (auto i = 0u; i < grouping.size() - 1; ++i) { + processingAlgorithm.setProperty("StartRowIndex", + static_cast<int>(grouping[i])); + processingAlgorithm.setProperty("EndRowIndex", + static_cast<int>(grouping[i + 1]) - 1); + processingAlgorithm.setProperty("OutputWorkspace", "__Result"); + processingAlgorithm.execute(); + results.push_back(processingAlgorithm.getProperty("OutputWorkspace")); + } + return createGroup(results); +} } // namespace namespace Mantid { @@ -345,6 +376,13 @@ void QENSFitSequential::init() { "or values using the notation described in the description section of " "the help page."); + std::vector<std::string> unitOptions = UnitFactory::Instance().getKeys(); + unitOptions.emplace_back(""); + declareProperty("ResultXAxisUnit", "MomentumTransfer", + boost::make_shared<StringListValidator>(unitOptions), + "The unit to assign to the X Axis of the result workspace, " + "defaults to MomentumTransfer"); + declareProperty(make_unique<WorkspaceProperty<WorkspaceGroup>>( "OutputWorkspace", "", Direction::Output), "The output result workspace(s)"); @@ -610,23 +648,14 @@ std::vector<std::size_t> QENSFitSequential::getDatasetGrouping( WorkspaceGroup_sptr QENSFitSequential::processIndirectFitParameters( ITableWorkspace_sptr parameterWorkspace, const std::vector<std::size_t> &grouping) { - auto pifp = - createChildAlgorithm("ProcessIndirectFitParameters", 0.91, 0.95, true); - pifp->setProperty("InputWorkspace", parameterWorkspace); - pifp->setProperty("ColumnX", "axis-1"); - pifp->setProperty("XAxisUnit", "MomentumTransfer"); - pifp->setProperty("ParameterNames", getFitParameterNames()); + Progress logAdderProg(this, 0.91, 0.95, 1); - std::vector<MatrixWorkspace_sptr> results; - results.reserve(grouping.size() - 1); - for (auto i = 0u; i < grouping.size() - 1; ++i) { - pifp->setProperty("StartRowIndex", static_cast<int>(grouping[i])); - pifp->setProperty("EndRowIndex", static_cast<int>(grouping[i + 1]) - 1); - pifp->setProperty("OutputWorkspace", "__Result"); - pifp->executeAsChildAlg(); - results.push_back(pifp->getProperty("OutputWorkspace")); - } - return createGroup(results); + std::string const xAxisUnit = getProperty("ResultXAxisUnit"); + auto pifp = createProcessIndirectFitParametersAlgorithm( + parameterWorkspace, xAxisUnit, getFitParameterNames()); + auto group = runParameterProcessingWithGrouping(*pifp, grouping); + logAdderProg.report("Result workspace created."); + return group; } ITableWorkspace_sptr diff --git a/Framework/CurveFitting/src/Algorithms/QENSFitSimultaneous.cpp b/Framework/CurveFitting/src/Algorithms/QENSFitSimultaneous.cpp index 84a58c0e23b2b921e85e64e1f60f4cfa6eae3a54..d3d640f72fb04a8896f1d2e8f7cf56380df44e58 100644 --- a/Framework/CurveFitting/src/Algorithms/QENSFitSimultaneous.cpp +++ b/Framework/CurveFitting/src/Algorithms/QENSFitSimultaneous.cpp @@ -14,6 +14,7 @@ #include "MantidKernel/BoundedValidator.h" #include "MantidKernel/Exception.h" #include "MantidKernel/StartsWithValidator.h" +#include "MantidKernel/UnitFactory.h" #include <boost/algorithm/string/join.hpp> @@ -374,6 +375,13 @@ void QENSFitSimultaneous::initConcrete() { "Convolution are output convolved\n" "with corresponding resolution"); + std::vector<std::string> unitOptions = UnitFactory::Instance().getKeys(); + unitOptions.emplace_back(""); + declareProperty("ResultXAxisUnit", "MomentumTransfer", + boost::make_shared<StringListValidator>(unitOptions), + "The unit to assign to the X Axis of the result workspace, " + "defaults to MomentumTransfer"); + declareProperty(make_unique<WorkspaceProperty<WorkspaceGroup>>( "OutputWorkspace", "", Direction::Output), "The output result workspace(s)"); @@ -492,8 +500,7 @@ WorkspaceGroup_sptr QENSFitSimultaneous::processIndirectFitParameters( const std::vector<std::size_t> &grouping) { Progress logAdderProg(this, 0.91, 0.95, 1); - auto const xAxisUnit = - parameterWorkspace->getColumn(0)->isNumber() ? "MomentumTransfer" : ""; + std::string const xAxisUnit = getProperty("ResultXAxisUnit"); auto pifp = createProcessIndirectFitParametersAlgorithm( parameterWorkspace, xAxisUnit, getFitParameterNames()); auto group = runParameterProcessingWithGrouping(*pifp, grouping); diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp b/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp index 7e47cc6d0a6f1859c88246b7dfe218c5f0930756..7b2761733685a5ac893db1a047176620c15c2a6e 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp +++ b/qt/scientific_interfaces/Indirect/IndirectFittingModel.cpp @@ -542,6 +542,12 @@ void IndirectFittingModel::setDefaultParameterValue(const std::string &name, m_defaultParameters[dataIndex][name] = ParameterValue(value); } +void IndirectFittingModel::addFitProperties( + Mantid::API::IAlgorithm &algorithm) const { + algorithm.setProperty("Function", getFittingFunction()); + algorithm.setProperty("ResultXAxisUnit", getResultXAxisUnit()); +} + void IndirectFittingModel::addOutput(IAlgorithm_sptr fitAlgorithm) { addOutput(fitAlgorithm, m_fittingData.begin(), m_fittingData.end()); } @@ -680,6 +686,10 @@ IndirectFittingModel::createDefaultParameters(std::size_t) const { return std::unordered_map<std::string, ParameterValue>(); } +std::string IndirectFittingModel::getResultXAxisUnit() const { + return "MomentumTransfer"; +} + boost::optional<ResultLocation> IndirectFittingModel::getResultLocation(std::size_t index, std::size_t spectrum) const { @@ -736,7 +746,7 @@ IAlgorithm_sptr IndirectFittingModel::getSingleFit(std::size_t dataIndex, const auto exclude = fitData->excludeRegionsVector(spectrum); auto fitAlgorithm = simultaneousFitAlgorithm(); - fitAlgorithm->setProperty("Function", getFittingFunction()); + addFitProperties(*fitAlgorithm); addInputDataToSimultaneousFit(fitAlgorithm, workspace, spectrum, range, exclude, ""); fitAlgorithm->setProperty("OutputWorkspace", @@ -764,9 +774,9 @@ IAlgorithm_sptr IndirectFittingModel::createSequentialFit( IFunction_sptr function, const std::string &input, IndirectFitData *initialFitData) const { auto fitAlgorithm = sequentialFitAlgorithm(); + addFitProperties(*fitAlgorithm); fitAlgorithm->setProperty("Input", input); fitAlgorithm->setProperty("OutputWorkspace", sequentialFitOutputName()); - fitAlgorithm->setProperty("Function", function); fitAlgorithm->setProperty("PassWSIndexToFunction", true); const auto range = initialFitData->getRange(0); @@ -783,7 +793,7 @@ IAlgorithm_sptr IndirectFittingModel::createSequentialFit( IAlgorithm_sptr IndirectFittingModel::createSimultaneousFit(IFunction_sptr function) const { auto fitAlgorithm = simultaneousFitAlgorithm(); - fitAlgorithm->setProperty("Function", function); + addFitProperties(*fitAlgorithm); addInputDataToSimultaneousFit(fitAlgorithm, m_fittingData); fitAlgorithm->setProperty("OutputWorkspace", simultaneousFitOutputName()); return fitAlgorithm; @@ -792,7 +802,7 @@ IndirectFittingModel::createSimultaneousFit(IFunction_sptr function) const { IAlgorithm_sptr IndirectFittingModel::createSimultaneousFitWithEqualRange( IFunction_sptr function) const { auto fitAlgorithm = simultaneousFitAlgorithm(); - fitAlgorithm->setProperty("Function", function); + addFitProperties(*fitAlgorithm); auto exclude = vectorFromString<double>(getExcludeRegion(0, 0)); addInputDataToSimultaneousFit(fitAlgorithm, m_fittingData, diff --git a/qt/scientific_interfaces/Indirect/IndirectFittingModel.h b/qt/scientific_interfaces/Indirect/IndirectFittingModel.h index 0468c835c9f55cceb5e497a4d6a1aecaeedc5cf5..a4b82195abd21dca7b7f0eeffa1190855edfa174 100644 --- a/qt/scientific_interfaces/Indirect/IndirectFittingModel.h +++ b/qt/scientific_interfaces/Indirect/IndirectFittingModel.h @@ -161,8 +161,12 @@ private: virtual std::unordered_map<std::string, ParameterValue> createDefaultParameters(std::size_t index) const; + virtual std::string getResultXAxisUnit() const; + bool isPreviousModelSelected() const; + void addFitProperties(Mantid::API::IAlgorithm &algorithm) const; + virtual IndirectFitOutput createFitOutput(Mantid::API::WorkspaceGroup_sptr resultGroup, Mantid::API::ITableWorkspace_sptr parameterTable, diff --git a/qt/scientific_interfaces/Indirect/JumpFitModel.cpp b/qt/scientific_interfaces/Indirect/JumpFitModel.cpp index c3e5b8c30aab13b54e0bc2d91b1f24076129eb44..e6a2acdfadffce909d5c9c96b039aab99f02a944 100644 --- a/qt/scientific_interfaces/Indirect/JumpFitModel.cpp +++ b/qt/scientific_interfaces/Indirect/JumpFitModel.cpp @@ -326,6 +326,8 @@ std::string JumpFitModel::singleFitOutputName(std::size_t, std::size_t) const { return sequentialFitOutputName(); } +std::string JumpFitModel::getResultXAxisUnit() const { return ""; } + std::string JumpFitModel::constructOutputName() const { auto name = createOutputName("%1%_FofQFit_" + m_fitType, "", 0); auto position = name.find("_Result"); diff --git a/qt/scientific_interfaces/Indirect/JumpFitModel.h b/qt/scientific_interfaces/Indirect/JumpFitModel.h index 41b2e7bdbfff064394da5910c871c78ef74d8d20..6d6b89a049b43f27da9403a9a0a327ee590359cf 100644 --- a/qt/scientific_interfaces/Indirect/JumpFitModel.h +++ b/qt/scientific_interfaces/Indirect/JumpFitModel.h @@ -42,6 +42,7 @@ public: std::string singleFitOutputName(std::size_t index, std::size_t spectrum) const override; + private: std::string constructOutputName() const; bool allWorkspacesEqual(Mantid::API::MatrixWorkspace_sptr workspace) const; @@ -50,6 +51,7 @@ private: const std::string &hwhmName); std::unordered_map<std::string, JumpFitParameters>::const_iterator findJumpFitParameters(std::size_t dataIndex) const; + std::string getResultXAxisUnit() const override; std::string m_fitType; std::unordered_map<std::string, JumpFitParameters> m_jumpParameters; diff --git a/qt/scientific_interfaces/Indirect/MSDFitModel.cpp b/qt/scientific_interfaces/Indirect/MSDFitModel.cpp index 2c2dcda6807f6cdf3677847abda4106b2f8b9933..2f93d1fb000716ac3828022c4743504082158eb3 100644 --- a/qt/scientific_interfaces/Indirect/MSDFitModel.cpp +++ b/qt/scientific_interfaces/Indirect/MSDFitModel.cpp @@ -26,6 +26,8 @@ std::string MSDFitModel::singleFitOutputName(std::size_t index, spectrum); } +std::string MSDFitModel::getResultXAxisUnit() const { return ""; } + } // namespace IDA } // namespace CustomInterfaces } // namespace MantidQt diff --git a/qt/scientific_interfaces/Indirect/MSDFitModel.h b/qt/scientific_interfaces/Indirect/MSDFitModel.h index 56a64679be88933dee8aca41c8dc528b3747b5a2..45244aff4d8082a3c706eb8e0433865605f09784 100644 --- a/qt/scientific_interfaces/Indirect/MSDFitModel.h +++ b/qt/scientific_interfaces/Indirect/MSDFitModel.h @@ -17,6 +17,8 @@ public: std::size_t spectrum) const override; private: + std::string getResultXAxisUnit() const override; + std::string m_fitType; };