//Renata Kopecna #include "parse.hh" #include #include #include #include #include //--------------------------------------// // 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; }