CMS 3D CMS Logo

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