Something went wrong on our end
-
Bertram Kopf authored56605d71
ParserBase.cc 18.40 KiB
//************************************************************************//
// //
// Copyright 2013 Bertram Kopf (bertram@ep1.rub.de) //
// Julian Pychy (julian@ep1.rub.de) //
// - Ruhr-Universität Bochum //
// //
// This file is part of Pawian. //
// //
// Pawian is free software: you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation, either version 3 of the License, or //
// (at your option) any later version. //
// //
// Pawian is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with Pawian. If not, see <http://www.gnu.org/licenses/>. //
// //
//************************************************************************//
// Bertram Kopf (RUB)
#include "ConfigParser/ParserBase.hh"
#include "ErrLogger/ErrLogger.hh"
#include <iterator>
#include <iostream>
#include <fstream>
using namespace std;
ParserBase::ParserBase(int argc,char **argv)
: _configFile("")
, _errLogMode(debug)
, _dataFile("")
, _mcFile("")
, _truthFile("")
, _unitInFile("GEV")
, _orderInFile("Px Py Pz E")
, _paramFile("")
, _serializationFile("")
, _startHypo("base")
, _mode("plotmode")
, _outputFileNameSuffix("")
, _serverAddress("localhost")
, _clientNumberWeights("")
, _verbose(true)
, _noOfThreads(16)
, _noOfClients(1)
, _serverPort(22222)
, _ratioMcToData(100000)
, _ratioTruthToMc(100000)
, _evoIterations(100)
, _evoPopulation(20)
, _evoRatioOfModParams(1.)
, _cacheAmps(true)
, _calcContributionError(false)
, _saveContributionHistos(false)
, _strErrLogMode("debug")
, _desc(0)
, _common(new po::options_description("Common Options"))
, _config(new po::options_description("Configuration file options"))
,_useDataEvtWeight(false)
,_useMCEvtWeight(false)
,_useTruthEvtWeight(false)
,_usePhaseSpaceHyp(false)
,_useCohPhaseSpaceHyp(false)
,_doScaling(false)
,_pdgTableFile("/Particle/pdtNew.table")
,_productionFormalism("Cano")
,_fitqRProduction(false)
,_randomSeed(44123)
,_genWithModel(true)
,_noOfGenEvts(10000)
,_noOfDataEvts(1000000)
,_tolerance(0.1)
,_noInterScattPoints(0)
{
string globalCofigFilePath="/ConfigParser/global.cfg";
_configFile=getenv("TOP_DIR")+globalCofigFilePath;
// Check the command line options. Uses the Boost program options library.
string strAppName(argv[0]);
size_t found = strAppName.rfind("/")+1;
if (found != string::npos) strAppName=strAppName.substr(found);
string strDesc="Usage: " + strAppName + " [options]";
_desc= new po::options_description(strDesc);
_desc->add_options()
("help,h", "emit help message")
("configFile,c",po::value<std::string>(&_configFile)->default_value(_configFile),
"The name of the configuration file holding further configuration options")
("coupledChannelConfigFile,C",po::value< vector<string> >(&_coupledChannelCfgs), "Configuration files for coupled channels")
("pbarpFiles",po::value< vector<string> >(&_pbarpCfgs), "Configuration files for pbarp channels")
("epemFiles",po::value< vector<string> >(&_epemCfgs), "Configuration files for epem channels")
("resFiles",po::value< vector<string> >(&_resCfgs), "Configuration files for single resonance decay channels")
("pipiScatteringFiles",po::value< vector<string> >(&_pipiScatteringCfgs), "Configuration scattering channels")
;
_common->add_options()
("errLogMode,e", po::value<string>(&_strErrLogMode)->default_value(_strErrLogMode),"choose mode for Error logger.")
("datFile",po::value<string>(&_dataFile), "full path of data file")
("mcFile",po::value<string>(&_mcFile), "full path of Monte Carlo file")
("truthFile",po::value<string>(&_truthFile), "full path of phasespace generated truth file")
("unitInFile",po::value<string>(&_unitInFile),"chosen unit in input files")
("orderInFile",po::value<string>(&_orderInFile),"chosen order in input files")
("paramFile",po::value<string>(&_paramFile), "file with start parameters for fit or QA (full path)")
("serializationFile", po::value<string>(&_serializationFile), "serialized pwa i/o file")
("serverAddress", po::value<string>(&_serverAddress), "server address for client mode")
("clientNumberWeights", po::value<string>(&_clientNumberWeights), "weights to assign client numbers to channels")
("startHypo",po::value<string>(&_startHypo), "choose the hyopthesis to start")
("mode",po::value<string>(&_mode), "modes are: pwa, dumpDefaultParams, qaMode, plotmode, spinDensity")
("noOfThreads",po::value<int>(&_noOfThreads), "number of threads for multi threaded mode")
("noOfClients",po::value<int>(&_noOfClients), "number of clients/worker nodes for server mode")
("serverPort",po::value<int>(&_serverPort), "port for client/server mode")
("ratioMcToData",po::value<int>(&_ratioMcToData), "number of MC events defined by ratio #MCs/#Data")
("ratioTruthToMc",po::value<int>(&_ratioTruthToMc), "number of truth events defined by ratio #truths/#Mcs; needed only for qaModeEffCorrection")
("evoPopulation",po::value<int>(&_evoPopulation), "iteration population for evo minimizer")
("evoIterations",po::value<int>(&_evoIterations), "number of iterations for evo minimizer")
("evoRatioOfModParams",po::value<double>(&_evoRatioOfModParams), "chosen (avereaged) ratio of fit parameters to be changed for each population (value between 0. and 1.")
("cacheAmps",po::value<bool>(&_cacheAmps), "cache amplitudes")
("contributionError",po::value<bool>(&_calcContributionError), "calculate the wave contribution error")
("saveContributionHistos",po::value<bool>(&_saveContributionHistos), "creates a histogram root-file for each contribution of Option: calcContribution")
("useDataEventWeight",po::value<bool>(&_useDataEvtWeight), "enable/disable input for data event weight")
("useMCEventWeight",po::value<bool>(&_useMCEvtWeight), "enable/disable input for Monte Carlo event weight")
("useTruthEventWeight",po::value<bool>(&_useTruthEvtWeight), "enable/disable input for truth event weight")
("usePhaseSpaceHyp",po::value<bool>(&_usePhaseSpaceHyp), "use hypothesis for phase space")
("useCohPhaseSpaceHyp",po::value<bool>(&_useCohPhaseSpaceHyp), "use hypothesis for coherent phase space")
("doScaling",po::value<bool>(&_doScaling), "enable/disable prefit with free scaling factor")
("name",po::value<string>(&_outputFileNameSuffix), "name that is attached to all otuput file names")
("pdgTableFile",po::value<string>(&_pdgTableFile), "path of the pdg-table file relative to the top dir")
("randomSeed",po::value<int>(&_randomSeed), "random seed")
;
_config->add_options()
("verbose",po::value<bool>(&_verbose)->default_value(true), "Determines whether additional information should be emitted")
("enableHyp",po::value< vector<string> >(&_enabledHyps), "enable hypotheses")
("mnParFix",po::value< vector<string> >(&_mnParFixs), "minuit parameters can be fixed here")
("parameterDependency",po::value< vector<string> >(&_parameterDependencies), "parameter dependencies")
("finalStateParticle",po::value< vector<string> >(&_finalStateParticles), "name of final state particles")
("decay",po::value< vector<string> >(&_decaySystem), "decay: mother and pair of decay particles")
("addDynamics",po::value< vector<string> >(&_dynamics), "add dynamics/line shape for resonances")
("replaceParamSuffix",po::value< vector<string> >(&_replaceParSuffix), "replace suffix for fit parameter name")
("replaceMassKey",po::value< vector<string> >(&_replaceMassKey), "replace Key for the fit parameter of the mass")
("replaceProdKey",po::value< vector<string> >(&_replaceProdKey), "replace key for specific fit parameter of the production")
("production",po::value< vector<string> >(&_productionSystem), "pair of produced particles")
("productionFormalism",po::value< string >(&_productionFormalism), "used formalism for the production")
("fitqRProduction",po::value<bool>(&_fitqRProduction), "enable/disable fir parameter for individual qR prduction values")
("cloneParticle",po::value< vector<string> >(&_cloneParticle), "particles to be cloned")
("preFactor",po::value< vector<string> >(&_preFactor), "set prefactor for amplitude")
("histMass",po::value< vector<string> >(&_histMass), "histograms inv mass for the selected final state paricles")
("histAngles",po::value< vector<string> >(&_histAngles), "histograms decay angles")
("massRangeCuts", po::value< vector<string> > (&_massRangeCuts), "multiple mass range cuts; order: min max particle1 particle2 ...")
("phpGenDynamics", po::value< vector<string> > (&_phpGenDynamics), "dynamics for phase space generated events (only BreitWigner supported so far); order: dynType mass0 width0 particle1 particle2 ...")
("histAngles2D",po::value< vector<string> >(&_histAngles2D), "2D histogram decay angles")
("generateWithModel",po::value<bool>(&_genWithModel), "generate w/ or w/o model")
("noOfGenEvents",po::value<int>(&_noOfGenEvts), "number of generated events")
("noOfDataEvents",po::value<int>(&_noOfDataEvts), "number of data events for PWA and qa")
("calcContribution",po::value< vector<string> >(&_calcContribution), "Calculate contribution of partial wave")
("minimumTolerance", po::value<double>(&_tolerance), "Minimum tolerance")
("noOfInterpolatedScatteringPoints", po::value<int>(&_noInterScattPoints), "number of interpolated scattering points")
("kMatrixProdSuffix", po::value< vector<string> >(&_kMatrixProdSuffix),"suffix for fit parameter of the P-vectors in the K-matrix approach")
;
}
/************************************************************************************************/
/************************************************************************************************/
/**
* A function that parses the command line for all required parameters
*/
bool ParserBase::parseCommandLine(int argc, char **argv)
{
try
{
po::options_description cmdline_options;
cmdline_options.add(*_desc).add(*_common);
po::options_description config_file_options;
config_file_options.add(*_config).add(*_common);
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, cmdline_options), vm);
po::notify(vm);
// Check the name of the configuation file
if(_configFile.empty() || _configFile == "empty" || _configFile == "unknown")
{
std::cout << cmdline_options << endl;
stringstream strError;
strError << "Error: Invalid configuration file name given: \"" << _configFile << "\"";
throw runtime_error(strError.str());
}
std::ifstream ifs(_configFile.c_str());
if(!ifs.good())
{
stringstream strError;
strError << "Error accessing configuration file " << _configFile;
std::cout << cmdline_options << endl;
throw runtime_error(strError.str());
}
store(po::parse_config_file(ifs, config_file_options), vm);
po::notify(vm);
// Emit a help message, if necessary
if (vm.count("help"))
{
std::cout << config_file_options << endl;
exit(0);
}
if(_strErrLogMode == "debug") _errLogMode = debug;
else if(_strErrLogMode == "trace") _errLogMode = trace;
else if(_strErrLogMode == "routine") _errLogMode = routine;
else if(_strErrLogMode == "warning") _errLogMode = warning;
else if(_strErrLogMode == "error") _errLogMode = error;
else if(_strErrLogMode == "alert") _errLogMode = alert;
else
{
_errLogMode = debug;
WarningMsg << "ErrorLogger not (properly) set -> Use mode 'DEBUG' " ; // << endmsg;
}
if (_evoRatioOfModParams<=0. || _evoRatioOfModParams>1.){
Alert << "_evoRatioOfModParams = " << _evoRatioOfModParams << " not possible\n"
<< "value must be between 0. and 1. !!!!" << endmsg;
exit(1);
}
if(_verbose){
std::cout << "\nRunning with the following options using " << _configFile << ":\n\n"
<< "Error log mode: " << _errLogMode <<"\n\n"
<< "data file: " << _dataFile <<"\n\n"
<< "mc file: " << _mcFile <<"\n\n"
<< "truth file: " << _truthFile <<"\n\n"
<< "chosen unit in input file: " << _unitInFile << "\n\n"
<< "chosen order in file: " << _orderInFile << "\n\n"
<< "file with start parameters for fit or qa: " << _paramFile << "\n\n"
<< "startHypo: " << _startHypo << "\n\n"
<< "mode: " << _mode << "\n\n"
<< "number of threads: " << _noOfThreads << "\n\n"
<< "ratioMcToData: " << _ratioMcToData << "\n\n"
<< "ratioTruthToMc: " << _ratioTruthToMc << "\n\n"
<< "cache amplitudes: " << _cacheAmps << "\n\n"
<< "use data event weight: " << _useDataEvtWeight << "\n\n"
<< "use Monte Carlo event weight: " << _useMCEvtWeight << "\n\n"
<< "use truth event weight: " << _useTruthEvtWeight << "\n\n"
<< "use phase space hyp: " << _usePhaseSpaceHyp << "\n\n"
<< "use coherent phase space hyp: " << _useCohPhaseSpaceHyp << "\n\n"
<< "prefit with free scaling factor: " << _doScaling << "\n\n"
<< "pdg table: " << _pdgTableFile << "\n\n"
<< "minimumTolerance: " << _tolerance << "\n\n"
<< "no of interpolated scattering points" << _noInterScattPoints << "\n\n"
<< endl;
std::vector<std::string>::const_iterator it;
for (it = _coupledChannelCfgs.begin(); it!=_coupledChannelCfgs.end(); ++it){
std::cout << "Coupled channel configuration file: " << (*it) << "\n";
}
for (it = _pbarpCfgs.begin(); it!=_pbarpCfgs.end(); ++it){
std::cout << "pbarp channel configuration file: " << (*it) << "\n";
}
for (it = _epemCfgs.begin(); it!=_epemCfgs.end(); ++it){
std::cout << "epem channel configuration file: " << (*it) << "\n";
}
for (it = _resCfgs.begin(); it!=_resCfgs.end(); ++it){
std::cout << "res channel configuration file: " << (*it) << "\n";
}
for (it = _pipiScatteringCfgs.begin(); it!=_pipiScatteringCfgs.end(); ++it){
std::cout << "pipi scattering channel configuration file: " << (*it) << "\n";
}
for (it = _cloneParticle.begin(); it!=_cloneParticle.end(); ++it){
std::cout << "clone particles: " << (*it) << "\n";
}
for (it = _preFactor.begin(); it!=_preFactor.end(); ++it){
std::cout << "preFactors: " << (*it) << "\n";
}
for (it=_enabledHyps.begin(); it!=_enabledHyps.end();++it){
std::cout << "hypothesis\t" << (*it) << "\t enabled\n";
}
std::cout << std::endl;
for (it=_mnParFixs.begin(); it!=_mnParFixs.end();++it){
std::cout << "minuit parameter\t" << (*it) << "\t fixed\n";
}
std::cout << std::endl;
for (it=_parameterDependencies.begin(); it!=_parameterDependencies.end();++it){
std::cout << "parameter dependencies:\t" << (*it) << "\n";
}
std::cout << std::endl;
std::cout << "the final state particles are:" << std::endl;
// std::vector<std::string>::const_iterator it;
for (it=_finalStateParticles.begin(); it!=_finalStateParticles.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\ndecay system:" << std::endl;
for (it=_decaySystem.begin(); it!=_decaySystem.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\ndecay dynamics:" << std::endl;
for (it=_dynamics.begin(); it!=_dynamics.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\nreplaced suffix for fit parameter name" << std::endl;
for (it=_replaceParSuffix.begin(); it!=_replaceParSuffix.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\nreplaced mass key" << std::endl;
for (it=_replaceMassKey.begin(); it!=_replaceMassKey.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\nreplaced prod key" << std::endl;
for (it=_replaceProdKey.begin(); it!=_replaceProdKey.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\nproduction system:" << std::endl;
for (it=_productionSystem.begin(); it!=_productionSystem.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\nK-matrix prod suffix:" << std::endl;
for (it=_kMatrixProdSuffix.begin(); it!=_kMatrixProdSuffix.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\nproduction formalism:\t" << _productionFormalism << std::endl;
std::cout << "fitqRProduction:\t" << _fitqRProduction << std::endl;
std::cout << "\nhistograms inv mass for systems" << std::endl;
for (it=_histMass.begin(); it!=_histMass.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\nhistograms decay angles for systems" << std::endl;
for (it=_histAngles.begin(); it!=_histAngles.end();++it){
std::cout << (*it) << "\n";
}
// std::cout << "\nmass range" << std::endl;
// std::cout << _massRange << "\n";
std::cout << "\nmass range cuts:" << std::endl;
for (it = _massRangeCuts.begin(); it!=_massRangeCuts.end(); ++it){
std::cout << (*it) << "\n";
}
std::cout << "\nphp dynamics:" << std::endl;
for (it = _phpGenDynamics.begin(); it!=_phpGenDynamics.end(); ++it){
std::cout << (*it) << "\n";
}
std::cout << "\n2Dhistogram decay angles for systems" << std::endl;
for (it=_histAngles2D.begin(); it!=_histAngles2D.end();++it){
std::cout << (*it) << "\n";
}
std::cout << "\nrandom seed:\t" << _randomSeed << std::endl;
std::cout << "\ngenerate with model:\t" << _genWithModel << std::endl;
std::cout << "\nnumber of generated events:\t" << _noOfGenEvts << std::endl;
std::cout << "\nnumber of data events:\t" << _noOfDataEvts << std::endl;
}
}
catch( std::exception & e )
{
cerr << "Error parsing the command line:" << endl;
cerr << e.what() << std::endl;
cerr << "You can use -h or --help to obtain the description of the program parameters." << endl;
// cerr << "This is the command line options\n" << endl;
exit(1);
// return false;
}
catch(...){
std::cerr << "Error parsing the command line. Use -h or --help to see the description of the program paramters." << endl;
return false;
}
return true;
}