1 |
mstein |
1.4 |
/////////////////////////////////////////////////////////
|
2 |
|
|
// Trigger Study
|
3 |
|
|
/////////////////////////////////////////////////////////
|
4 |
|
|
//to run, execute: root run.C
|
5 |
|
|
//
|
6 |
|
|
//In this file, the implementation of the T&P method and
|
7 |
|
|
//the evaluation of the trigger efficiency is performed.
|
8 |
|
|
//some documentation can be found here:
|
9 |
|
|
//https://twiki.cern.ch/twiki/bin/viewauth/CMSsandbox/MatthiasSteinTriggerStudy
|
10 |
|
|
|
11 |
|
|
|
12 |
mstein |
1.2 |
#include <iostream>
|
13 |
|
|
#include <fstream>
|
14 |
|
|
#include <map>
|
15 |
|
|
#include <vector>
|
16 |
|
|
|
17 |
|
|
#include <Math/LorentzVector.h>
|
18 |
|
|
|
19 |
|
|
#include "TString.h"
|
20 |
mstein |
1.3 |
#include "TH1.h"
|
21 |
|
|
#include "TH1D.h"
|
22 |
mstein |
1.2 |
#include "TTree.h"
|
23 |
|
|
#include "TFile.h"
|
24 |
|
|
|
25 |
|
|
#include "plotMaker.h"
|
26 |
|
|
#include "tools.h"
|
27 |
|
|
//--------------------------------------------------- declare some special types
|
28 |
|
|
#ifdef __MAKECINT__
|
29 |
|
|
#pragma link C++ class pair<string,bool>+;
|
30 |
|
|
#pragma link C++ class pair<string,string>+;
|
31 |
|
|
#pragma link C++ class map<string,bool>+;
|
32 |
|
|
#pragma link C++ class map<string,string>+;
|
33 |
|
|
#pragma link C++ class ROOT::Math::PtEtaPhiM4D<float>+;
|
34 |
|
|
#pragma link C++ class ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float> >+;
|
35 |
|
|
#pragma link C++ class vector<ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float> > >+;
|
36 |
|
|
#endif
|
37 |
|
|
|
38 |
|
|
typedef ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float> > LorentzM;
|
39 |
|
|
|
40 |
|
|
//--------------------------------------------------- Structure to store the whole event information in order to pass it to functions
|
41 |
|
|
struct eventInfo{
|
42 |
|
|
vector<string> *DESYtriggerElMatchedTriggerFilter;
|
43 |
mstein |
1.3 |
vector<string> *DESYtriggerMuMatchedTriggerFilter;
|
44 |
mstein |
1.2 |
map<string, string> *DESYtriggerNameMap;
|
45 |
|
|
vector<int> *electronCharge;
|
46 |
|
|
vector<LorentzM> *electronP4;
|
47 |
|
|
int Event;
|
48 |
|
|
double HT;
|
49 |
|
|
vector<LorentzM> *jetP4;
|
50 |
|
|
double MET;
|
51 |
|
|
vector<int> *muonCharge;
|
52 |
|
|
vector<LorentzM> *muonP4;
|
53 |
|
|
map<string, int> *prescaled;
|
54 |
|
|
int Run;
|
55 |
mstein |
1.3 |
int PUInter;
|
56 |
mstein |
1.2 |
double PUWeight;
|
57 |
|
|
map<string, bool> *triggered;
|
58 |
mstein |
1.3 |
vector<vector<TString> > triggerFilterEl;
|
59 |
|
|
vector<vector<TString> > triggerFilterMu;
|
60 |
mstein |
1.2 |
double Weight;
|
61 |
|
|
};
|
62 |
|
|
|
63 |
|
|
//--------------------------------------------------- functions
|
64 |
|
|
// void init(TString inputFileName);
|
65 |
mstein |
1.3 |
void handleTriggerMatchingInfo(eventInfo& evt);
|
66 |
mstein |
1.2 |
void initBranches(TTree *tree, eventInfo &event);
|
67 |
mstein |
1.3 |
void investigateTriggerFilterMu(eventInfo& evt, map<TString, plotMaker> &plot, TString filterName);
|
68 |
mstein |
1.2 |
void Loop(TString inputFileName, TString outputFileName);
|
69 |
mstein |
1.3 |
void makeEfficiencyPlots(map<TString, plotMaker> &plot);
|
70 |
mstein |
1.2 |
void plotHistograms(eventInfo& evt, map<TString, plotMaker> &plot);
|
71 |
|
|
void printElectronInfo(eventInfo& evt, ostream& os=cout);
|
72 |
|
|
void printEventInfo(eventInfo& evt, ostream& os=cout);
|
73 |
|
|
void printMuonInfo(eventInfo& evt, ostream& os=cout);
|
74 |
mstein |
1.5 |
void setEfficiencyErrors(TH1D* &eff, TH1D* &h_passed, TH1D* &h_failed);
|
75 |
mstein |
1.3 |
|
76 |
|
|
//--------------------------------------------------- global Variables
|
77 |
|
|
vector<string> triggerFilterToCheckMu;
|
78 |
|
|
vector<string> triggerFilterToCheckEl;
|
79 |
|
|
//----------------------------------------
|
80 |
|
|
const Int_t binPt = 25;
|
81 |
|
|
const Double_t lowPt = 0.;
|
82 |
|
|
const Double_t upPt = 250.;
|
83 |
|
|
//----------------------------------------
|
84 |
|
|
const Int_t binEta = 50;
|
85 |
|
|
const Double_t lowEta = -2.5;
|
86 |
|
|
const Double_t upEta = 2.5;
|
87 |
|
|
//----------------------------------------
|
88 |
|
|
const Int_t binPU = 64;
|
89 |
|
|
const Double_t lowPU = 0.;
|
90 |
|
|
const Double_t upPU = 64.;
|
91 |
|
|
|
92 |
mstein |
1.2 |
|
93 |
|
|
//================================================================================= triggerStudy
|
94 |
|
|
//main function which will be called
|
95 |
|
|
//here, it is possible to run over multiple files and to estimate trigger efficiencies for different samples
|
96 |
mstein |
1.5 |
void triggerStudy(){
|
97 |
|
|
|
98 |
|
|
//--------------------------------------------------- define the muon TriggerFilters to be checked
|
99 |
mstein |
1.3 |
triggerFilterToCheckMu.push_back("hltL1sMu16Eta2p1");
|
100 |
|
|
triggerFilterToCheckMu.push_back("hltL2fL1sMu16Eta2p1L1f0L2Filtered16Q");
|
101 |
|
|
triggerFilterToCheckMu.push_back("hltL3crIsoL1sMu16Eta2p1L1f0L2f16QL3f20L3crIsoFiltered10");
|
102 |
|
|
triggerFilterToCheckMu.push_back("hltIsoMu202p1TriCentralPFJet30MuCleaned");
|
103 |
|
|
triggerFilterToCheckMu.push_back("hltIsoMu202p1TriCentralPFJet303020MuCleaned");
|
104 |
|
|
triggerFilterToCheckMu.push_back("hltDiMuonGlb22Trk8DzFiltered0p2");
|
105 |
|
|
triggerFilterToCheckMu.push_back("hltL3crIsoL1sMu14Eta2p1L1f0L2f16QL3f20L3crIsoRhoFiltered0p15");
|
106 |
mstein |
1.5 |
//--------------------------------------------------- define the electron TriggerFilters to be checked
|
107 |
mstein |
1.3 |
// triggerFilterToCheckEl.push_back("hltL1sL1SingleEG20orL1SingleEG22");
|
108 |
|
|
// triggerFilterToCheckEl.push_back("hltEle25CaloIdVTTrkIdTCaloIsoTTrkIsoTTrackIsoFilter");
|
109 |
|
|
// triggerFilterToCheckEl.push_back("hltEle25CaloIdVTCaloIsoTTrkIdTTrkIsoTTriCentralPFJet30EleCleaned");
|
110 |
|
|
// triggerFilterToCheckEl.push_back("hltEle25CaloIdVTCaloIsoTTrkIdTTrkIsoTTriCentralPFNoPUJet30EleCleaned");
|
111 |
|
|
// triggerFilterToCheckEl.push_back("hltEle25CaloIdVTCaloIsoTTrkIdTTrkIsoTTriCentralPFNoPUJet303020EleCleaned");
|
112 |
|
|
|
113 |
mstein |
1.5 |
//--------------------------------------------------- define the sample(s) to loop over and the output file
|
114 |
|
|
//these are small test files of ONE single file af a sample
|
115 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/TTJets_mu_tree.root", "out_TTJets_mu_tree.root");
|
116 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/TTJets_el_tree.root", "out_TTJets_el_tree.root");
|
117 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/DYJets_mu_tree.root", "out_DYJets_mu_tree.root");
|
118 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/DYJets_el_tree.root", "out_DYJets_el_tree.root");
|
119 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/SingleMu_mu_tree.root", "out_SingleMu_mu_tree.root");
|
120 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/SingleElectron_el_tree.root", "out_SingleElectron_el_tree.root");
|
121 |
|
|
//these are the whole samples
|
122 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/TTJets/SUMMER12/TTJets_SUMMER12_TrigStudy-mu_noTail_Tree.root", "out_TTJets_SUMMER12_TrigStudy-mu_noTail_Tree.root");
|
123 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/TTJets/SUMMER12/TTJets_SUMMER12_TrigStudy-el_noTail_Tree.root", "out_TTJets_SUMMER12_TrigStudy-el_noTail_Tree.root");
|
124 |
|
|
Loop("/scratch/hh/current/cms/user/mstein/output/DYJets/M-50/DYJets_M-50_TrigStudy-mu_noTail_Tree.root", "out_DYJets_M-50_TrigStudy-mu_noTail_Tree.root");
|
125 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/DYJets/M-50/DYJets_M-50_TrigStudy-el_noTail_Tree.root", "out_DYJets_M-50_TrigStudy-el_noTail_Tree.root");
|
126 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/SingleElectron/Run2012B-13Jul2012-v1/SingleElectron_Run2012B-13Jul2012-v1_TrigStudy-el_noTail_Tree.root", "out_SingleElectron_Run2012B-13Jul2012-v1_TrigStudy-el_noTail_Tree.root");
|
127 |
|
|
// Loop("/scratch/hh/current/cms/user/mstein/output/SingleMu/Run2012B-13Jul2012-v1/SingleMu_Run2012B-13Jul2012-v1_TrigStudy-mu_noTail_Tree.root", "out_SingleMu_Run2012B-13Jul2012-v1_TrigStudy-mu_noTail_Tree.root");
|
128 |
mstein |
1.3 |
|
129 |
|
|
|
130 |
mstein |
1.2 |
}
|
131 |
mstein |
1.1 |
|
132 |
|
|
|
133 |
mstein |
1.2 |
//================================================================================= plotHistograms
|
134 |
|
|
void plotHistograms(eventInfo& evt, map<TString, plotMaker> &plot){
|
135 |
|
|
plot["event"].addh1d("muMultiplicity", "muMultiplicity", "muon multiplicity", "events", 5, -0.5, 4.5, evt.muonP4->size(), evt.Weight);
|
136 |
|
|
plot["event"].addh1d("elMultiplicity", "elMultiplicity", "electron multiplicity", "events", 5, -0.5, 4.5, evt.electronP4->size(), evt.Weight);
|
137 |
|
|
plot["event"].addh1d("jetMultiplicity", "jetMultiplicity", "jet multiplicity", "events", 10, -0.5, 9.5, evt.jetP4->size(), evt.Weight);
|
138 |
mstein |
1.3 |
|
139 |
|
|
for(Int_t i=0,N=triggerFilterToCheckMu.size(); i<N; ++i){
|
140 |
|
|
investigateTriggerFilterMu(evt, plot, triggerFilterToCheckMu.at(i));
|
141 |
|
|
}
|
142 |
|
|
// for(Int_t i=0,N=triggerFilterToCheckEl.size(); i<N; ++i){
|
143 |
|
|
// investigateTriggerFilterEl(evt, plot, triggerFilterToCheckEl.at(i));
|
144 |
|
|
// }
|
145 |
|
|
}
|
146 |
|
|
|
147 |
|
|
|
148 |
|
|
//================================================================================= investigateTriggerFilterMu
|
149 |
mstein |
1.5 |
//check, if the positive lepton can be matched to the trigger filter
|
150 |
|
|
//if yes, take this lepton as Tag
|
151 |
|
|
//then probe the other lepton
|
152 |
|
|
void investigateTriggerFilterMu(eventInfo& evt, map<TString, plotMaker> &plot, TString filterName, TString label){
|
153 |
|
|
//--------------------------------------------------- do some consistency check - just to be sure
|
154 |
|
|
if(evt.muonP4->size() != 2){
|
155 |
|
|
cout<<"WARNING: The size of the muon vector is NOT two!"<<endl;
|
156 |
|
|
cout<<"evt.muonP4->size() = " << evt.muonP4->size() << endl;
|
157 |
|
|
return;
|
158 |
|
|
}
|
159 |
|
|
if(evt.muonP4->size() != evt.triggerFilterMu.size()){
|
160 |
|
|
cout<<"WARNING: The size of the muon vector and Matching-info vector is different!"<<endl;
|
161 |
|
|
cout<<"evt.muonP4->size() = " << evt.muonP4->size() << endl;
|
162 |
|
|
cout<<"evt.triggerFilterMu.size() = " << evt.triggerFilterMu.size() << endl;
|
163 |
|
|
return;
|
164 |
|
|
}
|
165 |
|
|
if(evt.muonP4->size() != evt.muonCharge->size()){
|
166 |
|
|
cout<<"WARNING: The size of the muon vector and muon-charge vector is different!"<<endl;
|
167 |
|
|
cout<<"evt.muonP4->size() = " << evt.muonP4->size() << endl;
|
168 |
|
|
cout<<"evt.muonCharge->size() = " << evt.muonCharge->size() << endl;
|
169 |
|
|
return;
|
170 |
|
|
}
|
171 |
|
|
// if(evt.electronP4->size() != evt.triggerFilterEl.size()){
|
172 |
|
|
// cout<<"WARNING: The size of the electron vector and Matching-info vector is different!"
|
173 |
|
|
// cout<<"evt.electronP4->size() = " << evt.electronP4->size() << endl;
|
174 |
|
|
// cout<<"evt.triggerFilterEl->size() = " << evt.triggerFilterEl->size() << endl;
|
175 |
|
|
// return;
|
176 |
|
|
// }
|
177 |
|
|
// if(evt.electronP4->size() != evt.electronP4.size()){
|
178 |
|
|
// cout<<"WARNING: The size of the electron vector and muon-charge vector is different!"
|
179 |
|
|
// cout<<"evt.electronP4->size() = " << evt.electronP4->size() << endl;
|
180 |
|
|
// cout<<"evt.electronP4->size() = " << evt.electronP4->size() << endl;
|
181 |
|
|
// return;
|
182 |
|
|
// }
|
183 |
|
|
//--------------------------------------------------- check which lepton has positive and which negative charge
|
184 |
|
|
Int_t index_pos = 0;
|
185 |
|
|
Int_t index_neg = 1;
|
186 |
|
|
if(evt.muonCharge->at(0)==-1){
|
187 |
|
|
index_pos = 0;
|
188 |
|
|
index_pos = 1;
|
189 |
|
|
}
|
190 |
|
|
//--------------------------------------------------- check which lepton has been matched to the trigger filter
|
191 |
mstein |
1.3 |
vector<bool> matched;
|
192 |
|
|
for(Int_t i=0,N=evt.muonP4->size(); i<N; ++i){
|
193 |
|
|
matched.push_back(false);
|
194 |
|
|
for(Int_t j=0,M=evt.triggerFilterMu.at(i).size(); j<M; ++j){
|
195 |
|
|
if(filterName == evt.triggerFilterMu.at(i).at(j)){
|
196 |
|
|
matched.back() = true;
|
197 |
|
|
break;
|
198 |
|
|
}
|
199 |
|
|
}
|
200 |
|
|
}
|
201 |
mstein |
1.5 |
//--------------------------------------------------- do the plotting according to the outcome, which lepton could be matched
|
202 |
mstein |
1.2 |
|
203 |
mstein |
1.5 |
//if the positive lepton IS NOT matched => no Tag found => return
|
204 |
|
|
if(!matched.at(index_pos)) return;
|
205 |
mstein |
1.2 |
|
206 |
mstein |
1.5 |
//if the positive lepton IS matched => plot Tag and Probe, and passed and failed
|
207 |
|
|
//plot the Tag
|
208 |
|
|
plot[filterName].addh1d(filterName+"_pt_tag", filterName+"_pt_tag", "p_{T}(tag) [GeV/c]", "events", binPt, lowPt, upPt, evt.muonP4->at(index_pos).Pt(), evt.Weight);
|
209 |
|
|
plot[filterName].addh1d(filterName+"_eta_tag", filterName+"_eta_tag", "#eta(tag)", "events", binEta, lowEta, upEta, evt.muonP4->at(index_pos).eta(), evt.Weight);
|
210 |
|
|
//plot the Probe
|
211 |
|
|
plot[filterName].addh1d(filterName+"_pt_probe", filterName+"_pt_probe", "p_{T}(probe) [GeV/c]", "events", binPt, lowPt, upPt, evt.muonP4->at(index_neg).pt(), evt.Weight);
|
212 |
|
|
plot[filterName].addh1d(filterName+"_eta_probe", filterName+"_eta_probe", "#eta(probe)", "events", binEta, lowEta, upEta, evt.muonP4->at(index_neg).eta(), evt.Weight);
|
213 |
|
|
//plot the passed
|
214 |
|
|
if(matched.at(index_neg)){
|
215 |
|
|
plot[filterName].addh1d(filterName+"_pt_passed", filterName+"_pt_passed", "p_{T}(passed) [GeV/c]", "events", binPt, lowPt, upPt, evt.muonP4->at(index_neg).pt(), evt.Weight);
|
216 |
|
|
plot[filterName].addh1d(filterName+"_eta_passed", filterName+"_eta_passed", "#eta(passed)", "events", binEta, lowEta, upEta, evt.muonP4->at(index_neg).eta(), evt.Weight);
|
217 |
|
|
plot[filterName].addh1d(filterName+"_PUVertices_passed", filterName+"_PUVertices_passed", "number of primary vertices (passed)", "events", binPU, lowPU, upPU, evt.PUInter, evt.Weight);
|
218 |
|
|
}
|
219 |
|
|
else{//plot the failed
|
220 |
|
|
plot[filterName].addh1d(filterName+"_pt_failed", filterName+"_pt_failed", "p_{T}(failed) [GeV/c]", "events", binPt, lowPt, upPt, evt.muonP4->at(index_neg).pt(), evt.Weight);
|
221 |
|
|
plot[filterName].addh1d(filterName+"_eta_failed", filterName+"_eta_failed", "#eta(failed)", "events", binEta, lowEta, upEta, evt.muonP4->at(index_neg).eta(), evt.Weight);
|
222 |
|
|
plot[filterName].addh1d(filterName+"_PUVertices_failed", filterName+"_PUVertices_failed", "number of primary vertices (failed)", "events", binPU, lowPU, upPU, evt.PUInter, evt.Weight);
|
223 |
mstein |
1.3 |
}
|
224 |
|
|
}
|
225 |
|
|
|
226 |
|
|
|
227 |
|
|
//================================================================================= makeEfficiencyPlots
|
228 |
mstein |
1.5 |
//eff = passed/(passed+failed)
|
229 |
mstein |
1.3 |
void makeEfficiencyPlots(map<TString, plotMaker> &plot){
|
230 |
|
|
cout<<"----------> Create efficiency histograms"<<endl;
|
231 |
|
|
|
232 |
|
|
vector<string> allTriggerFiltersToCheck = triggerFilterToCheckMu;
|
233 |
|
|
for(Int_t i=0,N=triggerFilterToCheckEl.size(); i<N; ++i){
|
234 |
|
|
allTriggerFiltersToCheck.push_back(triggerFilterToCheckEl.at(i));
|
235 |
|
|
}
|
236 |
|
|
vector<string> histNames;
|
237 |
mstein |
1.5 |
histNames.push_back("_pt_passed");
|
238 |
|
|
histNames.push_back("_eta_passed");
|
239 |
|
|
histNames.push_back("_PUVertices_passed");
|
240 |
mstein |
1.3 |
|
241 |
|
|
for(Int_t i=0,N=allTriggerFiltersToCheck.size(); i<N; ++i){
|
242 |
|
|
TString triggerFilter = allTriggerFiltersToCheck.at(i);
|
243 |
|
|
for(Int_t j=0,M=histNames.size(); j<M; ++j){
|
244 |
mstein |
1.5 |
TString passedName = triggerFilter;
|
245 |
|
|
TString failedName = triggerFilter;
|
246 |
|
|
TString effName = triggerFilter;
|
247 |
|
|
passedName += histNames.at(j);
|
248 |
|
|
failedName += histNames.at(j);
|
249 |
|
|
effName += histNames.at(j);
|
250 |
|
|
failedName.ReplaceAll("passed", "failed");
|
251 |
|
|
effName.ReplaceAll("passed", "eff");
|
252 |
|
|
|
253 |
|
|
if(plot[triggerFilter].isNewh1d(passedName)) continue;
|
254 |
|
|
if(plot[triggerFilter].isNewh1d(failedName)) continue;
|
255 |
|
|
|
256 |
|
|
TH1D *h_passed = (TH1D*)(plot[triggerFilter].h1d[passedName])->Clone();
|
257 |
|
|
TH1D *h_failed = (TH1D*)(plot[triggerFilter].h1d[failedName])->Clone();
|
258 |
|
|
TH1D *den = (TH1D*)(h_passed)->Clone();
|
259 |
|
|
den->Add((TH1D*)(h_failed)->Clone());
|
260 |
mstein |
1.3 |
|
261 |
mstein |
1.5 |
TH1D *eff = (TH1D*)(h_passed)->Clone();
|
262 |
mstein |
1.3 |
eff->Divide(den);
|
263 |
mstein |
1.5 |
setEfficiencyErrors(eff, h_passed, h_failed);
|
264 |
mstein |
1.3 |
|
265 |
|
|
eff->SetName(effName);
|
266 |
|
|
eff->SetTitle(effName);
|
267 |
|
|
|
268 |
|
|
TString xTitle_eff = eff->GetXaxis()->GetTitle();
|
269 |
mstein |
1.5 |
xTitle_eff.ReplaceAll("(passed)","");
|
270 |
mstein |
1.3 |
eff->GetXaxis()->SetTitle(xTitle_eff);
|
271 |
|
|
eff->GetYaxis()->SetTitle("efficiency");
|
272 |
|
|
//eff->SetAxisRange(0.,1.,"Y");
|
273 |
|
|
plot[triggerFilter].addh1d(eff);
|
274 |
|
|
}
|
275 |
|
|
}
|
276 |
|
|
}
|
277 |
|
|
|
278 |
|
|
|
279 |
|
|
//================================================================================= setEfficiencyErrors
|
280 |
mstein |
1.5 |
//p = passed; f = failed
|
281 |
|
|
// f(eff) = p/(p+f)
|
282 |
|
|
// df/dt = 1/(p+f) - p/(p+f)^2
|
283 |
|
|
// df/dp = - p/(p+f)^2
|
284 |
|
|
// eff_sig = sqrt(p_sig^2*(df/dp)^2 + f_sig^2*(df/df)^2)
|
285 |
|
|
void setEfficiencyErrors(TH1D* &eff, TH1D* &h_passed, TH1D* &h_failed){
|
286 |
|
|
if(h_passed->GetNbinsX() != h_failed->GetNbinsX()){
|
287 |
|
|
cout<<"WARNING: the number of bins of the passed and failed histograms differ! The efficiency calculation might be depricated!"<<endl;
|
288 |
|
|
cout<<"Number of bins (passed | failed): " << h_passed->GetNbinsX() << " | " << h_failed->GetNbinsX() << endl;
|
289 |
|
|
}
|
290 |
|
|
if(h_passed->GetXaxis()->GetXmax() != h_failed->GetXaxis()->GetXmax()){
|
291 |
|
|
cout<<"WARNING: the upper x-range of the passed and failed histograms differ! The efficiency calculation might be depricated!"<<endl;
|
292 |
|
|
cout<<"Number of bins (passed | failed): " << h_passed->GetXaxis()->GetXmax() << " | " << h_failed->GetXaxis()->GetXmax() << endl;
|
293 |
|
|
}
|
294 |
|
|
if(h_passed->GetXaxis()->GetXmin() != h_failed->GetXaxis()->GetXmin()){
|
295 |
|
|
cout<<"WARNING: the lower x-range of the passed and failed histograms differ! The efficiency calculation might be depricated!"<<endl;
|
296 |
|
|
cout<<"Number of bins (passed | failed): " << h_passed->GetXaxis()->GetXmin() << " | " << h_failed->GetXaxis()->GetXmin() << endl;
|
297 |
mstein |
1.3 |
}
|
298 |
|
|
//loop over single bins of histograms an set the efficiency error
|
299 |
mstein |
1.5 |
for(Int_t i=1,N=h_passed->GetNbinsX(); i<=N; ++i){
|
300 |
|
|
Double_t p = h_passed ->GetBinContent(i);
|
301 |
|
|
Double_t f = h_failed->GetBinContent(i);
|
302 |
|
|
Double_t p_sig = h_passed ->GetBinError(i);
|
303 |
|
|
Double_t f_sig = h_failed->GetBinError(i);
|
304 |
mstein |
1.3 |
|
305 |
|
|
if(eff->GetBinContent(i)==0.) continue;
|
306 |
|
|
|
307 |
mstein |
1.5 |
Double_t dedt = 1/(p+f)-p/((p+f)*(p+f));
|
308 |
|
|
Double_t dedp = -p/((p+f)*(p+f));
|
309 |
mstein |
1.2 |
|
310 |
mstein |
1.5 |
Double_t eff_sig = sqrt(p_sig*p_sig*dedt*dedt + f_sig*f_sig*dedp*dedp);
|
311 |
mstein |
1.3 |
eff->SetBinError(i, eff_sig);
|
312 |
|
|
}
|
313 |
mstein |
1.1 |
}
|
314 |
|
|
|
315 |
|
|
|
316 |
|
|
//================================================================================= Loop
|
317 |
mstein |
1.2 |
void Loop(TString inputFileName, TString outputFileName){
|
318 |
|
|
//timer.Start("Loop");
|
319 |
|
|
TString treeName = "trigStudyTree";
|
320 |
mstein |
1.3 |
map<TString, plotMaker> myPlots;
|
321 |
mstein |
1.2 |
|
322 |
|
|
//--------------------------------------------------- open file and read in leafs
|
323 |
|
|
TFile* inputFile = new TFile(inputFileName,"READ");
|
324 |
|
|
if (!inputFile->IsOpen()) std::cout<<"Could not open file "<<inputFileName<<std::endl;
|
325 |
|
|
TTree* inputTree= (TTree*)inputFile->Get(treeName);
|
326 |
mstein |
1.3 |
|
327 |
mstein |
1.2 |
eventInfo event;
|
328 |
|
|
initBranches(inputTree, event);
|
329 |
|
|
//--------------------------------------------------- Event Loop
|
330 |
|
|
int nEvents=inputTree->GetEntries();
|
331 |
|
|
cout<<endl;
|
332 |
|
|
cout<<"///////////////////////////////////////////////////////////////////////////////"<<endl;
|
333 |
|
|
cout<<"////////////////////////////// Starting Event Loop ////////////////////////////"<<endl;
|
334 |
|
|
cout<<"///////////////////////////////////////////////////////////////////////////////"<<endl;
|
335 |
|
|
cout<<"Investigate File: " << inputFileName << endl;
|
336 |
|
|
cout<<"Read out TTree: " << treeName << endl;
|
337 |
|
|
cout<<"Number of events: " << nEvents << endl;
|
338 |
|
|
cout<<"-------------------------------------------------------------------------------"<<endl;
|
339 |
|
|
cout<<endl;
|
340 |
|
|
cout<<"Looping over events..."<<endl;
|
341 |
mstein |
1.5 |
nEvents=50000;
|
342 |
mstein |
1.2 |
for (int iEvent=0; iEvent<nEvents; ++iEvent){
|
343 |
|
|
tools::progress(iEvent);
|
344 |
|
|
inputTree->GetEntry(iEvent);
|
345 |
mstein |
1.3 |
handleTriggerMatchingInfo(event);
|
346 |
mstein |
1.2 |
// printEventInfo(event);
|
347 |
mstein |
1.3 |
// printMuonInfo(event);
|
348 |
|
|
//printElectronInfo(event);
|
349 |
mstein |
1.2 |
plotHistograms(event, myPlots);
|
350 |
|
|
//tools::progressReset();
|
351 |
|
|
}
|
352 |
|
|
|
353 |
mstein |
1.3 |
makeEfficiencyPlots(myPlots);
|
354 |
mstein |
1.2 |
//--------------------------------------------------- Save all histograms in the appropriate folders
|
355 |
|
|
TString option="RECREATE";
|
356 |
|
|
for(typename map<TString, plotMaker>::iterator it = myPlots.begin(); it != myPlots.end(); ++it){
|
357 |
|
|
it->second.savePlots(outputFileName, option, it->first);
|
358 |
|
|
option="UPDATE";
|
359 |
mstein |
1.1 |
}
|
360 |
mstein |
1.2 |
//timer.Stop("Loop");
|
361 |
mstein |
1.1 |
}
|
362 |
|
|
|
363 |
|
|
|
364 |
mstein |
1.3 |
//================================================================================= handleTriggerMatchingInfo
|
365 |
|
|
// converting the trigger Info to a more practical format: vector<string> --> vector<vector<string> >
|
366 |
|
|
void handleTriggerMatchingInfo(eventInfo& evt){
|
367 |
|
|
evt.triggerFilterEl.clear();
|
368 |
|
|
evt.triggerFilterMu.clear();
|
369 |
|
|
//make simple check
|
370 |
|
|
|
371 |
|
|
if(evt.electronP4->size() != evt.DESYtriggerElMatchedTriggerFilter->size()){
|
372 |
|
|
cout<<"WARNING: Size of electron vector does not correspond to size of matching info vector!"<<endl;
|
373 |
|
|
cout<<"evt.electronP4->size() = " << evt.electronP4->size() << endl;
|
374 |
|
|
cout<<"evt.DESYtriggerElMatchedTriggerFilter->size() = " << evt.DESYtriggerElMatchedTriggerFilter->size() << endl;
|
375 |
|
|
|
376 |
|
|
tools::printVector("evt.electronP4", *(evt.electronP4));
|
377 |
|
|
tools::printVector("evt.DESYtriggerElMatchedTriggerFilter", *(evt.DESYtriggerElMatchedTriggerFilter));
|
378 |
|
|
|
379 |
|
|
return;
|
380 |
|
|
}
|
381 |
|
|
if(evt.muonP4->size() != evt.DESYtriggerMuMatchedTriggerFilter->size()){
|
382 |
|
|
cout<<"WARNING: Size of muon vector does not correspond to size of matching info vector!"<<endl;
|
383 |
|
|
cout<<"evt.muonP4->size() = " << evt.muonP4->size() << endl;
|
384 |
|
|
cout<<"evt.DESYtriggerMuMatchedTriggerFilter->size() = " << evt.DESYtriggerMuMatchedTriggerFilter->size() << endl;
|
385 |
|
|
return;
|
386 |
|
|
}
|
387 |
|
|
|
388 |
|
|
for(Int_t i=0,N=evt.electronP4->size(); i<N; ++i){
|
389 |
|
|
evt.triggerFilterEl.push_back(tools::splitToWords(evt.DESYtriggerElMatchedTriggerFilter->at(i), ";"));
|
390 |
|
|
//cout<<"evt.DESYtriggerElMatchedTriggerFilter->at("<<i<<") = " << evt.DESYtriggerElMatchedTriggerFilter->at(i) << endl;
|
391 |
|
|
//tools::printVector<TString>("triggerFilterEl", evt.triggerFilterEl.at(i));
|
392 |
|
|
}
|
393 |
|
|
// printMuonInfo(evt);
|
394 |
|
|
// printElectronInfo(evt);
|
395 |
|
|
|
396 |
|
|
//tools::printVector("evt.triggerFilterMu", evt.triggerFilterMu);
|
397 |
|
|
// tools::printVector("evt.DESYtriggerMuMatchedTriggerFilter", *(evt.DESYtriggerMuMatchedTriggerFilter));
|
398 |
|
|
// tools::printVector("evt.muonP4", *(evt.muonP4));
|
399 |
|
|
|
400 |
|
|
for(Int_t i=0,N=evt.muonP4->size(); i<N; ++i){
|
401 |
|
|
evt.triggerFilterMu.push_back(tools::splitToWords(evt.DESYtriggerMuMatchedTriggerFilter->at(i), ";"));
|
402 |
|
|
//cout<<"evt.DESYtriggerMuMatchedTriggerFilter->at("<<i<<") = " << evt.DESYtriggerMuMatchedTriggerFilter->at(i) << endl;
|
403 |
|
|
//tools::printVector<TString>("triggerFilterMu", evt.triggerFilterMu.at(i));
|
404 |
|
|
}
|
405 |
|
|
//cout<<"size: muonP4 | filterinfo = "
|
406 |
|
|
//<<evt.muonP4->size() << " | "
|
407 |
|
|
//<<evt.DESYtriggerMuMatchedTriggerFilter->size()
|
408 |
|
|
//<<endl;
|
409 |
|
|
}
|
410 |
|
|
|
411 |
|
|
|
412 |
mstein |
1.2 |
//================================================================================= initBranches
|
413 |
|
|
void initBranches(TTree *tree, eventInfo& evt){
|
414 |
|
|
//--------------------------------------------------- initialize event info
|
415 |
|
|
evt.DESYtriggerElMatchedTriggerFilter = 0;
|
416 |
|
|
evt.DESYtriggerMuMatchedTriggerFilter = 0;
|
417 |
|
|
evt.DESYtriggerNameMap = 0;
|
418 |
|
|
evt.electronCharge = 0;
|
419 |
|
|
evt.electronP4 = 0;
|
420 |
|
|
evt.Event = 0;
|
421 |
|
|
evt.HT = 0.;
|
422 |
|
|
evt.jetP4 = 0;
|
423 |
|
|
evt.MET = 0.;
|
424 |
|
|
evt.muonCharge = 0;
|
425 |
|
|
evt.muonP4 = 0;
|
426 |
|
|
evt.prescaled = 0;
|
427 |
|
|
evt.Run = 0;
|
428 |
mstein |
1.3 |
evt.PUInter = 0.;
|
429 |
mstein |
1.2 |
evt.PUWeight = 0.;
|
430 |
|
|
evt.triggered = 0;
|
431 |
|
|
evt.Weight = 0.;
|
432 |
|
|
//--------------------------------------------------- assign branches to event structure
|
433 |
|
|
tree->SetBranchAddress("DESYtriggerElMatchedTriggerFilter", &(evt.DESYtriggerElMatchedTriggerFilter));
|
434 |
|
|
tree->SetBranchAddress("DESYtriggerMuMatchedTriggerFilter",&(evt.DESYtriggerMuMatchedTriggerFilter));
|
435 |
|
|
tree->SetBranchAddress("DESYtriggerNameMap",&(evt.DESYtriggerNameMap));
|
436 |
|
|
tree->SetBranchAddress("electronCharge",&(evt.electronCharge));
|
437 |
|
|
tree->SetBranchAddress("electronP4",&(evt.electronP4));
|
438 |
|
|
tree->SetBranchAddress("Event",&(evt.Event));
|
439 |
|
|
tree->SetBranchAddress("HT",&(evt.HT));
|
440 |
|
|
tree->SetBranchAddress("jetP4",&(evt.jetP4));
|
441 |
|
|
tree->SetBranchAddress("MET",&(evt.MET));
|
442 |
|
|
tree->SetBranchAddress("muonCharge",&(evt.muonCharge));
|
443 |
|
|
tree->SetBranchAddress("muonP4",&(evt.muonP4));
|
444 |
|
|
tree->SetBranchAddress("prescaled",&(evt.prescaled));
|
445 |
|
|
tree->SetBranchAddress("Run",&(evt.Run));
|
446 |
mstein |
1.3 |
tree->SetBranchAddress("PUInter",&(evt.PUInter));
|
447 |
mstein |
1.2 |
tree->SetBranchAddress("PUWeight",&(evt.PUWeight));
|
448 |
|
|
tree->SetBranchAddress("triggered",&(evt.triggered));
|
449 |
|
|
tree->SetBranchAddress("Weight",&(evt.Weight));
|
450 |
|
|
}
|
451 |
mstein |
1.1 |
|
452 |
|
|
|
453 |
mstein |
1.2 |
//================================================================================= printEventInfo
|
454 |
|
|
void printEventInfo(eventInfo& evt, ostream& os){
|
455 |
|
|
os<<endl;
|
456 |
|
|
os<<"///////////////////////////////////////////////////////"<<endl;
|
457 |
|
|
os<<"///////////////////// Event Info //////////////////////"<<endl;
|
458 |
|
|
os<<"///////////////////////////////////////////////////////"<<endl;
|
459 |
|
|
os<<endl;
|
460 |
|
|
os<<"-----------------------------------------"<<endl;
|
461 |
|
|
os<<"Run = "<<evt.Run<<endl;
|
462 |
|
|
os<<"Event = "<<evt.Event<<endl;
|
463 |
|
|
os<<"Weight = "<<evt.Weight<<endl;
|
464 |
|
|
os<<"PUWeight = "<<evt.PUWeight<<endl;
|
465 |
mstein |
1.3 |
os<<"PUInter = "<<evt.PUInter<<endl;
|
466 |
mstein |
1.2 |
os<<"-----------------------------------------"<<endl;
|
467 |
|
|
os<<"HT = "<<evt.HT<<endl;
|
468 |
|
|
os<<"MET = "<<evt.MET<<endl;
|
469 |
|
|
os<<"-----------------------------------------"<<endl;
|
470 |
|
|
os<<"No. of Muons = "<<evt.muonP4->size()<<endl;
|
471 |
|
|
os<<"No. of Electrons = "<<evt.electronP4->size()<<endl;
|
472 |
|
|
os<<"No. of Jets = "<<evt.jetP4->size()<<endl;
|
473 |
|
|
os<<"-----------------------------------------"<<endl;
|
474 |
|
|
os<<"muonCharge.size() = "<<evt.muonCharge->size()<<endl;
|
475 |
|
|
os<<"electronCharge.size() = "<<evt.electronCharge->size()<<endl;
|
476 |
|
|
os<<"-----------------------------------------"<<endl;
|
477 |
|
|
os<<"MuMatchedTriggerFilter.size() = "<<evt.DESYtriggerMuMatchedTriggerFilter->size()<<endl;
|
478 |
|
|
os<<"ElMatchedTriggerFilter.size() = "<<evt.DESYtriggerElMatchedTriggerFilter->size()<<endl;
|
479 |
|
|
os<<"-----------------------------------------"<<endl;
|
480 |
|
|
os<<"triggered.size() = "<<evt.triggered->size()<<endl;
|
481 |
|
|
os<<"prescaled.size() = "<<evt.prescaled->size()<<endl;
|
482 |
|
|
os<<"DESYTriggerMap.size() = "<<evt.DESYtriggerNameMap->size()<<endl;
|
483 |
|
|
os<<"-----------------------------------------"<<endl;
|
484 |
|
|
os<<endl;
|
485 |
|
|
|
486 |
|
|
//tools::printVector<string>("jetP4", *(evt.jetP4));
|
487 |
|
|
//tools::printVector<string>("DESYtriggerMuMatchedTriggerFilter", *(evt.DESYtriggerMuMatchedTriggerFilter));
|
488 |
|
|
//tools::printVector<string>("DESYtriggerElMatchedTriggerFilter", *(evt.DESYtriggerElMatchedTriggerFilter));
|
489 |
|
|
//tools::printVector<string>("DESYtriggerNameMap", *(evt.DESYtriggerNameMap));
|
490 |
|
|
//tools::printVector<string>("prescaled", *(evt.prescaled));
|
491 |
|
|
//tools::printVector<string>("triggered", *(evt.triggered));
|
492 |
|
|
}
|
493 |
mstein |
1.1 |
|
494 |
|
|
|
495 |
mstein |
1.2 |
//================================================================================= printMuonInfo
|
496 |
|
|
void printMuonInfo(eventInfo& evt, ostream& os){
|
497 |
|
|
os<<endl;
|
498 |
|
|
os<<"///////////////////////////////////////////////////////"<<endl;
|
499 |
|
|
os<<"////////////////////// Muon Info //////////////////////"<<endl;
|
500 |
|
|
os<<"///////////////////////////////////////////////////////"<<endl;
|
501 |
|
|
os<<endl;
|
502 |
|
|
tools::printVector<LorentzM>("muonP4", *(evt.muonP4), os);
|
503 |
|
|
tools::printVector<int>("muonCharge", *(evt.muonCharge), os);
|
504 |
|
|
//------------------------ print invariant mass from all possible muon pairs
|
505 |
|
|
if(evt.muonP4->size()>=2){
|
506 |
|
|
os<<"-------------> Invariant masses of all possible muon pairs:"<<endl;
|
507 |
|
|
for(Int_t i=0,N=evt.muonP4->size(); i<N-1; ++i){
|
508 |
|
|
for(Int_t j=i+1; j<N; ++j){
|
509 |
|
|
Double_t minv = (evt.muonP4->at(i) + evt.muonP4->at(j)).mass();
|
510 |
|
|
os<<"Minv("<<i<<" + " <<j<<") = "<<minv<<endl;
|
511 |
|
|
}
|
512 |
|
|
}
|
513 |
|
|
os<<endl;
|
514 |
|
|
}
|
515 |
|
|
//------------------------ print matching info
|
516 |
mstein |
1.3 |
for(Int_t i=0,N=evt.muonP4->size(); i<N; ++i){
|
517 |
mstein |
1.2 |
os<<"----------------------------------------------------------------------------> Matches for muon "<<i<<":"<<
|
518 |
mstein |
1.3 |
endl;
|
519 |
|
|
tools::printVector<TString>("matched TriggerFilter", evt.triggerFilterMu.at(i), os);
|
520 |
mstein |
1.2 |
}
|
521 |
|
|
os<<endl;
|
522 |
mstein |
1.1 |
}
|
523 |
|
|
|
524 |
|
|
|
525 |
mstein |
1.2 |
//================================================================================= printElectronInfo
|
526 |
|
|
void printElectronInfo(eventInfo& evt, ostream& os){
|
527 |
|
|
os<<endl;
|
528 |
|
|
os<<"///////////////////////////////////////////////////////"<<endl;
|
529 |
|
|
os<<"///////////////////// Electron Info ///////////////////"<<endl;
|
530 |
|
|
os<<"///////////////////////////////////////////////////////"<<endl;
|
531 |
|
|
os<<endl;
|
532 |
|
|
tools::printVector<LorentzM>("electronP4", *(evt.electronP4), os);
|
533 |
|
|
tools::printVector<int>("electronCharge", *(evt.electronCharge), os);
|
534 |
|
|
//------------------------ print invariant mass from all possible electron pairs
|
535 |
|
|
if(evt.electronP4->size()>=2){
|
536 |
|
|
os<<"-------------> Invariant masses of all possible electron pairs:"<<endl;
|
537 |
|
|
for(Int_t i=0,N=evt.electronP4->size(); i<N-1; ++i){
|
538 |
|
|
for(Int_t j=i+1; j<N; ++j){
|
539 |
|
|
Double_t minv = (evt.electronP4->at(i) + evt.electronP4->at(j)).mass();
|
540 |
|
|
os<<"Minv("<<i<<" + " <<j<<") = "<<minv<<endl;
|
541 |
|
|
}
|
542 |
|
|
}
|
543 |
|
|
os<<endl;
|
544 |
|
|
}
|
545 |
|
|
//------------------------ print matching info
|
546 |
mstein |
1.3 |
for(Int_t i=0,N=evt.electronP4->size(); i<N; ++i){
|
547 |
mstein |
1.2 |
os<<"----------------------------------------------------------------------------> Matches for electron "<<i<<":"<<
|
548 |
mstein |
1.3 |
endl;
|
549 |
|
|
tools::printVector<TString>("matched TriggerFilter", evt.triggerFilterEl.at(i), os);
|
550 |
mstein |
1.2 |
}
|
551 |
|
|
os<<endl;
|
552 |
|
|
}
|
553 |
mstein |
1.1 |
|
554 |
|
|
|
555 |
|
|
|
556 |
|
|
|
557 |
|
|
|
558 |
|
|
|
559 |
|
|
|
560 |
|
|
|
561 |
|
|
|
562 |
|
|
|
563 |
|
|
|
564 |
|
|
|
565 |
|
|
|
566 |
|
|
|
567 |
|
|
|
568 |
mstein |
1.5 |
//Thats another version of implementing the T&P method
|
569 |
|
|
//This version uses ALL Objects within an event to extract the trigger efficiency.
|
570 |
|
|
//However, this method leads to a more complex treatment of the counting and the error propagation.
|
571 |
|
|
//The advantage is higher statistict. But the statistis is anayhow large enough...
|
572 |
|
|
// //================================================================================= investigateTriggerFilterMu
|
573 |
|
|
// // eff = 2*NTT / (2*NTT + NTP)
|
574 |
|
|
// void investigateTriggerFilterMu(eventInfo& evt, map<TString, plotMaker> &plot, TString filterName){
|
575 |
|
|
// //create vector which stores, if a muon is matched to the trigger filter with the name "filterName"
|
576 |
|
|
// vector<bool> matched;
|
577 |
|
|
// vector<int> probeIndex;
|
578 |
|
|
// for(Int_t i=0,N=evt.muonP4->size(); i<N; ++i){
|
579 |
|
|
// matched.push_back(false);
|
580 |
|
|
// for(Int_t j=0,M=evt.triggerFilterMu.at(i).size(); j<M; ++j){
|
581 |
|
|
// if(filterName == evt.triggerFilterMu.at(i).at(j)){
|
582 |
|
|
// matched.back() = true;
|
583 |
|
|
// break;
|
584 |
|
|
// }
|
585 |
|
|
// }
|
586 |
|
|
// if(!matched.at(i)) probeIndex.push_back(i);
|
587 |
|
|
// }
|
588 |
|
|
//
|
589 |
|
|
// if(probeIndex.size()>2){
|
590 |
|
|
// cout<<"WARNING: Something is awkward with the number of Probe leptons: " << probeIndex.size() << endl;
|
591 |
|
|
// cout<<"The number of probe leptons is expected to be 1 or 2, because here a T&P method is applied!" << endl;
|
592 |
|
|
// }
|
593 |
|
|
// else if(probeIndex.size()==2) return; //make only plots if at least one Tag exists in an event
|
594 |
|
|
//
|
595 |
|
|
// //Fill the Tag histograms
|
596 |
|
|
// //here, we have TWO Tag leptons -> use BOTH for the efficiency
|
597 |
|
|
// if(probeIndex.size()==0){
|
598 |
|
|
// for(Int_t i=0,N=evt.muonP4->size(); i<N; ++i){
|
599 |
|
|
// plot[filterName].addh1d("pt_tag", "pt_tag", "p_{T}(tag) [GeV/c]", "events", binPt, lowPt, upPt, evt.muonP4->at(i).Pt(), evt.Weight);
|
600 |
|
|
// plot[filterName].addh1d("eta_tag", "eta_tag", "#eta(tag)", "events", binEta, lowEta, upEta, evt.muonP4->at(i).eta(), evt.Weight);
|
601 |
|
|
// }
|
602 |
|
|
// //the factor of '2' is due to the fact, that there are two matched tag leptons
|
603 |
|
|
// plot[filterName].addh1d("PUVertices_tag", "PUVertices_tag", "number of primary vertices (tag)", "events", binPU, lowPU, upPU, evt.PUInter, 2*evt.Weight);
|
604 |
|
|
// }
|
605 |
|
|
//
|
606 |
|
|
// //Fill the Probe histograms
|
607 |
|
|
// //here, we have ONE Tag lepton -> the probe is NOT matched to the trigger filter
|
608 |
|
|
// if(probeIndex.size()==1){
|
609 |
|
|
// plot[filterName].addh1d("pt_probe", "pt_probe", "p_{T}(probe) [GeV/c]", "events", binPt, lowPt, upPt, evt.muonP4->at(probeIndex.back()).pt(), evt.Weight);
|
610 |
|
|
// plot[filterName].addh1d("eta_probe", "eta_probe", "#eta(probe)", "events", binEta, lowEta, upEta, evt.muonP4->at(probeIndex.back()).eta(), evt.Weight);
|
611 |
|
|
// plot[filterName].addh1d("PUVertices_probe", "PUVertices_probe", "number of primary vertices (probe)", "events", binPU, lowPU, upPU, evt.PUInter, evt.Weight);
|
612 |
|
|
// }
|
613 |
|
|
// }
|
614 |
|
|
//
|
615 |
|
|
//
|
616 |
|
|
// //================================================================================= makeEfficiencyPlots
|
617 |
|
|
// //eff = tag/(tag+probe)
|
618 |
|
|
// void makeEfficiencyPlots(map<TString, plotMaker> &plot){
|
619 |
|
|
// cout<<"----------> Create efficiency histograms"<<endl;
|
620 |
|
|
//
|
621 |
|
|
// vector<string> allTriggerFiltersToCheck = triggerFilterToCheckMu;
|
622 |
|
|
// for(Int_t i=0,N=triggerFilterToCheckEl.size(); i<N; ++i){
|
623 |
|
|
// allTriggerFiltersToCheck.push_back(triggerFilterToCheckEl.at(i));
|
624 |
|
|
// }
|
625 |
|
|
// vector<string> histNames;
|
626 |
|
|
// histNames.push_back("pt_tag");
|
627 |
|
|
// histNames.push_back("eta_tag");
|
628 |
|
|
// histNames.push_back("PUVertices_tag");
|
629 |
|
|
//
|
630 |
|
|
// for(Int_t i=0,N=allTriggerFiltersToCheck.size(); i<N; ++i){
|
631 |
|
|
// TString triggerFilter = allTriggerFiltersToCheck.at(i);
|
632 |
|
|
// for(Int_t j=0,M=histNames.size(); j<M; ++j){
|
633 |
|
|
// TString tagName = histNames.at(j);
|
634 |
|
|
// TString probeName = histNames.at(j);
|
635 |
|
|
// TString effName = histNames.at(j);
|
636 |
|
|
// probeName.ReplaceAll("tag", "probe");
|
637 |
|
|
// effName.ReplaceAll("tag", "eff");
|
638 |
|
|
// if(plot[triggerFilter].isNewh1d(tagName)) continue;
|
639 |
|
|
// if(plot[triggerFilter].isNewh1d(probeName)) continue;
|
640 |
|
|
//
|
641 |
|
|
// TH1D *h_tag = (TH1D*)(plot[triggerFilter].h1d[tagName])->Clone();
|
642 |
|
|
// TH1D *h_probe = (TH1D*)(plot[triggerFilter].h1d[probeName])->Clone();
|
643 |
|
|
// TH1D *den = (TH1D*)(h_tag)->Clone();
|
644 |
|
|
// den->Add((TH1D*)(h_probe)->Clone());
|
645 |
|
|
//
|
646 |
|
|
// TH1D *eff = (TH1D*)(h_tag)->Clone();
|
647 |
|
|
// eff->Divide(den);
|
648 |
|
|
// setEfficiencyErrors(eff, h_tag, h_probe);
|
649 |
|
|
//
|
650 |
|
|
// eff->SetName(effName);
|
651 |
|
|
// eff->SetTitle(effName);
|
652 |
|
|
//
|
653 |
|
|
// TString xTitle_eff = eff->GetXaxis()->GetTitle();
|
654 |
|
|
// xTitle_eff.ReplaceAll("(tag)","");
|
655 |
|
|
// eff->GetXaxis()->SetTitle(xTitle_eff);
|
656 |
|
|
// eff->GetYaxis()->SetTitle("efficiency");
|
657 |
|
|
// //eff->SetAxisRange(0.,1.,"Y");
|
658 |
|
|
// plot[triggerFilter].addh1d(eff);
|
659 |
|
|
// }
|
660 |
|
|
// }
|
661 |
|
|
// }
|
662 |
|
|
//
|
663 |
|
|
//
|
664 |
|
|
// //================================================================================= setEfficiencyErrors
|
665 |
|
|
// // f(eff) = t/(t+p)
|
666 |
|
|
// // df/dt = 1/(t+p) - t/(t+p)^2
|
667 |
|
|
// // df/dp = - t/(t+p)^2
|
668 |
|
|
// // eff_sig = sqrt(t_sig^2*(df/dt)^2 + p_sig^2*(df/dp)^2)
|
669 |
|
|
// void setEfficiencyErrors(TH1D* &eff, TH1D* &h_tag, TH1D* &h_probe){
|
670 |
|
|
// if(h_tag->GetNbinsX() != h_probe->GetNbinsX()){
|
671 |
|
|
// cout<<"WARNING: the number of bins of the tag and probe histograms differ! The efficiency calculation might be depricated!"<<endl;
|
672 |
|
|
// cout<<"Number of bins (Tag | Probe): " << h_tag->GetNbinsX() << " | " << h_probe->GetNbinsX() << endl;
|
673 |
|
|
// }
|
674 |
|
|
// if(h_tag->GetXaxis()->GetXmax() != h_probe->GetXaxis()->GetXmax()){
|
675 |
|
|
// cout<<"WARNING: the upper x-range of the tag and probe histograms differ! The efficiency calculation might be depricated!"<<endl;
|
676 |
|
|
// cout<<"Number of bins (Tag | Probe): " << h_tag->GetXaxis()->GetXmax() << " | " << h_probe->GetXaxis()->GetXmax() << endl;
|
677 |
|
|
// }
|
678 |
|
|
// if(h_tag->GetXaxis()->GetXmin() != h_probe->GetXaxis()->GetXmin()){
|
679 |
|
|
// cout<<"WARNING: the lower x-range of the tag and probe histograms differ! The efficiency calculation might be depricated!"<<endl;
|
680 |
|
|
// cout<<"Number of bins (Tag | Probe): " << h_tag->GetXaxis()->GetXmin() << " | " << h_probe->GetXaxis()->GetXmin() << endl;
|
681 |
|
|
// }
|
682 |
|
|
// //loop over single bins of histograms an set the efficiency error
|
683 |
|
|
// for(Int_t i=1,N=h_tag->GetNbinsX(); i<=N; ++i){
|
684 |
|
|
// Double_t t = h_tag ->GetBinContent(i);
|
685 |
|
|
// Double_t p = h_probe->GetBinContent(i);
|
686 |
|
|
// Double_t t_sig = h_tag ->GetBinError(i);
|
687 |
|
|
// Double_t p_sig = h_probe->GetBinError(i);
|
688 |
|
|
//
|
689 |
|
|
// if(eff->GetBinContent(i)==0.) continue;
|
690 |
|
|
//
|
691 |
|
|
// Double_t dedt = 1/(t+p)-t/((t+p)*(t+p));
|
692 |
|
|
// Double_t dedp = -t/((t+p)*(t+p));
|
693 |
|
|
//
|
694 |
|
|
// Double_t eff_sig = sqrt(t_sig*t_sig*dedt*dedt + p_sig*p_sig*dedp*dedp);
|
695 |
|
|
// eff->SetBinError(i, eff_sig);
|
696 |
|
|
// }
|
697 |
|
|
// }
|
698 |
|
|
|
699 |
|
|
|
700 |
|
|
|
701 |
|
|
|
702 |
|
|
|
703 |
|
|
|
704 |
|
|
|
705 |
|
|
|
706 |
mstein |
1.1 |
|
707 |
|
|
|
708 |
|
|
|
709 |
|
|
|
710 |
|
|
|
711 |
|
|
|
712 |
|
|
|
713 |
|
|
|
714 |
|
|
|
715 |
|
|
|
716 |
|
|
|
717 |
|
|
|
718 |
|
|
|
719 |
|
|
|
720 |
|
|
|
721 |
|
|
|
722 |
|
|
|
723 |
|
|
|