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

}