CMS 3D CMS Logo

EfficiencyAnalyzer.cc
Go to the documentation of this file.
1 /* This Class Header */
3 
4 /* Collaborating Class Header */
15 
16 #include "TLorentzVector.h"
17 #include "TFile.h"
18 #include <vector>
19 #include <cmath>
20 #include <algorithm>
21 
22 /* C++ Headers */
23 #include <iostream>
24 #include <fstream>
25 #include <cmath>
26 using namespace std;
27 using namespace edm;
28 
30  parameters = pSet;
31 
32  // DATA
33  theMuonCollectionLabel_ = consumes<edm::View<reco::Muon> >(parameters.getParameter<edm::InputTag>("MuonCollection"));
34  theTrackCollectionLabel_ = consumes<reco::TrackCollection>(parameters.getParameter<edm::InputTag>("TrackCollection"));
35  theVertexLabel_ = consumes<reco::VertexCollection>(parameters.getParameter<edm::InputTag>("VertexLabel"));
36  theBeamSpotLabel_ = mayConsume<reco::BeamSpot>(parameters.getParameter<edm::InputTag>("BeamSpotLabel"));
37 
38  //Vertex requirements
39  doPVCheck_ = parameters.getParameter<bool>("doPrimaryVertexCheck");
40 
41  ptBin_ = parameters.getParameter<int>("ptBin");
42  ptMin_ = parameters.getParameter<double>("ptMin");
43  ptMax_ = parameters.getParameter<double>("ptMax");
44 
45  etaBin_ = parameters.getParameter<int>("etaBin");
46  etaMin_ = parameters.getParameter<double>("etaMin");
47  etaMax_ = parameters.getParameter<double>("etaMax");
48 
49  phiBin_ = parameters.getParameter<int>("phiBin");
50  phiMin_ = parameters.getParameter<double>("phiMin");
51  phiMax_ = parameters.getParameter<double>("phiMax");
52 
53  vtxBin_ = parameters.getParameter<int>("vtxBin");
54  vtxMin_ = parameters.getParameter<double>("vtxMin");
55  vtxMax_ = parameters.getParameter<double>("vtxMax");
56 
57  ID_ = parameters.getParameter<string>("ID");
58  theFolder = parameters.getParameter<string>("folder");
59 }
60 
62 
64  edm::Run const& /*iRun*/,
65  edm::EventSetup const& /* iSetup */) {
66  ibooker.cd();
67  ibooker.setCurrentFolder(theFolder + ID_);
68 
69  h_allProbes_pt = ibooker.book1D("allProbes_pt", "All Probes Pt", ptBin_, ptMin_, ptMax_);
70  h_allProbes_inner_pt = ibooker.book1D("allProbes_inner_pt", "All Probes inner Pt", ptBin_, ptMin_, ptMax_);
71  h_allProbes_inner_eta = ibooker.book1D("allProbes_inner_eta", "All Probes inner eta", etaBin_, etaMin_, etaMax_);
72  h_allProbes_inner_phi = ibooker.book1D("allProbes_inner_phi", "All Probes inner phi", phiBin_, phiMin_, phiMax_);
73  h_allProbes_EB_pt = ibooker.book1D("allProbes_EB_pt", "Barrel: all Probes Pt", ptBin_, ptMin_, ptMax_);
74  h_allProbes_EE_pt = ibooker.book1D("allProbes_EE_pt", "Endcap: all Probes Pt", ptBin_, ptMin_, ptMax_);
75  h_allProbes_eta = ibooker.book1D("allProbes_eta", "All Probes Eta", etaBin_, etaMin_, etaMax_);
76  h_allProbes_hp_eta = ibooker.book1D("allProbes_hp_eta", "High Pt all Probes Eta", etaBin_, etaMin_, etaMax_);
77  h_allProbes_phi = ibooker.book1D("allProbes_phi", "All Probes Phi", phiBin_, phiMin_, phiMax_);
78 
79  h_allProbes_ID_pt = ibooker.book1D("allProbes_ID_pt", "All ID Probes Pt", ptBin_, ptMin_, ptMax_);
80  h_allProbes_EB_ID_pt = ibooker.book1D("allProbes_EB_ID_pt", "Barrel: all ID Probes Pt", ptBin_, ptMin_, ptMax_);
81  h_allProbes_EE_ID_pt = ibooker.book1D("allProbes_EE_ID_pt", "Endcap: all ID Probes Pt", ptBin_, ptMin_, ptMax_);
82  h_allProbes_ID_nVtx = ibooker.book1D("allProbes_ID_nVtx", "All Probes (ID) nVtx", vtxBin_, vtxMin_, vtxMax_);
83  h_allProbes_EB_ID_nVtx =
84  ibooker.book1D("allProbes_EB_ID_nVtx", "Barrel: All Probes (ID) nVtx", vtxBin_, vtxMin_, vtxMax_);
85  h_allProbes_EE_ID_nVtx =
86  ibooker.book1D("allProbes_EE_ID_nVtx", "Endcap: All Probes (ID) nVtx", vtxBin_, vtxMin_, vtxMax_);
87 
88  h_passProbes_ID_pt = ibooker.book1D("passProbes_ID_pt", "ID Passing Probes Pt", ptBin_, ptMin_, ptMax_);
89  h_passProbes_ID_inner_pt =
90  ibooker.book1D("passProbes_ID_inner_pt", "ID Passing Probes inner Pt", ptBin_, ptMin_, ptMax_);
91  h_passProbes_ID_inner_eta =
92  ibooker.book1D("passProbes_ID_inner_eta", "ID Passing Probes inner eta", etaBin_, etaMin_, etaMax_);
93  h_passProbes_ID_inner_phi =
94  ibooker.book1D("passProbes_ID_inner_phi", "ID Passing Probes inner phi", phiBin_, phiMin_, phiMax_);
95  h_passProbes_ID_EB_pt = ibooker.book1D("passProbes_ID_EB_pt", "Barrel: ID Passing Probes Pt", ptBin_, ptMin_, ptMax_);
96  h_passProbes_ID_EE_pt = ibooker.book1D("passProbes_ID_EE_pt", "Endcap: ID Passing Probes Pt", ptBin_, ptMin_, ptMax_);
97  h_passProbes_ID_eta = ibooker.book1D("passProbes_ID_eta", "ID Passing Probes #eta", etaBin_, etaMin_, etaMax_);
98  h_passProbes_ID_hp_eta =
99  ibooker.book1D("passProbes_ID_hp_eta", "High Pt ID Passing Probes #eta", etaBin_, etaMin_, etaMax_);
100  h_passProbes_ID_phi = ibooker.book1D("passProbes_ID_phi", "ID Passing Probes #phi", phiBin_, phiMin_, phiMax_);
101 
102  h_passProbes_detIsoID_pt =
103  ibooker.book1D("passProbes_detIsoID_pt", "detIsoID Passing Probes Pt", ptBin_, ptMin_, ptMax_);
104  h_passProbes_EB_detIsoID_pt =
105  ibooker.book1D("passProbes_EB_detIsoID_pt", "Barrel: detIsoID Passing Probes Pt", ptBin_, ptMin_, ptMax_);
106  h_passProbes_EE_detIsoID_pt =
107  ibooker.book1D("passProbes_EE_detIsoID_pt", "Endcap: detIsoID Passing Probes Pt", ptBin_, ptMin_, ptMax_);
108 
109  h_passProbes_pfIsoID_pt =
110  ibooker.book1D("passProbes_pfIsoID_pt", "pfIsoID Passing Probes Pt", ptBin_, ptMin_, ptMax_);
111  h_passProbes_EB_pfIsoID_pt =
112  ibooker.book1D("passProbes_EB_pfIsoID_pt", "Barrel: pfIsoID Passing Probes Pt", ptBin_, ptMin_, ptMax_);
113  h_passProbes_EE_pfIsoID_pt =
114  ibooker.book1D("passProbes_EE_pfIsoID_pt", "Endcap: pfIsoID Passing Probes Pt", ptBin_, ptMin_, ptMax_);
115 
116  h_passProbes_detIsoID_nVtx =
117  ibooker.book1D("passProbes_detIsoID_nVtx", "detIsoID Passing Probes nVtx (R03)", vtxBin_, vtxMin_, vtxMax_);
118  h_passProbes_pfIsoID_nVtx =
119  ibooker.book1D("passProbes_pfIsoID_nVtx", "pfIsoID Passing Probes nVtx (R04)", vtxBin_, vtxMin_, vtxMax_);
120  h_passProbes_EB_detIsoID_nVtx = ibooker.book1D(
121  "passProbes_EB_detIsoID_nVtx", "Barrel: detIsoID Passing Probes nVtx (R03)", vtxBin_, vtxMin_, vtxMax_);
122  h_passProbes_EE_detIsoID_nVtx = ibooker.book1D(
123  "passProbes_EE_detIsoID_nVtx", "Endcap: detIsoID Passing Probes nVtx (R03)", vtxBin_, vtxMin_, vtxMax_);
124  h_passProbes_EB_pfIsoID_nVtx = ibooker.book1D(
125  "passProbes_EB_pfIsoID_nVtx", "Barrel: pfIsoID Passing Probes nVtx (R04)", vtxBin_, vtxMin_, vtxMax_);
126  h_passProbes_EE_pfIsoID_nVtx = ibooker.book1D(
127  "passProbes_EE_pfIsoID_nVtx", "Endcap: pfIsoID Passing Probes nVtx (R04)", vtxBin_, vtxMin_, vtxMax_);
128 
129  // Apply deltaBeta PU corrections to the PF isolation eficiencies.
130 
131  h_passProbes_pfIsodBID_pt = ibooker.book1D(
132  "passProbes_pfIsodBID_pt", "pfIsoID Passing Probes Pt (deltaB PU correction)", ptBin_, ptMin_, ptMax_);
133  h_passProbes_EB_pfIsodBID_pt = ibooker.book1D(
134  "passProbes_EB_pfIsodBID_pt", "Barrel: pfIsoID Passing Probes Pt (deltaB PU correction)", ptBin_, ptMin_, ptMax_);
135  h_passProbes_EE_pfIsodBID_pt = ibooker.book1D(
136  "passProbes_EE_pfIsodBID_pt", "Endcap: pfIsoID Passing Probes Pt (deltaB PU correction)", ptBin_, ptMin_, ptMax_);
137  h_passProbes_pfIsodBID_nVtx = ibooker.book1D("passProbes_pfIsodBID_nVtx",
138  "pfIsoID Passing Probes nVtx (R04) (deltaB PU correction)",
139  vtxBin_,
140  vtxMin_,
141  vtxMax_);
142  h_passProbes_EB_pfIsodBID_nVtx = ibooker.book1D("passProbes_EB_pfIsodBID_nVtx",
143  "Barrel: pfIsoID Passing Probes nVtx (R04) (deltaB PU correction)",
144  vtxBin_,
145  vtxMin_,
146  vtxMax_);
147  h_passProbes_EE_pfIsodBID_nVtx = ibooker.book1D("passProbes_EE_pfIsodBID_nVtx",
148  "Endcap: pfIsoID Passing Probes nVtx (R04) (deltaB PU correction)",
149  vtxBin_,
150  vtxMin_,
151  vtxMax_);
152 
153 #ifdef DEBUG
154  cout << "[EfficiencyAnalyzer] Parameters initialization DONE" << endl;
155 #endif
156 }
157 
159  LogTrace(metname) << "[EfficiencyAnalyzer] Analyze the mu in different eta regions";
160  // ==========================================================
161  // BEGIN READ DATA:
162  // Muon information
164  iEvent.getByToken(theMuonCollectionLabel_, muons);
165 
166  // Tracks information
168  iEvent.getByToken(theTrackCollectionLabel_, tracks);
169 
170  //Vertex information
172  iEvent.getByToken(theVertexLabel_, vertex);
173  // END READ DATA
174  // ==========================================================
175 
176  _numPV = 0;
177  bool bPrimaryVertex = true;
178  if (doPVCheck_) {
179  bPrimaryVertex = false;
180 
181  if (!vertex.isValid()) {
182  LogTrace(metname) << "[EfficiencyAnalyzer] Could not find vertex collection" << std::endl;
183  bPrimaryVertex = false;
184  }
185 
186  if (vertex.isValid()) {
187  const reco::VertexCollection& vertexCollection = *(vertex.product());
188  int vertex_number = vertexCollection.size();
189 
190  reco::VertexCollection::const_iterator v = vertexCollection.begin();
191  for (; v != vertexCollection.end(); ++v) {
192  double vertex_chi2 = v->normalizedChi2();
193  double vertex_ndof = v->ndof();
194  bool fakeVtx = v->isFake();
195  double vertex_Z = v->z();
196 
197  if (!fakeVtx && vertex_number >= 1 && vertex_ndof > 4 && vertex_chi2 < 999 && fabs(vertex_Z) < 24.) {
198  bPrimaryVertex = true;
199  ++_numPV;
200  }
201  }
202  }
203  }
204 
205  // =================================================================================
206  // Look for the Primary Vertex (and use the BeamSpot instead, if you can't find it):
207  reco::Vertex::Point posVtx;
208  reco::Vertex::Error errVtx;
209  unsigned int theIndexOfThePrimaryVertex = 999.;
210  if (vertex.isValid()) {
211  for (unsigned int ind = 0; ind < vertex->size(); ++ind) {
212  if ((*vertex)[ind].isValid() && !((*vertex)[ind].isFake())) {
213  theIndexOfThePrimaryVertex = ind;
214  break;
215  }
216  }
217  }
218 
219  if (theIndexOfThePrimaryVertex < 100) {
220  posVtx = ((*vertex)[theIndexOfThePrimaryVertex]).position();
221  errVtx = ((*vertex)[theIndexOfThePrimaryVertex]).error();
222  } else {
223  LogInfo("RecoMuonValidator") << "reco::PrimaryVertex not found, use BeamSpot position instead\n";
224 
225  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
226  iEvent.getByToken(theBeamSpotLabel_, recoBeamSpotHandle);
227  reco::BeamSpot bs = *recoBeamSpotHandle;
228 
229  posVtx = bs.position();
230  errVtx(0, 0) = bs.BeamWidthX();
231  errVtx(1, 1) = bs.BeamWidthY();
232  errVtx(2, 2) = bs.sigmaZ();
233  }
234 
235  const reco::Vertex thePrimaryVertex(posVtx, errVtx);
236  // ==========================================================
237 
238  if (!muons.isValid())
239  return;
240 
241  // Loop on muon collection
242  TLorentzVector Mu1, Mu2;
243 
244  bool isMB = false;
245  bool isME = false;
246 
247  for (edm::View<reco::Muon>::const_iterator muon1 = muons->begin(); muon1 != muons->end(); ++muon1) {
248  LogTrace(metname) << "[EfficiencyAnalyzer] loop over first muons" << endl;
249 
250  //--- Define combined isolation
251  reco::MuonIsolation Iso_muon = muon1->isolationR03();
252  float combIso = (Iso_muon.emEt + Iso_muon.hadEt + Iso_muon.sumPt);
253 
254  //--- Is Global Muon
255  if (!muon1->isGlobalMuon())
256  continue;
257 
258  // get the track combinig the information from both the Tracker and the Spectrometer
259  reco::TrackRef recoCombinedGlbTrack1 = muon1->combinedMuon();
260  float muPt1 = recoCombinedGlbTrack1->pt();
261  Mu1.SetPxPyPzE(recoCombinedGlbTrack1->px(),
262  recoCombinedGlbTrack1->py(),
263  recoCombinedGlbTrack1->pz(),
264  recoCombinedGlbTrack1->p());
265 
266  //--- Define if it is a tight muon
267  // Change the Tight muon definition by using the implemented method in: MuonSelectors.cc
268  if (ID_ == "Loose" && !muon::isLooseMuon(*muon1))
269  continue;
270  if (ID_ == "Medium" && !muon::isMediumMuon(*muon1))
271  continue;
272  if (ID_ == "Tight" && !muon::isTightMuon(*muon1, thePrimaryVertex))
273  continue;
274 
275  //-- is isolated muon
276  if (muPt1 <= 15)
277  continue;
278  if (combIso / muPt1 > 0.1)
279  continue;
280 
281  for (edm::View<reco::Muon>::const_iterator muon2 = muons->begin(); muon2 != muons->end(); ++muon2) {
282  LogTrace(metname) << "[EfficiencyAnalyzer] loop over second muon" << endl;
283  if (muon2 == muon1)
284  continue;
285 
286  if (muon2->eta() < 1.479)
287  isMB = true;
288  if (muon2->eta() >= 1.479)
289  isME = true;
290 
291  //--> should we apply track quality cuts???
292  Mu2.SetPxPyPzE(muon2->px(), muon2->py(), muon2->pz(), muon2->p());
293 
294  float Minv = (Mu1 + Mu2).M();
295  if (!muon2->isTrackerMuon())
296  continue;
297  if (muon2->pt() < 5)
298  continue;
299  if ((muon1->charge()) * (muon2->charge()) > 0)
300  continue;
301  if (Minv < 70 || Minv > 110)
302  continue;
303 
304  h_allProbes_pt->Fill(muon2->pt());
305  h_allProbes_eta->Fill(muon2->eta());
306  h_allProbes_phi->Fill(muon2->phi());
307  if (muon2->innerTrack()->extra().isAvailable()) {
308  h_allProbes_inner_pt->Fill(muon2->innerTrack()->innerMomentum().Rho());
309  h_allProbes_inner_eta->Fill(muon2->innerTrack()->innerPosition().Eta());
310  h_allProbes_inner_phi->Fill(muon2->innerTrack()->innerPosition().Phi());
311  }
312  if (isMB)
313  h_allProbes_EB_pt->Fill(muon2->pt());
314  if (isME)
315  h_allProbes_EE_pt->Fill(muon2->pt());
316  if (muon2->pt() > 20)
317  h_allProbes_hp_eta->Fill(muon2->eta());
318 
319  // Probes passing the tight muon criteria
320  if (ID_ == "Loose" && !muon::isLooseMuon(*muon2))
321  continue;
322  if (ID_ == "Medium" && !muon::isMediumMuon(*muon2))
323  continue;
324  if (ID_ == "Tight" && !muon::isTightMuon(*muon2, thePrimaryVertex))
325  continue;
326 
327  h_passProbes_ID_pt->Fill(muon2->pt());
328  h_passProbes_ID_eta->Fill(muon2->eta());
329  h_passProbes_ID_phi->Fill(muon2->phi());
330  if (muon2->innerTrack()->extra().isAvailable()) {
331  h_passProbes_ID_inner_pt->Fill(muon2->innerTrack()->innerMomentum().Rho());
332  h_passProbes_ID_inner_eta->Fill(muon2->innerTrack()->innerPosition().Eta());
333  h_passProbes_ID_inner_phi->Fill(muon2->innerTrack()->innerPosition().Phi());
334  }
335 
336  if (isMB)
337  h_passProbes_ID_EB_pt->Fill(muon2->pt());
338  if (isME)
339  h_passProbes_ID_EE_pt->Fill(muon2->pt());
340  if (muon2->pt() > 20)
341  h_passProbes_ID_hp_eta->Fill(muon2->eta());
342 
343  h_allProbes_ID_pt->Fill(muon2->pt());
344  if (isMB)
345  h_allProbes_EB_ID_pt->Fill(muon2->pt());
346  if (isME)
347  h_allProbes_EE_ID_pt->Fill(muon2->pt());
348 
349  //------- For PU monitoring -------//
350  if (bPrimaryVertex)
351  h_allProbes_ID_nVtx->Fill(_numPV);
352  if (bPrimaryVertex && isMB)
353  h_allProbes_EB_ID_nVtx->Fill(_numPV);
354  if (bPrimaryVertex && isME)
355  h_allProbes_EE_ID_nVtx->Fill(_numPV);
356 
357  //-- Define det relative isolation
358  float tkIso = muon2->isolationR03().sumPt;
359  float emIso = muon2->isolationR03().emEt;
360  float hadIso = muon2->isolationR03().hadEt + muon2->isolationR03().hoEt;
361  float relDetIso = (tkIso + emIso + hadIso) / (muon2->pt());
362 
363  if (relDetIso < 0.05) {
364  h_passProbes_detIsoID_pt->Fill(muon2->pt());
365  if (isMB)
366  h_passProbes_EB_detIsoID_pt->Fill(muon2->pt());
367  if (isME)
368  h_passProbes_EE_detIsoID_pt->Fill(muon2->pt());
369 
370  if (bPrimaryVertex)
371  h_passProbes_detIsoID_nVtx->Fill(_numPV);
372  if (bPrimaryVertex && isMB)
373  h_passProbes_EB_detIsoID_nVtx->Fill(_numPV);
374  if (bPrimaryVertex && isME)
375  h_passProbes_EE_detIsoID_nVtx->Fill(_numPV);
376  }
377 
378  //-- Define PF relative isolation
379  float chargedIso = muon2->pfIsolationR04().sumChargedHadronPt;
380  float neutralIso = muon2->pfIsolationR04().sumNeutralHadronEt;
381  float photonIso = muon2->pfIsolationR04().sumPhotonEt;
382  float relPFIso = (chargedIso + neutralIso + photonIso) / (muon2->pt());
383 
384  float pu = muon2->pfIsolationR04().sumPUPt;
385  float neutralphotonPUCorrected = std::max(0.0, (neutralIso + photonIso - 0.5 * pu));
386  float relPFIsoPUCorrected = (chargedIso + neutralphotonPUCorrected) / (muon2->pt());
387 
388  if (relPFIso < 0.12) {
389  h_passProbes_pfIsoID_pt->Fill(muon2->pt());
390  if (isMB)
391  h_passProbes_EB_pfIsoID_pt->Fill(muon2->pt());
392  if (isME)
393  h_passProbes_EE_pfIsoID_pt->Fill(muon2->pt());
394 
395  if (bPrimaryVertex)
396  h_passProbes_pfIsoID_nVtx->Fill(_numPV);
397  if (bPrimaryVertex && isMB)
398  h_passProbes_EB_pfIsoID_nVtx->Fill(_numPV);
399  if (bPrimaryVertex && isME)
400  h_passProbes_EE_pfIsoID_nVtx->Fill(_numPV);
401  }
402 
403  // Apply deltaBeta PU corrections to the PF isolation eficiencies.
404  if (relPFIsoPUCorrected < 0.12) {
405  h_passProbes_pfIsodBID_pt->Fill(muon2->pt());
406  if (isMB)
407  h_passProbes_EB_pfIsodBID_pt->Fill(muon2->pt());
408  if (isME)
409  h_passProbes_EE_pfIsodBID_pt->Fill(muon2->pt());
410 
411  if (bPrimaryVertex)
412  h_passProbes_pfIsodBID_nVtx->Fill(_numPV);
413  if (bPrimaryVertex && isMB)
414  h_passProbes_EB_pfIsodBID_nVtx->Fill(_numPV);
415  if (bPrimaryVertex && isME)
416  h_passProbes_EE_pfIsodBID_nVtx->Fill(_numPV);
417  }
418  }
419  }
420 }
float hadEt
hcal sum-Et
Definition: MuonIsolation.h:8
float sumPt
sum-pt of tracks
Definition: MuonIsolation.h:6
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
bool isMediumMuon(const reco::Muon &, bool run2016_hip_mitigation=false)
const std::string metname
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:44
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
#define LogTrace(id)
bool isLooseMuon(const reco::Muon &)
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
int iEvent
Definition: GenABIO.cc:224
float emEt
ecal sum-Et
Definition: MuonIsolation.h:7
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
~EfficiencyAnalyzer() override
Log< level::Info, false > LogInfo
auto const & tracks
cannot be loose
HLT enums.
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
static int position[264][3]
Definition: ReadPGInfo.cc:289
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
EfficiencyAnalyzer(const edm::ParameterSet &pset)
Definition: Run.h:45
void analyze(const edm::Event &event, const edm::EventSetup &eventSetup) override