Skip to content
Snippets Groups Projects
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;
}