CMS 3D CMS Logo

ZCounting.cc
Go to the documentation of this file.
10 
14 
15 #include <boost/foreach.hpp>
16 #include <TLorentzVector.h>
17 
19 
20 using namespace ZCountingTrigger;
21 
22 //
23 // -------------------------------------- Constructor --------------------------------------------
24 //
26  fHLTObjTag (iConfig.getParameter<edm::InputTag>("TriggerEvent")),
27  fHLTTag (iConfig.getParameter<edm::InputTag>("TriggerResults")),
28  fPVName (iConfig.getUntrackedParameter<std::string>("edmPVName","offlinePrimaryVertices")),
29  fMuonName (iConfig.getUntrackedParameter<std::string>("edmName","muons")),
30  fTrackName (iConfig.getUntrackedParameter<std::string>("edmTrackName","generalTracks")),
31 
32  // Electron-specific Parameters
33  fElectronName( iConfig.getUntrackedParameter<std::string>("edmGsfEleName","gedGsfElectrons")),
34  fSCName( iConfig.getUntrackedParameter<std::string>("edmSCName","particleFlowEGamma")),
35 
36  // Electron-specific Tags
37  fRhoTag( iConfig.getParameter<edm::InputTag>("rhoname") ),
38  fBeamspotTag(iConfig.getParameter<edm::InputTag>("beamspotName") ),
39  fConversionTag( iConfig.getParameter<edm::InputTag>("conversionsName")),
40 
41  // Electron-specific Cuts
42  ELE_PT_CUT_TAG(iConfig.getUntrackedParameter<double>("PtCutEleTag")),
43  ELE_PT_CUT_PROBE(iConfig.getUntrackedParameter<double>("PtCutEleProbe")),
44  ELE_ETA_CUT_TAG(iConfig.getUntrackedParameter<double>("EtaCutEleTag")),
45  ELE_ETA_CUT_PROBE(iConfig.getUntrackedParameter<double>("EtaCutEleProbe")),
46 
47  ELE_MASS_CUT_LOW(iConfig.getUntrackedParameter<double>("MassCutEleLow")),
48  ELE_MASS_CUT_HIGH(iConfig.getUntrackedParameter<double>("MassCutEleHigh")),
49 
50  ELE_ID_WP( iConfig.getUntrackedParameter<std::string>("ElectronIDType","TIGHT")),
51  EleID_(ElectronIdentifier(iConfig))
52 {
53  edm::LogInfo("ZCounting") << "Constructor ZCounting::ZCounting " << std::endl;
54 
55  //Get parameters from configuration file
56  fHLTTag_token = consumes<edm::TriggerResults>(fHLTTag);
57  fHLTObjTag_token = consumes<trigger::TriggerEvent>(fHLTObjTag);
58  fPVName_token = consumes<reco::VertexCollection>(fPVName);
59  fMuonName_token = consumes<reco::MuonCollection>(fMuonName);
60  fTrackName_token = consumes<reco::TrackCollection>(fTrackName);
61 
62  // Electron-specific parameters
63  fGsfElectronName_token = consumes<edm::View<reco::GsfElectron>>(fElectronName);
64  fSCName_token = consumes<edm::View<reco::SuperCluster>>(fSCName);
65  fRhoToken = consumes<double>(fRhoTag);
66  fBeamspotToken = consumes<reco::BeamSpot>(fBeamspotTag);
67  fConversionToken = consumes<reco::ConversionCollection>(fConversionTag);
68 
69  // Muon-specific Cuts
70  IDTypestr_ = iConfig.getUntrackedParameter<std::string>("IDType");
71  IsoTypestr_ = iConfig.getUntrackedParameter<std::string>("IsoType");
72  IsoCut_ = iConfig.getUntrackedParameter<double>("IsoCut");
73 
74  if (IDTypestr_ == "Loose") IDType_ = LooseID;
75  else if(IDTypestr_ == "Medium") IDType_ = MediumID;
76  else if(IDTypestr_ == "Tight") IDType_ = TightID;
77  else IDType_ = NoneID;
78 
79  if (IsoTypestr_ == "Tracker-based") IsoType_ = TrackerIso;
80  else if(IsoTypestr_ == "PF-based") IsoType_ = PFIso;
81  else IsoType_ = NoneIso;
82 
83  PtCutL1_ = iConfig.getUntrackedParameter<double>("PtCutL1");
84  PtCutL2_ = iConfig.getUntrackedParameter<double>("PtCutL2");
85  EtaCutL1_ = iConfig.getUntrackedParameter<double>("EtaCutL1");
86  EtaCutL2_ = iConfig.getUntrackedParameter<double>("EtaCutL2");
87 
88  MassBin_ = iConfig.getUntrackedParameter<int>("MassBin");
89  MassMin_ = iConfig.getUntrackedParameter<double>("MassMin");
90  MassMax_ = iConfig.getUntrackedParameter<double>("MassMax");
91 
92  LumiBin_ = iConfig.getUntrackedParameter<int>("LumiBin");
93  LumiMin_ = iConfig.getUntrackedParameter<double>("LumiMin");
94  LumiMax_ = iConfig.getUntrackedParameter<double>("LumiMax");
95 
96  PVBin_ = iConfig.getUntrackedParameter<int>("PVBin");
97  PVMin_ = iConfig.getUntrackedParameter<double>("PVMin");
98  PVMax_ = iConfig.getUntrackedParameter<double>("PVMax");
99 
100  VtxNTracksFitCut_ = iConfig.getUntrackedParameter<double>("VtxNTracksFitMin");
101  VtxNdofCut_ = iConfig.getUntrackedParameter<double>("VtxNdofMin");
102  VtxAbsZCut_ = iConfig.getUntrackedParameter<double>("VtxAbsZMax");
103  VtxRhoCut_ = iConfig.getUntrackedParameter<double>("VtxRhoMax");
104 
106 }
107 
108 //
109 // -------------------------------------- Destructor --------------------------------------------
110 //
112 {
113  edm::LogInfo("ZCounting") << "Destructor ZCounting::~ZCounting " << std::endl;
114 }
115 
116 //
117 // -------------------------------------- beginRun --------------------------------------------
118 //
120 {
121  edm::LogInfo("ZCounting") << "ZCounting::beginRun" << std::endl;
122 
123  // Triggers
125 
126 }
127 //
128 // -------------------------------------- bookHistos --------------------------------------------
129 //
131 {
132  edm::LogInfo("ZCounting") << "ZCounting::bookHistograms" << std::endl;
133 
134  ibooker_.cd();
135  ibooker_.setCurrentFolder("ZCounting/Histograms");
136 
137 
138  // Muon histograms
139  h_mass_HLT_pass_central = ibooker_.book2D("h_mass_HLT_pass_central", "h_mass_HLT_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
140  h_mass_HLT_pass_forward = ibooker_.book2D("h_mass_HLT_pass_forward", "h_mass_HLT_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
141  h_mass_HLT_fail_central = ibooker_.book2D("h_mass_HLT_fail_central", "h_mass_HLT_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
142  h_mass_HLT_fail_forward = ibooker_.book2D("h_mass_HLT_fail_forward", "h_mass_HLT_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
143 
144  h_mass_SIT_pass_central = ibooker_.book2D("h_mass_SIT_pass_central", "h_mass_SIT_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
145  h_mass_SIT_pass_forward = ibooker_.book2D("h_mass_SIT_pass_forward", "h_mass_SIT_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
146  h_mass_SIT_fail_central = ibooker_.book2D("h_mass_SIT_fail_central", "h_mass_SIT_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
147  h_mass_SIT_fail_forward = ibooker_.book2D("h_mass_SIT_fail_forward", "h_mass_SIT_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
148 
149  h_mass_Sta_pass_central = ibooker_.book2D("h_mass_Sta_pass_central", "h_mass_Sta_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
150  h_mass_Sta_pass_forward = ibooker_.book2D("h_mass_Sta_pass_forward", "h_mass_Sta_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
151  h_mass_Sta_fail_central = ibooker_.book2D("h_mass_Sta_fail_central", "h_mass_Sta_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
152  h_mass_Sta_fail_forward = ibooker_.book2D("h_mass_Sta_fail_forward", "h_mass_Sta_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
153 
154  h_npv = ibooker_.book2D("h_npv", "h_npv", LumiBin_, LumiMin_, LumiMax_, PVBin_, PVMin_, PVMax_);
155  h_yield_Z = ibooker_.book1D("h_yield_Z", "h_yield_Z", LumiBin_, LumiMin_, LumiMax_);
156  h_yieldBB_Z = ibooker_.book1D("h_yieldBB_Z", "h_yieldBB_Z", LumiBin_, LumiMin_, LumiMax_);
157  h_yieldEE_Z = ibooker_.book1D("h_yieldEE_Z", "h_yieldEE_Z", LumiBin_, LumiMin_, LumiMax_);
158 
159 
160  // Electron histograms
161  h_ee_mass_id_pass_central = ibooker_.book2D("h_ee_mass_id_pass_central", "h_ee_mass_id_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
162  h_ee_mass_id_fail_central = ibooker_.book2D("h_ee_mass_id_fail_central", "h_ee_mass_id_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
163  h_ee_mass_id_pass_forward = ibooker_.book2D("h_ee_mass_id_pass_forward", "h_ee_mass_id_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
164  h_ee_mass_id_fail_forward = ibooker_.book2D("h_ee_mass_id_fail_forward", "h_ee_mass_id_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
165 
166  h_ee_mass_HLT_pass_central = ibooker_.book2D("h_ee_mass_HLT_pass_central", "h_ee_mass_HLT_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
167  h_ee_mass_HLT_fail_central = ibooker_.book2D("h_ee_mass_HLT_fail_central", "h_ee_mass_HLT_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
168  h_ee_mass_HLT_pass_forward = ibooker_.book2D("h_ee_mass_HLT_pass_forward", "h_ee_mass_HLT_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
169  h_ee_mass_HLT_fail_forward = ibooker_.book2D("h_ee_mass_HLT_fail_forward", "h_ee_mass_HLT_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_);
170 
171  h_ee_yield_Z_ebeb = ibooker_.book1D("h_ee_yield_Z_ebeb", "h_ee_yield_Z_ebeb", LumiBin_, LumiMin_, LumiMax_);
172  h_ee_yield_Z_ebee = ibooker_.book1D("h_ee_yield_Z_ebee", "h_ee_yield_Z_ebee", LumiBin_, LumiMin_, LumiMax_);
173  h_ee_yield_Z_eeee = ibooker_.book1D("h_ee_yield_Z_eeee", "h_ee_yield_Z_eeee", LumiBin_, LumiMin_, LumiMax_);
174 }
175 
176 //
177 // -------------------------------------- Analyze --------------------------------------------
178 //
179 //--------------------------------------------------------------------------------------------------
181 {// Fill event tree on the fly
182  edm::LogInfo("ZCounting") << "ZCounting::analyze" << std::endl;
183  analyzeMuons(iEvent, iSetup);
184  analyzeElectrons(iEvent, iSetup);
185 }
186 
188  edm::LogInfo("ZCounting") << "ZCounting::analyzeMuons" << std::endl;
189  //-------------------------------
190  //--- Vertex
191  //-------------------------------
193  iEvent.getByToken(fPVName_token,hVertexProduct);
194  if(!hVertexProduct.isValid()) return;
195 
196  const reco::VertexCollection *pvCol = hVertexProduct.product();
197  const reco::Vertex* pv = &(*pvCol->begin());
198  int nvtx = 0;
199 
200  for(auto const & itVtx : *hVertexProduct) {
201  if(itVtx.isFake()) continue;
202  if(itVtx.tracksSize() < VtxNTracksFitCut_) continue;
203  if(itVtx.ndof() < VtxNdofCut_) continue;
204  if(fabs(itVtx.z()) > VtxAbsZCut_) continue;
205  if(itVtx.position().Rho() > VtxRhoCut_) continue;
206 
207  if(nvtx==0) {
208  pv = &itVtx;
209  }
210  nvtx++;
211  }
212 
213  h_npv->Fill(iEvent.luminosityBlock(), nvtx);
214 
215  // Good vertex requirement
216  if(nvtx==0) return;
217 
218  //-------------------------------
219  //--- Trigger
220  //-------------------------------
222  iEvent.getByToken(fHLTTag_token,hTrgRes);
223  if(!hTrgRes.isValid()) return;
224 
226  iEvent.getByToken(fHLTObjTag_token,hTrgEvt);
227 
228  const edm::TriggerNames &triggerNames = iEvent.triggerNames(*hTrgRes);
229  bool config_changed = false;
230  if(fTriggerNamesID != triggerNames.parameterSetID()) {
231  fTriggerNamesID = triggerNames.parameterSetID();
232  config_changed = true;
233  }
234  if(config_changed) {
235  initHLT(*hTrgRes, triggerNames);
236  }
237 
238  TriggerBits triggerBits;
239  for(unsigned int irec=0; irec<fTrigger->fRecords.size(); irec++) {
240  if(fTrigger->fRecords[irec].hltPathIndex == (unsigned int)-1) continue;
241  if(hTrgRes->accept(fTrigger->fRecords[irec].hltPathIndex)) {
242  triggerBits [fTrigger->fRecords[irec].baconTrigBit] = true;
243  }
244  }
245  //if(fSkipOnHLTFail && triggerBits == 0) return;
246 
247  // Trigger requirement
248  if(!isMuonTrigger(*fTrigger, triggerBits)) return;
249 
250  //-------------------------------
251  //--- Muons and Tracks
252  //-------------------------------
254  iEvent.getByToken(fMuonName_token,hMuonProduct);
255  if(!hMuonProduct.isValid()) return;
256 
258  iEvent.getByToken(fTrackName_token,hTrackProduct);
259  if(!hTrackProduct.isValid()) return;
260 
261  TLorentzVector vTag(0.,0.,0.,0.);
262  TLorentzVector vProbe(0.,0.,0.,0.);
263  TLorentzVector vTrack(0.,0.,0.,0.);
264 
265  // Tag loop
266  for(auto const & itMu1 : *hMuonProduct) {
267 
268  float pt1 = itMu1.muonBestTrack()->pt();
269  float eta1 = itMu1.muonBestTrack()->eta();
270  float phi1 = itMu1.muonBestTrack()->phi();
271  float q1 = itMu1.muonBestTrack()->charge();
272 
273  // Tag selection: kinematic cuts, lepton selection and trigger matching
274  if(pt1 < PtCutL1_) continue;
275  if(fabs(eta1) > EtaCutL1_) continue;
276  if(!(passMuonID(itMu1, *pv, IDType_) && passMuonIso(itMu1, IsoType_, IsoCut_))) continue;
277  if(!isMuonTriggerObj(*fTrigger, TriggerTools::matchHLT(eta1, phi1, fTrigger->fRecords, *hTrgEvt))) continue;
278 
279  vTag.SetPtEtaPhiM(pt1, eta1, phi1, MUON_MASS);
280 
281  // Probe loop over muons
282  for(auto const & itMu2 : *hMuonProduct) {
283  if(&itMu2 == &itMu1) continue;
284 
285  float pt2 = itMu2.muonBestTrack()->pt();
286  float eta2 = itMu2.muonBestTrack()->eta();
287  float phi2 = itMu2.muonBestTrack()->phi();
288  float q2 = itMu2.muonBestTrack()->charge();
289 
290  // Probe selection: kinematic cuts and opposite charge requirement
291  if(pt2 < PtCutL2_) continue;
292  if(fabs(eta2) > EtaCutL2_) continue;
293  if(q1 == q2) continue;
294 
295  vProbe.SetPtEtaPhiM(pt2, eta2, phi2, MUON_MASS);
296 
297  // Mass window
298  TLorentzVector vDilep = vTag + vProbe;
299  float dilepMass = vDilep.M();
300  if((dilepMass < MassMin_) || (dilepMass > MassMax_)) continue;
301 
302  bool isTagCentral = false;
303  bool isProbeCentral = false;
304  if(fabs(eta1) < MUON_BOUND) isTagCentral = true;
305  if(fabs(eta2) < MUON_BOUND) isProbeCentral = true;
306 
307  // Determine event category for efficiency calculation
308  if(passMuonID(itMu2, *pv, IDType_) && passMuonIso(itMu2, IsoType_, IsoCut_)){
309  if(isMuonTriggerObj(*fTrigger, TriggerTools::matchHLT(eta2, phi2, fTrigger->fRecords, *hTrgEvt))){
310  // category 2HLT: both muons passing trigger requirements
311  if(&itMu1>&itMu2) continue; // make sure we don't double count MuMu2HLT category
312 
313  // Fill twice for each event, since both muons pass trigger
314  if(isTagCentral){
315  h_mass_HLT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass);
316  h_mass_SIT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass);
317  h_mass_Sta_pass_central->Fill(iEvent.luminosityBlock(), dilepMass);
318  }
319  else
320  {
321  h_mass_HLT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass);
322  h_mass_SIT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass);
323  h_mass_Sta_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass);
324  }
325 
326  if(isProbeCentral){
327  h_mass_HLT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass);
328  h_mass_SIT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass);
329  h_mass_Sta_pass_central->Fill(iEvent.luminosityBlock(), dilepMass);
330  }
331  else
332  {
333  h_mass_HLT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass);
334  h_mass_SIT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass);
335  h_mass_Sta_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass);
336  }
337 
338  }
339  else{
340  // category 1HLT: probe passing selection but not trigger
341  if(isProbeCentral){
342  h_mass_HLT_fail_central->Fill(iEvent.luminosityBlock(), dilepMass);
343  h_mass_SIT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass);
344  h_mass_Sta_pass_central->Fill(iEvent.luminosityBlock(), dilepMass);
345  }
346  else
347  {
348  h_mass_HLT_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass);
349  h_mass_SIT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass);
350  h_mass_Sta_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass);
351  }
352 
353  }
354  // category 2HLT + 1HLT: Fill once for Z yield
355  h_yield_Z->Fill(iEvent.luminosityBlock());
356  if(isTagCentral && isProbeCentral) h_yieldBB_Z->Fill(iEvent.luminosityBlock());
357  else if(!isTagCentral && !isProbeCentral) h_yieldEE_Z->Fill(iEvent.luminosityBlock());
358  }
359  else if(itMu2.isGlobalMuon()){
360  // category NoSel: probe is a GLB muon but failing selection
361  if(isProbeCentral){
362  h_mass_SIT_fail_central->Fill(iEvent.luminosityBlock(), dilepMass);
363  h_mass_Sta_pass_central->Fill(iEvent.luminosityBlock(), dilepMass);
364  }
365  else
366  {
367  h_mass_SIT_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass);
368  h_mass_Sta_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass);
369  }
370  }
371  else if(itMu2.isStandAloneMuon()){
372  // category STA: probe is a STA muon
373  if(isProbeCentral){
374  h_mass_Sta_fail_central->Fill(iEvent.luminosityBlock(), dilepMass);
375  }
376  else
377  {
378  h_mass_Sta_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass);
379  }
380  }
381  else if(itMu2.innerTrack()->hitPattern().trackerLayersWithMeasurement() >= 6 && itMu2.innerTrack()->hitPattern().numberOfValidPixelHits() >= 1){
382  // cateogry Trk: probe is a tracker track
383  if(isProbeCentral){
384  h_mass_Sta_fail_central->Fill(iEvent.luminosityBlock(), dilepMass);
385  }
386  else
387  {
388  h_mass_Sta_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass);
389  }
390  }
391 
392  }// End of probe loop over muons
393 
394  // Probe loop over tracks, only for standalone efficiency calculation
395  for(auto const & itTrk : *hTrackProduct) {
396 
397  // Check track is not a muon
398  bool isMuon = false;
399  for(auto const & itMu : *hMuonProduct) {
400  if(itMu.innerTrack().isNonnull() && itMu.innerTrack().get() == &itTrk) {
401  isMuon = true;
402  break;
403  }
404  }
405  if(isMuon) continue;
406 
407  float pt2 = itTrk.pt();
408  float eta2 = itTrk.eta();
409  float phi2 = itTrk.phi();
410  float q2 = itTrk.charge();
411 
412  // Probe selection: kinematic cuts and opposite charge requirement
413  if(pt2 < PtCutL2_) continue;
414  if(fabs(eta2) > EtaCutL2_) continue;
415  if(q1 == q2) continue;
416 
417  vTrack.SetPtEtaPhiM(pt2, eta2, phi2, MUON_MASS);
418 
419  TLorentzVector vDilep = vTag + vTrack;
420  float dilepMass = vDilep.M();
421  if((dilepMass < MassMin_) || (dilepMass > MassMax_)) continue;
422 
423  bool isTrackCentral = false;
424  if(fabs(eta2) > MUON_BOUND) isTrackCentral = true;
425 
426  if(itTrk.hitPattern().trackerLayersWithMeasurement() >= 6 && itTrk.hitPattern().numberOfValidPixelHits() >= 1){
427  if(isTrackCentral) h_mass_Sta_fail_central->Fill(iEvent.luminosityBlock(), dilepMass);
428  else h_mass_Sta_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass);
429  }
430 
431  }//End of probe loop over tracks
432 
433  }//End of tag loop
434 
435 }
437  edm::LogInfo("ZCounting") << "ZCounting::analyzeElectrons" << std::endl;
438 
439  //-------------------------------
440  //--- Vertex
441  //-------------------------------
443  iEvent.getByToken(fPVName_token,hVertexProduct);
444  if(!hVertexProduct.isValid()) return;
445 
446  const reco::VertexCollection *pvCol = hVertexProduct.product();
447  int nvtx = 0;
448 
449  for(auto const & vtx : *pvCol) {
450  if(vtx.isFake()) continue;
451  if(vtx.tracksSize() < VtxNTracksFitCut_) continue;
452  if(vtx.ndof() < VtxNdofCut_) continue;
453  if(fabs(vtx.z()) > VtxAbsZCut_) continue;
454  if(vtx.position().Rho() > VtxRhoCut_) continue;
455 
456  nvtx++;
457  }
458 
459  // Good vertex requirement
460  if(nvtx==0) return;
461 
462  //-------------------------------
463  //--- Trigger
464  //-------------------------------
466  iEvent.getByToken(fHLTTag_token,hTrgRes);
467  if(!hTrgRes.isValid()) return;
468 
470  iEvent.getByToken(fHLTObjTag_token,hTrgEvt);
471 
472 
473  const edm::TriggerNames &triggerNames = iEvent.triggerNames(*hTrgRes);
474  Bool_t config_changed = false;
475  if(fTriggerNamesID != triggerNames.parameterSetID()) {
476  fTriggerNamesID = triggerNames.parameterSetID();
477  config_changed = true;
478  }
479  if(config_changed) {
480  initHLT(*hTrgRes, triggerNames);
481  }
482 
483  TriggerBits triggerBits;
484  for(unsigned int irec=0; irec<fTrigger->fRecords.size(); irec++) {
485  if(fTrigger->fRecords[irec].hltPathIndex == (unsigned int)-1) continue;
486  if(hTrgRes->accept(fTrigger->fRecords[irec].hltPathIndex)) {
487  triggerBits [fTrigger->fRecords[irec].baconTrigBit] = true;
488  }
489  }
490 
491  // Trigger requirement
492  if(!isElectronTrigger(*fTrigger, triggerBits)) return;
493 
494  // Get Electrons
496  iEvent.getByToken(fGsfElectronName_token, electrons);
497 
498  // Get SuperClusters
500  iEvent.getByToken(fSCName_token, superclusters);
501 
502  // Get Rho
503  edm::Handle<double> rhoHandle;
504  iEvent.getByToken(fRhoToken, rhoHandle);
505  EleID_.setRho(*rhoHandle);
506 
507  // Get beamspot
508  edm::Handle<reco::BeamSpot> beamspotHandle;
509  iEvent.getByToken(fBeamspotToken, beamspotHandle);
510 
511  // Conversions
512  edm::Handle<reco::ConversionCollection> conversionsHandle;
513  iEvent.getByToken(fConversionToken, conversionsHandle);
514 
515 
517  enum { eEleEle2HLT=1, eEleEle1HLT1L1, eEleEle1HLT, eEleEleNoSel, eEleSC }; // event category enum
518 
519  // Loop over Tags
520  for (size_t itag = 0; itag < electrons->size(); ++itag){
521  const auto el1 = electrons->ptrAt(itag);
522  if( not EleID_.passID(el1,beamspotHandle,conversionsHandle) ) continue;
523 
524  float pt1 = el1->pt();
525  float eta1 = el1->eta();
526  float phi1 = el1->phi();
527 
528  if(!isElectronTriggerObj(*fTrigger, TriggerTools::matchHLT(eta1, phi1, fTrigger->fRecords, *hTrgEvt))) continue;
529  TLorentzVector vTag(0.,0.,0.,0.);
530  vTag.SetPtEtaPhiM(pt1, eta1, phi1, ELECTRON_MASS);
531 
532 
533  // Tag selection: kinematic cuts, lepton selection and trigger matching
534  double tag_pt = vTag.Pt();
535  double tag_abseta = fabs(vTag.Eta());
536 
537  bool tag_is_valid_tag = ele_tag_selection(tag_pt,tag_abseta);
538  bool tag_is_valid_probe = ele_probe_selection(tag_pt,tag_abseta);
539 
540  if( not (tag_is_valid_tag or tag_is_valid_probe) ) continue;
541 
542  // Loop over probes
543  for (size_t iprobe = 0; iprobe < superclusters->size(); ++iprobe){
544  // Initialize probe
545  const auto sc = superclusters->ptrAt(iprobe);
546  if(*sc == *(el1->superCluster())) {
547  continue;
548  }
549 
550  // Find matching electron
551  for (size_t iele = 0; iele < electrons->size(); ++iele){
552  if(iele == itag) continue;
553  const auto ele = electrons->ptrAt(iele);
554  if(*sc == *(ele->superCluster())) {
555  eleProbe = ele;
556  break;
557  }
558  }
559 
560  // Assign final probe 4-vector
561  TLorentzVector vProbe(0.,0.,0.,0.);
562  if(eleProbe.isNonnull()){
563  vProbe.SetPtEtaPhiM( eleProbe->pt(), eleProbe->eta(), eleProbe->phi(), ELECTRON_MASS);
564  } else {
565  double pt = sc->energy() * sqrt( 1 - pow(tanh(sc->eta()),2) );
566  vProbe.SetPtEtaPhiM( pt, sc->eta(), sc->phi(), ELECTRON_MASS);
567  }
568 
569  // Probe Selection
570  double probe_pt = vProbe.Pt();
571  double probe_abseta = fabs(sc->eta());
572  bool probe_is_valid_probe = ele_probe_selection(probe_pt, probe_abseta);
573  if( !probe_is_valid_probe ) continue;
574 
575  // Good Probe found!
576 
577  // Require good Z
578  TLorentzVector vDilep = vTag + vProbe;
579 
580  if((vDilep.M()<ELE_MASS_CUT_LOW) || (vDilep.M()>ELE_MASS_CUT_HIGH)) continue;
581  if(eleProbe.isNonnull() and (eleProbe->charge() != - el1->charge())) continue;
582 
583  // Good Z found!
584 
585  long ls = iEvent.luminosityBlock();
586  bool probe_pass_trigger = isElectronTriggerObj(*fTrigger, TriggerTools::matchHLT(vProbe.Eta(), vProbe.Phi(), fTrigger->fRecords, *hTrgEvt));
587  bool probe_pass_id = eleProbe.isNonnull() and EleID_.passID(eleProbe,beamspotHandle,conversionsHandle);
588 
590  bool probe_is_forward = probe_abseta > ELE_ETA_CRACK_LOW;
591  bool tag_is_forward = tag_abseta > ELE_ETA_CRACK_LOW;
592 
593  if(probe_pass_id) {
594  if(probe_is_forward and tag_is_forward) {
595  h_ee_yield_Z_eeee -> Fill(ls);
596  } else if(!probe_is_forward and !tag_is_forward) {
597  h_ee_yield_Z_ebeb -> Fill(ls);
598  } else {
599  h_ee_yield_Z_ebee -> Fill(ls);
600  }
601  }
602 
603  if(!tag_is_valid_tag) continue;
604 
606  if(probe_pass_id) {
607  if(probe_is_forward) {
608  h_ee_mass_id_pass_forward->Fill(ls, vDilep.M());
609  } else {
610  h_ee_mass_id_pass_central->Fill(ls, vDilep.M());
611  }
612  } else {
613  if(probe_is_forward) {
614  h_ee_mass_id_fail_forward->Fill(ls, vDilep.M());
615  } else {
616  h_ee_mass_id_fail_central->Fill(ls, vDilep.M());
617  }
618  }
619 
621  if(probe_pass_id and probe_pass_trigger) {
622  if(probe_is_forward) {
623  h_ee_mass_HLT_pass_forward->Fill(ls, vDilep.M());
624  } else {
625  h_ee_mass_HLT_pass_central->Fill(ls, vDilep.M());
626  }
627  } else if (probe_pass_id) {
628  if(probe_is_forward) {
629  h_ee_mass_HLT_fail_forward->Fill(ls, vDilep.M());
630  } else {
631  h_ee_mass_HLT_fail_central->Fill(ls, vDilep.M());
632  }
633  }
634  } // End of probe loop
635  }//End of tag loop
636 
637 }
638 
639 bool ZCounting::ele_probe_selection(double pt, double abseta){
640  if(pt < ELE_PT_CUT_PROBE) return false;
641  if(abseta > ELE_ETA_CUT_PROBE) return false;
642  if( (abseta > ELE_ETA_CRACK_LOW) and (abseta < ELE_ETA_CRACK_HIGH) ) return false;
643  return true;
644 }
645 bool ZCounting::ele_tag_selection(double pt, double abseta){
646  if(pt < ELE_PT_CUT_TAG) return false;
647  if(abseta > ELE_ETA_CUT_TAG) return false;
648  if( (abseta > ELE_ETA_CRACK_LOW) and (abseta < ELE_ETA_CRACK_HIGH) ) return false;
649  return true;
650 }
651 //
652 // -------------------------------------- functions --------------------------------------------
653 //
654 
656 {
657  for(unsigned int irec=0; irec<fTrigger->fRecords.size(); irec++) {
658  fTrigger->fRecords[irec].hltPathName = "";
659  fTrigger->fRecords[irec].hltPathIndex = (unsigned int)-1;
660  const std::string pattern = fTrigger->fRecords[irec].hltPattern;
661  if(edm::is_glob(pattern)) { // handle pattern with wildcards (*,?)
662  std::vector<std::vector<std::string>::const_iterator> matches = edm::regexMatch(triggerNames.triggerNames(), pattern);
663  if(matches.empty()) {
664  edm::LogWarning("ZCounting") << "requested pattern [" << pattern << "] does not match any HLT paths" << std::endl;
665  } else {
666  BOOST_FOREACH(std::vector<std::string>::const_iterator match, matches) {
667  fTrigger->fRecords[irec].hltPathName = *match;
668  }
669  }
670  } else { // take full HLT path name given
671  fTrigger->fRecords[irec].hltPathName = pattern;
672  }
673  // Retrieve index in trigger menu corresponding to HLT path
674  unsigned int index = triggerNames.triggerIndex(fTrigger->fRecords[irec].hltPathName);
675  if(index < result.size()) { // check for valid index
676  fTrigger->fRecords[irec].hltPathIndex = index;
677  }
678  }
679 }
680 
681 //--------------------------------------------------------------------------------------------------
682 bool ZCounting::isMuonTrigger(const ZCountingTrigger::TTrigger &triggerMenu, const TriggerBits &hltBits)
683 {
684  return triggerMenu.pass("HLT_IsoMu27_v*",hltBits);
685 }
686 
687 //--------------------------------------------------------------------------------------------------
688 bool ZCounting::isMuonTriggerObj(const ZCountingTrigger::TTrigger &triggerMenu, const TriggerObjects &hltMatchBits)
689 {
690  return triggerMenu.passObj("HLT_IsoMu27_v*","hltL3crIsoL1sMu22Or25L1f0L2f10QL3f27QL3trkIsoFiltered0p07",hltMatchBits);
691 }
692 
693 //--------------------------------------------------------------------------------------------------
695 {//Muon ID selection, using internal function "DataFormats/MuonReco/src/MuonSelectors.cc
696 
697  if (idType == LooseID && muon::isLooseMuon(muon)) return true;
698  else if(idType == MediumID && muon::isMediumMuon(muon)) return true;
699  else if(idType == TightID && muon::isTightMuon(muon, vtx)) return true;
700  else if(idType == NoneID) return true;
701  else return false;
702 }
703 //--------------------------------------------------------------------------------------------------
704 bool ZCounting::passMuonIso(const reco::Muon& muon, const MuonIsoTypes &isoType, const float isoCut)
705 {//Muon isolation selection, up-to-date with MUO POG recommendation
706 
707  if(isoType == TrackerIso && muon.isolationR03().sumPt < isoCut) return true;
708  else if(isoType == PFIso && muon.pfIsolationR04().sumChargedHadronPt + std::max(0.,muon.pfIsolationR04().sumNeutralHadronEt + muon.pfIsolationR04().sumPhotonEt - 0.5*muon.pfIsolationR04().sumPUPt) < isoCut) return true;
709  else if(isoType == NoneIso) return true;
710  else return false;
711 }
712 
713 //--------------------------------------------------------------------------------------------------
715 {
716  return triggerMenu.pass("HLT_Ele35_WPTight_Gsf_v*",hltBits);
717 }
718 //--------------------------------------------------------------------------------------------------
720 {
721  return triggerMenu.passObj("HLT_Ele35_WPTight_Gsf_v*","hltEle35noerWPTightGsfTrackIsoFilter",hltMatchBits);
722 }
MonitorElement * h_mass_Sta_fail_central
Definition: ZCounting.h:172
ZCounting(const edm::ParameterSet &ps)
Definition: ZCounting.cc:25
T getUntrackedParameter(std::string const &, T const &) const
MonitorElement * h_mass_Sta_pass_central
Definition: ZCounting.h:170
bool isElectronTrigger(ZCountingTrigger::TTrigger triggerMenu, TriggerBits hltBits)
Definition: ZCounting.cc:714
double IsoCut_
Definition: ZCounting.h:115
edm::InputTag fRhoTag
Definition: ZCounting.h:97
edm::InputTag fBeamspotTag
Definition: ZCounting.h:100
MonitorElement * h_mass_SIT_fail_central
Definition: ZCounting.h:167
double eta() const final
momentum pseudorapidity
double PtCutL1_
Definition: ZCounting.h:117
float sumPt
sum-pt of tracks
Definition: MuonIsolation.h:7
float phi() const
Momentum azimuthal angle. Note this is taken from the first SimTrack only.
Definition: SimCluster.h:161
std::string fPVName
Definition: ZCounting.h:82
bool isMuon(const Candidate &part)
Definition: pdgIdUtils.h:11
double LumiMax_
Definition: ZCounting.h:128
bool isMediumMuon(const reco::Muon &, bool run2016_hip_mitigation=false)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
std::string fSCName
Definition: ZCounting.h:92
bool passObj(const std::string &iName, const std::string &iObjName, const TriggerObjects &iTrigObj) const
Definition: TTrigger.cc:67
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::string fTrackName
Definition: ZCounting.h:86
MonitorElement * h_mass_SIT_pass_forward
Definition: ZCounting.h:166
bool accept() const
Has at least one path accepted the event?
bool is_glob(std::string const &pattern)
Definition: RegexMatch.cc:18
edm::InputTag fHLTObjTag
Definition: ZCounting.h:78
MonitorElement * h_yield_Z
Definition: ZCounting.h:176
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:63
MuonIsoTypes IsoType_
Definition: ZCounting.h:114
double pt() const final
transverse momentum
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
int charge() const final
electric charge
Definition: LeafCandidate.h:91
bool passMuonID(const reco::Muon &muon, const reco::Vertex &vtx, const MuonIDTypes &idType)
Definition: ZCounting.cc:694
edm::EDGetTokenT< edm::View< reco::GsfElectron > > fGsfElectronName_token
Definition: ZCounting.h:91
bool isElectronTriggerObj(ZCountingTrigger::TTrigger triggerMenu, TriggerObjects hltMatchBits)
Definition: ZCounting.cc:719
std::string fMuonName
Definition: ZCounting.h:84
edm::InputTag fConversionTag
Definition: ZCounting.h:103
MonitorElement * h_mass_HLT_pass_forward
Definition: ZCounting.h:161
float sumPhotonEt
sum pt of PF photons
ElectronIdentifier EleID_
Definition: ZCounting.h:156
const float ELE_ETA_CRACK_HIGH
Definition: ZCounting.h:154
const float ELE_ETA_CUT_TAG
Definition: ZCounting.h:147
MonitorElement * h_ee_mass_HLT_fail_central
Definition: ZCounting.h:187
Strings const & triggerNames() const
Definition: TriggerNames.cc:24
double LumiMin_
Definition: ZCounting.h:127
double q2[4]
Definition: TauolaWrapper.h:88
std::bitset< kNTrigObjectBit > TriggerObjects
Definition: TriggerDefs.h:9
edm::InputTag fHLTTag
Definition: ZCounting.h:79
MonitorElement * h_ee_mass_HLT_pass_forward
Definition: ZCounting.h:188
bool isLooseMuon(const reco::Muon &)
float sumNeutralHadronEt
sum pt of neutral hadrons
void Fill(long long x)
ParameterSetID const & parameterSetID() const
Definition: TriggerNames.cc:42
edm::EDGetTokenT< reco::TrackCollection > fTrackName_token
Definition: ZCounting.h:87
std::string IDTypestr_
Definition: ZCounting.h:111
const double MUON_MASS
Definition: ZCounting.h:139
edm::EDGetTokenT< reco::MuonCollection > fMuonName_token
Definition: ZCounting.h:85
void analyzeMuons(edm::Event const &e, edm::EventSetup const &eSetup)
Definition: ZCounting.cc:187
double VtxRhoCut_
Definition: ZCounting.h:137
float sumPUPt
sum pt of charged Particles not from PV (for Pu corrections)
int iEvent
Definition: GenABIO.cc:230
MonitorElement * h_mass_Sta_pass_forward
Definition: ZCounting.h:171
edm::ParameterSetID fTriggerNamesID
Definition: ZCounting.h:77
const float ELE_MASS_CUT_HIGH
Definition: ZCounting.h:150
const std::string ELE_ID_WP
Definition: ZCounting.h:152
unsigned int triggerIndex(std::string const &name) const
Definition: TriggerNames.cc:32
edm::EDGetTokenT< reco::VertexCollection > fPVName_token
Definition: ZCounting.h:83
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
T sqrt(T t)
Definition: SSEVec.h:18
unsigned int size() const
Get number of paths stored.
MonitorElement * h_yieldEE_Z
Definition: ZCounting.h:178
int PVBin_
Definition: ZCounting.h:130
std::bitset< kNTrigBit > TriggerBits
Definition: TriggerDefs.h:7
const float ELE_PT_CUT_PROBE
Definition: ZCounting.h:146
double VtxNTracksFitCut_
Definition: ZCounting.h:134
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
bool passID(const reco::GsfElectronPtr &ele, edm::Handle< reco::BeamSpot > beamspot, edm::Handle< reco::ConversionCollection > conversions)
bool isMuonTrigger(const ZCountingTrigger::TTrigger &triggerMenu, const TriggerBits &hltBits)
Definition: ZCounting.cc:682
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:118
void initHLT(const edm::TriggerResults &, const edm::TriggerNames &)
Definition: ZCounting.cc:655
def pv(vc)
Definition: MetAnalyzer.py:6
float energy() const
Energy. Note this is taken from the first SimTrack only.
Definition: SimCluster.h:111
MonitorElement * h_ee_yield_Z_eeee
Definition: ZCounting.h:194
MonitorElement * h_ee_yield_Z_ebee
Definition: ZCounting.h:193
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
Definition: ZCounting.cc:130
double VtxNdofCut_
Definition: ZCounting.h:135
MonitorElement * h_ee_mass_HLT_fail_forward
Definition: ZCounting.h:189
bool isValid() const
Definition: HandleBase.h:74
MuonIDTypes IDType_
Definition: ZCounting.h:113
bool ele_tag_selection(double pt, double abseta)
Definition: ZCounting.cc:645
MonitorElement * h_npv
Definition: ZCounting.h:175
double PtCutL2_
Definition: ZCounting.h:118
MonitorElement * h_mass_Sta_fail_forward
Definition: ZCounting.h:173
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
Definition: ZCounting.cc:180
bool isNonnull() const
Checks for non-null.
Definition: Ptr.h:168
const float ELE_MASS_CUT_LOW
Definition: ZCounting.h:149
const double MUON_BOUND
Definition: ZCounting.h:140
const float ELE_ETA_CRACK_LOW
Definition: ZCounting.h:153
edm::EDGetTokenT< trigger::TriggerEvent > fHLTObjTag_token
Definition: ZCounting.h:80
MonitorElement * h_ee_mass_id_pass_forward
Definition: ZCounting.h:183
MonitorElement * h_ee_mass_HLT_pass_central
Definition: ZCounting.h:186
def ls(path, rec=False)
Definition: eostools.py:348
MonitorElement * h_mass_SIT_fail_forward
Definition: ZCounting.h:168
void setRho(double rho)
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:274
T const * product() const
Definition: Handle.h:81
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:136
MonitorElement * h_ee_yield_Z_ebeb
Definition: ZCounting.h:192
double q1[4]
Definition: TauolaWrapper.h:87
bool pass(const std::string &iName, const TriggerBits &iTrig) const
Definition: TTrigger.cc:59
const MuonPFIsolation & pfIsolationR04() const
Definition: Muon.h:168
MonitorElement * h_mass_HLT_pass_central
Definition: ZCounting.h:160
const float ELE_ETA_CUT_PROBE
Definition: ZCounting.h:148
int MassBin_
Definition: ZCounting.h:122
edm::EDGetTokenT< reco::ConversionCollection > fConversionToken
Definition: ZCounting.h:104
int LumiBin_
Definition: ZCounting.h:126
edm::EDGetTokenT< edm::TriggerResults > fHLTTag_token
Definition: ZCounting.h:81
~ZCounting() override
Definition: ZCounting.cc:111
bool ele_probe_selection(double pt, double abseta)
Definition: ZCounting.cc:639
MonitorElement * h_ee_mass_id_pass_central
Definition: ZCounting.h:181
std::string fElectronName
Definition: ZCounting.h:90
MonitorElement * h_mass_HLT_fail_forward
Definition: ZCounting.h:163
std::vector< std::vector< std::string >::const_iterator > regexMatch(std::vector< std::string > const &strings, std::regex const &regexp)
Definition: RegexMatch.cc:30
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
Definition: ZCounting.cc:119
HLT enums.
double EtaCutL1_
Definition: ZCounting.h:119
bool passMuonIso(const reco::Muon &muon, const MuonIsoTypes &isoType, const float isoCut)
Definition: ZCounting.cc:704
void setID(std::string ID)
MonitorElement * h_ee_mass_id_fail_forward
Definition: ZCounting.h:184
edm::EDGetTokenT< double > fRhoToken
Definition: ZCounting.h:98
MonitorElement * h_yieldBB_Z
Definition: ZCounting.h:177
MonitorElement * h_ee_mass_id_fail_central
Definition: ZCounting.h:182
double MassMax_
Definition: ZCounting.h:124
void analyzeElectrons(edm::Event const &e, edm::EventSetup const &eSetup)
Definition: ZCounting.cc:436
const float ELECTRON_MASS
Definition: ZCounting.h:143
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
double PVMax_
Definition: ZCounting.h:132
bool isTightMuon(const reco::Muon &, const reco::Vertex &)
double MassMin_
Definition: ZCounting.h:123
edm::EDGetTokenT< reco::BeamSpot > fBeamspotToken
Definition: ZCounting.h:101
MonitorElement * h_mass_SIT_pass_central
Definition: ZCounting.h:165
const float ELE_PT_CUT_TAG
Definition: ZCounting.h:145
std::unique_ptr< ZCountingTrigger::TTrigger > fTrigger
Definition: ZCounting.h:109
double phi() const final
momentum azimuthal angle
std::string IsoTypestr_
Definition: ZCounting.h:112
edm::EDGetTokenT< edm::View< reco::SuperCluster > > fSCName_token
Definition: ZCounting.h:93
double EtaCutL2_
Definition: ZCounting.h:120
double PVMin_
Definition: ZCounting.h:131
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:301
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
MonitorElement * h_mass_HLT_fail_central
Definition: ZCounting.h:162
bool isMuonTriggerObj(const ZCountingTrigger::TTrigger &triggerMenu, const TriggerObjects &hltMatchBits)
Definition: ZCounting.cc:688
const MuonIsolation & isolationR03() const
Definition: Muon.h:162
Definition: Run.h:44
double VtxAbsZCut_
Definition: ZCounting.h:136
float eta() const
Momentum pseudorapidity. Note this is taken from the simtrack before the calorimeter.
Definition: SimCluster.h:171
float sumChargedHadronPt
sum-pt of charged Hadron