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.
 
 
 
 

119 lines
4.8 KiB

#include "GlobalFunctions.hh"
#include "SignalPdf.hpp"
using namespace std;
using namespace RooFit;
using namespace RooStats;
//pdfs signal
RooGaussian* SignalPdf::GaussBplus1(RooRealVar *B_plus_M, RooRealVar *mean, bool fitRef){
RooRealVar *sigma = getRooRealVar("sigma",true,fitRef);
SigRooVars.push_back(sigma);
RooGaussian* gaus = new RooGaussian("GaussBplus1","GaussBplus1",*B_plus_M, *mean, *sigma);
if (verboseLevel <2) gaus->Print();
return gaus;
}
RooGaussian* SignalPdf::GaussBplus2(RooRealVar *B_plus_M, RooRealVar *mean, bool fitRef){
RooRealVar *sigma = getRooRealVar("sigma2",true,fitRef);
SigRooVars.push_back(sigma);
RooGaussian *gaus = new RooGaussian("GaussBplus2","GaussBplus2",*B_plus_M, *mean, *sigma);
if (verboseLevel <2) gaus->Print();
return gaus;
}
RooCBShape* SignalPdf::CBBplus1(RooRealVar *B_plus_M, RooRealVar *mean, bool fitRef){ //could be shortened using the vectors
RooRealVar *sigma = getRooRealVar("sigma",true,fitRef);
RooRealVar *alpha = getRooRealVar("alpha",true);
RooRealVar *n = getRooRealVar("n",true);
SigRooVars.push_back(sigma);
SigRooVars.push_back(alpha);
SigRooVars.push_back(n);
RooCBShape *CB = new RooCBShape("CBBplus1", "CBBplus1", *B_plus_M, *mean, *sigma, *alpha, *n);
if (verboseLevel <2) CB->Print();
return CB;
}
RooCBShape* SignalPdf::CBBplus2(RooRealVar *B_plus_M, RooRealVar *mean, bool fitRef){
RooRealVar *sigma = getRooRealVar("sigma2",true,fitRef);
RooRealVar *alpha = getRooRealVar("alpha2",true);
RooRealVar *n = getRooRealVar("n2",true);
SigRooVars.push_back(sigma);
SigRooVars.push_back(alpha);
SigRooVars.push_back(n);
RooCBShape *CB = new RooCBShape("CBBplus2", "CBBplus2", *B_plus_M, *mean, *sigma, *alpha, *n);
if (verboseLevel <2) CB->Print();
return CB;
}
RooDoubleCB* SignalPdf::CBBplus(RooRealVar *B_plus_M, RooRealVar *mean, bool fitRef){
RooRealVar *sigma = getRooRealVar("sigma",true,fitRef);
RooRealVar *alpha = getRooRealVar("alpha",true);
RooRealVar *alpha2 = getRooRealVar("alpha2",true);
RooRealVar *n = getRooRealVar("n",true);
RooRealVar *n2 = getRooRealVar("n2",true);
SigRooVars.push_back(sigma);
SigRooVars.push_back(alpha);
SigRooVars.push_back(alpha2);
SigRooVars.push_back(n);
SigRooVars.push_back(n2);
RooDoubleCB *CB = new RooDoubleCB("OneCBBplus", "OneCBBplus", *B_plus_M, *mean, *sigma, *alpha, *n, *alpha2, *n2);
if (verboseLevel <2) CB->Print();
return CB;
}
//Final shape
RooAddPdf* SignalPdf::getBplusMassModel(RooRealVar *B_plus_M, RooRealVar *mean, bool fitRef){
RooAddPdf * BplusMassModel = NULL;
if (NoSig) return NULL;
//Adding a line of 0 to pdf, to have a pdf and not RooCBShape or so
RooRealVar *zeroSlope = new RooRealVar("zeroSlope","slope", 0.05, 0.0, 0.1); //Doesn't matter anyhow
zeroSlope->setConstant("kTrue");
RooRealVar *zeroF = new RooRealVar("zeroF","zeroF", 1.0, 1.0, 1.0);
RooPolynomial *zeroLine = new RooPolynomial("zeroLine", "zeroLine", *B_plus_M, RooArgList(*zeroSlope));
//Create gaussians
if (anyGaussain){
RooGaussian* Gauss1 = GaussBplus1(B_plus_M, mean, fitRef);
if (DoubleGaussian){
RooRealVar *f_Bplus = getRooRealVar("sig_f",true);
SigRooVars.push_back(f_Bplus);
RooGaussian* Gauss2 = GaussBplus2(B_plus_M, mean, fitRef);
BplusMassModel = new RooAddPdf("BplusMassModel", "DoubleGaussBplus", RooArgList(*Gauss1,*Gauss2),RooArgList(*f_Bplus));
}
else{
BplusMassModel = new RooAddPdf("BplusMassModel", "SingleGaussBplus", RooArgList(*Gauss1, *zeroLine),RooArgList(*zeroF));
}
}
else{ //Create CB
if (LeftCB || RightCB){
string name = LeftCB ? "LeftCBBplus" : "RightCBBplus";
RooCBShape *OneSidedCB = CBBplus1(B_plus_M, mean, fitRef);
BplusMassModel = new RooAddPdf("BplusMassModel", name.c_str(), RooArgList(*OneSidedCB, *zeroLine),RooArgList(*zeroF));
}
else if (DoubleCB){
RooCBShape *RightCB = CBBplus1(B_plus_M, mean, fitRef);
RooCBShape *LeftCB = CBBplus2(B_plus_M, mean, fitRef);
RooRealVar *f_Bplus = getRooRealVar("sig_f",true);
SigRooVars.push_back(f_Bplus);
BplusMassModel = new RooAddPdf("BplusMassModel", "DoubleCrystalBall", RooArgList(*LeftCB, *RightCB), RooArgList(*f_Bplus));
}
else{ //if (OneCB)
RooDoubleCB *OneCB = CBBplus(B_plus_M, mean, fitRef);
BplusMassModel = new RooAddPdf("BplusMassModel", "CBBplus", RooArgList(*OneCB, *zeroLine),RooArgList(*zeroF));
}
}
if (verboseLevel <2) BplusMassModel->Print();
return BplusMassModel;
}
void SignalPdf::setAllRooVarsConstant(){
for (auto var : SigRooVars){
var->setConstant(kTRUE);
}
}