File indexing completed on 2024-04-06 12:31:19
0001 #include <iostream>
0002 #include <cassert>
0003 #include <TROOT.h>
0004 #include <TSystem.h>
0005 #include <TFile.h>
0006 #include <TTree.h>
0007 #include <TBranch.h>
0008 #include <TCanvas.h>
0009 #include <TH1.h>
0010 #include <TH2.h>
0011 #include <TGraph.h>
0012 #include <TF1.h>
0013 #include <TFormula.h>
0014 #include <TStyle.h>
0015 #include <TKey.h>
0016 #include <vector>
0017 #include "FWCore/FWLite/interface/FWLiteEnabler.h"
0018 #include "AnalysisDataFormats/TopObjects/interface/TtSemiEvtSolution.h"
0019 #include "TopQuarkAnalysis/TopTools/interface/LRHelpFunctions.h"
0020
0021
0022
0023
0024
0025
0026 const int nrFiles = 51;
0027 const TString path = "dcap://maite.iihe.ac.be:/pnfs/iihe/becms/heyninck/TtSemiMuEvents_TopRex_Juni/TtSemiMuEvents_";
0028
0029
0030 const bool useSpaceAngle = true;
0031 const double SumAlphaCut = 0.7;
0032
0033
0034 const int nrJetCombObs = 7;
0035 const int JetCombObs[nrJetCombObs] = {1, 2, 3, 4, 5, 6, 7};
0036 const int nrJetCombHistBins = 50;
0037 const double JetCombObsMin[nrJetCombObs] = {0, 0, 0, 0, 0, -15, -6};
0038 const double JetCombObsMax[nrJetCombObs] = {3, 3.5, 5, 5, 5, 70, 0};
0039
0040
0041 const char *JetCombObsFits[nrJetCombObs] = {
0042 "[0]/(1 + 1/exp([1]*([2] - x)))",
0043 "[0]/(1 + 1/exp([1]*([2] - x)))",
0044 "gaus",
0045 "gaus",
0046 "gaus",
0047 "([0]+[3]*abs(x)/x)*(1-exp([1]*(abs(x)-[2])))",
0048 "[0]/(1 + 1/exp([1]*([2] - x)))"
0049 };
0050
0051
0052 const TString JetCombOutfileName = "../data/TtSemiLRJetCombAllObs.root";
0053 const TString JetCombPSfile = "../data/TtSemiLRJetCombAllObs.ps";
0054
0055
0056
0057
0058
0059
0060 LRHelpFunctions *myLRhelper;
0061 void doEventloop();
0062 std::vector<int> obsNrs;
0063 std::vector<double> obsMin, obsMax;
0064 std::vector<const char *> obsFits;
0065
0066
0067
0068
0069
0070 int main() {
0071 gSystem->Load("libFWCoreFWLite");
0072 FWLiteEnabler::enable();
0073
0074
0075
0076 for (int j = 0; j < nrJetCombObs; j++) {
0077 obsNrs.push_back(JetCombObs[j]);
0078 obsMin.push_back(JetCombObsMin[j]);
0079 obsMax.push_back(JetCombObsMax[j]);
0080 obsFits.push_back(JetCombObsFits[j]);
0081 }
0082 myLRhelper = new LRHelpFunctions(obsNrs, nrJetCombHistBins, obsMin, obsMax, obsFits);
0083
0084 std::vector<double> parsFobs6;
0085 parsFobs6.push_back(0.8);
0086 parsFobs6.push_back(-0.1);
0087 parsFobs6.push_back(-0.8);
0088 parsFobs6.push_back(0.2);
0089 myLRhelper->setObsFitParameters(6, parsFobs6);
0090
0091
0092 doEventloop();
0093
0094
0095 myLRhelper->normalizeSandBhists();
0096
0097
0098 myLRhelper->makeAndFitSoverSplusBHists();
0099
0100
0101 myLRhelper->storeToROOTfile(JetCombOutfileName);
0102
0103
0104 myLRhelper->storeControlPlots(JetCombPSfile);
0105 }
0106
0107
0108
0109
0110
0111 void doEventloop() {
0112 std::cout << std::endl << std::endl << "**** STARTING EVENT LOOP ****" << std::endl;
0113 int okEvents = 0, totNrEv = 0;
0114 for (int nr = 1; nr <= nrFiles; nr++) {
0115 TString ft = path;
0116 ft += nr - 1;
0117 ft += ".root";
0118 if (!gSystem->AccessPathName(ft)) {
0119 TFile *file = TFile::Open(ft);
0120 TTree *events = dynamic_cast<TTree *>(file->Get("Events"));
0121 assert(events != nullptr);
0122 TBranch *solsbranch = events->GetBranch("TtSemiEvtSolutions_solutions__TtEventReco.obj");
0123 assert(solsbranch != nullptr);
0124 std::vector<TtSemiEvtSolution> sols;
0125 solsbranch->SetAddress(&sols);
0126
0127
0128 for (int ev = 0; ev < events->GetEntries(); ++ev) {
0129 ++totNrEv;
0130 if ((double)((totNrEv * 1.) / 1000.) == (double)(totNrEv / 1000))
0131 std::cout << " Processing event " << totNrEv << std::endl;
0132 solsbranch->GetEntry(ev);
0133 if (sols.size() == 12) {
0134
0135 bool trueSolExists = false;
0136 for (int s = 0; s < 12; s++) {
0137 if (sols[s].getMCBestSumAngles() < SumAlphaCut)
0138 trueSolExists = true;
0139 }
0140 if (trueSolExists) {
0141 for (int s = 0; s < 12; s++) {
0142
0143 std::vector<double> obsVals;
0144 for (int j = 0; j < nrJetCombObs; j++) {
0145 if (myLRhelper->obsFitIncluded((unsigned int)obsNrs[j]))
0146 obsVals.push_back(sols[s].getLRJetCombObsVal((unsigned int)obsNrs[j]));
0147 }
0148
0149
0150
0151 if (sols[s].getMCBestJetComb() == s) {
0152 myLRhelper->fillToSignalHists(obsVals);
0153 ++okEvents;
0154 } else {
0155 myLRhelper->fillToBackgroundHists(obsVals);
0156 }
0157 }
0158 }
0159 }
0160 }
0161 file->Close();
0162 } else {
0163 std::cout << ft << " doesn't exist" << std::endl;
0164 }
0165 }
0166 std::cout << std::endl << "*********************** STATISTICS *************************" << std::endl;
0167 std::cout << " Probability that a correct jet combination exists:" << std::endl;
0168 std::cout << " (fraction events with ";
0169 if (useSpaceAngle)
0170 std::cout << "min SumAngle_jp < ";
0171 if (!useSpaceAngle)
0172 std::cout << "min DR_jp < ";
0173 std::cout << SumAlphaCut << " )" << std::endl;
0174 std::cout << std::endl << " " << (100. * okEvents) / (1. * totNrEv) << " %" << std::endl;
0175 std::cout << std::endl << "******************************************************************" << std::endl;
0176 }