228 lines
7.5 KiB
C++
228 lines
7.5 KiB
C++
|
//Renata Kopecna
|
||
|
|
||
|
#include "parse.hh"
|
||
|
|
||
|
#include <iostream>
|
||
|
#include <assert.h>
|
||
|
#include <help.hh>
|
||
|
#include <constants.hh>
|
||
|
#include <spdlog.h>
|
||
|
//--------------------------------------//
|
||
|
// Helpers for parsing the options //
|
||
|
//--------------------------------------//
|
||
|
|
||
|
int parseOpts(int argc, char *argv[], basic_params &par, basic_actions &act, int nMCEvents){
|
||
|
|
||
|
int opt = 0;
|
||
|
|
||
|
//Check if there are any arguments
|
||
|
if(argc > 1){
|
||
|
spdlog::info("Got a total of {0:d} input options.", argc);
|
||
|
}
|
||
|
else{
|
||
|
spdlog::error("No arguments given to the program. Use '-h' to see options. Exit...");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
//Loop over all arguments and set par and act accordingly
|
||
|
//no questionmark: value afterwards, questionamrk = bool
|
||
|
while((opt = getopt(argc, argv, "a?:b:c?:d:e:f:g:h?:i:j:k?:l?:m?:o:p?:q?:r:s:t?:u:v:w?:x?:y:z:")) != -1){
|
||
|
switch(opt) {
|
||
|
case 'a': //action: do angular resolution
|
||
|
spdlog::info("Get angular resolutions!");
|
||
|
act.angRes = true;
|
||
|
break;
|
||
|
case 'b':
|
||
|
par.bin = atoi(optarg);
|
||
|
spdlog::info("Running on q2 bin ", par.bin);
|
||
|
break;
|
||
|
case 'c':
|
||
|
spdlog::info("Get angular corrections!");
|
||
|
//par.dataset = 3; //Always use MC //Not needed, as PHSP is hardcoded in the corrections obvsly
|
||
|
act.angCorr = true;
|
||
|
break;
|
||
|
case 'd':
|
||
|
par.dataset = atoi(optarg);
|
||
|
if (par.dataset < 0 || par.dataset > 5){
|
||
|
spdlog::error("Dataset can be only 0 - 5!");
|
||
|
spdlog::info("0 for signal data");
|
||
|
spdlog::info("1 for signal MC, 2 for Jpsi MC");
|
||
|
spdlog::info("3 for PHSP");
|
||
|
spdlog::info("4 for PHSP genLVL MC");
|
||
|
spdlog::info("5 for signal genLvl MC");
|
||
|
return 1;
|
||
|
}
|
||
|
else{
|
||
|
spdlog::info("Using dataset {0:d}", par.dataset);
|
||
|
}
|
||
|
break;
|
||
|
case 'e':
|
||
|
par.nEvents = atoi(optarg);
|
||
|
spdlog::info("Running on {0:d} events.", par.nEvents);
|
||
|
break;
|
||
|
case 'f':
|
||
|
act.fitType = atoi(optarg);
|
||
|
if (act.fitType < 0 || act.fitType > 6){
|
||
|
spdlog::error("Fit option can be only 0 - 6!");
|
||
|
return 1;
|
||
|
}
|
||
|
else{
|
||
|
spdlog::info("Fitting with option {0:d}!", act.fitType);
|
||
|
}
|
||
|
break;
|
||
|
case 'g':
|
||
|
par.folding = atoi(optarg);
|
||
|
if (par.folding < 0 || par.folding > 5){
|
||
|
spdlog::error("Use only folding 0 - 4. Plus option 5 for looping over all foldings.");
|
||
|
return 1;
|
||
|
}
|
||
|
spdlog::info("Using folding {0:d}.", par.folding);
|
||
|
break;
|
||
|
case 'h':
|
||
|
print_help();
|
||
|
print_errorCodes();
|
||
|
return 0;
|
||
|
case 'i':
|
||
|
par.index = atoi(optarg);
|
||
|
spdlog::info("Using index {0:d}.", par.index);
|
||
|
break;
|
||
|
case 'j':
|
||
|
par.jobID = atoi(optarg);
|
||
|
spdlog::info("Using job index {0:d}.", par.jobID);
|
||
|
break;
|
||
|
case 'k':
|
||
|
spdlog::info("Convert events!");
|
||
|
spdlog::info("Don't forget to specify what year/run/dataset.");
|
||
|
act.convert = true;
|
||
|
break;
|
||
|
case 'l':
|
||
|
spdlog::info("Likelyhood profiles on!");
|
||
|
par.likelyhood = true;
|
||
|
break;
|
||
|
case 'm':
|
||
|
spdlog::info("Getting pulls from MC");
|
||
|
act.pullsMC = true;
|
||
|
break;
|
||
|
case 'o':
|
||
|
spdlog::info("Feldman cousins!");
|
||
|
par.FeldCous = true;
|
||
|
break;
|
||
|
case 'p':
|
||
|
spdlog::info("Using P' instead of S!");
|
||
|
par.usePprime = true;
|
||
|
break;
|
||
|
case 'q':
|
||
|
spdlog::info("Looking into reference channel!");
|
||
|
par.reference = true;
|
||
|
break;
|
||
|
case 'r':
|
||
|
par.Run = atoi(optarg);
|
||
|
if(par.Run != 0 && par.Run != 1 && par.Run != 2 && par.Run != 12 && par.Run != 21 && par.Run != 22){
|
||
|
spdlog::error("Used incorrect input as Run number! Can be 1, 2, 12, 21, 22 or 0 in case of per-year running.");
|
||
|
return 1;
|
||
|
}
|
||
|
else{
|
||
|
spdlog::info("Use data of Run {0:d}", par.Run);
|
||
|
}
|
||
|
break;
|
||
|
case 's':
|
||
|
act.systematics = atoi(optarg);
|
||
|
spdlog::info("Systematic study {0:d}.", act.systematics);
|
||
|
break;
|
||
|
case 't':
|
||
|
act.pullsToys = true;
|
||
|
spdlog::info("Getting pulls from toys");
|
||
|
break;
|
||
|
case 'u':
|
||
|
par.nBins = atoi(optarg);
|
||
|
spdlog::info("Number of used q2 bins: {0:d}.", par.nBins);
|
||
|
if (par.nBins != 0 && par.nBins != 1 && par.nBins != 2 && par.nBins !=4 && par.nBins !=5
|
||
|
&& par.nBins !=8 && par.nBins !=9){ //I hope that is all :D
|
||
|
spdlog::error("Wrong number of bins! Can be either 1, 2, 4 or 5 (or 8)!");
|
||
|
return 1;
|
||
|
}
|
||
|
break;
|
||
|
case 'v':
|
||
|
par.verbosity = atoi(optarg); //Set verbosity level
|
||
|
break;
|
||
|
case 'w':
|
||
|
act.genToys = true; //Fit generated toys. It requires -e to be set!
|
||
|
break;
|
||
|
case 'x':
|
||
|
act.script = true; //Run whatever script you like
|
||
|
spdlog::info("Running whatever is defined in RunningScripts");
|
||
|
break;
|
||
|
case 'y':
|
||
|
par.year = atoi(optarg);
|
||
|
spdlog::info("Running on year {0:d}.", par.year);
|
||
|
par.Run = 0; //Set Run=0 so it is clear what is used
|
||
|
break;
|
||
|
case 'z':
|
||
|
par.testInt = atoi(optarg);
|
||
|
spdlog::info("testInt: {0:d}.", par.testInt);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
//parse the options
|
||
|
|
||
|
}
|
||
|
|
||
|
int checkYear(basic_params par){
|
||
|
if (par.Run == -1 && par.year == -1){
|
||
|
spdlog::error("I need run/years specified!");
|
||
|
return 1;
|
||
|
}
|
||
|
else return 0;
|
||
|
}
|
||
|
|
||
|
int checkDataset(basic_params par){
|
||
|
if (par.dataset == -1){
|
||
|
spdlog::error("I need dataset specified!");
|
||
|
return 1;
|
||
|
}
|
||
|
if (par.dataset == 2){
|
||
|
par.reference = true;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int checkOpts(basic_params &par, basic_actions &act){
|
||
|
//TODO: enhance as you add more options to act
|
||
|
if (act.angRes){ //-a
|
||
|
if (checkYear(par) == 1) return 1;
|
||
|
}
|
||
|
if (act.angCorr){ //-c
|
||
|
if (par.index != -1){ //-i, means to scan the corrections
|
||
|
act.angCorrScan = true;
|
||
|
act.angCorr = false;
|
||
|
}
|
||
|
}
|
||
|
if (act.convert){
|
||
|
if (checkYear(par) == 1) return 1;
|
||
|
if (checkDataset(par) == 1) return 1;
|
||
|
}
|
||
|
if (act.fitType != -1){
|
||
|
if (checkYear(par) == 1) return 1;
|
||
|
if (checkDataset(par) == 1) return 1;
|
||
|
}
|
||
|
if (act.fitType == 4){ //Check if dataset is not data
|
||
|
if (par.dataset == 0) return 1;
|
||
|
//If MC fit, i can set the polarity, useful for checks
|
||
|
if (par.index == 1) par.polarity = 1;
|
||
|
if (par.index == 2) par.polarity = -1;
|
||
|
}
|
||
|
if (par.nBins == -1){
|
||
|
spdlog::warn("Number of bins in q2 is not set! Using default settings of {0:d} bins!",NBINS_DEFAULT);
|
||
|
par.nBins = NBINS_DEFAULT;
|
||
|
}
|
||
|
if (act.genToys){
|
||
|
if (par.nEvents == -1){
|
||
|
spdlog::warn("Number of events ot be generated is not set! Using default settings of 100 events!");
|
||
|
par.nEvents = 100; //Generate a default number of toy events
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|