From 6bb4842fb86a9ab7f93052dadfbd97baaafa0df9 Mon Sep 17 00:00:00 2001
From: pospelov <pospelov@fz-juelich.de>
Date: Wed, 23 Jan 2013 16:54:11 +0100
Subject: [PATCH] New extremely crappy, temporary ROOTMinimizerOptionsHelper

---
 App/App.pro                            |   6 +-
 App/inc/ROOTMinimizer.h                |   2 +
 App/inc/ROOTMinimizerOptionsHelper.h   |  46 ++++++++++
 App/inc/TestToyExperiment.h            |   7 --
 App/src/ROOTMinimizer.cpp              |  17 +++-
 App/src/ROOTMinimizerOptionsHelper.cpp | 114 +++++++++++++++++++++++++
 App/src/TestFittingModule1.cpp         |  34 ++++----
 App/src/TestToyExperiment.cpp          |  64 +++-----------
 Core/Fitting/inc/IMinimizer.h          |   2 +-
 Core/Fitting/inc/MinimizerScan.h       |   6 +-
 Core/Fitting/src/FitSuiteFunctions.cpp |   2 +-
 Core/Fitting/src/MinimizerScan.cpp     |   3 +-
 Core/Tools/inc/Utils.h                 |  17 +---
 Core/Tools/src/ParameterPool.cpp       |   4 +-
 Core/Tools/src/Utils.cpp               |  27 ++++--
 15 files changed, 241 insertions(+), 110 deletions(-)
 create mode 100644 App/inc/ROOTMinimizerOptionsHelper.h
 create mode 100644 App/src/ROOTMinimizerOptionsHelper.cpp

diff --git a/App/App.pro b/App/App.pro
index 62ab0ae08a7..0b2a00691f5 100644
--- a/App/App.pro
+++ b/App/App.pro
@@ -59,7 +59,8 @@ SOURCES += \
     $${FUNCTIONAL_TESTS}/IsGISAXS01/IsGISAXS01.cpp \
     src/ROOTGSLSimAnMinimizer.cpp \
     src/FitSuiteObserverFactory.cpp \
-    src/MinimizerFactory.cpp
+    src/MinimizerFactory.cpp \
+    src/ROOTMinimizerOptionsHelper.cpp
 
 HEADERS += \
     inc/App.h \
@@ -111,7 +112,8 @@ HEADERS += \
     $${FUNCTIONAL_TESTS}/IsGISAXS01/IsGISAXS01.h \
     inc/ROOTGSLSimAnMinimizer.h \
     inc/FitSuiteObserverFactory.h \
-    inc/MinimizerFactory.h
+    inc/MinimizerFactory.h \
+    inc/ROOTMinimizerOptionsHelper.h
 
 # additional locations
 LOCATIONS = ./inc $${FUNCTIONAL_TESTS}/IsGISAXS01
diff --git a/App/inc/ROOTMinimizer.h b/App/inc/ROOTMinimizer.h
index 05066e0d89b..871d56af4b3 100644
--- a/App/inc/ROOTMinimizer.h
+++ b/App/inc/ROOTMinimizer.h
@@ -61,6 +61,8 @@ public:
 
     virtual void printOptions() const;
 
+    virtual void setOptions(const std::string &options);
+
     //! return created minimizer
     ROOT::Math::Minimizer *getROOTMinimizer() { return m_root_minimizer; }
 
diff --git a/App/inc/ROOTMinimizerOptionsHelper.h b/App/inc/ROOTMinimizerOptionsHelper.h
new file mode 100644
index 00000000000..fec01e75928
--- /dev/null
+++ b/App/inc/ROOTMinimizerOptionsHelper.h
@@ -0,0 +1,46 @@
+#ifndef ROOTMINIMIZEROPTIONS_H
+#define ROOTMINIMIZEROPTIONS_H
+// ********************************************************************
+// * The BornAgain project                                            *
+// * Simulation of neutron and x-ray scattering at grazing incidence  *
+// *                                                                  *
+// * LICENSE AND DISCLAIMER                                           *
+// * Lorem ipsum dolor sit amet, consectetur adipiscing elit.  Mauris *
+// * eget quam orci. Quisque  porta  varius  dui,  quis  posuere nibh *
+// * mollis quis. Mauris commodo rhoncus porttitor.                   *
+// ********************************************************************
+//! @file   ROOTMinimizerOptions.h
+//! @brief  Definition of ROOTMinimizerOptions class
+//! @author Scientific Computing Group at FRM II
+//! @date   23.01.2013
+
+#include "ROOTMinimizer.h"
+#include "ROOTGSLSimAnMinimizer.h"
+
+
+//- -------------------------------------------------------------------
+//! @class ROOTMinimizerOptionsHelper
+//! @brief Handles string representation of ROOTMinimizer options
+//- -------------------------------------------------------------------
+// TODO: replace ROOTMinimizerOptionsHelper completely with kind of PoolParameter/IConfigurable functionality
+class ROOTMinimizerOptionsHelper
+{
+public:
+    ROOTMinimizerOptionsHelper() { }
+    //! translate text with options into appropriate calls of minimizer's set method
+    static void setOptions(ROOT::Math::Minimizer *minimizer, const std::string &options);
+
+private:
+    //! process single command
+    static bool processCommand(ROOT::Math::Minimizer *minimizer, const std::string &command);
+
+    //! process single command common for all minimizers
+    static bool processCommandAll(ROOT::Math::Minimizer *minimizer, const std::string &command);
+
+    //! process single command specific for GSL simulated annealing minimizer
+    static bool processCommandGSLSimAn(ROOT::Patch::GSLSimAnMinimizer *, const std::string &command);
+
+};
+
+
+#endif // ROOTMINIMIZEROPTIONS_H
diff --git a/App/inc/TestToyExperiment.h b/App/inc/TestToyExperiment.h
index b2a4511e35f..33fd7c1c187 100644
--- a/App/inc/TestToyExperiment.h
+++ b/App/inc/TestToyExperiment.h
@@ -49,8 +49,6 @@ private:
 };
 
 
-
-
 //- -------------------------------------------------------------------
 //! @class TestToyExperiment
 //! @brief Test of fitting chain using toy experiment
@@ -71,11 +69,6 @@ private:
     ToyExperiment *m_experiment;
     OutputData<double > *m_real_data;
     FitSuite *m_fitSuite;
-
 };
 
-
-
-
-
 #endif // TESTTOYEXPERIMENT_H
diff --git a/App/src/ROOTMinimizer.cpp b/App/src/ROOTMinimizer.cpp
index 9d8ddd82006..3d37a3e22b9 100644
--- a/App/src/ROOTMinimizer.cpp
+++ b/App/src/ROOTMinimizer.cpp
@@ -8,7 +8,7 @@
 #include <boost/assign/list_of.hpp>
 #include "ROOTGSLNLSMinimizer.h"
 #include "ROOTGSLSimAnMinimizer.h"
-
+#include "ROOTMinimizerOptionsHelper.h"
 
 /* ************************************************************************* */
 // ROOTMinimizer c-tor
@@ -29,6 +29,8 @@ ROOTMinimizer::ROOTMinimizer(const std::string &minimizer_name, const std::strin
     }else if( m_minimizer_name == "GSLSimAn") {
         // hacked version of ROOT's GSL Simulated annealing minimizer
         m_root_minimizer = new ROOT::Patch::GSLSimAnMinimizer();
+        // changing default options to more appropriate
+        setOptions("ntries=100:niters=10:step_size=1.0:k=1:t_initial=50.0:mu=1.05:t_min=0.1");
     } else {
         m_root_minimizer = ROOT::Math::Factory::CreateMinimizer(minimizer_name, algo_type );
     }
@@ -49,7 +51,9 @@ ROOTMinimizer::~ROOTMinimizer()
 /* ************************************************************************* */
 bool ROOTMinimizer::isGradientBasedAgorithm()
 {
-    if (m_algo_type == "Fumili" || m_minimizer_name == "Fumili" || m_minimizer_name == "GSLMultiFit" ) return true;
+    if (m_minimizer_name == "Fumili" ||
+        m_minimizer_name == "GSLMultiFit" ||
+        (m_minimizer_name == "Minuit2" && m_algo_type == "Fumili") ) return true;
     return false;
 }
 
@@ -222,4 +226,13 @@ void ROOTMinimizer::printOptions() const
 }
 
 
+// ----------------------------------------------------------------------------
+// set option of minimizer
+// TODO: refactor ROOTMinimizer::setOptions
+// ----------------------------------------------------------------------------
+void ROOTMinimizer::setOptions(const std::string &options)
+{
+    ROOTMinimizerOptionsHelper::setOptions(m_root_minimizer, options);
+}
+
 
diff --git a/App/src/ROOTMinimizerOptionsHelper.cpp b/App/src/ROOTMinimizerOptionsHelper.cpp
new file mode 100644
index 00000000000..06a7fed2740
--- /dev/null
+++ b/App/src/ROOTMinimizerOptionsHelper.cpp
@@ -0,0 +1,114 @@
+#include "ROOTMinimizerOptionsHelper.h"
+#include "ROOTGSLSimAnMinimizer.h"
+#include "Utils.h"
+#include <boost/lexical_cast.hpp>
+
+
+// ----------------------------------------------------------------------------
+// translate text with options into appropriate calls of minimizer's set method
+// "tolerance=0.1:precision=0.001" ->setTolerance(), ->setPrecision()
+// ----------------------------------------------------------------------------
+void ROOTMinimizerOptionsHelper::setOptions(ROOT::Math::Minimizer *minimizer, const std::string &options)
+{
+    const std::string delimeter(":");
+    std::vector<std::string> tokens = Utils::String::Split(options, delimeter);
+    for(size_t i=0; i<tokens.size(); ++i) processCommand(minimizer, tokens[i]);
+}
+
+
+// ----------------------------------------------------------------------------
+// process single command
+// command "tolerance=0.1" will cause minimizer->SetTolerance(0.1)
+// ----------------------------------------------------------------------------
+bool ROOTMinimizerOptionsHelper::processCommand(ROOT::Math::Minimizer *minimizer, const std::string &command)
+{
+    bool success(false);
+    success = processCommandAll(minimizer, command);
+
+    ROOT::Patch::GSLSimAnMinimizer *gslSimAn = dynamic_cast<ROOT::Patch::GSLSimAnMinimizer *>(minimizer);
+    if(gslSimAn) {
+        success = processCommandGSLSimAn(gslSimAn, command);
+    }
+
+    if( !success ) {
+        throw LogicErrorException("ROOTMinimizerOptionsHelper::processCommand() -> Error! Can't parse command '"+command+"'");
+    }
+
+    return success;
+}
+
+
+// process single command common for all minimizers
+bool ROOTMinimizerOptionsHelper::processCommandAll(ROOT::Math::Minimizer *minimizer, const std::string &command)
+{
+    std::vector<std::string> tokens = Utils::String::Split(command, "=");
+    assert(tokens.size() ==2);
+    std::string name = tokens[0];
+    std::string number = tokens[1];
+
+    bool success(true);
+    if(name == "tolerance") {
+        minimizer->SetTolerance( boost::lexical_cast<double>(number) );
+
+    } else if(name == "precision") {
+        minimizer->SetPrecision( boost::lexical_cast<double>(number) );
+
+    } else if(name == "strategy") {
+        minimizer->SetStrategy( boost::lexical_cast<int>(number) );
+
+    } else if(name == "print") {
+        minimizer->SetPrintLevel( boost::lexical_cast<int>(number) );
+
+    } else if(name == "functioncalls") {
+        minimizer->SetMaxFunctionCalls(boost::lexical_cast<int>(number) );
+
+    } else if(name == "iterations") {
+        minimizer->SetMaxIterations(boost::lexical_cast<int>(number) );
+
+    } else {
+        success=false;
+    }
+    return success;
+}
+
+
+// process single command specific for GSL simulated annealing minimizer
+bool ROOTMinimizerOptionsHelper::processCommandGSLSimAn(ROOT::Patch::GSLSimAnMinimizer *minimizer, const std::string &command)
+{
+    std::vector<std::string> tokens = Utils::String::Split(command, "=");
+    assert(tokens.size() ==2);
+    std::string name = tokens[0];
+    std::string number = tokens[1];
+
+    ROOT::Math::GSLSimAnParams &pars = minimizer->getSolver().Params();
+    bool success(true);
+
+    if(name == "ntries") {
+        pars.n_tries = boost::lexical_cast<int>(number);
+
+    } else if( name == "niters") {
+        pars.iters_fixed_T = boost::lexical_cast<int>(number);
+
+    } else if( name == "step_size") {
+        pars.step_size = boost::lexical_cast<double>(number);
+
+    } else if( name == "k" ) {
+        pars.k = boost::lexical_cast<double>(number);
+
+    } else if( name == "t_initial" ) {
+        pars.t_initial = boost::lexical_cast<double>(number);
+
+    } else if( name == "mu" ) {
+        pars.mu = boost::lexical_cast<double>(number);
+
+    } else if( name == "t_min" ) {
+        pars.t_min = boost::lexical_cast<double>(number);
+
+    } else {
+        success=false;
+    }
+
+    return success;
+}
+
+
diff --git a/App/src/TestFittingModule1.cpp b/App/src/TestFittingModule1.cpp
index b193f95668a..87cccde87de 100644
--- a/App/src/TestFittingModule1.cpp
+++ b/App/src/TestFittingModule1.cpp
@@ -1,27 +1,25 @@
-#include "TestFittingModule1.h"
-#include "Units.h"
-#include "MathFunctions.h"
+#include "AttLimits.h"
+#include "DrawHelper.h"
+#include "Exceptions.h"
+#include "FitSuite.h"
+#include "FitSuiteObserverFactory.h"
+#include "FormFactors.h"
 #include "GISASExperiment.h"
-#include "IsGISAXSTools.h"
-#include "MultiLayer.h"
-#include "MaterialManager.h"
+#include "IOutputDataNormalizer.h"
+#include "ISquaredFunction.h"
 #include "InterferenceFunction1DParaCrystal.h"
 #include "InterferenceFunctionNone.h"
-#include "ParticleDecoration.h"
+#include "IsGISAXSTools.h"
 #include "LayerDecorator.h"
+#include "MaterialManager.h"
+#include "MathFunctions.h"
+#include "MinimizerFactory.h"
+#include "MultiLayer.h"
 #include "Particle.h"
-#include "FormFactors.h"
-#include "Exceptions.h"
-#include "DrawHelper.h"
-#include "FitSuiteObserverFactory.h"
+#include "ParticleDecoration.h"
 #include "ResolutionFunction2DSimple.h"
-#include "AttLimits.h"
-#include "ISquaredFunction.h"
-#include "IOutputDataNormalizer.h"
-
-#include "IObserver.h"
-#include "FitSuite.h"
-#include "MinimizerFactory.h"
+#include "TestFittingModule1.h"
+#include "Units.h"
 
 #include "TROOT.h"
 #include "TCanvas.h"
diff --git a/App/src/TestToyExperiment.cpp b/App/src/TestToyExperiment.cpp
index dccf77e6d04..feed2837b80 100644
--- a/App/src/TestToyExperiment.cpp
+++ b/App/src/TestToyExperiment.cpp
@@ -1,13 +1,13 @@
-#include "TestToyExperiment.h"
 #include "Exceptions.h"
-#include "IsGISAXSTools.h"
+#include "ExperimentConstants.h"
 #include "FitSuite.h"
 #include "FitSuiteObserverFactory.h"
-#include "ExperimentConstants.h"
+#include "IsGISAXSTools.h"
+#include "MinimizerFactory.h"
 #include "ROOTGSLSimAnMinimizer.h"
+#include "TestToyExperiment.h"
 
 #include <iostream>
-#include "MinimizerFactory.h"
 
 /* ************************************************************************* */
 //
@@ -41,7 +41,6 @@ void ToyExperiment::init_parameters()
     }
 }
 
-//#include "ROOTMinimizerFunction.h"
 
 /* ************************************************************************* */
 //
@@ -49,19 +48,13 @@ void ToyExperiment::init_parameters()
 TestToyExperiment::TestToyExperiment()
     : m_func_object(0)
     , m_func(0)
-    , m_sigma_noise(0)
+    , m_sigma_noise(0.01)
     , m_experiment(0)
     , m_real_data(0)
     , m_fitSuite(0)
 {
-
-    m_sigma_noise = 0.01;
     m_func_object = new SincXSincYFunctionObject();
-//    m_func = new TF2("sincxy", m_func_object, -5.,5., -5.,5., 3, "SincXSincYFunctionObject");
     m_func = new TF2("sincxy", m_func_object, -10.,10., -10.,10., 3, "SincXSincYFunctionObject");
-    //m_func->SetParameters(1.0, 1.0, 0.5); // parameters we have to find
-
-
 }
 
 
@@ -78,56 +71,29 @@ TestToyExperiment::~TestToyExperiment()
 void TestToyExperiment::execute()
 {
     std::cout << "TestToyExperiment()::execute() -> Hello World!"   << std::endl;
-
-    MinimizerFactory::print_catalogue();
-    return;
-
-
-
     initializeExperimentAndRealData();
 
     // setting up fitSuite
-    FitSuite *m_fitSuite = new FitSuite();
-    //m_fitSuite->setMinimizer( new ROOTMinimizer("Minuit2", "Migrad") );
-    //m_fitSuite->setMinimizer( new ROOTMinimizer("Minuit2", "Fumili") );
-    //m_fitSuite->setMinimizer( new ROOTMinimizer("Fumili") );
-    //m_fitSuite->setMinimizer( new ROOTMinimizer("GSLMultiFit") );
-    m_fitSuite->setMinimizer( MinimizerFactory::createMinimizer("GSLSimAn") );
-
-//    ROOT::Math::Minimizer *minim = (dynamic_cast<ROOTMinimizer *>(m_fitSuite->getMinimizer()))->getROOTMinimizer();
-//    if( !minim ) throw NullPointerException("TestToyExperiment::execute() -> Can't cast minimizer #1");
-//    ROOT::Patch::GSLSimAnMinimizer *siman = dynamic_cast<ROOT::Patch::GSLSimAnMinimizer *>(minim);
-//    if( !siman ) throw NullPointerException("TestToyExperiment::execute() -> Can't cast minimizer #2");
-//    ROOT::Math::GSLSimAnParams &pars = siman->getSolver().Params();
-//    siman->SetPrintLevel(2);
-//    pars.n_tries = 100;
-//    pars.iters_fixed_T = 10;
-//    pars.step_size = 1.0;
-//    pars.k = 1;
-//    pars.t_initial = 50;
-//    pars.mu = 1.05;
-//    pars.t_min = 0.1;
-
-
-
-    //m_fitSuite->setMinimizer( new ROOTMinimizer("Genetic") );
-
-
+    m_fitSuite = new FitSuite();
 
+    //m_fitSuite->setMinimizer( MinimizerFactory::createMinimizer("Minuit2", "Migrad") );
+    //m_fitSuite->setMinimizer( MinimizerFactory::createMinimizer("Minuit2", "Fumili") );
+    //m_fitSuite->setMinimizer( MinimizerFactory::createMinimizer("Fumili") );
+    //m_fitSuite->setMinimizer( MinimizerFactory::createMinimizer("GSLMultiFit") );
+    //m_fitSuite->setMinimizer( MinimizerFactory::createMinimizer("Genetic") );
+    m_fitSuite->setMinimizer( MinimizerFactory::createMinimizer("GSLSimAn") );
+    m_fitSuite->getMinimizer()->setOptions("ntries=100:niters=10:step_size=1.0:k=1:t_initial=50.0:mu=1.05:t_min=0.1");
 
     m_fitSuite->attachObserver( FitSuiteObserverFactory::createPrintObserver() );
 //    m_fitSuite->attachObserver( ObserverFactory::createDrawObserver() );
 
-
     m_fitSuite->addFitParameter("*/par0",  1.0, 0.01, AttLimits::limited(0.5, 1.5));
     m_fitSuite->addFitParameter("*/par1",  0.0, 0.01, AttLimits::limited(0.0, 3.0));
     m_fitSuite->addFitParameter("*/par2",  0.0, 0.01, AttLimits::limited(0.0, 3.0));
-    //m_fitSuite->addFitParameter("*/par2",  -2.5, 0.01, AttLimits::fixed());
 
     ChiSquaredModule chi_module;
     chi_module.setChiSquaredFunction(SquaredFunctionWithGaussianError(m_sigma_noise) );
     m_fitSuite->addExperimentAndRealData(*m_experiment, *m_real_data, chi_module);
-//    m_fitSuite->addExperimentAndRealData(*m_experiment, *m_real_data);
     m_fitSuite->runFit();
 
 }
@@ -152,9 +118,7 @@ void TestToyExperiment::initializeExperimentAndRealData()
     m_experiment->setParameter(0, 1.0);
     m_experiment->setParameter(1, 2.0);
     m_experiment->setParameter(2, 2.5);
-//    m_experiment->setParameter(0, 2.0);
-//    m_experiment->setParameter(1, 1.0);
-//    m_experiment->setParameter(2, 0.5);
+
     m_experiment->runSimulation();
     m_real_data = IsGISAXSTools::createDataWithGaussianNoise(*m_experiment->getOutputData(), m_sigma_noise);
 }
diff --git a/Core/Fitting/inc/IMinimizer.h b/Core/Fitting/inc/IMinimizer.h
index 5f15887f7d6..b9b0a63e928 100644
--- a/Core/Fitting/inc/IMinimizer.h
+++ b/Core/Fitting/inc/IMinimizer.h
@@ -70,7 +70,7 @@ public:
     //! print fit results
     virtual void printResults() const;
 
-    //! set minimizer command
+    //! set minimizer option
     virtual void setOptions(const std::string &option);
 };
 
diff --git a/Core/Fitting/inc/MinimizerScan.h b/Core/Fitting/inc/MinimizerScan.h
index dcc455c462d..eddbf053706 100644
--- a/Core/Fitting/inc/MinimizerScan.h
+++ b/Core/Fitting/inc/MinimizerScan.h
@@ -14,12 +14,11 @@
 //! @author Scientific Computing Group at FRM II
 //! @date   21.01.2013
 
-
 #include "IMinimizer.h"
 #include "FitSuiteParameters.h"
-#include "SafePointerVector.h"
 #include "OutputData.h"
 
+
 //- -------------------------------------------------------------------
 //! @class MinimizerScan
 //! @brief Simple scan minimizer
@@ -46,8 +45,8 @@ public:
 
     virtual void printResults() const;
 
-
     void setNbins(int nbins) { m_nbins = nbins; }
+
     size_t getNbins() const { return m_nbins; }
 
     const OutputData<double > *getOutputData() { return m_parameter_map; }
@@ -59,7 +58,6 @@ private:
 
     OutputData<double > *m_parameter_map;
     size_t m_nbins; //! number of bins per one parameter
-    //SafePointerVector<FitParameter > m_fit_parameters;
     FitSuiteParameters m_fit_parameters;
     std::vector<double> m_parvalues_at_minimum;
     function_chi2_t m_fcn;
diff --git a/Core/Fitting/src/FitSuiteFunctions.cpp b/Core/Fitting/src/FitSuiteFunctions.cpp
index 087d652b324..07d4ff0b38a 100644
--- a/Core/Fitting/src/FitSuiteFunctions.cpp
+++ b/Core/Fitting/src/FitSuiteFunctions.cpp
@@ -7,7 +7,7 @@
 /* ************************************************************************* */
 double FitSuiteChiSquaredFunction::evaluate(const double *pars)
 {
-    std::cout << "FitSuiteChiSquaredFunction::evaluate() -> Info" << std::endl;
+    //std::cout << "FitSuiteChiSquaredFunction::evaluate() -> Info" << std::endl;
     assert(m_fit_suite != NULL);
 
     // set fitting parameters to values suggested by the minimizer
diff --git a/Core/Fitting/src/MinimizerScan.cpp b/Core/Fitting/src/MinimizerScan.cpp
index 7d79340b160..792146e635b 100644
--- a/Core/Fitting/src/MinimizerScan.cpp
+++ b/Core/Fitting/src/MinimizerScan.cpp
@@ -18,7 +18,7 @@ void MinimizerScan::minimize()
             m_fit_parameters.getParameter(parname)->setValue(value);
         }
         std::vector<double> current_values=m_fit_parameters.getValues();
-        (*it) = m_fcn(&current_values[0]);
+        (*it) = m_fcn(&current_values[0]); // running simulation
     }
 
     set_parvalues_to_minimum();
@@ -54,7 +54,6 @@ void MinimizerScan::set_parvalues_to_minimum()
         std::string parname = m_parameter_map->getAxis(i_axis)->getName();
         m_fit_parameters.getParameter(parname)->setValue(value);
     }
-
 }
 
 
diff --git a/Core/Tools/inc/Utils.h b/Core/Tools/inc/Utils.h
index 3f98e7c9dc7..b7c956e9e4f 100644
--- a/Core/Tools/inc/Utils.h
+++ b/Core/Tools/inc/Utils.h
@@ -36,6 +36,10 @@ public:
     static vdouble1d_t parse_doubles(const std::string &str);
     //! assuming that string consist of doubles return new string where doubles are rounded according to the precision
     static std::string round_doubles(const std::string &str, int precision);
+    //! return true if text matches pattern with wildcards '*' and '?'
+    static bool MatchPattern(const std::string &text, std::string wildcardPattern);
+    //! split string into vector of string using delimeter
+    static std::vector<std::string> Split(const std::string &text, const std::string &delimeter);
 };
 
 
@@ -80,19 +84,6 @@ private:
 };
 
 
-//- -------------------------------------------------------------------
-//! @class StringMatchText
-//! @brief Definition of StringMatchText class to perform simple '*' and '?'
-//! wilcard matching
-//- -------------------------------------------------------------------
-class StringMatchText
-{
-public:
-    //! return true if text matches wildcards
-    static bool WildcardPattern(const std::string &text, std::string wildcardPattern);
-};
-
-
 //- -------------------------------------------------------------------
 //! @class FileSystem
 //! @brief different utilities to deal with file system
diff --git a/Core/Tools/src/ParameterPool.cpp b/Core/Tools/src/ParameterPool.cpp
index 704ff2fa1e8..c277398a0a7 100644
--- a/Core/Tools/src/ParameterPool.cpp
+++ b/Core/Tools/src/ParameterPool.cpp
@@ -115,7 +115,7 @@ std::vector<ParameterPool::parameter_t >  ParameterPool::getMatchedParameters(co
     for(parametermap_t::const_iterator it=m_map.begin(); it!= m_map.end(); ++it) {
         // (*it).first - parameter key, (*it).second - parameter itself
         // parameters whose key match pattern is added to the FitMultiParameter container
-        if( Utils::StringMatchText::WildcardPattern( (*it).first, wildcards ) ) {
+        if( Utils::String::MatchPattern( (*it).first, wildcards ) ) {
             selected_parameters.push_back((*it).second);
         }
     }
@@ -152,7 +152,7 @@ int ParameterPool::setMatchedParametersValue(const std::string &wildcards, doubl
 {
     int npars(0);
     for(parametermap_t::iterator it=m_map.begin(); it!= m_map.end(); ++it) {
-        if( Utils::StringMatchText::WildcardPattern( (*it).first, wildcards ) ) {
+        if( Utils::String::MatchPattern( (*it).first, wildcards ) ) {
             (*it).second.setValue(value);
             npars++;
         }
diff --git a/Core/Tools/src/Utils.cpp b/Core/Tools/src/Utils.cpp
index 3113165c521..ff795ea0615 100644
--- a/Core/Tools/src/Utils.cpp
+++ b/Core/Tools/src/Utils.cpp
@@ -4,13 +4,14 @@
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/filesystem.hpp>
 #include <iomanip>
+#include <boost/algorithm/string.hpp>
 
 std::string Utils::FileSystem::m_relative_path = "relative path is undefined";
 
 
-/* ************************************************************************* */
+//-----------------------------------------------------------------------------
 // parse double values from string to vector of double
-/* ************************************************************************* */
+//-----------------------------------------------------------------------------
 vdouble1d_t Utils::String::parse_doubles(const std::string &str)
 {
     vdouble1d_t buff_1d;
@@ -22,12 +23,11 @@ vdouble1d_t Utils::String::parse_doubles(const std::string &str)
     return buff_1d;
 }
 
-
-/* ************************************************************************* */
+//-----------------------------------------------------------------------------
 // double numbers in string will be rounded according to the precision
 // if precision is 6, then 7.2908527770e+03 -> 7.290853e+03
 // (this method is used to compare IsGisaxs and our ASCII files at equal precision)
-/* ************************************************************************* */
+//-----------------------------------------------------------------------------
 std::string Utils::String::round_doubles(const std::string &str, int precision)
 {
     std::string newline;
@@ -41,9 +41,10 @@ std::string Utils::String::round_doubles(const std::string &str, int precision)
     return newline;
 }
 
-
-//! return true if text matches wildcards
-bool Utils::StringMatchText::WildcardPattern(const std::string &text, std::string wildcardPattern)
+//-----------------------------------------------------------------------------
+// return true if text matches pattern with wildcards '*' and '?'
+//-----------------------------------------------------------------------------
+bool Utils::String::MatchPattern(const std::string &text, std::string wildcardPattern)
 {
     bool caseSensitive = false;
 
@@ -72,6 +73,16 @@ bool Utils::StringMatchText::WildcardPattern(const std::string &text, std::strin
     return boost::regex_match(text, pattern);
 }
 
+//-----------------------------------------------------------------------------
+// split string into vector of string using delimeter
+//-----------------------------------------------------------------------------
+std::vector<std::string> Utils::String::Split(const std::string &text, const std::string &delimeter)
+{
+    std::vector<std::string> tokens;
+    boost::split(tokens, text, boost::is_any_of(delimeter));
+    return tokens;
+}
+
 
 // return path to the current (working) directory
 std::string Utils::FileSystem::GetWorkingPath()
-- 
GitLab