|
|
/**
* @file bu2kstarmumu_parameters.hh * @author Christoph Langenbruch, Renata Kopecna * @date 2009-03-18 * */
#ifndef BU2KSTARMUMU_PARAMETERS_H
#define BU2KSTARMUMU_PARAMETERS_H
#include <parameters.hh>
#include <options.hh>
#include <assert.h>
//Simple struct to see whether fix or constrain a parameter
struct fixConstr{ bool fix = false; bool constrain = false; //Constructor
fixConstr(bool b_fix, bool b_constr); };
namespace fcnc {
///class that implements the different parameter sets for Bd -> Kstar mu mu
class bu2kstarmumu_parameters: public parameters { private: ///adds all parameters to the params vector
void add_parameters(); options* opts;
public: ///constructor uses toy challenge version 1 data as default
bu2kstarmumu_parameters(options* o);
///use default B+ values
/// //THIS IS SOMETHING EVERY ANALYSIS HAS TO CHANGE ON THEIR OWN!
void use_default_bkg(); //Just reset bkg, useful in the code down the line
void use_default_observables(); //Reset S-wave observables, useful in the code down the line
void use_default();
//simple and quick loading and saving of parameters to/from txt file
void load_param_values(std::string filename); void load_param(std::string filename, std::string parname);
int get_param_from_rootfile(std::string fileName, std::vector<std::string> names, int PDF, int bin, fixConstr FC);
//Fix parameter to a value from a root file
int fix_param_from_rootfile(std::string fileName, std::vector<std::string> names, int PDF, int bin); //Constrain parameter to a value from a root file
int constrain_param_from_rootfile(std::string fileName, std::vector<std::string>names, int PDF, int bin); //Initialize parameter from a root file and let if float as it wishes
int load_param_from_rootfile(std::string fileName,std::vector<std::string> names, int PDF, int bin);
//TODO: remove as it is obsolete when done with pulls.cc
void load_only_bckgnd_param_values(std::string filename); void load_only_Bmass_param_values(std::string filename);
//Initialize parameters in the fit
void init_mass_parameters(int PDF, int nBins, int bin, double defaultStepSize); void init_angular_background_parameters(bool fitReference, double stepsize); void init_kpi_background_parameters(bool fitReference, double stepsize); void init_mkpi_pWave_parameters(bool fitReference, double stepsize); void init_mkpi_sWave_parameters(bool fitReference, double stepsize); void init_mass_background_parameters(int nBins, int bin, bool useLambda); void init_angular_parameters(int nBins, int bin, double stepsize, double scale, bool blind); void init_Bmass(std::string fileName, int PDF, double stepSize, fixConstr FC); void init_ang_parameters_fromRefDavid(double stepsize, double scale, bool blind); void init_sWave_parameters(double stepsize);
void save_param_values(std::string filename);
//Effective q2
parameter eff_q2 = parameter("eff_q2", "{q^{2}}_eff");
//Number of signal/background events
parameter n_sig = parameter("n_sig", "N_\\mathrm{sig}"); parameter n_bkg = parameter("n_bkg", "N_\\mathrm{bkg}");
//Fraction of signal events, effectivelly (nsig/(nsig+nbkg)))
parameter f_sig = parameter("f_sig", "f_\\mathrm{sig}");
//The B massneeds the full range of the B-mass fit,
//as it decides the range of the data used in the fit
parameter m_b = parameter("m_b", "m_{B^{+}}");
//All mass parameters
parameter m_res_1 = parameter("m_res_1", "f_{CB}"); parameter m_scale = parameter("m_scale", "s_\\mathrm{m}"); parameter m_sigma_1 = parameter("m_sigma_1", "#sigma_{1}^{CB}"); parameter m_sigma_2 = parameter("m_sigma_2", "#sigma_{2}^{CB}"); parameter alpha_1 = parameter("alpha_1", "#alpha_{1}^{CB}"); parameter alpha_2 = parameter("alpha_2", "#alpha_{2}^{CB}"); parameter n_1 = parameter("n_1", "n_{1}^{CB}"); parameter n_2 = parameter("n_2", "n_{2}^{CB}");
//These are for exponential background, either exp(-lambda*x) or exp(x/tau) 
parameter fm_tau = parameter("fm_tau", "f_{m,#tau}"); parameter m_lambda = parameter("m_lambda", "\\lambda_\\mathrm{m}"); parameter m_lambda_2 = parameter("m_lambda_2", "\\lambda_\\mathrm{m,2}"); parameter m_tau = parameter("m_tau", "#tau_{m,1}"); parameter m_tau_2 = parameter("m_tau_2", "#tau_{m,2}");
//Kstar related parameters /
parameter mkstar = parameter("mkst","m(K^{*+})"); parameter mkstarplus = parameter("mkstz","m(K^{*+}_{x})"); //K1+ resonances
parameter mkstp = parameter("mkstp", "m(K^+\\pi^0)"); //TODO
parameter gammakstar = parameter("gammakstar", "\\Gamma(K^{*+})"); //Width of K*
parameter gammakstarplus = parameter("gamkstp", "\\Gamma(K^+\\pi^0)"); //Width of K1
//parameter gamkstp = parameter("gamkstp", "\\Gamma(K^+\\pi^0)");
//Afb and FL, S- and P- parameters are in S_pars(int) and P_pars(int)
parameter fl = parameter("Fl", "F_{L}"); parameter afb = parameter("Afb", "A_{FB}");
//double exponential bkg
parameter Fl = parameter("Fl", "F_{L}"); parameter S1s = parameter("S1s", "S_{1s}"); parameter S3 = parameter("S3", "S_{3}"); parameter S4 = parameter("S4", "S_{4}"); parameter S5 = parameter("S5", "S_{5}"); parameter Afb = parameter("Afb", "A_{FB}"); parameter S6s = parameter("S6s", "S_{6s}"); parameter S7 = parameter("S7", "S_{7}"); parameter S8 = parameter("S8", "S_{8}"); parameter S9 = parameter("S9", "S_{9}");
//less FF dependent variables P_i
parameter P1 = parameter("P1", "P_{1}");//=2*S3/(1-Fl)
parameter P2 = parameter("P2", "P_{2}");//=0.5*S6/(1-Fl)
parameter P3 = parameter("P3", "P_{3}");//=-S9/(1-Fl)
parameter P4 = parameter("P4", "P_{4}^{\\prime}");//=S4/sqrt(Fl Ft)
parameter P5 = parameter("P5", "P_{5}^{\\prime}");//=S5/sqrt(Fl Ft)
parameter P6 = parameter("P6", "P_{6}^{\\prime}");//=S7/sqrt(Fl Ft)
parameter P8 = parameter("P8", "P_{8}^{\\prime}");//=S8/sqrt(Fl Ft)
//S-wave parameters
parameter FS = parameter("FS" ,"F_{S}"); parameter SS1 = parameter("SS1","S_{S1}"); parameter SS2 = parameter("SS2","S_{S2}"); parameter SS3 = parameter("SS3","S_{S3}"); parameter SS4 = parameter("SS4","S_{S4}"); parameter SS5 = parameter("SS5","S_{S5}");
//More Kstar related parameters
parameter asphase = parameter("asphase", "arg(A_{S})"); //Control the K* shape; one is ~p(K*) and one is ~1/p(K*),
parameter a = parameter("a", "a"); parameter r = parameter("r", "r");
//Related to kappa(800), or f(800), it changed name apparently
//Essentially a wide resonance
parameter mf800 = parameter("mf800","m(f_{800})"); parameter gammaf800 = parameter("gamf800","\\Gamma(f_{800})"); parameter f800mag = parameter("f800mag","|f_{800}|"); parameter f800phase = parameter("f800phase","arg(f_{800})");
//R (also refered to as d in the literature)
//is a parameter in the mkpi parameterisation.
//It refers to the effective hadronic size
//See L861f (page 66) of https://cds.cern.ch/record/2318554/files/LHCb-ANA-2018-022.pdf
parameter R = parameter("R", "R"); //As a standard this is the radius of a B messon
//Background parameters
//Polynomial of maximal order of four
//Each parameter correspons to x^n
//Eg cbkgctl1 and cbkgctl3 are non-zero, rest is zero means polynomial
// x^1 + x^3
//ctl
parameter cbkgctl0 = parameter("cbkgctl0", "c_{bkg}^{0}(cos#Theta_{L})"); parameter cbkgctl1 = parameter("cbkgctl1", "c_{bkg}^{1}(cos#Theta_{L})"); parameter cbkgctl2 = parameter("cbkgctl2", "c_{bkg}^{2}(cos#Theta_{L})"); parameter cbkgctl3 = parameter("cbkgctl3", "c_{bkg}^{3}(cos#Theta_{L})"); parameter cbkgctl4 = parameter("cbkgctl4", "c_{bkg}^{4}(cos#Theta_{L})"); //ctk
parameter cbkgctk0 = parameter("cbkgctk0", "c_{bkg}^{0}(cos#Theta_{K})"); parameter cbkgctk1 = parameter("cbkgctk1", "c_{bkg}^{1}(cos#Theta_{K})"); parameter cbkgctk2 = parameter("cbkgctk2", "c_{bkg}^{2}(cos#Theta_{K})"); parameter cbkgctk3 = parameter("cbkgctk3", "c_{bkg}^{3}(cos#Theta_{K})"); parameter cbkgctk4 = parameter("cbkgctk4", "c_{bkg}^{4}(cos#Theta_{K})"); parameter cbkgctk5 = parameter("cbkgctk5", "c_{bkg}^{5}(cos#Theta_{K})"); parameter cbkgctk6 = parameter("cbkgctk6", "c_{bkg}^{6}(cos#Theta_{K})"); //phi
parameter cbkgphi0 = parameter("cbkgphi0", "c_{bkg}^{0}(#phi)"); parameter cbkgphi1 = parameter("cbkgphi1", "c_{bkg}^{0}(#phi)"); parameter cbkgphi2 = parameter("cbkgphi2", "c_{bkg}^{0}(#phi)"); parameter cbkgphi3 = parameter("cbkgphi3", "c_{bkg}^{0}(#phi)"); parameter cbkgphi4 = parameter("cbkgphi4", "c_{bkg}^{0}(#phi)");
//mkpi
parameter cbkgmkpi0 = parameter("cbkgmkpi0", "c_{bkg}^{0}(m_{K#pi})"); parameter cbkgmkpi1 = parameter("cbkgmkpi1", "c_{bkg}^{1}(m_{K#pi})"); parameter cbkgmkpi2 = parameter("cbkgmkpi2", "c_{bkg}^{2}(m_{K#pi})"); parameter cbkgmkpi3 = parameter("cbkgmkpi3", "c_{bkg}^{3}(m_{K#pi})"); parameter cbkgmkpi4 = parameter("cbkgmkpi4", "c_{bkg}^{4}(m_{K#pi})");
//Fancy background to mkpi in the p^2 dimension
parameter cswavemkpi0 = parameter("cswavemkpi0", "c_{S}^{0}(m_{K#pi})"); parameter cswavemkpi1 = parameter("cswavemkpi1", "c_{S}^{1}(m_{K#pi})"); parameter cswavemkpi2 = parameter("cswavemkpi2", "c_{S}^{2}(m_{K#pi})"); parameter cswavemkpi3 = parameter("cswavemkpi3", "c_{S}^{3}(m_{K#pi})"); parameter cswavemkpi4 = parameter("cswavemkpi4", "c_{S}^{4}(m_{K#pi})");
parameter cbkgp20 = parameter("cbkgp20", "c_{bkg}^{0}(p^{2})"); parameter cbkgp21 = parameter("cbkgp21", "c_{bkg}^{1}(p^{2})"); parameter cbkgp22 = parameter("cbkgp22", "c_{bkg}^{2}(p^{2})"); parameter cbkgp23 = parameter("cbkgp23", "c_{bkg}^{3}(p^{2})"); parameter cbkgp24 = parameter("cbkgp24", "c_{bkg}^{4}(p^{2})");
//Nobody used this ever, probably not even in the PDF
parameter nthreshold = parameter("nthreshold", "n_{thr.}");
double J1s() const { return 3.0/4.0*(1.0-J1c()); // 3/4*(1-F_L)
}; double J1c() const { if (opts->fit_pprimes) assert(opts->fit_fl); if (opts->fit_fl) return Fl(); else return 1.0-4.0/3.0*S1s(); }; double J2s() const { return J1s()/3.0; //1/4(1-F_L)
}; double J2c() const { return -J1c(); //-F_L
}; double J3() const {//P1;//=S3/(1-Fl) correction P1=2S3/(1-FL)
if (opts->fit_pprimes) return 0.5*P1()*(1.0-J1c()); else return S3(); }; double J4() const {//P4;//=S4/sqrt(Fl Ft)
if (opts->fit_pprimes) return P4()*sqrt(J1c()*(1.0-J1c())); else return S4(); }; double J5() const {//P5;//=S5/sqrt(Fl Ft)
if (opts->fit_pprimes) return P5()*sqrt(J1c()*(1.0-J1c())); else return S5(); }; double J6s() const {//P2;//=S6/(1-Fl) correction P2=0.5*S6s/(1-FL)
if (opts->fit_pprimes) return 2.0*P2()*(1.0-J1c()); else if (opts->fit_afb) return 4.0/3.0*Afb(); else return S6s(); }; double J6c() const { return 0.0; }; double J7() const {//P6;//=S7/sqrt(Fl Ft)
if (opts->fit_pprimes) return P6()*sqrt(J1c()*(1.0-J1c())); else return S7(); }; double J8() const {//P8;//=S8/sqrt(Fl Ft)
if (opts->fit_pprimes) return P8()*sqrt(J1c()*(1.0-J1c())); else return S8(); }; double J9() const {//P3;//=S9/(1-Fl) correction P3=-S9/(1-FL)
if (opts->fit_pprimes) return -P3()*(1.0-J1c()); else return S9(); }; };
}
//Returns value or error of a parameter from a rootFile
double get_param_value_from_rootfile(std::string fileName, std::string names, int PDF, int bin); double get_param_error_from_rootfile(std::string fileName, std::string names, int PDF, int bin);
//Returns a scaled number of events in given bin from total number of events in data
double eventsInBin_fraction(int bin, int run, int nBins, bool fromRef);
//Returns a scaled number of events in given bin from total number of events
//Eg I want to have 1000 events in 4 bins and 2 pdfs, it generates 155 signal + 100 bkg events in bin1, 125+120 in bin2, 180 + 50 in bin3 and 200+70 in bin4 as random example
void EventNumbers(unsigned int bin, unsigned int pdf, double & fraction, unsigned int & eventnumbers,unsigned int TotalEvents, unsigned int bins, unsigned int pdfs);
#endif
|