-
Adrien Matta authored
- correct spelling - streamlined presentation
Adrien Matta authored- correct spelling - streamlined presentation
NPOptionManager.cxx 15.00 KiB
/*****************************************************************************
* Copyright (C) 2009-2016 this file is part of the NPTool Project *
* *
* For the licensing terms see $NPTOOL/Licence/NPTool_Licence *
* For the list of contributors see $NPTOOL/Licence/Contributors *
*****************************************************************************/
/*****************************************************************************
* Original Author: A. MATTA contact address: matta@lpccaen.in2p3.fr *
* *
* Creation Date : 21/07/09 *
* Last update : *
*---------------------------------------------------------------------------*
* Decription: This class is a singleton class which deals with input *
* arguments of the different NPTool programm (NPS and NPA) *
*---------------------------------------------------------------------------*
* Comment: The singleton form allow users to call the object from anywhere *
* in the code *
* *
* *
*****************************************************************************/
#include "NPOptionManager.h"
#include "NPLibVersion.h"
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <vector>
NPOptionManager* NPOptionManager::instance = 0 ;
////////////////////////////////////////////////////////////////////////////////
NPOptionManager* NPOptionManager::getInstance(int argc, char** argv){
if (instance == 0) instance = new NPOptionManager(argc, argv);
return instance ;
}
////////////////////////////////////////////////////////////////////////////////
NPOptionManager* NPOptionManager::getInstance(string arg){
if (instance == 0) instance = new NPOptionManager(arg);
return instance ;
}
void NPOptionManager::ReadTheInputArgument(int argc, char** argv){
// Default Setting
fDefaultReactionFileName = "defaultReaction.reaction";
fDefaultDetectorFileName = "defaultDetector.detector";
fDefaultOutputFileName = "myResult.root";
fDefaultOutputTreeName = "NPTool_Tree";
fDefaultRunToReadFileName = "defaultRunToTreat.txt";
fDefaultCalibrationFileName = "defaultCalibration.txt";
fDefaultG4MacroPath = "defaultG4MacroPath.txt";
// Assigned values
fReactionFileName = fDefaultReactionFileName;
fDetectorFileName = fDefaultDetectorFileName;
fOutputFileName = fDefaultOutputFileName;
fOutputTreeName = fDefaultOutputTreeName;
fRunToReadFileName = fDefaultRunToReadFileName;
fCalibrationFileName = fDefaultCalibrationFileName;
fG4MacroPath = fDefaultG4MacroPath;
fLastSimFile = false;
fLastPhyFile = false;
fLastResFile = false;
fLastAnyFile = false;
fVerboseLevel = 1;
fNumberOfEntryToAnalyse = -1;
fDisableAllBranchOption = false;
fInputPhysicalTreeOption = false;
fGenerateHistoOption = false ;
fPROOFMode = false;
fOnline = false;
fG4BatchMode = false;
#ifdef __linux__
fSharedLibExtension = ".so";
#endif
#ifdef __FreeBSD__
fSharedLibExtension = ".so";
#endif
#ifdef __APPLE__
fSharedLibExtension = ".dylib";
#endif
for (int i = 0; i < argc; i++) {
string argument = argv[i];
if (argument == "-H" || argument == "-h" || argument == "--help") DisplayHelp();
else if (argument == "--event-generator" && argc >= i + 1) fReactionFileName = argv[++i] ;
else if (argument == "-E" && argc >= i + 1) fReactionFileName = argv[++i] ;
else if (argument == "--detector" && argc >= i + 1) fDetectorFileName = argv[++i] ;
else if (argument == "-D" && argc >= i + 1) fDetectorFileName = argv[++i] ;
else if (argument == "--output" && argc >= i + 1) fOutputFileName = argv[++i] ;
else if (argument == "-O" && argc >= i + 1) fOutputFileName = argv[++i] ;
else if (argument == "--tree-name" && argc >= i + 1) fOutputTreeName = argv[++i] ;
else if (argument == "--run" && argc >= i + 1) fRunToReadFileName = argv[++i] ;
else if (argument == "-R" && argc >= i + 1) fRunToReadFileName = argv[++i] ;
else if (argument == "--cal" && argc >= i + 1) fCalibrationFileName = argv[++i] ;
else if (argument == "-C" && argc >= i + 1) fCalibrationFileName = argv[++i] ;
else if (argument == "-M" && argc >= i + 1) fG4MacroPath = argv[++i] ;
else if (argument == "-B" && argc >= i + 1) {fG4MacroPath = argv[++i] ;fG4BatchMode=true;}
else if (argument == "-V" && argc >= i + 1) fVerboseLevel = atoi(argv[++i]) ;
else if (argument == "--verbose" && argc >= i + 1) fVerboseLevel = atoi(argv[++i]) ;
else if (argument == "--disable-branch") fDisableAllBranchOption = true ;
else if (argument == "--input-physical") fInputPhysicalTreeOption = true ;
else if (argument == "-IP") fInputPhysicalTreeOption = true ;
else if (argument == "-GH") fGenerateHistoOption = true ;
else if (argument == "-CH") fCheckHistoOption = true ;
else if (argument == "-check-histo") fCheckHistoOption = true ;
else if (argument == "--generate-histo") fGenerateHistoOption = true ;
else if (argument == "--proof") fPROOFMode = true ;
else if (argument == "-L") fNumberOfEntryToAnalyse = atoi(argv[++i]) ;
else if (argument == "--last-sim") fLastSimFile = true ;
else if (argument == "--last-phy") fLastPhyFile = true ;
else if (argument == "--last-res") fLastResFile = true ;
else if (argument == "--last-any") fLastAnyFile = true ;
else if (argument == "--online") {fOnline = true ;fGenerateHistoOption=true;}
//else ;
}
CheckArguments();
if(argc!=0)
DisplayVersion();
}
////////////////////////////////////////////////////////////////////////////////
void NPOptionManager::DisplayVersion(){
if(fVerboseLevel>0){
string line;
line.resize(80,'*');
cout << line << endl;
cout << "*********************************** NPTool ***********************************"<< endl;
cout << line << endl;
cout << " NPLib version: nplib-"<< NPL::version_major <<"-" << NPL::version_minor << "-" << NPL::version_deta <<endl;
cout << " Copyright: NPTool Collaboration "<<endl;
cout << " GitHub: http://github.com/adrien-matta/nptool"<<endl; ;
cout << line << endl;
}
}
////////////////////////////////////////////////////////////////////////////////
NPOptionManager::NPOptionManager(int argc, char** argv){
ReadTheInputArgument(argc,argv);
}
////////////////////////////////////////////////////////////////////////////////
NPOptionManager::NPOptionManager(string arg){
vector<char *> args;
istringstream iss(arg);
string token;
while(iss >> token) {
char *arg = new char[token.size() + 1];
copy(token.begin(), token.end(), arg);
arg[token.size()] = '\0';
args.push_back(arg);
}
args.push_back(0);
ReadTheInputArgument(args.size()-1, &args[0]);
/* for(size_t i = 0; i < args.size(); i++)
delete[] args[i];
*/
}
////////////////////////////////////////////////////////////////////////////////
void NPOptionManager::CheckArguments(){
CheckEventGenerator();
CheckDetectorConfiguration();
}
////////////////////////////////////////////////////////////////////////////////
void NPOptionManager::CheckEventGenerator(){
bool checkFile = true;
// NPTool path
string GlobalPath = getenv("NPTOOL");
string StandardPath = GlobalPath + "/Inputs/EventGenerator/" + fReactionFileName;
// ifstream to configfile
ifstream ConfigFile;
// test if config file is in local path
ConfigFile.open(fReactionFileName.c_str());
if (!ConfigFile.is_open()) {
ConfigFile.open(StandardPath.c_str());
if (!ConfigFile.is_open()) { // if not, assign standard path
checkFile = false;
}
else {
fReactionFileName = StandardPath;
}
}
if (!checkFile && fReactionFileName != fDefaultReactionFileName) { // if file does not exist
SendErrorAndExit("EventGenerator");
}
// close ConfigFile
ConfigFile.close();
}
////////////////////////////////////////////////////////////////////////////////
void NPOptionManager::CheckDetectorConfiguration(){
bool checkFile = true;
// NPTool path
string GlobalPath = getenv("NPTOOL");
string StandardPath = GlobalPath + "/Inputs/DetectorConfiguration/" + fDetectorFileName;
// ifstream to configfile
ifstream ConfigFile;
// test if config file is in local path
ConfigFile.open(fDetectorFileName.c_str());
if (!ConfigFile.is_open()) {
ConfigFile.open(StandardPath.c_str());
if (!ConfigFile.is_open()) { // if not, assign standard path
checkFile = false;
}
else {
fDetectorFileName = StandardPath;
}
}
if (!checkFile && fDetectorFileName != fDefaultDetectorFileName) { // if file does not exist
SendErrorAndExit("DetectorConfiguration");
}
// close ConfigFile
ConfigFile.close();
}
////////////////////////////////////////////////////////////////////////////////
// This method tests if the input files are the default ones
bool NPOptionManager::IsDefault(const char* type) const{
bool result = false;
string stype = type;
if (stype == "EventGenerator") {
if (fReactionFileName == fDefaultReactionFileName) result = true;
}
else if (stype == "DetectorConfiguration") {
if (fDetectorFileName == fDefaultDetectorFileName) result = true;
}
else if (stype == "Calibration") {
if (fCalibrationFileName == fDefaultCalibrationFileName) result = true;
}
else if (stype == "RunToTreat") {
if (fRunToReadFileName == fDefaultRunToReadFileName) result = true;
}
else if (stype == "OutputFileName") {
if (fOutputFileName == fDefaultOutputFileName) result = true;
}
else if (stype == "TreeName") {
if (fOutputTreeName == fDefaultOutputTreeName) result = true;
}
else if (stype == "G4MacroPath") {
if (fG4MacroPath== fDefaultG4MacroPath) result = true;
}
else {
cout << "NPOptionManager::IsDefault() unkwown keyword" << endl;
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
// This method tests if the input files are the default ones
void NPOptionManager::SendErrorAndExit(const char* type) const{
string stype = type;
if (stype == "EventGenerator") {
cout << endl;
cout << "********************************** Error **********************************" << endl;
cout << "* No event generator file found in $NPTool/Inputs/EventGenerator or local directories *" << endl;
cout << "***************************************************************************************" << endl;
cout << endl;
exit(1);
}
else if (stype == "DetectorConfiguration") {
cout << endl;
cout << "*********************************** Error ***********************************" << endl;
cout << "* No detector geometry file found in $NPTool/Inputs/DetectorConfiguration or local directories *" << endl;
cout << "*****************************************************************************************" << endl;
cout << endl;
exit(1);
}
else if (stype == "Calibration") {
}
else if (stype == "RunToTreat") {
}
else {
cout << "NPOptionManager::SendErrorAndExit() unkwown keyword" << endl;
}
}
////////////////////////////////////////////////////////////////////////////////
void NPOptionManager::DisplayHelp(){
DisplayVersion();
cout << endl << "----NPOptionManager Help----" << endl << endl ;
cout << "List of Option " << endl ;
cout << "\t--help -H -h\t\t\tDisplay this help message" << endl ;
cout << "\t--detector -D <arg>\t\tSet arg as the detector configuration file" << endl ;
cout << "\t--event-generator -E <arg>\tSet arg as the event generator file" << endl ;
cout << "\t--output -O <arg>\t\tSet arg as the Output File Name (output tree)" << endl ;
cout << "\t--tree-name <arg>\t\tSet arg as the Output Tree Name " << endl ;
cout << "\t--verbose -V <arg>\t\tSet the verbose level, 0 for nothing, 1 for normal printout."<<endl;
cout << "\t\t\t\t\tError and warning are not affected" << endl ;
cout << endl << "NPAnalysis only:"<<endl;
cout << "\t--run -R <arg>\t\t\tSet arg as the run to read file list" << endl ;
cout << "\t--cal -C <arg>\t\t\tSet arg as the calibration file list" << endl ;
cout << "\t--disable-branch\t\tDisable of branch of Input tree except the one of the detector (faster)" << endl ;
cout << "\t--generate-histo -GH\t\tInstantiate the T*Spectra class of each detector" << endl ;
cout << "\t--check-histo -CH\t\tCheck if the Histogram looks ok and change there color if not" << endl ;
cout << "\t--input-physical -IP\t\tConsider the Input file is containing Physics Class." << endl ;
cout << "\t-L <arg>\t\t\tLimit the number of envent to be analysed to arg" << endl ;
cout << "\t--last-sim\t\t\tIgnore the list of Run to treat if any and analysed the last simulated file" << endl ;
cout << "\t--last-phy\t\t\tIgnore the list of Run to treat if any and analysed the last Physics file" << endl ;
cout << "\t--last-res\t\t\tIgnore the list of Run to treat if any and analysed the last Result file" << endl ;
cout << "\t--last-any\t\t\tIgnore the list of Run to treat if any and analysed the last generated root file" << endl ;
cout << "\t--online \t\t\ttStart the spectra server" << endl ;
cout << endl << "NPSimulation only:"<<endl;
cout << "\t-M <arg>\t\t\tExecute Geant4 macro <arg> at startup" << endl ;
cout << "\t-B <arg>\t\t\tExecute in batch mode (no ui) with Geant4 macro <arg> at startup" << endl ;
cout << endl << endl ;
// exit current program
exit(0);
}
////////////////////////////////////////////////////////////////////////////////
void NPOptionManager::Destroy(){
if (instance != 0) {
delete instance;
instance = 0;
}
}
////////////////////////////////////////////////////////////////////////////////
string NPOptionManager::GetLastFile(){
string path = getenv("NPTOOL");
if(fLastSimFile)
return (path+"/.last_sim_file");
else if(fLastPhyFile)
return (path+"/.last_phy_file");
else if(fLastResFile)
return (path+"/.last_res_file");
else if(fLastAnyFile)
return (path+"/.last_any_file");
else
return "VOID";
}