File indexing completed on 2024-04-06 12:18:49
0001 #include "TFile.h"
0002 #include "TChain.h"
0003 #include "TH2F.h"
0004 #include "TCanvas.h"
0005 #include "TStyle.h"
0006 #include "TRegexp.h"
0007 #include "TGraphErrors.h"
0008 #include "iostream"
0009 #include "vector"
0010 #include "map"
0011 #include "TTreeFormula.h"
0012 #include "GetOptimization.h"
0013
0014 struct filter {
0015 TString name;
0016 Int_t pathNum;
0017 Int_t direction;
0018 Double_t hltBarrelCut;
0019 Double_t hltEndcapCut;
0020 Double_t maxCut;
0021 };
0022
0023 struct path {
0024 std::vector<TString> names;
0025 Int_t nCandsCut;
0026 std::vector<filter> filters;
0027 };
0028
0029 void GetOptimization() {
0030 struct path thisPath;
0031 std::vector<path> paths;
0032 std::vector<TString> pathNames;
0033 struct filter thisFilter;
0034 std::vector<filter> filters;
0035 std::vector<std::pair<std::vector<TString>,Double_t> > xSections;
0036 std::vector<TString> filenamesBkg;
0037 std::vector<TString> filenamesSig;
0038
0039 Int_t nCuts = 120;
0040 Bool_t doBandE = true;
0041
0042 Double_t luminosity = 2.0E33;
0043
0044
0045 filenamesBkg.push_back("../test/QCD-HLTVars-1.root");
0046
0047 xSections.push_back(make_pair(filenamesBkg, 2.16E-2));
0048 filenamesBkg.clear();
0049
0050
0051
0052
0053 filenamesSig.push_back("../test/ZEE-HLTVars.root");
0054
0055
0056 thisFilter.name = "l1Match";
0057 thisFilter.pathNum = 0;
0058 thisFilter.direction = 0;
0059 thisFilter.hltBarrelCut = 0.;
0060 thisFilter.hltEndcapCut = 0.;
0061 thisFilter.maxCut = 0.;
0062 filters.push_back(thisFilter);
0063 thisFilter.name = "Et";
0064 thisFilter.pathNum = 0;
0065 thisFilter.direction = 1;
0066 thisFilter.hltBarrelCut = 15.;
0067 thisFilter.hltEndcapCut = 15.;
0068 thisFilter.maxCut = 60.;
0069 filters.push_back(thisFilter);
0070 thisFilter.name = "IHcal";
0071 thisFilter.pathNum = 0;
0072 thisFilter.direction = -1;
0073 thisFilter.hltBarrelCut = 3.;
0074 thisFilter.hltEndcapCut = 3.;
0075 thisFilter.maxCut = 6.;
0076 filters.push_back(thisFilter);
0077 thisFilter.name = "pixMatch";
0078 thisFilter.pathNum = 0;
0079 thisFilter.direction = 1;
0080 thisFilter.hltBarrelCut = 0;
0081 thisFilter.hltEndcapCut = 0;
0082 thisFilter.maxCut = 0;
0083 filters.push_back(thisFilter);
0084 thisFilter.name = "Eoverp";
0085 thisFilter.pathNum = 1;
0086 thisFilter.direction = -1;
0087 thisFilter.hltBarrelCut = 1.5;
0088 thisFilter.hltEndcapCut = 2.45;
0089 thisFilter.maxCut = 5.;
0090 filters.push_back(thisFilter);
0091 thisFilter.name = "Itrack";
0092 thisFilter.pathNum = 1;
0093 thisFilter.direction = -1;
0094 thisFilter.hltBarrelCut = 0.06;
0095 thisFilter.hltEndcapCut = 0.06;
0096 thisFilter.maxCut = 0.24;
0097 filters.push_back(thisFilter);
0098 pathNames.push_back("SingleElecsPT.");
0099 pathNames.push_back("SingleElecs.");
0100 thisPath.names = pathNames;
0101 thisPath.nCandsCut = 1;
0102 thisPath.filters = filters;
0103 paths.push_back(thisPath);
0104 pathNames.clear();
0105 pathNames.push_back("RelaxedSingleElecsPT.");
0106 pathNames.push_back("RelaxedSingleElecs.");
0107 thisPath.names = pathNames;
0108 thisPath.nCandsCut = 1;
0109 thisPath.filters = filters;
0110 paths.push_back(thisPath);
0111 pathNames.clear();
0112 filters.clear();
0113
0114 thisFilter.name = "l1Match";
0115 thisFilter.pathNum = 0;
0116 thisFilter.direction = 0;
0117 thisFilter.hltBarrelCut = 0.;
0118 thisFilter.hltEndcapCut = 0.;
0119 thisFilter.maxCut = 0.;
0120 filters.push_back(thisFilter);
0121 thisFilter.name = "Et";
0122 thisFilter.pathNum = 0;
0123 thisFilter.direction = 1;
0124 thisFilter.hltBarrelCut = 10.;
0125 thisFilter.hltEndcapCut = 10.;
0126 thisFilter.maxCut = 40.;
0127 filters.push_back(thisFilter);
0128 thisFilter.name = "IHcal";
0129 thisFilter.pathNum = 0;
0130 thisFilter.direction = -1;
0131 thisFilter.hltBarrelCut = 9.;
0132 thisFilter.hltEndcapCut = 9.;
0133 thisFilter.maxCut = 18.;
0134 filters.push_back(thisFilter);
0135 thisFilter.name = "pixMatch";
0136 thisFilter.pathNum = 0;
0137 thisFilter.direction = 1;
0138 thisFilter.hltBarrelCut = 0;
0139 thisFilter.hltEndcapCut = 0;
0140 thisFilter.maxCut = 0;
0141 filters.push_back(thisFilter);
0142 thisFilter.name = "Eoverp";
0143 thisFilter.pathNum = 1;
0144 thisFilter.direction = -1;
0145 thisFilter.hltBarrelCut = 15000;
0146 thisFilter.hltEndcapCut = 24500;
0147 thisFilter.maxCut = 5.;
0148 filters.push_back(thisFilter);
0149 thisFilter.name = "Itrack";
0150 thisFilter.pathNum = 1;
0151 thisFilter.direction = -1;
0152 thisFilter.hltBarrelCut = 0.4;
0153 thisFilter.hltEndcapCut = 0.4;
0154 thisFilter.maxCut = 0.12;
0155 filters.push_back(thisFilter);
0156 pathNames.push_back("DoubleElecsPT.");
0157 pathNames.push_back("DoubleElecs.");
0158 thisPath.names = pathNames;
0159 thisPath.nCandsCut = 2;
0160 thisPath.filters = filters;
0161 paths.push_back(thisPath);
0162 pathNames.clear();
0163 pathNames.push_back("RelaxedDoubleElecsPT.");
0164 pathNames.push_back("RelaxedDoubleElecs.");
0165 thisPath.names = pathNames;
0166 thisPath.nCandsCut = 2;
0167 thisPath.filters = filters;
0168 paths.push_back(thisPath);
0169 pathNames.clear();
0170 filters.clear();
0171
0172 thisFilter.name = "l1Match";
0173 thisFilter.pathNum = 0;
0174 thisFilter.direction = 0;
0175 thisFilter.hltBarrelCut = 0.;
0176 thisFilter.hltEndcapCut = 0.;
0177 thisFilter.maxCut = 0.;
0178 filters.push_back(thisFilter);
0179 thisFilter.name = "Et";
0180 thisFilter.pathNum = 0;
0181 thisFilter.direction = 1;
0182 thisFilter.hltBarrelCut = 30.;
0183 thisFilter.hltEndcapCut = 30.;
0184 thisFilter.maxCut = 60.;
0185 filters.push_back(thisFilter);
0186 thisFilter.name = "IEcal";
0187 thisFilter.pathNum = 0;
0188 thisFilter.direction = -1;
0189 thisFilter.hltBarrelCut = 1.5;
0190 thisFilter.hltEndcapCut = 1.5;
0191 thisFilter.maxCut = 6.;
0192 filters.push_back(thisFilter);
0193 thisFilter.name = "IHcal";
0194 thisFilter.pathNum = 0;
0195 thisFilter.direction = -1;
0196 thisFilter.hltBarrelCut = 4.;
0197 thisFilter.hltEndcapCut = 6.;
0198 thisFilter.maxCut = 12.;
0199 filters.push_back(thisFilter);
0200 thisFilter.name = "Itrack";
0201 thisFilter.pathNum = 0;
0202 thisFilter.direction = -1;
0203 thisFilter.hltBarrelCut = 1;
0204 thisFilter.hltEndcapCut = 1;
0205 thisFilter.maxCut = 5;
0206 filters.push_back(thisFilter);
0207 pathNames.push_back("SinglePhots.");
0208 thisPath.names = pathNames;
0209 thisPath.nCandsCut = 1;
0210 thisPath.filters = filters;
0211 paths.push_back(thisPath);
0212 pathNames.clear();
0213 pathNames.push_back("RelaxedSinglePhots.");
0214 thisPath.names = pathNames;
0215 thisPath.nCandsCut = 1;
0216 thisPath.filters = filters;
0217 paths.push_back(thisPath);
0218 pathNames.clear();
0219 filters.clear();
0220
0221 thisFilter.name = "l1Match";
0222 thisFilter.pathNum = 0;
0223 thisFilter.direction = 0;
0224 thisFilter.hltBarrelCut = 0.;
0225 thisFilter.hltEndcapCut = 0.;
0226 thisFilter.maxCut = 0.;
0227 filters.push_back(thisFilter);
0228 thisFilter.name = "Et";
0229 thisFilter.pathNum = 0;
0230 thisFilter.direction = 1;
0231 thisFilter.hltBarrelCut = 20.;
0232 thisFilter.hltEndcapCut = 20.;
0233 thisFilter.maxCut = 40.;
0234 filters.push_back(thisFilter);
0235 thisFilter.name = "IEcal";
0236 thisFilter.pathNum = 0;
0237 thisFilter.direction = -1;
0238 thisFilter.hltBarrelCut = 2.5;
0239 thisFilter.hltEndcapCut = 2.5;
0240 thisFilter.maxCut = 5.;
0241 filters.push_back(thisFilter);
0242 thisFilter.name = "IHcal";
0243 thisFilter.pathNum = 0;
0244 thisFilter.direction = -1;
0245 thisFilter.hltBarrelCut = 6.;
0246 thisFilter.hltEndcapCut = 8.;
0247 thisFilter.maxCut = 24.;
0248 filters.push_back(thisFilter);
0249 thisFilter.name = "Itrack";
0250 thisFilter.pathNum = 0;
0251 thisFilter.direction = -1;
0252 thisFilter.hltBarrelCut = 3;
0253 thisFilter.hltEndcapCut = 3;
0254 thisFilter.maxCut = 6;
0255 filters.push_back(thisFilter);
0256 pathNames.push_back("DoublePhots.");
0257 thisPath.names = pathNames;
0258 thisPath.nCandsCut = 2;
0259 thisPath.filters = filters;
0260 paths.push_back(thisPath);
0261 pathNames.clear();
0262 pathNames.push_back("RelaxedDoublePhots.");
0263 thisPath.names = pathNames;
0264 thisPath.nCandsCut = 2;
0265 thisPath.filters = filters;
0266 paths.push_back(thisPath);
0267 pathNames.clear();
0268 filters.clear();
0269
0270
0271
0272 Int_t cutNum = 0, pathNum = 0, filterNum = 0, oldFilterNum = 0, fileNum = 0, xSecNum = 0;
0273 Double_t cut = 0.;
0274 Long64_t passSig = 0, totalSig = 0;
0275 Long64_t passBkg = 0, totalBkg = 0;
0276 Double_t effSig = 0., errSig = 0.;
0277 Double_t effBkg = 0., errBkg = 0., rateTotBkg = 0., errTotBkg = 0.;
0278 Double_t conversion = 1.0E-27;
0279 std::vector<std::pair<Double_t,Double_t> > sigPass;
0280 std::vector<std::pair<Double_t,Double_t> > bkgPass;
0281
0282 TString cutText;
0283 TString cutTextEcap;
0284 TString baseCutText;
0285 TString baseCutTextEcap;
0286 TString cutBasePT1;
0287 TString cutBasePT2;
0288 TString cutBase1;
0289 TString cutBase2;
0290
0291
0292
0293
0294
0295 std::vector<std::vector<TGraphErrors> > EffVBkg;
0296 std::vector<std::vector<TGraphErrors> > EffVBkgEcap;
0297 std::vector<TGraphErrors> pathEffVBkgs;
0298 TGraphErrors filterEffVBkgs(nCuts);
0299 for (pathNum = 0; pathNum < paths.size(); pathNum++) {
0300 for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) {
0301
0302 pathEffVBkgs.push_back(filterEffVBkgs);
0303 }
0304 EffVBkg.push_back(pathEffVBkgs);
0305 if (doBandE) {
0306 EffVBkgEcap.push_back(pathEffVBkgs);
0307 }
0308 }
0309
0310 std::vector<std::pair<TChain*,Double_t> > bkgEvents;
0311 for (xSecNum = 0; xSecNum < xSections.size(); xSecNum++) {
0312 TChain *bkgProc = new TChain("Events");
0313 for (fileNum = 0; fileNum < (xSections[xSecNum].first).size(); fileNum++) {
0314 bkgProc->Add((xSections[xSecNum].first)[fileNum]);
0315 }
0316 bkgEvents.push_back(make_pair(bkgProc,xSections[xSecNum].second));
0317 }
0318
0319 TChain *sigEvents = new TChain("Events");
0320 for (fileNum = 0; fileNum < filenamesSig.size(); fileNum++) {
0321 sigEvents->Add(filenamesSig[fileNum]);
0322 }
0323
0324 Double_t testX, testY, testdX, testdY;
0325 Double_t thisBCut = 0., thisECut = 0.;
0326 TString pathName, filterName;
0327 for (cutNum = 0; cutNum < nCuts; cutNum++) {
0328 cout<<"Cut "<<cutNum<<endl;
0329 for (pathNum = 0; pathNum < paths.size(); pathNum++) {
0330 for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) {
0331 if ((paths[pathNum].filters)[filterNum].maxCut != 0.) {
0332 cutText = "(Sum$(";
0333 for (oldFilterNum = 0; oldFilterNum < filterNum; oldFilterNum++) {
0334 pathName = (paths[pathNum].names)[(paths[pathNum].filters)[filterNum].pathNum];
0335 filterName = (paths[pathNum].filters)[oldFilterNum].name;
0336 thisBCut = (paths[pathNum].filters)[oldFilterNum].hltBarrelCut;
0337 thisECut = (paths[pathNum].filters)[oldFilterNum].hltEndcapCut;
0338 if (thisBCut == thisECut) {
0339 cutText += pathName;
0340 cutText += filterName;
0341 switch ((paths[pathNum].filters)[oldFilterNum].direction) {
0342 case -1:
0343 cutText += " < ";
0344 cutText += (paths[pathNum].filters)[oldFilterNum].hltBarrelCut;
0345 break;
0346 case 0:
0347 break;
0348 case 1:
0349 cutText += " > ";
0350 cutText += (paths[pathNum].filters)[oldFilterNum].hltBarrelCut;
0351 break;
0352 default:
0353 cout<<"Invalid value of direction in "<<pathName<<filterName<<endl;
0354 break;
0355 }
0356 }
0357 else {
0358 cutText += "((";
0359 cutText += pathName;
0360 cutText += filterName;
0361 switch ((paths[pathNum].filters)[oldFilterNum].direction) {
0362 case -1:
0363 cutText += " < ";
0364 cutText += thisBCut;
0365 break;
0366 case 0:
0367 break;
0368 case 1:
0369 cutText += " > ";
0370 cutText += thisBCut;
0371 break;
0372 default:
0373 cout<<"Invalid value of direction in "<<pathName<<filterName<<endl;
0374 break;
0375 }
0376 cutText += " && abs(";
0377 cutText += pathName;
0378 cutText += "eta) < 1.5) || (";
0379 cutText += pathName;
0380 cutText += filterName;
0381 switch ((paths[pathNum].filters)[oldFilterNum].direction) {
0382 case -1:
0383 cutText += " < ";
0384 cutText += thisECut;
0385 break;
0386 case 0:
0387 break;
0388 case 1:
0389 cutText += " > ";
0390 cutText += thisECut;
0391 break;
0392 default:
0393 cout<<"Invalid value of direction in "<<pathName<<filterName<<endl;
0394 break;
0395 }
0396 cutText += " && abs(";
0397 cutText += pathName;
0398 cutText += "eta) > 1.5 && abs(";
0399 cutText += pathName;
0400 cutText += "eta) < 2.5))";
0401 }
0402 if (oldFilterNum != filterNum - 1) cutText += " && ";
0403 }
0404 baseCutText = cutText;
0405 pathName = paths[pathNum].names[(paths[pathNum].filters)[filterNum].pathNum];
0406 filterName = (paths[pathNum].filters)[filterNum].name;
0407 cutText += " && ";
0408 cutText += pathName;
0409 cutText += filterName;
0410 cut = (Double_t)cutNum / (Double_t)nCuts * (paths[pathNum].filters)[oldFilterNum].maxCut;
0411 switch ((paths[pathNum].filters)[filterNum].direction) {
0412 case -1:
0413 cutText += " < ";
0414 cutText += cut;
0415 break;
0416 case 0:
0417 break;
0418 case 1:
0419 cutText += " > ";
0420 cutText += cut;
0421 break;
0422 default:
0423 cout<<"Invalid value of direction in "<<pathName<<filterName<<endl;
0424 break;
0425 }
0426 if (doBandE) {
0427 cutTextEcap = cutText;
0428 cutText += " && abs(";
0429 cutText += pathName;
0430 cutText += "eta) < 1.5";
0431 cutTextEcap += " && abs(";
0432 cutTextEcap += pathName;
0433 cutTextEcap += "eta) > 1.5 && abs(";
0434 cutTextEcap += pathName;
0435 cutTextEcap += ") < 2.5";
0436 baseCutText += " && abs(";
0437 baseCutText += pathName;
0438 baseCutTextEcap = baseCutText;
0439 baseCutText += "eta) < 1.5";
0440 baseCutTextEcap += "eta) > 1.5 && abs(";
0441 baseCutTextEcap += pathName;
0442 baseCutTextEcap += "eta) < 2.5";
0443 }
0444 cutText += ") >= ";
0445 cutText += paths[pathNum].nCandsCut;
0446 cutText += ")";
0447 cutTextEcap += ") >= ";
0448 cutTextEcap += paths[pathNum].nCandsCut;
0449 cutTextEcap += ")";
0450 baseCutText += ") >= ";
0451 baseCutText += paths[pathNum].nCandsCut;
0452 baseCutText += ")";
0453 baseCutTextEcap += ") >= ";
0454 baseCutTextEcap += paths[pathNum].nCandsCut;
0455 baseCutTextEcap += ")";
0456
0457 cout<<cutText<<endl;
0458 cout<<cutTextEcap<<endl;
0459
0460
0461 passSig = sigEvents->Draw("",cutText);
0462 totalSig = sigEvents->Draw("",baseCutText);
0463 if (totalSig != 0) {
0464 effSig = (Double_t)passSig / (Double_t)totalSig;
0465 errSig = sqrt(effSig * (1. - effSig) / (Double_t)totalSig);
0466 }
0467 else {
0468 effSig = 0.;
0469 errSig = 0.;
0470 }
0471 rateTotBkg = 0.;
0472 errTotBkg = 0.;
0473 for (xSecNum = 0; xSecNum < bkgEvents.size(); xSecNum++) {
0474 passBkg = bkgEvents[xSecNum].first->Draw("",cutText);
0475 totalBkg = bkgEvents[xSecNum].first->Draw("","");
0476 if (totalBkg != 0) {
0477 effBkg = (Double_t)passBkg / (Double_t)totalBkg;
0478 errBkg = sqrt(effBkg * (1. - effBkg) / (Double_t)totalBkg);
0479 }
0480 else {
0481 effBkg = 0.;
0482 errBkg = 0.;
0483 }
0484 rateTotBkg += effBkg * bkgEvents[xSecNum].second * luminosity * conversion;
0485 errTotBkg = sqrt(errTotBkg * errTotBkg + errBkg * errBkg * bkgEvents[xSecNum].second * luminosity * conversion * bkgEvents[xSecNum].second * luminosity * conversion);
0486 }
0487
0488 if (cutNum == 6) {
0489 cout<<cutText<<endl;
0490 cout<<rateTotBkg<<" +- "<<errTotBkg<<", "<<effSig<<" +- "<<errSig<<endl;;
0491 }
0492 EffVBkg[pathNum][filterNum].SetPoint(cutNum, rateTotBkg, effSig);
0493 EffVBkg[pathNum][filterNum].SetPointError(cutNum, errTotBkg, errSig);
0494 if (cutNum == 6) {
0495 EffVBkg[pathNum][filterNum].GetPoint(cutNum, testX, testY);
0496 cout<<testX<<", "<<testY<<endl;
0497 }
0498
0499 if (doBandE) {
0500 passSig = sigEvents->Draw("",cutTextEcap);
0501 totalSig = sigEvents->Draw("",baseCutText);
0502 if (totalSig != 0) {
0503 effSig = (Double_t)passSig / (Double_t)totalSig;
0504 errSig = sqrt(effSig * (1. - effSig) / (Double_t)totalSig);
0505 }
0506 else {
0507 effSig = 0.;
0508 errSig = 0.;
0509 }
0510 rateTotBkg = 0.;
0511 errTotBkg = 0.;
0512 for (xSecNum = 0; xSecNum < bkgEvents.size(); xSecNum++) {
0513 passBkg = bkgEvents[xSecNum].first->Draw("",cutText);
0514 totalBkg = bkgEvents[xSecNum].first->Draw("","");
0515 if (totalBkg != 0) {
0516 effBkg = (Double_t)passBkg / (Double_t)totalBkg;
0517 errBkg = sqrt(effBkg * (1. - effBkg) / (Double_t)totalBkg);
0518 }
0519 else {
0520 effBkg = 0.;
0521 errBkg = 0.;
0522 }
0523 rateTotBkg += effBkg * bkgEvents[xSecNum].second * luminosity * conversion;
0524 errTotBkg = sqrt(errTotBkg * errTotBkg + errBkg * errBkg * bkgEvents[xSecNum].second * luminosity * conversion * bkgEvents[xSecNum].second * luminosity * conversion);
0525 }
0526
0527 if (cutNum == 6) {
0528 cout<<cutText<<endl;
0529 cout<<rateTotBkg<<" +- "<<errTotBkg<<", "<<effSig<<" +- "<<errSig<<endl;;
0530 }
0531 EffVBkgEcap[pathNum][filterNum].SetPoint(cutNum, rateTotBkg, effSig);
0532 EffVBkgEcap[pathNum][filterNum].SetPointError(cutNum, errTotBkg, errSig);
0533 if (cutNum == 6) {
0534 EffVBkg[pathNum][filterNum].GetPoint(cutNum, testX, testY);
0535 cout<<testX<<", "<<testY<<endl;
0536 }
0537 }
0538 }
0539 }
0540 }
0541 }
0542 TCanvas *myCanvas;
0543 TString tempPathName, canvasTitle, graphTitle, outFilename;
0544 Int_t n;
0545 Int_t nGraphs, curGraph;
0546 for (pathNum = 0; pathNum < paths.size(); pathNum++) {
0547 canvasTitle = "Efficiency vs. Background for ";
0548 tempPathName = paths[pathNum].names[paths[pathNum].filters[(paths[pathNum].filters).size()-1].pathNum];
0549 tempPathName.Resize(tempPathName.Index(".", 1, 0, TString::kExact));
0550 outFilename = "./images/";
0551 outFilename += tempPathName;
0552 outFilename += "EffVBkg.gif";
0553 n = 0;
0554 while (tempPathName.Contains(TRegexp("[a-z][A-Z]")) && n < 10) {
0555 tempPathName.Insert(tempPathName.Index(TRegexp("[a-z][A-Z]"))+1, " ");
0556 n++;
0557 }
0558 canvasTitle += tempPathName;
0559 nGraphs = 0;
0560 for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) {
0561 if ((paths[pathNum].filters)[filterNum].maxCut != 0) nGraphs++;
0562 }
0563 myCanvas = new TCanvas("myCanvas", canvasTitle, 0, 0, 1000, 500*(nGraphs / 2 + 1));
0564 myCanvas->Divide(2,nGraphs / 2 + 1);
0565 curGraph = 0;
0566 for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) {
0567 if ((paths[pathNum].filters)[filterNum].maxCut != 0.) {
0568 myCanvas->cd(curGraph+1);
0569 curGraph++;
0570 graphTitle = "Efficiency vs. Background for ";
0571 graphTitle += (paths[pathNum].filters)[filterNum].name;
0572 graphTitle += " Filter;Background Rate (Hz);Signal Eff.";
0573 EffVBkg[pathNum][filterNum].SetTitle(graphTitle);
0574 EffVBkg[pathNum][filterNum].Draw("AP");
0575 }
0576 }
0577 myCanvas->Print(outFilename);
0578 if (doBandE) {
0579 canvasTitle = "Efficiency vs. Background for ";
0580 tempPathName = paths[pathNum].names[paths[pathNum].filters[(paths[pathNum].filters).size()-1].pathNum];
0581 tempPathName.Resize(tempPathName.Index(".", 1, 0, TString::kExact));
0582 tempPathName += "Endcap";
0583 outFilename = "./images/";
0584 outFilename += tempPathName;
0585 outFilename += "EffVBkg.gif";
0586 n = 0;
0587 while (tempPathName.Contains(TRegexp("[a-z][A-Z]")) && n < 10) {
0588 tempPathName.Insert(tempPathName.Index(TRegexp("[a-z][A-Z]"))+1, " ");
0589 n++;
0590 }
0591 canvasTitle += tempPathName;
0592 nGraphs = 0;
0593 for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) {
0594 if ((paths[pathNum].filters)[filterNum].maxCut != 0) nGraphs++;
0595 }
0596 myCanvas = new TCanvas("myCanvas", canvasTitle, 0, 0, 1000, 500*(nGraphs / 2 + 1));
0597 myCanvas->Divide(2,nGraphs / 2 + 1);
0598 curGraph = 0;
0599 for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) {
0600 if ((paths[pathNum].filters)[filterNum].maxCut != 0.) {
0601 myCanvas->cd(curGraph+1);
0602 curGraph++;
0603 graphTitle = "Efficiency vs. Background for ";
0604 graphTitle += (paths[pathNum].filters)[filterNum].name;
0605 graphTitle += " Filter in Endcap;Background Rate (Hz);Signal Eff.";
0606 EffVBkgEcap[pathNum][filterNum].SetTitle(graphTitle);
0607 EffVBkgEcap[pathNum][filterNum].Draw("AP");
0608 }
0609 }
0610 myCanvas->Print(outFilename);
0611 }
0612 }
0613
0614 TH1F *timingSig = new TH1F("timingSig", "Timing of Single Electron Filters in Signal Events", 6, 0, 6);
0615 timingSig->SetCanExtend(TH1::kAllAxes);
0616 timingSig->SetStats(0);
0617 TTreeFormula *l1MatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.l1Match",sigEvents);
0618 TTreeFormula *EtTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Et",sigEvents);
0619 TTreeFormula *IHcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.ElecIHcal",sigEvents);
0620 TTreeFormula *pixMatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.pixMatch",sigEvents);
0621 TTreeFormula *EoverpTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Eoverp",sigEvents);
0622 TTreeFormula *ItrackTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.ElecItrack",sigEvents);
0623 Long64_t event = 0;
0624 Double_t avgL1Match = 0.;
0625 Double_t avgEt = 0.;
0626 Double_t avgIHcal = 0.;
0627 Double_t avgPixMatch = 0.;
0628 Double_t avgEoverp = 0.;
0629 Double_t avgItrack = 0.;
0630 for (event = 0; event < sigEvents->GetEntries(); event++) {
0631 sigEvents->LoadTree(event);
0632 avgL1Match = (event*avgL1Match + l1MatchTiming->EvalInstance(0))/ ((Double_t) (event+1));
0633 avgEt = (event*avgEt + EtTiming->EvalInstance(0))/ ((Double_t) (event+1));
0634 avgIHcal = (event*avgIHcal + IHcalTiming->EvalInstance(0))/ ((Double_t) (event+1));
0635 avgPixMatch = (event*avgPixMatch + pixMatchTiming->EvalInstance(0))/ ((Double_t) (event+1));
0636 avgEoverp = (event*avgEoverp + EoverpTiming->EvalInstance(0))/ ((Double_t) (event+1));
0637 avgItrack = (event*avgItrack + ItrackTiming->EvalInstance(0))/ ((Double_t) (event+1));
0638 }
0639 timingSig->Fill("L1 Match", avgL1Match);
0640 timingSig->Fill("Et", avgEt);
0641 timingSig->Fill("IHcal", avgIHcal);
0642 timingSig->Fill("Pix Match", avgPixMatch);
0643 timingSig->Fill("E/p", avgEoverp);
0644 timingSig->Fill("Itrack", avgItrack);
0645 timingSig->LabelsDeflate("X");
0646 timingSig->LabelsOption("v");
0647
0648 TH1F *timingBkg = new TH1F("timingBkg", "Timing of Single Electron Filters in Background Events", 6, 0, 6);
0649 timingBkg->SetCanExtend(TH1::kAllAxes);
0650 timingBkg->SetStats(0);
0651 avgL1Match = 0.;
0652 avgEt = 0.;
0653 avgIHcal = 0.;
0654 avgPixMatch = 0.;
0655 avgEoverp = 0.;
0656 avgItrack = 0.;
0657 for (xSecNum = 0; xSecNum < bkgEvents.size(); xSecNum++) {
0658 delete l1MatchTiming; l1MatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.l1Match",bkgEvents[xSecNum].first);
0659 delete EtTiming; EtTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Et",bkgEvents[xSecNum].first);
0660 delete IHcalTiming; IHcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.ElecIHcal",bkgEvents[xSecNum].first);
0661 delete pixMatchTiming; pixMatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.pixMatch",bkgEvents[xSecNum].first);
0662 delete EoverpTiming; EoverpTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Eoverp",bkgEvents[xSecNum].first);
0663 delete ItrackTiming; ItrackTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.ElecItrack",bkgEvents[xSecNum].first);
0664 event = 0;
0665 for (event = 0; event < bkgEvents[xSecNum].first->GetEntries(); event++) {
0666 bkgEvents[xSecNum].first->LoadTree(event);
0667 avgL1Match = (event*avgL1Match + l1MatchTiming->EvalInstance(0))/ ((Double_t) (event+1));
0668 avgEt = (event*avgEt + EtTiming->EvalInstance(0))/ ((Double_t) (event+1));
0669 avgIHcal = (event*avgIHcal + IHcalTiming->EvalInstance(0))/ ((Double_t) (event+1));
0670 avgPixMatch = (event*avgPixMatch + pixMatchTiming->EvalInstance(0))/ ((Double_t) (event+1));
0671 avgEoverp = (event*avgEoverp + EoverpTiming->EvalInstance(0))/ ((Double_t) (event+1));
0672 avgItrack = (event*avgItrack + ItrackTiming->EvalInstance(0))/ ((Double_t) (event+1));
0673 }
0674 }
0675 timingBkg->Fill("L1 Match", avgL1Match);
0676 timingBkg->Fill("Et", avgEt);
0677 timingBkg->Fill("IHcal", avgIHcal);
0678 timingBkg->Fill("Pix Match", avgPixMatch);
0679 timingBkg->Fill("E/p", avgEoverp);
0680 timingBkg->Fill("Itrack", avgItrack);
0681 timingBkg->LabelsDeflate("X");
0682 timingBkg->LabelsOption("v");
0683
0684 myCanvas = new TCanvas("myCanvas", "Timing vs. Filter for Isolated Electron Filters", 1000, 500);
0685 myCanvas->Divide(2,1);
0686 myCanvas->cd(1);
0687 timingSig->Draw();
0688 myCanvas->cd(2);
0689 timingBkg->Draw();
0690 myCanvas->Print("images/TimingIso.gif");
0691 delete myCanvas;
0692 delete timingSig;
0693 delete timingBkg;
0694
0695 timingSig = new TH1F("timingSig", "Timing of Single Photon Filters in Signal Events", 6, 0, 6);
0696 timingSig->SetCanExtend(TH1::kAllAxes);
0697 timingSig->SetStats(0);
0698 delete l1MatchTiming; l1MatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.l1Match",sigEvents);
0699 delete EtTiming; EtTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Et",sigEvents);
0700 TTreeFormula *IEcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.IEcal",sigEvents);
0701 TTreeFormula *PhotIHcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.PhotIHcal",sigEvents);
0702 TTreeFormula *PhotItrackTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.PhotItrack",sigEvents);
0703 event = 0;
0704 avgL1Match = 0.;
0705 avgEt = 0.;
0706 Double_t avgIEcal = 0.;
0707 Double_t avgPhotIHcal = 0.;
0708 Double_t avgPhotItrack = 0.;
0709 for (event = 0; event < sigEvents->GetEntries(); event++) {
0710 sigEvents->LoadTree(event);
0711 avgL1Match = (event*avgL1Match + l1MatchTiming->EvalInstance(0))/ ((Double_t) (event+1));
0712 avgEt = (event*avgEt + EtTiming->EvalInstance(0))/ ((Double_t) (event+1));
0713 avgIEcal = (event*avgIEcal + IEcalTiming->EvalInstance(0))/ ((Double_t) (event+1));
0714 avgPhotIHcal = (event*avgPhotIHcal + PhotIHcalTiming->EvalInstance(0))/ ((Double_t) (event+1));
0715 avgPhotItrack = (event*avgPhotItrack + PhotItrackTiming->EvalInstance(0))/ ((Double_t) (event+1));
0716 }
0717 timingSig->Fill("L1 Match", avgL1Match);
0718 timingSig->Fill("Et", avgEt);
0719 timingSig->Fill("IEcal", avgIEcal);
0720 timingSig->Fill("IHcal", avgPhotIHcal);
0721 timingSig->Fill("Itrack", avgPhotItrack);
0722 timingSig->LabelsDeflate("X");
0723 timingSig->LabelsOption("v");
0724
0725 timingBkg = new TH1F("timingBkg", "Timing of Single Photon Filters in Background Events", 6, 0, 6);
0726 timingBkg->SetCanExtend(TH1::kAllAxes);
0727 timingBkg->SetStats(0);
0728 avgL1Match = 0.;
0729 avgEt = 0.;
0730 avgIEcal = 0.;
0731 avgPhotIHcal = 0.;
0732 avgPhotItrack = 0.;
0733 for (xSecNum = 0; xSecNum < bkgEvents.size(); xSecNum++) {
0734 delete l1MatchTiming; l1MatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.l1Match",bkgEvents[xSecNum].first);
0735 delete EtTiming; EtTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Et",bkgEvents[xSecNum].first);
0736 delete IEcalTiming; IEcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.IEcal",bkgEvents[xSecNum].first);
0737 delete PhotIHcalTiming; PhotIHcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.PhotIHcal",bkgEvents[xSecNum].first);
0738 delete PhotItrackTiming; PhotItrackTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.PhotItrack",bkgEvents[xSecNum].first);
0739 event = 0;
0740 for (event = 0; event < bkgEvents[xSecNum].first->GetEntries(); event++) {
0741 bkgEvents[xSecNum].first->LoadTree(event);
0742 avgL1Match = (event*avgL1Match + l1MatchTiming->EvalInstance(0))/ ((Double_t) (event+1));
0743 avgEt = (event*avgEt + EtTiming->EvalInstance(0))/ ((Double_t) (event+1));
0744 avgIEcal = (event*avgIEcal + IEcalTiming->EvalInstance(0))/ ((Double_t) (event+1));
0745 avgPhotIHcal = (event*avgPhotIHcal + PhotIHcalTiming->EvalInstance(0))/ ((Double_t) (event+1));
0746 avgPhotItrack = (event*avgPhotItrack + PhotItrackTiming->EvalInstance(0))/ ((Double_t) (event+1));
0747 }
0748 }
0749 timingBkg->Fill("L1 Match", avgL1Match);
0750 timingBkg->Fill("Et", avgEt);
0751 timingBkg->Fill("IEcal", avgIEcal);
0752 timingBkg->Fill("IHcal", avgPhotIHcal);
0753 timingBkg->Fill("Itrack", avgPhotItrack);
0754 timingBkg->LabelsDeflate("X");
0755 timingBkg->LabelsOption("v");
0756
0757 myCanvas = new TCanvas("myCanvas", "Timing vs. Filter for Isolated Photon Filters", 1000, 500);
0758 myCanvas->Divide(2,1);
0759 myCanvas->cd(1);
0760 timingSig->Draw();
0761 myCanvas->cd(2);
0762 timingBkg->Draw();
0763 myCanvas->Print("images/TimingIsoPhot.gif");
0764 }