ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/mstein/triggerStudy/triggerStudy.C
Revision: 1.5
Committed: Thu Dec 6 12:27:27 2012 UTC (12 years, 5 months ago) by mstein
Content type: text/plain
Branch: MAIN
Changes since 1.4: +269 -110 lines
Log Message:
simple trigger efficiency estimation

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.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