#ifndef __CINT__ #include "RooGlobalFunc.h" #endif #include "RooRealVar.h" #include "RooCategory.h" #include "RooDataSet.h" #include "RooGaussian.h" #include "RooConstVar.h" #include "RooPolynomial.h" #include "RooSimultaneous.h" #include "RooAddPdf.h" #include "RooWorkspace.h" #include "RooSimWSTool.h" #include "RooPlot.h" #include "TCanvas.h" #include "TAxis.h" #include "TFile.h" #include "TH1.h" using namespace RooFit ; void tut_binnedFit() { //observables RooRealVar mass("mass","mass",-5.,5.) ; RooRealVar angles("angles","angles",-5.,5.) ; //parameters RooRealVar mean("mean","mean",0.,-10.,10.) ; RooRealVar sigmaI("sigmaI","sigmaI",1.,10.,10.) ; RooRealVar sigmaII("sigmaII","sigmaII",2.,-8.,8.) ; // Create positive pdf gauss(mass)*gauss(angles) RooGaussian Gaus_massI("Gaus_massI","Gaus_massI",mass,RooConst(0),RooConst(1)) ; RooGaussian Gaus_angI("Gaus_angI","Gaus_angI",angles,mean,sigmaI) ; RooProdPdf pos_PDF("pos_PDF","pos_PDF",RooArgSet(Gaus_massI,Gaus_angI)) ; //marginalize RooAbsPdf* pos_ang = pos_PDF.createProjection(mass) ; // Create negative pdf gauss(mass)*gauss(angles) RooGaussian Gaus_massII("Gaus_massII","Gaus_massII",mass,RooConst(0),RooConst(1)); RooGaussian Gaus_angII("Gaus_angII","Gaus_angII",angles,mean,sigmaII) ; RooProdPdf neg_PDF("neg_PDF","neg_PDF",RooArgSet(Gaus_massII,Gaus_angII)) ; //marginalize RooAbsPdf* neg_ang = neg_PDF.createProjection(mass) ; // C r e a t e c a t e g o r y o b s e r v a b l e s f o r s p l i t t i n g // ---------------------------------------------------------------------------------- RooCategory posSplit("posSplit","posSplit") ; posSplit.defineType("posBIN1") ; posSplit.defineType("posBIN2") ; posSplit.defineType("posBIN3") ; posSplit.defineType("posBIN4") ; RooCategory negSplit("negSplit","negSplit") ; negSplit.defineType("negBIN1") ; negSplit.defineType("negBIN2") ; negSplit.defineType("negBIN3") ; negSplit.defineType("negBIN4") ; RooCategory masterCat("masterCat","masterCat") ; masterCat.defineType("POS") ; masterCat.defineType("NEG") ; RooCategory binCat("binCat","binCat") ; binCat.defineType("bin1") ; binCat.defineType("bin2") ; binCat.defineType("bin3") ; binCat.defineType("bin4") ; //generate positive data RooDataSet *data = pos_PDF.generate(RooArgSet(mass,angles),2000) ; //split positive data in bins of mass RooDataSet *data_bin1 = data->reduce("mass>=-5 && mass<-2.5") ; RooDataSet *data_bin2 = data->reduce("mass>-2.5 && mass<0") ; RooDataSet *data_bin3 = data->reduce("mass>0 && mass<2.5") ; RooDataSet *data_bin4 = data->reduce("mass>2.5 && mass<=5") ; //generate negative data RooDataSet *data_ctl = neg_PDF.generate(RooArgSet(mass,angles),2000) ; //split negative data in bins of mass RooDataSet *data_ctl_bin1 = data_ctl->reduce("mass>-5. && mass<-2.5") ; RooDataSet *data_ctl_bin2 = data_ctl->reduce("mass>-2.5 && mass<0") ; RooDataSet *data_ctl_bin3 = data_ctl->reduce("mass>0 && mass<2.5") ; RooDataSet *data_ctl_bin4 = data_ctl->reduce("mass>2.5 && mass<=5") ; //define roodatasets RooDataSet posData("posData","positive data",RooArgSet(angles),Index(posSplit),Import("posBIN1",*data_bin1),Import("posBIN2",*data_bin2),Import("posBIN3",*data_bin3),Import("posBIN4",*data_bin4)) ; RooDataSet negData("negData","negative data",RooArgSet(angles),Index(negSplit),Import("negBIN1",*data_ctl_bin1),Import("negBIN2",*data_ctl_bin2),Import("negBIN3",*data_ctl_bin3),Import("negBIN4",*data_ctl_bin4)) ; RooDataSet combData("combData","combined data",RooArgSet(angles),Index(masterCat),Import("POS",posData),Import("NEG",negData)) ; combData.Print(); RooWorkspace w("w","w") ; w.import(RooArgSet(*pos_ang,*neg_ang,masterCat,binCat)) ; // Make Sim builder tool RooSimWSTool sct(w) ; // B u i l d a s i m u l t a n e o u s m o d e l w i t h p r o d u c t s p l i t // ----------------------------------------------------------------------------------------- RooSimWSTool::MultiBuildConfig mbc("masterCat") ; mbc.addPdf("POS","pos_PDF_Proj[mass]",SplitParam("mean","binCat")) ; mbc.addPdf("NEG","neg_PDF_Proj[mass]",SplitParam("mean","binCat")) ; w.Print(); RooSimultaneous *MASTER = sct.build("MASTER",mbc); //Fit MASTER->fitTo(combData); }