void printMassFrom2DParameters(RooWorkspace myws, TPad* Pad, bool isPbPb, string pdfName, bool isWeighted) { Pad->cd(); TLatex *t = new TLatex(); t->SetNDC(); t->SetTextSize(0.026); float dy = 0.025; RooArgSet* Parameters = (RooArgSet*)myws.pdf(pdfName.c_str())->getParameters(RooArgSet(*myws.var("invMass"), *myws.var("ctau"), *myws.var("ctauErr")))->selectByAttrib("Constant",kFALSE); TIterator* parIt = Parameters->createIterator(); for (RooRealVar* it = (RooRealVar*)parIt->Next(); it!=NULL; it = (RooRealVar*)parIt->Next() ) { stringstream ss(it->GetName()); string s1, s2, s3, label; getline(ss, s1, '_'); getline(ss, s2, '_'); getline(ss, s3, '_'); // Parse the parameter's labels if(s1=="invMass" || s1=="ctauErr" || s1=="ctau"){continue;} else if(s1=="MassRatio"){continue;} else if(s1=="One"){continue;} else if(s1=="mMin"){continue;} else if(s1=="mMax"){continue;} if(s1=="RFrac2Svs1S"){ s1="R_{#psi(2S)/J/#psi}"; } else if(s1=="rSigma21"){ s1="(#sigma_{2}/#sigma_{1})"; } else if(s1.find("sigma")!=std::string::npos || s1.find("lambda")!=std::string::npos || s1.find("alpha")!=std::string::npos){ s1=Form("#%s",s1.c_str()); } if(s2=="PbPbvsPP") { s2="PbPb/PP"; } else if(s2=="Jpsi") { s2="J/#psi"; } else if(s2=="Psi2S") { s2="#psi(2S)"; } else if(s2=="Bkg") { s2="bkg"; } else if(s2=="CtauRes") { continue; } else if(s2=="JpsiNoPR") { continue; } else if(s2=="JpsiPR") { continue; } else if(s2=="Psi2SNoPR"){ continue; } else if(s2=="Psi2SPR") { continue; } else if(s2=="BkgNoPR") { continue; } else if(s2=="BkgPR") { continue; } else if(s2=="Bkg" && (s1=="N" || s1=="b")) { continue; } else {continue;} if(s3!=""){ label=Form("%s_{%s}^{%s}", s1.c_str(), s2.c_str(), s3.c_str()); } else { label=Form("%s^{%s}", s1.c_str(), s2.c_str()); } // Print the parameter's results if(s1=="N"){ t->DrawLatex(0.20, 0.76-dy, Form((isWeighted?"%s = %.6f#pm%.6f ":"%s = %.0f#pm%.0f "), label.c_str(), it->getValV(), it->getError())); dy+=0.045; } else if(s1.find("#sigma_{2}/#sigma_{1}")!=std::string::npos){ t->DrawLatex(0.20, 0.76-dy, Form("%s = %.3f#pm%.3f ", label.c_str(), it->getValV(), it->getError())); dy+=0.045; } else if(s1.find("sigma")!=std::string::npos){ t->DrawLatex(0.20, 0.76-dy, Form("%s = %.2f#pm%.2f MeV/c^{2}", label.c_str(), it->getValV()*1000., it->getError()*1000.)); dy+=0.045; } else if(s1.find("lambda")!=std::string::npos){ t->DrawLatex(0.20, 0.76-dy, Form("%s = %.4f#pm%.4f", label.c_str(), it->getValV(), it->getError())); dy+=0.045; } else if(s1.find("m")!=std::string::npos){ t->DrawLatex(0.20, 0.76-dy, Form("%s = %.5f#pm%.5f GeV/c^{2}", label.c_str(), it->getValV(), it->getError())); dy+=0.045; } else { t->DrawLatex(0.20, 0.76-dy, Form("%s = %.4f#pm%.4f", label.c_str(), it->getValV(), it->getError())); dy+=0.045; } } };
void logStatisticsPar(std::ostream& out, RooDataSet *dataSet, RooRealVar *realVar, int nBins, double chi2, const RooArgList &variables) { TH1 *histogram = dataSet->createHistogram(Form("h%s", dataSet->GetName()), *realVar, RooFit::Binning(nBins)); // Create the TeX file out << "\\documentclass[10pt]{article}" << std::endl; out << "\\usepackage[usenames]{color} %used for font color" << std::endl; out << "\\usepackage{fontspec}" << std::endl; out << "\\usepackage{xunicode}" << std::endl; out << "\\usepackage{xltxtra}" << std::endl; out << "\\defaultfontfeatures{Scale=MatchLowercase}" << std::endl; out << "\\setromanfont[Mapping=tex-text]{Myriad Pro}" << std::endl; out << "\\setsansfont[Mapping=tex-text]{Myriad Pro}" << std::endl; out << "\\setmonofont{Monaco}" << std::endl; out << "\\begin{document}" << std::endl; out << "\\thispagestyle{empty}" << std::endl; out << "\\setlength{\\tabcolsep}{1ex}" << std::endl; out << "\\setlength{\\fboxsep}{0ex}" << std::endl; out << "{\\fontsize{7pt}{0.9em}\\selectfont" << std::endl; out << "\\framebox{\\begin{tabular*}{60pt}{l@{\\extracolsep{\\fill}}r}" << std::endl; // This is the particular info for the histogram out << "Entries & " ; formatNumber(histogram->GetEntries(), out) << " \\\\" << std::endl; out << "Mean & " ; formatNumber(histogram->GetMean(), out) << " \\\\" << std::endl; out << "RMS & " ; formatNumber(histogram->GetRMS(), out) << " \\\\" << std::endl; if (chi2 > 0.0) { out << "Fit $\\chi^{2}$ & " ; formatNumber(chi2, out) << " \\\\" << std::endl; } RooRealVar *theVariable; for (int index = 0; index < variables.getSize(); index++) { theVariable = dynamic_cast<RooRealVar*>(variables.find(variables[index].GetName())); out << theVariable->GetTitle() << " & $\\textrm{" ; formatNumber(theVariable->getValV(), out) << "} \\pm \\textrm{" ; formatNumber(theVariable->getError(), out) << "}$ \\\\" << std::endl; } out << "\\end{tabular*}}}" << std::endl; out << "\\end{document}" << std::endl; histogram->Delete(); }
bool extractParameter(string fileName, const char* parName, pair<double,double>& value) { TFile *f = new TFile( fileName.c_str() ); if (!f) { cout << "[Error] " << fileName << " not found" << endl; return false; } RooWorkspace *ws = (RooWorkspace*) f->Get("workspace"); if (!ws) { cout << "[ERROR] Workspace not found in " << fileName << endl; return false; } RooRealVar *var = ws->var(parName); if (!var) { value = make_pair( -999.9 , -999.9 ); return true; } value = make_pair( var->getValV() , var->getError() ); return true; }
void FitterUtils::generate() { //***************Get the PDFs from the workspace 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"); RooRealVar *T = workspace->var("T"); RooRealVar *n = workspace->var("n"); RooRealVar *expoConst = workspace->var("expoConst"); RooRealVar *trueExp = workspace->var("trueExp"); RooRealVar *fractionalErrorJpsiLeak = workspace->var("fractionalErrorJpsiLeak"); cout<<"VALUE OF T IN GENERATE: "<<T->getVal()<<" +- "<<T->getError()<<endl; cout<<"VALUE OF n IN GENERATE: "<<n->getVal()<<" +- "<<n->getError()<<endl; RooHistPdf *histPdfSignalZeroGamma = (RooHistPdf *) workspace->pdf("histPdfSignalZeroGamma"); RooHistPdf *histPdfSignalOneGamma = (RooHistPdf *) workspace->pdf("histPdfSignalOneGamma"); RooHistPdf *histPdfSignalTwoGamma = (RooHistPdf *) workspace->pdf("histPdfSignalTwoGamma"); RooHistPdf *histPdfPartReco = (RooHistPdf *) workspace->pdf("histPdfPartReco"); RooHistPdf *histPdfJpsiLeak(0); if(nGenJpsiLeak>1) histPdfJpsiLeak = (RooHistPdf *) workspace->pdf("histPdfJpsiLeak"); RooAbsPdf *combPDF; if (fit2D) { combPDF = new RooPTMVis("combPDF", "combPDF", *misPT, *B_plus_M, *T, *n, *expoConst); } else { combPDF = new RooExponential("combPDF", "combPDF", *B_plus_M, *expoConst); } double trueExpConst(trueExp->getValV()); expoConst->setVal(trueExpConst); //***************Prepare generation int nGenSignalZeroGamma(floor(nGenFracZeroGamma*nGenSignal)); int nGenSignalOneGamma(floor(nGenFracOneGamma*nGenSignal)); int nGenSignalTwoGamma(floor(nGenSignal-nGenSignalZeroGamma-nGenSignalOneGamma)); RooArgSet argset2(*B_plus_M); if (fit2D) argset2.add(*misPT); cout<<"Preparing the generation of events 1"; RooRandom::randomGenerator()->SetSeed(); RooAbsPdf::GenSpec* GenSpecSignalZeroGamma = histPdfSignalZeroGamma->prepareMultiGen(argset2, RooFit::Extended(1), NumEvents(nGenSignalZeroGamma)); cout<<" 2 "; RooAbsPdf::GenSpec* GenSpecSignalOneGamma = histPdfSignalOneGamma->prepareMultiGen(argset2, RooFit::Extended(1), NumEvents(nGenSignalOneGamma)); cout<<" 3 "; RooAbsPdf::GenSpec* GenSpecSignalTwoGamma = histPdfSignalTwoGamma->prepareMultiGen(argset2, RooFit::Extended(1), NumEvents(nGenSignalTwoGamma)); cout<<" 4 "; RooAbsPdf::GenSpec* GenSpecPartReco = histPdfPartReco->prepareMultiGen(argset2, RooFit::Extended(1), NumEvents(nGenPartReco)); cout<<" 5 "<<endl; RooAbsPdf::GenSpec* GenSpecComb = combPDF->prepareMultiGen(argset2, RooFit::Extended(1), NumEvents(nGenComb)); RooAbsPdf::GenSpec* GenSpecJpsiLeak(0); if(nGenJpsiLeak>1) GenSpecJpsiLeak = histPdfJpsiLeak->prepareMultiGen(argset2, RooFit::Extended(1), NumEvents(nGenJpsiLeak)); cout<<"Variable loaded:"<<endl; B_plus_M->Print(); expoConst->Print(); //B_plus_DTFM_M_zero->Print(); if (fit2D) misPT->Print(); //***************Generate some datasets cout<<"Generating signal Zero Photon"<<endl; RooDataSet* dataGenSignalZeroGamma = histPdfSignalZeroGamma->generate(*GenSpecSignalZeroGamma);//(argset, 250, false, true, "", false, true); dataGenSignalZeroGamma->SetName("dataGenSignalZeroGamma"); dataGenSignalZeroGamma->SetTitle("dataGenSignalZeroGamma"); cout<<"Generating signal One Photon"<<endl; RooDataSet* dataGenSignalOneGamma = histPdfSignalOneGamma->generate(*GenSpecSignalOneGamma);//(argset, 250, false, true, "", false, true); dataGenSignalOneGamma->SetName("dataGenSignalOneGamma"); dataGenSignalOneGamma->SetTitle("dataGenSignalOneGamma"); cout<<"Generating signal two Photons"<<endl; RooDataSet* dataGenSignalTwoGamma = histPdfSignalTwoGamma->generate(*GenSpecSignalTwoGamma);//(argset, 250, false, true, "", false, true); dataGenSignalTwoGamma->SetName("dataGenSignalTwoGamma"); dataGenSignalTwoGamma->SetTitle("dataGenSignalTwoGamma"); cout<<"Generating combinatorial"<<endl; RooDataSet* dataGenComb = combPDF->generate(*GenSpecComb);//(argset, 100, false, true, "", false, true); dataGenComb->SetName("dataGenComb"); dataGenComb->SetTitle("dataGenComb"); cout<<"Generating PartReco"<<endl; RooDataSet* dataGenPartReco = histPdfPartReco->generate(*GenSpecPartReco);//argset, 160, false, true, "", false, true); dataGenPartReco->SetName("dataGenPartReco"); dataGenPartReco->SetTitle("dataGenPartReco"); RooDataSet* dataGenJpsiLeak(0); if(nGenJpsiLeak>1) { cout<<"Generating Leaking JPsi"<<endl; dataGenJpsiLeak = histPdfJpsiLeak->generate(*GenSpecJpsiLeak);//argset, 160, false, true, "", false, true); dataGenJpsiLeak->SetName("dataGenJpsiLeak"); dataGenJpsiLeak->SetTitle("dataGenJpsiLeak"); } //*************Saving the generated datasets in a workspace RooWorkspace workspaceGen("workspaceGen", "workspaceGen"); workspaceGen.import(*dataGenSignalZeroGamma); workspaceGen.import(*dataGenSignalOneGamma); workspaceGen.import(*dataGenSignalTwoGamma); workspaceGen.import(*dataGenComb); workspaceGen.import(*dataGenPartReco); if(nGenJpsiLeak>1) workspaceGen.import(*dataGenJpsiLeak); workspaceGen.Write("", TObject::kOverwrite); //delete workspace; fw.Close(); delete dataGenSignalZeroGamma; delete dataGenSignalOneGamma; delete dataGenSignalTwoGamma; delete dataGenComb; delete dataGenPartReco; if(nGenJpsiLeak>1) delete dataGenJpsiLeak; delete GenSpecSignalZeroGamma; delete GenSpecSignalOneGamma; delete GenSpecSignalTwoGamma; delete GenSpecComb; delete GenSpecPartReco; delete combPDF; if(nGenJpsiLeak>1) delete GenSpecJpsiLeak; delete histPdfSignalZeroGamma; delete histPdfSignalOneGamma; delete histPdfSignalTwoGamma; delete histPdfPartReco; if(nGenJpsiLeak>1) delete histPdfJpsiLeak; }
void CreateDatacards(float XMIN, float XMAX, int CAT_MIN,int CAT_MAX,int BRN_ORDER_NOM, int BRN_ORDER_VBF, TString TR, TString OUTPATH, TString CATVETO="", int MASS, float XMAXDIFF=0.) { TString PATH(TString::Format("%s/output/",OUTPATH.Data()).Data()); const int NCAT = 7; const int NF = 6; const int NMASS = 5; //---- uncertainties ------------------------------------- const float UNC_BR[NMASS] = {1.024,1.028,1.032,1.037,1.043}; const float UNC_UEPS_VBF[NCAT] = {1.04,1.02,0.97,0.93,1.02,1.03,1.04}; const float UNC_JES_VBF[NCAT] = {1.06,1.08,1.09,1.10,1.06,1.08,1.10}; const float UNC_JER_VBF[NCAT] = {0.97,0.96,0.97,0.98,0.99,0.98,0.99}; const float UNC_TRIG_VBF[NCAT] = {1.03,1.04,1.05,1.06,1.01,1.01,1.02}; const float UNC_CSV_VBF[NCAT] = {1.03,0.99,0.97,0.94,1.01,0.94,0.91}; const float UNC_QGL_VBF[NCAT] = {1.03,1.01,1.00,0.98,1.03,1.01,0.98}; const float UNC_SCALE_VBF[NCAT] = {1.00,1.00,1.01,1.02,1.03,1.03,1.05}; const float UNC_PDF_VBF[NCAT] = {1.02,1.02,1.02,1.02,1.03,1.03,1.03}; const float UNC_PDFGlobal_VBF[NMASS] = {1.028,1.028,1.028,1.027,1.027}; const float UNC_SCALEGlobal_VBF[NMASS] = {1.002,1.002,1.002,1.002,1.002}; const float UNC_UEPS_GF[NCAT] = {1.25,1.10,0.80,0.90,0.65,1.65,1.45}; const float UNC_JES_GF[NCAT] = {1.08,1.10,1.12,1.12,1.04,1.09,1.10}; const float UNC_JER_GF[NCAT] = {0.99,0.99,0.95,0.96,0.91,0.99,0.95}; const float UNC_TRIG_GF[NCAT] = {1.05,1.05,1.10,1.15,1.09,1.09,1.19}; const float UNC_CSV_GF[NCAT] = {0.99,0.97,0.93,0.93,0.93,0.97,0.90}; const float UNC_QGL_GF[NCAT] = {1.03,1.01,1.00,0.98,1.03,1.01,0.98}; const float UNC_SCALE_GF[NCAT] = {1.00,1.00,1.01,1.02,1.03,1.03,1.05}; const float UNC_PDF_GF[NCAT] = {1.04,1.04,1.04,1.04,1.05,1.04,1.04}; const float UNC_PDFGlobal_GF[NMASS] = {1.076,1.075,1.075,1.075,1.074}; const float UNC_SCALEGlobal_GF[NMASS] = {1.081,1.079,1.078,1.077,1.077}; vector<int> vCATVETO = tokenize(CATVETO); TString tCATVETO = tag(CATVETO); bool FreeTF=false, TF=false; if (TR!="" && TR!="BRN") TF=true; if (TF && (TR(0,5)!="Fixed"&&TR!="EXPO")) FreeTF=true; TString sTRF=""; if (TR(0,5)=="Fixed") sTRF = TR(5,4); else sTRF = TR; if (XMAXDIFF==0) TFile *fData = TFile::Open(PATH+"data_shapes_workspace_"+TString::Format("BRN%dp%d_B%.f-%.f",BRN_ORDER_NOM,BRN_ORDER_VBF,XMIN,XMAX)+"_Fit"+TR+".root"); else TFile *fData = TFile::Open(PATH+"data_shapes_workspace_"+TString::Format("BRN%dp%d_B%.f-%.f%.f",BRN_ORDER_NOM,BRN_ORDER_VBF,XMIN,XMAX,XMAX+XMAXDIFF)+"_Fit"+TR+".root"); if (XMAXDIFF==0) TFile *fSig = TFile::Open(PATH+"signal_shapes_workspace_"+TString::Format("B%.f-%.f.root",XMIN,XMAX)); else TFile *fSig = TFile::Open(PATH+"signal_shapes_workspace_"+TString::Format("B%.f-%.f%.f.root",XMIN,XMAX,XMAX+XMAXDIFF)); RooWorkspace *wData = (RooWorkspace*)fData->Get("w"); RooWorkspace *wSig = (RooWorkspace*)fSig->Get("w"); TString nameData = fData->GetName(); TString nameDataShort = nameData(nameData.Last('/')+1,nameData.Length()); TString nameSig = fSig->GetName(); TString nameSigShort = nameSig(nameSig.Last('/')+1,nameSig.Length()); char name[1000]; int H_MASS[5] = {115,120,125,130,135}; float nData[NCAT],nZ[NCAT],nTop[NCAT],nSigVBF[5][NCAT],nSigGF[5][NCAT]; for(int i=CAT_MIN;i<=CAT_MAX;i++) { sprintf(name,"yield_data_CAT%d",i); nData[i] = float((RooRealVar*)wData->var(name)->getValV()); sprintf(name,"yield_ZJets_CAT%d",i); nZ[i] = ((RooRealVar*)wData->var(name))->getValV(); sprintf(name,"yield_Top_CAT%d",i); nTop[i] = ((RooRealVar*)wData->var(name))->getValV(); for(int m=0;m<5;m++) { if (H_MASS[m]!=MASS) continue; sprintf(name,"yield_signalVBF_mass%d_CAT%d",H_MASS[m],i); nSigVBF[m][i] = ((RooRealVar*)wSig->var(name))->getValV(); sprintf(name,"yield_signalGF_mass%d_CAT%d",H_MASS[m],i); nSigGF[m][i] = ((RooRealVar*)wSig->var(name))->getValV(); } } makeDirs(OUTPATH); makeDirs(OUTPATH+"/output/"); makeDirs(OUTPATH+"/output/datacards"); for(int m=0;m<5;m++) { if (H_MASS[m]!=MASS) continue; cout << m << endl; ofstream datacard; if (XMAXDIFF==0) sprintf(name,"%s/output/datacards/datacard_m%d_BRN%dp%d_B%.f-%.f_CAT%d-CAT%d%s_Fit%s.txt",OUTPATH.Data(),H_MASS[m],BRN_ORDER_NOM,BRN_ORDER_VBF,XMIN,XMAX,CAT_MIN,CAT_MAX,tCATVETO.Data(),TR.Data()); else sprintf(name,"%s/output/datacards/datacard_m%d_BRN%dp%d_B%.f-%.f%.f_CAT%d-CAT%d%s_Fit%s.txt",OUTPATH.Data(),H_MASS[m],BRN_ORDER_NOM,BRN_ORDER_VBF,XMIN,XMAX,XMAX+XMAXDIFF,CAT_MIN,CAT_MAX,tCATVETO.Data(),TR.Data()); cout<<"======================================="<<endl; cout<<"Creating datacard: "<<name<<endl; cout<<"======================================="<<endl; datacard.open(name); datacard.setf(ios::right); datacard<<"imax "<<CAT_MAX-CAT_MIN+1-vCATVETO.size()<<"\n"; datacard<<"jmax *"<<"\n"; datacard<<"kmax *"<<"\n"; datacard<<"----------------"<<"\n"; datacard<<"shapes data_obs * "<<nameDataShort<<" w:data_hist_$CHANNEL"<<"\n"; datacard<<"shapes qcd * "<<nameDataShort<<" w:qcd_model_Fit"<<TR.Data()<<"_$CHANNEL"<<"\n"; datacard<<"shapes top * "<<nameDataShort<<" w:Top_model_$CHANNEL"<<"\n"; datacard<<"shapes zjets * "<<nameDataShort<<" w:Z_model_$CHANNEL"<<"\n"; datacard<<"shapes qqH * "<<nameSigShort<<" w:signal_model_m"<<H_MASS[m]<<"_$CHANNEL \n"; datacard<<"shapes ggH * "<<nameSigShort<<" w:signal_model_m"<<H_MASS[m]<<"_$CHANNEL \n"; datacard<<"----------------"<<"\n"; datacard<<"bin "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; sprintf(name,"CAT%d ",i); datacard<<name; } datacard<<"\n"; datacard<<"observation "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<"-1 "; } datacard<<"\n"; datacard<<"----------------"<<"\n"; datacard<<"bin "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; sprintf(name,"CAT%d CAT%d CAT%d CAT%d CAT%d ",i,i,i,i,i); datacard<<name; } datacard<<"\n"; datacard<<"process "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<"qqH ggH qcd top zjets "; } datacard<<"\n"; datacard<<"process "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<"0 -1 1 1 1 "; } datacard<<"\n"; datacard<<"rate "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; cout<<"cat#"<<i<<setw(8)<<nData[i]<<setw(8)<<nSigVBF[m][i]<<setw(8)<<nSigGF[m][i]<<setw(8)<<nTop[i]<<setw(8)<<nZ[i]<<setw(8)<<", S/B = "<<(nSigVBF[m][i]+nSigGF[m][i])/nData[i]<<endl; datacard<<nSigVBF[m][i]<<" "<<nSigGF[m][i]<<" "<<nData[i]<<" "<<nTop[i]<<" "<<nZ[i]<<" "; } datacard<<"\n"; datacard<<"----------------"<<"\n"; datacard<<"BR lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_BR[m]<<setw(NF)<<UNC_BR[m]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"QCDscale_qqh lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_SCALEGlobal_VBF[m]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"QCDscale_ggh lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<"-"<<setw(NF)<<UNC_SCALEGlobal_GF[m]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"pdf_qqbar lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_PDFGlobal_VBF[m]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"pdf_gg lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<"-"<<setw(NF)<<UNC_PDFGlobal_GF[m]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"lumi lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<"1.026"<<setw(NF)<<"1.026"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"CMS_scale_j_ACCEPT lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_JES_VBF[i]<<setw(NF)<<UNC_JES_GF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"pdf_ACCEPT lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<"1.05"<<setw(NF)<<"1.05"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"CMS_res_j_ACCEPT lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_JER_VBF[i]<<setw(NF)<<UNC_JER_GF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"CMS_qqH_hbb_trigger lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_TRIG_VBF[i]<<setw(NF)<<UNC_TRIG_GF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"CMS_qqH_hbb_btag lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_CSV_VBF[i]<<setw(NF)<<UNC_CSV_GF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"CMS_qqH_hbb_qgl lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_QGL_VBF[i]<<setw(NF)<<UNC_QGL_GF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"UEPS lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_UEPS_VBF[i]<<setw(NF)<<UNC_UEPS_GF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"CMS_qqH_hbb_QCDscale lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_SCALE_VBF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"CMS_ggH_hbb_QCDscale lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<"-"<<setw(NF)<<UNC_SCALE_GF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"CMS_qqH_hbb_pdf lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<UNC_PDF_VBF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; datacard<<"CMS_ggH_hbb_pdf lnN "; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; datacard<<setw(NF)<<"-"<<setw(NF)<<UNC_PDF_GF[i]<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } datacard<<"\n"; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; sprintf(name,"CMS_vbfbb_qcd_norm_CAT%d lnU ",i); datacard<<name<<setw(NF); for(int j=CAT_MIN;j<=CAT_MAX;j++) { if (veto(vCATVETO, j)) continue; if (j == i) { datacard<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<1.5<<setw(NF)<<"-"<<setw(NF)<<"-"; } else { datacard<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } } datacard<<"\n"; } datacard<<"\n"; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; sprintf(name,"CMS_vbfbb_zjets_norm_CAT%d lnN ",i); datacard<<name<<setw(NF); for(int j=CAT_MIN;j<=CAT_MAX;j++) { if (veto(vCATVETO, j)) continue; if (j == i) { datacard<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"1.3"; } else { datacard<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } } datacard<<"\n"; } datacard<<"\n"; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; sprintf(name,"CMS_vbfbb_top_norm_CAT%d lnN ",i); datacard<<name<<setw(NF); for(int j=CAT_MIN;j<=CAT_MAX;j++) { if (veto(vCATVETO, j)) continue; if (j == i) { datacard<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"1.3"<<setw(NF)<<"-"; } else { datacard<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"<<setw(NF)<<"-"; } } datacard<<"\n"; } datacard<<"\n"; datacard<<"#--- signal and Z shape parameters ------ \n"; datacard<<"\n"; datacard<<"CMS_vbfbb_scale_mbb_selNOM param 1.0 0.02"<<"\n"; datacard<<"CMS_vbfbb_scale_mbb_selVBF param 1.0 0.02"<<"\n"; datacard<<"CMS_vbfbb_res_mbb_selNOM param 1.0 0.1"<<"\n"; datacard<<"CMS_vbfbb_res_mbb_selVBF param 1.0 0.1"<<"\n"; for(int i=CAT_MIN;i<=CAT_MAX;i++) { if (veto(vCATVETO, i)) continue; //cout << "CAT" << i << endl; /* sprintf(name,"CMS_vbfbb_scale_mbb_CAT%d",i); datacard<<name<<" param 1.0 0.02"<<"\n"; sprintf(name,"CMS_vbfbb_res_mbb_CAT%d",i); datacard<<name<<" param 1.0 0.1"<<"\n"; */ sprintf(name,"mean_m%d_CAT%d",H_MASS[m],i); RooRealVar *vmass = (RooRealVar*)wSig->var(name); double mass = vmass->getValV(); double emass = vmass->getError(); datacard<<name<<" param "<<mass<<" "<<emass<<"\n"; sprintf(name,"sigma_m%d_CAT%d",H_MASS[m],i); RooRealVar *vsigma = (RooRealVar*)wSig->var(name); double sigma = vsigma->getValV(); double esigma = vsigma->getError(); datacard<<name<<" param "<<sigma<<" "<<esigma<<"\n"; sprintf(name,"Top_mean_CAT%d",i); RooRealVar *Tvmass = (RooRealVar*)wData->var(name); double Tmass = Tvmass->getValV(); double Temass = 0.01*Tmass; //Tvmass->getError(); datacard<<name<<" param "<<Tmass<<" "<<Temass<<"\n"; sprintf(name,"Top_sigma_CAT%d",i); RooRealVar *Tvsigma = (RooRealVar*)wData->var(name); double Tsigma = Tvsigma->getValV(); double Tesigma = 0.05*Tsigma;//Tvsigma->getError(); datacard<<name<<" param "<<Tsigma<<" "<<Tesigma<<"\n"; sprintf(name,"Z_mean_CAT%d",i); RooRealVar *Zvmass = (RooRealVar*)wData->var(name); double Zmass = Zvmass->getValV(); double Zemass = Zvmass->getError(); datacard<<name<<" param "<<Zmass<<" "<<Zemass<<"\n"; sprintf(name,"Z_sigma_CAT%d",i); RooRealVar *Zvsigma = (RooRealVar*)wData->var(name); double Zsigma = Zvsigma->getValV(); double Zesigma = Zvsigma->getError(); datacard<<name<<" param "<<Zsigma<<" "<<Zesigma<<"\n"; for(int j=5; j>=0; j--){ if (i>0 && i < 4 && TF && !FreeTF) { sprintf(name,"trans_%s_p%d_CAT%d",sTRF.Data(),j,i); if (wData->var(name)) { cout << name << endl; datacard<<name<<" param "<<((RooRealVar*)wData->var(name))->getVal()<<" "<<((RooRealVar*)wData->var(name))->getError()<<"\n"; } } if (i > 4 && TF && !FreeTF) { sprintf(name,"trans_%s_p%d_CAT%d",sTRF.Data(),j,i); if (wData->var(name)) { cout << name << endl; datacard<<name<<" param "<<((RooRealVar*)wData->var(name))->getVal()<<" "<<((RooRealVar*)wData->var(name))->getError()<<"\n"; } } } } datacard.close(); } fData->Close(); fSig->Close(); }
void ptBestFit(float BIN_SIZE=5.0,bool BLIND=false,TString MASS,TString NAME) { gROOT->ProcessLine(".x ../../common/styleCMSTDR.C"); gSystem->Load("libHiggsAnalysisCombinedLimit.so"); gROOT->ForceStyle(); gStyle->SetOptStat(0); gStyle->SetOptTitle(0); gROOT->SetBatch(1); gStyle->SetPadRightMargin(0.04); gStyle->SetPadLeftMargin(0.16); gStyle->SetPadTopMargin(0.06); gStyle->SetPadBottomMargin(0.10); gStyle->SetTitleFont(42,"XY"); gStyle->SetTitleSize(0.0475,"XY"); gStyle->SetTitleOffset(0.9,"X"); gStyle->SetTitleOffset(1.5,"Y"); gStyle->SetLabelSize(0.0375,"XY"); RooMsgService::instance().setSilentMode(kTRUE); for(int i=0;i<2;i++) { RooMsgService::instance().setStreamStatus(i,kFALSE); } float XMIN = 80; float XMAX = 200; TFile *f1 = TFile::Open("datacards/datacard_m"+MASS+"_"+NAME+".root"); TFile *f2 = TFile::Open("combine/mlfit.vbfHbb_"+NAME+"_mH"+MASS+".root"); TFile *f3 = TFile::Open("root/sig_shapes_workspace_B80-200.root"); TFile *f4 = TFile::Open("root/data_shapes_workspace_"+NAME+".root"); RooWorkspace *w = (RooWorkspace*)f1->Get("w"); //w->Print(); RooAbsPdf *bkg_model = (RooAbsPdf*)w->pdf("model_s"); RooFitResult *res_s = (RooFitResult*)f2->Get("fit_s"); RooFitResult *res_b = (RooFitResult*)f2->Get("fit_b"); RooRealVar *rFit = dynamic_cast<RooRealVar *>(res_s->floatParsFinal()).find("r"); RooDataSet *data = (RooDataSet*)w->data("data_obs"); int nparS=0,nparB=0; cout << res_s->floatParsFinal().getSize() << endl; cout << res_b->floatParsFinal().getSize() << endl; nparS = res_s->floatParsFinal().getSize(); nparB = res_b->floatParsFinal().getSize(); float chi2sumS = 0.; float chi2sumB = 0.; int nparsum = 0; // if (BLIND) { // res_b->Print(); // } // else { // res_s->Print(); // } w->allVars().assignValueOnly(res_s->floatParsFinal()); // w->Print(); // w->allVars()->Print(); RooWorkspace *wSig = (RooWorkspace*)f3->Get("w"); RooWorkspace *wDat = (RooWorkspace*)f4->Get("w"); const RooSimultaneous *sim = dynamic_cast<const RooSimultaneous *> (bkg_model); const RooAbsCategoryLValue &cat = (RooAbsCategoryLValue &) sim->indexCat(); TList *datasets = data->split(cat,true); TIter next(datasets); //int count = 0; for(RooAbsData *ds = (RooAbsData*)next();ds != 0; ds = (RooAbsData*)next()) { //if (count > 0) return 0; //count++; RooAbsPdf *pdfi = sim->getPdf(ds->GetName()); RooArgSet *obs = (RooArgSet*)pdfi->getObservables(ds); RooRealVar *x = dynamic_cast<RooRealVar *>(obs->first()); RooRealVar *yield_vbf = (RooRealVar*)wSig->var("yield_signalVBF_mass"+MASS+"_"+TString(ds->GetName())); RooRealVar *yield_gf = (RooRealVar*)wSig->var("yield_signalGF_mass"+MASS+"_"+TString(ds->GetName())); TString ds_name(ds->GetName()); //----- get the QCD normalization ----------- RooRealVar *qcd_norm_final = dynamic_cast<RooRealVar *>(res_s->floatParsFinal()).find("CMS_vbfbb_qcd_norm_"+ds_name); RooRealVar *qcd_yield = (RooRealVar*)wDat->var("yield_data_"+ds_name); float Nqcd = exp(log(1.5)*qcd_norm_final->getVal())*qcd_yield->getVal(); float eNqcd = log(1.5)*qcd_norm_final->getError()*Nqcd; cout<<"QCD normalization = "<<Nqcd<<" +/- "<<eNqcd<<endl; TH1 *hCoarse = (TH1*)ds->createHistogram("coarseHisto_"+ds_name,*x); float norm = hCoarse->Integral(); int rebin = BIN_SIZE/hCoarse->GetBinWidth(1); hCoarse->Rebin(rebin); float MIN_VAL = TMath::Max(0.9*hCoarse->GetBinContent(hCoarse->GetMinimumBin()),1.0); float MAX_VAL = 1.3*hCoarse->GetBinContent(hCoarse->GetMaximumBin()); RooDataHist ds_coarse("ds_coarse_"+ds_name,"ds_coarse_"+ds_name,*x,hCoarse); TH1F *hBlind = (TH1F*)hCoarse->Clone("blindHisto_"+ds_name); for(int i=0;i<hBlind->GetNbinsX();i++) { double x0 = hBlind->GetBinCenter(i+1); if (x0 > 100 && x0 < 150) { hBlind->SetBinContent(i+1,0); hBlind->SetBinError(i+1,0); } } RooDataHist ds_blind("ds_blind_"+ds_name,"ds_blind_"+ds_name,*x,hBlind); RooHist *hresid,*hresid0; RooPlot *frame1 = x->frame(); RooPlot *frame2 = x->frame(); if (BLIND) { //cout << "Blind case: " << ds_coarse.GetName() << endl; ds_coarse.plotOn(frame1,LineColor(0),MarkerColor(0)); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name),VisualizeError(*res_s,1,kTRUE),FillColor(0),MoveToBack()); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name),LineWidth(2),LineStyle(3)); ds_blind.plotOn(frame1); hresid = frame1->residHist(); frame2->addPlotable(hresid,"pE1"); } else { //cout << "Non-blind case: " << ds_coarse.GetName() << endl; ds_coarse.plotOn(frame1); pdfi->plotOn(frame1); //cout << pdfi->getParameters(ds_coarse)->selectByAttrib("Constant",kFALSE)->getSize() << endl; cout<<"chi2/ndof (bkg+sig) = "<<frame1->chiSquare()<<endl; cout << ds_coarse.numEntries() << endl; chi2sumS += frame1->chiSquare()*ds_coarse.numEntries(); nparsum += ds_coarse.numEntries(); //hresid0 = frame1->residHist(); //pdfi->plotOn(frame1,VisualizeError(*res_s,1,kTRUE),FillColor(0),MoveToBack()); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name),LineWidth(2),LineStyle(5),LineColor(kGreen+2)); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name),LineWidth(2),LineStyle(2),LineColor(kBlack)); cout<<"chi2/ndof (bkg) = "<<frame1->chiSquare()<<endl; chi2sumB += frame1->chiSquare()*ds_coarse.numEntries(); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name),LineWidth(2),LineStyle(2),LineColor(kBlack),VisualizeError(*res_s,1,kTRUE),FillColor(0),MoveToBack()); hresid = frame1->residHist(); frame2->addPlotable(hresid,"pE1"); float yield_sig = rFit->getValV()*(yield_vbf->getValV()+yield_gf->getValV()); RooAbsPdf *signal_pdf = (RooAbsPdf*)w->pdf("shapeSig_qqH_"+ds_name); signal_pdf->plotOn(frame2,LineWidth(2),LineColor(kRed),Normalization(yield_sig,RooAbsReal::NumEvent),MoveToBack()); } // hresid0->Print(); // hresid->Print(); // double x2,y2; // for (int i=0; i<3; ++i) { // hresid0->GetPoint(i,x2,y2); // cout << "BKG+SIG\t" << x2 << "\t" << y2 << endl; // hresid->GetPoint(i,x2,y2); // cout << "BKG\t" << x2 << "\t" << y2 << endl; // ds_coarse.get(i); // cout << ds_coarse.weightError(RooAbsData::SumW2) << endl; // cout << endl; // } TCanvas* canFit = new TCanvas("Higgs_fit_"+ds_name,"Higgs_fit_"+ds_name,900,750); canFit->cd(1)->SetBottomMargin(0.4); frame1->SetMinimum(MIN_VAL); frame1->SetMaximum(MAX_VAL); frame1->GetYaxis()->SetNdivisions(510); frame1->GetXaxis()->SetTitleSize(0); frame1->GetXaxis()->SetLabelSize(0); frame1->GetYaxis()->SetTitle(TString::Format("Events / %1.1f GeV",BIN_SIZE)); frame1->Draw(); gPad->Update(); TList *list = (TList*)gPad->GetListOfPrimitives(); //list->Print(); TH1F *hUncH = new TH1F("hUncH"+ds_name,"hUncH"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); TH1F *hUncL = new TH1F("hUncL"+ds_name,"hUncL"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); TH1F *hUnc2H = new TH1F("hUnc2H"+ds_name,"hUnc2H"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); TH1F *hUnc2L = new TH1F("hUnc2L"+ds_name,"hUnc2L"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); TH1F *hUncC = new TH1F("hUncC"+ds_name,"hUncC"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); RooCurve *errorBand,*gFit,*gQCDFit,*gBkgFit; //list->Print(); if (BLIND) { errorBand = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]_errorband_Comp[shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name+"]"); gFit = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]"+"_Comp[shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name+"]"); } else { //errorBand = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]_errorband"); errorBand = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]_errorband_Comp[shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name+"]"); gFit = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]"); } gQCDFit = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]"+"_Comp[shapeBkg_qcd_"+ds_name+"]"); gBkgFit = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]"+"_Comp[shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name+"]"); for(int i=0;i<hUncH->GetNbinsX();i++) { double x0 = hUncH->GetBinCenter(i+1); double e1 = fabs(errorBand->Eval(x0)-gBkgFit->Eval(x0)); //double e1 = fabs(errorBand->Eval(x0)-gFit->Eval(x0)); double e2 = eNqcd/hUncH->GetNbinsX(); hUncH->SetBinContent(i+1,sqrt(pow(e2,2)+pow(e1,2))); hUnc2H->SetBinContent(i+1,2*sqrt(pow(e2,2)+pow(e1,2))); hUncL->SetBinContent(i+1,-sqrt(pow(e2,2)+pow(e1,2))); hUnc2L->SetBinContent(i+1,-2*sqrt(pow(e2,2)+pow(e1,2))); hUncC->SetBinContent(i+1,0.); } TPad* pad = new TPad("pad", "pad", 0., 0., 1., 1.); pad->SetTopMargin(0.63); pad->SetFillColor(0); pad->SetFillStyle(0); pad->Draw(); pad->cd(0); hUnc2H->GetXaxis()->SetTitle("m_{bb} (GeV)"); hUnc2H->GetYaxis()->SetTitle("Data - Bkg"); //hUnc2H->GetYaxis()->SetTitle("Data - Fit"); double YMAX = 1.1*frame2->GetMaximum(); double YMIN = -1.1*frame2->GetMaximum(); hUnc2H->GetYaxis()->SetRangeUser(YMIN,YMAX); hUnc2H->GetYaxis()->SetNdivisions(507); // hUnc2H->GetXaxis()->SetTitleOffset(0.9); // hUnc2H->GetYaxis()->SetTitleOffset(1.0); hUnc2H->GetYaxis()->SetTickLength(0.0); // hUnc2H->GetYaxis()->SetTitleSize(0.05); // hUnc2H->GetYaxis()->SetLabelSize(0.04); hUnc2H->GetYaxis()->CenterTitle(kTRUE); hUnc2H->SetFillColor(kGreen); hUnc2L->SetFillColor(kGreen); hUncH->SetFillColor(kYellow); hUncL->SetFillColor(kYellow); hUncC->SetLineColor(kBlack); hUncC->SetLineStyle(7); hUnc2H->Draw("HIST"); hUnc2L->Draw("same HIST"); hUncH->Draw("same HIST"); hUncL->Draw("same HIST"); hUncC->Draw("same HIST"); frame2->GetYaxis()->SetTickLength(0.03/0.4); frame2->Draw("same"); TList *list1 = (TList*)gPad->GetListOfPrimitives(); //list1->Print(); RooCurve *gSigFit = (RooCurve*)list1->FindObject("shapeSig_qqH_"+ds_name+"_Norm[mbbReg_"+ds_name+"]"); TLegend *leg = new TLegend(0.70,0.61,0.94,1.-gStyle->GetPadTopMargin()-0.01); leg->SetTextFont(42); leg->SetFillStyle(-1); //leg->SetHeader(ds_name+" (m_{H}="+MASS+")"); leg->SetHeader(TString::Format("Category %d",atoi(ds_name(3,1).Data())+1)); leg->AddEntry(hBlind,"Data","P"); if (!BLIND) { leg->AddEntry(gSigFit,"Fitted signal","L"); } TLine *gEmpty = new TLine(0.0,0.0,0.0,0.0); gEmpty->SetLineWidth(0); TLegendEntry *l1 = leg->AddEntry(gEmpty,"(m_{H} = "+MASS+" GeV)",""); l1->SetTextSize(0.038*0.97*0.85); leg->AddEntry(gFit,"Bkg. + signal","L"); leg->AddEntry(gBkgFit,"Bkg.","L"); leg->AddEntry(gQCDFit,"QCD","L"); leg->AddEntry(hUnc2H,"2#sigma bkg. unc.","F"); leg->AddEntry(hUncH,"1#sigma bkg. unc.","F"); leg->SetFillColor(0); leg->SetBorderSize(0); leg->SetTextFont(42); leg->SetTextSize(0.038*0.98); leg->Draw(); leg->SetY1(leg->GetY2()-leg->GetNRows()*0.045*0.96); TPaveText *paveCMS = new TPaveText(gStyle->GetPadLeftMargin()+0.02,0.7,gStyle->GetPadLeftMargin()+0.15,1.-gStyle->GetPadTopMargin()-0.01,"NDC"); paveCMS->SetTextFont(62); paveCMS->SetTextSize(gStyle->GetPadTopMargin()*3./4.); paveCMS->SetBorderSize(0); paveCMS->SetFillStyle(-1); paveCMS->SetTextAlign(12); paveCMS->AddText("CMS"); paveCMS->Draw(); gPad->Update(); paveCMS->SetY1NDC(paveCMS->GetY2NDC()-paveCMS->GetListOfLines()->GetSize()*gStyle->GetPadTopMargin()); TPaveText *paveLumi = new TPaveText(0.5,1.-gStyle->GetPadTopMargin(),0.98,1.00,"NDC"); paveLumi->SetTextFont(42); paveLumi->SetTextSize(gStyle->GetPadTopMargin()*3./4.); paveLumi->SetBorderSize(0); paveLumi->SetFillStyle(-1); paveLumi->SetTextAlign(32); paveLumi->AddText(TString::Format("%.1f fb^{-1} (8TeV)",(atoi(ds_name(3,1).Data())<4 ? 19.8 : 18.3)).Data());//+ 18.2 ; paveLumi->Draw(); TString path="."; //TString path="BiasV10_limit_BRN5p4_dX0p1_B80-200_CAT0-6/output/"; system(TString::Format("[ ! -d %s/plot ] && mkdir %s/plot",path.Data(),path.Data()).Data()); system(TString::Format("[ ! -d %s/plot/fits ] && mkdir %s/plot/fits",path.Data(),path.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s.pdf",path.Data(),MASS.Data(),ds_name.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s.png",path.Data(),MASS.Data(),ds_name.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s.eps",path.Data(),MASS.Data(),ds_name.Data()).Data()); TText *l = (TText*)paveCMS->AddText("Preliminary"); l->SetTextFont(52); paveCMS->Draw(); gPad->Update(); paveCMS->SetY1NDC(paveCMS->GetY2NDC()-paveCMS->GetListOfLines()->GetSize()*gStyle->GetPadTopMargin()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s_prelim.pdf",path.Data(),MASS.Data(),ds_name.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s_prelim.png",path.Data(),MASS.Data(),ds_name.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s_prelim.eps",path.Data(),MASS.Data(),ds_name.Data()).Data()); delete ds; } cout << "chi2sumS: " << chi2sumS << endl; cout << "chi2sumB: " << chi2sumB << endl; cout << "nparS: " << nparS << endl; cout << "nparB: " << nparB << endl; cout << "nbinsum: " << nparsum << endl; cout << "chi2sumS/(nbinsum - nparS): " << chi2sumS / (float)(nparsum - nparS) << endl; cout << "chi2sumB/(nbinsum - nparB): " << chi2sumB / (float)(nparsum - nparB) << endl; delete datasets; }