File indexing completed on 2023-03-17 11:16:45
0001 #include <iostream>
0002 #include <iomanip>
0003
0004
0005
0006 void CutNCountElectronTagAndProbe(){
0007
0008
0009 TCut preCut("mcTrue");
0010
0011
0012 TCut cleanSC("(( (abs(probe_eta)<1.5)"
0013 "&& ((probe_trkSumPtHollowConeDR03 + probe_ecalRecHitSumEtConeDR03 + probe_hcalTowerSumEtConeDR03)/probe_et < 0.07)"
0014 " && (probe_sigmaIetaIeta<0.01)"
0015 " && (probe_hadronicOverEm<0.15)"
0016 ")"
0017 " || ((abs(probe_eta)>1.5)"
0018 "&& ( (probe_trkSumPtHollowConeDR03 + probe_ecalRecHitSumEtConeDR03 + probe_hcalTowerSumEtConeDR03)/probe_et < 0.06 )"
0019 " && (probe_sigmaIetaIeta<0.03)"
0020 " && (probe_hadronicOverEm<0.15) "
0021 "))");
0022
0023
0024 TCut cleanGsf("(probe_gsfEle_HoverE<0.15) && (probe_gsfEle_HoverE<0.15)");
0025
0026 TCut ID95("probe_passingId");
0027 TCut NotID95(cleanGsf && "!probe_passingId");
0028 TCut NotPPass("!probe_passing");
0029 TCut PassAll("probe_passingALL");
0030 TCut NotPassAll("!probe_passingALL");
0031 TCut ID80("probe_passingId80");
0032 TCut NotID80(cleanGsf && "!probe_passingId80");
0033 TCut EMINUS("probe_gsfEle_charge<0");
0034 TCut EMINUSSC("tag_gsfEle_charge>0");
0035 TCut EPLUS("probe_gsfEle_charge>0");
0036 TCut EPLUSSC("tag_gsfEle_charge<0");
0037 TCut BARREL("abs(probe_sc_eta)<1.4442");
0038 TCut BARRELSC("abs(probe_eta)<1.4442");
0039 TCut ENDCAPS("abs(probe_sc_eta)>1.566");
0040 TCut ENDCAPSSC("abs(probe_eta)>1.566");
0041
0042
0043
0044 cout << "probe type" << " efficiency " << " Npass" <<
0045 " Nfail" << endl;
0046
0047
0048
0049
0050
0051
0052
0053
0054 TCut GsfPass = preCut && cleanGsf;
0055 TCut GsfFail = cleanSC && preCut && NotPPass;
0056 ComputeEfficiency("Gsf", GsfPass, GsfFail);
0057 ComputeEfficiency("Gsf", GsfPass, GsfFail, "Barrel", BARREL, BARRELSC);
0058 ComputeEfficiency("Gsf", GsfPass, GsfFail, "Endcap", ENDCAPS, ENDCAPSSC);
0059 ComputeEfficiency("Gsf", GsfPass, GsfFail, "", "", "", "_eminus", EMINUS, EMINUSSC);
0060 ComputeEfficiency("Gsf", GsfPass, GsfFail, "", "", "", "_eplus", EPLUS, EPLUSSC);
0061 ComputeEfficiency("Gsf", GsfPass, GsfFail, "Barrel", BARREL, BARRELSC, "_eminus", EMINUS, EMINUSSC);
0062 ComputeEfficiency("Gsf", GsfPass, GsfFail, "Barrel", BARREL, BARRELSC, "_eplus", EPLUS, EPLUSSC);
0063 ComputeEfficiency("Gsf", GsfPass, GsfFail, "Endcap", ENDCAPS, ENDCAPSSC, "_eminus", EMINUS, EMINUSSC);
0064 ComputeEfficiency("Gsf", GsfPass, GsfFail, "Endcap", ENDCAPS, ENDCAPSSC, "_eplus", EPLUS, EPLUSSC);
0065 cout << "########################################" << endl;
0066
0067
0068
0069
0070
0071
0072
0073
0074 TCut Id95Pass = preCut && ID95;
0075 TCut Id95Fail = preCut && NotID95;
0076 ComputeEfficiency("Id95", Id95Pass, Id95Fail);
0077 ComputeEfficiency("Id95", Id95Pass, Id95Fail, "Barrel", BARREL, BARREL);
0078 ComputeEfficiency("Id95", Id95Pass, Id95Fail, "Endcap", ENDCAPS, ENDCAPS);
0079 ComputeEfficiency("Id95", Id95Pass, Id95Fail, "", "", "", "_eminus", EMINUS, EMINUS);
0080 ComputeEfficiency("Id95", Id95Pass, Id95Fail, "", "", "", "_eplus", EPLUS, EPLUS);
0081 ComputeEfficiency("Id95", Id95Pass, Id95Fail, "Barrel", BARREL, BARREL, "_eminus", EMINUS, EMINUS);
0082 ComputeEfficiency("Id95", Id95Pass, Id95Fail, "Barrel", BARREL, BARREL, "_eplus", EPLUS, EPLUS);
0083 ComputeEfficiency("Id95", Id95Pass, Id95Fail, "Endcap", ENDCAPS, ENDCAPS, "_eminus", EMINUS, EMINUS);
0084 ComputeEfficiency("Id95", Id95Pass, Id95Fail, "Endcap", ENDCAPS, ENDCAPS, "_eplus", EPLUS, EPLUS);
0085 cout << "########################################" << endl;
0086
0087
0088
0089
0090
0091
0092
0093
0094 TCut Id80Pass = preCut && ID80;
0095 TCut Id80Fail = preCut && NotID80;
0096 ComputeEfficiency("Id80", Id80Pass, Id80Fail);
0097 ComputeEfficiency("Id80", Id80Pass, Id80Fail, "Barrel", BARREL, BARREL);
0098 ComputeEfficiency("Id80", Id80Pass, Id80Fail, "Endcap", ENDCAPS, ENDCAPS);
0099 ComputeEfficiency("Id80", Id80Pass, Id80Fail, "", "", "", "_eminus", EMINUS, EMINUS);
0100 ComputeEfficiency("Id80", Id80Pass, Id80Fail, "", "", "", "_eplus", EPLUS, EPLUS);
0101 ComputeEfficiency("Id80", Id80Pass, Id80Fail, "Barrel", BARREL, BARREL, "_eminus", EMINUS, EMINUS);
0102 ComputeEfficiency("Id80", Id80Pass, Id80Fail, "Barrel", BARREL, BARREL, "_eplus", EPLUS, EPLUS);
0103 ComputeEfficiency("Id80", Id80Pass, Id80Fail, "Endcap", ENDCAPS, ENDCAPS, "_eminus", EMINUS, EMINUS);
0104 ComputeEfficiency("Id80", Id80Pass, Id80Fail, "Endcap", ENDCAPS, ENDCAPS, "_eplus", EPLUS, EPLUS);
0105 cout << "########################################" << endl;
0106
0107
0108
0109
0110
0111
0112
0113
0114 TCut HLT95Pass = preCut && ID95 && PassAll;
0115 TCut HLT95Fail = preCut && ID80 && NotPassAll;
0116 ComputeEfficiency("HLT95", HLT95Pass, HLT95Fail);
0117 ComputeEfficiency("HLT95", HLT95Pass, HLT95Fail, "Barrel", BARREL, BARREL);
0118 ComputeEfficiency("HLT95", HLT95Pass, HLT95Fail, "Endcap", ENDCAPS, ENDCAPS);
0119 ComputeEfficiency("HLT95", HLT95Pass, HLT95Fail, "", "", "", "_eminus", EMINUS, EMINUS);
0120 ComputeEfficiency("HLT95", HLT95Pass, HLT95Fail, "", "", "", "_eplus", EPLUS, EPLUS);
0121 ComputeEfficiency("HLT95", HLT95Pass, HLT95Fail, "Barrel", BARREL, BARREL, "_eminus", EMINUS, EMINUS);
0122 ComputeEfficiency("HLT95", HLT95Pass, HLT95Fail, "Barrel", BARREL, BARREL, "_eplus", EPLUS, EPLUS);
0123 ComputeEfficiency("HLT95", HLT95Pass, HLT95Fail, "Endcap", ENDCAPS, ENDCAPS, "_eminus", EMINUS, EMINUS);
0124 ComputeEfficiency("HLT95", HLT95Pass, HLT95Fail, "Endcap", ENDCAPS, ENDCAPS, "_eplus", EPLUS, EPLUS);
0125 cout << "########################################" << endl;
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135 TCut HLT80Pass = preCut && ID80 && PassAll;
0136 TCut HLT80Fail = preCut && ID80 && NotPassAll;
0137 ComputeEfficiency("HLT80", HLT80Pass, HLT80Fail);
0138 ComputeEfficiency("HLT80", HLT80Pass, HLT80Fail, "Barrel", BARREL, BARREL);
0139 ComputeEfficiency("HLT80", HLT80Pass, HLT80Fail, "Endcap", ENDCAPS, ENDCAPS);
0140 ComputeEfficiency("HLT80", HLT80Pass, HLT80Fail, "", "", "", "_eminus", EMINUS, EMINUS);
0141 ComputeEfficiency("HLT80", HLT80Pass, HLT80Fail, "", "", "", "_eplus", EPLUS, EPLUS);
0142 ComputeEfficiency("HLT80", HLT80Pass, HLT80Fail, "Barrel", BARREL, BARREL, "_eminus", EMINUS, EMINUS);
0143 ComputeEfficiency("HLT80", HLT80Pass, HLT80Fail, "Barrel", BARREL, BARREL, "_eplus", EPLUS, EPLUS);
0144 ComputeEfficiency("HLT80", HLT80Pass, HLT80Fail, "Endcap", ENDCAPS, ENDCAPS, "_eminus", EMINUS, EMINUS);
0145 ComputeEfficiency("HLT80", HLT80Pass, HLT80Fail, "Endcap", ENDCAPS, ENDCAPS, "_eplus", EPLUS, EPLUS);
0146 cout << "########################################" << endl;
0147 }
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159 void ComputeEfficiency(char* primaryLabel, TCut primaryCutPass,
0160 TCut primaryCutFail, char* secondaryLabel="",
0161 TCut secondaryCutPass="", TCut secondaryCutFail="",
0162 char* tertiaryLabel="",
0163 TCut tertiaryCutPass = "", TCut tertiaryCutFail = "")
0164 {
0165
0166 TFile* f = new TFile("Zee_new80.root");
0167
0168 TTree* scTree = (TTree*) f->Get("PhotonToGsf/fitter_tree");
0169 TTree* gsfTree = (TTree*) f->Get("GsfToIso/fitter_tree");
0170 char namePass[50];
0171 char nameFail[50];
0172
0173 sprintf(namePass,"Zmass%sPass%s%s",primaryLabel,secondaryLabel,tertiaryLabel);
0174 sprintf(nameFail,"Zmass%sFail%s%s",primaryLabel,secondaryLabel,tertiaryLabel);
0175 TH1F* histPass = createHistogram(namePass, 30);
0176 TH1F* histFail = createHistogram(nameFail, 12);
0177 gsfTree->Draw("mass>>"+TString(namePass), primaryCutPass && secondaryCutPass &&
0178 tertiaryCutPass,"goff");
0179 TString checkForSCTree(primaryLabel);
0180 TString plotVar = "mass>>"+TString(nameFail);
0181 if(checkForSCTree.Contains("Gsf"))
0182 scTree->Draw(plotVar,primaryCutFail && secondaryCutFail && tertiaryCutFail,"goff");
0183 else
0184 gsfTree->Draw(plotVar,primaryCutFail && secondaryCutFail && tertiaryCutFail,"goff");
0185 ComputeEfficiency(*histPass, *histFail);
0186
0187 delete histPass;
0188 delete histFail;
0189 }
0190
0191
0192
0193
0194
0195
0196 TH1F* createHistogram(char* name, int nbins=12) {
0197 TH1F* hist = new TH1F(name,name, nbins, 60, 120);
0198 hist->SetTitle("");
0199 char temp[100];
0200 sprintf(temp, "Events / %.1f GeV/c^{2}", 60./nbins);
0201 hist->GetXaxis()->SetTitle("m_{ee} (GeV/c^{2})");
0202 hist->GetYaxis()->SetTitle(temp);
0203 return hist;
0204 }
0205
0206
0207
0208
0209
0210
0211 void ComputeEfficiency( TH1& hist_pass, TH1& hist_fail)
0212 {
0213
0214
0215 TString effType = hist_pass.GetName();
0216 effType.ReplaceAll("Zmass","");
0217 effType.ReplaceAll("Pass","");
0218
0219 double lowerLim = 0.0;
0220 double upperLim = 1.0;
0221 double numerator = hist_pass.Integral();
0222 double nfails = hist_fail.Integral();
0223 double bkgFractionInNum = 0.0;
0224 double bkgFractionInFail = 0.0;
0225
0226
0227
0228
0229
0230
0231
0232 nfails *= (1.0 - bkgFractionInFail);
0233 numerator *= (1.0 - bkgFractionInNum);
0234
0235 double denominator = numerator + nfails;
0236
0237 double eff = numerator/ denominator;
0238
0239 ClopperPearsonLimits(numerator, denominator, lowerLim, upperLim);
0240 double errUp = upperLim -eff;
0241 double errLo = eff - lowerLim;
0242
0243
0244
0245 gROOT->ProcessLine(".L ~/tdrstyle.C");
0246 setTDRStyle();
0247 tdrStyle->SetErrorX(0.5);
0248 tdrStyle->SetPadLeftMargin(0.19);
0249 tdrStyle->SetPadRightMargin(0.10);
0250 tdrStyle->SetPadBottomMargin(0.15);
0251 tdrStyle->SetLegendBorderSize(0);
0252 tdrStyle->SetTitleYOffset(1.5);
0253 char temp[100];
0254
0255 TString cname = TString("plot_") + effType;
0256 cname.ReplaceAll("Gsf","ScToGsf");
0257 cname.ReplaceAll("Id","GsfToWP");
0258 cname.Append("_Pass");
0259 TCanvas* c = new TCanvas(cname,cname,500,500);
0260 hist_pass.Draw("E1");
0261 TPaveText *plotlabel4 = new TPaveText(0.6,0.82,0.8,0.87,"NDC");
0262 plotlabel4->SetTextColor(kBlack);
0263 plotlabel4->SetFillColor(kWhite);
0264 plotlabel4->SetBorderSize(0);
0265 plotlabel4->SetTextAlign(12);
0266 plotlabel4->SetTextSize(0.03);
0267 sprintf(temp, "Signal = %.2f #pm %.2f", numerator, sqrt(numerator) );
0268 plotlabel4->AddText(temp);
0269 TPaveText *plotlabel5 = new TPaveText(0.6,0.77,0.8,0.82,"NDC");
0270 plotlabel5->SetTextColor(kBlack);
0271 plotlabel5->SetFillColor(kWhite);
0272 plotlabel5->SetBorderSize(0);
0273 plotlabel5->SetTextAlign(12);
0274 plotlabel5->SetTextSize(0.03);
0275 sprintf(temp, "Bkg fraction = %.2f", bkgFractionInNum);
0276 plotlabel5->AddText(temp);
0277 TPaveText *plotlabel6 = new TPaveText(0.6,0.87,0.8,0.92,"NDC");
0278 plotlabel6->SetTextColor(kBlack);
0279 plotlabel6->SetFillColor(kWhite);
0280 plotlabel6->SetBorderSize(0);
0281 plotlabel6->SetTextAlign(12);
0282 plotlabel6->SetTextSize(0.03);
0283 plotlabel6->AddText("Passing probes");
0284 TPaveText *plotlabel7 = new TPaveText(0.6,0.72,0.8,0.77,"NDC");
0285 plotlabel7->SetTextColor(kBlack);
0286 plotlabel7->SetFillColor(kWhite);
0287 plotlabel7->SetBorderSize(0);
0288 plotlabel7->SetTextAlign(12);
0289 plotlabel7->SetTextSize(0.03);
0290 sprintf(temp, "Eff = %.3f + %.3f - %.3f", eff, errUp, errLo);
0291 plotlabel7->AddText(temp);
0292 plotlabel4->Draw();
0293 plotlabel5->Draw();
0294 plotlabel6->Draw();
0295 plotlabel7->Draw();
0296 c->SaveAs( cname + TString(".eps"));
0297 c->SaveAs( cname + TString(".gif"));
0298
0299 delete c;
0300
0301
0302 cname.ReplaceAll("_Pass", "_Fail");
0303 TCanvas* c2 = new TCanvas(cname,cname,500,500);
0304 hist_fail.Draw("E1");
0305
0306 TPaveText *plotlabel4 = new TPaveText(0.6,0.82,0.8,0.87,"NDC");
0307 plotlabel4->SetTextColor(kBlack);
0308 plotlabel4->SetFillColor(kWhite);
0309 plotlabel4->SetBorderSize(0);
0310 plotlabel4->SetTextAlign(12);
0311 plotlabel4->SetTextSize(0.03);
0312 sprintf(temp, "Signal = %.2f #pm %.2f", nfails, sqrt(nfails) );
0313 plotlabel4->AddText(temp);
0314 TPaveText *plotlabel5 = new TPaveText(0.6,0.77,0.8,0.82,"NDC");
0315 plotlabel5->SetTextColor(kBlack);
0316 plotlabel5->SetFillColor(kWhite);
0317 plotlabel5->SetBorderSize(0);
0318 plotlabel5->SetTextAlign(12);
0319 plotlabel5->SetTextSize(0.03);
0320 sprintf(temp, "Bkg fraction = %.2f", bkgFractionInFail);
0321 plotlabel5->AddText(temp);
0322 TPaveText *plotlabel6 = new TPaveText(0.6,0.87,0.8,0.92,"NDC");
0323 plotlabel6->SetTextColor(kBlack);
0324 plotlabel6->SetFillColor(kWhite);
0325 plotlabel6->SetBorderSize(0);
0326 plotlabel6->SetTextAlign(12);
0327 plotlabel6->SetTextSize(0.03);
0328 plotlabel6->AddText("Failing probes");
0329 TPaveText *plotlabel7 = new TPaveText(0.6,0.72,0.8,0.77,"NDC");
0330 plotlabel7->SetTextColor(kBlack);
0331 plotlabel7->SetFillColor(kWhite);
0332 plotlabel7->SetBorderSize(0);
0333 plotlabel7->SetTextAlign(12);
0334 plotlabel7->SetTextSize(0.03);
0335 sprintf(temp, "Eff = %.3f + %.3f - %.3f", eff, errUp, errLo);
0336 plotlabel7->AddText(temp);
0337 plotlabel4->Draw();
0338 plotlabel5->Draw();
0339 plotlabel6->Draw();
0340 plotlabel7->Draw();
0341
0342 c2->SaveAs( cname + TString(".eps"));
0343 c2->SaveAs( cname + TString(".gif"));
0344
0345 delete c2;
0346
0347
0348 effType.ReplaceAll("Gsf","");
0349 effType.ReplaceAll("Id95_","");
0350 effType.ReplaceAll("Id95","");
0351 effType.ReplaceAll("Id80_","");
0352 effType.ReplaceAll("Id80","");
0353 effType.ReplaceAll("HLT95_","");
0354 effType.ReplaceAll("HLT95","");
0355 effType.ReplaceAll("HLT80_","");
0356 effType.ReplaceAll("HLT80","");
0357
0358 char* effTypeToPrint = (char*) effType;
0359
0360 cout << effTypeToPrint << " "
0361 << setiosflags(ios::fixed) << setprecision(4) << eff
0362 << " + " << errUp << " - " << errLo
0363 << setiosflags(ios::fixed) << setprecision(0)
0364 << " " << numerator << " " << nfails << endl;
0365
0366
0367 }
0368
0369
0370 double ErrorInProduct(double x, double errx, double y,
0371 double erry, double corr) {
0372 double xFrErr = errx/x;
0373 double yFrErr = erry/y;
0374 return sqrt(xFrErr**2 +yFrErr**2 + 2.0*corr*xFrErr*yFrErr)*x*y;
0375 }
0376
0377
0378 void ClopperPearsonLimits(double numerator, double denominator,
0379 double &lowerLimit, double &upperLimit, const double CL_low=1.0,
0380 const double CL_high=1.0)
0381 {
0382
0383
0384 double ratio = numerator/denominator;
0385
0386
0387 if(numerator==0) lowerLimit = 0.0;
0388 else {
0389 double v=ratio/2;
0390 double vsL=0;
0391 double vsH=ratio;
0392 double p=CL_low/100;
0393 while((vsH-vsL)>1e-5) {
0394 if(BinP(denominator,v,numerator,denominator)>p)
0395 { vsH=v; v=(vsL+v)/2; }
0396 else { vsL=v; v=(v+vsH)/2; }
0397 }
0398 lowerLimit = v;
0399 }
0400
0401
0402 if(numerator==denominator) upperLimit = 1.0;
0403 else {
0404 double v=(1+ratio)/2;
0405 double vsL=ratio;
0406 double vsH=1;
0407 double p=CL_high/100;
0408 while((vsH-vsL)>1e-5) {
0409 if(BinP(denominator,v,0,numerator)<p) { vsH=v; v=(vsL+v)/2; }
0410 else { vsL=v; v=(v+vsH)/2; }
0411 }
0412 upperLimit = v;
0413 }
0414 }
0415
0416
0417
0418
0419 double BinP(int N, double p, int x1, int x2) {
0420 double q=p/(1-p);
0421 int k=0;
0422 double v = 1;
0423 double s=0;
0424 double tot=0.0;
0425 while(k<=N) {
0426 tot=tot+v;
0427 if(k>=x1 & k<=x2) { s=s+v; }
0428 if(tot>1e30){s=s/1e30; tot=tot/1e30; v=v/1e30;}
0429 k=k+1;
0430 v=v*q*(N+1-k)/k;
0431 }
0432 return s/tot;
0433 }
0434
0435
0436
0437