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 &parameterName) 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 &parameter) { 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