From a3e2f461ea8385ea5ac1dfc638c208b78f0d09bc Mon Sep 17 00:00:00 2001 From: Brandon Hewer <brandon.hewer@stfc.ac.uk> Date: Fri, 4 May 2018 10:40:38 +0100 Subject: [PATCH] Separate getFitParameterNames() into two functions Refs #22275 --- .../QENSFitSequential.h | 3 ++ .../src/QENSFitSequential.cpp | 35 +++++++++---------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Framework/WorkflowAlgorithms/inc/MantidWorkflowAlgorithms/QENSFitSequential.h b/Framework/WorkflowAlgorithms/inc/MantidWorkflowAlgorithms/QENSFitSequential.h index a8484cd5687..bce0351f005 100644 --- a/Framework/WorkflowAlgorithms/inc/MantidWorkflowAlgorithms/QENSFitSequential.h +++ b/Framework/WorkflowAlgorithms/inc/MantidWorkflowAlgorithms/QENSFitSequential.h @@ -7,6 +7,8 @@ #include "MantidAPI/WorkspaceGroup.h" #include "MantidKernel/IValidator.h" +#include <set> + namespace Mantid { namespace Algorithms { @@ -54,6 +56,7 @@ private: virtual bool throwIfElasticQConversionFails() const; virtual bool isFitParameter(const std::string ¶meterName) const; std::vector<std::string> getFitParameterNames() const; + std::set<std::string> getUniqueParameterNames() const; std::string getOutputBaseName() const; std::string getInputString( const std::vector<API::MatrixWorkspace_sptr> &workspaces) const; diff --git a/Framework/WorkflowAlgorithms/src/QENSFitSequential.cpp b/Framework/WorkflowAlgorithms/src/QENSFitSequential.cpp index f0d2812afd6..7b4067bcd52 100644 --- a/Framework/WorkflowAlgorithms/src/QENSFitSequential.cpp +++ b/Framework/WorkflowAlgorithms/src/QENSFitSequential.cpp @@ -16,7 +16,6 @@ #include <sstream> #include <stdexcept> #include <unordered_map> -#include <unordered_set> namespace { using namespace Mantid::API; @@ -68,19 +67,19 @@ struct ElasticQAppender { bool doThrow) { auto it = m_converted.find(workspace.get()); if (it != m_converted.end()) - m_elasticInput.emplace_back(it->second); + m_elasticInput.emplace_back(it->second()); else { auto elasticQ = convertToElasticQ( workspace, outputBase + std::to_string(m_converted.size() + 1), doThrow); m_elasticInput.emplace_back(elasticQ); - m_converted.insert(elasticQ.get()); + m_converted[workspace] = elasticQ.get(); } } private: std::vector<MatrixWorkspace_sptr> &m_elasticInput; - std::unordered_set<MatrixWorkspace *> m_converted; + std::unordered_map<MatrixWorkspace *, MatrixWorkspace_sptr> m_converted; }; std::vector<MatrixWorkspace_sptr> @@ -526,21 +525,21 @@ bool QENSFitSequential::isFitParameter(const std::string &) const { } std::vector<std::string> QENSFitSequential::getFitParameterNames() const { - IFunction_sptr function = getProperty("Function"); - - std::unordered_set<std::string> nameSet; - std::vector<std::string> names; - names.reserve(function->nParams()); - - for (auto i = 0u; i < function->nParams(); ++i) { - auto name = shortParameterName(function->parameterName(i)); + const auto uniqueParameters = getUniqueParameterNames(); + std::vector<std::string> parameters; + parameters.reserve(uniqueParameters.size()); + std::copy_if(uniqueParameters.begin(), uniqueParameters.end(), + std::back_inserter(parameters), + [](const std::string ¶meter) { return isFitParameter(parameter); }); + return parameters; +} - if (isFitParameter(name) && nameSet.find(name) == nameSet.end()) { - names.emplace_back(name); - nameSet.insert(name); - } - } - return names; +std::set<std::string> QENSFitSequential::getUniqueParameterNames() const { + IFunction_sptr function = getProperty("Function"); + std::set<std::string> nameSet; + for (auto i = 0u; i < functions->nParams(); ++i) + nameSet.insert(shortParameterName(function->parameterName(i))); + return nameSet; } void QENSFitSequential::deleteTemporaryWorkspaces( -- GitLab