RooMultiVarGaussian *MultiVarGaussian(RooDataSet *dataset){ RooArgSet *args = (RooArgSet *) dataset->get()->Clone(); // argSet.remove(*chain->GetNLLVar(), kFALSE, kTRUE); RooArgSet *mu = (RooArgSet *)args->Clone(); TMatrixDSym *matrix = dataset->covarianceMatrix(); RooMultiVarGaussian *g = new RooMultiVarGaussian("multi","",RooArgList(*args), RooArgList(*mu),*matrix); return g; return NULL; }
TString makeDoublePow(TString tag, RooRealVar& mgg,RooWorkspace& w) { RooRealVar *alpha1 = new RooRealVar(tag+"_dpow_alpha1","#alpha_{1}",-1,-10,-0.0001); RooRealVar *alpha2 = new RooRealVar(tag+"_dpow_alpha2","#alpha_{2}",-2,-10,-0.0001); RooRealVar *f = new RooRealVar(tag+"_dpow_f","f",0.3,0.0001,0.9999); RooRealVar *Nbkg = new RooRealVar(tag+"_dpow_Nbkg","N_{bkg}",10,1,1E9); RooGenericPdf *pow1 = new RooGenericPdf(tag+"_dpow_pow1","","@0^@1",RooArgList(mgg,*alpha1)); RooGenericPdf *pow2 = new RooGenericPdf(tag+"_dpow_pow2","","@0^@1",RooArgList(mgg,*alpha2)); RooAddPdf *add = new RooAddPdf(tag+"_dpow","",*pow1,*pow2,*f); w.import(*(new RooExtendPdf(tag+"_dpow_ext","",*add,*Nbkg))); return "dpow"; }
/// /// Here we use a 2d RooHistPdf. /// void PDF_GGSZ_ExpNLL::buildPdfHistogram() { // // for B+ // // TString fNamePos = this->dir+"/NLL_GGSZ/histosplus.root"; // TString hNamePos = "eggp"; TString fNamePos = this->dir+"/NLL_GGSZ/histosplus_conv.root"; TString hNamePos = "hConv"; if ( !FileExists(fNamePos) ) { cout << "PDF_GGSZ_ExpNLL::buildPdf() : ERROR : File not found : " << fNamePos << endl; exit(1); } cout << "PDF_GGSZ_ExpNLL::buildPdf() : Opening " << fNamePos << endl; TFile *fExpNllPos = new TFile(fNamePos, "ro"); TH2D *hExpNllPos = (TH2D*)fExpNllPos->Get(hNamePos); assert(hExpNllPos); RooRealVar *xp_hist = new RooRealVar("xp_hist", "xp_hist", 0, -1.0, 1.0); RooRealVar *yp_hist = new RooRealVar("yp_hist", "xp_hist", 0, -1.0, 1.0); RooDataHist *dhExpNllPos = new RooDataHist("dhPos", "dhPos", RooArgList(*xp_hist,*yp_hist), Import(*hExpNllPos)); RooHistPdfVar *xp_pdf = new RooHistPdfVar("xp_pdf", "xp_pdf", *xp_obs, *xp_th, RooConst(-0.102837)); // those precise shifts I got from zooming into the exp nll histogram RooHistPdfVar *yp_pdf = new RooHistPdfVar("yp_pdf", "yp_pdf", *yp_obs, *yp_th, RooConst(-0.0083607)); RooHistPdf *pdfPos = new RooHistPdf("pdf_pos_"+name, "pdf_pos_"+name, RooArgList(*xp_pdf,*yp_pdf), RooArgList(*xp_hist,*yp_hist), *dhExpNllPos, 1); // // for B- // // TString fNameNeg = this->dir+"/NLL_GGSZ/histosBM.root"; // TString hNameNeg = "eggp"; TString fNameNeg = this->dir+"/NLL_GGSZ/histosBM_conv.root"; TString hNameNeg = "hConv"; if ( !FileExists(fNameNeg) ) { cout << "PDF_GGSZ_ExpNLL::buildPdf() : ERROR : File not found : " << fNameNeg << endl; exit(1); } cout << "PDF_GGSZ_ExpNLL::buildPdf() : Opening " << fNameNeg << endl; TFile *fExpNllNeg = new TFile(fNameNeg, "ro"); TH2D *hExpNllNeg = (TH2D*)fExpNllNeg->Get(hNameNeg); assert(hExpNllNeg); RooRealVar *xm_hist = new RooRealVar("xm_hist", "xm_hist", 0, -1.0, 1.0); RooRealVar *ym_hist = new RooRealVar("ym_hist", "xm_hist", 0, -1.0, 1.0); RooDataHist *dhExpNllNeg = new RooDataHist("dhNeg", "dhNeg", RooArgList(*xm_hist,*ym_hist), Import(*hExpNllNeg)); RooHistPdfVar *xm_pdf = new RooHistPdfVar("xm_pdf", "xm_pdf", *xm_obs, *xm_th, RooConst( 0.00152658)); RooHistPdfVar *ym_pdf = new RooHistPdfVar("ym_pdf", "ym_pdf", *ym_obs, *ym_th, RooConst( 0.0273623)); RooHistPdf *pdfNeg = new RooHistPdf("pdf_neg_"+name, "pdf_neg_"+name, RooArgList(*xm_pdf,*ym_pdf), RooArgList(*xm_hist,*ym_hist), *dhExpNllNeg, 1); // multiply both pdf = new RooProdPdf("pdf_"+name, "pdf_"+name, RooArgSet(*pdfNeg, *pdfPos)); // cleanup fExpNllPos->Close(); fExpNllNeg->Close(); }
/// /// Build the PDF using the Cleo histogram for kD, dD. /// \param fName file name of the histogram, needs to contain the likelihood (not chi2), /// computed by ExpNll/computeCleoPdf.C /// \param scale A scale factor that is applied to the histogram in order to get a chi2 /// of exactly 0 when this PDF is fit to minimum. This can be obtained by, e.g., /// bin/gammacombo -i --addpdf 8:8 --var kD_k3pi. The scale factor is then the /// the observed FCN value at minimum. /// \param kDobs kD value of the maximum in the histogram /// \param dDobs dD value of the maximum in the histogram /// void PDF_D_KSKpi_noDmix::buildPdfHistogram(TString fName, float scale, float kDobs, float dDobs) { RooMsgService::instance().setGlobalKillBelow(WARNING); TString hName = "hPdf"; obsValSource += ", "+fName; obsErrSource += ", "+fName; corSource += ", "+fName; if ( !FileExists(fName) ){cout << "PDF_D_KSKpi_noDmix::buildPdfHistogram() : ERROR : File not found : " << fName << endl; exit(1);} TFile *fExpNll = new TFile(fName, "ro"); TH2D *hExpNll = (TH2D*)fExpNll->Get(hName); assert(hExpNll); // Scale the histogram so that the best fit value gives chi2=0. The value is obtained by fitting // the histogram PDF to its maximum. There is some hidden scaling that I don't understand in RooHistPdf // or so, so one can't just use the maximum value of the histogram. hExpNll->Scale(1./TMath::Exp(scale/(-2.))); RooRealVar *x_hist = new RooRealVar("x_kskpi_hist", "x_kskpi_hist", 0, -1e4, 1e4); RooRealVar *y_hist = new RooRealVar("y_kskpi_hist", "y_kskpi_hist", 0, -1e4, 1e4); RooDataHist *dhExpNll = new RooDataHist("dh_kskpi", "dh_kskpi", RooArgList(*x_hist,*y_hist), Import(*hExpNll)); RooRealVar *kD_kskpi_obs = (RooRealVar*)observables->find("kD_kskpi_obs"); RooRealVar *kD_kskpi = (RooRealVar*)theory->find("kD_kskpi_th"); RooRealVar *dD_kskpi_obs = (RooRealVar*)observables->find("dD_kskpi_obs"); RooRealVar *dD_kskpi = (RooRealVar*)theory->find("dD_kskpi_th"); RooHistPdfVar *kD_pdf = new RooHistPdfVar("kD_kskpi_pdf", "kD_kskpi_pdf", *kD_kskpi_obs, *kD_kskpi, RooConst(kDobs)); RooHistPdfAngleVar *dD_pdf = new RooHistPdfAngleVar("dD_kskpi_pdf", "dD_kskpi_pdf", *dD_kskpi_obs, *dD_kskpi, RooConst(dDobs)); RooHistPdf *pdf_kDdD = new RooHistPdf("pdf_kDdD_kskpi", "pdf_kDdD_kskpi", RooArgList(*kD_pdf,*dD_pdf), RooArgList(*x_hist,*y_hist), *dhExpNll, 1); // Use a Gaussian for RD RooRealVar *RD_kskpi_obs = (RooRealVar*)observables->find("RD_kskpi_obs"); RooRealVar *RD_kskpi_th = (RooRealVar*)theory->find("RD_kskpi_th"); assert(RD_kskpi_obs); assert(RD_kskpi_th); RooGaussian *pdf_RD = new RooGaussian("pdf_RD_kskpi", "pdf_RD_kskpi", *RD_kskpi_obs, *RD_kskpi_th, RooConst(sqrt(sq(StatErr[0])+sq(SystErr[0])))); // multiply both pdf = new RooProdPdf("pdf_"+name, "pdf_"+name, RooArgSet(*pdf_kDdD, *pdf_RD)); // cleanup fExpNll->Close(); RooMsgService::instance().setGlobalKillBelow(INFO); addToTrash(x_hist); addToTrash(y_hist); addToTrash(dhExpNll); addToTrash(kD_pdf); addToTrash(dD_pdf); addToTrash(pdf_kDdD); addToTrash(pdf_RD); }
RooDataHist* GetRooData(TH1F* h_tt1l, TH1F* h_Wjets, TH1F* h_tt2l, RooRealVar* var) { //TH1F* h = GetData(fin, region, varname); TH1F* h = GetPseudoData(h_tt1l,h_Wjets, h_tt2l); //cout<<"nof events in data = "<<h->Integral()<<endl; string dname = "data"; RooDataHist *datah = new RooDataHist(dname.c_str(),dname.c_str(), RooArgList(*var), Import(*h)); return datah; }
TString makeSinglePow(TString tag, RooRealVar& mgg,RooWorkspace& w) { RooRealVar *alpha1 = new RooRealVar(tag+"_spow_alpha1","#alpha_{1}",-1,-10,-0.0001); RooRealVar *Nbkg = new RooRealVar(tag+"_spow_Nbkg","N_{bkg}",10,1,1E9); RooGenericPdf *pow1 = new RooGenericPdf(tag+"_spow","","@0^@1",RooArgList(mgg,*alpha1)); w.import(*(new RooExtendPdf(tag+"_spow_ext","",*pow1,*Nbkg)));; return "spow"; }
/// /// Cleo histogram for kD, dD /// void PDF_D_Cleo::buildPdfHistogram() { RooMsgService::instance().setGlobalKillBelow(WARNING); TString fName = this->dir+"/ExpNll/CLEO_K3PiScan_2009_GaussianRise_pdf2.root"; TString hName = "hPdf"; obsValSource += ", "+fName; obsErrSource += ", "+fName; corSource += ", "+fName; if ( !FileExists(fName) ) { cout << "PDF_D_CleoNoK2pi::buildPdfHistogram() : ERROR : File not found : " << fName << endl; exit(1); } TFile *fExpNll = new TFile(fName, "ro"); TH2D *hExpNll = (TH2D*)fExpNll->Get(hName); assert(hExpNll); // hExpNll->Scale(1./1.3027449); // scale so best fit value gives chi2=0. hExpNll->Scale(1./0.858588); // scale so best fit value gives chi2=0: run bin/unittests which fits PDFs to minimum. The factor is 1/min. RooRealVar *x_hist = new RooRealVar("x_cleo_k3pi_hist", "x_cleo_k3pi_hist", 0, -1e4, 1e4); RooRealVar *y_hist = new RooRealVar("y_cleo_k3pi_hist", "y_cleo_k3pi_hist", 0, -1e4, 1e4); RooDataHist *dhExpNll = new RooDataHist("dh_cleo_k3pi", "dh_cleo_k3pi", RooArgList(*x_hist,*y_hist), Import(*hExpNll)); RooRealVar *kD_k3pi_obs = (RooRealVar*)observables->find("kD_k3pi_obs"); RooRealVar *kD_k3pi_th = (RooRealVar*)theory->find("kD_k3pi_th"); RooRealVar *dD_k3pi_obs = (RooRealVar*)observables->find("dD_k3pi_obs"); RooRealVar *dD_k3pi_th = (RooRealVar*)theory->find("dD_k3pi_th"); RooHistPdfVar *kD_pdf = new RooHistPdfVar("kD_cleo_k3pi_pdf", "kD_cleo_k3pi_pdf", *kD_k3pi_obs, *kD_k3pi_th, RooConst(0.3325)); // those precise shifts I got from zooming into the exp nll histogram RooHistPdfAngleVar *dD_pdf = new RooHistPdfAngleVar("dD_cleo_k3pi_pdf", "dD_cleo_k3pi_pdf", *dD_k3pi_obs, *dD_k3pi_th, RooConst(1.9984)); RooHistPdf *pdf_kDdD = new RooHistPdf("pdf_cleo_kDdD_k3pi", "pdf_cleo_kDdD_k3pi", RooArgList(*kD_pdf,*dD_pdf), RooArgList(*x_hist,*y_hist), *dhExpNll, 1); // Re-use the full multivariate Gaussian for the rest // blow up errors of kD and dD float largeNumber = 50.; StatErr[ 0] *= largeNumber; // kD_k3pi_obs StatErr[ 1] *= largeNumber; // dD_k3pi_obs buildCov(); RooMultiVarGaussian *pdf_gaus = new RooMultiVarGaussian("pdf_cleo_gaus", "pdf_cleo_gaus", *(RooArgSet*)observables, *(RooArgSet*)theory, covMatrix); // reset errors so that the pull plot remains correct StatErr[ 0] /= largeNumber; // kD_k3pi_obs StatErr[ 1] /= largeNumber; // dD_k3pi_obs // multiply both pdf = new RooProdPdf("pdf_"+name, "pdf_"+name, RooArgSet(*pdf_kDdD, *pdf_gaus)); fExpNll->Close(); RooMsgService::instance().setGlobalKillBelow(INFO); // addToTrash(fExpNll); ///< these two get cleaned by fExpNll->Close(); // addToTrash(hExpNll); addToTrash(x_hist); addToTrash(y_hist); addToTrash(dhExpNll); addToTrash(kD_pdf); addToTrash(dD_pdf); addToTrash(pdf_kDdD); addToTrash(pdf_gaus); }
void THSRooFit::Fit(Bool_t randPar){ cout<<"THSRooFit::Fit() "<<endl; fModel->Print(); if(randPar) RandomisePars(); if (fResult) delete fResult; //Initialise yield fit parameters for(Int_t iy=0;iy<fYields.getSize();iy++){//set yields below entries in dataset if(fData->sumEntries()<=1){ cout<<"void THSRooFit::Fit SUMENTRIES "<<fData->sumEntries()<<endl;; fWS->var(fYields[iy].GetName())->setRange(0,fData->numEntries()); fWS->var(fYields[iy].GetName())->setVal(1E3/2/fWS->var(fYields[iy].GetName())->getVal());//scale by value give in LoadSpecies } fWS->var(fYields[iy].GetName())->setRange(0,fData->sumEntries()*2); fWS->var(fYields[iy].GetName())->setVal(fData->sumEntries()/2/fWS->var(fYields[iy].GetName())->getVal());//scale by value give in LoadSpecies } if(fFiti==0){ DefaultFitOptions(); //Add any constraints to the likelihood fConstraints.Print(); if(fConstraints.getSize()) AddFitOption(RooFit::ExternalConstraints(fConstraints)); } fFitOptions.Print(""); if(fBinnedFit){ if(fConstraints.getSize())cout<<"Warning : THSRooFit::Fit Constraints defined for binned fit, this is will not work in RooFit has to be ML fit"<<endl; RooRealVar *var=((RooRealVar*)&fVariables[0]);//assume fitting first variable Double_t hmin; Double_t hmax; fData->getRange(*var,hmin,hmax); // var->setRange("R1",hmin,hmax); //TH1D* hist=(TH1D*)fData->fillHistogram(new TH1D("binned","binned",var->getBins(),var->getMin(""),var->getMax("")),RooArgList(*var)); TH1D* hist=(TH1D*)fData->fillHistogram(new TH1D("binned","binned",var->getBins(),hmin,hmax),RooArgList(*var)); if(hist->GetMinimum()<10) hist->Rebin(); Bool_t ForceMLL=kFALSE; if(hist->GetMinimum()<5){cout<<"THSRooFit::Fit binned fit requested but some bins have few entries, switching to likelihood "<<endl;ForceMLL=kTRUE;} hist->Sumw2(); RooDataHist rdh(Form("chi2hist%d",fFiti),Form("chi2hist%d",fFiti),RooArgList(*var),RooFit::Import(*hist)); cout<<"MAX MIN VALUES "<<hmin<<" "<<hmax<<endl; RooCmdArg dataerr=RooFit::DataError(RooAbsData::SumW2); fFitOptions.Print(""); if(!fFitOptions.FindObject(&dataerr)) fFitOptions.Add(&dataerr); if(!ForceMLL)fResult=fModel->chi2FitTo(rdh,fFitOptions); else fResult=fModel->fitTo(rdh,fFitOptions); fFitOptions.Remove(&dataerr); delete hist; } else fResult=fModel->fitTo(*fData,fFitOptions); fFiti++; }
TString makeModExp(TString tag, RooRealVar& mgg,RooWorkspace& w) { RooRealVar *alpha1 = new RooRealVar(tag+"_mexp_alpha1","#alpha_{1}",-1,-10,-0.0001); RooRealVar *m1 = new RooRealVar(tag+"_mexp_m1","m_{1}",1.,0.,10.); RooRealVar *Nbkg = new RooRealVar(tag+"_mexp_Nbkg","N_{bkg}",10,1,1E9); RooGenericPdf *mexp1 = new RooGenericPdf(tag+"_mexp","","exp(@0,*@1^@2)",RooArgList(*alpha1,mgg,*m1)); w.import(*(new RooExtendPdf(tag+"_mexp_ext","",*mexp1,*Nbkg)));; return "mexp"; }
void MEPdfPartialB::InitParams(const int mode, const int h0mode){ cout << "InitParams... "; de0_part = new RooRealVar ("de0_part","de0_part", cuts->get_de0_part(mode,h0mode),-0.2,0.12); de_param_vec.push_back(de0_part); slopel_part = new RooRealVar("slopel_part","slopel_part",cuts->get_slopel_part(mode,h0mode),-1.e5,0.); de_param_vec.push_back(slopel_part); sloper_part = new RooRealVar("sloper_part","sloper_part",cuts->get_sloper_part(mode,h0mode),-10000,0.); de_param_vec.push_back(sloper_part); steep_part = new RooRealVar("steep_part","steep_part", cuts->get_steep_part(mode,h0mode),0.,1000.); de_param_vec.push_back(steep_part); p5_part = new RooRealVar("p5_part","p5_part", cuts->get_p5_part(mode,h0mode),0.01,1000.); de_param_vec.push_back(p5_part); pdf_de_part = new RooRhoDeltaEPdf("pdf_de_part","pdf_de_part",*de,*de0_part,*slopel_part,*sloper_part,*steep_part,*p5_part); de0_part->setConstant(kTRUE); slopel_part->setConstant(kTRUE); sloper_part->setConstant(kTRUE); steep_part->setConstant(kTRUE); p5_part->setConstant(kTRUE); if(ggflag){ b_s_mbc_part = new RooRealVar("b_s_mbc_part","b_s_mbc_part",cuts->get_b_s_mbc_part(mode,h0mode),-0.1,0.1); mbc_param_vec.push_back(b_s_mbc_part); k_s_mbc_part = new RooRealVar("k_s_mbc_part","k_s_mbc_part",cuts->get_k_s_mbc_part(mode),-0.1,0.1); k_s_mbc_part->setConstant(kTRUE); mbc_param_vec.push_back(k_s_mbc_part); s_mbc_part = new RooFormulaVar("s_mbc_part","s_mbc_part","@0+@1*@2",RooArgList(*b_s_mbc_part,*de,*k_s_mbc_part)); alpha_part = new RooRealVar("alpha_part","alpha_part",0.139,0.01,2.); mbc_param_vec.push_back(alpha_part); b_mbc0_part = new RooRealVar("b_mbc0_part","b_mbc0_part",cuts->get_b_mbc0_part(mode,h0mode),5.25,5.29); mbc_param_vec.push_back(b_mbc0_part); k_mbc0_part = new RooRealVar("k_mbc0_part","k_mbc0_part",cuts->get_k_mbc0_part(mode),-0.1,0.1); k_mbc0_part->setConstant(kTRUE); mbc_param_vec.push_back(k_mbc0_part); MBC0_part = new RooFormulaVar("MBC0_part","MBC0_part","@0+@1*@2",RooArgList(*b_mbc0_part,*de,*k_mbc0_part)); pdf_mbc_part_gg = new RooNovosibirsk("pdf_mbc_part_gg","pdf_mbc_part_gg",*mbc,*MBC0_part,*s_mbc_part,*alpha_part); pdf_part = new RooProdPdf("pdf_part","pdf_part",*pdf_de_part,Conditional(*pdf_mbc_part_gg,*mbc)); } else{ argedge_part_bb = new RooRealVar("argedge_part_bb","argedge_part_bb",cuts->get_argedge(mode,h0mode),5.288,5.29); mbc_param_vec.push_back(argedge_part_bb); argpar_part_bb = new RooRealVar("argpar_part_bb","argpar_part_bb",cuts->get_argpar_part_bb(mode,h0mode),-300,-10.); mbc_param_vec.push_back(argpar_part_bb); argus_mbc_part = new RooArgusBG("argus_mbc_part","Argus PDF",*mbc,*argedge_part_bb,*argpar_part_bb); mbc0_part = new RooRealVar("mbc0_part","mbc0_part",cuts->get_mbc0_part(mode,h0mode),5.25,5.291,"GeV"); mbc_param_vec.push_back(mbc0_part); s_mbc_part_ppp = new RooRealVar("s_mbc_part_ppp","s_mbc_part_ppp",cuts->get_s_mbc_part(mode,h0mode),0.,0.1,"GeV"); mbc_param_vec.push_back(s_mbc_part_ppp); g_mbc_part = new RooGaussian("g_mbc_part","g_mbc_part",*mbc,*mbc0_part,*s_mbc_part_ppp); fg_mbc_part = new RooRealVar("fg_mbc_part","fg_mbc_part",cuts->get_fg_mbc_part(mode,h0mode),0.,1.); mbc_param_vec.push_back(fg_mbc_part); pdf_mbc_part_ppp = new RooAddPdf("pdf_mbc_part_ppp","pdf_mbc_part_ppp",RooArgList(*g_mbc_part,*argus_mbc_part),RooArgSet(*fg_mbc_part)); pdf_part = new RooProdPdf("pdf_part","pdf_part",*pdf_de_part,Conditional(*pdf_mbc_part_ppp,*mbc)); } cout << "done." << endl; }
void AnalyzeToy::calculate_yield() { if(cheat) { signalYield = nSignal_gen; backgroundYield = nBackground_gen; } else { RooRealVar tempSigYield("tempSigYield","",0,5 * nSignal_gen); RooRealVar tempBkgYield("tempBkgYield","",0,5 * nBackground_gen); RooAddPdf model_mass("model_mass","",RooArgList( *(ws->pdf("model_signal_mass")), *(ws->pdf("model_bkg_mass")) ),RooArgList(tempSigYield,tempBkgYield)); model_mass.fitTo(*toyData,PrintLevel(-1)); signalYield = tempSigYield.getVal(); backgroundYield = tempBkgYield.getVal(); } }
TString makePoly2(TString tag, RooRealVar& mgg,RooWorkspace& w) { RooRealVar *pC = new RooRealVar(tag+"_pol2_pC","C",1,-10,10); RooRealVar *p0 = new RooRealVar(tag+"_pol2_p0","p_0",0,-10,10); RooRealVar *p1 = new RooRealVar(tag+"_pol2_p1","p_1",0,-10,10); RooRealVar *Nbkg = new RooRealVar(tag+"_pol2_Nbkg","N_{bkg}",10,1,1E9); RooFormulaVar *pCmod = new RooFormulaVar(tag+"_pol2_pCmod","@0*@0",*pC); RooFormulaVar *p0mod = new RooFormulaVar(tag+"_pol2_p0mod","@0*@0",*p0); RooFormulaVar *p1mod = new RooFormulaVar(tag+"_pol2_p1mod","@0*@0",*p1); RooBernstein* bern = new RooBernstein(tag+"_pol2","",mgg,RooArgList(*pCmod,*p0mod,*p1mod)); w.import(*(new RooExtendPdf(tag+"_pol2_ext","",*bern,*Nbkg))); return "pol2"; }
RooHistPdf* GetRooHistPdf(TFile* fin, string region, string process, string varname, RooRealVar* var, float& norm, TH1F*& histo, bool do_mcstat, bool do_norm, float input_norm){ TH1F* h = GetHisto(fin,region,process,varname, norm, do_norm, input_norm); histo = h; if(do_mcstat) { //randomisation of the histo ... for(int i=1;i<=h->GetNbinsX();i++) { h->SetBinContent(i,randomnessGenerator->Gaus(h->GetBinContent(i),h->GetBinError(i))); } } string rdhname = "rdh_"+region+"_"+process; RooDataHist *rdh = new RooDataHist(rdhname.c_str(),rdhname.c_str(),RooArgList(*var),Import(*h)); string pdfname = "pdf_"+region+"_"+process; RooHistPdf *pdf = new RooHistPdf(pdfname.c_str(),pdfname.c_str(),RooArgSet(*var),*rdh); return pdf; }
RooAbsPdf *MakeModel(RooDataHist *data, RooRealVar *mww, char *name) { char *modelName = (char*)calloc(50, sizeof(char)); strcat(modelName, name); strcat(modelName, "model"); char *signalName = (char*)calloc(50, sizeof(char)); char *backgroundName = (char*)calloc(50, sizeof(char)); strcat(signalName, name); strcat(signalName, "signal"); strcat(backgroundName, name); strcat(backgroundName, "background"); char *meanName = (char*)calloc(50, sizeof(char)); strcat(meanName, name); strcat(meanName, "mean"); char *sigmaName = (char*)calloc(50, sizeof(char)); strcat(sigmaName, name); strcat(sigmaName, "sigma"); char *decayName = (char*)calloc(50, sizeof(char)); strcat(decayName, name); strcat(decayName, "decay"); char *weightName = (char*)calloc(50, sizeof(char)); strcat(weightName, name); strcat(weightName, "weight"); RooRealVar *mean = new RooRealVar(meanName, "mean", 0, 10000, "GeV"); RooRealVar *sigma = new RooRealVar(sigmaName, "sigma", 0, 3000, "GeV"); RooGaussian *signal = new RooGaussian(signalName, "signal", *mww, *mean, *sigma); RooRealVar *decay = new RooRealVar(decayName, "decay", -10, 10, "GeV"); RooExponential *background = new RooExponential(backgroundName, "background", *mww, *decay); RooRealVar *weight = new RooRealVar("decayweight", "weight", 0, 1.0, "None"); RooAbsPdf *model = new RooAddPdf(modelName, "model", RooArgList(*signal, *background), RooArgList(*weight), kTRUE); model->fitTo(*data); mean->setConstant(); sigma->setConstant(); weight->setConstant(); decay->setConstant(); return model; }
RooAbsPdf* DoubleGaussian::getPdf() { bool dbThis(false); // If any RooFit variables still have 0 pointers (ie have not been set from outside (e.g. sharing parameters (like mean) across multiple shapes) then // assume that the values should be those passed in the constructor if(_intVars["mean"]==0) _intVars["mean"] = new RooRealVar(Form("%s_Var_Mean",_name.c_str()),"",_mean); if(_intVars["sigma1"]==0) _intVars["sigma1"] = new RooRealVar(Form("%s_Var_Sigma1",_name.c_str()),"",_sigma1); if(_intVars["sigma_ratio"]==0) _intVars["sigma_ratio"] = new RooRealVar(Form("%s_Var_Sigma_ratio",_name.c_str()),"",_sigmaRatio); if(_intVars["frac"]==0) _intVars["frac"] = new RooRealVar(Form("%s_Var_frac",_name.c_str()),"",_frac); _intVars["sigma2"] = new RooFormulaVar(Form("%s_Var_Sigma2",_name.c_str()),"@0*@1",RooArgList(*_intVars["sigma1"],*_intVars["sigma_ratio"])); RooGaussian* g1 = new RooGaussian(Form("%s_g1",_name.c_str()),"",*_mB,*_intVars["mean"],*_intVars["sigma1"]); RooGaussian* g2 = new RooGaussian(Form("%s_g2",_name.c_str()),"",*_mB,*_intVars["mean"],*_intVars["sigma2"]); if(dbThis) { std::cout << "For name: " << _name << endl; std::cout << " G1 (mean,width,n,alpha): " << _intVars["mean"]->getVal() << ", " << _intVars["sigma1"]->getVal() << std::endl; std::cout << " G2 (mean,width,n,alpha): " << _intVars["mean"]->getVal() << ", " << _intVars["sigma2"]->getVal() << std::endl; std::cout << " frac: " << _intVars["frac"]->getVal() << endl; } RooAddPdf* g = new RooAddPdf(_name.c_str(),"",*g1,*g2,*_intVars["frac"]); return g; }
void makeLikelihoodRotation(std::string inname, std::string outname, double SMOOTH, bool isAsimov=false){ gSystem->Load("libHiggsAnalysisCombinedLimit.so"); //TFile *fi = TFile::Open("lduscan_neg_ext/3D/lduscan_neg_ext_3D.root"); //TFile *fi = TFile::Open("lduscan_neg_ext_2/exp3D/lduscan_neg_ext_2_exp3D.root"); TFile *fi = TFile::Open(inname.c_str()); TTree *tree = (TTree*)fi->Get("limit"); //TTree *tree = new TTree("tree_vals","tree_vals"); // ------------------------------ THIS IS WHERE WE BUILD THE SPLINE ------------------------ // // Create 2 Real-vars, one for each of the parameters of the spline // The variables MUST be named the same as the corresponding branches in the tree // RooRealVar ldu("lambda_du","lambda_du",0.1,-2.5,2.5); RooRealVar lVu("lambda_Vu","lambda_Vu",0.1,0,2.2); RooRealVar kuu("kappa_uu","kappa_uu",0.1,0,2.2); RooSplineND *spline = new RooSplineND("spline","spline",RooArgList(ldu,lVu,kuu),tree,"deltaNLL",SMOOTH,true,"deltaNLL >= 0 && deltaNLL < 500 && ( (TMath::Abs(quantileExpected)!=1 && TMath::Abs(quantileExpected)!=0) || (Entry$==0) )"); // ----------------------------------------------------------------------------------------- // //TGraph *gr = spline->getGraph("x",0.1); // Return 1D graph. Will be a slice of the spline for fixed y generated at steps of 0.1 fOut = new TFile(outname.c_str(),"RECREATE"); // Plot the 2D spline /* TGraph2D *gcvcf = new TGraph2D(); gcvcf->SetName("cvcf"); TGraph2D *gcvcf_kuu = new TGraph2D(); gcvcf_kuu->SetName("cvcf_kuu"); TGraph2D *gcvcf_lVu = new TGraph2D(); gcvcf_lVu->SetName("cvcf_lVu"); */ TGraph2D *type1_minscan = new TGraph2D(); type1_minscan->SetName("type1_minscan"); TGraph2D *type2_minscan = new TGraph2D(); type2_minscan->SetName("type2_minscan"); TGraph2D *gr_ldu = new TGraph2D(); gr_ldu->SetName("t1_ldu"); TGraph2D *gr_lVu = new TGraph2D(); gr_lVu->SetName("t1_lVu"); TGraph2D *gr_kuu = new TGraph2D(); gr_kuu->SetName("t1_kuu"); TGraph2D *gr2_ldu = new TGraph2D(); gr2_ldu->SetName("t2_ldu"); TGraph2D *gr2_lVu = new TGraph2D(); gr2_lVu->SetName("t2_lVu"); TGraph2D *gr2_kuu = new TGraph2D(); gr2_kuu->SetName("t2_kuu"); TGraph2D *gr_ku = new TGraph2D(); gr_ku->SetName("t1_ku"); TGraph2D *gr_kd = new TGraph2D(); gr_kd->SetName("t1_kd"); TGraph2D *gr_kV = new TGraph2D(); gr_kV->SetName("t1_kV"); TGraph2D *gr2_ku = new TGraph2D(); gr2_ku->SetName("t2_ku"); TGraph2D *gr2_kd = new TGraph2D(); gr2_kd->SetName("t2_kd"); TGraph2D *gr2_kV = new TGraph2D(); gr2_kV->SetName("t2_kV"); TGraph2D *gr_beta = new TGraph2D(); gr_beta->SetName("beta"); TGraph2D *gr_bma = new TGraph2D(); gr_bma->SetName("beta_minis_alpha"); // check the values of the three parameters during the scan ?! double Vldu, VlVu, Vkuu; // holders for the values int pt1,pt2 = 0; double mint2 = 10000; double mint1 = 10000; double mint1_x = 10000; double mint1_y = 10000; double mint2_x = 10000; double mint2_y = 10000; double mint1_lVu = 10000; double mint1_ldu = 10000; double mint1_kuu = 10000; double mint2_lVu = 10000; double mint2_ldu = 10000; double mint2_kuu = 10000; int ccounter = 0; double Vku, Vkd, VkV; TGraph2D *g_FFS = new TGraph2D(); g_FFS->SetName("ffs_ldu_1"); int pt=0; for (double x=0.;x<=3.0;x+=0.05){ for (double y=0.;y<=3.0;y+=0.05){ ldu.setVal(1); lVu.setVal(y); kuu.setVal(x); double dnll2 = 2*spline->getVal(); g_FFS->SetPoint(pt,x,y,dnll2); pt++; } } if (!isAsimov){ double Vbma, Vbeta; for (double cbma=-0.8;cbma<0.8;cbma+=0.01){ for (double b=0.1;b<1.4;b+=0.05){ double tanb = TMath::Tan(b); getAngles(cbma,tanb,&Vbeta,&Vbma); type1(cbma, tanb, &Vldu, &VlVu, &Vkuu); type1_ex(cbma, tanb, &Vku, &Vkd, &VkV); if (Vldu > ldu.getMax() || Vldu < ldu.getMin()) { type1_minscan->SetPoint(ccounter,cbma,tanb,10); } if (VlVu > lVu.getMax() || VlVu < lVu.getMin()) { type1_minscan->SetPoint(ccounter,cbma,tanb,10); } if (Vkuu > kuu.getMax() || Vkuu < kuu.getMin()) { type1_minscan->SetPoint(ccounter,cbma,tanb,10); } else { ldu.setVal(Vldu);lVu.setVal(VlVu);kuu.setVal(Vkuu); double dnll2 = 2*spline->getVal(); if (dnll2 < mint1) { mint1_x = cbma; mint1_y = tanb; mint1 = dnll2; mint1_lVu = VlVu; mint1_kuu = Vkuu; mint1_ldu = Vldu; } type1_minscan->SetPoint(ccounter,cbma,tanb,dnll2); } //std::cout << " Checking point cbma,tanb -> ldu, lVu, kuu == 2DeltaNLL " << cbma << ", " << tanb << " --> " << Vldu << ", " << VlVu << ", " << Vkuu << " == " << dnll2 << std::endl; gr_ldu->SetPoint(ccounter,cbma,tanb,Vldu); gr_lVu->SetPoint(ccounter,cbma,tanb,VlVu); gr_kuu->SetPoint(ccounter,cbma,tanb,Vkuu); gr_ku->SetPoint(ccounter,cbma,tanb,Vku); gr_kd->SetPoint(ccounter,cbma,tanb,Vkd); gr_kV->SetPoint(ccounter,cbma,tanb,VkV); type2(cbma, tanb, &Vldu, &VlVu, &Vkuu); type2_ex(cbma, tanb, &Vku, &Vkd, &VkV); if (Vldu > ldu.getMax() || Vldu < ldu.getMin()) { type2_minscan->SetPoint(ccounter,cbma,tanb,10); } if (VlVu > lVu.getMax() || VlVu < lVu.getMin()) { type2_minscan->SetPoint(ccounter,cbma,tanb,10); } if (Vkuu > kuu.getMax() || Vkuu < kuu.getMin()) { type2_minscan->SetPoint(ccounter,cbma,tanb,10); } else { ldu.setVal(Vldu);lVu.setVal(VlVu);kuu.setVal(Vkuu); double dnll2 = 2*spline->getVal(); if (dnll2 < mint2) { mint2_x = cbma; mint2_y = tanb; mint2 = dnll2; mint2_lVu = VlVu; mint2_kuu = Vkuu; mint2_ldu = Vldu; } type2_minscan->SetPoint(ccounter,cbma,tanb,dnll2); } gr2_ldu->SetPoint(ccounter,cbma,tanb,Vldu); gr2_lVu->SetPoint(ccounter,cbma,tanb,VlVu); gr2_kuu->SetPoint(ccounter,cbma,tanb,Vkuu); gr2_ku->SetPoint(ccounter,cbma,tanb,Vku); gr2_kd->SetPoint(ccounter,cbma,tanb,Vkd); gr2_kV->SetPoint(ccounter,cbma,tanb,VkV); gr_beta->SetPoint(ccounter,cbma,tanb,Vbeta); gr_bma->SetPoint(ccounter,cbma,tanb,Vbma); ccounter++; } } std::cout << "T1 Minimum found at " << mint1_x << "," << mint1_y << "( or in lVu, kuu, ldu) = " << mint1_lVu << ", " << mint1_kuu << ", " << mint1_ldu << ", val=" << mint1 << std::endl; std::cout << "T2 Minimum found at " << mint2_x << "," << mint2_y << "( or in lVu, kuu, ldu) = " << mint2_lVu << ", " << mint2_kuu << ", " << mint2_ldu <<", val=" << mint2 << std::endl; } else { // Probably then use the Asimov ldu.setVal(1);lVu.setVal(1);kuu.setVal(1); double dnll2 = 2*spline->getVal(); mint1 = dnll2; mint2 = dnll2; } TGraph *type1_0p1 = (TGraph*)gr21Dspline_tanB(spline, ldu, lVu, kuu, 1, mint1, 0.1); TGraph *type2_0p1 = (TGraph*)gr21Dspline_tanB(spline, ldu, lVu, kuu, 2, mint2, 0.1); type1_0p1->SetName("type1_cbma0p1"); type2_0p1->SetName("type2_cbma0p1"); type1_0p1->Write(); type2_0p1->Write(); TGraph * gr_type1 = (TGraph*)gr2contour(spline, ldu, lVu, kuu, 1, 5.99, mint1, 0, 1., 0.01, 0.001); TGraph * gr_type2 = (TGraph*)gr2contour(spline, ldu, lVu, kuu, 2, 5.99, mint2, 0, 1., 0.01, 0.001); gr_type1->SetName("type1"); gr_type2->SetName("type2"); gr_type1->Write(); gr_type2->Write(); //gr_type1->Draw("p"); fOut->cd(); type1_minscan->Write(); type2_minscan->Write(); gr_ldu->SetMinimum(-2.5); gr_ldu->SetMaximum(2.5); gr_lVu->SetMinimum(0) ; gr_lVu->SetMaximum(3); gr_kuu->SetMinimum(0) ; gr_kuu->SetMaximum(3); gr2_ldu->SetMinimum(-2.5); gr2_ldu->SetMaximum(2.5); gr2_lVu->SetMinimum(0) ; gr2_lVu->SetMaximum(3); gr2_kuu->SetMinimum(0) ; gr2_kuu->SetMaximum(3); gr_ldu->Write(); gr_lVu->Write(); gr_kuu->Write(); gr2_ldu->Write(); gr2_lVu->Write(); gr2_kuu->Write(); gr_ku->Write(); gr_kd->Write(); gr_kV->Write(); gr2_ku->Write(); gr2_kd->Write(); gr2_kV->Write(); g_FFS->Write(); gr_beta->Write(); gr_bma->Write(); std::cout << "Saved stuff to -> " << fOut->GetName() << std::endl; fOut->Close(); }
void logStatistics(std::ostream& out, RooDataSet *dataSet, RooRealVar *realVar, int nBins, double chi2) { logStatisticsPar(out, dataSet, realVar, nBins, chi2, RooArgList()); }
void fitWm(const TString outputDir, // output directory const Double_t lumi, // integrated luminosity (/fb) const Double_t nsigma=0 // vary MET corrections by n-sigmas (nsigma=0 means nominal correction) ) { gBenchmark->Start("fitWm"); //-------------------------------------------------------------------------------------------------------------- // Settings //============================================================================================================== // MET histogram binning and range const Int_t NBINS = 50; const Double_t METMAX = 100; const Double_t PT_CUT = 25; const Double_t ETA_CUT = 2.1; // file format for output plots const TString format("png"); // recoil correction RecoilCorrector recoilCorr("../Recoil/ZmmData/fits.root");//, (!) uncomment to perform corrections to recoil from W-MC/Z-MC //"../Recoil/WmpMC/fits.root", //"../Recoil/WmmMC/fits.root", //"../Recoil/ZmmMC/fits.root"); // NNLO boson pT k-factors TFile nnloCorrFile("/data/blue/ksung/EWKAna/8TeV/Utils/Ratio.root"); TH1D *hNNLOCorr = (TH1D*)nnloCorrFile.Get("RpT_B"); // // input ntuple file names // enum { eData, eWmunu, eEWK, eAntiData, eAntiWmunu, eAntiEWK }; // data type enum vector<TString> fnamev; vector<Int_t> typev; fnamev.push_back("/data/blue/ksung/EWKAna/8TeV/Selection/Wmunu/ntuples/data_select.root"); typev.push_back(eData); fnamev.push_back("/data/blue/ksung/EWKAna/8TeV/Selection/Wmunu/ntuples/wm_select.root"); typev.push_back(eWmunu); fnamev.push_back("/data/blue/ksung/EWKAna/8TeV/Selection/Wmunu/ntuples/ewk_select.root"); typev.push_back(eEWK); fnamev.push_back("/data/blue/ksung/EWKAna/8TeV/Selection/Wmunu/ntuples/top_select.root"); typev.push_back(eEWK); fnamev.push_back("/data/blue/ksung/EWKAna/8TeV/Selection/AntiWmunu/ntuples/data_select.root"); typev.push_back(eAntiData); fnamev.push_back("/data/blue/ksung/EWKAna/8TeV/Selection/AntiWmunu/ntuples/wm_select.root"); typev.push_back(eAntiWmunu); fnamev.push_back("/data/blue/ksung/EWKAna/8TeV/Selection/AntiWmunu/ntuples/ewk_select.root"); typev.push_back(eAntiEWK); fnamev.push_back("/data/blue/ksung/EWKAna/8TeV/Selection/AntiWmunu/ntuples/top_select.root"); typev.push_back(eAntiEWK); //-------------------------------------------------------------------------------------------------------------- // Main analysis code //============================================================================================================== // Create output directory gSystem->mkdir(outputDir,kTRUE); CPlot::sOutDir = outputDir; // // Declare MET histograms // TH1D *hDataMet = new TH1D("hDataMet","", NBINS,0,METMAX); hDataMet->Sumw2(); TH1D *hDataMetm = new TH1D("hDataMetm","", NBINS,0,METMAX); hDataMetm->Sumw2(); TH1D *hDataMetp = new TH1D("hDataMetp","", NBINS,0,METMAX); hDataMetp->Sumw2(); TH1D *hWmunuMet = new TH1D("hWmunuMet","", NBINS,0,METMAX); hWmunuMet->Sumw2(); TH1D *hWmunuMetp = new TH1D("hWmunuMetp","",NBINS,0,METMAX); hWmunuMetp->Sumw2(); TH1D *hWmunuMetm = new TH1D("hWmunuMetm","",NBINS,0,METMAX); hWmunuMetm->Sumw2(); TH1D *hEWKMet = new TH1D("hEWKMet", "", NBINS,0,METMAX); hEWKMet->Sumw2(); TH1D *hEWKMetp = new TH1D("hEWKMetp", "", NBINS,0,METMAX); hEWKMetp->Sumw2(); TH1D *hEWKMetm = new TH1D("hEWKMetm", "", NBINS,0,METMAX); hEWKMetm->Sumw2(); TH1D *hAntiDataMet = new TH1D("hAntiDataMet","", NBINS,0,METMAX); hAntiDataMet->Sumw2(); TH1D *hAntiDataMetm = new TH1D("hAntiDataMetm","", NBINS,0,METMAX); hAntiDataMetm->Sumw2(); TH1D *hAntiDataMetp = new TH1D("hAntiDataMetp","", NBINS,0,METMAX); hAntiDataMetp->Sumw2(); TH1D *hAntiWmunuMet = new TH1D("hAntiWmunuMet","", NBINS,0,METMAX); hAntiWmunuMet->Sumw2(); TH1D *hAntiWmunuMetp = new TH1D("hAntiWmunuMetp","",NBINS,0,METMAX); hAntiWmunuMetp->Sumw2(); TH1D *hAntiWmunuMetm = new TH1D("hAntiWmunuMetm","",NBINS,0,METMAX); hAntiWmunuMetm->Sumw2(); TH1D *hAntiEWKMet = new TH1D("hAntiEWKMet", "", NBINS,0,METMAX); hAntiEWKMet->Sumw2(); TH1D *hAntiEWKMetp = new TH1D("hAntiEWKMetp", "", NBINS,0,METMAX); hAntiEWKMetp->Sumw2(); TH1D *hAntiEWKMetm = new TH1D("hAntiEWKMetm", "", NBINS,0,METMAX); hAntiEWKMetm->Sumw2(); // // Declare variables to read in ntuple // UInt_t runNum, lumiSec, evtNum; UInt_t npv, npu; Float_t genVPt, genVPhi; Float_t scale1fb; Float_t met, metPhi, sumEt, mt, u1, u2; Int_t q; LorentzVector *lep=0; Float_t pfChIso, pfGamIso, pfNeuIso; TFile *infile=0; TTree *intree=0; // // Loop over files // for(UInt_t ifile=0; ifile<fnamev.size(); ifile++) { // Read input file and get the TTrees cout << "Processing " << fnamev[ifile] << "..." << endl; infile = new TFile(fnamev[ifile]); assert(infile); intree = (TTree*)infile->Get("Events"); assert(intree); intree->SetBranchAddress("runNum", &runNum); // event run number intree->SetBranchAddress("lumiSec", &lumiSec); // event lumi section intree->SetBranchAddress("evtNum", &evtNum); // event number intree->SetBranchAddress("npv", &npv); // number of primary vertices intree->SetBranchAddress("npu", &npu); // number of in-time PU events (MC) intree->SetBranchAddress("genVPt", &genVPt); // GEN W boson pT (signal MC) intree->SetBranchAddress("genVPhi", &genVPhi); // GEN W boson phi (signal MC) intree->SetBranchAddress("scale1fb", &scale1fb); // event weight per 1/fb (MC) intree->SetBranchAddress("met", &met); // MET intree->SetBranchAddress("metPhi", &metPhi); // phi(MET) intree->SetBranchAddress("sumEt", &sumEt); // Sum ET intree->SetBranchAddress("mt", &mt); // transverse mass intree->SetBranchAddress("u1", &u1); // parallel component of recoil intree->SetBranchAddress("u2", &u2); // perpendicular component of recoil intree->SetBranchAddress("q", &q); // lepton charge intree->SetBranchAddress("lep", &lep); // lepton 4-vector intree->SetBranchAddress("pfChIso", &pfChIso); intree->SetBranchAddress("pfGamIso", &pfGamIso); intree->SetBranchAddress("pfNeuIso", &pfNeuIso); // // loop over events // for(UInt_t ientry=0; ientry<intree->GetEntries(); ientry++) { intree->GetEntry(ientry); if(lep->Pt() < PT_CUT) continue; if(fabs(lep->Eta()) > ETA_CUT) continue; if( (typev[ifile]==eAntiData || typev[ifile]==eAntiWmunu || typev[ifile]==eAntiEWK) && (pfChIso+pfGamIso+pfNeuIso)>0.5*(lep->Pt()) ) continue; if(typev[ifile]==eData) { hDataMet->Fill(met); if(q>0) { hDataMetp->Fill(met); } else { hDataMetm->Fill(met); } } else if(typev[ifile]==eAntiData) { hAntiDataMet->Fill(met); if(q>0) { hAntiDataMetp->Fill(met); } else { hAntiDataMetm->Fill(met); } } else { Double_t weight = 1; weight *= scale1fb*lumi; if(typev[ifile]==eWmunu) { Double_t corrMet=met, corrMetPhi=metPhi; // apply recoil corrections to W MC Double_t lepPt = lep->Pt(); //Double_t lepPt = gRandom->Gaus(lep->Pt(),0.5); // (!) uncomment to apply scale/res corrections to MC recoilCorr.Correct(corrMet,corrMetPhi,genVPt,genVPhi,lepPt,lep->Phi(),nsigma,q); Double_t nnlocorr=1; for(Int_t ibin=1; ibin<=hNNLOCorr->GetNbinsX(); ibin++) { if(genVPt >= hNNLOCorr->GetBinLowEdge(ibin) && genVPt < (hNNLOCorr->GetBinLowEdge(ibin)+hNNLOCorr->GetBinWidth(ibin))) nnlocorr = hNNLOCorr->GetBinContent(ibin); } //weight *= nnlocorr; // (!) uncomment to apply NNLO corrections hWmunuMet->Fill(corrMet,weight); if(q>0) { hWmunuMetp->Fill(corrMet,weight); } else { hWmunuMetm->Fill(corrMet,weight); } } if(typev[ifile]==eAntiWmunu) { Double_t corrMet=met, corrMetPhi=metPhi; // apply recoil corrections to W MC Double_t lepPt = lep->Pt();//gRandom->Gaus(lep->Pt(),0.5); //Double_t lepPt = gRandom->Gaus(lep->Pt(),0.5); // (!) uncomment to apply scale/res corrections to MC recoilCorr.Correct(corrMet,corrMetPhi,genVPt,genVPhi,lepPt,lep->Phi(),nsigma,q); Double_t nnlocorr=1; for(Int_t ibin=1; ibin<=hNNLOCorr->GetNbinsX(); ibin++) { if(genVPt >= hNNLOCorr->GetBinLowEdge(ibin) && genVPt < (hNNLOCorr->GetBinLowEdge(ibin)+hNNLOCorr->GetBinWidth(ibin))) nnlocorr = hNNLOCorr->GetBinContent(ibin); } //weight *= nnlocorr; // (!) uncomment to apply NNLO corrections hAntiWmunuMet->Fill(corrMet,weight); if(q>0) { hAntiWmunuMetp->Fill(corrMet,weight); } else { hAntiWmunuMetm->Fill(corrMet,weight); } } if(typev[ifile]==eEWK) { hEWKMet->Fill(met,weight); if(q>0) { hEWKMetp->Fill(met,weight); } else { hEWKMetm->Fill(met,weight); } } if(typev[ifile]==eAntiEWK) { hAntiEWKMet->Fill(met,weight); if(q>0) { hAntiEWKMetp->Fill(met,weight); } else { hAntiEWKMetm->Fill(met,weight); } } } } } delete infile; infile=0, intree=0; // // Declare fit parameters for signal and background yields // Note: W signal and EWK+top PDFs are constrained to the ratio described in MC // RooRealVar nSig("nSig","nSig",0.7*(hDataMet->Integral()),0,hDataMet->Integral()); RooRealVar nQCD("nQCD","nQCD",0.3*(hDataMet->Integral()),0,hDataMet->Integral()); RooRealVar cewk("cewk","cewk",0.1,0,5) ; cewk.setVal(hEWKMet->Integral()/hWmunuMet->Integral()); cewk.setConstant(kTRUE); RooFormulaVar nEWK("nEWK","nEWK","cewk*nSig",RooArgList(nSig,cewk)); RooRealVar nAntiSig("nAntiSig","nAntiSig",0.05*(hAntiDataMet->Integral()),0,hAntiDataMet->Integral()); RooRealVar nAntiQCD("nAntiQCD","nAntiQCD",0.9*(hDataMet->Integral()),0,hDataMet->Integral()); RooRealVar dewk("dewk","dewk",0.1,0,5) ; dewk.setVal(hAntiEWKMet->Integral()/hAntiWmunuMet->Integral()); dewk.setConstant(kTRUE); RooFormulaVar nAntiEWK("nAntiEWK","nAntiEWK","dewk*nAntiSig",RooArgList(nAntiSig,dewk)); RooRealVar nSigp("nSigp","nSigp",0.7*(hDataMetp->Integral()),0,hDataMetp->Integral()); RooRealVar nQCDp("nQCDp","nQCDp",0.3*(hDataMetp->Integral()),0,hDataMetp->Integral()); RooRealVar cewkp("cewkp","cewkp",0.1,0,5) ; cewkp.setVal(hEWKMetp->Integral()/hWmunuMetp->Integral()); cewkp.setConstant(kTRUE); RooFormulaVar nEWKp("nEWKp","nEWKp","cewkp*nSigp",RooArgList(nSigp,cewkp)); RooRealVar nAntiSigp("nAntiSigp","nAntiSigp",0.05*(hAntiDataMetp->Integral()),0,hAntiDataMetp->Integral()); RooRealVar nAntiQCDp("nAntiQCDp","nAntiQCDp",0.9*(hAntiDataMetp->Integral()),0,hAntiDataMetp->Integral()); RooRealVar dewkp("dewkp","dewkp",0.1,0,5) ; dewkp.setVal(hAntiEWKMetp->Integral()/hAntiWmunuMetp->Integral()); dewkp.setConstant(kTRUE); RooFormulaVar nAntiEWKp("nAntiEWKp","nAntiEWKp","dewkp*nAntiSigp",RooArgList(nAntiSigp,dewkp)); RooRealVar nSigm("nSigm","nSigm",0.7*(hDataMetm->Integral()),0,hDataMetm->Integral()); RooRealVar nQCDm("nQCDm","nQCDm",0.3*(hDataMetm->Integral()),0,hDataMetm->Integral()); RooRealVar cewkm("cewkm","cewkm",0.1,0,5) ; cewkm.setVal(hEWKMetm->Integral()/hWmunuMetm->Integral()); cewkm.setConstant(kTRUE); RooFormulaVar nEWKm("nEWKm","nEWKm","cewkm*nSigm",RooArgList(nSigm,cewkm)); RooRealVar nAntiSigm("nAntiSigm","nAntiSigm",0.05*(hAntiDataMetm->Integral()),0,hAntiDataMetm->Integral()); RooRealVar nAntiQCDm("nAntiQCDm","nAntiQCDm",0.9*(hAntiDataMetm->Integral()),0,hAntiDataMetm->Integral()); RooRealVar dewkm("dewkm","dewkm",0.1,0,5) ; dewkm.setVal(hAntiEWKMetm->Integral()/hAntiWmunuMetm->Integral()); dewkm.setConstant(kTRUE); RooFormulaVar nAntiEWKm("nAntiEWKm","nAntiEWKm","dewkm*nAntiSigm",RooArgList(nAntiSigm,dewkm)); // // Construct PDFs for fitting // RooRealVar pfmet("pfmet","pfmet",0,METMAX); pfmet.setBins(NBINS); // Signal PDFs RooDataHist wmunuMet ("wmunuMET", "wmunuMET", RooArgSet(pfmet),hWmunuMet); RooHistPdf pdfWm ("wm", "wm", pfmet,wmunuMet, 1); RooDataHist wmunuMetp("wmunuMETp","wmunuMETp",RooArgSet(pfmet),hWmunuMetp); RooHistPdf pdfWmp("wmp","wmp",pfmet,wmunuMetp,1); RooDataHist wmunuMetm("wmunuMETm","wmunuMETm",RooArgSet(pfmet),hWmunuMetm); RooHistPdf pdfWmm("wmm","wmm",pfmet,wmunuMetm,1); // EWK+top PDFs RooDataHist ewkMet ("ewkMET", "ewkMET", RooArgSet(pfmet),hEWKMet); RooHistPdf pdfEWK ("ewk", "ewk", pfmet,ewkMet, 1); RooDataHist ewkMetp("ewkMETp","ewkMETp",RooArgSet(pfmet),hEWKMetp); RooHistPdf pdfEWKp("ewkp","ewkp",pfmet,ewkMetp,1); RooDataHist ewkMetm("ewkMETm","ewkMETm",RooArgSet(pfmet),hEWKMetm); RooHistPdf pdfEWKm("ewkm","ewkm",pfmet,ewkMetm,1); // QCD Pdfs CPepeModel1 qcd("qcd",pfmet); CPepeModel1 qcdp("qcdp",pfmet); CPepeModel1 qcdm("qcdm",pfmet); // Signal + Background PDFs RooAddPdf pdfMet ("pdfMet", "pdfMet", RooArgList(pdfWm,pdfEWK,*(qcd.model)), RooArgList(nSig,nEWK,nQCD)); RooAddPdf pdfMetp("pdfMetp","pdfMetp",RooArgList(pdfWmp,pdfEWKp,*(qcdp.model)),RooArgList(nSigp,nEWKp,nQCDp)); RooAddPdf pdfMetm("pdfMetm","pdfMetm",RooArgList(pdfWmm,pdfEWKm,*(qcdm.model)),RooArgList(nSigm,nEWKm,nQCDm)); // Anti-Signal PDFs RooDataHist awmunuMet ("awmunuMET", "awmunuMET", RooArgSet(pfmet),hAntiWmunuMet); RooHistPdf apdfWm ("awm", "awm", pfmet,awmunuMet, 1); RooDataHist awmunuMetp("awmunuMETp","awmunuMETp",RooArgSet(pfmet),hAntiWmunuMetp); RooHistPdf apdfWmp("awmp","awmp",pfmet,awmunuMetp,1); RooDataHist awmunuMetm("awmunuMETm","awmunuMETm",RooArgSet(pfmet),hAntiWmunuMetm); RooHistPdf apdfWmm("awmm","awmm",pfmet,awmunuMetm,1); // Anti-EWK+top PDFs RooDataHist aewkMet ("aewkMET", "aewkMET", RooArgSet(pfmet),hAntiEWKMet); RooHistPdf apdfEWK ("aewk", "aewk", pfmet,aewkMet, 1); RooDataHist aewkMetp("aewkMETp","aewkMETp",RooArgSet(pfmet),hAntiEWKMetp); RooHistPdf apdfEWKp("aewkp","aewkp",pfmet,aewkMetp,1); RooDataHist aewkMetm("aewkMETm","aewkMETm",RooArgSet(pfmet),hAntiEWKMetm); RooHistPdf apdfEWKm("aewkm","aewkm",pfmet,aewkMetm,1); // Anti-QCD Pdfs CPepeModel1 aqcd("aqcd",pfmet,qcd.a1); CPepeModel1 aqcdp("aqcdp",pfmet,qcdp.a1); CPepeModel1 aqcdm("aqcdm",pfmet,qcdm.a1); // Anti-selection PDFs RooAddPdf apdfMet ("apdfMet", "apdfMet", RooArgList(apdfWm,apdfEWK,*(aqcd.model)), RooArgList(nAntiSig,nAntiEWK,nAntiQCD)); RooAddPdf apdfMetp("apdfMetp","apdfMetp",RooArgList(apdfWmp,apdfEWKp,*(aqcdp.model)),RooArgList(nAntiSigp,nAntiEWKp,nAntiQCDp)); RooAddPdf apdfMetm("apdfMetm","apdfMetm",RooArgList(apdfWmm,apdfEWKm,*(aqcdm.model)),RooArgList(nAntiSigm,nAntiEWKm,nAntiQCDm)); // PDF for simultaneous fit RooCategory rooCat("rooCat","rooCat"); rooCat.defineType("Select"); rooCat.defineType("Anti"); RooSimultaneous pdfTotal("pdfTotal","pdfTotal",rooCat); pdfTotal.addPdf(pdfMet, "Select"); pdfTotal.addPdf(apdfMet,"Anti"); RooSimultaneous pdfTotalp("pdfTotalp","pdfTotalp",rooCat); pdfTotalp.addPdf(pdfMetp, "Select"); pdfTotalp.addPdf(apdfMetp,"Anti"); RooSimultaneous pdfTotalm("pdfTotalm","pdfTotalm",rooCat); pdfTotalm.addPdf(pdfMetm, "Select"); pdfTotalm.addPdf(apdfMetm,"Anti"); // // Perform fits // RooDataHist dataMet("dataMet", "dataMet", RooArgSet(pfmet), hDataMet); RooDataHist antiMet("antiMet", "antiMet", RooArgSet(pfmet), hAntiDataMet); RooDataHist dataTotal("dataTotal","dataTotal", RooArgList(pfmet), Index(rooCat), Import("Select", dataMet), Import("Anti", antiMet)); RooFitResult *fitRes = pdfTotal.fitTo(dataTotal,Extended(),Minos(kTRUE),Save(kTRUE)); RooDataHist dataMetp("dataMetp", "dataMetp", RooArgSet(pfmet), hDataMetp); RooDataHist antiMetp("antiMetp", "antiMetp", RooArgSet(pfmet), hAntiDataMetp); RooDataHist dataTotalp("dataTotalp","dataTotalp", RooArgList(pfmet), Index(rooCat), Import("Select", dataMetp), Import("Anti", antiMetp)); RooFitResult *fitResp = pdfTotalp.fitTo(dataTotalp,Extended(),Minos(kTRUE),Save(kTRUE)); RooDataHist dataMetm("dataMetm", "dataMetm", RooArgSet(pfmet), hDataMetm); RooDataHist antiMetm("antiMetm", "antiMetm", RooArgSet(pfmet), hAntiDataMetm); RooDataHist dataTotalm("dataTotalm","dataTotalm", RooArgList(pfmet), Index(rooCat), Import("Select", dataMetm), Import("Anti", antiMetm)); RooFitResult *fitResm = pdfTotalm.fitTo(dataTotalm,Extended(),Minos(kTRUE),Save(kTRUE)); // // Use histogram version of fitted PDFs to make ratio plots // (Will also use PDF histograms later for Chi^2 and KS tests) // TH1D *hPdfMet = (TH1D*)(pdfMet.createHistogram("hPdfMet", pfmet)); hPdfMet->Scale((nSig.getVal()+nEWK.getVal()+nQCD.getVal())/hPdfMet->Integral()); TH1D *hMetDiff = makeDiffHist(hDataMet,hPdfMet,"hMetDiff"); hMetDiff->SetMarkerStyle(kFullCircle); hMetDiff->SetMarkerSize(0.9); TH1D *hPdfMetp = (TH1D*)(pdfMetp.createHistogram("hPdfMetp", pfmet)); hPdfMetp->Scale((nSigp.getVal()+nEWKp.getVal()+nQCDp.getVal())/hPdfMetp->Integral()); TH1D *hMetpDiff = makeDiffHist(hDataMetp,hPdfMetp,"hMetpDiff"); hMetpDiff->SetMarkerStyle(kFullCircle); hMetpDiff->SetMarkerSize(0.9); TH1D *hPdfMetm = (TH1D*)(pdfMetm.createHistogram("hPdfMetm", pfmet)); hPdfMetm->Scale((nSigm.getVal()+nEWKm.getVal()+nQCDm.getVal())/hPdfMetm->Integral()); TH1D *hMetmDiff = makeDiffHist(hDataMetm,hPdfMetm,"hMetmDiff"); hMetmDiff->SetMarkerStyle(kFullCircle); hMetmDiff->SetMarkerSize(0.9); TH1D *hPdfAntiMet = (TH1D*)(apdfMet.createHistogram("hPdfAntiMet", pfmet)); hPdfAntiMet->Scale((nAntiSig.getVal()+nAntiEWK.getVal()+nAntiQCD.getVal())/hPdfAntiMet->Integral()); TH1D *hAntiMetDiff = makeDiffHist(hAntiDataMet,hPdfAntiMet,"hAntiMetDiff"); hAntiMetDiff->SetMarkerStyle(kFullCircle); hAntiMetDiff->SetMarkerSize(0.9); TH1D *hPdfAntiMetp = (TH1D*)(apdfMetp.createHistogram("hPdfAntiMetp", pfmet)); hPdfAntiMetp->Scale((nAntiSigp.getVal()+nAntiEWKp.getVal()+nAntiQCDp.getVal())/hPdfAntiMetp->Integral()); TH1D *hAntiMetpDiff = makeDiffHist(hAntiDataMetp,hPdfAntiMetp,"hAntiMetpDiff"); hAntiMetpDiff->SetMarkerStyle(kFullCircle); hAntiMetpDiff->SetMarkerSize(0.9); TH1D *hPdfAntiMetm = (TH1D*)(apdfMetm.createHistogram("hPdfAntiMetm", pfmet)); hPdfAntiMetm->Scale((nAntiSigm.getVal()+nAntiEWKm.getVal()+nAntiQCDm.getVal())/hPdfAntiMetm->Integral()); TH1D *hAntiMetmDiff = makeDiffHist(hAntiDataMetm,hPdfAntiMetm,"hAntiMetmDiff"); hAntiMetmDiff->SetMarkerStyle(kFullCircle); hAntiMetmDiff->SetMarkerSize(0.9); //-------------------------------------------------------------------------------------------------------------- // Make plots //============================================================================================================== TCanvas *c = MakeCanvas("c","c",800,800); c->Divide(1,2,0,0); c->cd(1)->SetPad(0,0.3,1.0,1.0); c->cd(1)->SetTopMargin(0.1); c->cd(1)->SetBottomMargin(0.01); c->cd(1)->SetLeftMargin(0.15); c->cd(1)->SetRightMargin(0.07); c->cd(1)->SetTickx(1); c->cd(1)->SetTicky(1); c->cd(2)->SetPad(0,0,1.0,0.3); c->cd(2)->SetTopMargin(0.05); c->cd(2)->SetBottomMargin(0.45); c->cd(2)->SetLeftMargin(0.15); c->cd(2)->SetRightMargin(0.07); c->cd(2)->SetTickx(1); c->cd(2)->SetTicky(1); gStyle->SetTitleOffset(1.100,"Y"); TGaxis::SetMaxDigits(3); char ylabel[100]; // string buffer for y-axis label // label for lumi char lumitext[100]; if(lumi<0.1) sprintf(lumitext,"%.1f pb^{-1} at #sqrt{s} = 8 TeV",lumi*1000.); else sprintf(lumitext,"%.2f fb^{-1} at #sqrt{s} = 8 TeV",lumi); // plot colors Int_t linecolorW = kOrange-3; Int_t fillcolorW = kOrange-2; Int_t linecolorEWK = kOrange+10; Int_t fillcolorEWK = kOrange+7; Int_t linecolorQCD = kViolet+2; Int_t fillcolorQCD = kViolet-5; Int_t ratioColor = kGray+2; // // Dummy histograms for TLegend // (I can't figure out how to properly pass RooFit objects...) // TH1D *hDummyData = new TH1D("hDummyData","",0,0,10); hDummyData->SetMarkerStyle(kFullCircle); hDummyData->SetMarkerSize(0.9); TH1D *hDummyW = new TH1D("hDummyW","",0,0,10); hDummyW->SetLineColor(linecolorW); hDummyW->SetFillColor(fillcolorW); hDummyW->SetFillStyle(1001); TH1D *hDummyEWK = new TH1D("hDummyEWK","",0,0,10); hDummyEWK->SetLineColor(linecolorEWK); hDummyEWK->SetFillColor(fillcolorEWK); hDummyEWK->SetFillStyle(1001); TH1D *hDummyQCD = new TH1D("hDummyQCD","",0,0,10); hDummyQCD->SetLineColor(linecolorQCD); hDummyQCD->SetFillColor(fillcolorQCD); hDummyQCD->SetFillStyle(1001); // // W MET plot // RooPlot *wmframe = pfmet.frame(Bins(NBINS)); wmframe->GetYaxis()->SetNdivisions(505); dataMet.plotOn(wmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); pdfMet.plotOn(wmframe,FillColor(fillcolorW),DrawOption("F")); pdfMet.plotOn(wmframe,LineColor(linecolorW)); pdfMet.plotOn(wmframe,Components(RooArgSet(pdfEWK,*(qcd.model))),FillColor(fillcolorEWK),DrawOption("F")); pdfMet.plotOn(wmframe,Components(RooArgSet(pdfEWK,*(qcd.model))),LineColor(linecolorEWK)); pdfMet.plotOn(wmframe,Components(RooArgSet(*(qcd.model))),FillColor(fillcolorQCD),DrawOption("F")); pdfMet.plotOn(wmframe,Components(RooArgSet(*(qcd.model))),LineColor(linecolorQCD)); pdfMet.plotOn(wmframe,Components(RooArgSet(pdfWm)),LineColor(linecolorW),LineStyle(2)); dataMet.plotOn(wmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); sprintf(ylabel,"Events / %.1f GeV",hDataMet->GetBinWidth(1)); CPlot plotMet("fitmet",wmframe,"","",ylabel); plotMet.SetLegend(0.68,0.57,0.93,0.77); plotMet.GetLegend()->AddEntry(hDummyData,"data","PL"); plotMet.GetLegend()->AddEntry(hDummyW,"W#rightarrow#mu#nu","F"); plotMet.GetLegend()->AddEntry(hDummyEWK,"EWK+t#bar{t}","F"); plotMet.GetLegend()->AddEntry(hDummyQCD,"QCD","F"); plotMet.AddTextBox(lumitext,0.55,0.80,0.90,0.86,0); plotMet.AddTextBox("CMS Preliminary",0.63,0.92,0.95,0.99,0); plotMet.SetYRange(0.1,1.1*(hDataMet->GetMaximum())); plotMet.Draw(c,kFALSE,format,1); CPlot plotMetDiff("fitmet","","#slash{E}_{T} [GeV]","#chi"); plotMetDiff.AddHist1D(hMetDiff,"EX0",ratioColor); plotMetDiff.SetYRange(-8,8); plotMetDiff.AddLine(0, 0,METMAX, 0,kBlack,1); plotMetDiff.AddLine(0, 5,METMAX, 5,kBlack,3); plotMetDiff.AddLine(0,-5,METMAX,-5,kBlack,3); plotMetDiff.Draw(c,kTRUE,format,2); plotMet.SetName("fitmetlog"); plotMet.SetLogy(); plotMet.SetYRange(1e-3*(hDataMet->GetMaximum()),10*(hDataMet->GetMaximum())); plotMet.Draw(c,kTRUE,format,1); RooPlot *awmframe = pfmet.frame(Bins(NBINS)); antiMet.plotOn(awmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); apdfMet.plotOn(awmframe,FillColor(fillcolorW),DrawOption("F")); apdfMet.plotOn(awmframe,LineColor(linecolorW)); apdfMet.plotOn(awmframe,Components(RooArgSet(apdfEWK,*(aqcd.model))),FillColor(fillcolorEWK),DrawOption("F")); apdfMet.plotOn(awmframe,Components(RooArgSet(apdfEWK,*(aqcd.model))),LineColor(linecolorEWK)); apdfMet.plotOn(awmframe,Components(RooArgSet(*(aqcd.model))),FillColor(fillcolorQCD),DrawOption("F")); apdfMet.plotOn(awmframe,Components(RooArgSet(*(aqcd.model))),LineColor(linecolorQCD)); apdfMet.plotOn(awmframe,Components(RooArgSet(apdfWm)),LineColor(linecolorW),LineStyle(2)); antiMet.plotOn(awmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); sprintf(ylabel,"Events / %.1f GeV",hAntiDataMet->GetBinWidth(1)); CPlot plotAntiMet("fitantimet",awmframe,"","",ylabel); plotAntiMet.SetLegend(0.68,0.57,0.93,0.77); plotAntiMet.GetLegend()->AddEntry(hDummyData,"data","PL"); plotAntiMet.GetLegend()->AddEntry(hDummyW,"W#rightarrow#mu#nu","F"); plotAntiMet.GetLegend()->AddEntry(hDummyEWK,"EWK+t#bar{t}","F"); plotAntiMet.GetLegend()->AddEntry(hDummyQCD,"QCD","F"); plotAntiMet.AddTextBox(lumitext,0.55,0.80,0.90,0.86,0); plotAntiMet.AddTextBox("CMS Preliminary",0.63,0.92,0.95,0.99,0); plotAntiMet.SetYRange(0.1,1.1*(hAntiDataMet->GetMaximum())); plotAntiMet.Draw(c,kFALSE,format,1); CPlot plotAntiMetDiff("fitantimet","","#slash{E}_{T} [GeV]","#chi"); plotAntiMetDiff.AddHist1D(hMetDiff,"EX0",ratioColor); plotAntiMetDiff.SetYRange(-8,8); plotAntiMetDiff.AddLine(0, 0,METMAX, 0,kBlack,1); plotAntiMetDiff.AddLine(0, 5,METMAX, 5,kBlack,3); plotAntiMetDiff.AddLine(0,-5,METMAX,-5,kBlack,3); plotAntiMetDiff.Draw(c,kTRUE,format,2); plotAntiMet.SetName("fitantimetlog"); plotAntiMet.SetLogy(); plotAntiMet.SetYRange(1e-3*(hAntiDataMet->GetMaximum()),10*(hAntiDataMet->GetMaximum())); plotAntiMet.Draw(c,kTRUE,format,1); // // W+ MET plot // RooPlot *wmpframe = pfmet.frame(Bins(NBINS)); wmpframe->GetYaxis()->SetNdivisions(505); dataMetp.plotOn(wmpframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); pdfMetp.plotOn(wmpframe,FillColor(fillcolorW),DrawOption("F")); pdfMetp.plotOn(wmpframe,LineColor(linecolorW)); pdfMetp.plotOn(wmpframe,Components(RooArgSet(pdfEWKp,*(qcdp.model))),FillColor(fillcolorEWK),DrawOption("F")); pdfMetp.plotOn(wmpframe,Components(RooArgSet(pdfEWKp,*(qcdp.model))),LineColor(linecolorEWK)); pdfMetp.plotOn(wmpframe,Components(RooArgSet(*(qcdp.model))),FillColor(fillcolorQCD),DrawOption("F")); pdfMetp.plotOn(wmpframe,Components(RooArgSet(*(qcdp.model))),LineColor(linecolorQCD)); pdfMetp.plotOn(wmpframe,Components(RooArgSet(pdfWmp)),LineColor(linecolorW),LineStyle(2)); dataMetp.plotOn(wmpframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); sprintf(ylabel,"Events / %.1f GeV",hDataMetp->GetBinWidth(1)); CPlot plotMetp("fitmetp",wmpframe,"","",ylabel); plotMetp.SetLegend(0.68,0.57,0.93,0.77); plotMetp.GetLegend()->AddEntry(hDummyData,"data","PL"); plotMetp.GetLegend()->AddEntry(hDummyW,"W^{+}#rightarrow#mu^{+}#nu","F"); plotMetp.GetLegend()->AddEntry(hDummyEWK,"EWK+t#bar{t}","F"); plotMetp.GetLegend()->AddEntry(hDummyQCD,"QCD","F"); plotMetp.AddTextBox(lumitext,0.55,0.80,0.90,0.86,0); plotMetp.AddTextBox("CMS Preliminary",0.63,0.92,0.95,0.99,0); // plotMetp.SetYRange(0.1,1.1*(hDataMetp->GetMaximum())); plotMetp.SetYRange(0.1,4100); plotMetp.Draw(c,kFALSE,format,1); CPlot plotMetpDiff("fitmetp","","#slash{E}_{T} [GeV]","#chi"); plotMetpDiff.AddHist1D(hMetpDiff,"EX0",ratioColor); plotMetpDiff.SetYRange(-8,8); plotMetpDiff.AddLine(0, 0,METMAX, 0,kBlack,1); plotMetpDiff.AddLine(0, 5,METMAX, 5,kBlack,3); plotMetpDiff.AddLine(0,-5,METMAX,-5,kBlack,3); plotMetpDiff.Draw(c,kTRUE,format,2); plotMetp.SetName("fitmetplog"); plotMetp.SetLogy(); plotMetp.SetYRange(1e-3*(hDataMetp->GetMaximum()),10*(hDataMetp->GetMaximum())); plotMetp.Draw(c,kTRUE,format,1); RooPlot *awmpframe = pfmet.frame(Bins(NBINS)); antiMetp.plotOn(awmpframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); apdfMetp.plotOn(awmpframe,FillColor(fillcolorW),DrawOption("F")); apdfMetp.plotOn(awmpframe,LineColor(linecolorW)); apdfMetp.plotOn(awmpframe,Components(RooArgSet(apdfEWKp,*(aqcdp.model))),FillColor(fillcolorEWK),DrawOption("F")); apdfMetp.plotOn(awmpframe,Components(RooArgSet(apdfEWKp,*(aqcdp.model))),LineColor(linecolorEWK)); apdfMetp.plotOn(awmpframe,Components(RooArgSet(*(aqcdp.model))),FillColor(fillcolorQCD),DrawOption("F")); apdfMetp.plotOn(awmpframe,Components(RooArgSet(*(aqcdp.model))),LineColor(linecolorQCD)); apdfMetp.plotOn(awmpframe,Components(RooArgSet(apdfWmp)),LineColor(linecolorW),LineStyle(2)); antiMetp.plotOn(awmpframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); sprintf(ylabel,"Events / %.1f GeV",hAntiDataMetp->GetBinWidth(1)); CPlot plotAntiMetp("fitantimetp",awmpframe,"","",ylabel); plotAntiMetp.SetLegend(0.68,0.57,0.93,0.77); plotAntiMetp.GetLegend()->AddEntry(hDummyData,"data","PL"); plotAntiMetp.GetLegend()->AddEntry(hDummyW,"W^{+}#rightarrow#mu^{+}#nu","F"); plotAntiMetp.GetLegend()->AddEntry(hDummyEWK,"EWK+t#bar{t}","F"); plotAntiMetp.GetLegend()->AddEntry(hDummyQCD,"QCD","F"); plotAntiMetp.AddTextBox(lumitext,0.55,0.80,0.90,0.86,0); plotAntiMetp.AddTextBox("CMS Preliminary",0.63,0.92,0.95,0.99,0); // plotAntiMetp.SetYRange(0.1,1.1*(hAntiDataMetp->GetMaximum())); plotAntiMetp.SetYRange(0.1,1500); plotAntiMetp.Draw(c,kFALSE,format,1); CPlot plotAntiMetpDiff("fitantimetp","","#slash{E}_{T} [GeV]","#chi"); plotAntiMetpDiff.AddHist1D(hAntiMetpDiff,"EX0",ratioColor); plotAntiMetpDiff.SetYRange(-8,8); plotAntiMetpDiff.AddLine(0, 0,METMAX, 0,kBlack,1); plotAntiMetpDiff.AddLine(0, 5,METMAX, 5,kBlack,3); plotAntiMetpDiff.AddLine(0,-5,METMAX,-5,kBlack,3); plotAntiMetpDiff.Draw(c,kTRUE,format,2); plotAntiMetp.SetName("fitantimetplog"); plotAntiMetp.SetLogy(); plotAntiMetp.SetYRange(1e-3*(hAntiDataMetp->GetMaximum()),10*(hAntiDataMetp->GetMaximum())); plotAntiMetp.Draw(c,kTRUE,format,1); // // W- MET plot // RooPlot *wmmframe = pfmet.frame(Bins(NBINS)); wmmframe->GetYaxis()->SetNdivisions(505); dataMetm.plotOn(wmmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); pdfMetm.plotOn(wmmframe,FillColor(fillcolorW),DrawOption("F")); pdfMetm.plotOn(wmmframe,LineColor(linecolorW)); pdfMetm.plotOn(wmmframe,Components(RooArgSet(pdfEWKm,*(qcdm.model))),FillColor(fillcolorEWK),DrawOption("F")); pdfMetm.plotOn(wmmframe,Components(RooArgSet(pdfEWKm,*(qcdm.model))),LineColor(linecolorEWK)); pdfMetm.plotOn(wmmframe,Components(RooArgSet(*(qcdm.model))),FillColor(fillcolorQCD),DrawOption("F")); pdfMetm.plotOn(wmmframe,Components(RooArgSet(*(qcdm.model))),LineColor(linecolorQCD)); pdfMetm.plotOn(wmmframe,Components(RooArgSet(pdfWmm)),LineColor(linecolorW),LineStyle(2)); dataMetm.plotOn(wmmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); sprintf(ylabel,"Events / %.1f GeV",hDataMetm->GetBinWidth(1)); CPlot plotMetm("fitmetm",wmmframe,"","",ylabel); plotMetm.SetLegend(0.68,0.57,0.93,0.77); plotMetm.GetLegend()->AddEntry(hDummyData,"data","PL"); plotMetm.GetLegend()->AddEntry(hDummyW,"W^{-}#rightarrow#mu^{-}#bar{#nu}","F"); plotMetm.GetLegend()->AddEntry(hDummyEWK,"EWK+t#bar{t}","F"); plotMetm.GetLegend()->AddEntry(hDummyQCD,"QCD","F"); plotMetm.AddTextBox(lumitext,0.55,0.80,0.90,0.86,0); plotMetm.AddTextBox("CMS Preliminary",0.63,0.92,0.95,0.99,0); // plotMetm.SetYRange(0.1,1.1*(hDataMetm->GetMaximum())); plotMetm.SetYRange(0.1,4100); plotMetm.Draw(c,kFALSE,format,1); CPlot plotMetmDiff("fitmetm","","#slash{E}_{T} [GeV]","#chi"); plotMetmDiff.AddHist1D(hMetmDiff,"EX0",ratioColor); plotMetmDiff.SetYRange(-8,8); plotMetmDiff.AddLine(0, 0,METMAX, 0,kBlack,1); plotMetmDiff.AddLine(0, 5,METMAX, 5,kBlack,3); plotMetmDiff.AddLine(0,-5,METMAX,-5,kBlack,3); plotMetmDiff.Draw(c,kTRUE,format,2); plotMetm.SetName("fitmetmlog"); plotMetm.SetLogy(); plotMetm.SetYRange(1e-3*(hDataMetm->GetMaximum()),10*(hDataMetm->GetMaximum())); plotMetm.Draw(c,kTRUE,format,1); RooPlot *awmmframe = pfmet.frame(Bins(NBINS)); antiMetm.plotOn(awmmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); apdfMetm.plotOn(awmmframe,FillColor(fillcolorW),DrawOption("F")); apdfMetm.plotOn(awmmframe,LineColor(linecolorW)); apdfMetm.plotOn(awmmframe,Components(RooArgSet(apdfEWKm,*(aqcdm.model))),FillColor(fillcolorEWK),DrawOption("F")); apdfMetm.plotOn(awmmframe,Components(RooArgSet(apdfEWKm,*(aqcdm.model))),LineColor(linecolorEWK)); apdfMetm.plotOn(awmmframe,Components(RooArgSet(*(aqcdm.model))),FillColor(fillcolorQCD),DrawOption("F")); apdfMetm.plotOn(awmmframe,Components(RooArgSet(*(aqcdm.model))),LineColor(linecolorQCD)); apdfMetm.plotOn(awmmframe,Components(RooArgSet(apdfWmm)),LineColor(linecolorW),LineStyle(2)); antiMetm.plotOn(awmmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP")); sprintf(ylabel,"Events / %.1f GeV",hDataMetm->GetBinWidth(1)); CPlot plotAntiMetm("fitantimetm",awmmframe,"","",ylabel); plotAntiMetm.SetLegend(0.68,0.57,0.93,0.77); plotAntiMetm.GetLegend()->AddEntry(hDummyData,"data","PL"); plotAntiMetm.GetLegend()->AddEntry(hDummyW,"W^{-}#rightarrow#mu^{-}#bar{#nu}","F"); plotAntiMetm.GetLegend()->AddEntry(hDummyEWK,"EWK+t#bar{t}","F"); plotAntiMetm.GetLegend()->AddEntry(hDummyQCD,"QCD","F"); plotAntiMetm.AddTextBox(lumitext,0.55,0.80,0.90,0.86,0); plotAntiMetm.AddTextBox("CMS Preliminary",0.63,0.92,0.95,0.99,0); // plotAntiMetm.SetYRange(0.1,1.1*(hAntiDataMetm->GetMaximum())); plotAntiMetm.SetYRange(0.1,1500); plotAntiMetm.Draw(c,kFALSE,format,1); CPlot plotAntiMetmDiff("fitantimetm","","#slash{E}_{T} [GeV]","#chi"); plotAntiMetmDiff.AddHist1D(hAntiMetmDiff,"EX0",ratioColor); plotAntiMetmDiff.SetYRange(-8,8); plotAntiMetmDiff.AddLine(0, 0,METMAX, 0,kBlack,1); plotAntiMetmDiff.AddLine(0, 5,METMAX, 5,kBlack,3); plotAntiMetmDiff.AddLine(0,-5,METMAX,-5,kBlack,3); plotAntiMetmDiff.Draw(c,kTRUE,format,2); plotAntiMetm.SetName("fitantimetmlog"); plotAntiMetm.SetLogy(); plotAntiMetm.SetYRange(1e-3*(hAntiDataMetm->GetMaximum()),10*(hAntiDataMetm->GetMaximum())); plotAntiMetm.Draw(c,kTRUE,format,1); //-------------------------------------------------------------------------------------------------------------- // Output //============================================================================================================== cout << "*" << endl; cout << "* SUMMARY" << endl; cout << "*--------------------------------------------------" << endl; // // Write fit results // ofstream txtfile; char txtfname[100]; ios_base::fmtflags flags; Double_t chi2prob, chi2ndf; Double_t ksprob, ksprobpe; chi2prob = hDataMet->Chi2Test(hPdfMet,"PUW"); chi2ndf = hDataMet->Chi2Test(hPdfMet,"CHI2/NDFUW"); ksprob = hDataMet->KolmogorovTest(hPdfMet); ksprobpe = hDataMet->KolmogorovTest(hPdfMet,"DX"); sprintf(txtfname,"%s/fitresWm.txt",CPlot::sOutDir.Data()); txtfile.open(txtfname); assert(txtfile.is_open()); flags = txtfile.flags(); txtfile << setprecision(10); txtfile << " *** Yields *** " << endl; txtfile << "Selected: " << hDataMet->Integral() << endl; txtfile << " Signal: " << nSig.getVal() << " +/- " << nSig.getPropagatedError(*fitRes) << endl; txtfile << " QCD: " << nQCD.getVal() << " +/- " << nQCD.getPropagatedError(*fitRes) << endl; txtfile << " Other: " << nEWK.getVal() << " +/- " << nEWK.getPropagatedError(*fitRes) << endl; txtfile << endl; txtfile.flags(flags); fitRes->printStream(txtfile,RooPrintable::kValue,RooPrintable::kVerbose); txtfile << endl; printCorrelations(txtfile, fitRes); txtfile << endl; printChi2AndKSResults(txtfile, chi2prob, chi2ndf, ksprob, ksprobpe); txtfile.close(); chi2prob = hDataMetp->Chi2Test(hPdfMetp,"PUW"); chi2ndf = hDataMetp->Chi2Test(hPdfMetp,"CHI2/NDFUW"); ksprob = hDataMetp->KolmogorovTest(hPdfMetp); ksprobpe = hDataMetp->KolmogorovTest(hPdfMetp,"DX"); sprintf(txtfname,"%s/fitresWmp.txt",CPlot::sOutDir.Data()); txtfile.open(txtfname); assert(txtfile.is_open()); flags = txtfile.flags(); txtfile << setprecision(10); txtfile << " *** Yields *** " << endl; txtfile << "Selected: " << hDataMetp->Integral() << endl; txtfile << " Signal: " << nSigp.getVal() << " +/- " << nSigp.getPropagatedError(*fitResp) << endl; txtfile << " QCD: " << nQCDp.getVal() << " +/- " << nQCDp.getPropagatedError(*fitResp) << endl; txtfile << " Other: " << nEWKp.getVal() << " +/- " << nEWKp.getPropagatedError(*fitResp) << endl; txtfile << endl; txtfile.flags(flags); fitResp->printStream(txtfile,RooPrintable::kValue,RooPrintable::kVerbose); txtfile << endl; printCorrelations(txtfile, fitResp); txtfile << endl; printChi2AndKSResults(txtfile, chi2prob, chi2ndf, ksprob, ksprobpe); txtfile.close(); chi2prob = hDataMetm->Chi2Test(hPdfMetm,"PUW"); chi2ndf = hDataMetm->Chi2Test(hPdfMetm,"CHI2/NDFUW"); ksprob = hDataMetm->KolmogorovTest(hPdfMetm); ksprobpe = hDataMetm->KolmogorovTest(hPdfMetm,"DX"); sprintf(txtfname,"%s/fitresWmm.txt",CPlot::sOutDir.Data()); txtfile.open(txtfname); assert(txtfile.is_open()); flags = txtfile.flags(); txtfile << setprecision(10); txtfile << " *** Yields *** " << endl; txtfile << "Selected: " << hDataMetm->Integral() << endl; txtfile << " Signal: " << nSigm.getVal() << " +/- " << nSigm.getPropagatedError(*fitResm) << endl; txtfile << " QCD: " << nQCDm.getVal() << " +/- " << nQCDm.getPropagatedError(*fitResm) << endl; txtfile << " Other: " << nEWKm.getVal() << " +/- " << nEWKm.getPropagatedError(*fitResm) << endl; txtfile << endl; txtfile.flags(flags); fitResm->printStream(txtfile,RooPrintable::kValue,RooPrintable::kVerbose); txtfile << endl; printCorrelations(txtfile, fitResm); txtfile << endl; printChi2AndKSResults(txtfile, chi2prob, chi2ndf, ksprob, ksprobpe); txtfile.close(); makeHTML(outputDir); cout << endl; cout << " <> Output saved in " << outputDir << "/" << endl; cout << endl; gBenchmark->Show("fitWm"); }
void FitBias(TString CAT,TString CUT,float SIG,float BKG,int NTOYS) { gROOT->ForceStyle(); RooMsgService::instance().setSilentMode(kTRUE); RooMsgService::instance().setStreamStatus(0,kFALSE); RooMsgService::instance().setStreamStatus(1,kFALSE); // ----------------------------------------- TFile *fTemplates = TFile::Open("templates_"+CUT+"_"+CAT+"_workspace.root"); RooWorkspace *wTemplates = (RooWorkspace*)fTemplates->Get("w"); RooRealVar *x = (RooRealVar*)wTemplates->var("mTop"); RooAbsPdf *pdf_signal = (RooAbsPdf*)wTemplates->pdf("ttbar_pdf_Nominal"); RooAbsPdf *pdf_bkg = (RooAbsPdf*)wTemplates->pdf("qcdCor_pdf"); TRandom *rnd = new TRandom(); rnd->SetSeed(0); x->setBins(250); RooPlot *frame; TFile *outf; if (NTOYS > 1) { outf = TFile::Open("FitBiasToys_"+CUT+"_"+CAT+".root","RECREATE"); } float nSigInj,nBkgInj,nSigFit,nBkgFit,eSigFit,eBkgFit,nll; TTree *tr = new TTree("toys","toys"); tr->Branch("nSigInj",&nSigInj,"nSigInj/F"); tr->Branch("nSigFit",&nSigFit,"nSigFit/F"); tr->Branch("nBkgInj",&nBkgInj,"nBkgInj/F"); tr->Branch("nBkgFit",&nBkgFit,"nBkgFit/F"); tr->Branch("eSigFit",&eSigFit,"eSigFit/F"); tr->Branch("eBkgFit",&eBkgFit,"eBkgFit/F"); tr->Branch("nll" ,&nll ,"nll/F"); for(int itoy=0;itoy<NTOYS;itoy++) { // generate pseudodataset nSigInj = rnd->Poisson(SIG); nBkgInj = rnd->Poisson(BKG); RooRealVar *nSig = new RooRealVar("nSig","nSig",nSigInj); RooRealVar *nBkg = new RooRealVar("nBkg","nBkg",nBkgInj); RooAddPdf *model = new RooAddPdf("model","model",RooArgList(*pdf_signal,*pdf_bkg),RooArgList(*nSig,*nBkg)); RooDataSet *data = model->generate(*x,nSigInj+nBkgInj); RooDataHist *roohist = new RooDataHist("roohist","roohist",RooArgList(*x),*data); // build fit model RooRealVar *nFitSig = new RooRealVar("nFitSig","nFitSig",SIG,0,10*SIG); RooRealVar *nFitBkg = new RooRealVar("nFitBkg","nFitBkg",BKG,0,10*BKG); RooAddPdf *modelFit = new RooAddPdf("modelFit","modelFit",RooArgList(*pdf_signal,*pdf_bkg),RooArgList(*nFitSig,*nFitBkg)); // fit the pseudo dataset RooFitResult *res = modelFit->fitTo(*roohist,RooFit::Save(),RooFit::Extended(kTRUE)); //res->Print(); nSigFit = nFitSig->getVal(); nBkgFit = nFitBkg->getVal(); eSigFit = nFitSig->getError(); eBkgFit = nFitBkg->getError(); nll = res->minNll(); tr->Fill(); if (itoy % 100 == 0) { cout<<"Toy #"<<itoy<<": injected = "<<nSigInj<<", fitted = "<<nSigFit<<", error = "<<eSigFit<<endl; } if (NTOYS == 1) { frame = x->frame(); roohist->plotOn(frame); model->plotOn(frame); } } if (NTOYS == 1) { TCanvas *can = new TCanvas("Toy","Toy",900,600); frame->Draw(); } else { outf->cd(); tr->Write(); outf->Close(); fTemplates->Close(); } }
void BDT_cuts_norm(){ gROOT->ProcessLine(".L ~/cern/project/lhcbStyle.C"); lhcbStyle(); const std::string filename("/afs/cern.ch/work/a/apmorris/private/cern/ntuples/new_tuples/normalisation_samples/Lb2JpsipK_2011_2012_signal_withbdt.root"); const std::string treename = "withbdt"; const std::string filenameMC("/afs/cern.ch/work/a/apmorris/private/cern/ntuples/new_tuples/normalisation_samples/Lb2JpsipK_MC_2011_2012_norm_withbdt.root"); TFile* file = TFile::Open( filename.c_str() ); if( !file ) std::cout << "file " << filename << " does not exist" << std::endl; TTree* tree = (TTree*)file->Get( treename.c_str() ); if( !tree ) std::cout << "tree " << treename << " does not exist" << std::endl; TFile* fileMC = TFile::Open( filenameMC.c_str() ); if( !fileMC ) std::cout << "file " << filenameMC << " does not exist" << std::endl; TTree* treeMC = (TTree*)fileMC->Get( treename.c_str() ); if( !treeMC ) std::cout << "tree " << treename << " does not exist" << std::endl; // -- signal, mass shape RooRealVar Lambda_b0_DTF_MASS_constr1("Lambda_b0_DTF_MASS_constr1","m(J/#psi pK^{-})", 5550., 5700., "MeV/c^{2}"); RooRealVar Jpsi_M("Jpsi_M","m(#mu#mu)", 3000., 3200., "MeV/c^{2}"); RooRealVar chi_c_M("chi_c_M","m(J/#psi#gamma)", 3400., 3700., "MeV/c^{2}"); RooRealVar mean("mean","mean", 5630., 5610., 5650.); RooRealVar sigma1("sigma1","sigma1", 10., 1., 100.); RooRealVar sigma2("sigma2","sigma2", 30.0, 5.0, 300.0); RooRealVar alpha1("alpha1","alpha1", 1.0, 0.5, 5.0); RooRealVar n1("n1","n1", 1.8, 0.2, 15.0); RooRealVar alpha2("alpha2","alpha2", -0.5, -5.5, 0.0); RooRealVar n2("n2","n2", 0.7, 0.2, 10.0); //RooRealVar bkgcat_chic("bkgcat_chic","bkgcat_chic", 0, 100); RooRealVar bdtg3("bdtg3", "bdtg3", -1.0, 1.0); RooRealVar frac2("frac2","frac2", 0.3, 0., 1.); RooGaussian gauss1("gauss1","gauss1", Lambda_b0_DTF_MASS_constr1, mean, sigma1); RooGaussian gauss2("gauss2","gauss2", Lambda_b0_DTF_MASS_constr1, mean, sigma2); RooCBShape cb1("cb1","cb1", Lambda_b0_DTF_MASS_constr1, mean, sigma1, alpha1, n1); RooCBShape cb2("cb2","cb2", Lambda_b0_DTF_MASS_constr1, mean, sigma2, alpha2, n2); RooAddPdf sig("sig", "sig", RooArgList(cb1, cb2), RooArgList( frac2 )); RooRealVar cbRatio("cbRatio","cb Ratio", 0.8, 0.1, 1.0); RooRealVar sigYield("sigYield","sig Yield", 4e2, 1e0, 1e6); RooRealVar bgYield("bgYield","bg Yield", 1e4, 1e0, 1e6); //put in values from fit_MC here <<--- DON'T FORGET TO CHANGE THESE IF THE FIT CHANGES!!! /* EXT PARAMETER INTERNAL INTERNAL NO. NAME VALUE ERROR STEP SIZE VALUE 1 alpha1 2.18020e+00 2.85078e-02 1.38432e-04 -2.56034e-01 2 alpha2 -2.79102e+00 6.74385e-02 1.51818e-04 -1.49177e-02 3 cbRatio 3.07172e-01 1.49204e-02 1.72642e-04 -5.69984e-01 4 mean 5.61985e+03 9.58397e-03 5.56682e-05 -9.66293e-02 5 n1 1.49358e+00 8.14447e-02 2.09300e-04 -9.70542e-01 6 n2 1.45276e+00 1.09864e-01 2.59028e-04 -8.39538e-01 7 sigma1 8.46303e+00 1.32851e-01 2.86985e-05 -1.01453e+00 8 sigma2 4.93976e+00 3.42842e-02 5.03572e-06 -1.44512e+00 */ alpha1.setVal( 2.18020e+00 ); alpha2.setVal( -2.79102e+00 ); n1.setVal( 1.49358e+00 ); n2.setVal( 1.45276e+00 ); frac2.setVal( 3.07172e-01 ); sigma1.setVal( 8.46303e+00 ); sigma2.setVal( 4.93976e+00 ); alpha1.setConstant( true ); alpha2.setConstant( true ); frac2.setConstant( true ); n1.setConstant( true ); n2.setConstant( true ); sigma1.setConstant( true ); sigma2.setConstant( true ); // -- bg, mass shape RooRealVar a1("a1","a1", -0.1, -0.5, 0.5); RooChebychev comb("comb","comb", Lambda_b0_DTF_MASS_constr1, a1); RooRealVar mean3("mean3","mean3", 5560., 5500., 5600.); RooRealVar sigma3("sigma3","sigma3", 5., 1., 10.); RooRealVar frac3("frac3","frac", 0.2, 0.0, 0.3); RooGaussian gauss3("gauss3","gauss3", Lambda_b0_DTF_MASS_constr1, mean3, sigma3); //RooAddPdf bg("bg","bg", RooArgList(comb), RooArgList(frac3)); // -- add signal & bg RooAddPdf pdf("pdf", "pdf", RooArgList(sig, comb), RooArgList( sigYield, bgYield)); double efficiencies1[40]; double efficiencies1_error[40]; double bdt_cuts[40]; double efficiencies2[40]; double efficiencies2_error[40]; double sideband_bg_val[40]; double MC_pre = treeMC->GetEntries(); double effvals[40]; //loop starting here for(int i=0; i < 40; i=i+1) { double cut_val = -1.0 + i*0.05; //double cut_val = -1.0; // testing bdt_cuts[i] = cut_val; std::stringstream c; c << "bdtg3" << " >= " << cut_val; const std::string cut = c.str(); //std::cout << cut; RooArgSet obs; obs.add(Lambda_b0_DTF_MASS_constr1); //obs.add(chi_c_Mp); //obs.add(mass_pK); obs.add(Jpsi_M); obs.add(chi_c_M); obs.add(bdtg3); RooDataSet ds("ds","ds", obs, RooFit::Import(*tree), RooFit::Cut(cut.c_str())); RooPlot* plot = Lambda_b0_DTF_MASS_constr1.frame(); RooFitResult * result = pdf.fitTo( ds, RooFit::Extended() ); double sig_val = sigYield.getVal(); double bg_val = bgYield.getVal(); double sig_error = sigYield.getError(); double bg_error = bgYield.getError(); double efficiency1 = (sig_val)/(sqrt(sig_val + bg_val)); efficiencies1[i] = efficiency1; double efficiency1_error_sq = (pow(sig_error,2)/(sig_val+bg_val) + (pow(sig_val,2)*(pow(sig_error,2)+pow(bg_error,2))/(4*pow((sig_val+bg_val),3)))); double efficiency1_error = sqrt(efficiency1_error_sq); efficiencies1_error[i] = efficiency1_error; /* double MC_post = treeMC->GetEntries(cut.c_str()); double eff_val = MC_post/MC_pre; //something here to get the sideband background count Lambda_b0_DTF_MASS_constr1.setRange("R", 5650., 5700.); RooFitResult * sideband = bg.fitTo( ds, RooFit::Range("R") ); sideband->Print(); Lambda_b0_DTF_MASS_constr1.setRange("R", 5650., 5700.); RooAbsReal* integral = pdf.createIntegral(Lambda_b0_DTF_MASS_constr1, RooFit::Range("R")); //std::cout << integral->getVal() << std::endl; //std::cout << integral->getError() << std::endl; //Double_t sideband_bg_val = integral->getVal(); //double sideband_bg_error = integral->getError(); std::stringstream r; r << "bdtg3" << " >= " << cut_val << " && Lambda_b0_DTF_MASS_constr1 >= 5650 && Lambda_b0_DTF_MASS_constr1 <= 5700"; const std::string cut2 = r.str(); double integ = tree->GetEntries(cut2.c_str()); //double integ = integral->getVal(); double efficiency2 = eff_val/(5./2. + sqrt(integ)); efficiencies2[i] = efficiency2; effvals[i]=eff_val; std::cout << "\n" << integ << std::endl; std::cout << "\n" << eff_val << std::endl; std::cout << "\n" << efficiency2 << std::endl; */ //double efficiency2_error = efficiency2*sqrt(pow(eff_error/eff_val,2)+(1/(4*sideband_bg_val))*pow(sideband_bg_error/(5/2+sideband_bg_val),2)); //std::cout << "\n\n" << "BDT cut value = " << cut_val << "\n" ; //std::cout << "S = " << sig_val << " +/- " << sig_error << "\n" ; //std::cout << "B = " << bg_val << " +/- " << bg_error << "\n" ; //std::cout << "S/sqrt(S+B) = " << efficiency << " +/- " << efficiency_error << "\n\n" ; //ds.plotOn( plot ); //pdf.plotOn( plot ); //RooPlot* plotPullMass = mass.frame(); //plotPullMass->addPlotable( plot->pullHist() ); //plotPullMass->SetMinimum(); //plotPullMass->SetMaximum(); //std::cout << cut_val; } TCanvas *c1 = new TCanvas(); //double zeros[20]; //for (i=0, i<20, i++) zeros[i]=0.0; TGraphErrors* graph = new TGraphErrors(40, bdt_cuts, efficiencies1, 0, efficiencies1_error); graph->SetTitle("S/sqrt(S+B) vs BDTG3 cut"); //graph->SetMarkerColor(4); //graph->SetMarkerStyle(20); //graph->SetMarkerSize(1.0); graph->GetXaxis()->SetTitle("BDTG3 cut (>)"); graph->GetXaxis()->SetRangeUser(-1.0,1.0); graph->GetYaxis()->SetTitle("S/sqrt(S+B)"); //graph->Fit("pol5"); graph->Draw("AP"); c1->SaveAs("~/cern/plots/bdt_cuts_norm/Lb2JpsipK_2011_2012_BDTG3_cuts_S_sqrtS+B.pdf"); //return c1; //std::cout << efficiencies1_error[5] << std::endl; //gStyle->SetOptFit(1011); /*TCanvas *c2 = new TCanvas(); TGraph* graph2 = new TGraph(40, bdt_cuts, efficiencies2); graph2->SetTitle("eff/[5/2+sqrt(B)] vs BDTG3 cut"); graph2->SetMarkerColor(4); graph2->SetMarkerStyle(20); graph2->SetMarkerSize(1.0); graph2->GetXaxis()->SetTitle("BDTG3 cut (>)"); graph2->GetXaxis()->SetRangeUser(-1.0,1.0); graph2->GetYaxis()->SetTitle("eff/[5/2+sqrt(B)]"); //graph2->Fit("pol7"); graph2->Draw("AP"); c2->SaveAs("~/cern/plots/bdt_cuts_norm/Lb2JpsipK_2011_2012_BDTG3_cuts_Punzi.png"); //return c2; */ /* TCanvas* c = new TCanvas(); TPad* pad1 = new TPad("pad1","pad1", 0, 0.3, 1, 1.0); pad1->SetBottomMargin(0.1); pad1->SetTopMargin(0.1); pad1->Draw(); c->cd(); TPad* pad2 = new TPad("pad2","pad2", 0, 0, 1, 0.3); pad2->SetBottomMargin(0.1); pad2->SetTopMargin(0.0); pad2->Draw(); //pdf.plotOn( plot, RooFit::Components( DfbPdf ), RooFit::LineColor( kRed ), RooFit::LineStyle(kDashed) ); //pdf.plotOn( plot, RooFit::Components( promptPdf ), RooFit::LineColor( kBlue ), RooFit::LineStyle(kDotted) ); //pdf.plotOn( plot, RooFit::Components( bgPdf ), RooFit::LineColor( kOrange ), RooFit::LineStyle(kDashDotted) ); pad1->cd(); plot->Draw(); pad2->cd(); plotPullMass->Draw("AP"); c->SaveAs(out_file_mass); RooStats::SPlot* sData = new RooStats::SPlot("sData","An SPlot", ds, &pdf, RooArgList(sigYield, bgYield) ); RooDataSet * dataw_z = new RooDataSet(ds.GetName(),ds.GetTitle(),&ds,*(ds.get()),0,"sigYield_sw") ; */ /* TCanvas* d = new TCanvas(); RooPlot* w_mass_chicp = mass_chicp.frame(); dataw_z->plotOn(w_mass_chicp, RooFit::DataError(RooAbsData::SumW2), RooFit::Binning(20)) ; w_mass_chicp->Draw(); d->SaveAs("m_chicp_sweighted.png"); TCanvas* e = new TCanvas(); RooPlot* w_mass_pK = mass_pK.frame(); dataw_z->plotOn(w_mass_pK, RooFit::DataError(RooAbsData::SumW2), RooFit::Binning(20)) ; w_mass_pK->Draw(); e->SaveAs("m_pK_sweighted.png"); */ /* TCanvas* f = new TCanvas(); RooPlot* w_mass_Jpsi = mass_Jpsi.frame(); dataw_z->plotOn(w_mass_Jpsi, RooFit::DataError(RooAbsData::SumW2), RooFit::Binning(20)) ; w_mass_Jpsi->Draw(); f->SaveAs("m_Jpsi_sweighted.png"); TCanvas* g = new TCanvas(); RooPlot* w_mass_Chic = mass_Chic.frame(); dataw_z->plotOn(w_mass_Chic, RooFit::DataError(RooAbsData::SumW2), RooFit::Binning(20)) ; w_mass_Chic->Draw(); g->SaveAs("m_Chic_sweighted.png"); */ }
RooWorkspace* makeInvertedANFit(TTree* tree, float forceSigma=-1, bool constrainMu=false, float forceMu=-1) { RooWorkspace *ws = new RooWorkspace("ws",""); std::vector< TString (*)(TString, RooRealVar&, RooWorkspace&) > bkgPdfList; bkgPdfList.push_back(makeSingleExp); bkgPdfList.push_back(makeDoubleExp); #if DEBUG==0 //bkgPdfList.push_back(makeTripleExp); bkgPdfList.push_back(makeModExp); bkgPdfList.push_back(makeSinglePow); bkgPdfList.push_back(makeDoublePow); bkgPdfList.push_back(makePoly2); bkgPdfList.push_back(makePoly3); #endif RooRealVar mgg("mgg","m_{#gamma#gamma}",103,160,"GeV"); mgg.setBins(38); mgg.setRange("sideband_low", 103,120); mgg.setRange("sideband_high",131,160); mgg.setRange("signal",120,131); RooRealVar MR("MR","",0,3000,"GeV"); MR.setBins(60); RooRealVar Rsq("t1Rsq","",0,1,"GeV"); Rsq.setBins(20); RooRealVar hem1_M("hem1_M","",-1,2000,"GeV"); hem1_M.setBins(40); RooRealVar hem2_M("hem2_M","",-1,2000,"GeV"); hem2_M.setBins(40); RooRealVar ptgg("ptgg","p_{T}^{#gamma#gamma}",0,500,"GeV"); ptgg.setBins(50); RooDataSet data("data","",tree,RooArgSet(mgg,MR,Rsq,hem1_M,hem2_M,ptgg)); RooDataSet* blind_data = (RooDataSet*)data.reduce("mgg<121 || mgg>130"); std::vector<TString> tags; //fit many different background models for(auto func = bkgPdfList.begin(); func != bkgPdfList.end(); func++) { TString tag = (*func)("bonly",mgg,*ws); tags.push_back(tag); ws->pdf("bonly_"+tag+"_ext")->fitTo(data,RooFit::Strategy(0),RooFit::Extended(kTRUE),RooFit::Range("sideband_low,sideband_high")); RooFitResult* bres = ws->pdf("bonly_"+tag+"_ext")->fitTo(data,RooFit::Strategy(2),RooFit::Save(kTRUE),RooFit::Extended(kTRUE),RooFit::Range("sideband_low,sideband_high")); bres->SetName(tag+"_bonly_fitres"); ws->import(*bres); //make blinded fit RooPlot *fmgg_b = mgg.frame(); blind_data->plotOn(fmgg_b,RooFit::Range("sideband_low,sideband_high")); TBox blindBox(121,fmgg_b->GetMinimum()-(fmgg_b->GetMaximum()-fmgg_b->GetMinimum())*0.015,130,fmgg_b->GetMaximum()); blindBox.SetFillColor(kGray); fmgg_b->addObject(&blindBox); ws->pdf("bonly_"+tag+"_ext")->plotOn(fmgg_b,RooFit::LineColor(kRed),RooFit::Range("Full"),RooFit::NormRange("sideband_low,sideband_high")); fmgg_b->SetName(tag+"_blinded_frame"); ws->import(*fmgg_b); delete fmgg_b; //set all the parameters constant RooArgSet* vars = ws->pdf("bonly_"+tag)->getVariables(); RooFIter iter = vars->fwdIterator(); RooAbsArg* a; while( (a = iter.next()) ){ if(string(a->GetName()).compare("mgg")==0) continue; static_cast<RooRealVar*>(a)->setConstant(kTRUE); } //make the background portion of the s+b fit (*func)("b",mgg,*ws); RooRealVar sigma(tag+"_s_sigma","",5,0,100); if(forceSigma!=-1) { sigma.setVal(forceSigma); sigma.setConstant(true); } RooRealVar mu(tag+"_s_mu","",126,120,132); if(forceMu!=-1) { mu.setVal(forceMu); mu.setConstant(true); } RooGaussian sig(tag+"_sig_model","",mgg,mu,sigma); RooRealVar Nsig(tag+"_sb_Ns","",5,0,100); RooRealVar Nbkg(tag+"_sb_Nb","",100,0,100000); RooRealVar HiggsMass("HiggsMass","",125.1); RooRealVar HiggsMassError("HiggsMassError","",0.24); RooGaussian HiggsMassConstraint("HiggsMassConstraint","",mu,HiggsMass,HiggsMassError); RooAddPdf fitModel(tag+"_sb_model","",RooArgList( *ws->pdf("b_"+tag), sig ),RooArgList(Nbkg,Nsig)); RooFitResult* sbres; RooAbsReal* nll; if(constrainMu) { fitModel.fitTo(data,RooFit::Strategy(0),RooFit::Extended(kTRUE),RooFit::ExternalConstraints(RooArgSet(HiggsMassConstraint))); sbres = fitModel.fitTo(data,RooFit::Strategy(2),RooFit::Save(kTRUE),RooFit::Extended(kTRUE),RooFit::ExternalConstraints(RooArgSet(HiggsMassConstraint))); nll = fitModel.createNLL(data,RooFit::NumCPU(4),RooFit::Extended(kTRUE),RooFit::ExternalConstraints(RooArgSet(HiggsMassConstraint))); } else { fitModel.fitTo(data,RooFit::Strategy(0),RooFit::Extended(kTRUE)); sbres = fitModel.fitTo(data,RooFit::Strategy(2),RooFit::Save(kTRUE),RooFit::Extended(kTRUE)); nll = fitModel.createNLL(data,RooFit::NumCPU(4),RooFit::Extended(kTRUE)); } sbres->SetName(tag+"_sb_fitres"); ws->import(*sbres); ws->import(fitModel); RooPlot *fmgg = mgg.frame(); data.plotOn(fmgg); fitModel.plotOn(fmgg); ws->pdf("b_"+tag+"_ext")->plotOn(fmgg,RooFit::LineColor(kRed),RooFit::Range("Full"),RooFit::NormRange("Full")); fmgg->SetName(tag+"_frame"); ws->import(*fmgg); delete fmgg; RooMinuit(*nll).migrad(); RooPlot *fNs = Nsig.frame(0,25); fNs->SetName(tag+"_Nsig_pll"); RooAbsReal *pll = nll->createProfile(Nsig); //nll->plotOn(fNs,RooFit::ShiftToZero(),RooFit::LineColor(kRed)); pll->plotOn(fNs); ws->import(*fNs); delete fNs; RooPlot *fmu = mu.frame(125,132); fmu->SetName(tag+"_mu_pll"); RooAbsReal *pll_mu = nll->createProfile(mu); pll_mu->plotOn(fmu); ws->import(*fmu); delete fmu; } RooArgSet weights("weights"); RooArgSet pdfs_bonly("pdfs_bonly"); RooArgSet pdfs_b("pdfs_b"); RooRealVar minAIC("minAIC","",1E10); //compute AIC stuff for(auto t = tags.begin(); t!=tags.end(); t++) { RooAbsPdf *p_bonly = ws->pdf("bonly_"+*t); RooAbsPdf *p_b = ws->pdf("b_"+*t); RooFitResult *sb = (RooFitResult*)ws->obj(*t+"_bonly_fitres"); RooRealVar k(*t+"_b_k","",p_bonly->getParameters(RooArgSet(mgg))->getSize()); RooRealVar nll(*t+"_b_minNll","",sb->minNll()); RooRealVar Npts(*t+"_b_N","",blind_data->sumEntries()); RooFormulaVar AIC(*t+"_b_AIC","2*@0+2*@1+2*@1*(@1+1)/(@2-@1-1)",RooArgSet(nll,k,Npts)); ws->import(AIC); if(AIC.getVal() < minAIC.getVal()) { minAIC.setVal(AIC.getVal()); } //aicExpSum+=TMath::Exp(-0.5*AIC.getVal()); //we will need this precomputed for the next step pdfs_bonly.add(*p_bonly); pdfs_b.add(*p_b); } ws->import(minAIC); //compute the AIC weight float aicExpSum=0; for(auto t = tags.begin(); t!=tags.end(); t++) { RooFormulaVar *AIC = (RooFormulaVar*)ws->obj(*t+"_b_AIC"); aicExpSum+=TMath::Exp(-0.5*(AIC->getVal()-minAIC.getVal())); //we will need this precomputed for the next step } std::cout << "aicExpSum: " << aicExpSum << std::endl; for(auto t = tags.begin(); t!=tags.end(); t++) { RooFormulaVar *AIC = (RooFormulaVar*)ws->obj(*t+"_b_AIC"); RooRealVar *AICw = new RooRealVar(*t+"_b_AICWeight","",TMath::Exp(-0.5*(AIC->getVal()-minAIC.getVal()))/aicExpSum); if( TMath::IsNaN(AICw->getVal()) ) {AICw->setVal(0);} ws->import(*AICw); std::cout << *t << ": " << AIC->getVal()-minAIC.getVal() << " " << AICw->getVal() << std::endl; weights.add(*AICw); } RooAddPdf bonly_AIC("bonly_AIC","",pdfs_bonly,weights); RooAddPdf b_AIC("b_AIC","",pdfs_b,weights); //b_AIC.fitTo(data,RooFit::Strategy(0),RooFit::Extended(kTRUE),RooFit::Range("sideband_low,sideband_high")); //RooFitResult* bres = b_AIC.fitTo(data,RooFit::Strategy(2),RooFit::Save(kTRUE),RooFit::Extended(kTRUE),RooFit::Range("sideband_low,sideband_high")); //bres->SetName("AIC_b_fitres"); //ws->import(*bres); //make blinded fit RooPlot *fmgg_b = mgg.frame(RooFit::Range("sideband_low,sideband_high")); blind_data->plotOn(fmgg_b,RooFit::Range("sideband_low,sideband_high")); TBox blindBox(121,fmgg_b->GetMinimum()-(fmgg_b->GetMaximum()-fmgg_b->GetMinimum())*0.015,130,fmgg_b->GetMaximum()); blindBox.SetFillColor(kGray); fmgg_b->addObject(&blindBox); bonly_AIC.plotOn(fmgg_b,RooFit::LineColor(kRed),RooFit::Range("Full"),RooFit::NormRange("sideband_low,sideband_high")); fmgg_b->SetName("AIC_blinded_frame"); ws->import(*fmgg_b); delete fmgg_b; #if 1 RooRealVar sigma("AIC_s_sigma","",5,0,100); if(forceSigma!=-1) { sigma.setVal(forceSigma); sigma.setConstant(true); } RooRealVar mu("AIC_s_mu","",126,120,132); if(forceMu!=-1) { mu.setVal(forceMu); mu.setConstant(true); } RooGaussian sig("AIC_sig_model","",mgg,mu,sigma); RooRealVar Nsig("AIC_sb_Ns","",5,0,100); RooRealVar Nbkg("AIC_sb_Nb","",100,0,100000); RooRealVar HiggsMass("HiggsMass","",125.1); RooRealVar HiggsMassError("HiggsMassError","",0.24); RooGaussian HiggsMassConstraint("HiggsMassConstraint","",mu,HiggsMass,HiggsMassError); RooAddPdf fitModel("AIC_sb_model","",RooArgList( b_AIC, sig ),RooArgList(Nbkg,Nsig)); RooFitResult* sbres; RooAbsReal *nll; if(constrainMu) { fitModel.fitTo(data,RooFit::Strategy(0),RooFit::Extended(kTRUE),RooFit::ExternalConstraints(RooArgSet(HiggsMassConstraint))); sbres = fitModel.fitTo(data,RooFit::Strategy(2),RooFit::Save(kTRUE),RooFit::Extended(kTRUE),RooFit::ExternalConstraints(RooArgSet(HiggsMassConstraint))); nll = fitModel.createNLL(data,RooFit::NumCPU(4),RooFit::Extended(kTRUE),RooFit::ExternalConstraints(RooArgSet(HiggsMassConstraint))); } else { fitModel.fitTo(data,RooFit::Strategy(0),RooFit::Extended(kTRUE)); sbres = fitModel.fitTo(data,RooFit::Strategy(2),RooFit::Save(kTRUE),RooFit::Extended(kTRUE)); nll = fitModel.createNLL(data,RooFit::NumCPU(4),RooFit::Extended(kTRUE)); } assert(nll!=0); sbres->SetName("AIC_sb_fitres"); ws->import(*sbres); ws->import(fitModel); RooPlot *fmgg = mgg.frame(); data.plotOn(fmgg); fitModel.plotOn(fmgg); ws->pdf("b_AIC")->plotOn(fmgg,RooFit::LineColor(kRed),RooFit::Range("Full"),RooFit::NormRange("Full")); fmgg->SetName("AIC_frame"); ws->import(*fmgg); delete fmgg; RooMinuit(*nll).migrad(); RooPlot *fNs = Nsig.frame(0,25); fNs->SetName("AIC_Nsig_pll"); RooAbsReal *pll = nll->createProfile(Nsig); //nll->plotOn(fNs,RooFit::ShiftToZero(),RooFit::LineColor(kRed)); pll->plotOn(fNs); ws->import(*fNs); delete fNs; RooPlot *fmu = mu.frame(125,132); fmu->SetName("AIC_mu_pll"); RooAbsReal *pll_mu = nll->createProfile(mu); pll_mu->plotOn(fmu); ws->import(*fmu); delete fmu; std::cout << "min AIC: " << minAIC.getVal() << std::endl; for(auto t = tags.begin(); t!=tags.end(); t++) { RooFormulaVar *AIC = (RooFormulaVar*)ws->obj(*t+"_b_AIC"); RooRealVar *AICw = ws->var(*t+"_b_AICWeight"); RooRealVar* k = ws->var(*t+"_b_k"); printf("%s & %0.0f & %0.2f & %0.2f \\\\\n",t->Data(),k->getVal(),AIC->getVal()-minAIC.getVal(),AICw->getVal()); //std::cout << k->getVal() << " " << AIC->getVal()-minAIC.getVal() << " " << AICw->getVal() << std::endl; } #endif return ws; }
int main() { bool recutdata=false; bool recutmc=false; bool remakedatasets=false; std::vector<std::string> VariablesToCompare= {"gamma_CL","nSPDHits","Bu_DIRA_OWNPV","Bu_M01"}; auto BranchesToKeepMC = ControlCuts::BranchesToKeep; for(auto branch : VariablesToCompare) { if (std::find(BranchesToKeepMC.begin(),BranchesToKeepMC.end(),branch)==std::end(BranchesToKeepMC)) { BranchesToKeepMC.push_back(std::move(branch)); } } auto BranchesToKeep = ControlCuts::BranchesToKeep; for(auto branch : VariablesToCompare) { if (std::find(BranchesToKeep.begin(),BranchesToKeep.end(),branch)==std::end(BranchesToKeep)) { BranchesToKeep.push_back(std::move(branch)); } } if(recutdata) { DataFile TwelA(std::getenv("BUKETAPDATAROOT"),Data,Twel,MagAll,buketap,"TriggerCut_SampleA"); DataFile TwelB(std::getenv("BUKETAPDATAROOT"),Data,Twel,MagAll,buketap,"TriggerCut_SampleB"); DataFile ElevA(std::getenv("BUKETAPDATAROOT"),Data,Elev,MagAll,buketap,"TriggerCut_SampleA"); DataFile ElevB(std::getenv("BUKETAPDATAROOT"),Data,Elev,MagAll,buketap,"TriggerCut_SampleB"); TreeReader* TwelReader = new TreeReader("DecayTree"); TwelReader->AddFile(TwelA); TwelReader->AddFile(TwelB); TreeReader* ElevReader = new TreeReader("DecayTree"); ElevReader->AddFile(ElevA); ElevReader->AddFile(ElevB); TwelReader->Initialize(BranchesToKeep,"names"); ElevReader->Initialize(BranchesToKeep,"names"); auto TwelMinimalFile=std::make_unique<TFile>("TwelMinimalFile.root","RECREATE"); TTree* TwelMinimalTree=TwelReader->CopyTree("gamma_CL>0.1",-1,"DecayTree"); TwelMinimalTree->Write(); auto ElevMinimalFile=std::make_unique<TFile>("ElevMinimalFile.root","RECREATE"); TTree* ElevMinimalTree=ElevReader->CopyTree("gamma_CL>0.1",-1,"DecayTree"); ElevMinimalTree->Write(); } if(recutmc) { DataFile MCTwel(std::getenv("BUKETAPMCROOT"),MC,Twel,MagAll,buketap,"TriggerCut"); DataFile MCElev(std::getenv("BUKETAPMCROOT"),MC,Elev,MagAll,buketap,"TriggerCut"); TreeReader* TwelReaderMC = new TreeReader("DecayTree"); TwelReaderMC->AddFile(MCTwel); TreeReader* ElevReaderMC = new TreeReader("DecayTree"); ElevReaderMC->AddFile(MCElev); TwelReaderMC->Initialize(BranchesToKeepMC,"names"); ElevReaderMC->Initialize(BranchesToKeepMC,"names"); auto TwelMinimalFileMC=std::make_unique<TFile>("TwelMinimalFileMC.root","RECREATE"); TTree* TwelMinimalTreeMC=TwelReaderMC->CopyTree("gamma_CL>0.1",-1,"DecayTree"); TwelMinimalTreeMC->Write(); auto ElevMinimalFileMC=std::make_unique<TFile>("ElevMinimalFileMC.root","RECREATE"); TTree* ElevMinimalTreeMC=ElevReaderMC->CopyTree("gamma_CL>0.1",-1,"DecayTree"); ElevMinimalTreeMC->Write(); } if(remakedatasets||recutmc||recutdata) { RooArgSet* MCVars= new RooArgSet("MCVars"); RooArgSet* Vars= new RooArgSet("Vars"); for(auto & Branch : BranchesToKeep) { Vars->add(*(HandyFunctions::CreateRealVar(Branch))); } for(auto & MCBranch: BranchesToKeepMC) { MCVars->add(*(HandyFunctions::CreateRealVar(MCBranch))); std::cout<<MCBranch<<std::endl; } auto TwelMinimalFile = std::make_unique<TFile>("TwelMinimalFile.root"); TTree* TwelMinimalTree=(TTree*)TwelMinimalFile->Get("DecayTree"); std::cout<<"Tree Entreies = "<<TwelMinimalTree->GetEntries()<<std::endl; RooDataSet* TwelData= new RooDataSet("TwelData","TwelData",*Vars,Import(*TwelMinimalTree)); std::cout<<"Events in Dataset= "<<TwelData->sumEntries()<<std::endl; auto ElevMinimalFile = std::make_unique<TFile>("ElevMinimalFile.root"); TTree* ElevMinimalTree=(TTree*)ElevMinimalFile->Get("DecayTree"); std::cout<<"Tree Entreies = "<<ElevMinimalTree->GetEntries()<<std::endl; RooDataSet* ElevData= new RooDataSet("ElevData","ElevData",*Vars,Import(*ElevMinimalTree)); std::cout<<"Events in Dataset= "<<ElevData->sumEntries()<<std::endl; auto TwelMinimalFileMC = std::make_unique<TFile>("TwelMinimalFileMC.root"); TTree* TwelMinimalTreeMC=(TTree*)TwelMinimalFileMC->Get("DecayTree"); std::cout<<"Tree Entreies = "<<TwelMinimalTreeMC->GetEntries()<<std::endl; RooDataSet* TwelDataMC= new RooDataSet("TwelDataMC","TwelDataMC",*Vars,Import(*TwelMinimalTreeMC)); std::cout<<"Events in Dataset= "<<TwelDataMC->sumEntries()<<std::endl; auto ElevMinimalFileMC = std::make_unique<TFile>("ElevMinimalFileMC.root"); TTree* ElevMinimalTreeMC=(TTree*)ElevMinimalFileMC->Get("DecayTree"); std::cout<<"Tree Entreies = "<<ElevMinimalTreeMC->GetEntries()<<std::endl; RooDataSet* ElevDataMC= new RooDataSet("ElevDataMC","ElevDataMC",*Vars,Import(*ElevMinimalTreeMC)); std::cout<<"Events in Dataset= "<<ElevDataMC->sumEntries()<<std::endl; TwelMinimalFile->Close(); ElevMinimalFile->Close(); TwelMinimalFileMC->Close(); ElevMinimalFileMC->Close(); auto DataSetCache=std::make_unique<TFile>("DataSetCache.root","RECREATE"); gDirectory->pwd(); TwelData->Write(); ElevData->Write(); TwelDataMC->Write(); ElevDataMC->Write(); } TFile* DataSetCache= new TFile("DataSetCache.root"); RooDataSet* Data12=SafeGetDataSet(DataSetCache,"TwelData"); RooDataSet* Data11=SafeGetDataSet(DataSetCache,"ElevData"); RooDataSet* MC12=SafeGetDataSet(DataSetCache,"TwelDataMC"); RooDataSet* MC11=SafeGetDataSet(DataSetCache,"ElevDataMC"); RooRealVar * BuMass= new RooRealVar("Bu_DTF_MF","Bu_DTF_MF",5000.0,5500.0); RooRealVar* BkgP1= new RooRealVar("BkgP1","BkgP1",-1.0,-10.0,10.0); RooRealVar* BkgP2= new RooRealVar("BkgP2","BkgP2",1.0,-10.0,10.0); RooChebychev* BkgPdf= new RooChebychev("BkgPdf","BkgPdf",*BuMass,RooArgList(*BkgP1,*BkgP2)); BkgPdf->fitTo(*Data12,Range(5000.0,5200.)); RooPlot* BFrame = BuMass->frame(Bins(50)); Data12->plotOn(BFrame); BkgPdf->plotOn(BFrame); BkgPdf->paramOn(BFrame); TCanvas C; BFrame->Draw(); C.SaveAs("BFrame.pdf"); }
void LL(){ //y0 = 0.000135096401209 sigma_y0 = 0.000103896581837 x0 = 0.000446013873443 sigma_x0 =1.81384394011e-06 //0.014108652249 0.0168368471049 0.0219755396247 0.000120423865262 1.5575931164 1.55759310722 3.41637854038 //0.072569437325 0.084063541977 0.0376693978906 0.000284216132439 0.51908074913 0.519080758095 1.12037749267 // double d = 0.014108652249; // double sd = 0.0168368471049; // double mc = 0.0219755396247; // double smc = 0.000120423865262; // double r0 = d/mc; double d = 0.072569437325; double sd = 0.084063541977; double mc = 0.0376693978906; double smc = 0.00028421613243; double r0 = d/mc; RooRealVar x("x","x",mc*0.9,mc*1.1); RooRealVar x0("x0","x0",mc); RooRealVar sx("sx","sx",smc); RooRealVar r("r","r",r0,0.,5.); RooRealVar y0("y0","y0",d); RooRealVar sy("sy","sy",sd); RooProduct rx("rx","rx",RooArgList(r,x)); RooGaussian g1("g1","g1",x,x0,sx); RooGaussian g2("g2","g2",rx,y0,sy); RooProdPdf LL("LL","LL",g1,g2); RooArgSet obs(x0,y0); //observables RooArgSet poi(r); //parameters of interest RooDataSet data("data", "data", obs); data.add(obs); //actually add the data RooFitResult* res = LL.fitTo(data,RooFit::Minos(poi),RooFit::Save(),RooFit::Hesse(false)); if(res->status()==0) { r.Print(); x.Print(); cout << r.getErrorLo() << " " << r.getErrorHi() << endl; } else { cout << "Likelihood maximization failed" << endl; } RooAbsReal* nll = LL.createNLL(data); RooPlot* frame = r.frame(); RooAbsReal* pll = nll->createProfile(poi); pll->plotOn(frame);//,RooFit::LineColor(ROOT::kRed)); frame->Draw(); r.setVal(0.); cout << pll->getVal() << endl; return; }
void fit_MC_norm(std::string input_file = "/afs/cern.ch/work/a/apmorris/private/cern/ntuples/new_tuples/normalisation_samples/reduced_Lb2JpsipK_MC_2011_2012_norm.root", std::string out_file_mass = "~/cern/plots/fitting/Lb2JpsipK_MC_2011_2012_cut_mass_fit.png"){ // gROOT->ProcessLine(".L ~/cern/scripts/lhcbStyle.C"); //lhcbStyle(); const std::string filename(input_file.c_str()); const std::string treename = "DecayTree"; TFile* file = TFile::Open( filename.c_str() ); if( !file ) std::cout << "file " << filename << " does not exist" << std::endl; TTree* tree = (TTree*)file->Get( treename.c_str() ); if( !tree ) std::cout << "tree " << treename << " does not exist" << std::endl; // -- signal, mass shape RooRealVar Lambda_b0_DTF_MASS_constr1("Lambda_b0_DTF_MASS_constr1","m(J/#psi pK^{-})", 5450., 5850., "MeV/c^{2}"); RooRealVar Jpsi_M("Jpsi_M","m(#mu#mu)", 3000., 3200., "MeV/c^{2}"); //RooRealVar chi_c_M("chi_c_M","m(J/#psi#gamma)", 3350., 3750., "MeV/c^{2}"); RooRealVar mean("mean","mean", 5620., 5595., 5650.); RooRealVar sigma1("sigma1","sigma1", 10., 1., 100.); RooRealVar sigma2("sigma2","sigma2", 100., 1., 1000.); RooRealVar alpha1("alpha1","alpha1", 1.0, 0.5, 5.0); RooRealVar n1("n1","n1", 1.8, 0.2, 15.0); RooRealVar alpha2("alpha2","alpha2", -0.5, -5.5, 0.0); RooRealVar n2("n2","n2", 0.7, 0.2, 10.0); //RooRealVar bkgcat_chic("bkgcat_chic","bkgcat_chic", 0, 100); RooGaussian gauss1("gauss1","gauss1", Lambda_b0_DTF_MASS_constr1, mean, sigma1); RooGaussian gauss2("gauss2","gauss2", Lambda_b0_DTF_MASS_constr1, mean, sigma2); RooCBShape cb1("cb1","cb1", Lambda_b0_DTF_MASS_constr1, mean, sigma1, alpha1, n1); RooCBShape cb2("cb2","cb2", Lambda_b0_DTF_MASS_constr1, mean, sigma2, alpha2, n2); /* // the chi_c2 component RooRealVar mean3("mean3","mean3", 5570., 5520., 5580.); RooRealVar sigma3("sigma3","sigma3", 10., 1., 20.); RooGaussian gauss3("gauss3","gauss3", Lambda_b0_DTF_MASS_constr1, mean3, sigma3); */ RooRealVar cbRatio("cbRatio","cbRatio", 0.8, 0.1, 1.0); RooRealVar frac2("frac2","frac2", 0.3, 0., 1.); /* alpha1.setVal( 2.1 ); alpha2.setVal( -4.9 ); n1.setVal( 3.2 ); n2.setVal( 7.9 ); cbRatio.setVal( 0.6808 ); alpha1.setConstant( true ); alpha2.setConstant( true ); cbRatio.setConstant( true ); n1.setConstant( true ); n2.setConstant( true ); */ // -- add signal & bg //RooAddPdf pdf("pdf", "pdf", RooArgList(gauss1, gauss2), RooArgList( frac2 )); RooAddPdf pdf("pdf", "pdf", RooArgList(cb1, cb2), RooArgList( cbRatio )); RooArgSet obs; obs.add(Lambda_b0_DTF_MASS_constr1); obs.add(Jpsi_M); //obs.add(chi_c_M); //obs.add(bkgcat_chic); RooDataSet ds("ds","ds", obs, RooFit::Import(*tree)); //RooFit::Cut("Lambda_b0_DTF_MASS_constr1 > 5580") RooPlot* plot = Lambda_b0_DTF_MASS_constr1.frame(); plot->SetAxisRange(5500., 5750.); pdf.fitTo( ds ); ds.plotOn( plot, RooFit::Binning(200) ); pdf.plotOn( plot ); //gauss3.plotOn( plot ); RooPlot* plotPullMass = Lambda_b0_DTF_MASS_constr1.frame(); plotPullMass->addPlotable( plot->pullHist() ); //plotPullMass->SetMinimum(); //plotPullMass->SetMaximum(); plotPullMass->SetAxisRange(5500., 5750.); TCanvas* c = new TCanvas(); c->cd(); TPad* pad1 = new TPad("pad1","pad1", 0, 0.3, 1, 1.0); pad1->SetBottomMargin(0.1); pad1->SetTopMargin(0.1); pad1->Draw(); //TPad* pad2 = new TPad("pad2","pad2", 0, 0.05, 1, 0.4); TPad* pad2 = new TPad("pad2","pad2", 0, 0, 1, 0.3); pad2->SetBottomMargin(0.1); pad2->SetTopMargin(0.0); pad2->Draw(); pdf.plotOn( plot, RooFit::Components( cb1 ), RooFit::LineColor( kRed ), RooFit::LineStyle(kDashed) ); pdf.plotOn( plot, RooFit::Components( cb2 ), RooFit::LineColor( kOrange ), RooFit::LineStyle(kDotted) ); //pdf.plotOn( plot, RooFit::Components( bgPdf ), RooFit::LineColor( kBlue ), RooFit::LineStyle(kDashDotted) ); pad1->cd(); //pad1->SetLogy(); plot->Draw(); pad2->cd(); plotPullMass->Draw("AP"); c->SaveAs(out_file_mass.c_str()); }
void closure_jetfakepho(){//main int channel = 1; // 1 = eg; 2 = mg TChain *sigtree = new TChain("signalTree"); if(channel == 1)sigtree->Add("../../../data/resTree_egsignal_2016.root"); else if(channel ==2)sigtree->Add("../../../data/resTree_mgsignal_2016.root"); TChain *controltree = new TChain("jetTree"); if(channel == 1)controltree->Add("../../../data/resTree_egsignal_2016.root"); else if(channel == 2)controltree->Add("../../../data/resTree_mgsignal_2016.root"); std::ostringstream outputname; if(channel == 1)outputname << "jet-fake-pho_egpt.root"; else if(channel == 2)outputname << "jet-fake-pho_mgpt.root"; TFile *outputfile = TFile::Open(outputname.str().c_str(),"RECREATE"); outputfile->cd(); //*********** histo list **********************// // TH1F *p_controlPhoEt = new TH1F("p_controlPhoEt","#gamma E_{T}; E_{T} (GeV)",300,35,335); // TH1F *p_sigPhoEt = new TH1F("p_sigPhoEt","#gamma E_{T}; E_{T} (GeV)",300,35,335); // TH1F *p_fakesPhoEt = new TH1F("p_fakesPhoEt","#gamma E_{T}; E_{T} (GeV)",300,35,335); // TH1F *p_elebkgPhoEt = new TH1F("p_elebkgPhoEt","#gamma E_{T}; E_{T} (GeV)",300,35,335); TH1F *p_controlPhoEt = new TH1F("p_controlPhoEt",";pt;",115,35,150); TH1F *p_sigPhoEt = new TH1F("p_sigPhoEt",";pt;",115,35,150); TH1F *p_fakesPhoEt = new TH1F("p_fakesPhoEt",";pt;",115,35,150); TH1F *p_elebkgPhoEt = new TH1F("p_elebkgPhoEt",";pt;",115,35,150); sigtree->Draw("phoEt >> p_sigPhoEt", "sigMET < 70"); controltree->Draw("phoEt >> p_controlPhoEt", "sigMET < 70"); //p_sigPhoEt->SetBinContent(115, p_sigPhoEt->GetBinContent(115) + p_sigPhoEt->GetBinContent(116)); //p_controlPhoEt->SetBinContent(115, p_controlPhoEt->GetBinContent(115) + p_controlPhoEt->GetBinContent(116)); p_sigPhoEt->Sumw2(); p_controlPhoEt->Sumw2(); //************ Proxy Tree **********************// if(channel == 1){ TChain *proxytree = new TChain("proxyTree"); proxytree->Add("../../../data/resTree_egsignal_2016.root"); float proxyphoEt(0); float proxysigMET(0); proxytree->SetBranchAddress("phoEt", &proxyphoEt); proxytree->SetBranchAddress("sigMET", &proxysigMET); for (unsigned ievt(0); ievt<proxytree->GetEntries(); ++ievt){//loop on entries proxytree->GetEntry(ievt); if(proxysigMET > 70)continue; double w_ele = 1; for(unsigned i(0); i<nelePtBins-1; i++){ if(proxyphoEt > elePtBins[i] && proxyphoEt < elePtBins[i+1])w_ele=elefakepho[i]; } if(proxyphoEt >= 120)w_ele = 0.0124176; p_elebkgPhoEt->Fill(proxyphoEt,w_ele); } p_elebkgPhoEt->Sumw2(); p_sigPhoEt->Add(p_elebkgPhoEt, -1); } for(unsigned ibin(1); ibin < p_sigPhoEt->GetSize()-1; ibin++){ double xvalue = p_sigPhoEt->GetBinCenter(ibin); double frac(0),fracerror(0); for(unsigned i(0); i<19; i++) if(xvalue >= PtBin[i] && xvalue < PtBin[i+1]){ frac = fracHad[i]; fracerror = fracHadError[i]; } if(xvalue >= 140){ frac = (fracHad[18]+fracHad[17])/2; fracerror = fracHadError[18];} double binvalue = p_sigPhoEt->GetBinContent(ibin)*frac; double binerror = p_sigPhoEt->GetBinError(ibin); if(binvalue == 0)continue; double totalerror = sqrt(binvalue*binvalue*fracerror*fracerror + binerror*binerror*frac*frac); p_fakesPhoEt->SetBinContent(ibin, binvalue); p_fakesPhoEt->SetBinError(ibin, binerror); } outputfile->Write(); Double_t plotPtBins[]={35,40,45,50,55,60,65,70,75,80,85,90,100,110,120,130,140,160,200}; gStyle->SetOptStat(0); TCanvas *c_pt = new TCanvas("Photon_Pt", "Photon P_{T}",800,800); c_pt->cd(); TPad *pad1 = new TPad("pad1", "pad1", 0, 0.3, 1, 1.0); pad1->SetBottomMargin(0.1); pad1->Draw(); pad1->cd(); gPad->SetLogy(); TH1 *new_controlPhoEt = p_controlPhoEt->Rebin(5); TH1 *new_fakesPhoEt = p_fakesPhoEt->Rebin(5); new_controlPhoEt->GetXaxis()->SetRangeUser(35,150); new_fakesPhoEt->GetXaxis()->SetRangeUser(35,150); new_controlPhoEt->Draw("EP"); new_controlPhoEt->SetLineColor(kBlack); new_controlPhoEt->SetMarkerStyle(20); new_fakesPhoEt->SetLineColor(kRed); new_fakesPhoEt->SetMarkerStyle(20); new_fakesPhoEt->SetMarkerColor(kRed); new_fakesPhoEt->Draw("EP same"); TLegend *leg = new TLegend(0.6,0.7,0.9,0.9); leg->SetFillStyle(0); gStyle->SetLegendBorderSize(1); gStyle->SetLegendFillColor(0); leg->AddEntry(new_controlPhoEt,"hadron proxies"); leg->AddEntry(new_fakesPhoEt,"fake photons"); leg->Draw("same"); TF1 *fitfunc_num = new TF1("fitfunc_num","expo(0)+expo(3)",35,150); TF1 *fitfunc_den = new TF1("fitfunc_den","expo(0)+expo(3)",35,150); c_pt->cd(); TPad *pad2 = new TPad("pad2", "pad2", 0, 0.05, 1, 0.25); pad2->Draw(); pad2->cd(); TH1F *ratio=(TH1F*)new_fakesPhoEt->Clone("transfer factor"); ratio->Divide(new_controlPhoEt); ratio->SetTitle(""); ratio->GetYaxis()->SetTitle("proxies/fake"); ratio->GetXaxis()->SetLabelFont(63); ratio->GetXaxis()->SetLabelSize(14); ratio->GetYaxis()->SetLabelFont(63); ratio->GetYaxis()->SetLabelSize(14); ratio->Draw(); RooRealVar pt("pt","",35,150); //pt.setBins(33); new_controlPhoEt->SetMaximum(new_controlPhoEt->GetEntries()); new_fakesPhoEt->SetMaximum(new_fakesPhoEt->GetEntries()); RooDataHist* hist_den = new RooDataHist("hist_den","hist_den",pt,new_controlPhoEt); RooDataHist* hist_num = new RooDataHist("hist_num","hist_num",pt,new_fakesPhoEt); RooHistPdf* pdf_den = new RooHistPdf("pdf_den","pdf_den", pt, *hist_den); RooHistPdf* pdf_num = new RooHistPdf("pdf_num","pdf_num", pt, *hist_num); RooRealVar coeff1_den("coeff1_den","coeff1", 1, -15, 10*new_controlPhoEt->GetEntries()); RooRealVar coeff2_den("coeff2_den","coeff2", 1, -15, 10*new_controlPhoEt->GetEntries()); RooRealVar lambda1_den("lambda1_den","lambda1", 0.02, -1, 1); RooRealVar lambda2_den("lambda2_den","lambda2", 0.02, -1, 1); RooExponential expo1_den("expo1_den", "exponential PDF", pt, lambda1_den); RooExponential expo2_den("expo2_den", "exponential PDF", pt, lambda2_den); RooAddPdf model_den("model_den","",RooArgList(expo1_den, expo2_den),RooArgList(coeff1_den, coeff2_den)); RooRealVar coeff1_num("coeff1_num","coeff1", 1, -15, 10*new_fakesPhoEt->GetEntries()); RooRealVar coeff2_num("coeff2_num","coeff2", 1, -15, 10*new_fakesPhoEt->GetEntries()); RooRealVar lambda1_num("lambda1_num","lambda1", 0.02, -1, 1); RooRealVar lambda2_num("lambda2_num","lambda2", 0.02, -1, 1); RooExponential expo1_num("expo1_num", "exponential PDF", pt, lambda1_num); RooExponential expo2_num("expo2_num", "exponential PDF", pt, lambda2_num); RooAddPdf model_num("model_num","",RooArgList(expo1_num, expo2_num),RooArgList(coeff1_num, coeff2_num)); //RooMCStudy* mcstudy_den = new RooMCStudy(*pdf_den,pt,RooFit::FitModel(model_den),RooFit::Binned(kTRUE),RooFit::Silence(),RooFit::Extended(), // RooFit::FitOptions(RooFit::Save(kTRUE),RooFit::PrintEvalErrors(0))); //RooMCStudy* mcstudy_num = new RooMCStudy(*pdf_num,pt,RooFit::FitModel(model_num),RooFit::Binned(kTRUE),RooFit::Silence(),RooFit::Extended(), // RooFit::FitOptions(RooFit::Save(kTRUE),RooFit::PrintEvalErrors(0))); //RooChi2MCSModule chi2mod_den; //RooChi2MCSModule chi2mod_num; //mcstudy_den->addModule(chi2mod_den); //mcstudy_num->addModule(chi2mod_num); //mcstudy_den->generateAndFit(1000,new_controlPhoEt->GetEntries()); //mcstudy_num->generateAndFit(1000,new_fakesPhoEt->GetEntries()); //TH1* chi2_den = mcstudy_den->fitParDataSet().createHistogram("chi2"); //TH1* prob_den = mcstudy_den->fitParDataSet().createHistogram("prob"); //TH1* chi2_num = mcstudy_num->fitParDataSet().createHistogram("chi2"); //TH1* prob_num = mcstudy_num->fitParDataSet().createHistogram("prob"); //TH1* result_den = mcstudy_den->fitParDataSet().createHistogram("hh"); //TH1* result_den = mcstudy_den->fitResult(0)->correlationHist("c000") ; //chi2_num->SetLineColor(kRed) ; //prob_num->SetLineColor(kRed) ; TCanvas* mccan = new TCanvas("mccan","mccan",800,400) ; mccan->Divide(2) ; //mccan->cd(1) ; gPad->SetLeftMargin(0.15) ; chi2_den->GetYaxis()->SetTitleOffset(1.4) ; chi2_den->Draw() ; chi2_num->Draw("esame") ; //mccan->cd(2) ; gPad->SetLeftMargin(0.15) ; prob_den->GetYaxis()->SetTitleOffset(1.4) ; prob_den->Draw() ; prob_num->Draw("esame") ; RooPlot* den_frame = pt.frame(RooFit::Title("jet proxies")); RooPlot* num_frame = pt.frame(RooFit::Title("candidate photon X hadron factor")); mccan->cd(1); gPad->SetLogy(); den_frame->SetMaximum(new_controlPhoEt->GetEntries()); RooFitResult* reden = model_den.fitTo(*hist_den,RooFit::SumW2Error(kTRUE),RooFit::Save()); hist_den->plotOn(den_frame); model_den.plotOn(den_frame, RooFit::FillColor(kBlue-4)); den_frame->Draw(); mccan->cd(2); gPad->SetLogy(); num_frame->SetMaximum(10000); num_frame->SetMinimum(10); RooFitResult* renum = model_num.fitTo(*hist_num,RooFit::SumW2Error(kTRUE),RooFit::Save()); hist_num->plotOn(num_frame); model_num.plotOn(num_frame, RooFit::FillColor(kBlue-4)); num_frame->Draw(); pt.setRange("signal",35,150); RooAbsReal* igx_den1 = expo1_den.createIntegral(pt,RooFit::Range("signal")); RooAbsReal* igx_den2 = expo2_den.createIntegral(pt,RooFit::Range("signal")); RooAbsReal* igx_num1 = expo1_num.createIntegral(pt,RooFit::Range("signal")); RooAbsReal* igx_num2 = expo2_num.createIntegral(pt,RooFit::Range("signal")); std::cout << "inte den1=" << igx_den1->getVal() << " den2=" << igx_den2->getVal() << " num1=" << igx_num1->getVal() << " num2=" << igx_num2->getVal() << std::endl; std::cout << "totalden=" << new_controlPhoEt->GetEntries() << std::endl; fitfunc_den->SetParameter(1,lambda1_den.getVal()); fitfunc_den->SetParameter(3,lambda2_den.getVal()); fitfunc_num->SetParameter(1,lambda1_num.getVal()); fitfunc_num->SetParameter(3,lambda2_num.getVal()); new_fakesPhoEt->Fit("fitfunc_num"); new_controlPhoEt->Fit("fitfunc_den"); c_pt->cd(); pad1->cd(); fitfunc_den->Draw("same"); fitfunc_num->Draw("same"); if(channel == 1)c_pt->SaveAs("JetFake_ratio_eg.pdf"); else if(channel == 2)c_pt->SaveAs("JetFake_ratio_mg.pdf"); // NO. NAME VALUE ERROR SIZE DERIVATIVE // 1 p0 9.73181e+00 2.26898e-01 2.78046e-05 9.10547e-03 // 2 p1 -3.34186e-02 1.55081e-03 4.43967e-07 7.43686e-01 // 3 p3 9.55643e+00 2.70401e-01 3.31514e-05 7.64064e-03 // 4 p4 -3.34188e-02 1.82847e-03 5.28578e-07 5.89368e-01 //FCN=95.1209 FROM MIGRAD STATUS=CONVERGED 253 CALLS 254 TOTAL // EDM=2.21358e-08 STRATEGY= 1 ERROR MATRIX ACCURATE // EXT PARAMETER STEP FIRST // NO. NAME VALUE ERROR SIZE DERIVATIVE // 1 p0 2.27259e+00 1.40250e+00 3.06094e-04 -1.34231e-05 // 2 p1 2.05848e-02 9.68368e-03 2.22428e-06 -1.31028e-02 // 3 p3 1.24698e+01 9.85422e-03 9.76944e-06 -3.21533e-02 // 4 p4 -4.47018e-02 2.05076e-04 1.63128e-07 -1.91568e+00 mccan->SaveAs("JetFake_ptfitting.pdf"); for(unsigned i(0); i< 23; i++){ Double_t bincenter = i*5.0+2.5; std::cout << "bin" << i << " " << ratio->GetBinContent(i) << " predict = " << fitfunc_num->Eval(bincenter)/fitfunc_den->Eval(bincenter) << std::endl; } }
void FitterUtilsSimultaneousExpOfPolyTimesX::fit(bool wantplot, bool constPartReco, double fracPartReco_const, ofstream& out, TTree* t, bool update, string plotsfile) { //***************Get the PDFs from the workspace TFile fw(workspacename.c_str()); RooWorkspace* workspace = (RooWorkspace*)fw.Get("workspace"); RooRealVar *B_plus_M = workspace->var("B_plus_M"); RooRealVar *misPT = workspace->var("misPT"); RooRealVar *l1Kee = workspace->var("l1Kee"); RooRealVar *l2Kee = workspace->var("l2Kee"); RooRealVar *l3Kee = workspace->var("l3Kee"); RooRealVar *l4Kee = workspace->var("l4Kee"); RooRealVar *l5Kee = workspace->var("l5Kee"); RooRealVar *l1KeeGen = workspace->var("l1KeeGen"); RooRealVar *l2KeeGen = workspace->var("l2KeeGen"); RooRealVar *l3KeeGen = workspace->var("l3KeeGen"); RooRealVar *l4KeeGen = workspace->var("l4KeeGen"); RooRealVar *l5KeeGen = workspace->var("l5KeeGen"); RooRealVar *fractionalErrorJpsiLeak = workspace->var("fractionalErrorJpsiLeak"); RooRealVar l1Kemu(*l1Kee); l1Kemu.SetName("l1Kemu"); l1Kemu.SetTitle("l1Kemu"); RooRealVar l2Kemu(*l2Kee); l2Kemu.SetName("l2Kemu"); l2Kemu.SetTitle("l2Kemu"); RooRealVar l3Kemu(*l3Kee); l3Kemu.SetName("l3Kemu"); l3Kemu.SetTitle("l3Kemu"); RooRealVar l4Kemu(*l4Kee); l4Kemu.SetName("l4Kemu"); l4Kemu.SetTitle("l4Kemu"); RooRealVar l5Kemu(*l5Kee); l5Kemu.SetName("l5Kemu"); l5Kemu.SetTitle("l5Kemu"); RooHistPdf *histPdfSignalZeroGamma = (RooHistPdf *) workspace->pdf("histPdfSignalZeroGamma"); RooHistPdf *histPdfSignalOneGamma = (RooHistPdf *) workspace->pdf("histPdfSignalOneGamma"); RooHistPdf *histPdfSignalTwoGamma = (RooHistPdf *) workspace->pdf("histPdfSignalTwoGamma"); RooHistPdf *histPdfPartReco = (RooHistPdf *) workspace->pdf("histPdfPartReco"); RooHistPdf *histPdfJpsiLeak(0); if(nGenJpsiLeak>0) histPdfJpsiLeak = (RooHistPdf *) workspace->pdf("histPdfJpsiLeak"); //Here set in the Kemu PDF the parameters that have to be shared RooExpOfPolyTimesX* combPDF = new RooExpOfPolyTimesX("combPDF", "combPDF", *B_plus_M, *misPT, *l1Kee, *l2Kee, *l3Kee, *l4Kee, *l5Kee); RooExpOfPolyTimesX* KemuPDF = new RooExpOfPolyTimesX("kemuPDF", "kemuPDF", *B_plus_M, *misPT, l1Kemu, *l2Kee, *l3Kee, *l4Kee, *l5Kee); RooWorkspace* workspaceGen = (RooWorkspace*)fw.Get("workspaceGen"); RooDataSet* dataGenSignalZeroGamma = (RooDataSet*)workspaceGen->data("dataGenSignalZeroGamma"); RooDataSet* dataGenSignalOneGamma = (RooDataSet*)workspaceGen->data("dataGenSignalOneGamma"); RooDataSet* dataGenSignalTwoGamma = (RooDataSet*)workspaceGen->data("dataGenSignalTwoGamma"); RooDataSet* dataGenPartReco = (RooDataSet*)workspaceGen->data("dataGenPartReco"); RooDataSet* dataGenComb = (RooDataSet*)workspaceGen->data("dataGenComb"); RooDataSet* dataGenKemu = (RooDataSet*)workspaceGen->data("dataGenKemu"); RooDataSet* dataGenJpsiLeak(0); if(nGenJpsiLeak>0) dataGenJpsiLeak = (RooDataSet*)workspaceGen->data("dataGenJpsiLeak"); if(wantplot) { //**************Must get the datasets RooDataSet* dataSetSignalZeroGamma = (RooDataSet*)workspace->data("dataSetSignalZeroGamma"); RooDataSet* dataSetSignalOneGamma = (RooDataSet*)workspace->data("dataSetSignalOneGamma"); RooDataSet* dataSetSignalTwoGamma = (RooDataSet*)workspace->data("dataSetSignalTwoGamma"); RooDataSet* dataSetPartReco = (RooDataSet*)workspace->data("dataSetPartReco"); RooDataSet* dataSetComb = (RooDataSet*)workspace->data("dataSetComb"); RooDataSet* dataSetJpsiLeak = (RooDataSet*)workspace->data("dataSetJpsiLeak"); //**************Plot all the different components cout<<"dataGenSignalZeroGamma: "<<dataGenSignalZeroGamma<<endl; PlotShape(*dataSetSignalZeroGamma, *dataGenSignalZeroGamma, *histPdfSignalZeroGamma, plotsfile, "cSignalZeroGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalOneGamma, *dataGenSignalOneGamma, *histPdfSignalOneGamma, plotsfile, "cSignalOneGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalTwoGamma, *dataGenSignalTwoGamma, *histPdfSignalTwoGamma, plotsfile, "cSignalTwoGamma", *B_plus_M, *misPT); PlotShape(*dataSetPartReco, *dataGenPartReco, *histPdfPartReco, plotsfile, "cPartReco", *B_plus_M, *misPT); PlotShape(*dataSetComb, *dataGenComb, *combPDF, plotsfile, "cComb", *B_plus_M, *misPT); if(nGenJpsiLeak>1) PlotShape(*dataSetJpsiLeak, *dataGenJpsiLeak, *histPdfJpsiLeak, plotsfile, "cJpsiLeak", *B_plus_M, *misPT); } //***************Merge datasets RooDataSet* dataGenTot(dataGenPartReco); dataGenTot->append(*dataGenSignalZeroGamma); dataGenTot->append(*dataGenSignalOneGamma); dataGenTot->append(*dataGenSignalTwoGamma); dataGenTot->append(*dataGenComb); if(nGenJpsiLeak>0) dataGenTot->append(*dataGenJpsiLeak); //**************Create index category and join samples RooCategory category("category", "category"); category.defineType("Kee"); category.defineType("Kemu"); RooDataSet dataGenSimultaneous("dataGenSimultaneous", "dataGenSimultaneous", RooArgSet(*B_plus_M, *misPT), Index(category), Import("Kee", *dataGenTot), Import("Kemu", *dataGenKemu)); //**************Prepare fitting function RooRealVar nSignal("nSignal", "#signal events", 1.*nGenSignal, nGenSignal-7*sqrt(nGenSignal), nGenSignal+7*sqrt(nGenSignal)); RooRealVar nPartReco("nPartReco", "#nPartReco", 1.*nGenPartReco, nGenPartReco-7*sqrt(nGenPartReco), nGenPartReco+7*sqrt(nGenPartReco)); RooRealVar nComb("nComb", "#nComb", 1.*nGenComb, nGenComb-7*sqrt(nGenComb), nGenComb+7*sqrt(nGenComb)); RooRealVar nKemu("nKemu", "#nKemu", 1.*nGenKemu, nGenKemu-7*sqrt(nGenKemu), nGenKemu+7*sqrt(nGenKemu)); RooRealVar nJpsiLeak("nJpsiLeak", "#nJpsiLeak", 1.*nGenJpsiLeak, nGenJpsiLeak-7*sqrt(nGenJpsiLeak), nGenJpsiLeak+7*sqrt(nGenJpsiLeak)); RooRealVar fracZero("fracZero", "fracZero",0.5,0,1); RooRealVar fracOne("fracOne", "fracOne",0.5, 0,1); RooFormulaVar fracPartReco("fracPartReco", "nPartReco/nSignal", RooArgList(nPartReco,nSignal)); RooFormulaVar fracOneRec("fracOneRec", "(1-fracZero)*fracOne", RooArgList(fracZero, fracOne)); RooAddPdf histPdfSignal("histPdfSignal", "histPdfSignal", RooArgList(*histPdfSignalZeroGamma, *histPdfSignalOneGamma, *histPdfSignalTwoGamma), RooArgList(fracZero, fracOneRec)); RooArgList pdfList(histPdfSignal, *histPdfPartReco, *combPDF); RooArgList yieldList(nSignal, nPartReco, nComb); if(nGenJpsiLeak>0) { pdfList.add(*histPdfJpsiLeak); yieldList.add(nJpsiLeak); } RooAddPdf totPdf("totPdf", "totPdf", pdfList, yieldList); RooExtendPdf totKemuPdf("totKemuPdf", "totKemuPdf", *KemuPDF, nKemu); //**************** Prepare simultaneous PDF RooSimultaneous simPdf("simPdf", "simPdf", category); simPdf.addPdf(totPdf, "Kee"); simPdf.addPdf(totKemuPdf, "Kemu"); //**************** Constrain the fraction of zero and one photon int nGenSignalZeroGamma(floor(nGenFracZeroGamma*nGenSignal)); int nGenSignalOneGamma(floor(nGenFracOneGamma*nGenSignal)); int nGenSignalTwoGamma(floor(nGenSignal-nGenSignalZeroGamma-nGenSignalOneGamma)); RooRealVar fracZeroConstMean("fracZeroConstMean", "fracZeroConstMean", nGenSignalZeroGamma*1./nGenSignal); RooRealVar fracZeroConstSigma("fracZeroConstSigma", "fracZeroConstSigma", sqrt(nGenSignalZeroGamma)/nGenSignal); RooGaussian fracZeroConst("fracZeroConst", "fracZeroConst", fracZero, fracZeroConstMean, fracZeroConstSigma); RooRealVar fracOneConstMean("fracOneConstMean", "fracOneConstMean", nGenSignalOneGamma*1./nGenSignal/(1-fracZeroConstMean.getVal())); RooRealVar fracOneConstSigma("fracOneConstSigma", "fracOneConstSigma", sqrt(nGenSignalOneGamma)/nGenSignal/(1-fracZeroConstMean.getVal())); RooGaussian fracOneConst("fracOneConst", "fracOneConst", fracOne, fracOneConstMean, fracOneConstSigma); RooRealVar fracPartRecoMean("fracPartRecoMean", "fracPartRecoMean", nGenPartReco/(1.*nGenSignal)); RooRealVar fracPartRecoSigma("fracPartRecoSigma", "fracPartRecoSigma", fracPartReco_const*fracPartRecoMean.getVal()); RooGaussian fracPartRecoConst("fracPartRecoConst", "fracPartRecoConst", fracPartReco, fracPartRecoMean, fracPartRecoSigma); RooRealVar JpsiLeakMean("JpsiLeakMean", "JpsiLeakMean", nGenJpsiLeak); RooRealVar JpsiLeakSigma("JpsiLeakSigma", "JpsiLeakSigma", nGenJpsiLeak*fractionalErrorJpsiLeak->getVal()); RooGaussian JpsiLeakConst("JpsiLeakConst", "JpsiLeakConst", nJpsiLeak, JpsiLeakMean, JpsiLeakSigma); //**************** fit RooAbsReal::defaultIntegratorConfig()->setEpsAbs(1e-8) ; RooAbsReal::defaultIntegratorConfig()->setEpsRel(1e-8) ; initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, nKemu, nSignal, nPartReco, nComb, fracZero, fracOne, nJpsiLeak, constPartReco, fracPartRecoSigma, *l1Kee, *l2Kee, *l3Kee, *l4Kee, *l5Kee, l1Kemu, l2Kemu, l3Kemu, l4Kemu, l5Kemu, *l1KeeGen, *l2KeeGen, *l3KeeGen, *l4KeeGen, *l5KeeGen); RooArgSet constraints(fracZeroConst, fracOneConst); if (constPartReco) constraints.add(fracPartRecoConst); if(nGenJpsiLeak>0) constraints.add(JpsiLeakConst); RooAbsReal* nll = simPdf.createNLL(dataGenSimultaneous, Extended(), ExternalConstraints(constraints)); RooMinuit minuit(*nll); minuit.setStrategy(2); int migradRes(1); int hesseRes(4); vector<int> migradResVec; vector<int> hesseResVec; double edm(10); int nrefit(0); RooFitResult* fitRes(0); vector<RooFitResult*> fitResVec; bool hasConverged(false); for(int i(0); (i<15) && !hasConverged ; ++i) { initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, nKemu, nSignal, nPartReco, nComb, fracZero, fracOne, nJpsiLeak, constPartReco, fracPartRecoSigma, *l1Kee, *l2Kee, *l3Kee, *l4Kee, *l5Kee, l1Kemu, l2Kemu, l3Kemu, l4Kemu, l5Kemu, *l1KeeGen, *l2KeeGen, *l3KeeGen, *l4KeeGen, *l5KeeGen); cout<<"FITTING: starting with nsignal = "<<nSignal.getValV()<<" refit nbr. "<<i<<endl; //if(fitRes != NULL && fitRes != 0) delete fitRes; migradRes = minuit.migrad(); hesseRes = minuit.hesse(); fitRes = minuit.save(); edm = fitRes->edm(); fitResVec.push_back(fitRes); migradResVec.push_back(migradRes); hesseResVec.push_back(hesseRes); if( migradRes == 0 && hesseRes == 0 && edm < 1e-3 ) hasConverged = true; ++nrefit; cout<<"Fitting nbr "<<i<<" done. Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } if(!hasConverged) { double minNll(1e20); int minIndex(-1); for(unsigned int i(0); i<fitResVec.size(); ++i) { if( fitResVec.at(i)->minNll() < minNll) { minIndex = i; minNll = fitResVec[i]->minNll(); } } migradRes = migradResVec.at(minIndex); hesseRes = hesseResVec.at(minIndex); cout<<"Fit not converged, choose fit "<<minIndex<<". Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } fillTreeResult(t, fitRes, update, migradRes, hesseRes, hasConverged); for(unsigned int i(0); i<fitResVec.size(); ++i) delete fitResVec.at(i); //totPdf.fitTo(*dataGenTot, Extended(), Save(), Warnings(false)); //*************** output fit status int w(12); out<<setw(w)<<migradRes<<setw(w)<<hesseRes<<setw(w)<<edm<<setw(w)<<nrefit<<endl; if(wantplot) plot_fit_result(plotsfile, totPdf, *dataGenTot); if(wantplot) plot_kemu_fit_result(plotsfile, totKemuPdf, *dataGenKemu); fw.Close(); //delete and return delete nll; delete workspace; delete workspaceGen; delete combPDF; delete KemuPDF; }
void logStatistics(std::ostream& out, RooDataSet *dataSet, RooRealVar *realVar, int nBins) { logStatisticsPar(out, dataSet, realVar, nBins, -1.0, RooArgList()); }
void FitterUtilsSimultaneousExpOfPolyTimesX::generate(bool wantPlots, string plotsfile) { FitterUtilsExpOfPolyTimesX::generate(wantPlots, plotsfile); TFile fw(workspacename.c_str(), "UPDATE"); RooWorkspace* workspace = (RooWorkspace*)fw.Get("workspace"); RooRealVar *B_plus_M = workspace->var("B_plus_M"); RooRealVar *misPT = workspace->var("misPT"); RooDataSet* dataSetCombExt = (RooDataSet*)workspace->data("dataSetCombExt"); RooDataSet* dataSetComb = (RooDataSet*)workspace->data("dataSetComb"); // RooRealVar *l1KeeGen = workspace->var("l1KeeGen"); // RooRealVar *l2KeeGen = workspace->var("l2KeeGen"); // RooRealVar *l3KeeGen = workspace->var("l3KeeGen"); // RooRealVar *l4KeeGen = workspace->var("l4KeeGen"); // RooRealVar *l5KeeGen = workspace->var("l5KeeGen"); // // // RooExpOfPolyTimesX kemuPDF("kemuPDF", "kemuPDF", *B_plus_M, *misPT, *l1KeeGen, *l2KeeGen, *l3KeeGen, *l4KeeGen, *l5KeeGen); // // RooAbsPdf::GenSpec* GenSpecKemu = kemuPDF.prepareMultiGen(RooArgSet(*B_plus_M, *misPT), RooFit::Extended(1), NumEvents(nGenKemu)); // // cout<<"Generating Kemu"<<endl; // RooDataSet* dataGenKemu = kemuPDF.generate(*GenSpecKemu);//(argset, 100, false, true, "", false, true); // dataGenKemu->SetName("dataGenKemu"); dataGenKemu->SetTitle("dataGenKemu"); // // // RooWorkspace* workspaceGen = (RooWorkspace*)fw.Get("workspaceGen"); // workspaceGen->import(*dataGenKemu); // // workspaceGen->Write("", TObject::kOverwrite); // fw.Close(); // delete dataGenKemu; // delete GenSpecKemu; TVectorD rho(2); rho[0] = 2.5; rho[1] = 1.5; misPT->setRange(-2000, 5000); RooNDKeysPdf kemuPDF("kemuPDF", "kemuPDF", RooArgList(*B_plus_M, *misPT), *dataSetCombExt, rho, "ma",3, true); misPT->setRange(0, 5000); RooAbsPdf::GenSpec* GenSpecKemu = kemuPDF.prepareMultiGen(RooArgSet(*B_plus_M, *misPT), RooFit::Extended(1), NumEvents(nGenKemu)); cout<<"Generating Kemu"<<endl; RooDataSet* dataGenKemu = kemuPDF.generate(*GenSpecKemu);//(argset, 100, false, true, "", false, true); dataGenKemu->SetName("dataGenKemu"); dataGenKemu->SetTitle("dataGenKemu"); RooWorkspace* workspaceGen = (RooWorkspace*)fw.Get("workspaceGen"); workspaceGen->import(*dataGenKemu); if(wantPlots) PlotShape(*dataSetComb, *dataGenKemu, kemuPDF, plotsfile, "cKemuKeys", *B_plus_M, *misPT); fw.cd(); workspaceGen->Write("", TObject::kOverwrite); fw.Close(); delete dataGenKemu; delete GenSpecKemu; }
int KinZfitter::PerZ1Likelihood(double & l1, double & l2, double & lph1, double & lph2) { l1= 1.0; l2 = 1.0; lph1 = 1.0; lph2 = 1.0; if(debug_) cout<<"start Z1 refit"<<endl; TLorentzVector Z1_1 = p4sZ1_[0]; TLorentzVector Z1_2 = p4sZ1_[1]; double RECOpT1 = Z1_1.Pt(); double RECOpT2 = Z1_2.Pt(); double pTerrZ1_1 = pTerrsZ1_[0]; double pTerrZ1_2 = pTerrsZ1_[1]; if(debug_)cout<<"pT1 "<<RECOpT1<<" pTerrZ1_1 "<<pTerrZ1_1<<endl; if(debug_)cout<<"pT2 "<<RECOpT2<<" pTerrZ1_2 "<<pTerrZ1_2<<endl; ////////////// TLorentzVector Z1_ph1, Z1_ph2; double pTerrZ1_ph1, pTerrZ1_ph2; double RECOpTph1, RECOpTph2; TLorentzVector nullFourVector(0, 0, 0, 0); Z1_ph1=nullFourVector; Z1_ph2=nullFourVector; RECOpTph1 = 0; RECOpTph2 = 0; pTerrZ1_ph1 = 0; pTerrZ1_ph2 = 0; if(p4sZ1ph_.size()>=1){ Z1_ph1 = p4sZ1ph_[0]; pTerrZ1_ph1 = pTerrsZ1ph_[0]; RECOpTph1 = Z1_ph1.Pt(); if(debug_) cout<<"put in Z1 fsr photon 1 pT "<<RECOpTph1<<" pT err "<<pTerrZ1_ph1<<endl; } if(p4sZ1ph_.size()==2){ //if(debug_) cout<<"put in Z1 fsr photon 2"<<endl; Z1_ph2 = p4sZ1ph_[1]; pTerrZ1_ph2 = pTerrsZ1ph_[1]; RECOpTph2 = Z1_ph2.Pt(); } RooRealVar* pT1RECO = new RooRealVar("pT1RECO","pT1RECO", RECOpT1, 5, 500); RooRealVar* pT2RECO = new RooRealVar("pT2RECO","pT2RECO", RECOpT2, 5, 500); double RECOpT1min = max(5.0, RECOpT1-2*pTerrZ1_1); double RECOpT2min = max(5.0, RECOpT2-2*pTerrZ1_2); RooRealVar* pTph1RECO = new RooRealVar("pTph1RECO","pTph1RECO", RECOpTph1, 5, 500); RooRealVar* pTph2RECO = new RooRealVar("pTph2RECO","pTph2RECO", RECOpTph2, 5, 500); double RECOpTph1min = max(0.5, RECOpTph1-2*pTerrZ1_ph1); double RECOpTph2min = max(0.5, RECOpTph2-2*pTerrZ1_ph2); // observables pT1,2,ph1,ph2 RooRealVar* pT1 = new RooRealVar("pT1", "pT1FIT", RECOpT1, RECOpT1min, RECOpT1+2*pTerrZ1_1 ); RooRealVar* pT2 = new RooRealVar("pT2", "pT2FIT", RECOpT2, RECOpT2min, RECOpT2+2*pTerrZ1_2 ); RooRealVar* m1 = new RooRealVar("m1","m1", Z1_1.M()); RooRealVar* m2 = new RooRealVar("m2","m2", Z1_2.M()); if(debug_) cout<<"m1 "<<m1->getVal()<<" m2 "<<m2->getVal()<<endl; double Vtheta1, Vphi1, Vtheta2, Vphi2; Vtheta1 = (Z1_1).Theta(); Vtheta2 = (Z1_2).Theta(); Vphi1 = (Z1_1).Phi(); Vphi2 = (Z1_2).Phi(); RooRealVar* theta1 = new RooRealVar("theta1","theta1",Vtheta1); RooRealVar* phi1 = new RooRealVar("phi1","phi1",Vphi1); RooRealVar* theta2 = new RooRealVar("theta2","theta2",Vtheta2); RooRealVar* phi2 = new RooRealVar("phi2","phi2",Vphi2); // dot product to calculate (p1+p2+ph1+ph2).M() RooFormulaVar E1("E1","TMath::Sqrt((@0*@0)/((TMath::Sin(@1))*(TMath::Sin(@1)))+@2*@2)", RooArgList(*pT1,*theta1,*m1)); RooFormulaVar E2("E2","TMath::Sqrt((@0*@0)/((TMath::Sin(@1))*(TMath::Sin(@1)))+@2*@2)", RooArgList(*pT2,*theta2,*m2)); if(debug_) cout<<"E1 "<<E1.getVal()<<"; E2 "<<E2.getVal()<<endl; ///// RooRealVar* pTph1 = new RooRealVar("pTph1", "pTph1FIT", RECOpTph1, RECOpTph1min, RECOpTph1+2*pTerrZ1_ph1 ); RooRealVar* pTph2 = new RooRealVar("pTph2", "pTph2FIT", RECOpTph2, RECOpTph2min, RECOpTph2+2*pTerrZ1_ph2 ); double Vthetaph1, Vphiph1, Vthetaph2, Vphiph2; Vthetaph1 = (Z1_ph1).Theta(); Vthetaph2 = (Z1_ph2).Theta(); Vphiph1 = (Z1_ph1).Phi(); Vphiph2 = (Z1_ph2).Phi(); RooRealVar* thetaph1 = new RooRealVar("thetaph1","thetaph1",Vthetaph1); RooRealVar* phiph1 = new RooRealVar("phiph1","phiph1",Vphiph1); RooRealVar* thetaph2 = new RooRealVar("thetaph2","thetaph2",Vthetaph2); RooRealVar* phiph2 = new RooRealVar("phiph2","phi2",Vphiph2); RooFormulaVar Eph1("Eph1","TMath::Sqrt((@0*@0)/((TMath::Sin(@1))*(TMath::Sin(@1))))", RooArgList(*pTph1,*thetaph1)); RooFormulaVar Eph2("Eph2","TMath::Sqrt((@0*@0)/((TMath::Sin(@1))*(TMath::Sin(@1))))", RooArgList(*pTph2,*thetaph2)); //// dot products of 4-vectors // 3-vector DOT RooFormulaVar* p1v3D2 = new RooFormulaVar("p1v3D2", "@0*@1*( ((TMath::Cos(@2))*(TMath::Cos(@3)))/((TMath::Sin(@2))*(TMath::Sin(@3)))+(TMath::Cos(@4-@5)))", RooArgList(*pT1,*pT2,*theta1,*theta2,*phi1,*phi2)); if(debug_) cout<<"p1 DOT p2 is "<<p1v3D2->getVal()<<endl; // 4-vector DOT metric 1 -1 -1 -1 RooFormulaVar p1D2("p1D2","@0*@1-@2",RooArgList(E1,E2,*p1v3D2)); //lep DOT fsrPhoton1 // 3-vector DOT RooFormulaVar* p1v3Dph1 = new RooFormulaVar("p1v3Dph1", "@0*@1*( (TMath::Cos(@2)*TMath::Cos(@3))/(TMath::Sin(@2)*TMath::Sin(@3))+TMath::Cos(@4-@5))", RooArgList(*pT1,*pTph1,*theta1,*thetaph1,*phi1,*phiph1)); // 4-vector DOT metric 1 -1 -1 -1 RooFormulaVar p1Dph1("p1Dph1","@0*@1-@2",RooArgList(E1,Eph1,*p1v3Dph1)); // 3-vector DOT RooFormulaVar* p2v3Dph1 = new RooFormulaVar("p2v3Dph1", "@0*@1*( (TMath::Cos(@2)*TMath::Cos(@3))/(TMath::Sin(@2)*TMath::Sin(@3))+TMath::Cos(@4-@5))", RooArgList(*pT2,*pTph1,*theta2,*thetaph1,*phi2,*phiph1)); // 4-vector DOT metric 1 -1 -1 -1 RooFormulaVar p2Dph1("p2Dph1","@0*@1-@2",RooArgList(E2,Eph1,*p2v3Dph1)); // lep DOT fsrPhoton2 // 3-vector DOT RooFormulaVar* p1v3Dph2 = new RooFormulaVar("p1v3Dph2", "@0*@1*( (TMath::Cos(@2)*TMath::Cos(@3))/(TMath::Sin(@2)*TMath::Sin(@3))+TMath::Cos(@4-@5))", RooArgList(*pT1,*pTph2,*theta1,*thetaph2,*phi1,*phiph2)); // 4-vector DOT metric 1 -1 -1 -1 RooFormulaVar p1Dph2("p1Dph2","@0*@1-@2",RooArgList(E1,Eph2,*p1v3Dph2)); // 3-vector DOT RooFormulaVar* p2v3Dph2 = new RooFormulaVar("p2v3Dph2", "@0*@1*( (TMath::Cos(@2)*TMath::Cos(@3))/(TMath::Sin(@2)*TMath::Sin(@3))+TMath::Cos(@4-@5))", RooArgList(*pT2,*pTph2,*theta2,*thetaph2,*phi2,*phiph2)); // 4-vector DOT metric 1 -1 -1 -1 RooFormulaVar p2Dph2("p2Dph2","@0*@1-@2",RooArgList(E2,Eph2,*p2v3Dph2)); // fsrPhoton1 DOT fsrPhoton2 // 3-vector DOT RooFormulaVar* ph1v3Dph2 = new RooFormulaVar("ph1v3Dph2", "@0*@1*( (TMath::Cos(@2)*TMath::Cos(@3))/(TMath::Sin(@2)*TMath::Sin(@3))+TMath::Cos(@4-@5))", RooArgList(*pTph1,*pTph2,*thetaph1,*thetaph2,*phiph1,*phiph2)); // 4-vector DOT metric 1 -1 -1 -1 RooFormulaVar ph1Dph2("ph1Dph2","@0*@1-@2",RooArgList(Eph1,Eph2,*ph1v3Dph2)); // mZ1 RooFormulaVar* mZ1; mZ1 = new RooFormulaVar("mZ1","TMath::Sqrt(2*@0+@1*@1+@2*@2)",RooArgList(p1D2,*m1,*m2)); if(p4sZ1ph_.size()==1) mZ1 = new RooFormulaVar("mZ1","TMath::Sqrt(2*@0+2*@1+2*@2+@3*@3+@4*@4)", RooArgList(p1D2, p1Dph1, p2Dph1, *m1,*m2)); if(p4sZ1ph_.size()==2) mZ1 = new RooFormulaVar("mZ1","TMath::Sqrt(2*@0+2*@1+2*@2+2*@3+2*@4+2*@5+@6*@6+@7*@7)", RooArgList(p1D2,p1Dph1,p2Dph1,p1Dph2,p2Dph2,ph1Dph2, *m1,*m2)); if(debug_) cout<<"mZ1 is "<<mZ1->getVal()<<endl; // pTerrs, 1,2,ph1,ph2 RooRealVar sigmaZ1_1("sigmaZ1_1", "sigmaZ1_1", pTerrZ1_1); RooRealVar sigmaZ1_2("sigmaZ1_2", "sigmaZ1_2", pTerrZ1_2); RooRealVar sigmaZ1_ph1("sigmaZ1_ph1", "sigmaZ1_ph1", pTerrZ1_ph1); RooRealVar sigmaZ1_ph2("sigmaZ1_ph2", "sigmaZ1_ph2", pTerrZ1_ph2); // resolution for decay products RooGaussian gauss1("gauss1","gaussian PDF", *pT1RECO, *pT1, sigmaZ1_1); RooGaussian gauss2("gauss2","gaussian PDF", *pT2RECO, *pT2, sigmaZ1_2); RooGaussian gaussph1("gaussph1","gaussian PDF", *pTph1RECO, *pTph1, sigmaZ1_ph1); RooGaussian gaussph2("gaussph2","gaussian PDF", *pTph2RECO, *pTph2, sigmaZ1_ph2); RooRealVar bwMean("bwMean", "m_{Z^{0}}", 91.187); RooRealVar bwGamma("bwGamma", "#Gamma", 2.5); RooRealVar sg("sg", "sg", sgVal_); RooRealVar a("a", "a", aVal_); RooRealVar n("n", "n", nVal_); RooCBShape CB("CB","CB",*mZ1,bwMean,sg,a,n); RooRealVar f("f","f", fVal_); RooRealVar mean("mean","mean",meanVal_); RooRealVar sigma("sigma","sigma",sigmaVal_); RooRealVar f1("f1","f1",f1Val_); RooGenericPdf RelBW("RelBW","1/( pow(mZ1*mZ1-bwMean*bwMean,2)+pow(mZ1,4)*pow(bwGamma/bwMean,2) )", RooArgSet(*mZ1,bwMean,bwGamma) ); RooAddPdf RelBWxCB("RelBWxCB","RelBWxCB", RelBW, CB, f); RooGaussian gauss("gauss","gauss",*mZ1,mean,sigma); RooAddPdf RelBWxCBxgauss("RelBWxCBxgauss","RelBWxCBxgauss", RelBWxCB, gauss, f1); RooProdPdf *PDFRelBWxCBxgauss; PDFRelBWxCBxgauss = new RooProdPdf("PDFRelBWxCBxgauss","PDFRelBWxCBxgauss", RooArgList(gauss1, gauss2, RelBWxCBxgauss) ); if(p4sZ1ph_.size()==1) PDFRelBWxCBxgauss = new RooProdPdf("PDFRelBWxCBxgauss","PDFRelBWxCBxgauss", RooArgList(gauss1, gauss2, gaussph1, RelBWxCBxgauss) ); if(p4sZ1ph_.size()==2) PDFRelBWxCBxgauss = new RooProdPdf("PDFRelBWxCBxgauss","PDFRelBWxCBxgauss", RooArgList(gauss1, gauss2, gaussph1, gaussph2, RelBWxCBxgauss) ); // observable set RooArgSet *rastmp; rastmp = new RooArgSet(*pT1RECO,*pT2RECO); if(p4sZ1ph_.size()==1) rastmp = new RooArgSet(*pT1RECO,*pT2RECO,*pTph1RECO); if(p4sZ1ph_.size()>=2) rastmp = new RooArgSet(*pT1RECO,*pT2RECO,*pTph1RECO,*pTph2RECO); RooDataSet* pTs = new RooDataSet("pTs","pTs", *rastmp); pTs->add(*rastmp); //RooAbsReal* nll; //nll = PDFRelBWxCBxgauss->createNLL(*pTs); //RooMinuit(*nll).migrad(); RooFitResult* r = PDFRelBWxCBxgauss->fitTo(*pTs,RooFit::Save(),RooFit::PrintLevel(-1)); const TMatrixDSym& covMatrix = r->covarianceMatrix(); const RooArgList& finalPars = r->floatParsFinal(); for (int i=0 ; i<finalPars.getSize(); i++){ TString name = TString(((RooRealVar*)finalPars.at(i))->GetName()); if(debug_) cout<<"name list of RooRealVar for covariance matrix "<<name<<endl; } int size = covMatrix.GetNcols(); //TMatrixDSym covMatrixTest_(size); covMatrixZ1_.ResizeTo(size,size); covMatrixZ1_ = covMatrix; if(debug_) cout<<"save the covariance matrix"<<endl; l1 = pT1->getVal()/RECOpT1; l2 = pT2->getVal()/RECOpT2; double pTerrZ1REFIT1 = pT1->getError(); double pTerrZ1REFIT2 = pT2->getError(); pTerrsZ1REFIT_.push_back(pTerrZ1REFIT1); pTerrsZ1REFIT_.push_back(pTerrZ1REFIT2); if(p4sZ1ph_.size()>=1){ if(debug_) cout<<"set refit result for Z1 fsr photon 1"<<endl; lph1 = pTph1->getVal()/RECOpTph1; double pTerrZ1phREFIT1 = pTph1->getError(); if(debug_) cout<<"scale "<<lph1<<" pterr "<<pTerrZ1phREFIT1<<endl; pTerrsZ1phREFIT_.push_back(pTerrZ1phREFIT1); } if(p4sZ1ph_.size()==2){ lph2 = pTph2->getVal()/RECOpTph2; double pTerrZ1phREFIT2 = pTph2->getError(); pTerrsZ1phREFIT_.push_back(pTerrZ1phREFIT2); } //delete nll; delete r; delete mZ1; delete pT1; delete pT2; delete pTph1; delete pTph2; delete pT1RECO; delete pT2RECO; delete pTph1RECO; delete pTph2RECO; delete ph1v3Dph2; delete p1v3Dph1; delete p2v3Dph1; delete p1v3Dph2; delete p2v3Dph2; delete PDFRelBWxCBxgauss; delete pTs; delete rastmp; if(debug_) cout<<"end Z1 refit"<<endl; return 0; }
int scaleSmearFit(TString RDFile, TString MCFile, char BaseName[30]) { cout<<"Processing "<<BaseName<<endl; gStyle->SetPalette(1); //Data and histograms TFile *f_RD = new TFile(RDFile); TFile *f_MC = new TFile(MCFile); TH1D *h1_ZmassDaughEtaRD = (TH1D*)f_RD->Get("h1_ZmassDaughEtaRD")->Clone(); TH1D *h1_ZmassDaughEtaMC[ScaleBins][ScaleBins]; //Variables char histName[30]; RooRealVar zMass("zMass","zMass",60,120); RooRealVar *nMC; RooRealVar nBRD("nBRD","nBRD",5,2000); RooRealVar nSRD("nSRD","nSRD",1000,0,20000); RooRealVar nBMC("nBMC","nBMC",5,2000); RooRealVar nSMC("nSMC","nSMC",1000,0,20000); RooPlot *zmassframe; RooPlot *zmassframeMC; CPlot *plotFit; CPlot *plotFitMC; //zMass.setBins(50); RooFitResult* fitRes; RooFitResult* fitResMC; TCanvas *myCan = MakeCanvas("myCan","myCan",800,600); RooDataHist *ZmassMC; //RooHistPdf *pdfMC; RooAddPdf *pdfMC; RooAddPdf* pdfRD; //RD fitting RooDataHist *ZmassRD = new RooDataHist("ZmassRD","ZmassRD", RooArgSet(zMass),h1_ZmassDaughEtaRD); //CBreitWignerConvCrystalBall ZsignalPdf("ZsigPdf",zMass); //pdfRD=new RooAddPdf("pdfRD","pdfRD",RooArgList(*(ZsignalPdf.model)),RooArgList(nRD)); CVoigtian ZsigRD("ZsigRD",zMass); CErfExpo ZbgRD("ZbgRD",zMass); //CQuadraticExp ZbgRD("ZbgRD",zMass); pdfRD=new RooAddPdf("pdfRD","pdfRD",RooArgList(*(ZsigRD.model),*(ZbgRD.model)),RooArgList(nSRD,nBRD)); pdfRD=new RooAddPdf("pdfRD","pdfRD",RooArgList(*(ZsigRD.model),*(ZbgRD.model)),RooArgList(nSRD,nBRD)); fitRes=pdfRD->fitTo(*ZmassRD,Extended(),Minos(kTRUE),Save(kTRUE)); //fitRes=ZsignalPdf.model->fitTo(*ZmassRD,Minos(kTRUE),Save(kTRUE)); zmassframe=zMass.frame(Bins(60)); ZmassRD->plotOn(zmassframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("zp")); //ZsignalPdf.model->plotOn(zmassframe,LineColor(kBlue),DrawOption("l")); pdfRD->plotOn(zmassframe,LineColor(kBlack),DrawOption("l")); pdfRD->plotOn(zmassframe,Components(RooArgSet(*(ZsigRD.model))),LineColor(kBlue),DrawOption("l")); pdfRD->plotOn(zmassframe,Components(RooArgSet(*(ZbgRD.model))),LineColor(kRed),DrawOption("l")); sprintf(histName,"ZmassRD_%s",BaseName); plotFit = new CPlot(histName,zmassframe,"","","Z mass"); plotFit->setOutDir("Plot"); plotFit->Draw(myCan,kTRUE,"png"); //CErfExpo *pdfZbg; //double nLL[41][41]; // 90 0.004 double ScaleWidth = (ScaleH-ScaleL)/(ScaleBins-1); double SmearWidth = (SmearH-SmearL)/(ScaleBins-1); sprintf(histName,"h2_NLL_%s",BaseName); TH2D *h2_NLL = new TH2D(histName,histName, ScaleBins,ScaleL-ScaleWidth/2,ScaleH+ScaleWidth/2, ScaleBins,SmearL-SmearWidth/2,SmearH+SmearWidth/2); //TH2D *h2_NLL = new TH2D("h2_NLL","NLL",41,0.97,1.05,41,0.5,1.5); double x,prob; //RooAbsReal *nll; double nll; double binContent; //*** CVoigtian ZsigMC("ZsigMC",zMass); RooArgSet allArgset(zMass); RooArgSet anaVar; //for(int i(0);i<=0;i++)for(int j(0);j<=0;j++) for(int i(0);i<=ScaleBins-1;i++)for(int j(0);j<=ScaleBins-1;j++) { sprintf(histName,"h1_ZmassDaughEta_%d_%d",i,j); h1_ZmassDaughEtaMC[i][j] = (TH1D*)f_MC->Get(histName)->Clone(histName); ZmassMC = new RooDataHist("ZmassMC","ZmassMC",RooArgSet(zMass),h1_ZmassDaughEtaMC[i][j]); // interpolation order //pdfMC =new RooHistPdf ("pdfMC", "pdfMC", zMass,*ZmassMC, 1); //Using fitting MC nSMC.setVal(285); ZsigMC.mass->setVal(91.37); ZsigMC.sigma->setVal(0.42); ZsigMC.width->setVal(4.4); pdfMC = new RooAddPdf("pdfMC","pdfMC",RooArgList(*(ZsigMC.model)),RooArgList(nSMC)); fitResMC = pdfMC->fitTo(*ZmassMC,Extended(),Minos(kTRUE),Save(kTRUE),SumW2Error(kTRUE));//SumW2Error(kTRUE) default nll=0; //nll= h1_ZmassDaughEtaMC[i][j]->Chi2Test(h1_ZmassDaughEtaRD,"CHI2/NDF"); // code 1000 dataHist sum int intCode = pdfMC->getAnalyticalIntegral(allArgset,anaVar); double norm = pdfMC->analyticalIntegral(intCode); cout<<"norm: code "<<norm<<" : "<<intCode<<"======================"<<endl; //double totalProb(0); //**** for(int k(1);k<=60;k++) { x=h1_ZmassDaughEtaMC[i][j]->GetBinCenter(k); // binContent = h1_ZmassDaughEtaRD->GetBinContent(k); //binContent = h1_ZmassDaughEtaMC[i][j]->GetBinContent(k); zMass=x; //prob = ZsignalPdf.model->evaluate(); binContent = ZsigRD.model->evaluate()*(120-60)/60.*nSRD.getVal(); prob = pdfMC->evaluate()*(120-60)/60.; //cout<<"binCont, prob "<<binContent<<" "<<prob<<endl; //totalProb +=prob; nll+=-binContent*log(prob); //cout<<" x: prob "<<x<<" "<<prob<<endl; } h2_NLL->SetBinContent(i+1,j+1,nll); /***/ // // if( j==0 || j==int(ScaleBins/2)|| j==(ScaleBins-1) ) { //RD MCpdf RDpdf Plot zmassframe =zMass.frame(Bins(60)); ZmassRD->plotOn(zmassframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("zp")); pdfRD->plotOn(zmassframe,LineColor(kBlack)); pdfMC->plotOn(zmassframe,LineColor(kBlue)); //pdfRD->plotOn(zmassframe,Components(RooArgSet(*(pdfZbg->model))),LineColor(kRed)); sprintf(histName,"Zmass_%s_%d_%d",BaseName,i,j); plotFit = new CPlot(histName,zmassframe,"","","Z mass"); plotFit->SetLegend(0.68,0.57,0.93,0.8); plotFit->GetLegend()->AddEntry(pdfRD,"RD","f"); plotFit->GetLegend()->AddEntry(pdfMC,"MC","f"); plotFit->setOutDir("Plot"); plotFit->Draw(myCan,kTRUE,"png"); //MC MCPdf Plot zmassframeMC = zMass.frame(Bins(60)); ZmassMC->plotOn(zmassframeMC,LineColor(kBlue),DrawOption("p")); pdfMC->plotOn(zmassframeMC,LineColor(kBlue),DrawOption("l")); sprintf(histName,"ZmassMC_%s_%d_%d",BaseName,i,j); plotFitMC = new CPlot(histName,zmassframeMC,"","","Z mass MC"); plotFitMC->setOutDir("Plot"); plotFitMC->Draw(myCan,kTRUE,"png"); } } //==== //Plot //==== //Zmass---------- //CPlot *plotZmassRD=new CPlot("plotZmassRD","","zMass","Event"); //plotZmassRD->setOutDir("Plot"); //plotZmassRD->AddHist1D(h1_ZmassDaughEtaRD,"",kBlack); //plotZmassRD->SetLegend(0.68,0.57,0.93,0.8); //plotZmassRD->GetLegend()->AddEntry(h1_ZmassDaughEtaRD,"RD Ele","l"); //plotZmassRD->AddTextBox("both lepton at the |Eta|<0.4",0.65,0.80,0.99,0.86,0); //plotZmassRD->Draw(myCan,kTRUE,"png"); //NLL------------ sprintf(histName,"plotNLL_%s",BaseName); CPlot *plotNll=new CPlot(histName,"","Scale","Smear"); plotNll->setOutDir("Plot"); //plotNll->AddHist2D(h2_NLL,"COLZ",kWhite,kBlack); plotNll->AddHist2D(h2_NLL,"SURF3",kWhite,kBlack); plotNll->Draw(myCan,kTRUE,"png"); //****/ return 0; }