pair<double,double> bkgEvPerGeV(RooWorkspace *work, int m_hyp, int cat, int spin=false){ RooRealVar *mass = (RooRealVar*)work->var("CMS_hgg_mass"); if (spin) mass = (RooRealVar*)work->var("mass"); mass->setRange(100,180); RooAbsPdf *pdf = (RooAbsPdf*)work->pdf(Form("pdf_data_pol_model_8TeV_cat%d",cat)); RooAbsData *data = (RooDataSet*)work->data(Form("data_mass_cat%d",cat)); RooPlot *tempFrame = mass->frame(); data->plotOn(tempFrame,Binning(80)); pdf->plotOn(tempFrame); RooCurve *curve = (RooCurve*)tempFrame->getObject(tempFrame->numItems()-1); double nombkg = curve->Eval(double(m_hyp)); RooRealVar *nlim = new RooRealVar(Form("nlim%d",cat),"",0.,0.,1.e5); //double lowedge = tempFrame->GetXaxis()->GetBinLowEdge(FindBin(double(m_hyp))); //double upedge = tempFrame->GetXaxis()->GetBinUpEdge(FindBin(double(m_hyp))); //double center = tempFrame->GetXaxis()->GetBinUpCenter(FindBin(double(m_hyp))); nlim->setVal(nombkg); mass->setRange("errRange",m_hyp-0.5,m_hyp+0.5); RooAbsPdf *epdf = 0; epdf = new RooExtendPdf("epdf","",*pdf,*nlim,"errRange"); RooAbsReal *nll = epdf->createNLL(*data,Extended(),NumCPU(4)); RooMinimizer minim(*nll); minim.setStrategy(0); minim.setPrintLevel(-1); minim.migrad(); minim.minos(*nlim); double error = (nlim->getErrorLo(),nlim->getErrorHi())/2.; data->Print(); return pair<double,double>(nombkg,error); }
void THSEventsPDF::adjustBinning(Int_t* offset1) const { RooRealVar* xvar = fx_off ; if (!dynamic_cast<RooRealVar*>(xvar)) { coutE(InputArguments) << "RooDataHist::adjustBinning(" << GetName() << ") ERROR: dimension " << xvar->GetName() << " must be real" << endl ; assert(0) ; } Double_t xlo = xvar->getMin() ; Double_t xhi = xvar->getMax() ; //adjust bin range limits with new scale parameter //cout<<scale<<" "<<fMean<<" "<<xlo<<" "<<xhi<<endl; xlo=(xlo-fMean)/scale+fMean; xhi=(xhi-fMean)/scale+fMean; if(xvar->getBinning().lowBound()==xlo&&xvar->getBinning().highBound()==xhi) return; xvar->setRange(xlo,xhi) ; // Int_t xmin(0) ; // cout<<"THSEventsPDF::adjustBinning( "<<xlo <<" "<<xhi<<endl; //now adjust fitting range to bin limits??Possibly not if (fRHist->GetXaxis()->GetXbins()->GetArray()) { RooBinning xbins(fRHist->GetNbinsX(),fRHist->GetXaxis()->GetXbins()->GetArray()) ; Double_t tolerance = 1e-6*xbins.averageBinWidth() ; // Adjust xlo/xhi to nearest boundary Double_t xloAdj = xbins.binLow(xbins.binNumber(xlo+tolerance)) ; Double_t xhiAdj = xbins.binHigh(xbins.binNumber(xhi-tolerance)) ; xbins.setRange(xloAdj,xhiAdj) ; xvar->setBinning(xbins) ; if (fabs(xloAdj-xlo)>tolerance||fabs(xhiAdj-xhi)<tolerance) { coutI(DataHandling) << "RooDataHist::adjustBinning(" << GetName() << "): fit range of variable " << xvar->GetName() << " expanded to nearest bin boundaries: [" << xlo << "," << xhi << "] --> [" << xloAdj << "," << xhiAdj << "]" << endl ; } } else { RooBinning xbins(fRHist->GetXaxis()->GetXmin(),fRHist->GetXaxis()->GetXmax()) ; xbins.addUniform(fRHist->GetNbinsX(),fRHist->GetXaxis()->GetXmin(),fRHist->GetXaxis()->GetXmax()) ; Double_t tolerance = 1e-6*xbins.averageBinWidth() ; // Adjust xlo/xhi to nearest boundary Double_t xloAdj = xbins.binLow(xbins.binNumber(xlo+tolerance)) ; Double_t xhiAdj = xbins.binHigh(xbins.binNumber(xhi-tolerance)) ; xbins.setRange(xloAdj,xhiAdj) ; xvar->setRange(xloAdj,xhiAdj) ; //xvar->setRange(xlo,xhi) ; } return; }
// // set value and range for a variable in the workspace // void setValRange (RooWorkspace* workspace, const char* name, double val, double vmin, double vmax) { RooRealVar* var = workspace->var(name); if ( var ) { if ( vmax>vmin ) var->setRange(vmin,vmax); var->setVal(val); } }
MakeBiasStudy::MakeBiasStudy() { int Nmodels = 8; //RooRealVar* mass = ws->var("mass"); RooRealVar *mass = new RooRealVar("mass","mass", 100,180); RooRealVar *nBkgTruth = new RooRealVar("TruthNBkg","", 0,1e9); // RooAbsData* realData = ws->data("Data_Combined")->reduce( Form("evtcat==evtcat::%s",cat.Data()) ); double Bias[Nmodels][Nmodels]; double BiasE[Nmodels][Nmodels]; MakeAICFits MakeAIC_Fits; for(int truthType = 0; truthType < Nmodels; truthType++){ RooAbsPdf *truthPdf = MakeAIC_Fits.getBackgroundPdf(truthType,mass); RooExtendPdf *truthExtendedPdf = new RooExtendPdf("truthExtendedPdf","",*truthPdf,*nBkgTruth); //truthExtendedPdf.fitTo(*realData,RooFit::Strategy(0),RooFit::NumCPU(NUM_CPU),RooFit::Minos(kFALSE),RooFit::Extended(kTRUE)); //truthExtendedPdf.fitTo(*realData,RooFit::Strategy(2),RooFit::NumCPU(NUM_CPU),RooFit::Minos(kFALSE),RooFit::Extended(kTRUE)); double BiasWindow = 2.00; mass->setRange("biasRegion", mh-BiasWindow, mh+BiasWindow); double TruthFrac = truthExtendedPdf->createIntegral(mass,RooFit::Range("biasRegion"),RooFit::NormSet(*mass))->getVal(); double NTruth = TruthFrac * nBkgTruth->getVal(); double NTruthE = TruthFrac * nBkgTruth->getError(); RooDataSet* truthbkg = truthPdf->generate(RooArgSet(*mass),nBkgTruth); for(int modelType = 0; modelType < Nmodels; modelType++){ RooAbsPdf* ModelShape = MakeAIC_Fits.getBackgroundPdf(modelType,mass); RooRealVar *nBkgFit = new RooRealVar("FitNBkg", "", 0, 1e9); RooExtendPdf ModelExtendedPdf = new RooExtendPdf("ModelExtendedPdf", "",*ModelShape, *nBkgFit); ModelExtendedPdf.fitTo(truthbkg, RooFit::Strategy(0),RooFit::NumCPU(NUM_CPU),RooFit::Minos(kFALSE),RooFit::Extended(kTRUE)); ModelExtendedPdf.fitTo(truthbkg, RooFit::Strategy(2),RooFit::NumCPU(NUM_CPU),RooFit::Minos(kFALSE),RooFit::Extended(kTRUE)); double FitFrac = ModelExtendedPdf.createIntegral(mass,RooFit::Range("biasRegion"),RooFit::NormSet(mass))->getVal(); double NFit = FitFrac * nBkgFit->getVal(); double NFitE = FitFrac * nBkgFit->getError(); Bias[truthType][modelType] = fabs(NFit - NTruth); BiasE[truthType][modelType] = fabs(NFitE - NTruthE); } } for(int i = 0; i < Nmodels; i++) { std::cout << "===== Truth Model : " << MakeBiasStudy::Category(i) << " ===== " << std::endl; for (int j = 0; j < Nmodels; j++) { std::cout << "Fit Model: " << MakeBiasStudy::Category(j) << " , Bias = " << Bias[i][j] << " +/- " << BiasE[i][j] << std::endl; } } }
void FitterUtils::initiateParams(int nGenSignalZeroGamma, int nGenSignalOneGamma, int nGenSignalTwoGamma, RooRealVar const& expoConstGen, RooRealVar& nSignal, RooRealVar& nPartReco, RooRealVar& nComb, RooRealVar& fracZero, RooRealVar& fracOne, RooRealVar& expoConst, RooRealVar& nJpsiLeak, bool constPartReco, RooRealVar const& fracPartRecoSigma) { TRandom rand; rand.SetSeed(); int nGenSignal = nGenSignalZeroGamma + nGenSignalOneGamma + nGenSignalTwoGamma; double nGenSignal2; double nGenPartReco2; if(!constPartReco) { nGenSignal2 = rand.Uniform(nGenSignal-5*sqrt(nGenSignal), nGenSignal+5*sqrt(nGenSignal)); nGenPartReco2 = rand.Uniform(nGenPartReco-5*sqrt(nGenPartReco), nGenPartReco+5*sqrt(nGenPartReco)); } if(constPartReco) { double nGenSigPartReco( nGenSignal+nGenPartReco ); double nGenSigPartReco2( rand.Uniform( nGenSigPartReco-5*sqrt(nGenSigPartReco), nGenSigPartReco+5*sqrt(nGenSigPartReco) ) ); double fracPartReco1( nGenPartReco/(1.*nGenSignal)); double fracPartReco2( rand.Uniform(fracPartReco1-5*fracPartRecoSigma.getVal(), fracPartReco1+5*fracPartRecoSigma.getVal()) ); nGenPartReco2 = fracPartReco2*nGenSigPartReco2 / (1+fracPartReco2); nGenSignal2 = nGenSigPartReco2 / (1+fracPartReco2); } double nGenComb2 = rand.Uniform(nGenComb-5*sqrt(nGenComb), nGenComb+5*sqrt(nGenComb)); double nGenJpsiLeak2 = rand.Uniform(nGenJpsiLeak-5*sqrt(nGenJpsiLeak), nGenJpsiLeak+5*sqrt(nGenJpsiLeak)); nSignal.setVal(nGenSignal2); nSignal.setRange(TMath::Max(0.,nGenSignal2-10.*sqrt(nGenSignal)) , nGenSignal2+10*sqrt(nGenSignal)); nPartReco.setVal(nGenPartReco2); nPartReco.setRange(TMath::Max(0.,nGenPartReco2-10.*sqrt(nGenPartReco)), nGenPartReco2+10*sqrt(nGenPartReco)); nComb.setVal(nGenComb2); nComb.setRange(TMath::Max(0.,nGenComb2-10.*sqrt(nGenComb)), nGenComb2+10*sqrt(nGenComb)); nJpsiLeak.setVal(nGenJpsiLeak2); nJpsiLeak.setRange(TMath::Max(0., nGenJpsiLeak2-10*sqrt(nGenJpsiLeak)), nGenJpsiLeak2+10*sqrt(nGenJpsiLeak)); double fracGenZero(nGenSignalZeroGamma/(1.*nGenSignal)); double fracGenOne(nGenSignalOneGamma/(1.*nGenSignal)); fracZero.setVal(rand.Gaus(fracGenZero, sqrt(nGenSignalZeroGamma)/(1.*nGenSignal))) ; fracZero.setRange(0., 1.); fracOne.setVal(rand.Gaus(fracGenOne, sqrt(nGenSignalOneGamma)/(1.*nGenSignal))) ; fracOne.setRange(0., 1.); expoConst.setVal(rand.Uniform( expoConstGen.getVal() - 5*expoConstGen.getError(), expoConstGen.getVal() + 5*expoConstGen.getError() ) ); expoConst.setRange( expoConstGen.getVal() - 10*expoConstGen.getError(), expoConstGen.getVal() + 10*expoConstGen.getError() ); }
double NormalizedIntegral(RooAbsPdf & function, RooRealVar & integrationVar, double lowerLimit, double upperLimit){ integrationVar.setRange("integralRange",lowerLimit,upperLimit); RooAbsReal* integral = function.createIntegral(integrationVar,NormSet(integrationVar),Range("integralRange")); double normlizedIntegralValue = integral->getVal(); // cout<<normlizedIntegralValue<<endl; return normlizedIntegralValue; }
void FitterUtilsSimultaneousExpOfPolyTimesX::initiateParams(int nGenSignalZeroGamma, int nGenSignalOneGamma, int nGenSignalTwoGamma, RooRealVar& nKemu, RooRealVar& nSignal, RooRealVar& nPartReco, RooRealVar& nComb, RooRealVar& fracZero, RooRealVar& fracOne, RooRealVar& nJpsiLeak, bool constPartReco, RooRealVar const& fracPartRecoSigma, RooRealVar& l1Kee, RooRealVar& l2Kee, RooRealVar& l3Kee, RooRealVar& l4Kee, RooRealVar& l5Kee, RooRealVar& l1Kemu, RooRealVar& l2Kemu, RooRealVar& l3Kemu, RooRealVar& l4Kemu, RooRealVar& l5Kemu, RooRealVar const& l1KeeGen, RooRealVar const& l2KeeGen, RooRealVar const& l3KeeGen, RooRealVar const& l4KeeGen, RooRealVar const& l5KeeGen ) { FitterUtilsExpOfPolyTimesX::initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, nSignal, nPartReco, nComb, fracZero, fracOne, nJpsiLeak, constPartReco, fracPartRecoSigma, l1Kee, l2Kee, l3Kee, l4Kee, l5Kee, l1KeeGen, l2KeeGen, l3KeeGen, l4KeeGen, l5KeeGen ); TRandom rand; rand.SetSeed(); nKemu.setVal(rand.Uniform(nGenKemu-5*sqrt(nGenKemu), nGenKemu+5*sqrt(nGenKemu))); nKemu.setRange(nGenKemu-10*sqrt(nGenKemu), nGenKemu+10*sqrt(nGenKemu)); l1Kemu.setVal(rand.Uniform( l1KeeGen.getVal() - 5*l1KeeGen.getError(), l1KeeGen.getVal() + 5*l1KeeGen.getError() ) ); l1Kemu.setRange( l1KeeGen.getVal() - 10*l1KeeGen.getError(), l1KeeGen.getVal() + 10*l1KeeGen.getError() ); l2Kemu.setVal(rand.Uniform( l2KeeGen.getVal() - 5*l2KeeGen.getError(), l2KeeGen.getVal() + 5*l2KeeGen.getError() ) ); l2Kemu.setRange( l2KeeGen.getVal() - 10*l2KeeGen.getError(), l2KeeGen.getVal() + 10*l2KeeGen.getError() ); l3Kemu.setVal(rand.Uniform( l3KeeGen.getVal() - 5*l3KeeGen.getError(), l3KeeGen.getVal() + 5*l3KeeGen.getError() ) ); l3Kemu.setRange( l3KeeGen.getVal() - 10*l3KeeGen.getError(), l3KeeGen.getVal() + 10*l3KeeGen.getError() ); l4Kemu.setVal(rand.Uniform( l4KeeGen.getVal() - 5*l4KeeGen.getError(), l4KeeGen.getVal() + 5*l4KeeGen.getError() ) ); l4Kemu.setRange( l4KeeGen.getVal() - 10*l4KeeGen.getError(), l4KeeGen.getVal() + 10*l4KeeGen.getError() ); l5Kemu.setVal(rand.Uniform( l5KeeGen.getVal() - 5*l5KeeGen.getError(), l5KeeGen.getVal() + 5*l5KeeGen.getError() ) ); l5Kemu.setRange( l5KeeGen.getVal() - 10*l5KeeGen.getError(), l5KeeGen.getVal() + 10*l5KeeGen.getError() ); }
int main(int argc, char **argv) { bool printeff = true; string fc = "none"; gROOT->ProcessLine(".x lhcbStyle.C"); if(argc > 1) { for(int a = 1; a < argc; a++) { string arg = argv[a]; string str = arg.substr(2,arg.length()-2); if(arg.find("-E")!=string::npos) fc = str; if(arg=="-peff") printeff = true; } } int nexp = 100; int nbins = 6; double q2min[] = {8.,15.,11.0,15,16,18}; double q2max[] = {11.,20.,12.5,16,18,20}; TString datafilename = "/afs/cern.ch/work/p/pluca/weighted/Lmumu/candLb.root"; TreeReader * data = new TreeReader("candLb2Lmumu"); data->AddFile(datafilename); TreeReader * datajpsi = new TreeReader("candLb2JpsiL"); datajpsi->AddFile(datafilename); TFile * histFile = new TFile("Afb_bkgSys.root","recreate"); string options = "-quiet-noPlot-lin-stdAxis-XM(#Lambda#mu#mu) (MeV/c^{2})-noCost-noParams"; Analysis::SetPrintLevel("s"); RooRealVar * cosThetaL = new RooRealVar("cosThetaL","cosThetaL",0.,-1.,1.); RooRealVar * cosThetaB = new RooRealVar("cosThetaB","cosThetaB",0.,-1.,1.); RooRealVar * MM = new RooRealVar("Lb_MassConsLambda","Lb_MassConsLambda",5621.,5400.,6000.); MM->setRange("Signal",5600,5640); RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR); //TGraphAsymmErrors * fL_vs_q2 = new TGraphAsymmErrors(); //TCanvas * ceff = new TCanvas(); RooCategory * samples = new RooCategory("samples","samples"); samples->defineType("DD"); samples->defineType("LL"); RooRealVar * afb = new RooRealVar("afb","afb",0.,-0.75,0.75); RooRealVar * fL = new RooRealVar("fL","fL",0.6,0.,1.); TString afbLpdf = "((3./8.)*(1.-fL)*(1 + TMath::Power(cosThetaL,2)) + afb*cosThetaL + (3./4.)*fL*(1 - TMath::Power(cosThetaL,2)))"; RooRealVar * afbB = new RooRealVar("afbB","afbB",0.,-0.5,0.5); TString afbBpdf = "(1 + 2*afbB*cosThetaB)"; RooAbsPdf * teoPdf = new RooGenericPdf("teoPdf",afbLpdf,RooArgSet(*cosThetaL,*afb,*fL)); RooAbsPdf * teoPdfB = new RooGenericPdf("teoPdfB",afbBpdf,RooArgSet(*cosThetaB,*afbB)); TreeReader * mydata = datajpsi; Str2VarMap jpsiParsLL = getJpsiPars("LL", CutsDef::LLcut, histFile); Str2VarMap jpsiParsDD = getJpsiPars("DD", CutsDef::DDcut, histFile); vector<TH1 *> fLsysh, afbsysh, afbBsysh, fLsysh_frac, afbsysh_frac, afbBsysh_frac; for(int i = 0; i < nbins; i++) { TString q2name = ((TString)Form("q2_%4.2f_%4.2f",q2min[i],q2max[i])).ReplaceAll(".",""); if(i>0) { mydata = data; MM->setRange(5400,6000); } else { q2name = "jpsi"; MM->setRange(5500,5850); } TString curq2cut = Form("TMath::Power(J_psi_1S_MM/1000,2) >= %e && TMath::Power(J_psi_1S_MM/1000,2) < %e",q2min[i],q2max[i]); cout << "------------------- q2 bin: " << q2min[i] << " - " << q2max[i] << " -----------------------" << endl; /** GET AND FIT EFFICIENCIES **/ RooAbsPdf * effDDpdf = NULL, * effLLpdf = NULL, * effLLBpdf = NULL, * effDDBpdf = NULL; getEfficiencies(q2min[i],q2max[i],&effLLpdf,&effDDpdf,&effLLBpdf,&effDDBpdf,printeff); cout << "Efficiencies extracted" << endl; histFile->cd(); /** FIT AFB **/ afb->setVal(0); afbB->setVal(-0.37); fL->setVal(0.6); RooAbsPdf * corrPdfLL = new RooProdPdf("sigPdfLL"+q2name,"corrPdfLL",*teoPdf,*effLLpdf); RooAbsPdf * corrPdfDD = new RooProdPdf("sigPdfDD"+q2name,"corrPdfDD",*teoPdf,*effDDpdf); RooAbsPdf * corrPdfLLB = new RooProdPdf("sigPdfLLB"+q2name,"corrPdfLLB",*teoPdfB,*effLLBpdf); RooAbsPdf * corrPdfDDB = new RooProdPdf("sigPdfDDB"+q2name,"corrPdfDDB",*teoPdfB,*effDDBpdf); TCut baseCut = ""; TCut cutLL = CutsDef::LLcut + (TCut)curq2cut + baseCut; TCut cutDD = CutsDef::DDcut + (TCut)curq2cut + baseCut; histFile->cd(); double fracDDv[2], fracLLv[2]; double nsigDD, nsigLL; RooDataSet * dataLL = getDataAndFrac("LL",q2name,mydata,cutLL,MM,&fracLLv[0],jpsiParsLL,&nsigLL); RooDataSet * dataDD = getDataAndFrac("DD",q2name,mydata,cutDD,MM,&fracDDv[0],jpsiParsDD,&nsigDD); double nevts = nsigDD+nsigLL; cout << fixed << setprecision(3) << fracDDv[0] << " " << fracDDv[1] << endl; RooRealVar * fracLL = new RooRealVar("fracLL","fracLL",fracLLv[0]); RooRealVar * fracDD = new RooRealVar("fracDD","fracDD",fracDDv[0]); RooAbsPdf * bkgLL = NULL, * bkgLLB = NULL, * bkgDD = NULL, * bkgDDB = NULL; buildBkgPdfs(q2min[i],q2max[i],"LL",CutsDef::LLcut,&bkgLL,&bkgLLB); buildBkgPdfs(q2min[i],q2max[i],"DD",CutsDef::DDcut,&bkgDD,&bkgDDB); cout << "Backgrounds extracted" << endl; RooAbsPdf * modelLL = new RooAddPdf("modelLL","modelLL",RooArgSet(*corrPdfLL,*bkgLL),*fracLL); RooAbsPdf * modelDD = new RooAddPdf("modelDD","modelDD",RooArgSet(*corrPdfDD,*bkgDD),*fracDD); RooAbsPdf * modelLLB = new RooAddPdf("modelLLB","modelLLB",RooArgSet(*corrPdfLLB,*bkgLLB),*fracLL); RooAbsPdf * modelDDB = new RooAddPdf("modelDDB","modelDDB",RooArgSet(*corrPdfDDB,*bkgDDB),*fracDD); // CREATE COMBINED DATASET RooDataSet * combData = new RooDataSet(Form("combData_%i",i),"combined data",RooArgSet(*MM,*cosThetaL,*cosThetaB),Index(*samples),Import("DD",*dataDD),Import("LL",*dataLL)); Str2VarMap params; params["fL"] = fL; params["afb"] = afb; Str2VarMap paramsB; paramsB["afbB"] = afbB; // FIT COS LEPTON RooSimultaneous * combModel = new RooSimultaneous(Form("combModel_%i",i),"",*samples); combModel->addPdf(*modelLL,"LL"); combModel->addPdf(*modelDD,"DD"); RooFitResult * res = safeFit(combModel,combData,params,&isInAllowedArea); // FIT COS HADRON RooSimultaneous * combModelB = new RooSimultaneous(Form("combModelB_%i",i),"",*samples); combModelB->addPdf(*modelLLB,"LL"); combModelB->addPdf(*modelDDB,"DD"); RooFitResult * resB = safeFit(combModelB,combData,paramsB,&isInAllowedAreaB); cout << endl << fixed << setprecision(6) << "AfbB = " << afbB->getVal() << " +/- " << afbB->getError() << endl; cout << "Afb = " << afb->getVal() << " +/- " << afb->getError() << endl; cout << "fL = " << fL->getVal() << " +/- " << fL->getError() << endl; cout << endl; cout << "lepton: " << res->edm() << " " << res->covQual() << endl; cout << "baryon: " << resB->edm() << " " << resB->covQual() << endl; cout << endl; TH1F * fLsys = new TH1F(Form("fLsys_%i",i),"fLsys",40,-1,1); TH1F * afbsys = new TH1F(Form("afbsys_%i",i),"afbsys",40,-1,1); TH1F * afbBsys = new TH1F(Form("afbBsys_%i",i),"afbBsys",40,-1,1); TH1F * fLsys_frac = new TH1F(Form("fLsys_frac%i",i),"fLsys",40,-1,1); TH1F * afbsys_frac = new TH1F(Form("afbsys_frac%i",i),"afbsys",40,-1,1); TH1F * afbBsys_frac = new TH1F(Form("afbBsys_frac%i",i),"afbBsys",40,-1,1); RooAbsPdf * mybkgDD_2 = NULL, * mybkgDDB_2 = NULL; buildBkgPdfs(q2min[i],q2max[i],"DD",CutsDef::DDcut,&mybkgDD_2,&mybkgDDB_2,"RooKeyPdf"); //cout << nevts << endl; //TRandom3 r(0); for(int e = 0; e < nexp; e++) { histFile->cd(); RooAbsPdf * toypdf = (RooAbsPdf *)modelDD->Clone(); Analysis * toy = new Analysis("toy",cosThetaL,modelDD,nevts); RooAbsPdf * toypdfB = (RooAbsPdf *)modelDDB->Clone(); Analysis * toyB = new Analysis("toyB",cosThetaB,modelDDB,nevts); afb->setVal(0); afbB->setVal(-0.37); fL->setVal(0.6); safeFit(toypdf,toy->GetDataSet("-recalc"),params,&isInAllowedArea); safeFit(toypdfB,toyB->GetDataSet("-recalc"),paramsB,&isInAllowedAreaB); double def_afb = afb->getVal(); double def_fL = fL->getVal(); double def_afbB = afbB->getVal(); afb->setVal(0); afbB->setVal(-0.37); fL->setVal(0.6); RooAbsPdf * modelDD_2 = new RooAddPdf("modelDD_2","modelDD",RooArgSet(*corrPdfDD,*mybkgDD_2),*fracDD); RooAbsPdf * modelDDB_2 = new RooAddPdf("modelDDB_2","modelDDB",RooArgSet(*corrPdfDDB,*mybkgDDB_2),*fracDD); safeFit(modelDD_2,toy->GetDataSet("-recalc"),params,&isInAllowedArea); safeFit(modelDDB_2,toyB->GetDataSet("-recalc"),paramsB,&isInAllowedAreaB); double oth_afb = afb->getVal(); double oth_fL = fL->getVal(); double oth_afbB = afbB->getVal(); fLsys->Fill(oth_fL-def_fL); afbsys->Fill(oth_afb-def_afb); afbBsys->Fill(oth_afbB-def_afbB); afb->setVal(0.); afbB->setVal(-0.37); fL->setVal(0.6); //double rdm_frac = r.Gaus(fracDDv[0],fracDDv[1]); double rdm_frac = fracDDv[0] + fracDDv[1]; RooRealVar * fracDD_2 = new RooRealVar("fracDD_2","fracDD_2",rdm_frac); RooAbsPdf * modelDD_3 = new RooAddPdf("modelDD_3","modelDD",RooArgSet(*corrPdfDD,*bkgDD),*fracDD_2); RooAbsPdf * modelDDB_3 = new RooAddPdf("modelDDB_3","modelDDB",RooArgSet(*corrPdfDDB,*bkgDDB),*fracDD_2); safeFit(modelDD_3,toy->GetDataSet("-recalc"),params,&isInAllowedArea); safeFit(modelDDB_3,toyB->GetDataSet("-recalc"),paramsB,&isInAllowedAreaB); double frc_afb = afb->getVal(); double frc_fL = fL->getVal(); double frc_afbB = afbB->getVal(); fLsys_frac->Fill(frc_fL-def_fL); afbsys_frac->Fill(frc_afb-def_afb); afbBsys_frac->Fill(frc_afbB-def_afbB); } afbsysh.push_back(afbsys); afbBsysh.push_back(afbBsys); fLsysh.push_back(fLsys); afbsysh_frac.push_back(afbsys_frac); afbBsysh_frac.push_back(afbBsys_frac); fLsysh_frac.push_back(fLsys_frac); } for(int q = 0; q < nbins; q++) { cout << fixed << setprecision(2) << "-------- Bin " << q2min[q] << "-" << q2max[q] << endl; cout << fixed << setprecision(5) << "fL sys = " << fLsysh[q]->GetMean() << " +/- " << fLsysh[q]->GetMeanError() << endl; cout << "Afb sys = " << afbsysh[q]->GetMean() << " +/- " << afbsysh[q]->GetMeanError() << endl; cout << "AfbB sys = " << afbBsysh[q]->GetMean() << " +/- " << afbBsysh[q]->GetMeanError() << endl; } cout << "#################################################################" << endl; for(int q = 0; q < nbins; q++) { cout << fixed << setprecision(2) << "-------- Bin " << q2min[q] << "-" << q2max[q] << endl; cout << fixed << setprecision(5) << "fL sys = " << fLsysh_frac[q]->GetMean() << " +/- " << fLsysh_frac[q]->GetMeanError() << endl; cout << "Afb sys = " << afbsysh_frac[q]->GetMean() << " +/- " << afbsysh_frac[q]->GetMeanError() << endl; cout << "AfbB sys = " << afbBsysh_frac[q]->GetMean() << " +/- " << afbBsysh_frac[q]->GetMeanError() << endl; } cout << "#################################################################" << endl; for(int q = 0; q < nbins; q++) { cout << fixed << setprecision(2) << "-------- Bin " << q2min[q] << "-" << q2max[q] << endl; cout << fixed << setprecision(5) << "fL sys = " << TMath::Sqrt(TMath::Power(fLsysh_frac[q]->GetMean(),2) + TMath::Power(fLsysh[q]->GetMean(),2) ) << endl; cout << "Afb sys = " << TMath::Sqrt(TMath::Power(afbsysh_frac[q]->GetMean(),2) + TMath::Power(afbsysh[q]->GetMean(),2) ) << endl; cout << "AfbB sys = " << TMath::Sqrt(TMath::Power(afbBsysh_frac[q]->GetMean(),2) + TMath::Power(afbBsysh[q]->GetMean(),2) ) << endl; } }
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; }
void setup(ModelConfig* mcInWs) { RooAbsPdf* combPdf = mcInWs->GetPdf(); RooArgSet mc_obs = *mcInWs->GetObservables(); RooArgSet mc_globs = *mcInWs->GetGlobalObservables(); RooArgSet mc_nuis = *mcInWs->GetNuisanceParameters(); // pair the nuisance parameter to the global observable RooArgSet mc_nuis_tmp = mc_nuis; RooArgList nui_list; RooArgList glob_list; RooArgSet constraint_set_tmp(*combPdf->getAllConstraints(mc_obs, mc_nuis_tmp, false)); RooArgSet constraint_set; int counter_tmp = 0; unfoldConstraints(constraint_set_tmp, constraint_set, mc_obs, mc_nuis_tmp, counter_tmp); TIterator* cIter = constraint_set.createIterator(); RooAbsArg* arg; while ((arg = (RooAbsArg*)cIter->Next())) { RooAbsPdf* pdf = (RooAbsPdf*)arg; if (!pdf) continue; // pdf->Print(); TIterator* nIter = mc_nuis.createIterator(); RooRealVar* thisNui = NULL; RooAbsArg* nui_arg; while ((nui_arg = (RooAbsArg*)nIter->Next())) { if (pdf->dependsOn(*nui_arg)) { thisNui = (RooRealVar*)nui_arg; break; } } delete nIter; // need this incase the observable isn't fundamental. // in this case, see which variable is dependent on the nuisance parameter and use that. RooArgSet* components = pdf->getComponents(); // components->Print(); components->remove(*pdf); if (components->getSize()) { TIterator* itr1 = components->createIterator(); RooAbsArg* arg1; while ((arg1 = (RooAbsArg*)itr1->Next())) { TIterator* itr2 = components->createIterator(); RooAbsArg* arg2; while ((arg2 = (RooAbsArg*)itr2->Next())) { if (arg1 == arg2) continue; if (arg2->dependsOn(*arg1)) { components->remove(*arg1); } } delete itr2; } delete itr1; } if (components->getSize() > 1) { cout << "ERROR::Couldn't isolate proper nuisance parameter" << endl; return; } else if (components->getSize() == 1) { thisNui = (RooRealVar*)components->first(); } TIterator* gIter = mc_globs.createIterator(); RooRealVar* thisGlob = NULL; RooAbsArg* glob_arg; while ((glob_arg = (RooAbsArg*)gIter->Next())) { if (pdf->dependsOn(*glob_arg)) { thisGlob = (RooRealVar*)glob_arg; break; } } delete gIter; if (!thisNui || !thisGlob) { cout << "WARNING::Couldn't find nui or glob for constraint: " << pdf->GetName() << endl; //return; continue; } // cout << "Pairing nui: " << thisNui->GetName() << ", with glob: " << thisGlob->GetName() << ", from constraint: " << pdf->GetName() << endl; nui_list.add(*thisNui); glob_list.add(*thisGlob); if (string(pdf->ClassName()) == "RooPoisson") { double minVal = max(0.0, thisGlob->getVal() - 8*sqrt(thisGlob->getVal())); double maxVal = max(10.0, thisGlob->getVal() + 8*sqrt(thisGlob->getVal())); thisNui->setRange(minVal, maxVal); thisGlob->setRange(minVal, maxVal); } else if (string(pdf->ClassName()) == "RooGaussian") { thisNui->setRange(-7, 7); thisGlob->setRange(-10, 10); } // thisNui->Print(); // thisGlob->Print(); } delete cIter; }
int main(int argc, char* argv[]) { doofit::builder::EasyPdf *epdf = new doofit::builder::EasyPdf(); epdf->Var("sig_yield"); epdf->Var("sig_yield").setVal(153000); epdf->Var("sig_yield").setConstant(false); //decay time epdf->Var("obsTime"); epdf->Var("obsTime").SetTitle("t_{#kern[-0.2]{B}_{#kern[-0.1]{ d}}^{#kern[-0.1]{ 0}}}"); epdf->Var("obsTime").setUnit("ps"); epdf->Var("obsTime").setRange(0.,16.); // tag, respectively the initial state of the produced B meson epdf->Cat("obsTag"); epdf->Cat("obsTag").defineType("B_S",1); epdf->Cat("obsTag").defineType("Bbar_S",-1); //finalstate epdf->Cat("catFinalState"); epdf->Cat("catFinalState").defineType("f",1); epdf->Cat("catFinalState").defineType("fbar",-1); epdf->Var("obsEtaOS"); epdf->Var("obsEtaOS").setRange(0.0,0.5); std::vector<double> knots; knots.push_back(0.07); knots.push_back(0.10); knots.push_back(0.138); knots.push_back(0.16); knots.push_back(0.23); knots.push_back(0.28); knots.push_back(0.35); knots.push_back(0.42); knots.push_back(0.44); knots.push_back(0.48); knots.push_back(0.5); // empty arg list for coefficients RooArgList* list = new RooArgList(); // create first coefficient RooRealVar* coeff_first = &(epdf->Var("parCSpline1")); coeff_first->setRange(0,10000); coeff_first->setVal(1); coeff_first->setConstant(false); list->add( *coeff_first ); for (unsigned int i=1; i <= knots.size(); ++i){ std::string number = boost::lexical_cast<std::string>(i); RooRealVar* coeff = &(epdf->Var("parCSpline"+number)); coeff->setRange(0,10000); coeff->setVal(1); coeff->setConstant(false); list->add( *coeff ); } // create last coefficient RooRealVar* coeff_last = &(epdf->Var("parCSpline"+boost::lexical_cast<std::string>(knots.size()))); coeff_last->setRange(0,10000); coeff_last->setVal(1); coeff_last->setConstant(false); list->add( *coeff_last ); list->Print(); // define Eta PDF doofit::roofit::pdfs::DooCubicSplinePdf splinePdf("splinePdf",epdf->Var("obsEtaOS"),knots,*list,0,0.5); //Berechne die Tagging Assymetrie epdf->Var("p0"); epdf->Var("p0").setVal(0.369); epdf->Var("p0").setConstant(true); epdf->Var("p1"); epdf->Var("p1").setVal(0.952); epdf->Var("p1").setConstant(true); epdf->Var("delta_p0"); epdf->Var("delta_p0").setVal(0.019); epdf->Var("delta_p0").setConstant(true); epdf->Var("delta_p1"); epdf->Var("delta_p1").setVal(-0.012); epdf->Var("delta_p1").setConstant(true); epdf->Var("etamean"); epdf->Var("etamean").setVal(0.365); epdf->Var("etamean").setConstant(true); epdf->Formula("omega","@0 +@1/2 +(@2+@3/2)*(@4-@5)", RooArgList(epdf->Var("p0"),epdf->Var("delta_p0"),epdf->Var("p1"),epdf->Var("delta_p1"),epdf->Var("obsEtaOS"),epdf->Var("etamean"))); epdf->Formula("omegabar","@0 -@1/2 +(@2-@3/2)*(@4-@5)", RooArgList(epdf->Var("p0"),epdf->Var("delta_p0"),epdf->Var("p1"),epdf->Var("delta_p1"),epdf->Var("obsEtaOS"),epdf->Var("etamean"))); //Koeffizienten DecRateCoeff *coeff_c = new DecRateCoeff("coef_cos","coef_cos",DecRateCoeff::CPOdd,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("C_f"),epdf->Var("C_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Real("omega"),epdf->Real("omegabar"),epdf->Var("asym_prod"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); DecRateCoeff *coeff_s = new DecRateCoeff("coef_sin","coef_sin",DecRateCoeff::CPOdd,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("S_f"),epdf->Var("S_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Real("omega"),epdf->Real("omegabar"),epdf->Var("asym_prod"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); DecRateCoeff *coeff_sh = new DecRateCoeff("coef_sinh","coef_sinh",DecRateCoeff::CPEven,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("f1_f"),epdf->Var("f1_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Real("omega"),epdf->Real("omegabar"),epdf->Var("asym_prod"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); DecRateCoeff *coeff_ch = new DecRateCoeff("coef_cosh","coef_cosh",DecRateCoeff::CPEven,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("f0_f"),epdf->Var("f0_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Real("omega"),epdf->Real("omegabar"),epdf->Var("asym_prod"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); epdf->AddRealToStore(coeff_ch); epdf->AddRealToStore(coeff_sh); epdf->AddRealToStore(coeff_c); epdf->AddRealToStore(coeff_s); ///////////////////Generiere PDF's///////////////////// //Zeit epdf->GaussModel("resTimeGauss",epdf->Var("obsTime"),epdf->Var("allTimeResMean"),epdf->Var("allTimeReso")); epdf->BDecay("pdfSigTime",epdf->Var("obsTime"),epdf->Var("tau"),epdf->Var("dgamma"),epdf->Real("coef_cosh"),epdf->Real("coef_sinh"),epdf->Real("coef_cos"),epdf->Real("coef_sin"),epdf->Var("deltaM"),epdf->Model("resTimeGauss")); //Zusammenfassen der Parameter in einem RooArgSet RooArgSet Observables; Observables.add(RooArgSet( epdf->Var("obsTime"),epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("obsEtaOS"))); epdf->Extend("pdfExtend", epdf->Pdf("pdfSigTime"),epdf->Real("sig_yield")); RooWorkspace ws; ws.import(epdf->Pdf("pdfExtend")); ws.defineSet("Observables",Observables, true); ws.Print(); doofit::config::CommonConfig cfg_com("common"); cfg_com.InitializeOptions(argc, argv); doofit::toy::ToyFactoryStdConfig cfg_tfac("toyfac"); cfg_tfac.InitializeOptions(cfg_com); doofit::toy::ToyStudyStdConfig cfg_tstudy("toystudy"); cfg_tstudy.InitializeOptions(cfg_tfac); // set a previously defined workspace to get PDF from (not mandatory, but convenient) cfg_tfac.set_workspace(&ws); cfg_com.CheckHelpFlagAndPrintHelp(); // Initialize the toy factory module with the config objects and start // generating toy samples. doofit::toy::ToyFactoryStd tfac(cfg_com, cfg_tfac); doofit::toy::ToyStudyStd tstudy(cfg_com, cfg_tstudy); //Generate data RooDataSet* data = tfac.Generate(); data->Print(); epdf->Pdf("pdfExtend").getParameters(data)->readFromFile("/home/chasenberg/Repository/bachelor-template/ToyStudy/dootoycp-parameter.txt"); epdf->Pdf("pdfExtend").getParameters(data)->writeToFile("/home/chasenberg/Repository/bachelor-template/ToyStudy/dootoycp-parameter.txt.new"); //FIT-PDF-Koeffizienten epdf->Var("asym_prodFit"); epdf->Var("asym_prodFit").setVal(-0.0108); epdf->Var("asym_prodFit").setConstant(false); DecRateCoeff *coeff_cFit = new DecRateCoeff("coef_cosFit","coef_cosFit",DecRateCoeff::CPOdd,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("C_f"),epdf->Var("C_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Real("omega"),epdf->Real("omegabar"),epdf->Var("asym_prodFit"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); DecRateCoeff *coeff_sFit = new DecRateCoeff("coef_sinFit","coef_sinFit",DecRateCoeff::CPOdd,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("S_f"),epdf->Var("S_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Real("omega"),epdf->Real("omegabar"),epdf->Var("asym_prodFit"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); DecRateCoeff *coeff_shFit = new DecRateCoeff("coef_sinhFit","coef_sinhFit",DecRateCoeff::CPEven,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("f1_f"),epdf->Var("f1_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Real("omega"),epdf->Real("omegabar"),epdf->Var("asym_prodFit"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); DecRateCoeff *coeff_chFit = new DecRateCoeff("coef_coshFit","coef_coshFit",DecRateCoeff::CPEven,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("f0_f"),epdf->Var("f0_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Real("omega"),epdf->Real("omegabar"),epdf->Var("asym_prodFit"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); epdf->AddRealToStore(coeff_chFit); epdf->AddRealToStore(coeff_shFit); epdf->AddRealToStore(coeff_cFit); epdf->AddRealToStore(coeff_sFit); ///////////////////Generiere PDF's///////////////////// //Zeit epdf->BDecay("pdfSigTimeFit",epdf->Var("obsTime"),epdf->Var("tau"),epdf->Var("dgamma"),epdf->Real("coef_coshFit"),epdf->Real("coef_sinhFit"),epdf->Real("coef_cosFit"),epdf->Real("coef_sinFit"),epdf->Var("deltaM"),epdf->Model("resTimeGauss")); //Zusammenfassen der Parameter in einem RooArgSet RooArgSet ObservablesFit; ObservablesFit.add(RooArgSet( epdf->Var("obsTime"),epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("obsEtaOS"))); epdf->Extend("pdfExtendFit", epdf->Pdf("pdfSigTimeFit"),epdf->Real("sig_yield")); RooFitResult* fit_result = epdf->Pdf("pdfExtendFit").fitTo(*data, RooFit::Save(true)); tstudy.StoreFitResult(fit_result); //epdf->Pdf("pdfExtendFit").getParameters(data)->readFromFile("/home/chasenberg/Repository/bachelor-template/ToyStudy/dootoycp-parameter.txt"); //epdf->Pdf("pdfExtendFit").getParameters(data)->writeToFile("/home/chasenberg/Repository/bachelor-template/ToyStudy/dootoycp-parameter.txt.new"); //Plotten auf lhcb /*using namespace doofit::plotting; PlotConfig cfg_plot("cfg_plot"); cfg_plot.InitializeOptions(); cfg_plot.set_plot_directory("/net/storage03/data/users/chasenberg/ergebnis/dootoycp_float-lhcb/dgamma/time/"); // plot PDF and directly specify components Plot myplot(cfg_plot, epdf->Var("obsTime"), *data, RooArgList(epdf->Pdf("pdfExtend"))); myplot.PlotItLogNoLogY(); PlotConfig cfg_plotEta("cfg_plotEta"); cfg_plotEta.InitializeOptions(); cfg_plotEta.set_plot_directory("/net/storage03/data/users/chasenberg/ergebnis/dootoycp_float-lhcb/dgamma/eta/"); // plot PDF and directly specify components Plot myplotEta(cfg_plotEta, epdf->Var("obsEtaOS"), *data, RooArgList(splinePdf)); myplotEta.PlotIt();*/ }
// The actual job void backgroundFits_qqzz_1Dw(int channel, int sqrts, int VBFtag) { if(sqrts==7)return; TString schannel; if (channel == 1) schannel = "4mu"; else if (channel == 2) schannel = "4e"; else if (channel == 3) schannel = "2e2mu"; else cout << "Not a valid channel: " << schannel << endl; TString ssqrts = (long) sqrts + TString("TeV"); cout << "schannel = " << schannel << " sqrts = " << sqrts << " VBFtag = " << VBFtag << endl; TString outfile; if(VBFtag<2) outfile = "CardFragments/qqzzBackgroundFit_" + ssqrts + "_" + schannel + "_" + Form("%d",int(VBFtag)) + ".txt"; if(VBFtag==2) outfile = "CardFragments/qqzzBackgroundFit_" + ssqrts + "_" + schannel + ".txt"; ofstream of(outfile,ios_base::out); of << "### background functions ###" << endl; gSystem->AddIncludePath("-I$ROOFITSYS/include"); gROOT->ProcessLine(".L ../CreateDatacards/include/tdrstyle.cc"); setTDRStyle(false); gStyle->SetPadLeftMargin(0.16); TString filepath; if (sqrts==7) { filepath = filePath7TeV; } else if (sqrts==8) { filepath = filePath8TeV; } TChain* tree = new TChain("SelectedTree"); tree->Add( filepath+ "/" + (schannel=="2e2mu"?"2mu2e":schannel) + "/HZZ4lTree_ZZTo*.root"); RooRealVar* MC_weight = new RooRealVar("MC_weight","MC_weight",0.,2.) ; RooRealVar* ZZMass = new RooRealVar("ZZMass","ZZMass",100.,1000.); RooRealVar* NJets30 = new RooRealVar("NJets30","NJets30",0.,100.); RooArgSet ntupleVarSet(*ZZMass,*NJets30,*MC_weight); RooDataSet *set = new RooDataSet("set","set",ntupleVarSet,WeightVar("MC_weight")); Float_t myMC,myMass; Short_t myNJets; int nentries = tree->GetEntries(); tree->SetBranchAddress("ZZMass",&myMass); tree->SetBranchAddress("MC_weight",&myMC); tree->SetBranchAddress("NJets30",&myNJets); for(int i =0;i<nentries;i++) { tree->GetEntry(i); if(VBFtag==1 && myNJets<2)continue; if(VBFtag==0 && myNJets>1)continue; ntupleVarSet.setRealValue("ZZMass",myMass); ntupleVarSet.setRealValue("MC_weight",myMC); ntupleVarSet.setRealValue("NJets30",(double)myNJets); set->add(ntupleVarSet, myMC); } double totalweight = 0.; double totalweight_z = 0.; for (int i=0 ; i<set->numEntries() ; i++) { //set->get(i) ; RooArgSet* row = set->get(i) ; //row->Print("v"); totalweight += set->weight(); if (row->getRealValue("ZZMass") < 200) totalweight_z += set->weight(); } cout << "nEntries: " << set->numEntries() << ", totalweight: " << totalweight << ", totalweight_z: " << totalweight_z << endl; gSystem->Load("libHiggsAnalysisCombinedLimit.so"); //// --------------------------------------- //Background RooRealVar CMS_qqzzbkg_a0("CMS_qqzzbkg_a0","CMS_qqzzbkg_a0",115.3,0.,200.); RooRealVar CMS_qqzzbkg_a1("CMS_qqzzbkg_a1","CMS_qqzzbkg_a1",21.96,0.,200.); RooRealVar CMS_qqzzbkg_a2("CMS_qqzzbkg_a2","CMS_qqzzbkg_a2",122.8,0.,200.); RooRealVar CMS_qqzzbkg_a3("CMS_qqzzbkg_a3","CMS_qqzzbkg_a3",0.03479,0.,1.); RooRealVar CMS_qqzzbkg_a4("CMS_qqzzbkg_a4","CMS_qqzzbkg_a4",185.5,0.,200.); RooRealVar CMS_qqzzbkg_a5("CMS_qqzzbkg_a5","CMS_qqzzbkg_a5",12.67,0.,200.); RooRealVar CMS_qqzzbkg_a6("CMS_qqzzbkg_a6","CMS_qqzzbkg_a6",34.81,0.,100.); RooRealVar CMS_qqzzbkg_a7("CMS_qqzzbkg_a7","CMS_qqzzbkg_a7",0.1393,0.,1.); RooRealVar CMS_qqzzbkg_a8("CMS_qqzzbkg_a8","CMS_qqzzbkg_a8",66.,0.,200.); RooRealVar CMS_qqzzbkg_a9("CMS_qqzzbkg_a9","CMS_qqzzbkg_a9",0.07191,0.,1.); RooRealVar CMS_qqzzbkg_a10("CMS_qqzzbkg_a10","CMS_qqzzbkg_a10",94.11,0.,200.); RooRealVar CMS_qqzzbkg_a11("CMS_qqzzbkg_a11","CMS_qqzzbkg_a11",-5.111,-100.,100.); RooRealVar CMS_qqzzbkg_a12("CMS_qqzzbkg_a12","CMS_qqzzbkg_a12",4834,0.,10000.); RooRealVar CMS_qqzzbkg_a13("CMS_qqzzbkg_a13","CMS_qqzzbkg_a13",0.2543,0.,1.); if (channel == 1){ ///* 4mu CMS_qqzzbkg_a0.setVal(103.854); CMS_qqzzbkg_a1.setVal(10.0718); CMS_qqzzbkg_a2.setVal(117.551); CMS_qqzzbkg_a3.setVal(0.0450287); CMS_qqzzbkg_a4.setVal(185.262); CMS_qqzzbkg_a5.setVal(7.99428); CMS_qqzzbkg_a6.setVal(39.7813); CMS_qqzzbkg_a7.setVal(0.0986891); CMS_qqzzbkg_a8.setVal(49.1325); CMS_qqzzbkg_a9.setVal(0.0389984); CMS_qqzzbkg_a10.setVal(98.6645); CMS_qqzzbkg_a11.setVal(-7.02043); CMS_qqzzbkg_a12.setVal(5694.66); CMS_qqzzbkg_a13.setVal(0.0774525); //*/ } else if (channel == 2){ ///* 4e CMS_qqzzbkg_a0.setVal(111.165); CMS_qqzzbkg_a1.setVal(19.8178); CMS_qqzzbkg_a2.setVal(120.89); CMS_qqzzbkg_a3.setVal(0.0546639); CMS_qqzzbkg_a4.setVal(184.878); CMS_qqzzbkg_a5.setVal(11.7041); CMS_qqzzbkg_a6.setVal(33.2659); CMS_qqzzbkg_a7.setVal(0.140858); CMS_qqzzbkg_a8.setVal(56.1226); CMS_qqzzbkg_a9.setVal(0.0957699); CMS_qqzzbkg_a10.setVal(98.3662); CMS_qqzzbkg_a11.setVal(-6.98701); CMS_qqzzbkg_a12.setVal(10.0536); CMS_qqzzbkg_a13.setVal(0.110576); //*/ } else if (channel == 3){ ///* 2e2mu CMS_qqzzbkg_a0.setVal(110.293); CMS_qqzzbkg_a1.setVal(11.8334); CMS_qqzzbkg_a2.setVal(116.91); CMS_qqzzbkg_a3.setVal(0.0433151); CMS_qqzzbkg_a4.setVal(185.817); CMS_qqzzbkg_a5.setVal(10.5945); CMS_qqzzbkg_a6.setVal(29.6208); CMS_qqzzbkg_a7.setVal(0.0826); CMS_qqzzbkg_a8.setVal(53.1346); CMS_qqzzbkg_a9.setVal(0.0882081); CMS_qqzzbkg_a10.setVal(85.3776); CMS_qqzzbkg_a11.setVal(-13.3836); CMS_qqzzbkg_a12.setVal(7587.95); CMS_qqzzbkg_a13.setVal(0.325621); //*/ } else { cout << "disaster" << endl; } RooqqZZPdf_v2* bkg_qqzz = new RooqqZZPdf_v2("bkg_qqzz","bkg_qqzz",*ZZMass, CMS_qqzzbkg_a0,CMS_qqzzbkg_a1,CMS_qqzzbkg_a2,CMS_qqzzbkg_a3,CMS_qqzzbkg_a4, CMS_qqzzbkg_a5,CMS_qqzzbkg_a6,CMS_qqzzbkg_a7,CMS_qqzzbkg_a8, CMS_qqzzbkg_a9,CMS_qqzzbkg_a10,CMS_qqzzbkg_a11,CMS_qqzzbkg_a12,CMS_qqzzbkg_a13); RooArgSet myASet(*ZZMass, CMS_qqzzbkg_a0,CMS_qqzzbkg_a1,CMS_qqzzbkg_a2,CMS_qqzzbkg_a3,CMS_qqzzbkg_a4, CMS_qqzzbkg_a5,CMS_qqzzbkg_a6,CMS_qqzzbkg_a7); myASet.add(CMS_qqzzbkg_a8); myASet.add(CMS_qqzzbkg_a9); myASet.add(CMS_qqzzbkg_a10); myASet.add(CMS_qqzzbkg_a11); myASet.add(CMS_qqzzbkg_a12); myASet.add(CMS_qqzzbkg_a13); RooFitResult *r1 = bkg_qqzz->fitTo( *set, Save(kTRUE), SumW2Error(kTRUE) );//, Save(kTRUE), SumW2Error(kTRUE)) ; cout << endl; cout << "------- Parameters for " << schannel << " sqrts=" << sqrts << endl; cout << " a0_bkgd = " << CMS_qqzzbkg_a0.getVal() << endl; cout << " a1_bkgd = " << CMS_qqzzbkg_a1.getVal() << endl; cout << " a2_bkgd = " << CMS_qqzzbkg_a2.getVal() << endl; cout << " a3_bkgd = " << CMS_qqzzbkg_a3.getVal() << endl; cout << " a4_bkgd = " << CMS_qqzzbkg_a4.getVal() << endl; cout << " a5_bkgd = " << CMS_qqzzbkg_a5.getVal() << endl; cout << " a6_bkgd = " << CMS_qqzzbkg_a6.getVal() << endl; cout << " a7_bkgd = " << CMS_qqzzbkg_a7.getVal() << endl; cout << " a8_bkgd = " << CMS_qqzzbkg_a8.getVal() << endl; cout << " a9_bkgd = " << CMS_qqzzbkg_a9.getVal() << endl; cout << " a10_bkgd = " << CMS_qqzzbkg_a10.getVal() << endl; cout << " a11_bkgd = " << CMS_qqzzbkg_a11.getVal() << endl; cout << " a12_bkgd = " << CMS_qqzzbkg_a12.getVal() << endl; cout << " a13_bkgd = " << CMS_qqzzbkg_a13.getVal() << endl; cout << "}" << endl; cout << "---------------------------" << endl; of << "qqZZshape a0_bkgd " << CMS_qqzzbkg_a0.getVal() << endl; of << "qqZZshape a1_bkgd " << CMS_qqzzbkg_a1.getVal() << endl; of << "qqZZshape a2_bkgd " << CMS_qqzzbkg_a2.getVal() << endl; of << "qqZZshape a3_bkgd " << CMS_qqzzbkg_a3.getVal() << endl; of << "qqZZshape a4_bkgd " << CMS_qqzzbkg_a4.getVal() << endl; of << "qqZZshape a5_bkgd " << CMS_qqzzbkg_a5.getVal() << endl; of << "qqZZshape a6_bkgd " << CMS_qqzzbkg_a6.getVal() << endl; of << "qqZZshape a7_bkgd " << CMS_qqzzbkg_a7.getVal() << endl; of << "qqZZshape a8_bkgd " << CMS_qqzzbkg_a8.getVal() << endl; of << "qqZZshape a9_bkgd " << CMS_qqzzbkg_a9.getVal() << endl; of << "qqZZshape a10_bkgd " << CMS_qqzzbkg_a10.getVal() << endl; of << "qqZZshape a11_bkgd " << CMS_qqzzbkg_a11.getVal() << endl; of << "qqZZshape a12_bkgd " << CMS_qqzzbkg_a12.getVal() << endl; of << "qqZZshape a13_bkgd " << CMS_qqzzbkg_a13.getVal() << endl; of << endl << endl; of.close(); cout << endl << "Output written to: " << outfile << endl; double qqzznorm; if (channel == 1) qqzznorm = 20.5836; else if (channel == 2) qqzznorm = 13.8871; else if (channel == 3) qqzznorm = 32.9883; else { cout << "disaster!" << endl; } ZZMass->setRange("fullrange",100.,1000.); ZZMass->setRange("largerange",100.,600.); ZZMass->setRange("zoomrange",100.,200.); double rescale = qqzznorm/totalweight; double rescale_z = qqzznorm/totalweight_z; cout << "rescale: " << rescale << ", rescale_z: " << rescale_z << endl; // Plot m4l and RooPlot* frameM4l = ZZMass->frame(Title("M4L"),Range(100,600),Bins(250)) ; set->plotOn(frameM4l, MarkerStyle(20), Rescale(rescale)) ; //set->plotOn(frameM4l) ; RooPlot* frameM4lz = ZZMass->frame(Title("M4L"),Range(100,200),Bins(100)) ; set->plotOn(frameM4lz, MarkerStyle(20), Rescale(rescale)) ; int iLineColor = 1; string lab = "blah"; if (channel == 1) { iLineColor = 2; lab = "4#mu"; } if (channel == 3) { iLineColor = 4; lab = "2e2#mu"; } if (channel == 2) { iLineColor = 6; lab = "4e"; } bkg_qqzz->plotOn(frameM4l,LineColor(iLineColor),NormRange("largerange")) ; bkg_qqzz->plotOn(frameM4lz,LineColor(iLineColor),NormRange("zoomrange")) ; //second shape to compare with (if previous comparison code unceommented) //bkg_qqzz_bkgd->plotOn(frameM4l,LineColor(1),NormRange("largerange")) ; //bkg_qqzz_bkgd->plotOn(frameM4lz,LineColor(1),NormRange("zoomrange")) ; double normalizationBackground_qqzz = bkg_qqzz->createIntegral( RooArgSet(*ZZMass), Range("fullrange") )->getVal(); cout << "Norm all = " << normalizationBackground_qqzz << endl; frameM4l->GetXaxis()->SetTitle("m_{4l} [GeV]"); frameM4l->GetYaxis()->SetTitle("a.u."); frameM4lz->GetXaxis()->SetTitle("m_{4l} [GeV]"); frameM4lz->GetYaxis()->SetTitle("a.u."); char lname[192]; sprintf(lname,"qq #rightarrow ZZ #rightarrow %s", lab.c_str() ); char lname2[192]; sprintf(lname2,"Shape Model, %s", lab.c_str() ); // dummy! TF1* dummyF = new TF1("dummyF","1",0.,1.); TH1F* dummyH = new TH1F("dummyH","",1, 0.,1.); dummyF->SetLineColor( iLineColor ); dummyF->SetLineWidth( 2 ); dummyH->SetLineColor( kBlue ); TLegend * box2 = new TLegend(0.4,0.70,0.80,0.90); box2->SetFillColor(0); box2->SetBorderSize(0); box2->AddEntry(dummyH,"Simulation (POWHEG+Pythia) ","pe"); box2->AddEntry(dummyH,lname,""); box2->AddEntry(dummyH,"",""); box2->AddEntry(dummyF,lname2,"l"); TPaveText *pt = new TPaveText(0.15,0.955,0.4,0.99,"NDC"); pt->SetFillColor(0); pt->SetBorderSize(0); pt->AddText("CMS Preliminary 2012"); TPaveText *pt2 = new TPaveText(0.84,0.955,0.99,0.99,"NDC"); pt2->SetFillColor(0); pt2->SetBorderSize(0); TString entag;entag.Form("#sqrt{s} = %d TeV",sqrts); pt2->AddText(entag.Data()); TCanvas *c = new TCanvas("c","c",800,600); c->cd(); frameM4l->Draw(); frameM4l->GetYaxis()->SetRangeUser(0,0.4); if(channel == 3)frameM4l->GetYaxis()->SetRangeUser(0,0.7); box2->Draw(); pt->Draw(); pt2->Draw(); TString outputPath = "bkgFigs"; outputPath = outputPath+ (long) sqrts + "TeV/"; TString outputName; if(VBFtag<2) outputName = outputPath + "bkgqqzz_" + schannel + "_" + Form("%d",int(VBFtag)); if(VBFtag==2) outputName = outputPath + "bkgqqzz_" + schannel; c->SaveAs(outputName + ".eps"); c->SaveAs(outputName + ".png"); TCanvas *c2 = new TCanvas("c2","c2",1000,500); c2->Divide(2,1); c2->cd(1); frameM4l->Draw(); box2->Draw("same"); c2->cd(2); frameM4lz->Draw(); box2->Draw("same"); if (VBFtag<2) outputName = outputPath + "bkgqqzz_" + schannel + "_z" + "_" + Form("%d",int(VBFtag)); if (VBFtag==2) outputName = outputPath + "bkgqqzz_" + schannel + "_z"; c2->SaveAs(outputName + ".eps"); c2->SaveAs(outputName + ".png"); /* TO make the ratio btw 2 shapes, if needed for compairson TCanvas *c3 = new TCanvas("c3","c3",1000,500); if(sqrts==7) sprintf(outputName, "bkgFigs7TeV/bkgqqzz_%s_ratio.eps",schannel.c_str()); else if(sqrts==8) sprintf(outputName, "bkgFigs8TeV/bkgqqzz_%s_ratio.eps",schannel.c_str()); const int nPoints = 501.; double masses[nPoints] ; int j=0; for (int i=100; i<601; i++){ masses[j] = i; j++; } cout<<j<<endl; double effDiff[nPoints]; for (int i = 0; i < nPoints; i++){ ZZMass->setVal(masses[i]); double eval = (bkg_qqzz_bkgd->getVal(otherASet)-bkg_qqzz->getVal(myASet))/(bkg_qqzz->getVal(myASet)); //cout<<bkg_qqzz_bkgd->getVal(otherASet)<<" "<<bkg_qqzz->getVal(myASet)<<" "<<eval<<endl; effDiff[i]=eval; } TGraph* grEffDiff = new TGraph( nPoints, masses, effDiff ); grEffDiff->SetMarkerStyle(20); grEffDiff->Draw("AL"); //c3->SaveAs(outputName); */ if (VBFtag<2) outputName = outputPath + "bkgqqzz_" + schannel + "_z" + "_" + Form("%d",int(VBFtag)) + ".root"; if (VBFtag==2) outputName = outputPath + "bkgqqzz_" + schannel + "_z" + ".root"; TFile* outF = new TFile(outputName,"RECREATE"); outF->cd(); c2->Write(); frameM4l->Write(); frameM4lz->Write(); outF->Close(); delete c; delete c2; }
//void RunToyScan5(TString fileName, double startVal, double stopVal, TString outFile) { void frequentist(TString fileName) { cout << "Starting frequentist " << time(NULL) << endl; double startVal = 0; double stopVal = 200; TString outFile = ""; int nToys = 1 ; int nscanpoints = 2 ; /* gROOT->LoadMacro("RooBetaPdf.cxx+") ; gROOT->LoadMacro("RooRatio.cxx+") ; gROOT->LoadMacro("RooPosDefCorrGauss.cxx+") ; */ // get relevant objects out of the "ws" file TFile *file = TFile::Open(fileName); if(!file){ cout <<"file not found" << endl; return; } RooWorkspace* w = (RooWorkspace*) file->Get("workspace"); if(!w){ cout <<"workspace not found" << endl; return; } ModelConfig* mc = (ModelConfig*) w->obj("S+B_model"); RooAbsData* data = w->data("data"); if( !data || !mc ){ w->Print(); cout << "data or ModelConfig was not found" <<endl; return; } RooRealVar* myPOI = (RooRealVar*) mc->GetParametersOfInterest()->first(); myPOI->setRange(0, 1000.); ModelConfig* bModel = (ModelConfig*) w->obj("B_model"); ModelConfig* sbModel = (ModelConfig*) w->obj("S+B_model"); ProfileLikelihoodTestStat profll(*sbModel->GetPdf()); profll.SetPrintLevel(2); profll.SetOneSided(1); TestStatistic * testStat = &profll; HypoTestCalculatorGeneric * hc = 0; hc = new FrequentistCalculator(*data, *bModel, *sbModel); ToyMCSampler *toymcs = (ToyMCSampler*)hc->GetTestStatSampler(); toymcs->SetMaxToys(10000); toymcs->SetNEventsPerToy(1); toymcs->SetTestStatistic(testStat); ((FrequentistCalculator *)hc)->SetToys(nToys,nToys); HypoTestInverter calc(*hc); calc.SetConfidenceLevel(0.95); calc.UseCLs(true); //calc.SetVerbose(true); calc.SetVerbose(2); cout << "About to set fixed scan " << time(NULL) << endl; calc.SetFixedScan(nscanpoints,startVal,stopVal); cout << "About to do inverter " << time(NULL) << endl; HypoTestInverterResult * res_toysCLs_calculator = calc.GetInterval(); cout << "CLs = " << res_toysCLs_calculator->UpperLimit() << " CLs_exp = " << res_toysCLs_calculator->GetExpectedUpperLimit(0) << " CLs_exp(-1s) = " << res_toysCLs_calculator->GetExpectedUpperLimit(-1) << " CLs_exp(+1s) = " << res_toysCLs_calculator->GetExpectedUpperLimit(1) << endl ; /* // dump results string to output file ofstream outStream ; outStream.open(outFile,ios::app) ; outStream << "CLs = " << res_toysCLs_calculator->UpperLimit() << " CLs_exp = " << res_toysCLs_calculator->GetExpectedUpperLimit(0) << " CLs_exp(-1s) = " << res_toysCLs_calculator->GetExpectedUpperLimit(-1) << " CLs_exp(+1s) = " << res_toysCLs_calculator->GetExpectedUpperLimit(1) << endl ; outStream.close() ; */ cout << "End of frequentist " << time(NULL) << endl; return ; }
void LeptonPreselectionCMG( PreselType type, RooWorkspace * w ) { const Options & opt = Options::getInstance(); if (type == ELE) cout << "Running Electron Preselection :" << endl; else if (type == MU) cout << "Running Muon Preselection :" << endl; else if (type == EMU) cout << "Running Electron-Muon Preselection() ..." << endl; else if (type == PHOT) cout << "Running Photon Preselection :" << endl; string systVar; try { systVar = opt.checkStringOption("SYSTEMATIC_VAR"); } catch (const std::string & exc) { cout << exc << endl; } if (systVar == "NONE") systVar.clear(); #ifdef CMSSWENV JetCorrectionUncertainty jecUnc("Summer13_V4_MC_Uncertainty_AK5PFchs.txt"); #endif string inputDir = opt.checkStringOption("INPUT_DIR"); string outputDir = opt.checkStringOption("OUTPUT_DIR"); string sampleName = opt.checkStringOption("SAMPLE_NAME"); string inputFile = inputDir + '/' + sampleName + ".root"; cout << "\tInput file: " << inputFile << endl; bool isSignal = opt.checkBoolOption("SIGNAL"); TGraph * higgsW = 0; TGraph * higgsI = 0; if (isSignal) { double higgsM = opt.checkDoubleOption("HIGGS_MASS"); if (higgsM >= 400) { string dirName = "H" + double2string(higgsM); bool isVBF = opt.checkBoolOption("VBF"); string lshapeHistName = "cps"; string intHistName = "nominal"; if (systVar == "LSHAPE_UP") { intHistName = "up"; } else if (systVar == "LSHAPE_DOWN") { intHistName = "down"; } if (isVBF) { TFile weightFile("VBF_LineShapes.root"); higgsW = (TGraph *) ( (TDirectory *) weightFile.Get(dirName.c_str()))->Get( lshapeHistName.c_str() )->Clone(); } else { TFile weightFile("GG_LineShapes.root"); higgsW = (TGraph *) ( (TDirectory *) weightFile.Get(dirName.c_str()))->Get( lshapeHistName.c_str() )->Clone(); TFile interfFile("newwgts_interf.root"); higgsI = (TGraph *) ( (TDirectory *) interfFile.Get(dirName.c_str()))->Get( intHistName.c_str() )->Clone(); } } } TFile * file = new TFile( inputFile.c_str() ); if (!file->IsOpen()) throw string("ERROR: Can't open the file: " + inputFile + "!"); TDirectory * dir = (TDirectory *) file->Get("dataAnalyzer"); TH1D * nEvHisto = (TH1D *) dir->Get("cutflow"); TH1D * puHisto = (TH1D *) dir->Get("pileup"); TTree * tree = ( TTree * ) dir->Get( "data" ); Event ev( tree ); const int * runP = ev.getSVA<int>("run"); const int * lumiP = ev.getSVA<int>("lumi"); const int * eventP = ev.getSVA<int>("event"); const bool * trigBits = ev.getAVA<bool>("t_bits"); const int * trigPres = ev.getAVA<int>("t_prescale"); const float * metPtA = ev.getAVA<float>("met_pt"); const float * metPhiA = ev.getAVA<float>("met_phi"); const float * rhoP = ev.getSVA<float>("rho"); const float * rho25P = ev.getSVA<float>("rho25"); const int * nvtxP = ev.getSVA<int>("nvtx"); const int * niP = ev.getSVA<int>("ngenITpu"); #ifdef PRINTEVENTS string eventFileName; if (type == ELE) eventFileName = "events_ele.txt"; else if (type == MU) eventFileName = "events_mu.txt"; else if (type == EMU) eventFileName = "events_emu.txt"; EventPrinter evPrint(ev, type, eventFileName); evPrint.readInEvents("diff.txt"); evPrint.printElectrons(); evPrint.printMuons(); evPrint.printZboson(); evPrint.printJets(); evPrint.printHeader(); #endif string outputFile = outputDir + '/' + sampleName; if (systVar.size()) outputFile += ('_' + systVar); if (type == ELE) outputFile += "_elePresel.root"; else if (type == MU) outputFile += "_muPresel.root"; else if (type == EMU) outputFile += "_emuPresel.root"; else if (type == PHOT) outputFile += "_phPresel.root"; cout << "\tOutput file: " << outputFile << endl; TFile * out = new TFile( outputFile.c_str(), "recreate" ); TH1D * outNEvHisto = new TH1D("nevt", "nevt", 1, 0, 1); outNEvHisto->SetBinContent(1, nEvHisto->GetBinContent(1)); outNEvHisto->Write("nevt"); TH1D * outPuHisto = new TH1D( *puHisto ); outPuHisto->Write("pileup"); std::vector< std::tuple<std::string, std::string> > eleVars; eleVars.push_back( std::make_tuple("ln_px", "F") ); eleVars.push_back( std::make_tuple("ln_py", "F") ); eleVars.push_back( std::make_tuple("ln_pz", "F") ); eleVars.push_back( std::make_tuple("ln_en", "F") ); eleVars.push_back( std::make_tuple("ln_idbits", "I") ); eleVars.push_back( std::make_tuple("ln_d0", "F") ); eleVars.push_back( std::make_tuple("ln_dZ", "F") ); eleVars.push_back( std::make_tuple("ln_nhIso03", "F") ); eleVars.push_back( std::make_tuple("ln_gIso03", "F") ); eleVars.push_back( std::make_tuple("ln_chIso03", "F") ); eleVars.push_back( std::make_tuple("ln_trkLostInnerHits", "F") ); std::vector< std::tuple<std::string, std::string> > addEleVars; addEleVars.push_back( std::make_tuple("egn_sceta", "F") ); addEleVars.push_back( std::make_tuple("egn_detain", "F") ); addEleVars.push_back( std::make_tuple("egn_dphiin", "F") ); addEleVars.push_back( std::make_tuple("egn_sihih", "F") ); addEleVars.push_back( std::make_tuple("egn_hoe", "F") ); addEleVars.push_back( std::make_tuple("egn_ooemoop", "F") ); addEleVars.push_back( std::make_tuple("egn_isConv", "B") ); std::vector< std::tuple<std::string, std::string> > muVars; muVars.push_back( std::make_tuple("ln_px", "F") ); muVars.push_back( std::make_tuple("ln_py", "F") ); muVars.push_back( std::make_tuple("ln_pz", "F") ); muVars.push_back( std::make_tuple("ln_en", "F") ); muVars.push_back( std::make_tuple("ln_idbits", "I") ); muVars.push_back( std::make_tuple("ln_d0", "F") ); muVars.push_back( std::make_tuple("ln_dZ", "F") ); muVars.push_back( std::make_tuple("ln_nhIso04", "F") ); muVars.push_back( std::make_tuple("ln_gIso04", "F") ); muVars.push_back( std::make_tuple("ln_chIso04", "F") ); muVars.push_back( std::make_tuple("ln_puchIso04", "F") ); muVars.push_back( std::make_tuple("ln_trkchi2", "F") ); muVars.push_back( std::make_tuple("ln_trkValidPixelHits", "F") ); std::vector< std::tuple<std::string, std::string> > addMuVars; addMuVars.push_back( std::make_tuple("mn_trkLayersWithMeasurement", "F") ); addMuVars.push_back( std::make_tuple("mn_pixelLayersWithMeasurement", "F") ); addMuVars.push_back( std::make_tuple("mn_innerTrackChi2", "F") ); addMuVars.push_back( std::make_tuple("mn_validMuonHits", "F") ); addMuVars.push_back( std::make_tuple("mn_nMatchedStations", "F") ); unsigned run; unsigned lumi; unsigned event; double pfmet; int nele; int nmu; int nsoftmu; double l1pt; double l1eta; double l1phi; double l2pt; double l2eta; double l2phi; double zmass; double zpt; double zeta; double mt; int nsoftjet; int nhardjet; double maxJetBTag; double minDeltaPhiJetMet; double detajj; double mjj; int nvtx; int ni; int category; double weight; double hmass; double hweight; TTree * smallTree = new TTree("HZZ2l2nuAnalysis", "HZZ2l2nu Analysis Tree"); smallTree->Branch( "Run", &run, "Run/i" ); smallTree->Branch( "Lumi", &lumi, "Lumi/i" ); smallTree->Branch( "Event", &event, "Event/i" ); smallTree->Branch( "PFMET", &pfmet, "PFMET/D" ); smallTree->Branch( "NELE", &nele, "NELE/I" ); smallTree->Branch( "NMU", &nmu, "NMU/I" ); smallTree->Branch( "NSOFTMU", &nsoftmu, "NSOFTMU/I" ); smallTree->Branch( "L1PT", &l1pt, "L1PT/D" ); smallTree->Branch( "L1ETA", &l1eta, "L1ETA/D" ); smallTree->Branch( "L1PHI", &l1phi, "L1PHI/D" ); smallTree->Branch( "L2PT", &l2pt, "L2PT/D" ); smallTree->Branch( "L2ETA", &l2eta, "L2ETA/D" ); smallTree->Branch( "L2PHI", &l2phi, "L2PHI/D" ); smallTree->Branch( "ZMASS", &zmass, "ZMASS/D" ); smallTree->Branch( "ZPT", &zpt, "ZPT/D" ); smallTree->Branch( "ZETA", &zeta, "ZETA/D" ); smallTree->Branch( "MT", &mt, "MT/D" ); smallTree->Branch( "NSOFTJET", &nsoftjet, "NSOFTJET/I" ); smallTree->Branch( "NHARDJET", &nhardjet, "NHARDJET/I" ); smallTree->Branch( "MAXJETBTAG", &maxJetBTag, "MAXJETBTAG/D" ); smallTree->Branch( "MINDPJETMET", &minDeltaPhiJetMet, "MINDPJETMET/D" ); smallTree->Branch( "DETAJJ", &detajj, "DETAJJ/D" ); smallTree->Branch( "MJJ", &mjj, "MJJ/D" ); smallTree->Branch( "NVTX", &nvtx, "NVTX/I" ); smallTree->Branch( "nInter" , &ni, "nInter/I" ); smallTree->Branch( "CATEGORY", &category, "CATEGORY/I" ); smallTree->Branch( "Weight" , &weight, "Weight/D" ); smallTree->Branch( "HMASS", &hmass, "HMASS/D" ); smallTree->Branch( "HWEIGHT", &hweight, "HWEIGHT/D" ); bool isData = opt.checkBoolOption("DATA"); unsigned long nentries = tree->GetEntries(); RooDataSet * events = nullptr; PhotonPrescale photonPrescales; vector<int> thresholds; if (type == PHOT) { if (w == nullptr) throw string("ERROR: No mass peak pdf!"); RooRealVar * zmass = w->var("mass"); zmass->setRange(76.0, 106.0); RooAbsPdf * pdf = w->pdf("massPDF"); events = pdf->generate(*zmass, nentries); photonPrescales.addTrigger("HLT_Photon36_R9Id90_HE10_Iso40_EBOnly", 36, 3, 7); photonPrescales.addTrigger("HLT_Photon50_R9Id90_HE10_Iso40_EBOnly", 50, 5, 8); photonPrescales.addTrigger("HLT_Photon75_R9Id90_HE10_Iso40_EBOnly", 75, 7, 9); photonPrescales.addTrigger("HLT_Photon90_R9Id90_HE10_Iso40_EBOnly", 90, 10, 10); } TH1D ptSpectrum("ptSpectrum", "ptSpectrum", 200, 55, 755); ptSpectrum.Sumw2(); unordered_set<EventAdr> eventsSet; for ( unsigned long iEvent = 0; iEvent < nentries; iEvent++ ) { // if (iEvent < 6060000) // continue; if ( iEvent % 10000 == 0) { cout << string(40, '\b'); cout << setw(10) << iEvent << " / " << setw(10) << nentries << " done ..." << std::flush; } tree->GetEntry( iEvent ); run = -999; lumi = -999; event = -999; pfmet = -999; nele = -999; nmu = -999; nsoftmu = -999; l1pt = -999; l1eta = -999; l1phi = -999; l2pt = -999; l2eta = -999; l2phi = -999; zmass = -999; zpt = -999; zeta = -999; mt = -999; nsoftjet = -999; nhardjet = -999; maxJetBTag = -999; minDeltaPhiJetMet = -999; detajj = -999; mjj = -999; nvtx = -999; ni = -999; weight = -999; category = -1; hmass = -999; hweight = -999; run = *runP; lumi = *lumiP; event = *eventP; EventAdr tmp(run, lumi, event); if (eventsSet.find( tmp ) != eventsSet.end()) { continue; } eventsSet.insert( tmp ); if (type == ELE && isData) { if (trigBits[0] != 1 || trigPres[0] != 1) continue; } if (type == MU && isData) { if ( (trigBits[2] != 1 || trigPres[2] != 1) && (trigBits[3] != 1 || trigPres[3] != 1) && (trigBits[6] != 1 || trigPres[6] != 1) ) continue; } if (type == EMU && isData) { if ( (trigBits[4] != 1 || trigPres[4] != 1) && (trigBits[5] != 1 || trigPres[5] != 1) ) continue; } vector<Electron> electrons = buildLeptonCollection<Electron, 11>(ev, eleVars, addEleVars); vector<Muon> muons = buildLeptonCollection<Muon, 13>(ev, muVars, addMuVars); float rho = *rhoP; float rho25 = *rho25P; vector<Electron> looseElectrons; vector<Electron> selectedElectrons; for (unsigned j = 0; j < electrons.size(); ++j) { try { TLorentzVector lv = electrons[j].lorentzVector(); if ( lv.Pt() > 10 && fabs(lv.Eta()) < 2.5 && !electrons[j].isInCrack() && electrons[j].passesVetoID() && electrons[j].isPFIsolatedLoose(rho25) ) { looseElectrons.push_back(electrons[j]); } if ( lv.Pt() > 20 && fabs(lv.Eta()) < 2.5 && !electrons[j].isInCrack() && electrons[j].passesMediumID() && electrons[j].isPFIsolatedMedium(rho25) ) { selectedElectrons.push_back(electrons[j]); } } catch (const string & exc) { cout << exc << endl; cout << "run = " << run << endl; cout << "lumi = " << lumi << endl; cout << "event = " << event << endl; } } vector<Muon> looseMuons; vector<Muon> softMuons; vector<Muon> selectedMuons; for (unsigned j = 0; j < muons.size(); ++j) { TLorentzVector lv = muons[j].lorentzVector(); if ( lv.Pt() > 10 && fabs(lv.Eta()) < 2.4 && muons[j].isLooseMuon() && muons[j].isPFIsolatedLoose() ) { looseMuons.push_back(muons[j]); } else if ( lv.Pt() > 3 && fabs(lv.Eta()) < 2.4 && muons[j].isSoftMuon() ) { softMuons.push_back(muons[j]); } if ( lv.Pt() > 20 && fabs(lv.Eta()) < 2.4 && muons[j].isTightMuon() && muons[j].isPFIsolatedTight() ) { selectedMuons.push_back(muons[j]); } } vector<Lepton> looseLeptons; for (unsigned i = 0; i < looseElectrons.size(); ++i) looseLeptons.push_back(looseElectrons[i]); for (unsigned i = 0; i < looseMuons.size(); ++i) looseLeptons.push_back(looseMuons[i]); for (unsigned i = 0; i < softMuons.size(); ++i) looseLeptons.push_back(softMuons[i]); #ifdef PRINTEVENTS evPrint.setElectronCollection(selectedElectrons); evPrint.setMuonCollection(selectedMuons); #endif vector<Photon> photons = selectPhotonsCMG( ev ); vector<Photon> selectedPhotons; for (unsigned i = 0; i < photons.size(); ++i) { if (photons[i].isSelected(rho) && photons[i].lorentzVector().Pt() > 55) selectedPhotons.push_back( photons[i] ); } if (type == PHOT) { vector<Electron> tmpElectrons; for (unsigned i = 0; i < selectedPhotons.size(); ++i) { TLorentzVector phVec = selectedPhotons[i].lorentzVector(); for (unsigned j = 0; j < looseElectrons.size(); ++j) { TLorentzVector elVec = looseElectrons[j].lorentzVector(); double dR = deltaR(phVec.Eta(), phVec.Phi(), elVec.Eta(), elVec.Phi()); if ( dR > 0.05 ) tmpElectrons.push_back( looseElectrons[j] ); } } looseElectrons = tmpElectrons; } string leptonsType; Lepton * selectedLeptons[2] = {0}; if (type == ELE) { if (selectedElectrons.size() < 2) { continue; } else { selectedLeptons[0] = &selectedElectrons[0]; selectedLeptons[1] = &selectedElectrons[1]; } } else if (type == MU) { if (selectedMuons.size() < 2) { continue; } else { selectedLeptons[0] = &selectedMuons[0]; selectedLeptons[1] = &selectedMuons[1]; } } else if (type == EMU) { if (selectedElectrons.size() < 1 || selectedMuons.size() < 1) { continue; } else { selectedLeptons[0] = &selectedElectrons[0]; selectedLeptons[1] = &selectedMuons[0]; } } else if (type == PHOT) { if (selectedPhotons.size() != 1) { continue; } } nele = looseElectrons.size(); nmu = looseMuons.size(); nsoftmu = softMuons.size(); TLorentzVector Zcand; if (type == ELE || type == MU || type == EMU) { TLorentzVector lep1 = selectedLeptons[0]->lorentzVector(); TLorentzVector lep2 = selectedLeptons[1]->lorentzVector(); if (lep2.Pt() > lep1.Pt() && type != EMU) { TLorentzVector temp = lep1; lep1 = lep2; lep2 = temp; } l1pt = lep1.Pt(); l1eta = lep1.Eta(); l1phi = lep1.Phi(); l2pt = lep2.Pt(); l2eta = lep2.Eta(); l2phi = lep2.Phi(); Zcand = lep1 + lep2; zmass = Zcand.M(); } else if (type == PHOT) { Zcand = selectedPhotons[0].lorentzVector(); zmass = events->get(iEvent)->getRealValue("mass"); } zpt = Zcand.Pt(); zeta = Zcand.Eta(); if (type == PHOT) { unsigned idx = photonPrescales.getIndex(zpt); if (trigBits[idx]) weight = trigPres[idx]; else continue; ptSpectrum.Fill(zpt, weight); } TLorentzVector met; met.SetPtEtaPhiM(metPtA[0], 0.0, metPhiA[0], 0.0); TLorentzVector clusteredFlux; unsigned mode = 0; if (systVar == "JES_UP") mode = 1; else if (systVar == "JES_DOWN") mode = 2; TLorentzVector jecCorr; #ifdef CMSSWENV vector<Jet> jetsAll = selectJetsCMG( ev, looseLeptons, jecUnc, &jecCorr, mode ); #else vector<Jet> jetsAll = selectJetsCMG( ev, looseLeptons, &jecCorr, mode ); #endif met -= jecCorr; mode = 0; if (systVar == "JER_UP") mode = 1; else if (systVar == "JER_DOWN") mode = 2; TLorentzVector smearCorr = smearJets( jetsAll, mode ); if (isData && smearCorr != TLorentzVector()) throw std::string("Jet smearing corrections different from zero in DATA!"); met -= smearCorr; vector<Jet> selectedJets; for (unsigned i = 0; i < jetsAll.size(); ++i) { if ( jetsAll[i].lorentzVector().Pt() > 10 && fabs(jetsAll[i].lorentzVector().Eta()) < 4.7 && jetsAll[i].passesPUID() && jetsAll[i].passesPFLooseID() ) selectedJets.push_back( jetsAll[i] ); } if (type == PHOT) { vector<Jet> tmpJets; for (unsigned i = 0; i < selectedPhotons.size(); ++i) { TLorentzVector phVec = selectedPhotons[i].lorentzVector(); for (unsigned j = 0; j < selectedJets.size(); ++j) { TLorentzVector jVec = selectedJets[j].lorentzVector(); double dR = deltaR(phVec.Eta(), phVec.Phi(), jVec.Eta(), jVec.Phi()); if ( dR > 0.4 ) tmpJets.push_back( selectedJets[j] ); } } selectedJets = tmpJets; } if (systVar == "UMET_UP" || systVar == "UMET_DOWN") { for (unsigned i = 0; i < jetsAll.size(); ++i) clusteredFlux += jetsAll[i].lorentzVector(); for (unsigned i = 0; i < looseElectrons.size(); ++i) clusteredFlux += looseElectrons[i].lorentzVector(); for (unsigned i = 0; i < looseMuons.size(); ++i) clusteredFlux += looseMuons[i].lorentzVector(); TLorentzVector unclusteredFlux = -(met + clusteredFlux); if (systVar == "UMET_UP") unclusteredFlux *= 1.1; else unclusteredFlux *= 0.9; met = -(clusteredFlux + unclusteredFlux); } if (systVar == "LES_UP" || systVar == "LES_DOWN") { TLorentzVector diff; double sign = 1.0; if (systVar == "LES_DOWN") sign = -1.0; for (unsigned i = 0; i < looseElectrons.size(); ++i) { TLorentzVector tempEle = looseElectrons[i].lorentzVector(); if (looseElectrons[i].isEB()) diff += sign * 0.02 * tempEle; else diff += sign * 0.05 * tempEle; } for (unsigned i = 0; i < looseMuons.size(); ++i) diff += sign * 0.01 * looseMuons[i].lorentzVector(); met -= diff; } pfmet = met.Pt(); double px = met.Px() + Zcand.Px(); double py = met.Py() + Zcand.Py(); double pt2 = px * px + py * py; double e = sqrt(zpt * zpt + zmass * zmass) + sqrt(pfmet * pfmet + zmass * zmass); double mt2 = e * e - pt2; mt = (mt2 > 0) ? sqrt(mt2) : 0; vector<Jet> hardjets; vector<Jet> softjets; maxJetBTag = -999; minDeltaPhiJetMet = 999; for ( unsigned j = 0; j < selectedJets.size(); ++j ) { TLorentzVector jet = selectedJets[j].lorentzVector(); if ( jet.Pt() > 30 ) { hardjets.push_back( selectedJets[j] ); } if ( jet.Pt() > 15 ) softjets.push_back( selectedJets[j] ); } nhardjet = hardjets.size(); nsoftjet = softjets.size(); // if ( type == PHOT && nsoftjet == 0 ) // continue; if (nhardjet > 1) { sort(hardjets.begin(), hardjets.end(), [](const Jet & a, const Jet & b) { return a.lorentzVector().Pt() > b.lorentzVector().Pt(); }); TLorentzVector jet1 = hardjets[0].lorentzVector(); TLorentzVector jet2 = hardjets[1].lorentzVector(); const double maxEta = max( jet1.Eta(), jet2.Eta() ); const double minEta = min( jet1.Eta(), jet2.Eta() ); bool passCJV = true; for (unsigned j = 2; j < hardjets.size(); ++j) { double tmpEta = hardjets[j].lorentzVector().Eta(); if ( tmpEta > minEta && tmpEta < maxEta ) passCJV = false; } const double tmpDelEta = std::fabs(jet2.Eta() - jet1.Eta()); TLorentzVector diJetSystem = jet1 + jet2; const double tmpMass = diJetSystem.M(); if ( type == PHOT) { if (passCJV && tmpDelEta > 4.0 && tmpMass > 500 && zeta > minEta && maxEta > zeta) { detajj = tmpDelEta; mjj = tmpMass; } } else { if (passCJV && tmpDelEta > 4.0 && tmpMass > 500 && l1eta > minEta && l2eta > minEta && maxEta > l1eta && maxEta > l2eta) { detajj = tmpDelEta; mjj = tmpMass; } } } category = evCategory(nhardjet, nsoftjet, detajj, mjj, type == PHOT); minDeltaPhiJetMet = 10; for ( unsigned j = 0; j < hardjets.size(); ++j ) { TLorentzVector jet = hardjets[j].lorentzVector(); if ( hardjets[j].getVarF("jn_jp") > maxJetBTag && fabs(jet.Eta()) < 2.5 ) maxJetBTag = hardjets[j].getVarF("jn_jp"); double tempDelPhiJetMet = deltaPhi(met.Phi(), jet.Phi()); if ( tempDelPhiJetMet < minDeltaPhiJetMet ) minDeltaPhiJetMet = tempDelPhiJetMet; } nvtx = *nvtxP; if (isData) ni = -1; else ni = *niP; if (isSignal) { const int nMC = ev.getSVV<int>("mcn"); const int * mcID = ev.getAVA<int>("mc_id"); int hIdx = 0; for (; hIdx < nMC; ++hIdx) if (fabs(mcID[hIdx]) == 25) break; if (hIdx == nMC) throw string("ERROR: Higgs not found in signal sample!"); float Hpx = ev.getAVV<float>("mc_px", hIdx); float Hpy = ev.getAVV<float>("mc_py", hIdx); float Hpz = ev.getAVV<float>("mc_pz", hIdx); float Hen = ev.getAVV<float>("mc_en", hIdx); TLorentzVector higgs; higgs.SetPxPyPzE( Hpx, Hpy, Hpz, Hen ); hmass = higgs.M(); if (higgsW) { hweight = higgsW->Eval(hmass); if (higgsI) hweight *= higgsI->Eval(hmass); } else hweight = 1; } if ( opt.checkBoolOption("ADDITIONAL_LEPTON_VETO") && (type == ELE || type == MU || type == EMU) && ((nele + nmu + nsoftmu) > 2) ) continue; if ( opt.checkBoolOption("ADDITIONAL_LEPTON_VETO") && (type == PHOT) && ((nele + nmu + nsoftmu) > 0) ) continue; if ( opt.checkBoolOption("ZPT_CUT") && zpt < 55 ) continue; // for different background estimation methods different window should be applied: // * sample for photons should have 76.0 < zmass < 106.0 // * sample for non-resonant background should not have this cut applied if ( opt.checkBoolOption("TIGHT_ZMASS_CUT") && (type == ELE || type == MU) && (zmass < 76.0 || zmass > 106.0)) continue; if ( opt.checkBoolOption("WIDE_ZMASS_CUT") && (type == ELE || type == MU) && (zmass < 76.0 || zmass > 106.0)) continue; if ( opt.checkBoolOption("BTAG_CUT") && ( maxJetBTag > 0.264) ) continue; if ( opt.checkBoolOption("DPHI_CUT") && ( minDeltaPhiJetMet < 0.5) ) continue; #ifdef PRINTEVENTS evPrint.setJetCollection(hardjets); evPrint.setMET(met); evPrint.setMT(mt); string channelType; if (type == ELE) channelType = "ee"; else if (type == MU) channelType = "mumu"; else if (type == EMU) channelType = "emu"; if (category == 1) channelType += "eq0jets"; else if (category == 2) channelType += "geq1jets"; else channelType += "vbf"; evPrint.setChannel(channelType); unsigned bits = 0; bits |= (0x7); bits |= ((zmass > 76.0 && zmass < 106.0) << 3); bits |= ((zpt > 55) << 4); bits |= (((nele + nmu + nsoftmu) == 2) << 5); bits |= ((maxJetBTag < 0.275) << 6); bits |= ((minDeltaPhiJetMet > 0.5) << 7); evPrint.setBits(bits); evPrint.print(); #endif smallTree->Fill(); } cout << endl; TCanvas canv("canv", "canv", 800, 600); //effNum.Sumw2(); //effDen.Sumw2(); //effNum.Divide(&effDen); //effNum.Draw(); canv.SetGridy(); canv.SetGridx(); //canv.SaveAs("triggEff.ps"); //canv.Clear(); ptSpectrum.SetMarkerStyle(20); ptSpectrum.SetMarkerSize(0.5); ptSpectrum.Draw("P0E"); //ptSpectrum.Draw("COLZ"); canv.SetLogy(); canv.SaveAs("ptSpectrum.ps"); delete file; smallTree->Write("", TObject::kOverwrite); delete smallTree; delete out; }
TH1D* runSig(RooWorkspace* ws, const char* modelConfigName = "ModelConfig", const char* dataName = "obsData", const char* asimov1DataName = "asimovData_1", const char* conditional1Snapshot = "conditionalGlobs_1", const char* nominalSnapshot = "nominalGlobs") { string defaultMinimizer = "Minuit"; // or "Minuit" int defaultStrategy = 2; // Minimization strategy. 0-2. 0 = fastest, least robust. 2 = slowest, most robust double mu_profile_value = 1; // mu value to profile the obs data at wbefore generating the expected bool doUncap = 1; // uncap p0 bool doInj = 0; // setup the poi for injection study (zero is faster if you're not) bool doMedian = 1; // compute median significance bool isBlind = 0; // Dont look at observed data bool doConditional = !isBlind; // do conditional expected data bool doObs = !isBlind; // compute observed significance TStopwatch timer; timer.Start(); if (!ws) { cout << "ERROR::Workspace is NULL!" << endl; return NULL; } ModelConfig* mc = (ModelConfig*)ws->obj(modelConfigName); if (!mc) { cout << "ERROR::ModelConfig: " << modelConfigName << " doesn't exist!" << endl; return NULL; } RooDataSet* data = (RooDataSet*)ws->data(dataName); if (!data) { cout << "ERROR::Dataset: " << dataName << " doesn't exist!" << endl; return NULL; } mc->GetNuisanceParameters()->Print("v"); //RooNLLVar::SetIgnoreZeroEntries(1); ROOT::Math::MinimizerOptions::SetDefaultMinimizer(defaultMinimizer.c_str()); ROOT::Math::MinimizerOptions::SetDefaultStrategy(defaultStrategy); ROOT::Math::MinimizerOptions::SetDefaultPrintLevel(-1); // cout << "Setting max function calls" << endl; //ROOT::Math::MinimizerOptions::SetDefaultMaxFunctionCalls(20000); //RooMinimizer::SetMaxFunctionCalls(10000); ws->loadSnapshot("conditionalNuis_0"); RooArgSet nuis(*mc->GetNuisanceParameters()); RooRealVar* mu = (RooRealVar*)mc->GetParametersOfInterest()->first(); RooAbsPdf* pdf_temp = mc->GetPdf(); string condSnapshot(conditional1Snapshot); RooArgSet nuis_tmp2 = *mc->GetNuisanceParameters(); RooNLLVar* obs_nll = doObs ? (RooNLLVar*)pdf_temp->createNLL(*data, Constrain(nuis_tmp2)) : NULL; RooDataSet* asimovData1 = (RooDataSet*)ws->data(asimov1DataName); if (!asimovData1) { cout << "Asimov data doesn't exist! Please, allow me to build one for you..." << endl; string mu_str, mu_prof_str; asimovData1 = makeAsimovData(mc, doConditional, ws, obs_nll, 1, &mu_str, &mu_prof_str, mu_profile_value, true); condSnapshot="conditionalGlobs"+mu_prof_str; //makeAsimovData(mc, true, ws, mc->GetPdf(), data, 0); //ws->Print(); //asimovData1 = (RooDataSet*)ws->data("asimovData_1"); } if (!doUncap) mu->setRange(0, 40); else mu->setRange(-40, 40); RooAbsPdf* pdf = mc->GetPdf(); RooArgSet nuis_tmp1 = *mc->GetNuisanceParameters(); RooNLLVar* asimov_nll = (RooNLLVar*)pdf->createNLL(*asimovData1, Constrain(nuis_tmp1)); //do asimov mu->setVal(1); mu->setConstant(0); if (!doInj) mu->setConstant(1); int status,sign; double med_sig=0,obs_sig=0,asimov_q0=0,obs_q0=0; if (doMedian) { ws->loadSnapshot(condSnapshot.c_str()); if (doInj) ws->loadSnapshot("conditionalNuis_inj"); else ws->loadSnapshot("conditionalNuis_1"); mc->GetGlobalObservables()->Print("v"); mu->setVal(0); mu->setConstant(1); status = minimize(asimov_nll, ws); if (status >= 0) cout << "Success!" << endl; if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll, ws); if (status >= 0) cout << "Success!" << endl; } double asimov_nll_cond = asimov_nll->getVal(); mu->setVal(1); if (doInj) ws->loadSnapshot("conditionalNuis_inj"); else ws->loadSnapshot("conditionalNuis_1"); if (doInj) mu->setConstant(0); status = minimize(asimov_nll, ws); if (status >= 0) cout << "Success!" << endl; if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll, ws); if (status >= 0) cout << "Success!" << endl; } double asimov_nll_min = asimov_nll->getVal(); asimov_q0 = 2*(asimov_nll_cond - asimov_nll_min); if (doUncap && mu->getVal() < 0) asimov_q0 = -asimov_q0; sign = int(asimov_q0 != 0 ? asimov_q0/fabs(asimov_q0) : 0); med_sig = sign*sqrt(fabs(asimov_q0)); ws->loadSnapshot(nominalSnapshot); } if (doObs) { ws->loadSnapshot("conditionalNuis_0"); mu->setVal(0); mu->setConstant(1); status = minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll_cond = obs_nll->getVal(); //ws->loadSnapshot("ucmles"); mu->setConstant(0); status = minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll_min = obs_nll->getVal(); obs_q0 = 2*(obs_nll_cond - obs_nll_min); if (doUncap && mu->getVal() < 0) obs_q0 = -obs_q0; sign = int(obs_q0 == 0 ? 0 : obs_q0 / fabs(obs_q0)); if (!doUncap && ((obs_q0 < 0 && obs_q0 > -0.1) || mu->getVal() < 0.001)) obs_sig = 0; else obs_sig = sign*sqrt(fabs(obs_q0)); } cout << "obs: " << obs_sig << endl; cout << "Observed significance: " << obs_sig << endl; if (med_sig) { cout << "Median test stat val: " << asimov_q0 << endl; cout << "Median significance: " << med_sig << endl; } TH1D* h_hypo = new TH1D("hypo","hypo",2,0,2); h_hypo->SetBinContent(1, obs_sig); h_hypo->SetBinContent(2, med_sig); timer.Stop(); timer.Print(); return h_hypo; }
void eregtesting_13TeV_Eta(bool dobarrel=true, bool doele=false,int gammaID=0) { //output dir TString EEorEB = "EE"; if(dobarrel) { EEorEB = "EB"; } TString gammaDir = "bothGammas"; if(gammaID==1) { gammaDir = "gamma1"; } else if(gammaID==2) { gammaDir = "gamma2"; } TString dirname = TString::Format("ereg_test_plots_Eta/%s_%s",gammaDir.Data(),EEorEB.Data()); gSystem->mkdir(dirname,true); gSystem->cd(dirname); //read workspace from training TString fname; if (doele && dobarrel) fname = "wereg_ele_eb.root"; else if (doele && !dobarrel) fname = "wereg_ele_ee.root"; else if (!doele && dobarrel) fname = "wereg_ph_eb.root"; else if (!doele && !dobarrel) fname = "wereg_ph_ee.root"; TString infile = TString::Format("../../ereg_ws_Eta/%s/%s",gammaDir.Data(),fname.Data()); TFile *fws = TFile::Open(infile); RooWorkspace *ws = (RooWorkspace*)fws->Get("wereg"); //read variables from workspace RooGBRTargetFlex *meantgt = static_cast<RooGBRTargetFlex*>(ws->arg("sigmeant")); RooRealVar *tgtvar = ws->var("tgtvar"); RooArgList vars; vars.add(meantgt->FuncVars()); vars.add(*tgtvar); //read testing dataset from TTree RooRealVar weightvar("weightvar","",1.); TTree *dtree; if (doele) { //TFile *fdin = TFile::Open("root://eoscms.cern.ch//eos/cms/store/cmst3/user/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TFile *fdin = TFile::Open("/data/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterSingleInvert"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } else { //TFile *fdin = TFile::Open("/eos/cms/store/group/dpg_ecal/alca_ecalcalib/piZero2017/zhicaiz/Gun_MultiPion_FlatPt-1To15/Gun_FlatPt1to15_MultiPion_withPhotonPtFilter_pythia8/photons_0_half2.root"); //TFile *fdin = TFile::Open("/eos/cms/store/group/dpg_ecal/alca_ecalcalib/piZero2017/zhicaiz/Gun_MultiEta_FlatPt-1To15/Gun_FlatPt1to15_MultiEta_withPhotonPtFilter_pythia8/photons_22Aug2017_V3_half2.root"); TFile *fdin = TFile::Open("/eos/cms/store/group/dpg_ecal/alca_ecalcalib/piZero2017/zhicaiz/Gun_MultiEta_FlatPt-1To15/Gun_FlatPt1to15_MultiEtaToGG_withPhotonPtFilter_pythia8/photons_20171008_half2.root"); if(gammaID==0) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma"); } else if(gammaID==1) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma1"); } else if(gammaID==2) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma2"); } } //selection cuts for testing //TCut selcut = "(STr2_enG1_true/cosh(STr2_Eta_1)>1.0) && (STr2_S4S9_1>0.75)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (STr2_enG_true/STr2_enG_rec)<3.0 && STr2_EOverEOther < 10.0 && STr2_EOverEOther > 0.1"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (STr2_mPi0_nocor>0.1)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.1) && (STr2_mPi0_nocor < 0.2)"; TCut selcut = ""; if(dobarrel) selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.2) && (STr2_mPi0_nocor < 1.0) && (STr2_ptPi0_nocor > 2.0) && abs(STr2_Eta)<1.479 && (!STr2_fromPi0)"; //if(dobarrel) selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.1) && (STr2_mPi0_nocor < 0.2) && (STr2_ptPi0_nocor > 2.0) && abs(STr2_Eta)<1.479"; else selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.2) && (STr2_mPi0_nocor < 1.0) && (STr2_ptPi0_nocor > 2.0) && abs(STr2_Eta)>1.479 && (!STr2_fromPi0)"; //else selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.1) && (STr2_mPi0_nocor < 0.2) && (STr2_ptPi0_nocor > 2.0) && abs(STr2_Eta)>1.479"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (STr2_iEta_on2520==0 || STr2_iPhi_on20==0) "; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)<60)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)>60)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.9) && (STr2_S2S9>0.85)&& (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)<60)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.9) && (STr2_S2S9>0.85)&& (STr2_isMerging < 2) && (STr2_DeltaR < 0.03)"; /* TCut selcut; if (dobarrel) selcut = "ph.genpt>25. && ph.isbarrel && ph.ispromptgen"; else selcut = "ph.genpt>25. && !ph.isbarrel && ph.ispromptgen"; */ TCut selweight = "xsecweight(procidx)*puweight(numPU,procidx)"; TCut prescale10 = "(Entry$%10==0)"; TCut prescale10alt = "(Entry$%10==1)"; TCut prescale25 = "(Entry$%25==0)"; TCut prescale100 = "(Entry$%100==0)"; TCut prescale1000 = "(Entry$%1000==0)"; TCut evenevents = "(Entry$%2==0)"; TCut oddevents = "(Entry$%2==1)"; TCut prescale100alt = "(Entry$%100==1)"; TCut prescale1000alt = "(Entry$%1000==1)"; TCut prescale50alt = "(Entry$%50==1)"; TCut Events3_4 = "(Entry$%4==3)"; TCut Events1_4 = "(Entry$%4==1)"; TCut Events2_4 = "(Entry$%4==2)"; TCut Events0_4 = "(Entry$%4==0)"; TCut Events01_4 = "(Entry$%4<2)"; TCut Events23_4 = "(Entry$%4>1)"; TCut EventsTest = "(Entry$%2==1)"; //weightvar.SetTitle(EventsTest*selcut); weightvar.SetTitle(selcut); /* if (doele) weightvar.SetTitle(prescale100alt*selcut); else weightvar.SetTitle(selcut); */ //make testing dataset RooDataSet *hdata = RooTreeConvert::CreateDataSet("hdata",dtree,vars,weightvar); if (doele) weightvar.SetTitle(prescale1000alt*selcut); else weightvar.SetTitle(prescale10alt*selcut); //make reduced testing dataset for integration over conditional variables RooDataSet *hdatasmall = RooTreeConvert::CreateDataSet("hdatasmall",dtree,vars,weightvar); //retrieve full pdf from workspace RooAbsPdf *sigpdf = ws->pdf("sigpdf"); //input variable corresponding to sceta RooRealVar *scEraw = ws->var("var_0"); scEraw->setRange(1.,2.); scEraw->setBins(100); // RooRealVar *scetavar = ws->var("var_1"); // RooRealVar *scphivar = ws->var("var_2"); //regressed output functions RooAbsReal *sigmeanlim = ws->function("sigmeanlim"); RooAbsReal *sigwidthlim = ws->function("sigwidthlim"); RooAbsReal *signlim = ws->function("signlim"); RooAbsReal *sign2lim = ws->function("sign2lim"); // RooAbsReal *sigalphalim = ws->function("sigalphalim"); //RooAbsReal *sigalpha2lim = ws->function("sigalpha2lim"); //formula for corrected energy/true energy ( 1.0/(etrue/eraw) * regression mean) RooFormulaVar ecor("ecor","","1./(@0)*@1",RooArgList(*tgtvar,*sigmeanlim)); RooRealVar *ecorvar = (RooRealVar*)hdata->addColumn(ecor); ecorvar->setRange(0.,2.); ecorvar->setBins(800); //formula for raw energy/true energy (1.0/(etrue/eraw)) RooFormulaVar raw("raw","","1./@0",RooArgList(*tgtvar)); RooRealVar *rawvar = (RooRealVar*)hdata->addColumn(raw); rawvar->setRange(0.,2.); rawvar->setBins(800); //clone data and add regression outputs for plotting RooDataSet *hdataclone = new RooDataSet(*hdata,"hdataclone"); RooRealVar *meanvar = (RooRealVar*)hdataclone->addColumn(*sigmeanlim); RooRealVar *widthvar = (RooRealVar*)hdataclone->addColumn(*sigwidthlim); RooRealVar *nvar = (RooRealVar*)hdataclone->addColumn(*signlim); RooRealVar *n2var = (RooRealVar*)hdataclone->addColumn(*sign2lim); // RooRealVar *alphavar = (RooRealVar*)hdataclone->addColumn(*sigalphalim); // RooRealVar *alpha2var = (RooRealVar*)hdataclone->addColumn(*sigalpha2lim); //plot target variable and weighted regression prediction (using numerical integration over reduced testing dataset) TCanvas *craw = new TCanvas; //RooPlot *plot = tgtvar->frame(0.6,1.2,100); RooPlot *plot = tgtvar->frame(0.6,2.0,100); hdata->plotOn(plot); sigpdf->plotOn(plot,ProjWData(*hdatasmall)); plot->Draw(); craw->SaveAs("RawE.pdf"); craw->SaveAs("RawE.png"); craw->SetLogy(); plot->SetMinimum(0.1); craw->SaveAs("RawElog.pdf"); craw->SaveAs("RawElog.png"); //plot distribution of regressed functions over testing dataset TCanvas *cmean = new TCanvas; RooPlot *plotmean = meanvar->frame(0.8,2.0,100); hdataclone->plotOn(plotmean); plotmean->Draw(); cmean->SaveAs("mean.pdf"); cmean->SaveAs("mean.png"); TCanvas *cwidth = new TCanvas; RooPlot *plotwidth = widthvar->frame(0.,0.05,100); hdataclone->plotOn(plotwidth); plotwidth->Draw(); cwidth->SaveAs("width.pdf"); cwidth->SaveAs("width.png"); TCanvas *cn = new TCanvas; RooPlot *plotn = nvar->frame(0.,111.,200); hdataclone->plotOn(plotn); plotn->Draw(); cn->SaveAs("n.pdf"); cn->SaveAs("n.png"); TCanvas *cn2 = new TCanvas; RooPlot *plotn2 = n2var->frame(0.,111.,100); hdataclone->plotOn(plotn2); plotn2->Draw(); cn2->SaveAs("n2.pdf"); cn2->SaveAs("n2.png"); /* TCanvas *calpha = new TCanvas; RooPlot *plotalpha = alphavar->frame(0.,5.,200); hdataclone->plotOn(plotalpha); plotalpha->Draw(); calpha->SaveAs("alpha.pdf"); calpha->SaveAs("alpha.png"); TCanvas *calpha2 = new TCanvas; RooPlot *plotalpha2 = alpha2var->frame(0.,5.,200); hdataclone->plotOn(plotalpha2); plotalpha2->Draw(); calpha2->SaveAs("alpha2.pdf"); calpha2->SaveAs("alpha2.png"); */ /* TCanvas *ceta = new TCanvas; RooPlot *ploteta = scetavar->frame(-2.6,2.6,200); hdataclone->plotOn(ploteta); ploteta->Draw(); ceta->SaveAs("eta.pdf"); ceta->SaveAs("eta.png"); */ //create histograms for eraw/etrue and ecor/etrue to quantify regression performance TH1 *heraw;// = hdata->createHistogram("hraw",*rawvar,Binning(800,0.,2.)); TH1 *hecor;// = hdata->createHistogram("hecor",*ecorvar); if (EEorEB == "EB") { heraw = hdata->createHistogram("hraw",*rawvar,Binning(800,0.,2.0)); hecor = hdata->createHistogram("hecor",*ecorvar, Binning(800,0.,2.0)); } else { heraw = hdata->createHistogram("hraw",*rawvar,Binning(200,0.,2.)); hecor = hdata->createHistogram("hecor",*ecorvar, Binning(200,0.,2.)); } //heold->SetLineColor(kRed); hecor->SetLineColor(kBlue); heraw->SetLineColor(kMagenta); hecor->GetYaxis()->SetRangeUser(1.0,1.3*hecor->GetMaximum()); heraw->GetYaxis()->SetRangeUser(1.0,1.3*hecor->GetMaximum()); hecor->GetXaxis()->SetRangeUser(0.0,1.5); heraw->GetXaxis()->SetRangeUser(0.0,1.5); /*if(EEorEB == "EE") { heraw->GetYaxis()->SetRangeUser(10.0,200.0); hecor->GetYaxis()->SetRangeUser(10.0,200.0); } */ //heold->GetXaxis()->SetRangeUser(0.6,1.2); double effsigma_cor, effsigma_raw, fwhm_cor, fwhm_raw; if(EEorEB == "EB") { TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(800,0.,2.)); effsigma_cor = effSigma(hecorfine); fwhm_cor = FWHM(hecorfine); TH1 *herawfine = hdata->createHistogram("herawfine",*rawvar,Binning(800,0.,2.)); effsigma_raw = effSigma(herawfine); fwhm_raw = FWHM(herawfine); } else { TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(200,0.,2.)); effsigma_cor = effSigma(hecorfine); fwhm_cor = FWHM(hecorfine); TH1 *herawfine = hdata->createHistogram("herawfine",*rawvar,Binning(200,0.,2.)); effsigma_raw = effSigma(herawfine); fwhm_raw = FWHM(herawfine); } TCanvas *cresponse = new TCanvas; gStyle->SetOptStat(0); gStyle->SetPalette(107); hecor->SetTitle(""); heraw->SetTitle(""); hecor->Draw("HIST"); //heold->Draw("HISTSAME"); heraw->Draw("HISTSAME"); //show errSigma in the plot TLegend *leg = new TLegend(0.1, 0.75, 0.7, 0.9); leg->AddEntry(hecor,Form("E_{cor}/E_{true}, #sigma_{eff}=%4.3f, FWHM=%4.3f", effsigma_cor, fwhm_cor),"l"); leg->AddEntry(heraw,Form("E_{raw}/E_{true}, #sigma_{eff}=%4.3f, FWHM=%4.3f", effsigma_raw, fwhm_raw),"l"); leg->SetFillStyle(0); leg->SetBorderSize(0); // leg->SetTextColor(kRed); leg->Draw(); cresponse->SaveAs("response.pdf"); cresponse->SaveAs("response.png"); cresponse->SetLogy(); cresponse->SaveAs("responselog.pdf"); cresponse->SaveAs("responselog.png"); // draw CCs vs eta and phi /* TCanvas *c_eta = new TCanvas; TH1 *h_eta = hdata->createHistogram("h_eta",*scetavar,Binning(100,-3.2,3.2)); h_eta->Draw("HIST"); c_eta->SaveAs("heta.pdf"); c_eta->SaveAs("heta.png"); TCanvas *c_phi = new TCanvas; TH1 *h_phi = hdata->createHistogram("h_phi",*scphivar,Binning(100,-3.2,3.2)); h_phi->Draw("HIST"); c_phi->SaveAs("hphi.pdf"); c_phi->SaveAs("hphi.png"); */ RooRealVar *scetaiXvar = ws->var("var_4"); RooRealVar *scphiiYvar = ws->var("var_5"); if(EEorEB=="EB") { scetaiXvar->setRange(-90,90); scetaiXvar->setBins(180); scphiiYvar->setRange(0,360); scphiiYvar->setBins(360); } else { scetaiXvar->setRange(0,50); scetaiXvar->setBins(50); scphiiYvar->setRange(0,50); scphiiYvar->setBins(50); } ecorvar->setRange(0.5,1.5); ecorvar->setBins(800); rawvar->setRange(0.5,1.5); rawvar->setBins(800); TCanvas *c_cor_eta = new TCanvas; TH3F *h3_CC_eta_phi = (TH3F*) hdata->createHistogram("var_5,var_4,ecor",(EEorEB=="EB") ? 170 : 100, (EEorEB=="EB") ? 360 : 100,25); TProfile2D *h_CC_eta_phi = h3_CC_eta_phi->Project3DProfile(); h_CC_eta_phi->SetTitle("E_{cor}/E_{true}"); if(EEorEB=="EB") { h_CC_eta_phi->GetXaxis()->SetTitle("i#eta"); h_CC_eta_phi->GetYaxis()->SetTitle("i#phi"); h_CC_eta_phi->GetXaxis()->SetRangeUser(-85,85); h_CC_eta_phi->GetYaxis()->SetRangeUser(0,360); } else { h_CC_eta_phi->GetXaxis()->SetTitle("iX"); h_CC_eta_phi->GetYaxis()->SetTitle("iY"); } h_CC_eta_phi->SetMinimum(0.5); h_CC_eta_phi->SetMaximum(1.5); h_CC_eta_phi->Draw("COLZ"); c_cor_eta->SaveAs("cor_vs_eta_phi.pdf"); c_cor_eta->SaveAs("cor_vs_eta_phi.png"); TH2F *h_CC_eta = hdata->createHistogram(*scetaiXvar, *ecorvar, "","cor_vs_eta"); if(EEorEB=="EB") { h_CC_eta->GetXaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetXaxis()->SetTitle("iX"); } h_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_eta->Draw("COLZ"); c_cor_eta->SaveAs("cor_vs_eta.pdf"); c_cor_eta->SaveAs("cor_vs_eta.png"); TCanvas *c_cor_scEraw = new TCanvas; TH2F *h_CC_scEraw = hdata->createHistogram(*scEraw, *ecorvar, "","cor_vs_scEraw"); h_CC_scEraw->GetXaxis()->SetTitle("E_{raw}"); h_CC_scEraw->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_scEraw->Draw("COLZ"); c_cor_scEraw->SaveAs("cor_vs_scEraw.pdf"); c_cor_scEraw->SaveAs("cor_vs_scEraw.png"); TCanvas *c_raw_scEraw = new TCanvas; TH2F *h_RC_scEraw = hdata->createHistogram(*scEraw, *rawvar, "","raw_vs_scEraw"); h_RC_scEraw->GetXaxis()->SetTitle("E_{raw}"); h_RC_scEraw->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_scEraw->Draw("COLZ"); c_raw_scEraw->SaveAs("raw_vs_scEraw.pdf"); c_raw_scEraw->SaveAs("raw_vs_scEraw.png"); TCanvas *c_cor_phi = new TCanvas; TH2F *h_CC_phi = hdata->createHistogram(*scphiiYvar, *ecorvar, "","cor_vs_phi"); if(EEorEB=="EB") { h_CC_phi->GetXaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetXaxis()->SetTitle("iY"); } h_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_phi->Draw("COLZ"); c_cor_phi->SaveAs("cor_vs_phi.pdf"); c_cor_phi->SaveAs("cor_vs_phi.png"); TCanvas *c_raw_eta = new TCanvas; TH3F *h3_RC_eta_phi = (TH3F*) hdata->createHistogram("var_5,var_4,raw",(EEorEB=="EB") ? 170 : 100, (EEorEB=="EB") ? 360 : 100,25); TProfile2D *h_RC_eta_phi = h3_RC_eta_phi->Project3DProfile(); h_RC_eta_phi->SetTitle("E_{raw}/E_{true}"); if(EEorEB=="EB") { h_RC_eta_phi->GetXaxis()->SetTitle("i#eta"); h_RC_eta_phi->GetYaxis()->SetTitle("i#phi"); h_RC_eta_phi->GetXaxis()->SetRangeUser(-85,85); h_RC_eta_phi->GetYaxis()->SetRangeUser(0,360); } else { h_RC_eta_phi->GetXaxis()->SetTitle("iX"); h_RC_eta_phi->GetYaxis()->SetTitle("iY"); } h_RC_eta_phi->SetMinimum(0.5); h_RC_eta_phi->SetMaximum(1.5); h_RC_eta_phi->Draw("COLZ"); c_raw_eta->SaveAs("raw_vs_eta_phi.pdf"); c_raw_eta->SaveAs("raw_vs_eta_phi.png"); TH2F *h_RC_eta = hdata->createHistogram(*scetaiXvar, *rawvar, "","raw_vs_eta"); if(EEorEB=="EB") { h_RC_eta->GetXaxis()->SetTitle("i#eta"); } else { h_RC_eta->GetXaxis()->SetTitle("iX"); } h_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_eta->Draw("COLZ"); c_raw_eta->SaveAs("raw_vs_eta.pdf"); c_raw_eta->SaveAs("raw_vs_eta.png"); TCanvas *c_raw_phi = new TCanvas; TH2F *h_RC_phi = hdata->createHistogram(*scphiiYvar, *rawvar, "","raw_vs_phi"); if(EEorEB=="EB") { h_RC_phi->GetXaxis()->SetTitle("i#phi"); } else { h_RC_phi->GetXaxis()->SetTitle("iY"); } h_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_phi->Draw("COLZ"); c_raw_phi->SaveAs("raw_vs_phi.pdf"); c_raw_phi->SaveAs("raw_vs_phi.png"); //on2,5,20, etc if(EEorEB == "EB") { TCanvas *myC_iCrystal_mod = new TCanvas; RooRealVar *SM_distvar = ws->var("var_6"); SM_distvar->setRange(0,10); SM_distvar->setBins(10); TH2F *h_CC_SM_dist = hdata->createHistogram(*SM_distvar, *ecorvar, "","cor_vs_SM_dist"); h_CC_SM_dist->GetXaxis()->SetTitle("SM_dist"); h_CC_SM_dist->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_SM_dist->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_SM_dist.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_SM_dist.png"); TH2F *h_RC_SM_dist = hdata->createHistogram(*SM_distvar, *rawvar, "","raw_vs_SM_dist"); h_RC_SM_dist->GetXaxis()->SetTitle("distance to SM gap"); h_RC_SM_dist->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_SM_dist->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_SM_dist.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_SM_dist.png"); RooRealVar *M_distvar = ws->var("var_7"); M_distvar->setRange(0,13); M_distvar->setBins(10); TH2F *h_CC_M_dist = hdata->createHistogram(*M_distvar, *ecorvar, "","cor_vs_M_dist"); h_CC_M_dist->GetXaxis()->SetTitle("M_dist"); h_CC_M_dist->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_M_dist->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_M_dist.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_M_dist.png"); TH2F *h_RC_M_dist = hdata->createHistogram(*M_distvar, *rawvar, "","raw_vs_M_dist"); h_RC_M_dist->GetXaxis()->SetTitle("distance to module gap"); h_RC_M_dist->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_M_dist->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_M_dist.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_M_dist.png"); /* RooRealVar *DeltaRG1G2var = ws->var("var_8"); DeltaRG1G2var->setRange(0,0.2); DeltaRG1G2var->setBins(100); TH2F *h_CC_DeltaRG1G2 = hdata->createHistogram(*DeltaRG1G2var, *ecorvar, "","cor_vs_DeltaRG1G2"); h_CC_DeltaRG1G2->GetXaxis()->SetTitle("DeltaRG1G2"); h_CC_DeltaRG1G2->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_DeltaRG1G2->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_DeltaRG1G2.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_DeltaRG1G2.png"); TH2F *h_RC_DeltaRG1G2 = hdata->createHistogram(*DeltaRG1G2var, *rawvar, "","raw_vs_DeltaRG1G2"); h_RC_DeltaRG1G2->GetXaxis()->SetTitle("distance to module gap"); h_RC_DeltaRG1G2->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_DeltaRG1G2->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_DeltaRG1G2.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_DeltaRG1G2.png"); */ } // other variables TCanvas *myC_variables = new TCanvas; RooRealVar *Nxtalvar = ws->var("var_1"); Nxtalvar->setRange(0,10); Nxtalvar->setBins(10); TH2F *h_CC_Nxtal = hdata->createHistogram(*Nxtalvar, *ecorvar, "","cor_vs_Nxtal"); h_CC_Nxtal->GetXaxis()->SetTitle("Nxtal"); h_CC_Nxtal->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_Nxtal->Draw("COLZ"); myC_variables->SaveAs("cor_vs_Nxtal.pdf"); myC_variables->SaveAs("cor_vs_Nxtal.png"); TH2F *h_RC_Nxtal = hdata->createHistogram(*Nxtalvar, *rawvar, "","raw_vs_Nxtal"); h_RC_Nxtal->GetXaxis()->SetTitle("Nxtal"); h_RC_Nxtal->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_Nxtal->Draw("COLZ"); myC_variables->SaveAs("raw_vs_Nxtal.pdf"); myC_variables->SaveAs("raw_vs_Nxtal.png"); RooRealVar *S4S9var = ws->var("var_2"); int Nbins_S4S9 = 100; double Low_S4S9 = 0.6; double High_S4S9 = 1.0; S4S9var->setRange(Low_S4S9,High_S4S9); S4S9var->setBins(Nbins_S4S9); TH2F *h_CC_S4S9 = hdata->createHistogram(*S4S9var, *ecorvar, "","cor_vs_S4S9"); h_CC_S4S9->GetXaxis()->SetTitle("S4S9"); h_CC_S4S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S4S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S4S9.pdf"); myC_variables->SaveAs("cor_vs_S4S9.png"); TH2F *h_RC_S4S9 = hdata->createHistogram(*S4S9var, *rawvar, "","raw_vs_S4S9"); h_RC_S4S9->GetXaxis()->SetTitle("S4S9"); h_RC_S4S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S4S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S4S9.pdf"); myC_variables->SaveAs("raw_vs_S4S9.png"); RooRealVar *S2S9var = ws->var("var_3"); int Nbins_S2S9 = 100; double Low_S2S9 = 0.5; double High_S2S9 = 1.0; S2S9var->setRange(Low_S2S9,High_S2S9); S2S9var->setBins(Nbins_S2S9); TH2F *h_CC_S2S9 = hdata->createHistogram(*S2S9var, *ecorvar, "","cor_vs_S2S9"); h_CC_S2S9->GetXaxis()->SetTitle("S2S9"); h_CC_S2S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S2S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S2S9.pdf"); myC_variables->SaveAs("cor_vs_S2S9.png"); TH2F *h_RC_S2S9 = hdata->createHistogram(*S2S9var, *rawvar, "","raw_vs_S2S9"); h_RC_S2S9->GetXaxis()->SetTitle("S2S9"); h_RC_S2S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S2S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S2S9.pdf"); myC_variables->SaveAs("raw_vs_S2S9.png"); TH2F *h_S2S9_eta = hdata->createHistogram(*scetaiXvar, *S2S9var, "","S2S9_vs_eta"); h_S2S9_eta->GetYaxis()->SetTitle("S2S9"); if(EEorEB=="EB") { h_CC_eta->GetYaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetYaxis()->SetTitle("iX"); } h_S2S9_eta->Draw("COLZ"); myC_variables->SaveAs("S2S9_vs_eta.pdf"); myC_variables->SaveAs("S2S9_vs_eta.png"); TH2F *h_S4S9_eta = hdata->createHistogram(*scetaiXvar, *S4S9var, "","S4S9_vs_eta"); h_S4S9_eta->GetYaxis()->SetTitle("S4S9"); if(EEorEB=="EB") { h_CC_eta->GetYaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetYaxis()->SetTitle("iX"); } h_S4S9_eta->Draw("COLZ"); myC_variables->SaveAs("S4S9_vs_eta.pdf"); myC_variables->SaveAs("S4S9_vs_eta.png"); TH2F *h_S2S9_phi = hdata->createHistogram(*scphiiYvar, *S2S9var, "","S2S9_vs_phi"); h_S2S9_phi->GetYaxis()->SetTitle("S2S9"); if(EEorEB=="EB") { h_CC_phi->GetYaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetYaxis()->SetTitle("iY"); } h_S2S9_phi->Draw("COLZ"); myC_variables->SaveAs("S2S9_vs_phi.pdf"); myC_variables->SaveAs("S2S9_vs_phi.png"); TH2F *h_S4S9_phi = hdata->createHistogram(*scphiiYvar, *S4S9var, "","S4S9_vs_phi"); h_S4S9_phi->GetYaxis()->SetTitle("S4S9"); if(EEorEB=="EB") { h_CC_phi->GetYaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetYaxis()->SetTitle("iY"); } h_S4S9_phi->Draw("COLZ"); myC_variables->SaveAs("S4S9_vs_phi.pdf"); myC_variables->SaveAs("S4S9_vs_phi.png"); if(EEorEB=="EE") { } TProfile *p_CC_eta = h_CC_eta->ProfileX("p_CC_eta");//,1,-1,"s"); p_CC_eta->GetYaxis()->SetRangeUser(0.8,1.05); if(EEorEB == "EB") { // p_CC_eta->GetYaxis()->SetRangeUser(0.85,1.0); // p_CC_eta->GetXaxis()->SetRangeUser(-1.5,1.5); } p_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); p_CC_eta->SetTitle(""); p_CC_eta->Draw(); myC_variables->SaveAs("profile_cor_vs_eta.pdf"); myC_variables->SaveAs("profile_cor_vs_eta.png"); gStyle->SetOptStat(111); gStyle->SetOptFit(1); TH1F *h1_fit_CC_eta = new TH1F("h1_fit_CC_eta","h1_fit_CC_eta",(EEorEB=="EB") ? 180 : 50,(EEorEB=="EB") ? -90 : 0, (EEorEB=="EB") ? 90 : 50); for(int ix = 1;ix <= h_CC_eta->GetNbinsX(); ix++) { stringstream os_iEta; os_iEta << ((EEorEB=="EB") ? (-90 + ix -1) : (0 + ix -1)); string ss_iEta = os_iEta.str(); TH1D * h_temp = h_CC_eta->ProjectionY("h_temp",ix,ix); h_temp->Rebin(4); TF1 *f_temp = new TF1("f_temp","gaus(0)",0.95,1.07); h_temp->Fit("f_temp","R"); h1_fit_CC_eta->SetBinContent(ix, f_temp->GetParameter(1)); h1_fit_CC_eta->SetBinError(ix, f_temp->GetParError(1)); h_temp->GetXaxis()->SetTitle("E_{cor}/E_{true}"); h_temp->SetTitle(""); h_temp->Draw(); myC_variables->SaveAs(("fits/CC_iEta_"+ss_iEta+".pdf").c_str()); myC_variables->SaveAs(("fits/CC_iEta_"+ss_iEta+".png").c_str()); myC_variables->SaveAs(("fits/CC_iEta_"+ss_iEta+".C").c_str()); } gStyle->SetOptStat(0); gStyle->SetOptFit(0); h1_fit_CC_eta->GetYaxis()->SetRangeUser(0.95,1.05); h1_fit_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h1_fit_CC_eta->GetXaxis()->SetTitle((EEorEB=="EB") ? "i#eta" : "iX"); h1_fit_CC_eta->SetTitle(""); h1_fit_CC_eta->Draw(); myC_variables->SaveAs("profile_fit_cor_vs_eta.pdf"); myC_variables->SaveAs("profile_fit_cor_vs_eta.png"); myC_variables->SaveAs("profile_fit_cor_vs_eta.C"); TProfile *p_RC_eta = h_RC_eta->ProfileX("p_RC_eta");//,1,-1,"s"); p_RC_eta->GetYaxis()->SetRangeUser(0.8,1.05); if(EEorEB=="EB") { // p_RC_eta->GetYaxis()->SetRangeUser(0.80,0.95); // p_RC_eta->GetXaxis()->SetRangeUser(-1.5,1.5); } p_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); p_RC_eta->SetTitle(""); p_RC_eta->Draw(); myC_variables->SaveAs("profile_raw_vs_eta.pdf"); myC_variables->SaveAs("profile_raw_vs_eta.png"); gStyle->SetOptStat(111); gStyle->SetOptFit(1); TH1F *h1_fit_RC_eta = new TH1F("h1_fit_RC_eta","h1_fit_RC_eta",(EEorEB=="EB") ? 180 : 50,(EEorEB=="EB") ? -90 : 0, (EEorEB=="EB") ? 90 : 50); for(int ix = 1;ix <= h_RC_eta->GetNbinsX(); ix++) { stringstream os_iEta; os_iEta << ((EEorEB=="EB") ? (-90 + ix -1) : (0 + ix -1)); string ss_iEta = os_iEta.str(); TH1D * h_temp = h_RC_eta->ProjectionY("h_temp",ix,ix); h_temp->Rebin(4); TF1 *f_temp = new TF1("f_temp","gaus(0)",0.87,1.05); h_temp->Fit("f_temp","R"); h1_fit_RC_eta->SetBinContent(ix, f_temp->GetParameter(1)); h1_fit_RC_eta->SetBinError(ix, f_temp->GetParError(1)); h_temp->GetXaxis()->SetTitle("E_{raw}/E_{true}"); h_temp->SetTitle(""); h_temp->Draw(); myC_variables->SaveAs(("fits/RC_iEta_"+ss_iEta+".pdf").c_str()); myC_variables->SaveAs(("fits/RC_iEta_"+ss_iEta+".png").c_str()); myC_variables->SaveAs(("fits/RC_iEta_"+ss_iEta+".C").c_str()); } gStyle->SetOptStat(0); gStyle->SetOptFit(0); h1_fit_RC_eta->GetYaxis()->SetRangeUser(0.9,1.0); h1_fit_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h1_fit_RC_eta->GetXaxis()->SetTitle((EEorEB=="EB") ? "i#eta" : "iX"); h1_fit_RC_eta->SetTitle(""); h1_fit_RC_eta->Draw(); myC_variables->SaveAs("profile_fit_raw_vs_eta.pdf"); myC_variables->SaveAs("profile_fit_raw_vs_eta.png"); myC_variables->SaveAs("profile_fit_raw_vs_eta.C"); int Nbins_iEta = EEorEB=="EB" ? 180 : 50; int nLow_iEta = EEorEB=="EB" ? -90 : 0; int nHigh_iEta = EEorEB=="EB" ? 90 : 50; TH1F *h1_RC_eta = new TH1F("h1_RC_eta","h1_RC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); for(int i=1;i<=Nbins_iEta;i++) { h1_RC_eta->SetBinContent(i,p_RC_eta->GetBinError(i)); } h1_RC_eta->GetXaxis()->SetTitle("i#eta"); h1_RC_eta->GetYaxis()->SetTitle("#sigma_{E_{raw}/E_{true}}"); h1_RC_eta->SetTitle(""); h1_RC_eta->Draw(); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_eta.pdf"); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_eta.png"); TH1F *h1_CC_eta = new TH1F("h1_CC_eta","h1_CC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); for(int i=1;i<=Nbins_iEta;i++) { h1_CC_eta->SetBinContent(i,p_CC_eta->GetBinError(i)); } h1_CC_eta->GetXaxis()->SetTitle("i#eta"); h1_CC_eta->GetYaxis()->SetTitle("#sigma_{E_{cor}/E_{true}}"); h1_CC_eta->SetTitle(""); h1_CC_eta->Draw(); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_eta.pdf"); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_eta.png"); TProfile *p_CC_phi = h_CC_phi->ProfileX("p_CC_phi");//,1,-1,"s"); p_CC_phi->GetYaxis()->SetRangeUser(0.9,1.0); if(EEorEB == "EB") { // p_CC_phi->GetYaxis()->SetRangeUser(0.94,1.00); } p_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); p_CC_phi->SetTitle(""); p_CC_phi->Draw(); myC_variables->SaveAs("profile_cor_vs_phi.pdf"); myC_variables->SaveAs("profile_cor_vs_phi.png"); gStyle->SetOptStat(111); gStyle->SetOptFit(1); TH1F *h1_fit_CC_phi = new TH1F("h1_fit_CC_phi","h1_fit_CC_phi",(EEorEB=="EB") ? 360 : 50,(EEorEB=="EB") ? 0 : 0, (EEorEB=="EB") ? 360 : 50); for(int ix = 1;ix <= h_CC_phi->GetNbinsX(); ix++) { stringstream os_iPhi; os_iPhi << ((EEorEB=="EB") ? (0 + ix -1) : (0 + ix -1)); string ss_iPhi = os_iPhi.str(); TH1D * h_temp = h_CC_phi->ProjectionY("h_temp",ix,ix); h_temp->Rebin(4); TF1 *f_temp = new TF1("f_temp","gaus(0)",0.95,1.07); h_temp->Fit("f_temp","R"); h1_fit_CC_phi->SetBinContent(ix, f_temp->GetParameter(1)); h1_fit_CC_phi->SetBinError(ix, f_temp->GetParError(1)); h_temp->GetXaxis()->SetTitle("E_{cor}/E_{true}"); h_temp->SetTitle(""); h_temp->Draw(); myC_variables->SaveAs(("fits/CC_iPhi_"+ss_iPhi+".pdf").c_str()); myC_variables->SaveAs(("fits/CC_iPhi_"+ss_iPhi+".png").c_str()); myC_variables->SaveAs(("fits/CC_iPhi_"+ss_iPhi+".C").c_str()); } gStyle->SetOptStat(0); gStyle->SetOptFit(0); h1_fit_CC_phi->GetYaxis()->SetRangeUser(0.95,1.05); h1_fit_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h1_fit_CC_phi->GetXaxis()->SetTitle((EEorEB=="EB") ? "i#phi" : "iX"); h1_fit_CC_phi->SetTitle(""); h1_fit_CC_phi->Draw(); myC_variables->SaveAs("profile_fit_cor_vs_phi.pdf"); myC_variables->SaveAs("profile_fit_cor_vs_phi.png"); myC_variables->SaveAs("profile_fit_cor_vs_phi.C"); TProfile *p_RC_phi = h_RC_phi->ProfileX("p_RC_phi");//,1,-1,"s"); p_RC_phi->GetYaxis()->SetRangeUser(0.8,0.9); if(EEorEB=="EB") { // p_RC_phi->GetYaxis()->SetRangeUser(0.89,0.95); } p_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); p_RC_phi->SetTitle(""); p_RC_phi->Draw(); myC_variables->SaveAs("profile_raw_vs_phi.pdf"); myC_variables->SaveAs("profile_raw_vs_phi.png"); gStyle->SetOptStat(111); gStyle->SetOptFit(1); TH1F *h1_fit_RC_phi = new TH1F("h1_fit_RC_phi","h1_fit_RC_phi",(EEorEB=="EB") ? 360 : 50,(EEorEB=="EB") ? 0 : 0, (EEorEB=="EB") ? 360 : 50); for(int ix = 1;ix <= h_RC_phi->GetNbinsX(); ix++) { stringstream os_iPhi; os_iPhi << ((EEorEB=="EB") ? (0 + ix -1) : (0 + ix -1)); string ss_iPhi = os_iPhi.str(); TH1D * h_temp = h_RC_phi->ProjectionY("h_temp",ix,ix); h_temp->Rebin(4); TF1 *f_temp = new TF1("f_temp","gaus(0)",0.87,1.05); h_temp->Fit("f_temp","R"); h1_fit_RC_phi->SetBinContent(ix, f_temp->GetParameter(1)); h1_fit_RC_phi->SetBinError(ix, f_temp->GetParError(1)); h_temp->GetXaxis()->SetTitle("E_{raw}/E_{true}"); h_temp->SetTitle(""); h_temp->Draw(); myC_variables->SaveAs(("fits/RC_iPhi_"+ss_iPhi+".pdf").c_str()); myC_variables->SaveAs(("fits/RC_iPhi_"+ss_iPhi+".png").c_str()); myC_variables->SaveAs(("fits/RC_iPhi_"+ss_iPhi+".C").c_str()); } gStyle->SetOptStat(0); gStyle->SetOptFit(0); h1_fit_RC_phi->GetYaxis()->SetRangeUser(0.9,1.0); h1_fit_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h1_fit_RC_phi->GetXaxis()->SetTitle((EEorEB=="EB") ? "i#phi" : "iX"); h1_fit_RC_phi->SetTitle(""); h1_fit_RC_phi->Draw(); myC_variables->SaveAs("profile_fit_raw_vs_phi.pdf"); myC_variables->SaveAs("profile_fit_raw_vs_phi.png"); myC_variables->SaveAs("profile_fit_raw_vs_phi.C"); int Nbins_iPhi = EEorEB=="EB" ? 360 : 50; int nLow_iPhi = EEorEB=="EB" ? 0 : 0; int nHigh_iPhi = EEorEB=="EB" ? 360 : 50; TH1F *h1_RC_phi = new TH1F("h1_RC_phi","h1_RC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); for(int i=1;i<=Nbins_iPhi;i++) { h1_RC_phi->SetBinContent(i,p_RC_phi->GetBinError(i)); } h1_RC_phi->GetXaxis()->SetTitle("i#phi"); h1_RC_phi->GetYaxis()->SetTitle("#sigma_{E_{raw}/E_{true}}"); h1_RC_phi->SetTitle(""); h1_RC_phi->Draw(); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_phi.pdf"); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_phi.png"); TH1F *h1_CC_phi = new TH1F("h1_CC_phi","h1_CC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); for(int i=1;i<=Nbins_iPhi;i++) { h1_CC_phi->SetBinContent(i,p_CC_phi->GetBinError(i)); } h1_CC_phi->GetXaxis()->SetTitle("i#phi"); h1_CC_phi->GetYaxis()->SetTitle("#sigma_{E_{cor}/E_{true}}"); h1_CC_phi->SetTitle(""); h1_CC_phi->Draw(); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_phi.pdf"); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_phi.png"); // FWHM over sigma_eff vs. eta/phi TH1F *h1_FoverS_RC_phi = new TH1F("h1_FoverS_RC_phi","h1_FoverS_RC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); TH1F *h1_FoverS_CC_phi = new TH1F("h1_FoverS_CC_phi","h1_FoverS_CC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); TH1F *h1_FoverS_RC_eta = new TH1F("h1_FoverS_RC_eta","h1_FoverS_RC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); TH1F *h1_FoverS_CC_eta = new TH1F("h1_FoverS_CC_eta","h1_FoverS_CC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); TH1F *h1_FoverS_CC_S2S9 = new TH1F("h1_FoverS_CC_S2S9","h1_FoverS_CC_S2S9",Nbins_S2S9,Low_S2S9,High_S2S9); TH1F *h1_FoverS_RC_S2S9 = new TH1F("h1_FoverS_RC_S2S9","h1_FoverS_RC_S2S9",Nbins_S2S9,Low_S2S9,High_S2S9); TH1F *h1_FoverS_CC_S4S9 = new TH1F("h1_FoverS_CC_S4S9","h1_FoverS_CC_S4S9",Nbins_S4S9,Low_S4S9,High_S4S9); TH1F *h1_FoverS_RC_S4S9 = new TH1F("h1_FoverS_RC_S4S9","h1_FoverS_RC_S4S9",Nbins_S4S9,Low_S4S9,High_S4S9); float FWHMoverSigmaEff = 0.0; TH1F *h_tmp_rawvar = new TH1F("tmp_rawvar","tmp_rawvar",800,0.5,1.5); TH1F *h_tmp_corvar = new TH1F("tmp_corvar","tmp_corvar",800,0.5,1.5); for(int i=1;i<=Nbins_iPhi;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_phi->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_phi->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_phi->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_phi->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_phi->GetXaxis()->SetTitle("i#phi"); h1_FoverS_CC_phi->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_phi->SetTitle(""); h1_FoverS_CC_phi->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_phi.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_phi.png"); h1_FoverS_RC_phi->GetXaxis()->SetTitle("i#phi"); h1_FoverS_RC_phi->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_phi->SetTitle(""); h1_FoverS_RC_phi->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_phi.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_phi.png"); for(int i=1;i<=Nbins_iEta;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_eta->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_eta->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_eta->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_eta->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_eta->GetXaxis()->SetTitle("i#eta"); h1_FoverS_CC_eta->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_eta->SetTitle(""); h1_FoverS_CC_eta->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_eta.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_eta.png"); h1_FoverS_RC_eta->GetXaxis()->SetTitle("i#eta"); h1_FoverS_RC_eta->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_eta->SetTitle(""); h1_FoverS_RC_eta->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_eta.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_eta.png"); for(int i=1;i<=Nbins_S2S9;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_S2S9->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_S2S9->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_S2S9->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_S2S9->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_S2S9->GetXaxis()->SetTitle("S2S9"); h1_FoverS_CC_S2S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_S2S9->GetYaxis()->SetRangeUser(0.0,1.0); h1_FoverS_CC_S2S9->SetTitle(""); h1_FoverS_CC_S2S9->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S2S9.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S2S9.png"); h1_FoverS_RC_S2S9->GetXaxis()->SetTitle("S2S9"); h1_FoverS_RC_S2S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_S2S9->GetYaxis()->SetRangeUser(0.0,2.0); h1_FoverS_RC_S2S9->SetTitle(""); h1_FoverS_RC_S2S9->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S2S9.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S2S9.png"); for(int i=1;i<=Nbins_S4S9;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_S4S9->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_S4S9->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_S4S9->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_S4S9->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_S4S9->GetXaxis()->SetTitle("S4S9"); h1_FoverS_CC_S4S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_S4S9->GetYaxis()->SetRangeUser(0.0,1.0); h1_FoverS_CC_S4S9->SetTitle(""); h1_FoverS_CC_S4S9->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S4S9.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S4S9.png"); h1_FoverS_RC_S4S9->GetXaxis()->SetTitle("S4S9"); h1_FoverS_RC_S4S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_S4S9->GetYaxis()->SetRangeUser(0.0,2.0); h1_FoverS_RC_S4S9->SetTitle(""); h1_FoverS_RC_S4S9->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S4S9.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S4S9.png"); printf("calc effsigma\n"); std::cout<<"_"<<EEorEB<<std::endl; printf("corrected curve effSigma= %5f, FWHM=%5f \n",effsigma_cor, fwhm_cor); printf("raw curve effSigma= %5f FWHM=%5f \n",effsigma_raw, fwhm_raw); /* new TCanvas; RooPlot *ploteold = testvar.frame(0.6,1.2,100); hdatasigtest->plotOn(ploteold); ploteold->Draw(); new TCanvas; RooPlot *plotecor = ecorvar->frame(0.6,1.2,100); hdatasig->plotOn(plotecor); plotecor->Draw(); */ }
void fitbkgdataCard(TString configCard="template.config", bool dobands = true, // create baerror bands for BG models bool dosignal = false, // plot the signal model (needs to be present) bool blinded = true, // blind the data in the plots? bool verbose = true ) { gROOT->Macro("MitStyle.C"); gStyle->SetErrorX(0); gStyle->SetOptStat(0); gROOT->ForceStyle(); TString projectDir; std::vector<TString> catdesc; std::vector<TString> catnames; std::vector<int> polorder; double massmin = -1.; double massmax = -1.; double theCMenergy = -1.; bool readStatus = readFromConfigCard( configCard, projectDir, catnames, catdesc, polorder, massmin, massmax, theCMenergy ); if( !readStatus ) { std::cerr<<" ERROR: Could not read from card > "<<configCard.Data()<<" <."<<std::endl; return; } TFile *fdata = new TFile(TString::Format("%s/CMS-HGG-data.root",projectDir.Data()),"READ"); if( !fdata ) { std::cerr<<" ERROR: Could not open file "<<projectDir.Data()<<"/CMS-HGG-data.root."<<std::endl; return; } if( !gSystem->cd(TString::Format("%s/databkg/",projectDir.Data())) ) { std::cerr<<" ERROR: Could not change directory to "<<TString::Format("%s/databkg/",projectDir.Data()).Data()<<"."<<std::endl; return; } // ---------------------------------------------------------------------- // load the input workspace.... RooWorkspace* win = (RooWorkspace*)fdata->Get("cms_hgg_workspace_data"); if( !win ) { std::cerr<<" ERROR: Could not load workspace > cms_hgg_workspace_data < from file > "<<TString::Format("%s/CMS-HGG-data.root",projectDir.Data()).Data()<<" <."<<std::endl; return; } RooRealVar *intLumi = win->var("IntLumi"); RooRealVar *hmass = win->var("CMS_hgg_mass"); if( !intLumi || !hmass ) { std::cerr<<" ERROR: Could not load needed variables > IntLumi < or > CMS_hgg_mass < forom input workspace."<<std::endl; return; } //win->Print(); hmass->setRange(massmin,massmax); hmass->setBins(4*(int)(massmax-massmin)); hmass->SetTitle("m_{#gamma#gamma}"); hmass->setUnit("GeV"); hmass->setRange("fitrange",massmin,massmax); hmass->setRange("blind1",100.,110.); hmass->setRange("blind2",150.,180.); // ---------------------------------------------------------------------- // some auxiliray vectro (don't know the meaning of all of them ... yet... std::vector<RooAbsData*> data_vec; std::vector<RooAbsPdf*> pdfShape_vec; // vector to store the NOT-EXTENDED PDFs (aka pdfshape) std::vector<RooAbsPdf*> pdf_vec; // vector to store the EXTENDED PDFs std::vector<RooAbsReal*> normu_vec; // this holds the normalization vars for each Cat (needed in bands for combined cat) RooArgList normList; // list of range-limityed normalizations (needed for error bands on combined category) //std::vector<RooRealVar*> coeffv; //std::vector<RooAbsReal*> normu_vecv; // ??? // ---------------------------------------------------------------------- // define output works RooWorkspace *wOut = new RooWorkspace("wbkg","wbkg") ; // util;ities for the combined fit RooCategory finalcat ("finalcat", "finalcat") ; RooSimultaneous fullbkgpdf("fullbkgpdf","fullbkgpdf",finalcat); RooDataSet datacomb ("datacomb", "datacomb", RooArgList(*hmass,finalcat)) ; RooDataSet *datacombcat = new RooDataSet("data_combcat","",RooArgList(*hmass)) ; // add the 'combcat' to the list...if more than one cat if( catnames.size() > 1 ) { catnames.push_back("combcat"); catdesc.push_back("Combined"); } for (UInt_t icat=0; icat<catnames.size(); ++icat) { TString catname = catnames.at(icat); finalcat.defineType(catname); // check if we're in a sub-cat or the comb-cat RooDataSet *data = NULL; RooDataSet *inData = NULL; if( icat < (catnames.size() - 1) || catnames.size() == 1) { // this is NOT the last cat (which is by construction the combination) inData = (RooDataSet*)win->data(TString("data_mass_")+catname); if( !inData ) { std::cerr<<" ERROR: Could not find dataset > data_mass_"<<catname.Data()<<" < in input workspace."<<std::endl; return; } data = new RooDataSet(TString("data_")+catname,"",*hmass,Import(*inData)); // copy the dataset (why?) // append the data to the combined data... RooDataSet *datacat = new RooDataSet(TString("datacat")+catname,"",*hmass,Index(finalcat),Import(catname,*data)) ; datacomb.append(*datacat); datacombcat->append(*data); // normalization for this category RooRealVar *nbkg = new RooRealVar(TString::Format("CMS_hgg_%s_bkgshape_norm",catname.Data()),"",800.0,0.0,25e3); // we keep track of the normalizario vars only for N-1 cats, naming convetnions hystoric... if( catnames.size() > 2 && icat < (catnames.size() - 2) ) { RooRealVar* cbkg = new RooRealVar(TString::Format("cbkg%s",catname.Data()),"",0.0,0.0,1e3); cbkg->removeRange(); normu_vec.push_back(cbkg); normList.add(*cbkg); } /// generate the Bernstrin polynomial (FIX-ME: add possibility ro create other models...) fstBernModel* theBGmodel = new fstBernModel(hmass, polorder[icat], icat, catname); // using my dedicated class... std::cout<<" model name is "<<theBGmodel->getPdf()->GetName()<<std::endl; RooAbsPdf* bkgshape = theBGmodel->getPdf(); // the BG shape RooAbsPdf* bkgpdf = new RooExtendPdf(TString("bkgpdf")+catname,"",*bkgshape,*nbkg); // the extended PDF // add the extedned PDF to the RooSimultaneous holding all models... fullbkgpdf.addPdf(*bkgpdf,catname); // store the NON-EXTENDED PDF for usgae to compute the error bands later.. pdfShape_vec.push_back(bkgshape); pdf_vec .push_back(bkgpdf); data_vec .push_back(data); } else { data = datacombcat; // we're looking at the last cat (by construction the combination) data_vec.push_back(data); // sum up all the cts PDFs for combined PDF RooArgList subpdfs; for (int ipdf=0; ipdf<pdf_vec.size(); ++ipdf) { subpdfs.add(*pdf_vec.at(ipdf)); } RooAddPdf* bkgpdf = new RooAddPdf(TString("bkgpdf")+catname,"",subpdfs); pdfShape_vec.push_back(bkgpdf); pdf_vec .push_back(bkgpdf); // I don't think this is really needed though.... } // generate the binned dataset (to be put into the workspace... just in case...) RooDataHist *databinned = new RooDataHist(TString("databinned_")+catname,"",*hmass,*data); wOut->import(*data); wOut->import(*databinned); } std::cout<<" ***************** "<<std::endl; // fit the RooSimultaneous to the combined dataset -> (we could also fit each cat separately) fullbkgpdf.fitTo(datacomb,Strategy(1),Minos(kFALSE),Save(kTRUE)); RooFitResult *fullbkgfitres = fullbkgpdf.fitTo(datacomb,Strategy(2),Minos(kFALSE),Save(kTRUE)); // in principle we're done now, so store the results in the output workspace wOut->import(datacomb); wOut->import(fullbkgpdf); wOut->import(*fullbkgfitres); std::cout<<" ***************** "<<std::endl; if( verbose ) wOut->Print(); std::cout<<" ***************** "<<std::endl; wOut->writeToFile("bkgdatawithfit.root") ; if( verbose ) { printf("IntLumi = %5f\n",intLumi->getVal()); printf("ndata:\n"); for (UInt_t icat=0; icat<catnames.size(); ++icat) { printf("%i ",data_vec.at(icat)->numEntries()); } printf("\n"); } // -------------------------------------------------------------------------------------------- // Now comesd the plotting // chage the Statistics style... gStyle->SetOptStat(1110); // we want to plot in 1GeV bins (apparently...) UInt_t nbins = (UInt_t) (massmax-massmin); // here we'll store the curves for the bands... std::vector<RooCurve*> fitcurves; // loop again over the cats TCanvas **canbkg = new TCanvas*[catnames.size()]; RooPlot** plot = new RooPlot*[catnames.size()]; TLatex** lat = new TLatex*[catnames.size()]; TLatex** lat2 = new TLatex*[catnames.size()]; std::cout<<" beofre plotting..."<<std::endl; for (UInt_t icat=0; icat<catnames.size(); ++icat) { TString catname = catnames.at(icat); std::cout<<" trying to plot #"<<icat<<std::endl; // plot the data and the fit canbkg[icat] = new TCanvas; plot [icat] = hmass->frame(Bins(nbins),Range("fitrange")); std::cout<<" trying to plot #"<<icat<<std::endl; // first plot the data invisibly... and put the fitted BG model on top... data_vec .at(icat)->plotOn(plot[icat],RooFit::LineColor(kWhite),MarkerColor(kWhite),Invisible()); pdfShape_vec.at(icat)->plotOn(plot[icat],RooFit::LineColor(kRed),Range("fitrange"),NormRange("fitrange")); std::cout<<" trying to plot #"<<icat<<std::endl; // if toggled on, plot also the Data visibly if( !blinded ) { data_vec.at(icat)->plotOn(plot[icat]); } std::cout<<" trying to plot #"<<icat<<std::endl; // some cosmetics... plot[icat]->SetTitle(""); plot[icat]->SetMinimum(0.0); plot[icat]->SetMaximum(1.40*plot[icat]->GetMaximum()); plot[icat]->GetXaxis()->SetTitle("m_{#gamma#gamma} (GeV/c^{2})"); plot[icat]->Draw(); std::cout<<" trying to plot #"<<icat<<std::endl; // legend.... TLegend *legmc = new TLegend(0.68,0.70,0.97,0.90); legmc->AddEntry(plot[icat]->getObject(2),"Data","LPE"); legmc->AddEntry(plot[icat]->getObject(1),"Bkg Model","L"); // this part computes the 1/2-sigma bands. TGraphAsymmErrors *onesigma = NULL; TGraphAsymmErrors *twosigma = NULL; std::cout<<" trying *** to plot #"<<icat<<std::endl; RooAddition* sumcatsnm1 = NULL; if ( dobands ) { //&& icat == (catnames.size() - 1) ) { onesigma = new TGraphAsymmErrors(); twosigma = new TGraphAsymmErrors(); // get the PDF for this cat from the vector RooAbsPdf *thisPdf = pdfShape_vec.at(icat); // get the nominal fir curve RooCurve *nomcurve = dynamic_cast<RooCurve*>(plot[icat]->getObject(1)); fitcurves.push_back(nomcurve); bool iscombcat = ( icat == (catnames.size() - 1) && catnames.size() > 1); RooAbsData *datanorm = ( iscombcat ? &datacomb : data_vec.at(icat) ); // this si the nornmalization in the 'sliding-window' (i.e. per 'test-bin') RooRealVar *nlim = new RooRealVar(TString::Format("nlim%s",catnames.at(icat).Data()),"",0.0,0.0,10.0); nlim->removeRange(); if( iscombcat ) { // ----------- HISTORIC NAMING ---------------------------------------- sumcatsnm1 = new RooAddition("sumcatsnm1","",normList); // summing all normalizations epect the last Cat // this is the normlization of the last Cat RooFormulaVar *nlast = new RooFormulaVar("nlast","","TMath::Max(0.1,@0-@1)",RooArgList(*nlim,*sumcatsnm1)); // ... and adding it ot the list of norms normu_vec.push_back(nlast); } //if (icat == 1 && catnames.size() == 2) continue; // only 1 cat, so don't need combination for (int i=1; i<(plot[icat]->GetXaxis()->GetNbins()+1); ++i) { // this defines the 'binning' we use for the error bands double lowedge = plot[icat]->GetXaxis()->GetBinLowEdge(i); double upedge = plot[icat]->GetXaxis()->GetBinUpEdge(i); double center = plot[icat]->GetXaxis()->GetBinCenter(i); // get the nominal value at the center of the bin double nombkg = nomcurve->interpolate(center); nlim->setVal(nombkg); hmass->setRange("errRange",lowedge,upedge); // this is the new extended PDF whith the normalization restricted to the bin-area RooAbsPdf *extLimPdf = NULL; if( iscombcat ) { extLimPdf = new RooSimultaneous("epdf","",finalcat); // loop over the cats and generate temporary extended PDFs for (int jcat=0; jcat<(catnames.size()-1); ++jcat) { RooRealVar *rvar = dynamic_cast<RooRealVar*>(normu_vec.at(jcat)); if (rvar) rvar->setVal(fitcurves.at(jcat)->interpolate(center)); RooExtendPdf *ecpdf = new RooExtendPdf(TString::Format("ecpdf%s",catnames.at(jcat).Data()),"",*pdfShape_vec.at(jcat),*normu_vec.at(jcat),"errRange"); static_cast<RooSimultaneous*>(extLimPdf)->addPdf(*ecpdf,catnames.at(jcat)); } } else extLimPdf = new RooExtendPdf("extLimPdf","",*thisPdf,*nlim,"errRange"); RooAbsReal *nll = extLimPdf->createNLL(*datanorm,Extended(),NumCPU(1)); RooMinimizer minim(*nll); minim.setStrategy(0); double clone = 1.0 - 2.0*RooStats::SignificanceToPValue(1.0); double cltwo = 1.0 - 2.0*RooStats::SignificanceToPValue(2.0); if (iscombcat) minim.setStrategy(2); minim.migrad(); if (!iscombcat) { minim.minos(*nlim); } else { minim.hesse(); nlim->removeAsymError(); } if( verbose ) printf("errlo = %5f, errhi = %5f\n",nlim->getErrorLo(),nlim->getErrorHi()); onesigma->SetPoint(i-1,center,nombkg); onesigma->SetPointError(i-1,0.,0.,-nlim->getErrorLo(),nlim->getErrorHi()); // to get the 2-sigma bands... minim.setErrorLevel(0.5*pow(ROOT::Math::normal_quantile(1-0.5*(1-cltwo),1.0), 2)); // the 0.5 is because qmu is -2*NLL // eventually if cl = 0.95 this is the usual 1.92! if (!iscombcat) { minim.migrad(); minim.minos(*nlim); } else { nlim->setError(2.0*nlim->getError()); nlim->removeAsymError(); } twosigma->SetPoint(i-1,center,nombkg); twosigma->SetPointError(i-1,0.,0.,-nlim->getErrorLo(),nlim->getErrorHi()); // for memory clean-up delete nll; delete extLimPdf; } hmass->setRange("errRange",massmin,massmax); if( verbose ) onesigma->Print("V"); // plot[icat] the error bands twosigma->SetLineColor(kGreen); twosigma->SetFillColor(kGreen); twosigma->SetMarkerColor(kGreen); twosigma->Draw("L3 SAME"); onesigma->SetLineColor(kYellow); onesigma->SetFillColor(kYellow); onesigma->SetMarkerColor(kYellow); onesigma->Draw("L3 SAME"); plot[icat]->Draw("SAME"); // and add the error bands to the legend legmc->AddEntry(onesigma,"#pm1 #sigma","F"); legmc->AddEntry(twosigma,"#pm2 #sigma","F"); } std::cout<<" trying ***2 to plot #"<<icat<<std::endl; // rest of the legend .... legmc->SetBorderSize(0); legmc->SetFillStyle(0); legmc->Draw(); lat[icat] = new TLatex(103.0,0.9*plot[icat]->GetMaximum(),TString::Format("#scale[0.7]{#splitline{CMS preliminary}{#sqrt{s} = %.1f TeV L = %.2f fb^{-1}}}",theCMenergy,intLumi->getVal())); lat2[icat] = new TLatex(103.0,0.75*plot[icat]->GetMaximum(),catdesc.at(icat)); lat[icat] ->Draw(); lat2[icat]->Draw(); // ------------------------------------------------------- // save canvas in different formats canbkg[icat]->SaveAs(TString("databkg") + catname + TString(".pdf")); canbkg[icat]->SaveAs(TString("databkg") + catname + TString(".eps")); canbkg[icat]->SaveAs(TString("databkg") + catname + TString(".root")); } return; }
void runQ(const char* inFileName, const char* wsName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData", const char* asimov0DataName = "asimovData_0", const char* conditional0Snapshot = "conditionalGlobs_0", const char* asimov1DataName = "asimovData_1", const char* conditional1Snapshot = "conditionalGlobs_1", const char* nominalSnapshot = "nominalGlobs", string smass = "130", string folder = "test") { double mass; stringstream massStr; massStr << smass; massStr >> mass; bool errFast = 0; bool goFast = 1; bool remakeData = 1; bool doRightSided = 1; bool doInj = 0; bool doObs = 1; bool doMedian = 1; TStopwatch timer; timer.Start(); TFile f(inFileName); RooWorkspace* ws = (RooWorkspace*)f.Get(wsName); if (!ws) { cout << "ERROR::Workspace: " << wsName << " doesn't exist!" << endl; return; } ModelConfig* mc = (ModelConfig*)ws->obj(modelConfigName); if (!mc) { cout << "ERROR::ModelConfig: " << modelConfigName << " doesn't exist!" << endl; return; } RooDataSet* data = (RooDataSet*)ws->data(dataName); if (!data) { cout << "ERROR::Dataset: " << dataName << " doesn't exist!" << endl; return; } mc->GetNuisanceParameters()->Print("v"); RooNLLVar::SetIgnoreZeroEntries(1); ROOT::Math::MinimizerOptions::SetDefaultMinimizer("Minuit2"); ROOT::Math::MinimizerOptions::SetDefaultStrategy(0); ROOT::Math::MinimizerOptions::SetDefaultPrintLevel(1); cout << "Setting max function calls" << endl; //ROOT::Math::MinimizerOptions::SetDefaultMaxFunctionCalls(20000); RooMinimizer::SetMaxFunctionCalls(10000); ws->loadSnapshot("conditionalNuis_0"); RooArgSet nuis(*mc->GetNuisanceParameters()); RooRealVar* mu = (RooRealVar*)mc->GetParametersOfInterest()->first(); if (string(mc->GetPdf()->ClassName()) == "RooSimultaneous" && remakeData) { RooSimultaneous* simPdf = (RooSimultaneous*)mc->GetPdf(); double min_mu; data = makeData(data, simPdf, mc->GetObservables(), mu, mass, min_mu); } RooDataSet* asimovData0 = (RooDataSet*)ws->data(asimov0DataName); if (!asimovData0) { cout << "Asimov data doesn't exist! Please, allow me to build one for you..." << endl; makeAsimovData(mc, true, ws, mc->GetPdf(), data, 1); ws->Print(); asimovData0 = (RooDataSet*)ws->data("asimovData_0"); } RooDataSet* asimovData1 = (RooDataSet*)ws->data(asimov1DataName); if (!asimovData1) { cout << "Asimov data doesn't exist! Please, allow me to build one for you..." << endl; makeAsimovData(mc, true, ws, mc->GetPdf(), data, 0); ws->Print(); asimovData1 = (RooDataSet*)ws->data("asimovData_1"); } if (!doRightSided) mu->setRange(0, 40); else mu->setRange(-40, 40); bool old = false; if (old) { mu->setVal(0); RooArgSet poi(*mu); ProfileLikelihoodTestStat_modified asimov_testStat_sig(*mc->GetPdf()); asimov_testStat_sig.SetRightSided(doRightSided); asimov_testStat_sig.SetNuis(&nuis); if (!doInj) asimov_testStat_sig.SetDoAsimov(true, 1); asimov_testStat_sig.SetWorkspace(ws); ProfileLikelihoodTestStat_modified testStat(*mc->GetPdf()); testStat.SetRightSided(doRightSided); testStat.SetNuis(&nuis); testStat.SetWorkspace(ws); //RooMinimizerFcn::SetOverrideEverything(true); double med_sig = 0; double med_testStat_val = 0; //gRandom->SetSeed(1); //RooRandom::randomGenerator()->SetSeed(1); RooNLLVar::SetIgnoreZeroEntries(1); if (asimov1DataName != "" && doMedian) { mu->setVal(0); if (!doInj) mu->setRange(0, 2); ws->loadSnapshot("conditionalNuis_0"); asimov_testStat_sig.SetLoadUncondSnapshot("conditionalNuis_1"); if (string(conditional1Snapshot) != "") ws->loadSnapshot(conditional1Snapshot); med_testStat_val = 2*asimov_testStat_sig.Evaluate(*asimovData1, poi); if (med_testStat_val < 0 && !doInj) { mu->setVal(0); med_testStat_val = 2*asimov_testStat_sig.Evaluate(*asimovData1, poi); // just try again } int sign = med_testStat_val != 0 ? med_testStat_val/fabs(med_testStat_val) : 0; med_sig = sign*sqrt(fabs(med_testStat_val)); if (string(nominalSnapshot) != "") ws->loadSnapshot(nominalSnapshot); if (!doRightSided) mu->setRange(0, 40); else mu->setRange(-40, 40); } RooNLLVar::SetIgnoreZeroEntries(0); //gRandom->SetSeed(1); //RooRandom::randomGenerator()->SetSeed(1); //RooMinimizerFcn::SetOverrideEverything(false); cout << "med test stat: " << med_testStat_val << endl; ws->loadSnapshot("nominalGlobs"); ws->loadSnapshot("conditionalNuis_0"); mu->setVal(0); testStat.SetWorkspace(ws); testStat.SetLoadUncondSnapshot("ucmles"); double obsTestStat_val = doObs ? 2*testStat.Evaluate(*data, poi) : 0; cout << "obs test stat: " << obsTestStat_val << endl; // obsTestStat_val = 2*testStat.Evaluate(*data, poi); // cout << "obs test stat: " << obsTestStat_val << endl; // obsTestStat_val = 2*testStat.Evaluate(*data, poi); // cout << "obs test stat: " << obsTestStat_val << endl; double obs_sig; int sign = obsTestStat_val == 0 ? 0 : obsTestStat_val / fabs(obsTestStat_val); if (!doRightSided && (obsTestStat_val < 0 && obsTestStat_val > -0.1 || mu->getVal() < 0.001)) obs_sig = 0; else obs_sig = sign*sqrt(fabs(obsTestStat_val)); if (obs_sig != obs_sig) //nan, do by hand { cout << "Obs test stat gave nan: try by hand" << endl; mu->setVal(0); mu->setConstant(1); mc->GetPdf()->fitTo(*data, Hesse(0), Minos(0), PrintLevel(-1), Constrain(*mc->GetNuisanceParameters())); mu->setConstant(0); double L_0 = mc->GetPdf()->getVal(); //mu->setVal(0); //mu->setConstant(1); mc->GetPdf()->fitTo(*data, Hesse(0), Minos(0), PrintLevel(-1), Constrain(*mc->GetNuisanceParameters())); //mu->setConstant(0); double L_muhat = mc->GetPdf()->getVal(); cout << "L_0: " << L_0 << ", L_muhat: " << L_muhat << endl; obs_sig = sqrt(-2*TMath::Log(L_0/L_muhat)); //still nan if (obs_sig != obs_sig && fabs(L_0 - L_muhat) < 0.000001) obs_sig = 0; } cout << "obs: " << obs_sig << endl; cout << "Observed significance: " << obs_sig << endl; if (med_sig) { cout << "Median test stat val: " << med_testStat_val << endl; cout << "Median significance: " << med_sig << endl; } f.Close(); stringstream fileName; fileName << "root_files/" << folder << "/" << mass << ".root"; system(("mkdir -vp root_files/" + folder).c_str()); TFile f2(fileName.str().c_str(),"recreate"); // stringstream fileName; // fileName << "results_sig/" << mass << ".root"; // system("mkdir results_sig"); // TFile f(fileName.str().c_str(),"recreate"); TH1D* h_hypo = new TH1D("hypo","hypo",2,0,2); h_hypo->SetBinContent(1, obs_sig); h_hypo->SetBinContent(2, med_sig); f2.Write(); f2.Close(); //mc->GetPdf()->fitTo(*data, PrintLevel(0)); timer.Stop(); timer.Print(); } else { RooAbsPdf* pdf = mc->GetPdf(); RooArgSet nuis_tmp1 = *mc->GetNuisanceParameters(); RooNLLVar* asimov_nll0 = (RooNLLVar*)pdf->createNLL(*asimovData0, Constrain(nuis_tmp1)); RooArgSet nuis_tmp2 = *mc->GetNuisanceParameters(); RooNLLVar* asimov_nll1 = (RooNLLVar*)pdf->createNLL(*asimovData1, Constrain(nuis_tmp2)); RooArgSet nuis_tmp3 = *mc->GetNuisanceParameters(); RooNLLVar* obs_nll = (RooNLLVar*)pdf->createNLL(*data, Constrain(nuis_tmp3)); //do asimov int status; //get sigma_b ws->loadSnapshot(conditional0Snapshot); status = ws->loadSnapshot("conditionalNuis_0"); if (status != 0 && goFast) errFast = 1; mu->setVal(0); mu->setConstant(1); status = goFast ? 0 : minimize(asimov_nll0, ws); if (status < 0) { cout << "Retrying" << endl; //ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll0, ws); if (status >= 0) cout << "Success!" << endl; } double asimov0_nll0 = asimov_nll0->getVal(); mu->setVal(1); ws->loadSnapshot("conditionalNuis_1"); status = minimize(asimov_nll0, ws); if (status < 0) { cout << "Retrying" << endl; //ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll0, ws); if (status >= 0) cout << "Success!" << endl; } double asimov0_nll1 = asimov_nll0->getVal(); double asimov0_q = 2*(asimov0_nll1 - asimov0_nll0); double sigma_b = sqrt(1./asimov0_q); ws->loadSnapshot(nominalSnapshot); //get sigma_sb ws->loadSnapshot(conditional1Snapshot); ws->loadSnapshot("conditionalNuis_0"); mu->setVal(0); mu->setConstant(1); status = minimize(asimov_nll1, ws); if (status < 0) { cout << "Retrying" << endl; //ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll1, ws); if (status >= 0) cout << "Success!" << endl; } double asimov1_nll0 = asimov_nll1->getVal(); mu->setVal(1); status = ws->loadSnapshot("conditionalNuis_1"); if (status != 0 && goFast) errFast = 1; status = goFast ? 0 : minimize(asimov_nll1, ws); if (status < 0) { cout << "Retrying" << endl; //ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll1, ws); if (status >= 0) cout << "Success!" << endl; } double asimov1_nll1 = asimov_nll1->getVal(); double asimov1_q = 2*(asimov1_nll1 - asimov1_nll0); double sigma_sb = sqrt(-1./asimov1_q); ws->loadSnapshot(nominalSnapshot); //do obs mu->setVal(0); status = ws->loadSnapshot("conditionalNuis_0"); if (status != 0 && goFast) errFast = 1; mu->setConstant(1); status = goFast ? 0 : minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll0 = obs_nll->getVal(); status = ws->loadSnapshot("conditionalNuis_1"); if (status != 0 && goFast) errFast = 1; mu->setVal(1); status = goFast ? 0 : minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll1 = obs_nll->getVal(); double obs_q = 2*(obs_nll1 - obs_nll0); double Zobs = (1./sigma_b/sigma_b - obs_q) / (2./sigma_b); double Zexp = (1./sigma_b/sigma_b - asimov1_q) / (2./sigma_b); double pb_obs = 1-ROOT::Math::gaussian_cdf(Zobs); double pb_exp = 1-ROOT::Math::gaussian_cdf(Zexp); cout << "asimov0_q = " << asimov0_q << endl; cout << "asimov1_q = " << asimov1_q << endl; cout << "obs_q = " << obs_q << endl; cout << "sigma_b = " << sigma_b << endl; cout << "sigma_sb = " << sigma_sb << endl; cout << "Z obs = " << Zobs << endl; cout << "Z exp = " << Zexp << endl; f.Close(); stringstream fileName; fileName << "root_files/" << folder << "/" << mass << ".root"; system(("mkdir -vp root_files/" + folder).c_str()); TFile f2(fileName.str().c_str(),"recreate"); TH1D* h_hypo = new TH1D("hypo_tev","hypo_tev",2,0,2); h_hypo->SetBinContent(1, pb_obs); h_hypo->SetBinContent(2, pb_exp); f2.Write(); f2.Close(); stringstream fileName3; fileName3 << "root_files/" << folder << "_llr/" << mass << ".root"; system(("mkdir -vp root_files/" + folder + "_llr").c_str()); TFile f3(fileName3.str().c_str(),"recreate"); TH1D* h_hypo3 = new TH1D("hypo_llr","hypo_llr",7,0,7); h_hypo3->SetBinContent(1, -obs_q); h_hypo3->SetBinContent(2, -asimov1_q); h_hypo3->SetBinContent(3, -asimov0_q); h_hypo3->SetBinContent(4, -asimov0_q-2*2/sigma_b); h_hypo3->SetBinContent(5, -asimov0_q-1*2/sigma_b); h_hypo3->SetBinContent(6, -asimov0_q+1*2/sigma_b); h_hypo3->SetBinContent(7, -asimov0_q+2*2/sigma_b); f3.Write(); f3.Close(); timer.Stop(); timer.Print(); } }
/// /// Find the global minimum in a more thorough way. /// First fit with external start parameters, then /// for each parameter that starts with "d" or "r" (typically angles and ratios): /// - at upper scan range, rest at start parameters /// - at lower scan range, rest at start parameters /// This amounts to a maximum of 1+2^n fits, where n is the number /// of parameters to be varied. /// /// \param w Workspace holding the pdf. /// \param name Name of the pdf without leading "pdf_". /// \param forceVariables Apply the force method for these variables only. Format /// "var1,var2,var3," (list must end with comma). Default is to apply for all angles, /// all ratios except rD_k3pi and rD_kpi, and the k3pi coherence factor. /// RooFitResult* Utils::fitToMinForce(RooWorkspace *w, TString name, TString forceVariables) { bool debug = true; TString parsName = "par_"+name; TString obsName = "obs_"+name; TString pdfName = "pdf_"+name; RooFitResult *r = 0; int printlevel = -1; RooMsgService::instance().setGlobalKillBelow(ERROR); // save start parameters if ( !w->set(parsName) ){ cout << "MethodProbScan::scan2d() : ERROR : parsName not found: " << parsName << endl; exit(1); } RooDataSet *startPars = new RooDataSet("startParsForce", "startParsForce", *w->set(parsName)); startPars->add(*w->set(parsName)); // set up parameters and ranges RooArgList *varyPars = new RooArgList(); TIterator* it = w->set(parsName)->createIterator(); while ( RooRealVar* p = (RooRealVar*)it->Next() ) { if ( p->isConstant() ) continue; if ( forceVariables=="" && ( false || TString(p->GetName()).BeginsWith("d") ///< use these variables // || TString(p->GetName()).BeginsWith("r") || TString(p->GetName()).BeginsWith("k") || TString(p->GetName()) == "g" ) && ! ( TString(p->GetName()) == "rD_k3pi" ///< don't use these || TString(p->GetName()) == "rD_kpi" // || TString(p->GetName()) == "dD_kpi" || TString(p->GetName()) == "d_dk" || TString(p->GetName()) == "d_dsk" )) { varyPars->add(*p); } else if ( forceVariables.Contains(TString(p->GetName())+",") ) { varyPars->add(*p); } } delete it; int nPars = varyPars->getSize(); if ( debug ) cout << "Utils::fitToMinForce() : nPars = " << nPars << " => " << pow(2.,nPars) << " fits" << endl; if ( debug ) cout << "Utils::fitToMinForce() : varying "; if ( debug ) varyPars->Print(); ////////// r = fitToMinBringBackAngles(w->pdf(pdfName), false, printlevel); ////////// int nErrors = 0; // We define a binary mask where each bit corresponds // to parameter at max or at min. for ( int i=0; i<pow(2.,nPars); i++ ) { if ( debug ) cout << "Utils::fitToMinForce() : fit " << i << " \r" << flush; setParameters(w, parsName, startPars->get(0)); for ( int ip=0; ip<nPars; ip++ ) { RooRealVar *p = (RooRealVar*)varyPars->at(ip); float oldMin = p->getMin(); float oldMax = p->getMax(); setLimit(w, p->GetName(), "force"); if ( i/(int)pow(2.,ip) % 2==0 ) { p->setVal(p->getMin()); } if ( i/(int)pow(2.,ip) % 2==1 ) { p->setVal(p->getMax()); } p->setRange(oldMin, oldMax); } // check if start parameters are sensible, skip if they're not double startParChi2 = getChi2(w->pdf(pdfName)); if ( startParChi2>2000 ){ nErrors += 1; continue; } // refit RooFitResult *r2 = fitToMinBringBackAngles(w->pdf(pdfName), false, printlevel); // In case the initial fit failed, accept the second one. // If both failed, still select the second one and hope the // next fit succeeds. if ( !(r->edm()<1 && r->covQual()==3) ){ delete r; r = r2; } else if ( r2->edm()<1 && r2->covQual()==3 && r2->minNll()<r->minNll() ){ // better minimum found! delete r; r = r2; } else{ delete r2; } } if ( debug ) cout << endl; if ( debug ) cout << "Utils::fitToMinForce() : nErrors = " << nErrors << endl; RooMsgService::instance().setGlobalKillBelow(INFO); // (re)set to best parameters setParameters(w, parsName, r); delete startPars; return r; }
void exercise_3() { //Open the rootfile and get the workspace from the exercise_0 TFile fIn("exercise_0.root"); fIn.cd(); RooWorkspace *w = (RooWorkspace*)fIn.Get("w"); //You can set constant parameters that are known //If you leave them floating, the fit procedure will determine their uncertainty w->var("mean")->setConstant(kFALSE); //don't fix the mean, it's what we want to know the interval for! w->var("sigma")->setConstant(kTRUE); w->var("tau")->setConstant(kTRUE); w->var("Nsig")->setConstant(kTRUE); w->var("Nbkg")->setConstant(kTRUE); //Set the RooModelConfig and let it know what the content of the workspace is about ModelConfig model; model.SetWorkspace(*w); model.SetPdf("PDFtot"); //Let the model know what is the parameter of interest RooRealVar* mean = w->var("mean"); mean->setRange(120., 130.); //this is mostly for plotting reasons RooArgSet poi(*mean); // set confidence level double confidenceLevel = 0.68; //Build the profile likelihood calculator ProfileLikelihoodCalculator plc; plc.SetData(*(w->data("PDFtotData"))); plc.SetModel(model); plc.SetParameters(poi); plc.SetConfidenceLevel(confidenceLevel); //Get the interval LikelihoodInterval* plInt = plc.GetInterval(); //Now let's do the same for the Bayesian Calculator //Now we also need to specify a prior in the ModelConfig //To be quicker, we'll use the PDF factory facility of RooWorkspace //NB!! For simplicity, we are using a flat prior, but this doesn't mean it's the best choice! w->factory("Uniform::prior(mean)"); model.SetPriorPdf(*w->pdf("prior")); //Construct the bayesian calculator BayesianCalculator bc(*(w->data("PDFtotData")), model); bc.SetConfidenceLevel(confidenceLevel); bc.SetParameters(poi); SimpleInterval* bcInt = bc.GetInterval(); // Let's make a plot TCanvas dataCanvas("dataCanvas"); dataCanvas.Divide(2,1); dataCanvas.cd(1); LikelihoodIntervalPlot plotInt((LikelihoodInterval*)plInt); plotInt.SetTitle("Profile Likelihood Ratio and Posterior for mH"); plotInt.SetMaximum(3.); plotInt.Draw(); dataCanvas.cd(2); RooPlot *bcPlot = bc.GetPosteriorPlot(); bcPlot->Draw(); dataCanvas.SaveAs("exercise_3.gif"); //Now print the interval for mH for the two methods cout << "PLC interval is [" << plInt->LowerLimit(*mean) << ", " << plInt->UpperLimit(*mean) << "]" << endl; cout << "Bayesian interval is [" << bcInt->LowerLimit() << ", " << bcInt->UpperLimit() << "]" << endl; }
int main(int argc, char* argv[]) { doofit::builder::EasyPdf *epdf = new doofit::builder::EasyPdf(); epdf->Var("sig_yield"); epdf->Var("sig_yield").setVal(153000); epdf->Var("sig_yield").setConstant(false); //decay time epdf->Var("obsTime"); epdf->Var("obsTime").SetTitle("t_{#kern[-0.2]{B}_{#kern[-0.1]{ d}}^{#kern[-0.1]{ 0}}}"); epdf->Var("obsTime").setUnit("ps"); epdf->Var("obsTime").setRange(0.,16.); // tag, respectively the initial state of the produced B meson epdf->Cat("obsTag"); epdf->Cat("obsTag").defineType("B_S",1); epdf->Cat("obsTag").defineType("Bbar_S",-1); //finalstate epdf->Cat("catFinalState"); epdf->Cat("catFinalState").defineType("f",1); epdf->Cat("catFinalState").defineType("fbar",-1); epdf->Var("obsEtaOS"); epdf->Var("obsEtaOS").setRange(0.0,0.5); std::vector<double> knots; knots.push_back(0.07); knots.push_back(0.10); knots.push_back(0.138); knots.push_back(0.16); knots.push_back(0.23); knots.push_back(0.28); knots.push_back(0.35); knots.push_back(0.42); knots.push_back(0.44); knots.push_back(0.48); knots.push_back(0.5); // empty arg list for coefficients RooArgList* list = new RooArgList(); // create first coefficient RooRealVar* coeff_first = &(epdf->Var("parCSpline1")); coeff_first->setRange(0,10000); coeff_first->setVal(1); coeff_first->setConstant(false); list->add( *coeff_first ); for (unsigned int i=1; i <= knots.size(); ++i){ std::string number = boost::lexical_cast<std::string>(i); RooRealVar* coeff = &(epdf->Var("parCSpline"+number)); coeff->setRange(0,10000); coeff->setVal(1); coeff->setConstant(false); list->add( *coeff ); } // create last coefficient RooRealVar* coeff_last = &(epdf->Var("parCSpline"+boost::lexical_cast<std::string>(knots.size()))); coeff_last->setRange(0,10000); coeff_last->setVal(1); coeff_last->setConstant(false); list->add( *coeff_last ); list->Print(); doofit::roofit::pdfs::DooCubicSplinePdf splinePdf("splinePdf",epdf->Var("obsEtaOS"),knots,*list,0,0.5); //doofit::roofit::pdfs::DooCubicSplinePdf* splinePdf = new doofit::roofit::pdfs::DooCubicSplinePdf("splinePdf", epdf->Var("obsEtaOS"), knots, *list,0,0.5); //Koeffizienten DecRateCoeff *coeff_c = new DecRateCoeff("coef_cos","coef_cos",DecRateCoeff::CPOdd,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("C_f"),epdf->Var("C_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Var("obsEtaOS"),epdf->Var("asym_prod"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); DecRateCoeff *coeff_s = new DecRateCoeff("coef_sin","coef_sin",DecRateCoeff::CPOdd,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("S_f"),epdf->Var("S_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Var("obsEtaOS"),epdf->Var("asym_prod"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); DecRateCoeff *coeff_sh = new DecRateCoeff("coef_sinh","coef_sinh",DecRateCoeff::CPEven,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("f1_f"),epdf->Var("f1_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Var("obsEtaOS"),epdf->Var("asym_prod"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); DecRateCoeff *coeff_ch = new DecRateCoeff("coef_cosh","coef_cosh",DecRateCoeff::CPEven,epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("f0_f"),epdf->Var("f0_fbar"),epdf->Var("obsEtaOS"),splinePdf,epdf->Var("tageff"),epdf->Var("obsEtaOS"),epdf->Var("asym_prod"),epdf->Var("asym_det"),epdf->Var("asym_tageff")); epdf->AddRealToStore(coeff_ch); epdf->AddRealToStore(coeff_sh); epdf->AddRealToStore(coeff_c); epdf->AddRealToStore(coeff_s); ///////////////////Generiere PDF's///////////////////// //Zeit epdf->GaussModel("resTimeGauss",epdf->Var("obsTime"),epdf->Var("allTimeResMean"),epdf->Var("allTimeReso")); epdf->BDecay("pdfSigTime",epdf->Var("obsTime"),epdf->Var("tau"),epdf->Var("dgamma"),epdf->Real("coef_cosh"),epdf->Real("coef_sinh"),epdf->Real("coef_cos"),epdf->Real("coef_sin"),epdf->Var("deltaM"),epdf->Model("resTimeGauss")); //Zusammenfassen der Parameter in einem RooArgSet RooArgSet Observables; Observables.add(RooArgSet( epdf->Var("obsTime"),epdf->Cat("catFinalState"),epdf->Cat("obsTag"),epdf->Var("obsEtaOS"))); epdf->Extend("pdfExtend", epdf->Pdf("pdfSigTime"),epdf->Real("sig_yield")); //Multipliziere Signal und Untergrund PDF mit ihrer jeweiligen Zerfalls PDF// //Untergrund * Zerfall /*epdf->Product("pdf_bkg", RooArgSet(epdf->Pdf("pdf_bkg_mass_expo"), epdf->Pdf("pdf_bkg_mass_time"))); //Signal * Zerfall epdf->Product("pdf_sig", RooArgSet(epdf->Pdf("pdf_sig_mass_gauss"),epdf->Pdf("pdfSigTime"))); //Addiere PDF's epdf->Add("pdf_total", RooArgSet(epdf->Pdf("pdf_sig_mass_gauss*pdf_sig_time_decay"), epdf->Pdf("pdf_bkg_mass*pdf_bkg_time_decay")), RooArgSet(epdf->Var("bkg_Yield"),epdf->Var("sig_Yield")));*/ RooWorkspace ws; ws.import(epdf->Pdf("pdfExtend")); ws.defineSet("Observables",Observables, true); ws.Print(); doofit::config::CommonConfig cfg_com("common"); cfg_com.InitializeOptions(argc, argv); doofit::toy::ToyFactoryStdConfig cfg_tfac("toyfac"); cfg_tfac.InitializeOptions(cfg_com); doofit::toy::ToyStudyStdConfig cfg_tstudy("toystudy"); cfg_tstudy.InitializeOptions(cfg_tfac); // set a previously defined workspace to get PDF from (not mandatory, but convenient) cfg_tfac.set_workspace(&ws); // Check for a set --help flag and if so, print help and exit gracefully // (recommended). cfg_com.CheckHelpFlagAndPrintHelp(); // More custom code, e.g. to set options internally. // Not required as configuration via command line/config file is enough. cfg_com.PrintAll(); // Print overview of all options (optional) // cfg_com.PrintAll(); // Initialize the toy factory module with the config objects and start // generating toy samples. doofit::toy::ToyFactoryStd tfac(cfg_com, cfg_tfac); doofit::toy::ToyStudyStd tstudy(cfg_com, cfg_tstudy); RooDataSet* data = tfac.Generate(); data->Print(); epdf->Pdf("pdfExtend").getParameters(data)->readFromFile("/home/chasenberg/Repository/bachelor-template/ToyStudy/dootoycp-parameter_spline.txt"); epdf->Pdf("pdfExtend").getParameters(data)->writeToFile("/home/chasenberg/Repository/bachelor-template/ToyStudy/dootoycp-parameter_spline.txt.new"); //epdf->Pdf("pdfExtend").fitTo(*data); //epdf->Pdf("pdfExtend").getParameters(data)->writeToFile("/home/chasenberg/Repository/bachelor-template/ToyStudy/dootoycp-fit-result.txt"); RooFitResult* fit_result = epdf->Pdf("pdfExtend").fitTo(*data, RooFit::Save(true)); tstudy.StoreFitResult(fit_result); /*using namespace doofit::plotting; PlotConfig cfg_plot("cfg_plot"); cfg_plot.InitializeOptions(); cfg_plot.set_plot_directory("/net/lhcb-tank/home/chasenberg/Ergebnis/dootoycp_spline-lhcb/time/"); // plot PDF and directly specify components Plot myplot(cfg_plot, epdf->Var("obsTime"), *data, RooArgList(epdf->Pdf("pdfExtend"))); myplot.PlotItLogNoLogY(); PlotConfig cfg_plotEta("cfg_plotEta"); cfg_plotEta.InitializeOptions(); cfg_plotEta.set_plot_directory("/net/lhcb-tank/home/chasenberg/Ergebnis/dootoycp_spline-lhcb/eta/"); // plot PDF and directly specify components Plot myplotEta(cfg_plotEta, epdf->Var("obsEtaOS"), *data, RooArgList(splinePdf)); myplotEta.PlotIt();*/ }
void eregtestingExample(bool dobarrel=true, bool doele=true) { //output dir TString dirname = "/data/bendavid/eregexampletest/eregexampletest_test/"; gSystem->mkdir(dirname,true); gSystem->cd(dirname); //read workspace from training TString fname; if (doele && dobarrel) fname = "wereg_ele_eb.root"; else if (doele && !dobarrel) fname = "wereg_ele_ee.root"; else if (!doele && dobarrel) fname = "wereg_ph_eb.root"; else if (!doele && !dobarrel) fname = "wereg_ph_ee.root"; TString infile = TString::Format("/data/bendavid/eregexampletest/%s",fname.Data()); TFile *fws = TFile::Open(infile); RooWorkspace *ws = (RooWorkspace*)fws->Get("wereg"); //read variables from workspace RooGBRTargetFlex *meantgt = static_cast<RooGBRTargetFlex*>(ws->arg("sigmeant")); RooRealVar *tgtvar = ws->var("tgtvar"); RooArgList vars; vars.add(meantgt->FuncVars()); vars.add(*tgtvar); //read testing dataset from TTree RooRealVar weightvar("weightvar","",1.); TTree *dtree; if (doele) { //TFile *fdin = TFile::Open("root://eoscms.cern.ch//eos/cms/store/cmst3/user/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TFile *fdin = TFile::Open("/data/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterSingleInvert"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } else { TFile *fdin = TFile::Open("root://eoscms.cern.ch///eos/cms/store/cmst3/user/bendavid/idTreesAug1/hgg-2013Final8TeV_ID_s12-h124gg-gf-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPreselNoSmear"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } //selection cuts for testing TCut selcut; if (dobarrel) selcut = "ph.genpt>25. && ph.isbarrel && ph.ispromptgen"; else selcut = "ph.genpt>25. && !ph.isbarrel && ph.ispromptgen"; TCut selweight = "xsecweight(procidx)*puweight(numPU,procidx)"; TCut prescale10 = "(evt%10==0)"; TCut prescale10alt = "(evt%10==1)"; TCut prescale25 = "(evt%25==0)"; TCut prescale100 = "(evt%100==0)"; TCut prescale1000 = "(evt%1000==0)"; TCut evenevents = "(evt%2==0)"; TCut oddevents = "(evt%2==1)"; TCut prescale100alt = "(evt%100==1)"; TCut prescale1000alt = "(evt%1000==1)"; TCut prescale50alt = "(evt%50==1)"; if (doele) weightvar.SetTitle(prescale100alt*selcut); else weightvar.SetTitle(selcut); //make testing dataset RooDataSet *hdata = RooTreeConvert::CreateDataSet("hdata",dtree,vars,weightvar); if (doele) weightvar.SetTitle(prescale1000alt*selcut); else weightvar.SetTitle(prescale10alt*selcut); //make reduced testing dataset for integration over conditional variables RooDataSet *hdatasmall = RooTreeConvert::CreateDataSet("hdatasmall",dtree,vars,weightvar); //retrieve full pdf from workspace RooAbsPdf *sigpdf = ws->pdf("sigpdf"); //input variable corresponding to sceta RooRealVar *scetavar = ws->var("var_1"); //regressed output functions RooAbsReal *sigmeanlim = ws->function("sigmeanlim"); RooAbsReal *sigwidthlim = ws->function("sigwidthlim"); RooAbsReal *signlim = ws->function("signlim"); RooAbsReal *sign2lim = ws->function("sign2lim"); //formula for corrected energy/true energy ( 1.0/(etrue/eraw) * regression mean) RooFormulaVar ecor("ecor","","1./(@0)*@1",RooArgList(*tgtvar,*sigmeanlim)); RooRealVar *ecorvar = (RooRealVar*)hdata->addColumn(ecor); ecorvar->setRange(0.,2.); ecorvar->setBins(800); //formula for raw energy/true energy (1.0/(etrue/eraw)) RooFormulaVar raw("raw","","1./@0",RooArgList(*tgtvar)); RooRealVar *rawvar = (RooRealVar*)hdata->addColumn(raw); rawvar->setRange(0.,2.); rawvar->setBins(800); //clone data and add regression outputs for plotting RooDataSet *hdataclone = new RooDataSet(*hdata,"hdataclone"); RooRealVar *meanvar = (RooRealVar*)hdataclone->addColumn(*sigmeanlim); RooRealVar *widthvar = (RooRealVar*)hdataclone->addColumn(*sigwidthlim); RooRealVar *nvar = (RooRealVar*)hdataclone->addColumn(*signlim); RooRealVar *n2var = (RooRealVar*)hdataclone->addColumn(*sign2lim); //plot target variable and weighted regression prediction (using numerical integration over reduced testing dataset) TCanvas *craw = new TCanvas; //RooPlot *plot = tgtvar->frame(0.6,1.2,100); RooPlot *plot = tgtvar->frame(0.6,2.0,100); hdata->plotOn(plot); sigpdf->plotOn(plot,ProjWData(*hdatasmall)); plot->Draw(); craw->SaveAs("RawE.eps"); craw->SetLogy(); plot->SetMinimum(0.1); craw->SaveAs("RawElog.eps"); //plot distribution of regressed functions over testing dataset TCanvas *cmean = new TCanvas; RooPlot *plotmean = meanvar->frame(0.8,2.0,100); hdataclone->plotOn(plotmean); plotmean->Draw(); cmean->SaveAs("mean.eps"); TCanvas *cwidth = new TCanvas; RooPlot *plotwidth = widthvar->frame(0.,0.05,100); hdataclone->plotOn(plotwidth); plotwidth->Draw(); cwidth->SaveAs("width.eps"); TCanvas *cn = new TCanvas; RooPlot *plotn = nvar->frame(0.,111.,200); hdataclone->plotOn(plotn); plotn->Draw(); cn->SaveAs("n.eps"); TCanvas *cn2 = new TCanvas; RooPlot *plotn2 = n2var->frame(0.,111.,100); hdataclone->plotOn(plotn2); plotn2->Draw(); cn2->SaveAs("n2.eps"); TCanvas *ceta = new TCanvas; RooPlot *ploteta = scetavar->frame(-2.6,2.6,200); hdataclone->plotOn(ploteta); ploteta->Draw(); ceta->SaveAs("eta.eps"); //create histograms for eraw/etrue and ecor/etrue to quantify regression performance TH1 *heraw = hdata->createHistogram("hraw",*rawvar,Binning(800,0.,2.)); TH1 *hecor = hdata->createHistogram("hecor",*ecorvar); //heold->SetLineColor(kRed); hecor->SetLineColor(kBlue); heraw->SetLineColor(kMagenta); hecor->GetXaxis()->SetRangeUser(0.6,1.2); //heold->GetXaxis()->SetRangeUser(0.6,1.2); TCanvas *cresponse = new TCanvas; hecor->Draw("HIST"); //heold->Draw("HISTSAME"); heraw->Draw("HISTSAME"); cresponse->SaveAs("response.eps"); cresponse->SetLogy(); cresponse->SaveAs("responselog.eps"); printf("make fine histogram\n"); TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(20e3,0.,2.)); printf("calc effsigma\n"); double effsigma = effSigma(hecorfine); printf("effsigma = %5f\n",effsigma); /* new TCanvas; RooPlot *ploteold = testvar.frame(0.6,1.2,100); hdatasigtest->plotOn(ploteold); ploteold->Draw(); new TCanvas; RooPlot *plotecor = ecorvar->frame(0.6,1.2,100); hdatasig->plotOn(plotecor); plotecor->Draw(); */ }
void compute_p0(const char* inFileName, const char* wsName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData", const char* asimov1DataName = "asimovData_1", const char* conditional1Snapshot = "conditionalGlobs_1", const char* nominalSnapshot = "nominalGlobs", string smass = "130", string folder = "test") { double mass; stringstream massStr; massStr << smass; massStr >> mass; double mu_profile_value = 1; // mu value to profile the obs data at wbefore generating the expected bool doConditional = 1; // do conditional expected data bool remakeData = 0; // handle unphysical pdf cases in H->ZZ->4l bool doUncap = 1; // uncap p0 bool doInj = 0; // setup the poi for injection study (zero is faster if you're not) bool doObs = 1; // compute median significance bool doMedian = 1; // compute observed significance TStopwatch timer; timer.Start(); TFile f(inFileName); RooWorkspace* ws = (RooWorkspace*)f.Get(wsName); if (!ws) { cout << "ERROR::Workspace: " << wsName << " doesn't exist!" << endl; return; } ModelConfig* mc = (ModelConfig*)ws->obj(modelConfigName); if (!mc) { cout << "ERROR::ModelConfig: " << modelConfigName << " doesn't exist!" << endl; return; } RooDataSet* data = (RooDataSet*)ws->data(dataName); if (!data) { cout << "ERROR::Dataset: " << dataName << " doesn't exist!" << endl; return; } mc->GetNuisanceParameters()->Print("v"); ROOT::Math::MinimizerOptions::SetDefaultMinimizer("Minuit2"); ROOT::Math::MinimizerOptions::SetDefaultStrategy(0); ROOT::Math::MinimizerOptions::SetDefaultPrintLevel(1); cout << "Setting max function calls" << endl; ws->loadSnapshot("conditionalNuis_0"); RooArgSet nuis(*mc->GetNuisanceParameters()); RooRealVar* mu = (RooRealVar*)mc->GetParametersOfInterest()->first(); RooAbsPdf* pdf = mc->GetPdf(); string condSnapshot(conditional1Snapshot); RooArgSet nuis_tmp2 = *mc->GetNuisanceParameters(); RooNLLVar* obs_nll = doObs ? (RooNLLVar*)pdf->createNLL(*data, Constrain(nuis_tmp2)) : NULL; RooDataSet* asimovData1 = (RooDataSet*)ws->data(asimov1DataName); RooRealVar* emb = (RooRealVar*)mc->GetNuisanceParameters()->find("ATLAS_EMB"); if (!asimovData1 || (string(inFileName).find("ic10") != string::npos && emb)) { if (emb) emb->setVal(0.7); cout << "Asimov data doesn't exist! Please, allow me to build one for you..." << endl; string mu_str, mu_prof_str; asimovData1 = makeAsimovData(mc, doConditional, ws, obs_nll, 1, &mu_str, &mu_prof_str, mu_profile_value, true); condSnapshot="conditionalGlobs"+mu_prof_str; } if (!doUncap) mu->setRange(0, 40); else mu->setRange(-40, 40); RooAbsPdf* pdf = mc->GetPdf(); RooArgSet nuis_tmp1 = *mc->GetNuisanceParameters(); RooNLLVar* asimov_nll = (RooNLLVar*)pdf->createNLL(*asimovData1, Constrain(nuis_tmp1)); //do asimov mu->setVal(1); mu->setConstant(0); if (!doInj) mu->setConstant(1); int status,sign; double med_sig=0,obs_sig=0,asimov_q0=0,obs_q0=0; if (doMedian) { ws->loadSnapshot(condSnapshot.c_str()); if (doInj) ws->loadSnapshot("conditionalNuis_inj"); else ws->loadSnapshot("conditionalNuis_1"); mc->GetGlobalObservables()->Print("v"); mu->setVal(0); mu->setConstant(1); status = minimize(asimov_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll, ws); if (status >= 0) cout << "Success!" << endl; } double asimov_nll_cond = asimov_nll->getVal(); mu->setVal(1); if (doInj) ws->loadSnapshot("conditionalNuis_inj"); else ws->loadSnapshot("conditionalNuis_1"); if (doInj) mu->setConstant(0); status = minimize(asimov_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll, ws); if (status >= 0) cout << "Success!" << endl; } double asimov_nll_min = asimov_nll->getVal(); asimov_q0 = 2*(asimov_nll_cond - asimov_nll_min); if (doUncap && mu->getVal() < 0) asimov_q0 = -asimov_q0; sign = int(asimov_q0 != 0 ? asimov_q0/fabs(asimov_q0) : 0); med_sig = sign*sqrt(fabs(asimov_q0)); ws->loadSnapshot(nominalSnapshot); } if (doObs) { ws->loadSnapshot("conditionalNuis_0"); mu->setVal(0); mu->setConstant(1); status = minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll_cond = obs_nll->getVal(); mu->setConstant(0); status = minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll_min = obs_nll->getVal(); obs_q0 = 2*(obs_nll_cond - obs_nll_min); if (doUncap && mu->getVal() < 0) obs_q0 = -obs_q0; sign = int(obs_q0 == 0 ? 0 : obs_q0 / fabs(obs_q0)); if (!doUncap && (obs_q0 < 0 && obs_q0 > -0.1 || mu->getVal() < 0.001)) obs_sig = 0; else obs_sig = sign*sqrt(fabs(obs_q0)); } // Report results cout << "obs: " << obs_sig << endl; cout << "Observed significance: " << obs_sig << endl; cout << "Corresponding to a p-value of " << (1-ROOT::Math::gaussian_cdf( obs_sig )) << endl; if (med_sig) { cout << "Median test stat val: " << asimov_q0 << endl; cout << "Median significance: " << med_sig << endl; } f.Close(); stringstream fileName; fileName << "root-files/" << folder << "/" << mass << ".root"; system(("mkdir -vp root-files/" + folder).c_str()); TFile f2(fileName.str().c_str(),"recreate"); TH1D* h_hypo = new TH1D("hypo","hypo",2,0,2); h_hypo->SetBinContent(1, obs_sig); h_hypo->SetBinContent(2, med_sig); f2.Write(); f2.Close(); timer.Stop(); timer.Print(); }
void fit_mass(TString fileN="") {//suffix added before file extension, e.g., '.pdf' TString placeholder;//to add strings before using them, e.g., for saving text files gROOT->SetBatch(kTRUE); gROOT->ProcessLine(".x /afs/cern.ch/user/m/mwilkins/cmtuser/src/lhcbStyle.C"); // gStyle->SetPadTickX(1); // gStyle->SetPadTickY(1); // gStyle->SetPadLeftMargin(0.15); // gStyle->SetTextSize(0.3); // //open file and get histogram // TFile *inHistos = new TFile("/afs/cern.ch/work/m/mwilkins/Lb2JpsiLtr/data/histos_data.root", "READ"); // TH1F * h100 = (TH1F*)inHistos->Get("h70"); // cout<<"data histogram gotten"<<endl; //unbinned TFile *hastree = new TFile("/afs/cern.ch/work/m/mwilkins/Lb2JpsiLtr/data/cutfile_Optimized.root", "READ"); TTree * h100 = (TTree*)hastree->Get("mytree"); cout<<"tree gotten"<<endl; TFile *SMChistos= new TFile("/afs/cern.ch/work/m/mwilkins/Lb2JpsiLtr/MC/withKScut/histos_SMCfile_fullMC.root", "READ"); cout<<"SMC file opened"<<endl; TH1F *SMCh = (TH1F*)SMChistos->Get("h00"); cout<<"SMC hist gotten"<<endl; RooRealVar *mass = new RooRealVar("Bs_LOKI_MASS_JpsiConstr","m(J/#psi #Lambda)",4100,6100,"MeV"); mass->setRange("bkg1",4300,4800); mass->setRange("bkg2",5700,5950); mass->setRange("bkg3",4300,5500); mass->setRange("bkg4",5100,5500); mass->setRange("L",5350,5950); mass->setRange("tot",4300,5950); cout<<"mass declared"<<endl; // RooDataHist *data = new RooDataHist("data","1D",RooArgList(*mass),h100); //unbinned RooDataSet *data = new RooDataSet("data","1D",h100,*mass); cout<<"data declared"<<endl; RooDataHist *SMC = new RooDataHist("SMC","1D",RooArgList(*mass),SMCh); cout<<"SMC hist assigned to RooDataHist"<<endl; // Construct Pdf Model // /\0 //gaussian RooRealVar mean1L("mean1L","/\\ gaus 1: mean",5621.103095,5525,5700); RooRealVar sig1L("sig1L","/\\ gaus 1: sigma",6.898126,0,100); RooGaussian gau1L("gau1L","#Lambda signal: gaussian 1",*mass,mean1L,sig1L); RooFormulaVar mean2L("mean2L","@0",mean1L); RooRealVar sig2L("sig2L","/\\ gaus 2: sigma",14.693117,0,100); RooGaussian gau2L("gau2L","#Lambda signal: gaussian 2",*mass,mean2L,sig2L); RooRealVar f1L("f1L","/\\ signal: fraction gaussian 1",0.748776,0,1); RooAddPdf sigL("sigL","#Lambda signal",RooArgList(gau1L,gau2L),RooArgList(f1L)); // //CB // RooRealVar mean3L("mean3L","/\\ CB: mean",5621.001,5525,5700); // RooRealVar sig3L("sig3L","/\\ CB: sigma",5.161,0,100); // RooRealVar alphaL3("alphaL3","/\\ CB: alpha",2.077,0,1000); // RooRealVar nL3("nL1","/\\ CB: n",0.286,0,1000); // RooCBShape CBL("CBL","#Lambda signal: CB",*mass,mean3L,sig3L,alphaL3,nL3); // RooRealVar mean4L("mean4L","/\\ gaus: mean",5621.804,5525,5700); // RooRealVar sig4L("sig4L","/\\ gaus: sigma",10.819,0,100); // RooGaussian gauL("gauL","#Lambda signal: gaussian",*mass,mean4L,sig4L); // RooRealVar f1L("f1L","/\\ signal: fraction CB",0.578,0,1); // RooAddPdf sigL("sigL","#Lambda signal",RooArgList(CBL,gauL),RooArgList(f1L)); // sigma0 //using RooHistPdf from MC--no need to build pdf here RooHistPdf sigS = makeroohistpdf(SMC,mass,"sigS","#Sigma^{0} signal (RooHistPdf)"); // /\* cout<<"Lst stuff"<<endl; RooRealVar meanLst1("meanLst1","/\\*(misc.): mean1",5011.031237,4900,5100); RooRealVar sigLst1("sigLst1","/\\*(misc.): sigma1",70.522092,0,100); RooRealVar meanLst2("mean5Lst2","/\\*(1405): mean2",5245.261703,5100,5350); RooRealVar sigLst2("sigLst2","/\\*(1405): sigma2",64.564763,0,100); RooRealVar alphaLst2("alphaLst2","/\\*(1405): alpha2",29.150301); RooRealVar nLst2("nLst2","/\\*(1405): n2",4.615817,0,50); RooGaussian gauLst1("gauLst1","#Lambda*(misc.), gaus",*mass,meanLst1,sigLst1); RooCBShape gauLst2("gauLst2","#Lambda*(1405), CB",*mass,meanLst2,sigLst2,alphaLst2,nLst2); // RooRealVar fLst1("fLst1","/\\* bkg: fraction gaus 1",0.743,0,1); // RooAddPdf bkgLst("bkgLst","#Lambda* signal",RooArgList(gauLst1,gauLst2),RooArgList(fLst1)); //Poly func BKG mass // RooRealVar b0("b0","Background: Chebychev b0",-1.071,-10000,10000); RooRealVar b1("b1","Background: Chebychev b1",-1.323004,-10,-0.00000000000000000000001); RooRealVar b2("b2","Background: Chebychev b2",0.145494,0,10); RooRealVar b3("b3","Background: Chebychev b3",-0.316,-10000,10000); RooRealVar b4("b4","Background: Chebychev b4",0.102,-10000,10000); RooRealVar b5("b5","Background: Chebychev b5",0.014,-10000,10000); RooRealVar b6("b6","Background: Chebychev b6",-0.015,-10000,10000); RooRealVar b7("b7","Background: Chebychev b7",0.012,-10000,10000); RooArgList bList(b1,b2); RooChebychev bkg("bkg","Background", *mass, bList); // TF1 *ep = new TF1("ep","[2]*exp([0]*x+[1]*x*x)",4300,5950); // ep->SetParameter(0,1); // ep->SetParameter(1,-1); // ep->SetParameter(2,2000); // ep->SetParName(0,"a"); // ep->SetParName(1,"b"); // ep->SetParName(2,"c"); // RooRealVar a("a","Background: Coefficent of x",1,-10000,10000); // RooRealVar b("b","Background: Coefficent of x*x",-1,-10000,10000); // RooRealVar c("c","Background: Coefficent of exp()",2000,-10000,10000); // RooTFnPdfBinding bkg("ep","ep",ep,RooArgList(*mass,a,b)); //number of each shape RooRealVar nbkg("nbkg","N bkg",2165.490249,0,100000000); RooRealVar nsigL("nsigL","N /\\",1689.637290,0,1000000000); RooRealVar nsigS("nsigS","N sigma",0.000002,0,10000000000); RooRealVar ngauLst1("ngauLst1","N /\\*(misc.)",439.812103,0,10000000000); RooRealVar ngauLst2("ngauLst2","N /\\*(1405)",152.061617,0,10000000000); RooRealVar nbkgLst("nbkgLst","N /\\*",591.828,0,1000000000); //add shapes and their number to a totalPdf RooArgList shapes; RooArgList yields; shapes.add(sigL); yields.add(nsigL); shapes.add(sigS); yields.add(nsigS); // shapes.add(bkgLst); yields.add(nbkgLst); shapes.add(gauLst1); yields.add(ngauLst1); shapes.add(gauLst2); yields.add(ngauLst2); shapes.add(bkg); yields.add(nbkg); RooAddPdf totalPdf("totalPdf","totalPdf",shapes,yields); //fit the totalPdf RooAbsReal * nll = totalPdf.createNLL(*data,Extended(kTRUE),Range("tot")); RooMinuit m(*nll); m.setVerbose(kFALSE); m.migrad(); m.minos(); m.minos(); //display and save information ofstream textfile;//create text file to hold data placeholder = "plots/fit"+fileN+".txt"; textfile.open(placeholder); TString outputtext;//for useful text //plot things RooPlot *framex = mass->frame(); framex->GetYaxis()->SetTitle("Events/(5 MeV)"); data->plotOn(framex,Name("Hist"),MarkerColor(kBlack),LineColor(kBlack),DataError(RooAbsData::SumW2)); totalPdf.plotOn(framex,Name("curvetot"),LineColor(kBlue)); RooArgSet* totalPdfComponents = totalPdf.getComponents(); TIterator* itertPC = totalPdfComponents->createIterator(); RooAddPdf* vartPC = (RooAddPdf*) itertPC->Next(); vartPC = (RooAddPdf*) itertPC->Next();//skip totalPdf int i=0;//color index TLegend *leg = new TLegend(0.2, 0.02, .4, .42); leg->SetTextSize(0.06); leg->AddEntry(framex->findObject("curvetot"),"Total PDF","l"); while(vartPC){//loop over compotents of totalPdf TString vartPCtitle = vartPC->GetTitle(); TIterator* itercompPars;//forward declare so it persists outside the if statement RooRealVar* varcompPars; if(!(vartPCtitle.Contains(":")||vartPCtitle.Contains("@"))){//only for non-sub-shapes while(i==0||i==10||i==4||i==1||i==5||(i>=10&&i<=27))i++;//avoid white and blue and black and yellow and horribleness RooArgSet* compPars = vartPC->getParameters(data);//set of the parameters of the component the loop is on itercompPars = compPars->createIterator(); varcompPars = (RooRealVar*) itercompPars->Next(); while(varcompPars){//write and print mean, sig, etc. of sub-shapes TString vartitle = varcompPars->GetTitle(); double varval = varcompPars->getVal(); TString varvalstring = Form("%f",varval); double hi = varcompPars->getErrorHi(); TString varerrorstring = "[exact]"; if(hi!=-1){ double lo = varcompPars->getErrorLo(); double varerror = TMath::Max(fabs(lo),hi); varerrorstring = Form("%E",varerror); } outputtext = vartitle+" = "+varvalstring+" +/- "+varerrorstring; textfile<<outputtext<<endl; cout<<outputtext<<endl; varcompPars = (RooRealVar*) itercompPars->Next(); } totalPdf.plotOn(framex,Name(vartPC->GetName()),LineStyle(kDashed),LineColor(i),Components(vartPC->GetName())); leg->AddEntry(framex->findObject(vartPC->GetName()),vartPCtitle,"l"); i++; } vartPC = (RooAddPdf*) itertPC->Next(); itercompPars->Reset();//make sure it's ready for the next vartPC } // Calculate chi2/ndf RooArgSet *floatpar = totalPdf.getParameters(data); int floatpars = (floatpar->selectByAttrib("Constant",kFALSE))->getSize(); Double_t chi2 = framex->chiSquare("curvetot","Hist",floatpars); TString chi2string = Form("%f",chi2); //create text box to list important parameters on the plot // TPaveText* txt = new TPaveText(0.1,0.5,0.7,0.9,"NBNDC"); // txt->SetTextSize(0.06); // txt->SetTextColor(kBlack); // txt->SetBorderSize(0); // txt->SetFillColor(0); // txt->SetFillStyle(0); outputtext = "#chi^{2}/N_{DoF} = "+chi2string; cout<<outputtext<<endl; textfile<<outputtext<<endl; // txt->AddText(outputtext); // Print stuff TIterator* iteryields = yields.createIterator(); RooRealVar* varyields = (RooRealVar*) iteryields->Next();//only inherits things from TObject unless class specified vector<double> Y, E;//holds yields and associated errors vector<TString> YS, ES;//holds strings of the corresponding yields int j=0;//count vector position int jS=0, jL=0;//these hold the position of the S and L results;initialized in case there is no nsigS or nsigL while(varyields){//loop over yields TString varname = varyields->GetName(); TString vartitle = varyields->GetTitle(); double varval = varyields->getVal(); Y.push_back(varval); double lo = varyields->getErrorLo(); double hi = varyields->getErrorHi(); E.push_back(TMath::Max(fabs(lo),hi)); YS.push_back(Form("%f",Y[j])); ES.push_back(Form("%f",E[j])); if(varname=="nsigS") jS=j; if(varname=="nsigL") jL=j; outputtext = vartitle+" = "+YS[j]+" +/- "+ES[j]; cout<<outputtext<<endl; textfile<<outputtext<<endl; //txt->AddText(outputtext); varyields = (RooRealVar*) iteryields->Next(); j++; } //S/L double result = Y[jS]/Y[jL]; cout<<"result declared"<<endl; double E_result = TMath::Abs(result)*sqrt(pow(E[jS]/Y[jS],2)+pow(E[jL]/Y[jL],2)); cout<<"E_result declared"<<endl; TString resultstring = Form("%E",result); TString E_resultstring = Form("%E",E_result); outputtext = "Y_{#Sigma^{0}}/Y_{#Lambda} = "+resultstring+" +/- "+E_resultstring; cout<<outputtext<<endl; textfile<<outputtext<<endl; //txt->AddText(outputtext); double resultlimit = (Y[jS]+E[jS])/(Y[jL]-E[jL]); outputtext = Form("%E",resultlimit); outputtext = "limit = "+outputtext; cout<<outputtext<<endl; textfile<<outputtext<<endl; //txt->AddText(outputtext); // Create canvas and pads, set style TCanvas *c1 = new TCanvas("c1","data fits",1200,800); TPad *pad1 = new TPad("pad1","pad1",0.0,0.3,1.0,1.0); TPad *pad2 = new TPad("pad2","pad2",0.0,0.0,1.0,0.3); pad1->SetBottomMargin(0); pad2->SetTopMargin(0); pad2->SetBottomMargin(0.5); pad2->SetBorderMode(0); pad1->SetBorderMode(0); c1->SetBorderMode(0); pad2->Draw(); pad1->Draw(); pad1->cd(); framex->SetMinimum(1); framex->SetMaximum(3000); framex->addObject(leg);//add legend to frame //framex->addObject(txt);//add text to frame gPad->SetTopMargin(0.06); pad1->SetLogy(); // pad1->Range(4100,0,6100,0.0005); pad1->Update(); framex->Draw(); // Pull distribution RooPlot *framex2 = mass->frame(); RooHist* hpull = framex->pullHist("Hist","curvetot"); framex2->addPlotable(hpull,"P"); hpull->SetLineColor(kBlack); hpull->SetMarkerColor(kBlack); framex2->SetTitle(0); framex2->GetYaxis()->SetTitle("Pull"); framex2->GetYaxis()->SetTitleSize(0.15); framex2->GetYaxis()->SetLabelSize(0.15); framex2->GetXaxis()->SetTitleSize(0.2); framex2->GetXaxis()->SetLabelSize(0.15); framex2->GetYaxis()->CenterTitle(); framex2->GetYaxis()->SetTitleOffset(0.45); framex2->GetXaxis()->SetTitleOffset(1.1); framex2->GetYaxis()->SetNdivisions(505); framex2->GetYaxis()->SetRangeUser(-8.8,8.8); pad2->cd(); framex2->Draw(); c1->cd(); placeholder = "plots/fit"+fileN+".eps"; c1->Print(placeholder); placeholder = "plots/fit"+fileN+".C"; c1->SaveAs(placeholder); textfile.close(); }
void draw_data_mgg(TString folderName,bool blind=true,float min=103,float max=160) { TFile inputFile(folderName+"/data.root"); const int nCat = 5; TString cats[5] = {"HighPt","Hbb","Zbb","HighRes","LowRes"}; TCanvas cv; for(int iCat=0; iCat < nCat; iCat++) { RooWorkspace *ws = (RooWorkspace*)inputFile.Get(cats[iCat]+"_mgg_workspace"); RooFitResult* res = (RooFitResult*)ws->obj("fitresult_pdf_data"); RooRealVar * mass = ws->var("mgg"); mass->setRange("all",min,max); mass->setRange("blind",121,130); mass->setRange("low",106,121); mass->setRange("high",130,160); mass->setUnit("GeV"); mass->SetTitle("m_{#gamma#gamma}"); RooAbsPdf * pdf = ws->pdf("pdf"); RooPlot *plot = mass->frame(min,max,max-min); plot->SetTitle(""); RooAbsData* data = ws->data("data")->reduce(Form("mgg > %f && mgg < %f",min,max)); double nTot = data->sumEntries(); if(blind) data = data->reduce("mgg < 121 || mgg>130"); double nBlind = data->sumEntries(); double norm = nTot/nBlind; //normalization for the plot data->plotOn(plot); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::Range("Full"),RooFit::LineWidth(0.1) ); plot->Print(); //add the fix error band RooCurve* c = plot->getCurve("pdf_Norm[mgg]_Range[Full]_NormRange[Full]"); const int Nc = c->GetN(); //TGraphErrors errfix(Nc); //TGraphErrors errfix2(Nc); TGraphAsymmErrors errfix(Nc); TGraphAsymmErrors errfix2(Nc); Double_t *x = c->GetX(); Double_t *y = c->GetY(); double NtotalFit = ws->var("Nbkg1")->getVal()*ws->var("Nbkg1")->getVal() + ws->var("Nbkg2")->getVal()*ws->var("Nbkg2")->getVal(); for( int i = 0; i < Nc; i++ ) { errfix.SetPoint(i,x[i],y[i]); errfix2.SetPoint(i,x[i],y[i]); mass->setVal(x[i]); double shapeErr = pdf->getPropagatedError(*res)*NtotalFit; //double totalErr = TMath::Sqrt( shapeErr*shapeErr + y[i] ); //total normalization error double totalErr = TMath::Sqrt( shapeErr*shapeErr + y[i]*y[i]/NtotalFit ); if ( y[i] - totalErr > .0 ) { errfix.SetPointError(i, 0, 0, totalErr, totalErr ); } else { errfix.SetPointError(i, 0, 0, y[i] - 0.01, totalErr ); } //2sigma if ( y[i] - 2.*totalErr > .0 ) { errfix2.SetPointError(i, 0, 0, 2.*totalErr, 2.*totalErr ); } else { errfix2.SetPointError(i, 0, 0, y[i] - 0.01, 2.*totalErr ); } /* std::cout << x[i] << " " << y[i] << " " << " ,pdf get Val: " << pdf->getVal() << " ,pdf get Prop Err: " << pdf->getPropagatedError(*res)*NtotalFit << " stat uncertainty: " << TMath::Sqrt(y[i]) << " Ntot: " << NtotalFit << std::endl; */ } errfix.SetFillColor(kYellow); errfix2.SetFillColor(kGreen); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kGreen),RooFit::Range("Full"), RooFit::VisualizeError(*res,2.0,kFALSE)); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kYellow),RooFit::Range("Full"), RooFit::VisualizeError(*res,1.0,kFALSE)); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kGreen),RooFit::Range("Full"), RooFit::VisualizeError(*res,2.0,kTRUE)); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kYellow),RooFit::Range("Full"), RooFit::VisualizeError(*res,1.0,kTRUE)); plot->addObject(&errfix,"4"); plot->addObject(&errfix2,"4"); plot->addObject(&errfix,"4"); data->plotOn(plot); TBox blindBox(121,plot->GetMinimum()-(plot->GetMaximum()-plot->GetMinimum())*0.015,130,plot->GetMaximum()); blindBox.SetFillColor(kGray); if(blind) { plot->addObject(&blindBox); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kGreen),RooFit::Range("Full"), RooFit::VisualizeError(*res,2.0,kTRUE)); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kYellow),RooFit::Range("Full"), RooFit::VisualizeError(*res,1.0,kTRUE)); } //plot->addObject(&errfix,"4"); //data->plotOn(plot); //pdf->plotOn(plot,RooFit::Normalization( norm ) ); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::Range("Full"),RooFit::LineWidth(1.5) ); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::Range("Full"), RooFit::LineWidth(1)); data->plotOn(plot); /* pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::Range("all"),RooFit::LineWidth(0.8) ); //pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kGreen),RooFit::Range("all"), RooFit::VisualizeError(*res,2.0,kFALSE)); //pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kYellow),RooFit::Range("all"), RooFit::VisualizeError(*res,1.0,kFALSE)); pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kGreen),RooFit::Range("all"), RooFit::VisualizeError(*res,2.0,kTRUE)); pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kYellow),RooFit::Range("all"), RooFit::VisualizeError(*res,1.0,kTRUE)); data->plotOn(plot); pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::Range("all"),RooFit::LineWidth(0.8) ); */ TLatex lbl0(0.1,0.96,"CMS Preliminary"); lbl0.SetNDC(); lbl0.SetTextSize(0.042); plot->addObject(&lbl0); TLatex lbl(0.4,0.96,Form("%s Box",cats[iCat].Data())); lbl.SetNDC(); lbl.SetTextSize(0.042); plot->addObject(&lbl); TLatex lbl2(0.6,0.96,"#sqrt{s}=8 TeV L = 19.78 fb^{-1}"); lbl2.SetNDC(); lbl2.SetTextSize(0.042); plot->addObject(&lbl2); int iObj=-1; TNamed *obj; while( (obj = (TNamed*)plot->getObject(++iObj)) ) { obj->SetName(Form("Object_%d",iObj)); } plot->Draw(); TString tag = (blind ? "_BLIND" : ""); cv.SaveAs(folderName+"/figs/mgg_data_"+cats[iCat]+tag+TString(Form("_%0.0f_%0.0f",min,max))+".png"); cv.SaveAs(folderName+"/figs/mgg_data_"+cats[iCat]+tag+TString(Form("_%0.0f_%0.0f",min,max))+".pdf"); cv.SaveAs(folderName+"/figs/mgg_data_"+cats[iCat]+tag+TString(Form("_%0.0f_%0.0f",min,max))+".C"); } }
void rf208_convolution() { // S e t u p c o m p o n e n t p d f s // --------------------------------------- // Construct observable RooRealVar t("t","t",-10,30) ; // Construct landau(t,ml,sl) ; RooRealVar ml("ml","mean bw",5.,-20,20) ; RooRealVar sl("sl","sigma bw",1,0.1,10) ; RooBreitWigner bw("bw","bw",t,ml,sl) ; // Construct gauss(t,mg,sg) RooRealVar mg("mg","mg",0) ; RooRealVar sg("sg","sg",2,0.1,10) ; RooGaussian gauss("gauss","gauss",t,mg,sg) ; // C o n s t r u c t c o n v o l u t i o n p d f // --------------------------------------- // Set #bins to be used for FFT sampling to 10000 t.setBins(10000,"cache") ; // Construct landau (x) gauss RooFFTConvPdf lxg("lxg","bw (X) gauss",t,bw,gauss) ; // S a m p l e , f i t a n d p l o t c o n v o l u t e d p d f // ---------------------------------------------------------------------- // Sample 1000 events in x from gxlx RooDataSet* data = lxg.generate(t,10000) ; // Fit gxlx to data lxg.fitTo(*data) ; // Plot data, landau pdf, landau (X) gauss pdf RooPlot* frame = t.frame(Title("landau (x) gauss convolution")) ; data->plotOn(frame) ; lxg.plotOn(frame) ; bw.plotOn(frame,LineStyle(kDashed)) ; // Draw frame on canvas new TCanvas("rf208_convolution","rf208_convolution",600,600) ; gPad->SetLeftMargin(0.15) ; frame->GetYaxis()->SetTitleOffset(1.4) ; frame->Draw() ; //add a variable to the dataset RooFormulaVar *r_formula = new RooFormulaVar("r_formula","","@0",t); RooRealVar* r = (RooRealVar*) data->addColumn(*r_formula); r->SetName("r"); r->SetTitle("r"); RooDataSet* data_r =(RooDataSet*) data->reduce(*r, ""); r->setRange("sigrange",-10.,30.); RooPlot* r_frame = r->frame(Range("sigRange"),Title(" r (x) gauss convolution")) ; data_r->plotOn(r_frame, MarkerColor(kRed)); r_frame->GetXaxis()->SetRangeUser(-10., 30.); r_frame->Draw() ; }
vector<Double_t*> simFit(bool makeSoupFit_ = false, const string tnp_ = "etoTauMargLooseNoCracks70", const string category_ = "tauAntiEMVA", const string bin_ = "abseta<1.5", const float binCenter_ = 0.75, const float binWidth_ = 0.75, const float xLow_=60, const float xHigh_=120, bool SumW2_ = false, bool verbose_ = true){ vector<Double_t*> out; //return out; //TFile *test = new TFile( outFile->GetName(),"UPDATE"); // output file TFile *test = new TFile( Form("EtoTauPlotsFit_%s_%s_%f.root",tnp_.c_str(),category_.c_str(),binCenter_),"RECREATE"); test->mkdir(Form("bin%f",binCenter_)); TCanvas *c = new TCanvas("fitCanvas",Form("fitCanvas_%s_%s",tnp_.c_str(),bin_.c_str()),10,30,650,600); c->SetGrid(0,0); c->SetFillStyle(4000); c->SetFillColor(10); c->SetTicky(); c->SetObjectStat(0); TCanvas *c2 = new TCanvas("fitCanvasTemplate",Form("fitCanvasTemplate_%s_%s",tnp_.c_str(),bin_.c_str()),10,30,650,600); c2->SetGrid(0,0); c2->SetFillStyle(4000); c2->SetFillColor(10); c2->SetTicky(); c2->SetObjectStat(0); // input files TFile fsup("/data_CMS/cms/lbianchini/tagAndProbe/trees/38XWcut/testNewWriteFromPAT_soup.root"); TFile fbkg("/data_CMS/cms/lbianchini/tagAndProbe/trees/38XWcut/testNewWriteFromPAT_soup_bkg.root"); TFile fsgn("/data_CMS/cms/lbianchini/tagAndProbe/trees/38XWcut/testNewWriteFromPAT_soup_sgn.root"); TFile fdat("/data_CMS/cms/lbianchini/tagAndProbe/trees/38XWcut/testNewWriteFromPAT_Data.root"); // data from 2iter: //TFile fdat("/data_CMS/cms/lbianchini/35pb/testNewWriteFromPAT_Data.root"); //********************** signal only tree *************************/ TTree *fullTreeSgn = (TTree*)fsgn.Get((tnp_+"/fitter_tree").c_str()); TH1F* hSall = new TH1F("hSall","",1,0,150); TH1F* hSPall = new TH1F("hSPall","",1,0,150); TH1F* hS = new TH1F("hS","",1,0,150); TH1F* hSP = new TH1F("hSP","",1,0,150); fullTreeSgn->Draw("mass>>hS",Form("weight*(%s && mass>%f && mass<%f && mcTrue && signalPFChargedHadrCands<1.5)",bin_.c_str(),xLow_,xHigh_)); fullTreeSgn->Draw("mass>>hSall",Form("weight*(%s && mass>%f && mass<%f)",bin_.c_str(),xLow_,xHigh_)); float SGNtrue = hS->Integral(); float SGNall = hSall->Integral(); fullTreeSgn->Draw("mass>>hSP",Form("weight*(%s && %s>0 && mass>%f && mass<%f && mcTrue && signalPFChargedHadrCands<1.5 )",bin_.c_str(),category_.c_str(),xLow_,xHigh_)); fullTreeSgn->Draw("mass>>hSPall",Form("weight*(%s && %s>0 && mass>%f && mass<%f && signalPFChargedHadrCands<1.5 )",bin_.c_str(),category_.c_str(),xLow_,xHigh_)); float SGNtruePass = hSP->Integral(); float SGNallPass = hSPall->Integral(); //********************** background only tree *************************// TTree *fullTreeBkg = (TTree*)fbkg.Get((tnp_+"/fitter_tree").c_str()); TH1F* hB = new TH1F("hB","",1,0,150); TH1F* hBP = new TH1F("hBP","",1,0,150); fullTreeBkg->Draw("mass>>hB",Form("weight*(%s && mass>%f && mass<%f && signalPFChargedHadrCands<1.5 )",bin_.c_str(),xLow_,xHigh_)); float BKG = hB->Integral(); float BKGUnWeighted = hB->GetEntries(); fullTreeBkg->Draw("mass>>hBP",Form("weight*(%s && %s>0 && mass>%f && mass<%f && signalPFChargedHadrCands<1.5 )",bin_.c_str(),category_.c_str(),xLow_,xHigh_)); float BKGPass = hBP->Integral(); float BKGUnWeightedPass = hBP->GetEntries(); float BKGFail = BKG-BKGPass; cout << "*********** BKGFail " << BKGFail << endl; //********************** soup tree *************************// TTree *fullTreeSoup = (TTree*)fsup.Get((tnp_+"/fitter_tree").c_str()); //********************** data tree *************************// TTree *fullTreeData = (TTree*)fdat.Get((tnp_+"/fitter_tree").c_str()); //********************** workspace ***********************// RooWorkspace *w = new RooWorkspace("w","w"); // tree variables to be imported w->factory("mass[30,120]"); w->factory("weight[0,10000]"); w->factory("abseta[0,2.5]"); w->factory("pt[0,200]"); w->factory("mcTrue[0,1]"); w->factory("signalPFChargedHadrCands[0,10]"); w->factory((category_+"[0,1]").c_str()); // background pass pdf for MC w->factory("RooExponential::McBackgroundPdfP(mass,McCP[0,-10,10])"); // background fail pdf for MC w->factory("RooExponential::McBackgroundPdfF(mass,McCF[0,-10,10])"); // background pass pdf for Data w->factory("RooExponential::DataBackgroundPdfP(mass,DataCP[0,-10,10])"); // background fail pdf for Data w->factory("RooExponential::DataBackgroundPdfF(mass,DataCF[0,-10,10])"); // fit parameters for background w->factory("McEfficiency[0.04,0,1]"); w->factory("McNumSgn[0,1000000]"); w->factory("McNumBkgP[0,100000]"); w->factory("McNumBkgF[0,100000]"); w->factory("expr::McNumSgnP('McEfficiency*McNumSgn',McEfficiency,McNumSgn)"); w->factory("expr::McNumSgnF('(1-McEfficiency)*McNumSgn',McEfficiency,McNumSgn)"); w->factory("McPassing[pass=1,fail=0]"); // fit parameters for data w->factory("DataEfficiency[0.1,0,1]"); w->factory("DataNumSgn[0,1000000]"); w->factory("DataNumBkgP[0,1000000]"); w->factory("DataNumBkgF[0,10000]"); w->factory("expr::DataNumSgnP('DataEfficiency*DataNumSgn',DataEfficiency,DataNumSgn)"); w->factory("expr::DataNumSgnF('(1-DataEfficiency)*DataNumSgn',DataEfficiency,DataNumSgn)"); w->factory("DataPassing[pass=1,fail=0]"); RooRealVar *weight = w->var("weight"); RooRealVar *abseta = w->var("abseta"); RooRealVar *pt = w->var("pt"); RooRealVar *mass = w->var("mass"); mass->setRange(xLow_,xHigh_); RooRealVar *mcTrue = w->var("mcTrue"); RooRealVar *cut = w->var( category_.c_str() ); RooRealVar *signalPFChargedHadrCands = w->var("signalPFChargedHadrCands"); // build the template for the signal pass sample: RooDataSet templateP("templateP","dataset for signal-pass template", RooArgSet(*mass,*weight,*abseta,*pt,*cut,*mcTrue,*signalPFChargedHadrCands), Import( *fullTreeSgn ), /*WeightVar( *weight ),*/ Cut( Form("(mcTrue && %s>0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str()) ) ); // build the template for the signal fail sample: RooDataSet templateF("templateF","dataset for signal-fail template", RooArgSet(*mass,*weight,*abseta,*pt,*cut,*mcTrue,*signalPFChargedHadrCands), Import( *fullTreeSgn ), /*WeightVar( *weight ),*/ Cut( Form("(mcTrue && %s<0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str()) ) ); mass->setBins(24); RooDataHist templateHistP("templateHistP","",RooArgSet(*mass), templateP, 1.0); RooHistPdf TemplateSignalPdfP("TemplateSignalPdfP","",RooArgSet(*mass),templateHistP); w->import(TemplateSignalPdfP); mass->setBins(24); RooDataHist templateHistF("templateHistF","",RooArgSet(*mass),templateF,1.0); RooHistPdf TemplateSignalPdfF("TemplateSignalPdfF","",RooArgSet(*mass),templateHistF); w->import(TemplateSignalPdfF); mass->setBins(10000,"fft"); RooPlot* TemplateFrameP = mass->frame(Bins(24),Title("Template passing")); templateP.plotOn(TemplateFrameP); w->pdf("TemplateSignalPdfP")->plotOn(TemplateFrameP); RooPlot* TemplateFrameF = mass->frame(Bins(24),Title("Template failing")); templateF.plotOn(TemplateFrameF); w->pdf("TemplateSignalPdfF")->plotOn(TemplateFrameF); //w->factory("RooFFTConvPdf::McSignalPdfP(mass,TemplateSignalPdfP,RooTruthModel::McResolModP(mass))"); //w->factory("RooFFTConvPdf::McSignalPdfF(mass,TemplateSignalPdfF,RooTruthModel::McResolModF(mass))"); // FOR GREGORY: PROBLEM WHEN TRY TO USE THE PURE TEMPLATE => RooHistPdf McSignalPdfP("McSignalPdfP","McSignalPdfP",RooArgSet(*mass),templateHistP); RooHistPdf McSignalPdfF("McSignalPdfF","McSignalPdfF",RooArgSet(*mass),templateHistF); w->import(McSignalPdfP); w->import(McSignalPdfF); // FOR GREGORY: FOR DATA, CONVOLUTION IS OK => w->factory("RooFFTConvPdf::DataSignalPdfP(mass,TemplateSignalPdfP,RooGaussian::DataResolModP(mass,DataMeanResP[0.0,-5.,5.],DataSigmaResP[0.5,0.,10]))"); w->factory("RooFFTConvPdf::DataSignalPdfF(mass,TemplateSignalPdfF,RooGaussian::DataResolModF(mass,DataMeanResF[-5.,-10.,10.],DataSigmaResF[0.5,0.,10]))"); //w->factory("RooCBShape::DataSignalPdfF(mass,DataMeanF[91.2,88,95.],DataSigmaF[3,0.5,8],DataAlfaF[1.8,0.,10],DataNF[1.0,1e-06,10])"); //w->factory("RooFFTConvPdf::DataSignalPdfF(mass,RooVoigtian::DataVoigF(mass,DataMeanF[85,80,95],DataWidthF[2.49],DataSigmaF[3,0.5,10]),RooCBShape::DataResolModF(mass,DataMeanResF[0.5,0.,10.],DataSigmaResF[0.5,0.,10],DataAlphaResF[0.5,0.,10],DataNResF[1.0,1e-06,10]))"); //w->factory("SUM::DataSignalPdfF(fVBP[0.5,0,1]*RooBifurGauss::bifF(mass,DataMeanResF[91.2,80,95],sigmaLF[10,0.5,40],sigmaRF[0.]), RooVoigtian::voigF(mass, DataMeanResF, widthF[2.49], sigmaVoigF[5,0.1,10]) )" ); // composite model pass for MC w->factory("SUM::McModelP(McNumSgnP*McSignalPdfP,McNumBkgP*McBackgroundPdfP)"); w->factory("SUM::McModelF(McNumSgnF*McSignalPdfF,McNumBkgF*McBackgroundPdfF)"); // composite model pass for data w->factory("SUM::DataModelP(DataNumSgnP*DataSignalPdfP,DataNumBkgP*DataBackgroundPdfP)"); w->factory("SUM::DataModelF(DataNumSgnF*DataSignalPdfF,DataNumBkgF*DataBackgroundPdfF)"); // simultaneous fir for MC w->factory("SIMUL::McModel(McPassing,pass=McModelP,fail=McModelF)"); // simultaneous fir for data w->factory("SIMUL::DataModel(DataPassing,pass=DataModelP,fail=DataModelF)"); w->Print("V"); w->saveSnapshot("clean", w->allVars()); w->loadSnapshot("clean"); /****************** sim fit to soup **************************/ /////////////////////////////////////////////////////////////// TFile *f = new TFile("dummySoup.root","RECREATE"); TTree* cutTreeSoupP = fullTreeSoup->CopyTree(Form("(%s>0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str())); TTree* cutTreeSoupF = fullTreeSoup->CopyTree(Form("(%s<0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str())); RooDataSet McDataP("McDataP","dataset pass for the soup", RooArgSet(*mass), Import( *cutTreeSoupP ) ); RooDataSet McDataF("McDataF","dataset fail for the soup", RooArgSet(*mass), Import( *cutTreeSoupF ) ); RooDataHist McCombData("McCombData","combined data for the soup", RooArgSet(*mass), Index(*(w->cat("McPassing"))), Import("pass", *(McDataP.createHistogram("histoP",*mass)) ), Import("fail",*(McDataF.createHistogram("histoF",*mass)) ) ) ; RooPlot* McFrameP = 0; RooPlot* McFrameF = 0; RooRealVar* McEffFit = 0; if(makeSoupFit_){ cout << "**************** N bins in mass " << w->var("mass")->getBins() << endl; RooFitResult* ResMcCombinedFit = w->pdf("McModel")->fitTo(McCombData, Extended(1), Minos(1), Save(1), SumW2Error( SumW2_ ), Range(xLow_,xHigh_), NumCPU(4) /*, ExternalConstraints( *(w->pdf("ConstrainMcNumBkgF")) )*/ ); test->cd(Form("bin%f",binCenter_)); ResMcCombinedFit->Write("McFitResults_Combined"); RooArgSet McFitParam(ResMcCombinedFit->floatParsFinal()); McEffFit = (RooRealVar*)(&McFitParam["McEfficiency"]); RooRealVar* McNumSigFit = (RooRealVar*)(&McFitParam["McNumSgn"]); RooRealVar* McNumBkgPFit = (RooRealVar*)(&McFitParam["McNumBkgP"]); RooRealVar* McNumBkgFFit = (RooRealVar*)(&McFitParam["McNumBkgF"]); McFrameP = mass->frame(Bins(24),Title("MC: passing sample")); McCombData.plotOn(McFrameP,Cut("McPassing==McPassing::pass")); w->pdf("McModel")->plotOn(McFrameP,Slice(*(w->cat("McPassing")),"pass"), ProjWData(*(w->cat("McPassing")),McCombData), LineColor(kBlue),Range(xLow_,xHigh_)); w->pdf("McModel")->plotOn(McFrameP,Slice(*(w->cat("McPassing")),"pass"), ProjWData(*(w->cat("McPassing")),McCombData), Components("McSignalPdfP"), LineColor(kRed),Range(xLow_,xHigh_)); w->pdf("McModel")->plotOn(McFrameP,Slice(*(w->cat("McPassing")),"pass"), ProjWData(*(w->cat("McPassing")),McCombData), Components("McBackgroundPdfP"), LineColor(kGreen),Range(xLow_,xHigh_)); McFrameF = mass->frame(Bins(24),Title("MC: failing sample")); McCombData.plotOn(McFrameF,Cut("McPassing==McPassing::fail")); w->pdf("McModel")->plotOn(McFrameF,Slice(*(w->cat("McPassing")),"fail"), ProjWData(*(w->cat("McPassing")),McCombData), LineColor(kBlue),Range(xLow_,xHigh_)); w->pdf("McModel")->plotOn(McFrameF,Slice(*(w->cat("McPassing")),"fail"), ProjWData(*(w->cat("McPassing")),McCombData), Components("McSignalPdfF"), LineColor(kRed),Range(xLow_,xHigh_)); w->pdf("McModel")->plotOn(McFrameF,Slice(*(w->cat("McPassing")),"fail"), ProjWData(*(w->cat("McPassing")),McCombData), Components("McBackgroundPdfF"), LineColor(kGreen),Range(xLow_,xHigh_)); } /////////////////////////////////////////////////////////////// /****************** sim fit to data **************************/ /////////////////////////////////////////////////////////////// TFile *f2 = new TFile("dummyData.root","RECREATE"); TTree* cutTreeDataP = fullTreeData->CopyTree(Form("(%s>0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str())); TTree* cutTreeDataF = fullTreeData->CopyTree(Form("(%s<0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str())); RooDataSet DataDataP("DataDataP","dataset pass for the soup", RooArgSet(*mass), Import( *cutTreeDataP ) ); RooDataSet DataDataF("DataDataF","dataset fail for the soup", RooArgSet(*mass), Import( *cutTreeDataF ) ); RooDataHist DataCombData("DataCombData","combined data for the soup", RooArgSet(*mass), Index(*(w->cat("DataPassing"))), Import("pass",*(DataDataP.createHistogram("histoDataP",*mass))),Import("fail",*(DataDataF.createHistogram("histoDataF",*mass)))) ; RooFitResult* ResDataCombinedFit = w->pdf("DataModel")->fitTo(DataCombData, Extended(1), Minos(1), Save(1), SumW2Error( SumW2_ ), Range(xLow_,xHigh_), NumCPU(4)); test->cd(Form("bin%f",binCenter_)); ResDataCombinedFit->Write("DataFitResults_Combined"); RooArgSet DataFitParam(ResDataCombinedFit->floatParsFinal()); RooRealVar* DataEffFit = (RooRealVar*)(&DataFitParam["DataEfficiency"]); RooRealVar* DataNumSigFit = (RooRealVar*)(&DataFitParam["DataNumSgn"]); RooRealVar* DataNumBkgPFit = (RooRealVar*)(&DataFitParam["DataNumBkgP"]); RooRealVar* DataNumBkgFFit = (RooRealVar*)(&DataFitParam["DataNumBkgF"]); RooPlot* DataFrameP = mass->frame(Bins(24),Title("Data: passing sample")); DataCombData.plotOn(DataFrameP,Cut("DataPassing==DataPassing::pass")); w->pdf("DataModel")->plotOn(DataFrameP,Slice(*(w->cat("DataPassing")),"pass"), ProjWData(*(w->cat("DataPassing")),DataCombData), LineColor(kBlue),Range(xLow_,xHigh_)); w->pdf("DataModel")->plotOn(DataFrameP,Slice(*(w->cat("DataPassing")),"pass"), ProjWData(*(w->cat("DataPassing")),DataCombData), Components("DataSignalPdfP"), LineColor(kRed),Range(xLow_,xHigh_)); w->pdf("DataModel")->plotOn(DataFrameP,Slice(*(w->cat("DataPassing")),"pass"), ProjWData(*(w->cat("DataPassing")),DataCombData), Components("DataBackgroundPdfP"), LineColor(kGreen),LineStyle(kDashed),Range(xLow_,xHigh_)); RooPlot* DataFrameF = mass->frame(Bins(24),Title("Data: failing sample")); DataCombData.plotOn(DataFrameF,Cut("DataPassing==DataPassing::fail")); w->pdf("DataModel")->plotOn(DataFrameF,Slice(*(w->cat("DataPassing")),"fail"), ProjWData(*(w->cat("DataPassing")),DataCombData), LineColor(kBlue),Range(xLow_,xHigh_)); w->pdf("DataModel")->plotOn(DataFrameF,Slice(*(w->cat("DataPassing")),"fail"), ProjWData(*(w->cat("DataPassing")),DataCombData), Components("DataSignalPdfF"), LineColor(kRed),Range(xLow_,xHigh_)); w->pdf("DataModel")->plotOn(DataFrameF,Slice(*(w->cat("DataPassing")),"fail"), ProjWData(*(w->cat("DataPassing")),DataCombData), Components("DataBackgroundPdfF"), LineColor(kGreen),LineStyle(kDashed),Range(xLow_,xHigh_)); /////////////////////////////////////////////////////////////// if(makeSoupFit_) c->Divide(2,2); else c->Divide(2,1); c->cd(1); DataFrameP->Draw(); c->cd(2); DataFrameF->Draw(); if(makeSoupFit_){ c->cd(3); McFrameP->Draw(); c->cd(4); McFrameF->Draw(); } c->Draw(); test->cd(Form("bin%f",binCenter_)); c->Write(); c2->Divide(2,1); c2->cd(1); TemplateFrameP->Draw(); c2->cd(2); TemplateFrameF->Draw(); c2->Draw(); test->cd(Form("bin%f",binCenter_)); c2->Write(); // MINOS errors, otherwise HESSE quadratic errors float McErrorLo = 0; float McErrorHi = 0; if(makeSoupFit_){ McErrorLo = McEffFit->getErrorLo()<0 ? McEffFit->getErrorLo() : (-1)*McEffFit->getError(); McErrorHi = McEffFit->getErrorHi()>0 ? McEffFit->getErrorHi() : McEffFit->getError(); } float DataErrorLo = DataEffFit->getErrorLo()<0 ? DataEffFit->getErrorLo() : (-1)*DataEffFit->getError(); float DataErrorHi = DataEffFit->getErrorHi()>0 ? DataEffFit->getErrorHi() : DataEffFit->getError(); float BinomialError = TMath::Sqrt(SGNtruePass/SGNtrue*(1-SGNtruePass/SGNtrue)/SGNtrue); Double_t* truthMC = new Double_t[6]; Double_t* tnpMC = new Double_t[6]; Double_t* tnpData = new Double_t[6]; truthMC[0] = binCenter_; truthMC[1] = binWidth_; truthMC[2] = binWidth_; truthMC[3] = SGNtruePass/SGNtrue; truthMC[4] = BinomialError; truthMC[5] = BinomialError; if(makeSoupFit_){ tnpMC[0] = binCenter_; tnpMC[1] = binWidth_; tnpMC[2] = binWidth_; tnpMC[3] = McEffFit->getVal(); tnpMC[4] = (-1)*McErrorLo; tnpMC[5] = McErrorHi; } tnpData[0] = binCenter_; tnpData[1] = binWidth_; tnpData[2] = binWidth_; tnpData[3] = DataEffFit->getVal(); tnpData[4] = (-1)*DataErrorLo; tnpData[5] = DataErrorHi; out.push_back(truthMC); out.push_back(tnpData); if(makeSoupFit_) out.push_back(tnpMC); test->Close(); //delete c; delete c2; if(verbose_) cout << "returning from bin " << bin_ << endl; return out; }
void forData(string channel, string catcut, bool removeMinor=true){ // Suppress all the INFO message RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING); // Input files and sum all backgrounds TChain* treeData = new TChain("tree"); TChain* treeZjets = new TChain("tree"); if( channel == "ele" ){ treeData->Add(Form("%s/data/SingleElectron-Run2015D-05Oct2015-v1_toyMCnew.root", channel.data())); treeData->Add(Form("%s/data/SingleElectron-Run2015D-PromptReco-V4_toyMCnew.root", channel.data())); } else if( channel == "mu" ){ treeData->Add(Form("%s/data/SingleMuon-Run2015D-05Oct2015-v1_toyMCnew.root", channel.data())); treeData->Add(Form("%s/data/SingleMuon-Run2015D-PromptReco-V4_toyMCnew.root", channel.data())); } else return; treeZjets->Add(Form("%s/Zjets/DYJetsToLL_M-50_HT-100to200_13TeV_toyMCnew.root", channel.data())); treeZjets->Add(Form("%s/Zjets/DYJetsToLL_M-50_HT-200to400_13TeV_toyMCnew.root", channel.data())); treeZjets->Add(Form("%s/Zjets/DYJetsToLL_M-50_HT-400to600_13TeV_toyMCnew.root", channel.data())); treeZjets->Add(Form("%s/Zjets/DYJetsToLL_M-50_HT-600toInf_13TeV_toyMCnew.root", channel.data())); // To remove minor background contribution in data set (weight is -1) if( removeMinor ){ treeData->Add(Form("%s/VV/WW_TuneCUETP8M1_13TeV_toyMCnew.root", channel.data())); treeData->Add(Form("%s/VV/WZ_TuneCUETP8M1_13TeV_toyMCnew.root", channel.data())); treeData->Add(Form("%s/VV/ZZ_TuneCUETP8M1_13TeV_toyMCnew.root", channel.data())); treeData->Add(Form("%s/TT/TT_TuneCUETP8M1_13TeV_toyMCnew.root", channel.data())); } // Define all the variables from the trees RooRealVar cat ("cat", "", 0, 2); RooRealVar mJet("prmass", "M_{jet}", 30., 300., "GeV"); RooRealVar mZH ("mllbb", "M_{ZH}", 900., 3000., "GeV"); RooRealVar evWeight("evweight", "", -1.e3, 1.e3); // Set the range in jet mass mJet.setRange("allRange", 30., 300.); mJet.setRange("lowSB", 30., 65.); mJet.setRange("highSB", 135., 300.); mJet.setRange("signal", 105., 135.); RooBinning binsmJet(54, 30, 300); RooArgSet variables(cat, mJet, mZH, evWeight); TCut catCut = Form("cat==%s", catcut.c_str()); TCut sbCut = "prmass>30 && !(prmass>65 && prmass<135) && prmass<300"; TCut sigCut = "prmass>105 && prmass<135"; // Create a dataset from a tree -> to process an unbinned likelihood fitting RooDataSet dataSetData ("dataSetData", "dataSetData", variables, Cut(catCut), WeightVar(evWeight), Import(*treeData)); RooDataSet dataSetDataSB ("dataSetDataSB", "dataSetDataSB", variables, Cut(catCut && sbCut), WeightVar(evWeight), Import(*treeData)); RooDataSet dataSetZjets ("dataSetZjets", "dataSetZjets", variables, Cut(catCut), WeightVar(evWeight), Import(*treeZjets)); RooDataSet dataSetZjetsSB("dataSetZjetsSB", "dataSetZjetsSB", variables, Cut(catCut && sbCut), WeightVar(evWeight), Import(*treeZjets)); RooDataSet dataSetZjetsSG("dataSetZjetsSG", "dataSetZjetsSG", variables, Cut(catCut && sigCut), WeightVar(evWeight), Import(*treeZjets)); // Total events number float totalMcEv = dataSetZjetsSB.sumEntries() + dataSetZjetsSG.sumEntries(); float totalDataEv = dataSetData.sumEntries(); RooRealVar nMcEvents("nMcEvents", "nMcEvents", 0., 99999.); RooRealVar nDataEvents("nDataEvents", "nDataEvents", 0., 99999.); nMcEvents.setVal(totalMcEv); nMcEvents.setConstant(true); nDataEvents.setVal(totalDataEv); nDataEvents.setConstant(true); // Signal region jet mass RooRealVar constant("constant", "constant", -0.02, -1., 0.); RooRealVar offset ("offset", "offset", 30., -50., 200.); RooRealVar width ("width", "width", 100., 0., 200.); if( catcut == "1" ) offset.setConstant(true); RooErfExpPdf model_mJet("model_mJet", "model_mJet", mJet, constant, offset, width); RooExtendPdf ext_model_mJet("ext_model_mJet", "ext_model_mJet", model_mJet, nMcEvents); RooFitResult* mJet_result = ext_model_mJet.fitTo(dataSetZjets, SumW2Error(true), Extended(true), Range("allRange"), Strategy(2), Minimizer("Minuit2"), Save(1)); // Side band jet mass RooRealVar constantSB("constantSB", "constantSB", constant.getVal(), -1., 0.); RooRealVar offsetSB ("offsetSB", "offsetSB", offset.getVal(), -50., 200.); RooRealVar widthSB ("widthSB", "widthSB", width.getVal(), 0., 200.); offsetSB.setConstant(true); RooErfExpPdf model_mJetSB("model_mJetSB", "model_mJetSB", mJet, constantSB, offsetSB, widthSB); RooExtendPdf ext_model_mJetSB("ext_model_mJetSB", "ext_model_mJetSB", model_mJetSB, nMcEvents); RooFitResult* mJetSB_result = ext_model_mJetSB.fitTo(dataSetZjetsSB, SumW2Error(true), Extended(true), Range("lowSB,highSB"), Strategy(2), Minimizer("Minuit2"), Save(1)); RooAbsReal* nSIGFit = ext_model_mJetSB.createIntegral(RooArgSet(mJet), NormSet(mJet), Range("signal")); float normFactor = nSIGFit->getVal() * totalMcEv; // Plot the results on a frame RooPlot* mJetFrame = mJet.frame(); dataSetZjetsSB. plotOn(mJetFrame, Binning(binsmJet)); ext_model_mJetSB.plotOn(mJetFrame, Range("allRange"), VisualizeError(*mJetSB_result), FillColor(kYellow)); dataSetZjetsSB. plotOn(mJetFrame, Binning(binsmJet)); ext_model_mJetSB.plotOn(mJetFrame, Range("allRange")); mJetFrame->SetTitle("M_{jet} distribution in Z+jets MC"); // Alpha ratio part mZH.setRange("fullRange", 900., 3000.); RooBinning binsmZH(21, 900, 3000); RooRealVar a("a", "a", 0., -1., 1.); RooRealVar b("b", "b", 1000, 0., 4000.); RooGenericPdf model_ZHSB("model_ZHSB", "model_ZHSB", "TMath::Exp(@1*@0+@2/@0)", RooArgSet(mZH,a,b)); RooGenericPdf model_ZHSG("model_ZHSG", "model_ZHSG", "TMath::Exp(@1*@0+@2/@0)", RooArgSet(mZH,a,b)); RooGenericPdf model_ZH ("model_ZH", "model_ZH", "TMath::Exp(@1*@0+@2/@0)", RooArgSet(mZH,a,b)); RooExtendPdf ext_model_ZHSB("ext_model_ZHSB", "ext_model_ZHSB", model_ZHSB, nMcEvents); RooExtendPdf ext_model_ZHSG("ext_model_ZHSG", "ext_model_ZHSG", model_ZHSG, nMcEvents); RooExtendPdf ext_model_ZH ("ext_model_ZH", "ext_model_ZH", model_ZH, nDataEvents); // Fit ZH mass in side band RooFitResult* mZHSB_result = ext_model_ZHSB.fitTo(dataSetZjetsSB, SumW2Error(true), Extended(true), Range("fullRange"), Strategy(2), Minimizer("Minuit2"), Save(1)); float p0 = a.getVal(); float p1 = b.getVal(); // Fit ZH mass in signal region RooFitResult* mZHSG_result = ext_model_ZHSG.fitTo(dataSetZjetsSG, SumW2Error(true), Extended(true), Range("fullRange"), Strategy(2), Minimizer("Minuit2"), Save(1)); float p2 = a.getVal(); float p3 = b.getVal(); // Fit ZH mass in side band region (data) RooFitResult* mZH_result = ext_model_ZH.fitTo(dataSetDataSB, SumW2Error(true), Extended(true), Range("fullRange"), Strategy(2), Minimizer("Minuit2"), Save(1)); // Draw the model of alpha ratio // Multiply the model of background in data side band with the model of alpha ratio to the a model of background in data signal region RooGenericPdf model_alpha("model_alpha", "model_alpha", Form("TMath::Exp(%f*@0+%f/@0)/TMath::Exp(%f*@0+%f/@0)", p2,p3,p0,p1), RooArgSet(mZH)); RooProdPdf model_sigData("model_sigData", "ext_model_ZH*model_alpha", RooArgList(ext_model_ZH,model_alpha)); // Plot the results to a frame RooPlot* mZHFrameMC = mZH.frame(); dataSetZjetsSB.plotOn(mZHFrameMC, Binning(binsmZH)); ext_model_ZHSB.plotOn(mZHFrameMC, VisualizeError(*mZHSB_result), FillColor(kYellow)); dataSetZjetsSB.plotOn(mZHFrameMC, Binning(binsmZH)); ext_model_ZHSB.plotOn(mZHFrameMC, LineStyle(7), LineColor(kBlue)); dataSetZjetsSG.plotOn(mZHFrameMC, Binning(binsmZH)); ext_model_ZHSG.plotOn(mZHFrameMC, VisualizeError(*mZHSG_result), FillColor(kYellow)); dataSetZjetsSG.plotOn(mZHFrameMC, Binning(binsmZH)); ext_model_ZHSG.plotOn(mZHFrameMC, LineStyle(7), LineColor(kRed)); TLegend* leg = new TLegend(0.65,0.77,0.85,0.85); leg->AddEntry(mZHFrameMC->findObject(mZHFrameMC->nameOf(3)), "side band", "l"); leg->AddEntry(mZHFrameMC->findObject(mZHFrameMC->nameOf(7)), "signal region", "l"); leg->Draw(); mZHFrameMC->addObject(leg); mZHFrameMC->SetTitle("M_{ZH} distribution in MC"); RooPlot* mZHFrame = mZH.frame(); dataSetDataSB.plotOn(mZHFrame, Binning(binsmZH)); ext_model_ZH .plotOn(mZHFrame, VisualizeError(*mZH_result), FillColor(kYellow)); dataSetDataSB.plotOn(mZHFrame, Binning(binsmZH)); ext_model_ZH .plotOn(mZHFrame, LineStyle(7), LineColor(kBlue)); model_sigData.plotOn(mZHFrame, Normalization(normFactor, RooAbsReal::NumEvent), LineStyle(7), LineColor(kRed)); TLegend* leg1 = new TLegend(0.65,0.77,0.85,0.85); leg1->AddEntry(mZHFrame->findObject(mZHFrame->nameOf(3)), "side band", "l"); leg1->AddEntry(mZHFrame->findObject(mZHFrame->nameOf(4)), "signal region", "l"); leg1->Draw(); mZHFrame->addObject(leg1); mZHFrame->SetTitle("M_{ZH} distribution in Data"); TCanvas* c = new TCanvas("c","",0,0,1000,800); c->cd(); mZHFrameMC->Draw(); c->Print(Form("rooFit_forData_%s_cat%s.pdf(", channel.data(), catcut.data())); c->cd(); mZHFrame->Draw(); c->Print(Form("rooFit_forData_%s_cat%s.pdf", channel.data(), catcut.data())); c->cd(); mJetFrame->Draw(); c->Print(Form("rooFit_forData_%s_cat%s.pdf)", channel.data(), catcut.data())); }
//------------------------------------------------------------- //Plot the model fitting function for signal+background //============================================================= void MakePlots(RooWorkspace *ws, RooFitResult *fitResult2D) { RooPlot* framex = 0; RooPlot* framey = 0; //Import yield variables RooRealVar *nsig = ws->var("N (Sig)"); RooRealVar *nres = ws->var("N (ResBkg)"); RooRealVar *nnonres = ws->var("N (NonResBkg)"); //Select and plot only one experiment if (! (nsig->getVal() >= 15.6 && nsig->getVal() <= 17.0 && nres->getVal() >= 27.9 && nres->getVal() <= 28.0 && nnonres->getVal() <= 287.)) return; if (alreadyPlotted) return; alreadyPlotted = 1; //Import the PDF's RooAbsPdf *model2Dpdf = ws->pdf("model2Dpdf"); RooAbsPdf *sigPDFPho = ws->pdf("sigPDFPho"); RooAbsPdf *resPDFPho = ws->pdf("resPDFPho"); RooAbsPdf *nonresPDFPho = ws->pdf("nonresPDFPho"); RooAbsPdf *sigPDFBjet = ws->pdf("sigPDFBjet"); RooAbsPdf *sigPDFBjetCut = ws->pdf("sigPDFBjetCut"); RooAbsPdf *resPDFBjet = ws->pdf("resPDFBjet"); RooAbsPdf *resPDFBjetExt = ws->pdf("resPDFBjetExt"); RooAbsPdf *nonresPDFBjet = ws->pdf("nonresPDFBjet"); //x-axis variables RooRealVar *massPho = ws->var("massPho"); RooRealVar *massBjet = ws->var("massBjet"); RooRealVar *massBjetExt = ws->var("massBjetExt"); RooRealVar *massBjetCut = ws->var("massBjetCut"); //sig variables RooRealVar *sigMeanBjet = ws->var("sigMeanBjet"); RooRealVar *sigSigmaBjet = ws->var("sigSigmaBjet"); RooRealVar *sigAlpha = ws->var("sigAlpha"); RooRealVar *sigPower = ws->var("sigPower"); //res bkg variables RooRealVar *resMeanBjet = ws->var("resMeanBjet"); RooRealVar *resSigmaBjet = ws->var("resSigmaBjet"); RooRealVar *resAlpha = ws->var("resAlpha"); RooRealVar *resPower = ws->var("resPower"); RooRealVar *resExpo = ws->var("resExpo"); RooRealVar *nbbH = ws->var("nbbH"); RooRealVar *nOthers = ws->var("nOthers"); //simulated data RooDataHist *sigBjetData = (RooDataHist *)ws->data("sigBjetData"); RooDataHist *resBjetDataExt = (RooDataHist *)ws->data("resBjetDataExt"); RooDataSet *pseudoData2D = (RooDataSet *)ws->data("pseudoData2D"); //Plot of 2D generated data and fits TH1 *data2d = pseudoData2D->createHistogram("2D Data", *massBjet,Binning(25), YVar(*massPho,Binning(25))); data2d->SetStats(0); TH1 *fit2d = model2Dpdf->createHistogram("2D Fit", *massBjet, YVar(*massPho)); fit2d->SetStats(0); cv = new TCanvas("cv","cv",1600,600); cv->Divide(2); cv->cd(1); gPad->SetLeftMargin(0.15); data2d->Draw("LEGO2"); data2d->SetTitle(""); data2d->GetXaxis()->SetTitleOffset(2); data2d->GetXaxis()->SetTitle("M_{bb} [GeV/c^{2}]"); data2d->GetYaxis()->SetTitleOffset(2.2); data2d->GetYaxis()->SetTitle("M_{#gamma#gamma} [GeV/c^{2}]"); data2d->GetZaxis()->SetTitleOffset(1.75); cv->cd(2); gPad->SetLeftMargin(0.15); fit2d->Draw("SURF1"); fit2d->SetTitle(""); fit2d->GetXaxis()->SetTitleOffset(2); data2d->GetXaxis()->SetTitle("M_{bb} [GeV/c^{2}]"); fit2d->GetYaxis()->SetTitleOffset(2.2); data2d->GetYaxis()->SetTitle("M_{#gamma#gamma} [GeV/c^{2}]"); fit2d->GetZaxis()->SetTitleOffset(1.75); cv->SaveAs(Form("Plots/AllSignalBkgd/Fits/Toys/twoDimensionalFits_%d.gif",1)); //Plot of massBjet and massPho projections from 2D fit massPho->setRange("PhoWindow",120,130); framex = massBjet->frame(Bins(50)); framex->SetTitle(""); framex->SetXTitle("M_{bb} [GeV/c^{2}]"); framex->SetYTitle("Number of Events"); pseudoData2D->plotOn(framex, CutRange("PhoWindow")); model2Dpdf->plotOn(framex, ProjectionRange("PhoWindow"), VisualizeError(*fitResult2D), FillStyle(3001)); model2Dpdf->plotOn(framex, ProjectionRange("PhoWindow")); model2Dpdf->plotOn(framex, ProjectionRange("PhoWindow"), Components("sigPDFBjet"), LineStyle(kDashed), LineColor(kRed)); model2Dpdf->plotOn(framex, ProjectionRange("PhoWindow"), Components("resPDFBjet"), LineStyle(kDashed), LineColor(kOrange)); model2Dpdf->plotOn(framex, ProjectionRange("PhoWindow"), Components("nonresPDFBjet"), LineStyle(kDashed), LineColor(kGreen)); framey = massPho->frame(Bins(50)); framey->SetTitle(""); framey->SetXTitle("M_{#gamma#gamma} [GeV/c^{2}]"); framey->SetYTitle("Number of Events"); pseudoData2D->plotOn(framey); model2Dpdf->plotOn(framey, VisualizeError(*fitResult2D), FillStyle(3001)); model2Dpdf->plotOn(framey); model2Dpdf->plotOn(framey,Components("sigPDFPho"), LineStyle(kDashed), LineColor(kRed)); model2Dpdf->plotOn(framey,Components("resPDFPho"), LineStyle(kDashed), LineColor(kOrange)); model2Dpdf->plotOn(framey,Components("nonresPDFPho"), LineStyle(kDashed), LineColor(kGreen)); cv = new TCanvas("cv","cv",1600,600); cv->Divide(2); cv->cd(1); framex->Draw(); tex = new TLatex(); tex->SetNDC(); tex->SetTextSize(0.042); tex->SetTextFont(42); tex->DrawLatex(0.52, 0.84, Form("N_{Sig} = %.2f +/- %.2f", nsig->getVal(), nsig->getPropagatedError(*fitResult2D))); tex->DrawLatex(0.52, 0.79, Form("N_{ResBkg} = %.2f +/- %.2f", nres->getVal(), nres->getPropagatedError(*fitResult2D))); tex->DrawLatex(0.52, 0.74, Form("N_{NonResBkg} = %.2f +/- %.2f", nnonres->getVal(), nnonres->getPropagatedError(*fitResult2D))); tex->Draw(); cv->Update(); cv->cd(2); framey->Draw(); tex->DrawLatex(0.52, 0.84, Form("N_{Sig} = %.2f +/- %.2f", nsig->getVal(), nsig->getPropagatedError(*fitResult2D))); tex->DrawLatex(0.52, 0.79, Form("N_{ResBkg} = %.2f +/- %.2f", nres->getVal(), nres->getPropagatedError(*fitResult2D))); tex->DrawLatex(0.52, 0.74, Form("N_{NonResBkg} = %.2f +/- %.2f", nnonres->getVal(), nnonres->getPropagatedError(*fitResult2D))); tex->Draw(); cv->Update(); cv->SaveAs(Form("Plots/AllSignalBkgd/Fits/Toys/projectionFits_%d.gif",1)); }
void eregtesting_13TeV_Pi0(bool dobarrel=true, bool doele=false,int gammaID=0) { //output dir TString EEorEB = "EE"; if(dobarrel) { EEorEB = "EB"; } TString gammaDir = "bothGammas"; if(gammaID==1) { gammaDir = "gamma1"; } else if(gammaID==2) { gammaDir = "gamma2"; } TString dirname = TString::Format("ereg_test_plots/%s_%s",gammaDir.Data(),EEorEB.Data()); gSystem->mkdir(dirname,true); gSystem->cd(dirname); //read workspace from training TString fname; if (doele && dobarrel) fname = "wereg_ele_eb.root"; else if (doele && !dobarrel) fname = "wereg_ele_ee.root"; else if (!doele && dobarrel) fname = "wereg_ph_eb.root"; else if (!doele && !dobarrel) fname = "wereg_ph_ee.root"; TString infile = TString::Format("../../ereg_ws/%s/%s",gammaDir.Data(),fname.Data()); TFile *fws = TFile::Open(infile); RooWorkspace *ws = (RooWorkspace*)fws->Get("wereg"); //read variables from workspace RooGBRTargetFlex *meantgt = static_cast<RooGBRTargetFlex*>(ws->arg("sigmeant")); RooRealVar *tgtvar = ws->var("tgtvar"); RooArgList vars; vars.add(meantgt->FuncVars()); vars.add(*tgtvar); //read testing dataset from TTree RooRealVar weightvar("weightvar","",1.); TTree *dtree; if (doele) { //TFile *fdin = TFile::Open("root://eoscms.cern.ch//eos/cms/store/cmst3/user/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TFile *fdin = TFile::Open("/data/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterSingleInvert"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } else { if(dobarrel) { TFile *fdin = TFile::Open("/afs/cern.ch/work/z/zhicaiz/public/ECALpro_MC_TreeForRegression/Gun_Pi0_Pt1To15_FlatPU0to50RAW_withHLT_80X_mcRun2_GEN-SIM-RAW_ALL_EcalNtp_ALL_EB_combine_test.root");//("root://eoscms.cern.ch///eos/cms/store/cmst3/user/bendavid/idTreesAug1/hgg-2013Final8TeV_ID_s12-h124gg-gf-v7n_noskim.root"); // TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPreselNoSmear"); if(gammaID==0) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma"); } else if(gammaID==1) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma1"); } else if(gammaID==2) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma2"); } } else { TFile *fdin = TFile::Open("/afs/cern.ch/work/z/zhicaiz/public/ECALpro_MC_TreeForRegression/Gun_Pi0_Pt1To15_FlatPU0to50RAW_withHLT_80X_mcRun2_GEN-SIM-RAW_ALL_EcalNtp_ALL_EE_combine_test.root");//("root://eoscms.cern.ch///eos/cms/store/cmst3/user/bendavid/idTreesAug1/hgg-2013Final8TeV_ID_s12-h124gg-gf-v7n_noskim.root"); // TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPreselNoSmear"); if(gammaID==0) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma"); } else if(gammaID==1) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma1"); } else if(gammaID==2) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma2"); } } } //selection cuts for testing //TCut selcut = "(STr2_enG1_true/cosh(STr2_Eta_1)>1.0) && (STr2_S4S9_1>0.75)"; TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03)"; //TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)<60)"; //TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)>60)"; //TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.9) && (STr2_S2S9>0.85)&& (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)<60)"; //TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.9) && (STr2_S2S9>0.85)&& (STr2_isMerging < 2) && (STr2_DeltaR < 0.03)"; /* TCut selcut; if (dobarrel) selcut = "ph.genpt>25. && ph.isbarrel && ph.ispromptgen"; else selcut = "ph.genpt>25. && !ph.isbarrel && ph.ispromptgen"; */ TCut selweight = "xsecweight(procidx)*puweight(numPU,procidx)"; TCut prescale10 = "(Entry$%10==0)"; TCut prescale10alt = "(Entry$%10==1)"; TCut prescale25 = "(Entry$%25==0)"; TCut prescale100 = "(Entry$%100==0)"; TCut prescale1000 = "(Entry$%1000==0)"; TCut evenevents = "(Entry$%2==0)"; TCut oddevents = "(Entry$%2==1)"; TCut prescale100alt = "(Entry$%100==1)"; TCut prescale1000alt = "(Entry$%1000==1)"; TCut prescale50alt = "(Entry$%50==1)"; TCut Events3_4 = "(Entry$%4==3)"; TCut Events1_4 = "(Entry$%4==1)"; TCut Events2_4 = "(Entry$%4==2)"; TCut Events0_4 = "(Entry$%4==0)"; TCut Events01_4 = "(Entry$%4<2)"; TCut Events23_4 = "(Entry$%4>1)"; if (doele) weightvar.SetTitle(prescale100alt*selcut); else weightvar.SetTitle(selcut); //make testing dataset RooDataSet *hdata = RooTreeConvert::CreateDataSet("hdata",dtree,vars,weightvar); if (doele) weightvar.SetTitle(prescale1000alt*selcut); else weightvar.SetTitle(prescale10alt*selcut); //make reduced testing dataset for integration over conditional variables RooDataSet *hdatasmall = RooTreeConvert::CreateDataSet("hdatasmall",dtree,vars,weightvar); //retrieve full pdf from workspace RooAbsPdf *sigpdf = ws->pdf("sigpdf"); //input variable corresponding to sceta RooRealVar *scetavar = ws->var("var_1"); RooRealVar *scphivar = ws->var("var_2"); //regressed output functions RooAbsReal *sigmeanlim = ws->function("sigmeanlim"); RooAbsReal *sigwidthlim = ws->function("sigwidthlim"); RooAbsReal *signlim = ws->function("signlim"); RooAbsReal *sign2lim = ws->function("sign2lim"); RooAbsReal *sigalphalim = ws->function("sigalphalim"); RooAbsReal *sigalpha2lim = ws->function("sigalpha2lim"); //formula for corrected energy/true energy ( 1.0/(etrue/eraw) * regression mean) RooFormulaVar ecor("ecor","","1./(@0)*@1",RooArgList(*tgtvar,*sigmeanlim)); RooRealVar *ecorvar = (RooRealVar*)hdata->addColumn(ecor); ecorvar->setRange(0.,2.); ecorvar->setBins(800); //formula for raw energy/true energy (1.0/(etrue/eraw)) RooFormulaVar raw("raw","","1./@0",RooArgList(*tgtvar)); RooRealVar *rawvar = (RooRealVar*)hdata->addColumn(raw); rawvar->setRange(0.,2.); rawvar->setBins(800); //clone data and add regression outputs for plotting RooDataSet *hdataclone = new RooDataSet(*hdata,"hdataclone"); RooRealVar *meanvar = (RooRealVar*)hdataclone->addColumn(*sigmeanlim); RooRealVar *widthvar = (RooRealVar*)hdataclone->addColumn(*sigwidthlim); RooRealVar *nvar = (RooRealVar*)hdataclone->addColumn(*signlim); RooRealVar *n2var = (RooRealVar*)hdataclone->addColumn(*sign2lim); RooRealVar *alphavar = (RooRealVar*)hdataclone->addColumn(*sigalphalim); RooRealVar *alpha2var = (RooRealVar*)hdataclone->addColumn(*sigalpha2lim); //plot target variable and weighted regression prediction (using numerical integration over reduced testing dataset) TCanvas *craw = new TCanvas; //RooPlot *plot = tgtvar->frame(0.6,1.2,100); RooPlot *plot = tgtvar->frame(0.6,2.0,100); hdata->plotOn(plot); sigpdf->plotOn(plot,ProjWData(*hdatasmall)); plot->Draw(); craw->SaveAs("RawE.pdf"); craw->SaveAs("RawE.png"); craw->SetLogy(); plot->SetMinimum(0.1); craw->SaveAs("RawElog.pdf"); craw->SaveAs("RawElog.png"); //plot distribution of regressed functions over testing dataset TCanvas *cmean = new TCanvas; RooPlot *plotmean = meanvar->frame(0.8,2.0,100); hdataclone->plotOn(plotmean); plotmean->Draw(); cmean->SaveAs("mean.pdf"); cmean->SaveAs("mean.png"); TCanvas *cwidth = new TCanvas; RooPlot *plotwidth = widthvar->frame(0.,0.05,100); hdataclone->plotOn(plotwidth); plotwidth->Draw(); cwidth->SaveAs("width.pdf"); cwidth->SaveAs("width.png"); TCanvas *cn = new TCanvas; RooPlot *plotn = nvar->frame(0.,111.,200); hdataclone->plotOn(plotn); plotn->Draw(); cn->SaveAs("n.pdf"); cn->SaveAs("n.png"); TCanvas *cn2 = new TCanvas; RooPlot *plotn2 = n2var->frame(0.,111.,100); hdataclone->plotOn(plotn2); plotn2->Draw(); cn2->SaveAs("n2.pdf"); cn2->SaveAs("n2.png"); TCanvas *calpha = new TCanvas; RooPlot *plotalpha = alphavar->frame(0.,5.,200); hdataclone->plotOn(plotalpha); plotalpha->Draw(); calpha->SaveAs("alpha.pdf"); calpha->SaveAs("alpha.png"); TCanvas *calpha2 = new TCanvas; RooPlot *plotalpha2 = alpha2var->frame(0.,5.,200); hdataclone->plotOn(plotalpha2); plotalpha2->Draw(); calpha2->SaveAs("alpha2.pdf"); calpha2->SaveAs("alpha2.png"); TCanvas *ceta = new TCanvas; RooPlot *ploteta = scetavar->frame(-2.6,2.6,200); hdataclone->plotOn(ploteta); ploteta->Draw(); ceta->SaveAs("eta.pdf"); ceta->SaveAs("eta.png"); //create histograms for eraw/etrue and ecor/etrue to quantify regression performance TH1 *heraw;// = hdata->createHistogram("hraw",*rawvar,Binning(800,0.,2.)); TH1 *hecor;// = hdata->createHistogram("hecor",*ecorvar); if (EEorEB == "EB") { heraw = hdata->createHistogram("hraw",*rawvar,Binning(800,0.8,1.1)); hecor = hdata->createHistogram("hecor",*ecorvar, Binning(800,0.8,1.1)); } else { heraw = hdata->createHistogram("hraw",*rawvar,Binning(200,0.,2.)); hecor = hdata->createHistogram("hecor",*ecorvar, Binning(200,0.,2.)); } //heold->SetLineColor(kRed); hecor->SetLineColor(kBlue); heraw->SetLineColor(kMagenta); hecor->GetYaxis()->SetRangeUser(1.0,1.3*hecor->GetMaximum()); heraw->GetYaxis()->SetRangeUser(1.0,1.3*hecor->GetMaximum()); hecor->GetXaxis()->SetRangeUser(0.0,1.5); heraw->GetXaxis()->SetRangeUser(0.0,1.5); /*if(EEorEB == "EE") { heraw->GetYaxis()->SetRangeUser(10.0,200.0); hecor->GetYaxis()->SetRangeUser(10.0,200.0); } */ //heold->GetXaxis()->SetRangeUser(0.6,1.2); double effsigma_cor, effsigma_raw, fwhm_cor, fwhm_raw; if(EEorEB == "EB") { TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(200,0.,2.)); effsigma_cor = effSigma(hecorfine); fwhm_cor = FWHM(hecorfine); TH1 *herawfine = hdata->createHistogram("herawfine",*rawvar,Binning(200,0.,2.)); effsigma_raw = effSigma(herawfine); fwhm_raw = FWHM(herawfine); } else { TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(200,0.,2.)); effsigma_cor = effSigma(hecorfine); fwhm_cor = FWHM(hecorfine); TH1 *herawfine = hdata->createHistogram("herawfine",*rawvar,Binning(200,0.,2.)); effsigma_raw = effSigma(herawfine); fwhm_raw = FWHM(herawfine); } TCanvas *cresponse = new TCanvas; gStyle->SetOptStat(0); gStyle->SetPalette(107); hecor->SetTitle(""); heraw->SetTitle(""); hecor->Draw("HIST"); //heold->Draw("HISTSAME"); heraw->Draw("HISTSAME"); //show errSigma in the plot TLegend *leg = new TLegend(0.1, 0.75, 0.7, 0.9); leg->AddEntry(hecor,Form("E_{cor}/E_{true}, #sigma_{eff}=%4.3f, FWHM=%4.3f", effsigma_cor, fwhm_cor),"l"); leg->AddEntry(heraw,Form("E_{raw}/E_{true}, #sigma_{eff}=%4.3f, FWHM=%4.3f", effsigma_raw, fwhm_raw),"l"); leg->SetFillStyle(0); leg->SetBorderSize(0); // leg->SetTextColor(kRed); leg->Draw(); cresponse->SaveAs("response.pdf"); cresponse->SaveAs("response.png"); cresponse->SetLogy(); cresponse->SaveAs("responselog.pdf"); cresponse->SaveAs("responselog.png"); // draw CCs vs eta and phi TCanvas *c_eta = new TCanvas; TH1 *h_eta = hdata->createHistogram("h_eta",*scetavar,Binning(100,-3.2,3.2)); h_eta->Draw("HIST"); c_eta->SaveAs("heta.pdf"); c_eta->SaveAs("heta.png"); TCanvas *c_phi = new TCanvas; TH1 *h_phi = hdata->createHistogram("h_phi",*scphivar,Binning(100,-3.2,3.2)); h_phi->Draw("HIST"); c_phi->SaveAs("hphi.pdf"); c_phi->SaveAs("hphi.png"); RooRealVar *scetaiXvar = ws->var("var_6"); RooRealVar *scphiiYvar = ws->var("var_7"); if(EEorEB=="EB") { scetaiXvar->setRange(-90,90); scetaiXvar->setBins(180); scphiiYvar->setRange(0,360); scphiiYvar->setBins(360); } else { scetaiXvar->setRange(0,50); scetaiXvar->setBins(50); scphiiYvar->setRange(0,50); scphiiYvar->setBins(50); } ecorvar->setRange(0.5,1.5); ecorvar->setBins(800); rawvar->setRange(0.5,1.5); rawvar->setBins(800); TCanvas *c_cor_eta = new TCanvas; TH2F *h_CC_eta = hdata->createHistogram(*scetaiXvar, *ecorvar, "","cor_vs_eta"); if(EEorEB=="EB") { h_CC_eta->GetXaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetXaxis()->SetTitle("iX"); } h_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_eta->Draw("COLZ"); c_cor_eta->SaveAs("cor_vs_eta.pdf"); c_cor_eta->SaveAs("cor_vs_eta.png"); TCanvas *c_cor_phi = new TCanvas; TH2F *h_CC_phi = hdata->createHistogram(*scphiiYvar, *ecorvar, "","cor_vs_phi"); if(EEorEB=="EB") { h_CC_phi->GetXaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetXaxis()->SetTitle("iY"); } h_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_phi->Draw("COLZ"); c_cor_phi->SaveAs("cor_vs_phi.pdf"); c_cor_phi->SaveAs("cor_vs_phi.png"); TCanvas *c_raw_eta = new TCanvas; TH2F *h_RC_eta = hdata->createHistogram(*scetaiXvar, *rawvar, "","raw_vs_eta"); if(EEorEB=="EB") { h_RC_eta->GetXaxis()->SetTitle("i#eta"); } else { h_RC_eta->GetXaxis()->SetTitle("iX"); } h_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_eta->Draw("COLZ"); c_raw_eta->SaveAs("raw_vs_eta.pdf"); c_raw_eta->SaveAs("raw_vs_eta.png"); TCanvas *c_raw_phi = new TCanvas; TH2F *h_RC_phi = hdata->createHistogram(*scphiiYvar, *rawvar, "","raw_vs_phi"); if(EEorEB=="EB") { h_RC_phi->GetXaxis()->SetTitle("i#phi"); } else { h_RC_phi->GetXaxis()->SetTitle("iY"); } h_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_phi->Draw("COLZ"); c_raw_phi->SaveAs("raw_vs_phi.pdf"); c_raw_phi->SaveAs("raw_vs_phi.png"); //on2,5,20, etc if(EEorEB == "EB") { TCanvas *myC_iCrystal_mod = new TCanvas; RooRealVar *iEtaOn5var = ws->var("var_8"); iEtaOn5var->setRange(0,5); iEtaOn5var->setBins(5); TH2F *h_CC_iEtaOn5 = hdata->createHistogram(*iEtaOn5var, *ecorvar, "","cor_vs_iEtaOn5"); h_CC_iEtaOn5->GetXaxis()->SetTitle("iEtaOn5"); h_CC_iEtaOn5->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_iEtaOn5->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_iEtaOn5.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_iEtaOn5.png"); TH2F *h_RC_iEtaOn5 = hdata->createHistogram(*iEtaOn5var, *rawvar, "","raw_vs_iEtaOn5"); h_RC_iEtaOn5->GetXaxis()->SetTitle("iEtaOn5"); h_RC_iEtaOn5->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_iEtaOn5->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_iEtaOn5.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_iEtaOn5.png"); RooRealVar *iPhiOn2var = ws->var("var_9"); iPhiOn2var->setRange(0,2); iPhiOn2var->setBins(2); TH2F *h_CC_iPhiOn2 = hdata->createHistogram(*iPhiOn2var, *ecorvar, "","cor_vs_iPhiOn2"); h_CC_iPhiOn2->GetXaxis()->SetTitle("iPhiOn2"); h_CC_iPhiOn2->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_iPhiOn2->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_iPhiOn2.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_iPhiOn2.png"); TH2F *h_RC_iPhiOn2 = hdata->createHistogram(*iPhiOn2var, *rawvar, "","raw_vs_iPhiOn2"); h_RC_iPhiOn2->GetXaxis()->SetTitle("iPhiOn2"); h_RC_iPhiOn2->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_iPhiOn2->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_iPhiOn2.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_iPhiOn2.png"); RooRealVar *iPhiOn20var = ws->var("var_10"); iPhiOn20var->setRange(0,20); iPhiOn20var->setBins(20); TH2F *h_CC_iPhiOn20 = hdata->createHistogram(*iPhiOn20var, *ecorvar, "","cor_vs_iPhiOn20"); h_CC_iPhiOn20->GetXaxis()->SetTitle("iPhiOn20"); h_CC_iPhiOn20->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_iPhiOn20->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_iPhiOn20.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_iPhiOn20.png"); TH2F *h_RC_iPhiOn20 = hdata->createHistogram(*iPhiOn20var, *rawvar, "","raw_vs_iPhiOn20"); h_RC_iPhiOn20->GetXaxis()->SetTitle("iPhiOn20"); h_RC_iPhiOn20->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_iPhiOn20->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_iPhiOn20.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_iPhiOn20.png"); RooRealVar *iEtaOn2520var = ws->var("var_11"); iEtaOn2520var->setRange(-25,25); iEtaOn2520var->setBins(50); TH2F *h_CC_iEtaOn2520 = hdata->createHistogram(*iEtaOn2520var, *ecorvar, "","cor_vs_iEtaOn2520"); h_CC_iEtaOn2520->GetXaxis()->SetTitle("iEtaOn2520"); h_CC_iEtaOn2520->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_iEtaOn2520->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_iEtaOn2520.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_iEtaOn2520.png"); TH2F *h_RC_iEtaOn2520 = hdata->createHistogram(*iEtaOn2520var, *rawvar, "","raw_vs_iEtaOn2520"); h_RC_iEtaOn2520->GetXaxis()->SetTitle("iEtaOn2520"); h_RC_iEtaOn2520->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_iEtaOn2520->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_iEtaOn2520.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_iEtaOn2520.png"); } // other variables TCanvas *myC_variables = new TCanvas; RooRealVar *Nxtalvar = ws->var("var_3"); Nxtalvar->setRange(0,10); Nxtalvar->setBins(10); TH2F *h_CC_Nxtal = hdata->createHistogram(*Nxtalvar, *ecorvar, "","cor_vs_Nxtal"); h_CC_Nxtal->GetXaxis()->SetTitle("Nxtal"); h_CC_Nxtal->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_Nxtal->Draw("COLZ"); myC_variables->SaveAs("cor_vs_Nxtal.pdf"); myC_variables->SaveAs("cor_vs_Nxtal.png"); TH2F *h_RC_Nxtal = hdata->createHistogram(*Nxtalvar, *rawvar, "","raw_vs_Nxtal"); h_RC_Nxtal->GetXaxis()->SetTitle("Nxtal"); h_RC_Nxtal->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_Nxtal->Draw("COLZ"); myC_variables->SaveAs("raw_vs_Nxtal.pdf"); myC_variables->SaveAs("raw_vs_Nxtal.png"); RooRealVar *S4S9var = ws->var("var_4"); int Nbins_S4S9 = 100; double Low_S4S9 = 0.6; double High_S4S9 = 1.0; S4S9var->setRange(Low_S4S9,High_S4S9); S4S9var->setBins(Nbins_S4S9); TH2F *h_CC_S4S9 = hdata->createHistogram(*S4S9var, *ecorvar, "","cor_vs_S4S9"); h_CC_S4S9->GetXaxis()->SetTitle("S4S9"); h_CC_S4S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S4S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S4S9.pdf"); myC_variables->SaveAs("cor_vs_S4S9.png"); TH2F *h_RC_S4S9 = hdata->createHistogram(*S4S9var, *rawvar, "","raw_vs_S4S9"); h_RC_S4S9->GetXaxis()->SetTitle("S4S9"); h_RC_S4S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S4S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S4S9.pdf"); myC_variables->SaveAs("raw_vs_S4S9.png"); /* RooRealVar *S1S9var = ws->var("var_5"); S1S9var->setRange(0.3,1.0); S1S9var->setBins(100); TH2F *h_CC_S1S9 = hdata->createHistogram(*S1S9var, *ecorvar, "","cor_vs_S1S9"); h_CC_S1S9->GetXaxis()->SetTitle("S1S9"); h_CC_S1S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S1S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S1S9.pdf"); TH2F *h_RC_S1S9 = hdata->createHistogram(*S1S9var, *rawvar, "","raw_vs_S1S9"); h_RC_S1S9->GetXaxis()->SetTitle("S1S9"); h_RC_S1S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S1S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S1S9.pdf"); */ RooRealVar *S2S9var = ws->var("var_5"); int Nbins_S2S9 = 100; double Low_S2S9 = 0.5; double High_S2S9 = 1.0; S2S9var->setRange(Low_S2S9,High_S2S9); S2S9var->setBins(Nbins_S2S9); TH2F *h_CC_S2S9 = hdata->createHistogram(*S2S9var, *ecorvar, "","cor_vs_S2S9"); h_CC_S2S9->GetXaxis()->SetTitle("S2S9"); h_CC_S2S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S2S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S2S9.pdf"); myC_variables->SaveAs("cor_vs_S2S9.png"); TH2F *h_RC_S2S9 = hdata->createHistogram(*S2S9var, *rawvar, "","raw_vs_S2S9"); h_RC_S2S9->GetXaxis()->SetTitle("S2S9"); h_RC_S2S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S2S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S2S9.pdf"); myC_variables->SaveAs("raw_vs_S2S9.png"); TH2F *h_S2S9_eta = hdata->createHistogram(*scetaiXvar, *S2S9var, "","S2S9_vs_eta"); h_S2S9_eta->GetYaxis()->SetTitle("S2S9"); if(EEorEB=="EB") { h_CC_eta->GetYaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetYaxis()->SetTitle("iX"); } h_S2S9_eta->Draw("COLZ"); myC_variables->SaveAs("S2S9_vs_eta.pdf"); myC_variables->SaveAs("S2S9_vs_eta.png"); TH2F *h_S4S9_eta = hdata->createHistogram(*scetaiXvar, *S4S9var, "","S4S9_vs_eta"); h_S4S9_eta->GetYaxis()->SetTitle("S4S9"); if(EEorEB=="EB") { h_CC_eta->GetYaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetYaxis()->SetTitle("iX"); } h_S4S9_eta->Draw("COLZ"); myC_variables->SaveAs("S4S9_vs_eta.pdf"); myC_variables->SaveAs("S4S9_vs_eta.png"); TH2F *h_S2S9_phi = hdata->createHistogram(*scphiiYvar, *S2S9var, "","S2S9_vs_phi"); h_S2S9_phi->GetYaxis()->SetTitle("S2S9"); if(EEorEB=="EB") { h_CC_phi->GetYaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetYaxis()->SetTitle("iY"); } h_S2S9_phi->Draw("COLZ"); myC_variables->SaveAs("S2S9_vs_phi.pdf"); myC_variables->SaveAs("S2S9_vs_phi.png"); TH2F *h_S4S9_phi = hdata->createHistogram(*scphiiYvar, *S4S9var, "","S4S9_vs_phi"); h_S4S9_phi->GetYaxis()->SetTitle("S4S9"); if(EEorEB=="EB") { h_CC_phi->GetYaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetYaxis()->SetTitle("iY"); } h_S4S9_phi->Draw("COLZ"); myC_variables->SaveAs("S4S9_vs_phi.pdf"); myC_variables->SaveAs("S4S9_vs_phi.png"); /* RooRealVar *DeltaRvar = ws->var("var_6"); DeltaRvar->setRange(0.0,0.1); DeltaRvar->setBins(100); TH2F *h_CC_DeltaR = hdata->createHistogram(*DeltaRvar, *ecorvar, "","cor_vs_DeltaR"); h_CC_DeltaR->GetXaxis()->SetTitle("#Delta R"); h_CC_DeltaR->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_DeltaR->Draw("COLZ"); myC_variables->SaveAs("cor_vs_DeltaR.pdf"); myC_variables->SaveAs("cor_vs_DeltaR.png"); TH2F *h_RC_DeltaR = hdata->createHistogram(*DeltaRvar, *rawvar, "","raw_vs_DeltaR"); h_RC_DeltaR->GetXaxis()->SetTitle("#Delta R"); h_RC_DeltaR->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_DeltaR->Draw("COLZ"); myC_variables->SaveAs("raw_vs_DeltaR.pdf"); myC_variables->SaveAs("raw_vs_DeltaR.png"); */ if(EEorEB=="EE") { /* RooRealVar *Es_e1var = ws->var("var_9"); Es_e1var->setRange(0.0,200.0); Es_e1var->setBins(1000); TH2F *h_CC_Es_e1 = hdata->createHistogram(*Es_e1var, *ecorvar, "","cor_vs_Es_e1"); h_CC_Es_e1->GetXaxis()->SetTitle("Es_e1"); h_CC_Es_e1->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_Es_e1->Draw("COLZ"); myC_variables->SaveAs("cor_vs_Es_e1.pdf"); myC_variables->SaveAs("cor_vs_Es_e1.png"); TH2F *h_RC_Es_e1 = hdata->createHistogram(*Es_e1var, *rawvar, "","raw_vs_Es_e1"); h_RC_Es_e1->GetXaxis()->SetTitle("Es_e1"); h_RC_Es_e1->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_Es_e1->Draw("COLZ"); myC_variables->SaveAs("raw_vs_Es_e1.pdf"); myC_variables->SaveAs("raw_vs_Es_e1.png"); RooRealVar *Es_e2var = ws->var("var_10"); Es_e2var->setRange(0.0,200.0); Es_e2var->setBins(1000); TH2F *h_CC_Es_e2 = hdata->createHistogram(*Es_e2var, *ecorvar, "","cor_vs_Es_e2"); h_CC_Es_e2->GetXaxis()->SetTitle("Es_e2"); h_CC_Es_e2->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_Es_e2->Draw("COLZ"); myC_variables->SaveAs("cor_vs_Es_e2.pdf"); myC_variables->SaveAs("cor_vs_Es_e2.png"); TH2F *h_RC_Es_e2 = hdata->createHistogram(*Es_e2var, *rawvar, "","raw_vs_Es_e2"); h_RC_Es_e2->GetXaxis()->SetTitle("Es_e2"); h_RC_Es_e2->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_Es_e2->Draw("COLZ"); myC_variables->SaveAs("raw_vs_Es_e2.pdf"); myC_variables->SaveAs("raw_vs_Es_e2.png"); */ } TProfile *p_CC_eta = h_CC_eta->ProfileX("p_CC_eta",1,-1,"s"); p_CC_eta->GetYaxis()->SetRangeUser(0.7,1.2); if(EEorEB == "EB") { // p_CC_eta->GetYaxis()->SetRangeUser(0.85,1.0); // p_CC_eta->GetXaxis()->SetRangeUser(-1.5,1.5); } p_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); p_CC_eta->SetTitle(""); p_CC_eta->Draw(); myC_variables->SaveAs("profile_cor_vs_eta.pdf"); myC_variables->SaveAs("profile_cor_vs_eta.png"); TProfile *p_RC_eta = h_RC_eta->ProfileX("p_RC_eta",1,-1,"s"); p_RC_eta->GetYaxis()->SetRangeUser(0.7,1.2); if(EEorEB=="EB") { // p_RC_eta->GetYaxis()->SetRangeUser(0.80,0.95); // p_RC_eta->GetXaxis()->SetRangeUser(-1.5,1.5); } p_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); p_RC_eta->SetTitle(""); p_RC_eta->Draw(); myC_variables->SaveAs("profile_raw_vs_eta.pdf"); myC_variables->SaveAs("profile_raw_vs_eta.png"); int Nbins_iEta = EEorEB=="EB" ? 180 : 50; int nLow_iEta = EEorEB=="EB" ? -90 : 0; int nHigh_iEta = EEorEB=="EB" ? 90 : 50; TH1F *h1_RC_eta = new TH1F("h1_RC_eta","h1_RC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); for(int i=1;i<=Nbins_iEta;i++) { h1_RC_eta->SetBinContent(i,p_RC_eta->GetBinError(i)); } h1_RC_eta->GetXaxis()->SetTitle("i#eta"); h1_RC_eta->GetYaxis()->SetTitle("#sigma_{E_{raw}/E_{true}}"); h1_RC_eta->SetTitle(""); h1_RC_eta->Draw(); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_eta.pdf"); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_eta.png"); TH1F *h1_CC_eta = new TH1F("h1_CC_eta","h1_CC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); for(int i=1;i<=Nbins_iEta;i++) { h1_CC_eta->SetBinContent(i,p_CC_eta->GetBinError(i)); } h1_CC_eta->GetXaxis()->SetTitle("i#eta"); h1_CC_eta->GetYaxis()->SetTitle("#sigma_{E_{cor}/E_{true}}"); h1_CC_eta->SetTitle(""); h1_CC_eta->Draw(); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_eta.pdf"); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_eta.png"); TProfile *p_CC_phi = h_CC_phi->ProfileX("p_CC_phi",1,-1,"s"); p_CC_phi->GetYaxis()->SetRangeUser(0.7,1.2); if(EEorEB == "EB") { // p_CC_phi->GetYaxis()->SetRangeUser(0.94,1.00); } p_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); p_CC_phi->SetTitle(""); p_CC_phi->Draw(); myC_variables->SaveAs("profile_cor_vs_phi.pdf"); myC_variables->SaveAs("profile_cor_vs_phi.png"); TProfile *p_RC_phi = h_RC_phi->ProfileX("p_RC_phi",1,-1,"s"); p_RC_phi->GetYaxis()->SetRangeUser(0.7,1.2); if(EEorEB=="EB") { // p_RC_phi->GetYaxis()->SetRangeUser(0.89,0.95); } p_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); p_RC_phi->SetTitle(""); p_RC_phi->Draw(); myC_variables->SaveAs("profile_raw_vs_phi.pdf"); myC_variables->SaveAs("profile_raw_vs_phi.png"); int Nbins_iPhi = EEorEB=="EB" ? 360 : 50; int nLow_iPhi = EEorEB=="EB" ? 0 : 0; int nHigh_iPhi = EEorEB=="EB" ? 360 : 50; TH1F *h1_RC_phi = new TH1F("h1_RC_phi","h1_RC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); for(int i=1;i<=Nbins_iPhi;i++) { h1_RC_phi->SetBinContent(i,p_RC_phi->GetBinError(i)); } h1_RC_phi->GetXaxis()->SetTitle("i#phi"); h1_RC_phi->GetYaxis()->SetTitle("#sigma_{E_{raw}/E_{true}}"); h1_RC_phi->SetTitle(""); h1_RC_phi->Draw(); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_phi.pdf"); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_phi.png"); TH1F *h1_CC_phi = new TH1F("h1_CC_phi","h1_CC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); for(int i=1;i<=Nbins_iPhi;i++) { h1_CC_phi->SetBinContent(i,p_CC_phi->GetBinError(i)); } h1_CC_phi->GetXaxis()->SetTitle("i#phi"); h1_CC_phi->GetYaxis()->SetTitle("#sigma_{E_{cor}/E_{true}}"); h1_CC_phi->SetTitle(""); h1_CC_phi->Draw(); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_phi.pdf"); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_phi.png"); // FWHM over sigma_eff vs. eta/phi TH1F *h1_FoverS_RC_phi = new TH1F("h1_FoverS_RC_phi","h1_FoverS_RC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); TH1F *h1_FoverS_CC_phi = new TH1F("h1_FoverS_CC_phi","h1_FoverS_CC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); TH1F *h1_FoverS_RC_eta = new TH1F("h1_FoverS_RC_eta","h1_FoverS_RC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); TH1F *h1_FoverS_CC_eta = new TH1F("h1_FoverS_CC_eta","h1_FoverS_CC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); TH1F *h1_FoverS_CC_S2S9 = new TH1F("h1_FoverS_CC_S2S9","h1_FoverS_CC_S2S9",Nbins_S2S9,Low_S2S9,High_S2S9); TH1F *h1_FoverS_RC_S2S9 = new TH1F("h1_FoverS_RC_S2S9","h1_FoverS_RC_S2S9",Nbins_S2S9,Low_S2S9,High_S2S9); TH1F *h1_FoverS_CC_S4S9 = new TH1F("h1_FoverS_CC_S4S9","h1_FoverS_CC_S4S9",Nbins_S4S9,Low_S4S9,High_S4S9); TH1F *h1_FoverS_RC_S4S9 = new TH1F("h1_FoverS_RC_S4S9","h1_FoverS_RC_S4S9",Nbins_S4S9,Low_S4S9,High_S4S9); float FWHMoverSigmaEff = 0.0; TH1F *h_tmp_rawvar = new TH1F("tmp_rawvar","tmp_rawvar",800,0.5,1.5); TH1F *h_tmp_corvar = new TH1F("tmp_corvar","tmp_corvar",800,0.5,1.5); for(int i=1;i<=Nbins_iPhi;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_phi->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_phi->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_phi->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_phi->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_phi->GetXaxis()->SetTitle("i#phi"); h1_FoverS_CC_phi->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_phi->SetTitle(""); h1_FoverS_CC_phi->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_phi.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_phi.png"); h1_FoverS_RC_phi->GetXaxis()->SetTitle("i#phi"); h1_FoverS_RC_phi->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_phi->SetTitle(""); h1_FoverS_RC_phi->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_phi.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_phi.png"); for(int i=1;i<=Nbins_iEta;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_eta->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_eta->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_eta->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_eta->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_eta->GetXaxis()->SetTitle("i#eta"); h1_FoverS_CC_eta->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_eta->SetTitle(""); h1_FoverS_CC_eta->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_eta.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_eta.png"); h1_FoverS_RC_eta->GetXaxis()->SetTitle("i#eta"); h1_FoverS_RC_eta->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_eta->SetTitle(""); h1_FoverS_RC_eta->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_eta.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_eta.png"); for(int i=1;i<=Nbins_S2S9;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_S2S9->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_S2S9->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_S2S9->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_S2S9->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_S2S9->GetXaxis()->SetTitle("S2S9"); h1_FoverS_CC_S2S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_S2S9->GetYaxis()->SetRangeUser(0.0,1.0); h1_FoverS_CC_S2S9->SetTitle(""); h1_FoverS_CC_S2S9->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S2S9.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S2S9.png"); h1_FoverS_RC_S2S9->GetXaxis()->SetTitle("S2S9"); h1_FoverS_RC_S2S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_S2S9->GetYaxis()->SetRangeUser(0.0,2.0); h1_FoverS_RC_S2S9->SetTitle(""); h1_FoverS_RC_S2S9->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S2S9.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S2S9.png"); for(int i=1;i<=Nbins_S4S9;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_S4S9->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_S4S9->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_S4S9->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_S4S9->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_S4S9->GetXaxis()->SetTitle("S4S9"); h1_FoverS_CC_S4S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_S4S9->GetYaxis()->SetRangeUser(0.0,1.0); h1_FoverS_CC_S4S9->SetTitle(""); h1_FoverS_CC_S4S9->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S4S9.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S4S9.png"); h1_FoverS_RC_S4S9->GetXaxis()->SetTitle("S4S9"); h1_FoverS_RC_S4S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_S4S9->GetYaxis()->SetRangeUser(0.0,2.0); h1_FoverS_RC_S4S9->SetTitle(""); h1_FoverS_RC_S4S9->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S4S9.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S4S9.png"); printf("calc effsigma\n"); std::cout<<"_"<<EEorEB<<std::endl; printf("corrected curve effSigma= %5f, FWHM=%5f \n",effsigma_cor, fwhm_cor); printf("raw curve effSigma= %5f FWHM=%5f \n",effsigma_raw, fwhm_raw); /* new TCanvas; RooPlot *ploteold = testvar.frame(0.6,1.2,100); hdatasigtest->plotOn(ploteold); ploteold->Draw(); new TCanvas; RooPlot *plotecor = ecorvar->frame(0.6,1.2,100); hdatasig->plotOn(plotecor); plotecor->Draw(); */ }