/** * @file options.hh * @author Christoph Langenbruch, Renata Kopecna * @date 2009-03-18 * * This file contains the options class which is used to store all the settings which are needed * for the fit. The likelihood, fitter, and plotter classes each * hold a pointer to an options object which must be supplied in their constructor. * On initialisation of the fitter class, the chosen options are printed * and should be redirected to a logfile * */ #ifndef OPTIONS_H #define OPTIONS_H #include #include #include namespace fcnc { ///class that stores the options used in the analysis class options { public: ///number of cores to use unsigned int ncores; ///use angular acceptance in the likelihood bool use_angular_acc; /// fit angular acceptance correction coefficients bool angularacceptance; /// get angular acceptance corrections for every year individually bool angacccorrperyear; /// combine every 2 years (2011+12, 2015+16, 2017+18) for acceptance correction bool angacccorrpertwoyears; /// combine the dataset of both runs for the angular acceptance correction: bool angacccorrbothruns; /// only calculate chi2's from the 1D projections of cos(tl), cos(tk), phi and q2 bool only_4_1D_chi2; /// scan the parametrization of angular acceptance corrections coefficients /// by changing the max. order of legendre polynoms bool scan_max_order_angacccorrection; ///do plots after every step in a toystudy bool project; ///write .eps files bool write_eps; ///write .C files (of plots) bool write_C; ///write .jpg files (of plots) bool write_jpg; ///write .pdf files (of plots) bool write_pdf; ///read only out truthmatched bs candidates from file bool only_truthmatched; ///use only true quantities for the fit. Not implemented yet bool use_truth; ///use numerically optimal summation of likelihoods bool shift_lh; ///repeat on fail bool repeat_on_fail; ///use minos for error calculation bool minos_errors; ///use simplex first bool simplex_prerun; ///use Markov chain Monte Carlo bool use_mcmc; ///hesse postrun bool hesse_postrun; ///use accymptotic hesse, broken at this moment!!! bool asymptotic; ///weighted fit bool weighted_fit; ///generate background with acceptance correction in the PDF bool use_weighted_bkg; ///in the case of a folded and acc corrected fit, use full angular PDF for background bool fit_full_angular_bkg; ///use event q2 when determining weight bool use_event_norm; ///static seed for toys bool static_seed; ///Always use the same seed for toy generation, useful in systematics bool always_static_seed; ///extended ml fit bool extended_ml; ///refitting of nominal values for systematic studies bool refitting_nominal; ///Options to set the mass shape bool crystalball; bool twotailedcrystalball; bool swave; bool simple_mkpi; //THIS TURNS ON FITTING BOTH K*mass and B+ mass //AND it turns off the angle fits bool only_mass2DFit; bool use_p2; //order of fitted polynomials unsigned int eff_order_costhetal; unsigned int eff_order_costhetak; unsigned int eff_order_phi; unsigned int eff_order_q2; int orderincrease; //order of background, currently does nothing, might be useful in the future unsigned int bkg_order_costhetal; unsigned int bkg_order_costhetak; unsigned int bkg_order_phi; //minimum and maximum mass bool cutsignalwindow; double m_min; //signal window left edge double m_max; //signal window right edge double m_low; //considered mass spectrum left edge double m_high; //considered mass spectrum right edge double q2_min;//this is only used in weighted generation double q2_max; //Initialize using the SM values? bool initSM; ///Options for all plots double ctl_min; double ctl_max; double ctk_min; double ctk_max; double phi_min; double phi_max; unsigned int plots_m_bins; unsigned int plots_mkpi_bins; unsigned int plots_costhetal_bins; unsigned int plots_costhetak_bins; unsigned int plots_phi_bins; std::string plot_label; std::string plot_folder; std::string q2_label; bool plot_chi2; std::string name; double minuit_strategy; bool flat_bkg; bool full_angular; //If false, use folding bool always_generate_full_angular; //I have no idea what it does but it is always true everywhere unsigned int fitsperjob; int job_id; //Fit only mass/angles/kpi mass bool only_Bmass; //For whatever fucking reason, this forces mkpi probability to be 1, so unless you don't fit it, set this to false bool only_angles; bool only_mkpi; bool reset_start; //for a simultaneous fit: TRUE if all param names have individual suffix to distinguish between sets of parameters bool use_individual_param_names; bool fit_asymmetries; bool fit_fl; bool fit_afb; bool fit_pprimes; //fit m(Kpi) mass spectrum? bool fit_mkpi; //4D+1D fit bool fit_lambda; //use the information of the m(Kpi) dimension in the angular_prob bool use_mkpi; //5D fit bool individual_penalties; double mkpi_min; double mkpi_max; bool update_efficiencies; bool squared_hesse; bool mkpi_threshold; bool mkpi_full_range_norm; //Generation bool generate_mkpi; bool generate_only_bkg; bool isobar; bool multiply_eff; bool cache_fis; bool mcweight; bool chisquaredstudy; int systematic; bool useMC; int run; int year; int verbose; std::string DDLL; bool DTF; bool KS; std::vector TheQ2binsmin; std::vector TheQ2binsmax; bool IsFlatQ2; int folding; bool reject_identical_muon_TRUEID; //File used for latex output //TODO std::string latexFileTag; ///constructor options(std::string argument=""): ncores(1), use_angular_acc(false), angularacceptance(false), angacccorrperyear(false), angacccorrpertwoyears(false), angacccorrbothruns(false), only_4_1D_chi2(false), scan_max_order_angacccorrection(false), project(false), write_eps(false), write_C(false), write_jpg(false), write_pdf(false), shift_lh(false), repeat_on_fail(false), minos_errors(false), simplex_prerun(false), use_mcmc(false), hesse_postrun(true), asymptotic(false), weighted_fit(false), use_weighted_bkg(false), fit_full_angular_bkg(true), use_event_norm(false), static_seed(false), always_static_seed(false), extended_ml(false), refitting_nominal(true), crystalball(!DOUBLE_CB), twotailedcrystalball(DOUBLE_CB), swave(false), simple_mkpi(false), only_mass2DFit(false), use_p2(false), eff_order_costhetal(ORDER_COSTHETAL), eff_order_costhetak(ORDER_COSTHETAK), eff_order_phi(ORDER_PHI), eff_order_q2(ORDER_Q2), orderincrease(0), bkg_order_costhetal(2), //TODO bkg_order_costhetak(4), //TODO bkg_order_phi(0), //TODO cutsignalwindow(false), m_min(PDGMASS_B-B_MASS_TIGHT_WINDOW), m_max(PDGMASS_B+B_MASS_TIGHT_WINDOW), m_low(B_MASS_LOW), m_high(B_MASS_HIGH), q2_min(-1.0), q2_max(-1.0), initSM(false), ctl_min(CTL_MIN), ctl_max(CTL_MAX), ctk_min(CTK_MIN), ctk_max(CTK_MAX), phi_min(PHI_MIN), phi_max(PHI_MAX), plots_m_bins(PLOT_NBINS_MB), plots_mkpi_bins(PLOT_NBINS_MKSTAR), plots_costhetal_bins(PLOT_NBINS_ANGLES), plots_costhetak_bins(PLOT_NBINS_ANGLES), plots_phi_bins(PLOT_NBINS_ANGLES), plot_label("LHCb 9.1 fb^{-1}"), plot_folder(""), q2_label("1.1 < q^2 < 19.0"), plot_chi2(false), name(argument), minuit_strategy(2.0), flat_bkg(false), full_angular(false), always_generate_full_angular(true), fitsperjob(10), job_id(-1), only_Bmass(false), only_angles(false), only_mkpi(false), reset_start(true), use_individual_param_names(false), fit_asymmetries(false), fit_fl(false), fit_afb(false), fit_pprimes(false), fit_mkpi(false), fit_lambda(false), use_mkpi(false), individual_penalties(false), mkpi_min(KPI_MASS_MIN), mkpi_max(KPI_MASS_MAX), update_efficiencies(true), squared_hesse(true), mkpi_threshold(false), mkpi_full_range_norm(false), generate_mkpi(false), generate_only_bkg(false), isobar(false), multiply_eff(false), cache_fis(false), mcweight(false), //Not changed anywhere, only in pdf to decide what weights to use and there it is always true, no clue what it is supposed to do chisquaredstudy(false), systematic(-1), useMC(false), run(-1), year(-1), verbose(2), //Set to info DDLL("DD"), DTF(true), KS(true), TheQ2binsmin(std::vector(6, 0.0)), TheQ2binsmax(std::vector(6, 0.0)), IsFlatQ2(true), folding(-1), reject_identical_muon_TRUEID(false), latexFileTag("_basic") //TODO { }; //assignment operator: options operator=(const options o){ //self-assignment guard // if (this == &o) //TODO: requires operator== // return *this; ncores = o.ncores; use_angular_acc = o.use_angular_acc; angularacceptance = o.angularacceptance; angacccorrperyear = o.angacccorrperyear; angacccorrpertwoyears = o.angacccorrpertwoyears; angacccorrbothruns = o.angacccorrbothruns; only_4_1D_chi2 = o.only_4_1D_chi2; scan_max_order_angacccorrection = o.scan_max_order_angacccorrection; project = o.project; write_eps = o.write_eps; write_C = o.write_C; write_jpg = o.write_jpg; write_pdf = o.write_pdf; only_truthmatched = o.only_truthmatched; use_truth = o.use_truth; shift_lh = o.shift_lh; repeat_on_fail = o.repeat_on_fail; minos_errors = o.minos_errors; simplex_prerun = o.simplex_prerun; use_mcmc = o.use_mcmc; asymptotic = o.asymptotic; hesse_postrun = o.hesse_postrun; weighted_fit = o.weighted_fit; use_weighted_bkg = o.use_weighted_bkg; fit_full_angular_bkg = o.fit_full_angular_bkg; use_event_norm = o.use_event_norm; static_seed = o.static_seed; always_static_seed = o.always_static_seed; extended_ml = o.extended_ml; refitting_nominal = o.refitting_nominal; crystalball = o.crystalball; twotailedcrystalball = o.twotailedcrystalball; swave = o.swave; simple_mkpi = o.simple_mkpi; only_mass2DFit = o.only_mass2DFit; use_p2 = o.use_p2; eff_order_costhetal = o.eff_order_costhetal; eff_order_costhetak = o.eff_order_costhetak; eff_order_phi = o.eff_order_phi; eff_order_q2 = o.eff_order_q2; bkg_order_costhetal = o.bkg_order_costhetal; bkg_order_costhetak = o.bkg_order_costhetak; bkg_order_phi = o.bkg_order_phi; orderincrease = o.orderincrease; cutsignalwindow = o.cutsignalwindow; m_min = o.m_min; m_max = o.m_max; m_low = o.m_low; m_high = o.m_high; q2_min = o.q2_min; q2_max = o.q2_max; initSM = o.initSM; ctl_min = o.ctl_min; ctl_max = o.ctl_max; ctk_min = o.ctk_min; ctk_max = o.ctk_max; phi_min = o.phi_min; phi_max = o.phi_max; plots_m_bins = o.plots_m_bins; plots_mkpi_bins = o.plots_mkpi_bins; plots_costhetal_bins = o.plots_costhetal_bins; plots_costhetak_bins = o.plots_costhetak_bins; plots_phi_bins = o.plots_phi_bins; plot_label = o.plot_label; plot_folder = o.plot_folder; q2_label = o.q2_label; plot_chi2 = o.plot_chi2; name = o.name; minuit_strategy = o.minuit_strategy; flat_bkg = o.flat_bkg; full_angular = o.full_angular; always_generate_full_angular = o.always_generate_full_angular; fitsperjob = o.fitsperjob; job_id = o.job_id; only_Bmass = o.only_Bmass; only_angles = o.only_angles; only_mkpi = o.only_mkpi; reset_start = o.reset_start; use_individual_param_names = o.use_individual_param_names; fit_asymmetries = o.fit_asymmetries; fit_fl = o.fit_fl; fit_afb = o.fit_afb; fit_pprimes = o.fit_pprimes; fit_mkpi = o.fit_mkpi; fit_lambda = o.fit_lambda; use_mkpi = o.use_mkpi; individual_penalties = o.individual_penalties; mkpi_min = o.mkpi_min; mkpi_max = o.mkpi_max; update_efficiencies = o.update_efficiencies; squared_hesse = o.squared_hesse; mkpi_threshold = o.mkpi_threshold; mkpi_full_range_norm = o.mkpi_full_range_norm; generate_mkpi = o.generate_mkpi; generate_only_bkg = o.generate_only_bkg; isobar = o.isobar; multiply_eff = o.multiply_eff; cache_fis = o.cache_fis; mcweight = o.mcweight; chisquaredstudy = o.chisquaredstudy; systematic = o.systematic; useMC = o.useMC; run = o.run; year = o.year; verbose = o.verbose; DDLL = o.DDLL; DTF = o.DTF; KS = o.KS; TheQ2binsmin = o.TheQ2binsmin; TheQ2binsmax = o.TheQ2binsmax; IsFlatQ2 = o.IsFlatQ2; folding = o.folding; reject_identical_muon_TRUEID = o.reject_identical_muon_TRUEID; return *this; } int get_job_id(); //Check if the angle ranges are not interfering with the folding bool canIFold(); void reset_angle_ranges(); void update_angle_ranges(); unsigned int get_nQ2bins(); //Reutrns a vector with strings of all types that are required by write_eps, write_C, write_jpg and write_pdf std::vector getAllPlotTypes(); void print(); }; } std::vector get_observables_vec (fcnc::options opts); //TODO: add into fcnc class void set_ang_year_options(fcnc::options &opts); //If true, than the parameter is folded and typically set to 0 //TODO: add into fcnc class bool is_param_folded(int param, fcnc::options *opts); #endif