ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/mstein/triggerStudy/triggerStudy.C
Revision: 1.6
Committed: Mon Dec 17 10:44:45 2012 UTC (12 years, 4 months ago) by mstein
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.5: +61 -29 lines
Log Message:
updated paths

File Contents

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