Angular analysis of B+->K*+(K+pi0)mumu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

227 lines
7.5 KiB

//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;
}