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(¤t_values[0]); + (*it) = m_fcn(¤t_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