CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
StudyCaloResponse.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: IsolatedParticles
4 // Class: StudyCaloResponse
5 //
13 //
14 // Original Author: Sunanda Banerjee
15 // Created: Thu Mar 4 18:52:02 CST 2011
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 #include <string>
22 
23 // Root objects
24 #include "TH1.h"
25 #include "TH2.h"
26 #include "TTree.h"
27 
28 // user include files
35 
38 
60 
69 
77 
84 
85 class StudyCaloResponse : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::SharedResources> {
86 public:
87  explicit StudyCaloResponse(const edm::ParameterSet&);
88  ~StudyCaloResponse() override {}
89 
90  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
91 
92 private:
93  void analyze(edm::Event const&, edm::EventSetup const&) override;
94  void beginJob() override;
95  void beginRun(edm::Run const&, edm::EventSetup const&) override;
96  void endRun(edm::Run const&, edm::EventSetup const&) override;
99 
100  void clear();
101  void fillTrack(int, double, double, double, double);
102  void fillIsolation(int, double, double, double);
103  void fillEnergy(int, int, double, double, double, double, double);
106 
107  // ----------member data ---------------------------
108  static const int nPBin_ = 15, nEtaBin_ = 4, nPVBin_ = 4;
109  static const int nGen_ = (nPVBin_ + 12);
112  const int verbosity_;
113  const std::vector<std::string> trigNames_, newNames_;
116  const double minTrackP_, maxTrackEta_;
117  const double tMinE_, tMaxE_, tMinH_, tMaxH_;
119  const double cutMuon_, cutEcal_, cutRatio_;
120  const std::vector<double> puWeights_;
123  std::vector<std::string> HLTNames_;
125 
137 
144 
147  TH2I* h_nHLTvsRN;
148  std::vector<TH1I*> h_HLTAccepts;
149  TH1D *h_p[nGen_ + 2], *h_pt[nGen_ + 2], *h_counter[8];
150  TH1D *h_eta[nGen_ + 2], *h_phi[nGen_ + 2], *h_h_pNew[8];
151  TH1I* h_ntrk[2];
152  TH1D *h_maxNearP[2], *h_ene1[2], *h_ene2[2], *h_ediff[2];
153  TH1D* h_energy[nPVBin_ + 8][nPBin_][nEtaBin_][6];
154  TTree* tree_;
156  double pBin_[nPBin_ + 1];
159  std::vector<std::string> tr_TrigName;
160  std::vector<double> tr_TrkPt, tr_TrkP, tr_TrkEta, tr_TrkPhi;
161  std::vector<double> tr_MaxNearP31X31, tr_MaxNearHcalP7x7;
162  std::vector<double> tr_H3x3, tr_H5x5, tr_H7x7;
163  std::vector<double> tr_FE7x7P, tr_FE11x11P, tr_FE15x15P;
164  std::vector<bool> tr_SE7x7P, tr_SE11x11P, tr_SE15x15P;
165  std::vector<int> tr_iEta, tr_TrkID;
166 };
167 
169  : verbosity_(iConfig.getUntrackedParameter<int>("verbosity", 0)),
170  trigNames_(iConfig.getUntrackedParameter<std::vector<std::string> >("triggers")),
171  newNames_(iConfig.getUntrackedParameter<std::vector<std::string> >("newNames")),
172  labelMuon_(iConfig.getUntrackedParameter<edm::InputTag>("labelMuon")),
173  labelGenTrack_(iConfig.getUntrackedParameter<edm::InputTag>("labelTrack")),
174  theTrackQuality_(iConfig.getUntrackedParameter<std::string>("trackQuality", "highPurity")),
175  minTrackP_(iConfig.getUntrackedParameter<double>("minTrackP", 1.0)),
176  maxTrackEta_(iConfig.getUntrackedParameter<double>("maxTrackEta", 2.5)),
177  tMinE_(iConfig.getUntrackedParameter<double>("timeMinCutECAL", -500.)),
178  tMaxE_(iConfig.getUntrackedParameter<double>("timeMaxCutECAL", 500.)),
179  tMinH_(iConfig.getUntrackedParameter<double>("timeMinCutHCAL", -500.)),
180  tMaxH_(iConfig.getUntrackedParameter<double>("timeMaxCutHCAL", 500.)),
181  isItAOD_(iConfig.getUntrackedParameter<bool>("isItAOD", false)),
182  vetoTrigger_(iConfig.getUntrackedParameter<bool>("vetoTrigger", false)),
183  doTree_(iConfig.getUntrackedParameter<bool>("doTree", false)),
184  vetoMuon_(iConfig.getUntrackedParameter<bool>("vetoMuon", true)),
185  vetoEcal_(iConfig.getUntrackedParameter<bool>("vetoEcal", false)),
186  cutMuon_(iConfig.getUntrackedParameter<double>("cutMuon", 0.1)),
187  cutEcal_(iConfig.getUntrackedParameter<double>("cutEcal", 2.0)),
188  cutRatio_(iConfig.getUntrackedParameter<double>("cutRatio", 0.90)),
189  puWeights_(iConfig.getUntrackedParameter<std::vector<double> >("puWeights")),
190  triggerEvent_(edm::InputTag("hltTriggerSummaryAOD", "", "HLT")),
191  theTriggerResultsLabel_(edm::InputTag("TriggerResults", "", "HLT")),
192  nRun_(0) {
193  usesResource(TFileService::kSharedResource);
194 
196  selectionParameters_.minPt = iConfig.getUntrackedParameter<double>("minTrackPt", 10.0);
198  selectionParameters_.maxDxyPV = iConfig.getUntrackedParameter<double>("maxDxyPV", 0.2);
199  selectionParameters_.maxDzPV = iConfig.getUntrackedParameter<double>("maxDzPV", 5.0);
200  selectionParameters_.maxChi2 = iConfig.getUntrackedParameter<double>("maxChi2", 5.0);
201  selectionParameters_.maxDpOverP = iConfig.getUntrackedParameter<double>("maxDpOverP", 0.1);
202  selectionParameters_.minOuterHit = iConfig.getUntrackedParameter<int>("minOuterHit", 4);
203  selectionParameters_.minLayerCrossed = iConfig.getUntrackedParameter<int>("minLayerCrossed", 8);
204  selectionParameters_.maxInMiss = iConfig.getUntrackedParameter<int>("maxInMiss", 0);
205  selectionParameters_.maxOutMiss = iConfig.getUntrackedParameter<int>("maxOutMiss", 0);
206 
207  // define tokens for access
208  tok_lumi = consumes<LumiDetails, edm::InLumi>(edm::InputTag("lumiProducer"));
209  tok_trigEvt = consumes<trigger::TriggerEvent>(triggerEvent_);
210  tok_trigRes = consumes<edm::TriggerResults>(theTriggerResultsLabel_);
211  tok_Muon_ = consumes<reco::MuonCollection>(labelMuon_);
212  tok_genTrack_ = consumes<reco::TrackCollection>(labelGenTrack_);
213  tok_recVtx_ = consumes<reco::VertexCollection>(edm::InputTag("offlinePrimaryVertices"));
214  tok_parts_ = consumes<reco::GenParticleCollection>(iConfig.getParameter<edm::InputTag>("particleSource"));
215 
216  if (isItAOD_) {
217  tok_EB_ = consumes<EcalRecHitCollection>(edm::InputTag("reducedEcalRecHitsEB"));
218  tok_EE_ = consumes<EcalRecHitCollection>(edm::InputTag("reducedEcalRecHitsEE"));
219  tok_hbhe_ = consumes<HBHERecHitCollection>(edm::InputTag("reducedHcalRecHits", "hbhereco"));
220  } else {
221  tok_EB_ = consumes<EcalRecHitCollection>(edm::InputTag("ecalRecHit", "EcalRecHitsEB"));
222  tok_EE_ = consumes<EcalRecHitCollection>(edm::InputTag("ecalRecHit", "EcalRecHitsEE"));
223  tok_hbhe_ = consumes<HBHERecHitCollection>(edm::InputTag("hbhereco"));
224  }
225  tok_ew_ = consumes<GenEventInfoProduct>(edm::InputTag("generator"));
226 
227  tok_geom_ = esConsumes<CaloGeometry, CaloGeometryRecord>();
228  tok_caloTopology_ = esConsumes<CaloTopology, CaloTopologyRecord>();
229  tok_topo_ = esConsumes<HcalTopology, HcalRecNumberingRecord>();
230  tok_magField_ = esConsumes<MagneticField, IdealMagneticFieldRecord>();
231  tok_ecalChStatus_ = esConsumes<EcalChannelStatus, EcalChannelStatusRcd>();
232  tok_sevlv_ = esConsumes<EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd>();
233 
234  edm::LogVerbatim("IsoTrack") << "Verbosity " << verbosity_ << " with " << trigNames_.size() << " triggers:";
235  for (unsigned int k = 0; k < trigNames_.size(); ++k)
236  edm::LogVerbatim("IsoTrack") << " [" << k << "] " << trigNames_[k];
237  edm::LogVerbatim("IsoTrack") << "TrackQuality " << theTrackQuality_ << " Minpt " << selectionParameters_.minPt
238  << " maxDxy " << selectionParameters_.maxDxyPV << " maxDz "
240  << " maxDp/p " << selectionParameters_.maxDpOverP << " minOuterHit "
241  << selectionParameters_.minOuterHit << " minLayerCrossed "
242  << selectionParameters_.minLayerCrossed << " maxInMiss "
244  << " minTrackP " << minTrackP_ << " maxTrackEta " << maxTrackEta_ << " tMinE_ " << tMinE_
245  << " tMaxE " << tMaxE_ << " tMinH_ " << tMinH_ << " tMaxH_ " << tMaxH_ << " isItAOD "
246  << isItAOD_ << " doTree " << doTree_ << " vetoTrigger " << vetoTrigger_ << " vetoMuon "
247  << vetoMuon_ << ":" << cutMuon_ << " vetoEcal " << vetoEcal_ << ":" << cutEcal_ << ":"
248  << cutRatio_;
249 
250  double pBins[nPBin_ + 1] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 11.0, 15.0, 20.0, 25.0, 30.0, 40.0, 60.0, 100.0};
251  int etaBins[nEtaBin_ + 1] = {1, 7, 13, 17, 23};
252  int pvBins[nPVBin_ + 1] = {1, 2, 3, 5, 100};
253  for (int i = 0; i <= nPBin_; ++i)
254  pBin_[i] = pBins[i];
255  for (int i = 0; i <= nEtaBin_; ++i)
256  etaBin_[i] = etaBins[i];
257  for (int i = 0; i <= nPVBin_; ++i)
258  pvBin_[i] = pvBins[i];
259 
260  firstEvent_ = true;
261  changed_ = false;
262 }
263 
265  std::vector<std::string> trig;
266  std::vector<double> weights;
267  std::vector<std::string> newNames = {"HLT", "PixelTracks_Multiplicity", "HLT_Physics_", "HLT_JetE", "HLT_ZeroBias"};
269  desc.add<edm::InputTag>("particleSource", edm::InputTag("genParticles"));
270  desc.addUntracked<int>("verbosity", 0);
271  desc.addUntracked<std::vector<std::string> >("triggers", trig);
272  desc.addUntracked<std::vector<std::string> >("newNames", newNames);
273  desc.addUntracked<edm::InputTag>("labelMuon", edm::InputTag("muons", "", "RECO"));
274  desc.addUntracked<edm::InputTag>("labelTrack", edm::InputTag("generalTracks", "", "RECO"));
275  desc.addUntracked<std::string>("trackQuality", "highPurity");
276  desc.addUntracked<double>("minTrackPt", 1.0);
277  desc.addUntracked<double>("maxDxyPV", 0.02);
278  desc.addUntracked<double>("maxDzPV", 0.02);
279  desc.addUntracked<double>("maxChi2", 5.0);
280  desc.addUntracked<double>("maxDpOverP", 0.1);
281  desc.addUntracked<int>("minOuterHit", 4);
282  desc.addUntracked<int>("minLayerCrossed", 8);
283  desc.addUntracked<int>("maxInMiss", 0);
284  desc.addUntracked<int>("maxOutMiss", 0);
285  desc.addUntracked<double>("minTrackP", 1.0);
286  desc.addUntracked<double>("maxTrackEta", 2.6);
287  desc.addUntracked<double>("timeMinCutECAL", -500.0);
288  desc.addUntracked<double>("timeMaxCutECAL", 500.0);
289  desc.addUntracked<double>("timeMinCutHCAL", -500.0);
290  desc.addUntracked<double>("timeMaxCutHCAL", 500.0);
291  desc.addUntracked<bool>("isItAOD", false);
292  desc.addUntracked<bool>("vetoTrigger", false);
293  desc.addUntracked<bool>("doTree", false);
294  desc.addUntracked<bool>("vetoMuon", true);
295  desc.addUntracked<double>("cutMuon", 0.1);
296  desc.addUntracked<bool>("vetoEcal", false);
297  desc.addUntracked<double>("cutEcal", 2.0);
298  desc.addUntracked<double>("cutRatio", 0.9);
299  desc.addUntracked<std::vector<double> >("puWeights", weights);
300  descriptions.add("studyCaloResponse", desc);
301 }
302 
304  clear();
305  int counter0[1000] = {0};
306  int counter1[1000] = {0};
307  int counter2[1000] = {0};
308  int counter3[1000] = {0};
309  int counter4[1000] = {0};
310  int counter5[1000] = {0};
311  int counter6[1000] = {0};
312  int counter7[1000] = {0};
313  if (verbosity_ > 0)
314  edm::LogVerbatim("IsoTrack") << "Event starts====================================";
315  int RunNo = iEvent.id().run();
316  int EvtNo = iEvent.id().event();
317  int Lumi = iEvent.luminosityBlock();
318  int Bunch = iEvent.bunchCrossing();
319 
320  std::vector<int> newAccept(newNames_.size() + 1, 0);
321  if (verbosity_ > 0)
322  edm::LogVerbatim("IsoTrack") << "RunNo " << RunNo << " EvtNo " << EvtNo << " Lumi " << Lumi << " Bunch " << Bunch;
323 
324  trigger::TriggerEvent triggerEvent;
325  edm::Handle<trigger::TriggerEvent> triggerEventHandle;
326  iEvent.getByToken(tok_trigEvt, triggerEventHandle);
327 
328  bool ok(false);
329  std::string triggerUse("None");
330  if (!triggerEventHandle.isValid()) {
331  if (trigNames_.empty()) {
332  ok = true;
333  } else {
334  edm::LogWarning("StudyCaloResponse") << "Error! Can't get the product " << triggerEvent_.label();
335  }
336  } else {
337  triggerEvent = *(triggerEventHandle.product());
338 
341  iEvent.getByToken(tok_trigRes, triggerResults);
342 
343  if (triggerResults.isValid()) {
344  h_nHLT->Fill(triggerResults->size());
345  h_nHLTvsRN->Fill(RunNo, triggerResults->size());
346 
347  const edm::TriggerNames& triggerNames = iEvent.triggerNames(*triggerResults);
348  const std::vector<std::string>& triggerNames_ = triggerNames.triggerNames();
349  for (unsigned int iHLT = 0; iHLT < triggerResults->size(); iHLT++) {
350  int ipos = -1;
351  std::string newtriggerName = truncate_str(triggerNames_[iHLT]);
352  for (unsigned int i = 0; i < HLTNames_.size(); ++i) {
353  if (newtriggerName == HLTNames_[i]) {
354  ipos = i + 1;
355  break;
356  }
357  }
358  if (ipos < 0) {
359  HLTNames_.push_back(newtriggerName);
360  ipos = (int)(HLTNames_.size());
361  if (ipos <= h_HLTAccept->GetNbinsX())
362  h_HLTAccept->GetXaxis()->SetBinLabel(ipos, newtriggerName.c_str());
363  }
364  if ((int)(iHLT + 1) > h_HLTAccepts[nRun_]->GetNbinsX()) {
365  edm::LogVerbatim("IsoTrack") << "Wrong trigger " << RunNo << " Event " << EvtNo << " Hlt " << iHLT;
366  } else {
367  if (firstEvent_)
368  h_HLTAccepts[nRun_]->GetXaxis()->SetBinLabel(iHLT + 1, newtriggerName.c_str());
369  }
370  int hlt = triggerResults->accept(iHLT);
371  if (hlt) {
372  h_HLTAccepts[nRun_]->Fill(iHLT + 1);
373  h_HLTAccept->Fill(ipos);
374  }
375  if (trigNames_.empty()) {
376  ok = true;
377  } else {
378  for (unsigned int i = 0; i < trigNames_.size(); ++i) {
379  if (newtriggerName.find(trigNames_[i]) != std::string::npos) {
380  if (verbosity_ % 10 > 0)
381  edm::LogVerbatim("IsoTrack") << newtriggerName;
382  if (hlt > 0) {
383  if (!ok)
384  triggerUse = newtriggerName;
385  ok = true;
386  tr_TrigName.push_back(newtriggerName);
387  }
388  }
389  }
390  if (vetoTrigger_)
391  ok = !ok;
392  for (unsigned int i = 0; i < newNames_.size(); ++i) {
393  if (newtriggerName.find(newNames_[i]) != std::string::npos) {
394  if (verbosity_ % 10 > 0)
395  edm::LogVerbatim("IsoTrack") << "[" << i << "] " << newNames_[i] << " : " << newtriggerName;
396  if (hlt > 0)
397  newAccept[i] = 1;
398  }
399  }
400  }
401  }
402  int iflg(0), indx(1);
403  for (unsigned int i = 0; i < newNames_.size(); ++i) {
404  iflg += (indx * newAccept[i]);
405  indx *= 2;
406  }
407  h_HLTCorr->Fill(iflg);
408  }
409  }
410  if ((verbosity_ / 10) % 10 > 0)
411  edm::LogVerbatim("IsoTrack") << "Trigger check gives " << ok << " with " << triggerUse;
412 
413  //Look at the tracks
415  iEvent.getByToken(tok_genTrack_, trkCollection);
416 
417  edm::Handle<reco::MuonCollection> muonEventHandle;
418  iEvent.getByToken(tok_Muon_, muonEventHandle);
419 
421  iEvent.getByToken(tok_recVtx_, recVtxs);
422 
423  if ((!trkCollection.isValid()) || (!muonEventHandle.isValid()) || (!recVtxs.isValid())) {
424  edm::LogWarning("StudyCaloResponse") << "Track collection " << trkCollection.isValid() << " Muon collection "
425  << muonEventHandle.isValid() << " Vertex Collecttion " << recVtxs.isValid();
426  ok = false;
427  }
428 
429  if (ok) {
430  h_goodRun->Fill(RunNo);
431  tr_goodRun = RunNo;
432  // get handles to calogeometry and calotopology
433  const CaloGeometry* geo = &iSetup.getData(tok_geom_);
434  const CaloTopology* caloTopology = &iSetup.getData(tok_caloTopology_);
435  const HcalTopology* theHBHETopology = &iSetup.getData(tok_topo_);
436  const MagneticField* bField = &iSetup.getData(tok_magField_);
437  const EcalChannelStatus* theEcalChStatus = &iSetup.getData(tok_ecalChStatus_);
438 
439  int ntrk(0), ngoodPV(0), nPV(-1), nvtxs(0);
440  nvtxs = (int)(recVtxs->size());
441  for (int ind = 0; ind < nvtxs; ind++) {
442  if (!((*recVtxs)[ind].isFake()) && (*recVtxs)[ind].ndof() > 4)
443  ngoodPV++;
444  }
445  for (int i = 0; i < nPVBin_; ++i) {
446  if (ngoodPV >= pvBin_[i] && ngoodPV < pvBin_[i + 1]) {
447  nPV = i;
448  break;
449  }
450  }
451 
452  tr_eventWeight = 1.0;
454  iEvent.getByToken(tok_ew_, genEventInfo);
455  if (genEventInfo.isValid())
456  tr_eventWeight = genEventInfo->weight();
457 
458  if ((verbosity_ / 10) % 10 > 0)
459  edm::LogVerbatim("IsoTrack") << "Number of vertices: " << nvtxs << " Good " << ngoodPV << " Bin " << nPV
460  << " Event weight " << tr_eventWeight;
461  h_numberPV->Fill(nvtxs, tr_eventWeight);
462  h_goodPV->Fill(ngoodPV, tr_eventWeight);
463  tr_goodPV = ngoodPV;
464 
465  if (!puWeights_.empty()) {
466  int npbin = h_goodPV->FindBin(ngoodPV);
467  if (npbin > 0 && npbin <= (int)(puWeights_.size()))
468  tr_eventWeight *= puWeights_[npbin - 1];
469  else
470  tr_eventWeight = 0;
471  }
472 
473  //=== genParticle information
475  iEvent.getByToken(tok_parts_, genParticles);
476  if (genParticles.isValid()) {
477  for (const auto& p : (reco::GenParticleCollection)(*genParticles)) {
478  double pt1 = p.momentum().Rho();
479  double p1 = p.momentum().R();
480  double eta1 = p.momentum().Eta();
481  double phi1 = p.momentum().Phi();
482  fillTrack(nGen_, pt1, p1, eta1, phi1);
483  bool match(false);
484  double phi2(phi1);
485  if (phi2 < 0)
486  phi2 += 2.0 * M_PI;
487  for (const auto& trk : (reco::TrackCollection)(*trkCollection)) {
488  bool quality = trk.quality(selectionParameters_.minQuality);
489  if (quality) {
490  double dEta = trk.eta() - eta1;
491  double phi0 = trk.phi();
492  if (phi0 < 0)
493  phi0 += 2.0 * M_PI;
494  double dPhi = phi0 - phi2;
495  if (dPhi > M_PI)
496  dPhi -= 2. * M_PI;
497  else if (dPhi < -M_PI)
498  dPhi += 2. * M_PI;
499  double dR = sqrt(dEta * dEta + dPhi * dPhi);
500  if (dR < 0.01) {
501  match = true;
502  break;
503  }
504  }
505  }
506  if (match)
507  fillTrack(nGen_ + 1, pt1, p1, eta1, phi1);
508  }
509  }
510 
511  reco::TrackCollection::const_iterator trkItr;
512  for (trkItr = trkCollection->begin(); trkItr != trkCollection->end(); ++trkItr, ++ntrk) {
513  const reco::Track* pTrack = &(*trkItr);
514  double pt1 = pTrack->pt();
515  double p1 = pTrack->p();
516  double eta1 = pTrack->momentum().eta();
517  double phi1 = pTrack->momentum().phi();
519  fillTrack(0, pt1, p1, eta1, phi1);
520  if (quality)
521  fillTrack(1, pt1, p1, eta1, phi1);
522  if (p1 < 1000) {
523  h_h_pNew[0]->Fill(p1);
524  ++counter0[(int)(p1)];
525  }
526  }
527  h_ntrk[0]->Fill(ntrk, tr_eventWeight);
528 
529  std::vector<spr::propagatedTrackID> trkCaloDets;
530  spr::propagateCALO(trkCollection, geo, bField, theTrackQuality_, trkCaloDets, ((verbosity_ / 100) % 10 > 0));
531  std::vector<spr::propagatedTrackID>::const_iterator trkDetItr;
532  for (trkDetItr = trkCaloDets.begin(), ntrk = 0; trkDetItr != trkCaloDets.end(); trkDetItr++, ntrk++) {
533  const reco::Track* pTrack = &(*(trkDetItr->trkItr));
534  double pt1 = pTrack->pt();
535  double p1 = pTrack->p();
536  double eta1 = pTrack->momentum().eta();
537  double phi1 = pTrack->momentum().phi();
538  if ((verbosity_ / 10) % 10 > 0)
539  edm::LogVerbatim("IsoTrack") << "track: p " << p1 << " pt " << pt1 << " eta " << eta1 << " phi " << phi1
540  << " okEcal " << trkDetItr->okECAL;
541  fillTrack(2, pt1, p1, eta1, phi1);
542 
543  bool vetoMuon(false);
544  double chiGlobal(0), dr(0);
545  bool goodGlob(false);
546  if (vetoMuon_) {
547  if (muonEventHandle.isValid()) {
548  for (reco::MuonCollection::const_iterator recMuon = muonEventHandle->begin();
549  recMuon != muonEventHandle->end();
550  ++recMuon) {
551  if (((recMuon->isPFMuon()) && (recMuon->isGlobalMuon() || recMuon->isTrackerMuon())) &&
552  (recMuon->innerTrack()->validFraction() > 0.49) && (recMuon->innerTrack().isNonnull())) {
553  chiGlobal = ((recMuon->globalTrack().isNonnull()) ? recMuon->globalTrack()->normalizedChi2() : 999);
554  goodGlob = (recMuon->isGlobalMuon() && chiGlobal < 3 &&
555  recMuon->combinedQuality().chi2LocalPosition < 12 && recMuon->combinedQuality().trkKink < 20);
556  if (muon::segmentCompatibility(*recMuon) > (goodGlob ? 0.303 : 0.451)) {
557  const reco::Track* pTrack0 = (recMuon->innerTrack()).get();
558  dr = reco::deltaR(pTrack0->eta(), pTrack0->phi(), pTrack->eta(), pTrack->phi());
559  if (dr < cutMuon_) {
560  vetoMuon = true;
561  break;
562  }
563  }
564  }
565  }
566  }
567  }
568  if ((verbosity_ / 10) % 10 > 0)
569  edm::LogVerbatim("IsoTrack") << "vetoMuon: " << vetoMuon_ << ":" << vetoMuon << " chi:good:dr " << chiGlobal
570  << ":" << goodGlob << ":" << dr;
571  if (pt1 > minTrackP_ && std::abs(eta1) < maxTrackEta_ && trkDetItr->okECAL && (!vetoMuon)) {
572  fillTrack(3, pt1, p1, eta1, phi1);
573  double maxNearP31x31 =
574  spr::chargeIsolationEcal(ntrk, trkCaloDets, geo, caloTopology, 15, 15, ((verbosity_ / 1000) % 10 > 0));
575 
576  const EcalSeverityLevelAlgo* sevlv = &iSetup.getData(tok_sevlv_);
577 
578  edm::Handle<EcalRecHitCollection> barrelRecHitsHandle;
579  edm::Handle<EcalRecHitCollection> endcapRecHitsHandle;
580  iEvent.getByToken(tok_EB_, barrelRecHitsHandle);
581  iEvent.getByToken(tok_EE_, endcapRecHitsHandle);
582  // get ECal Tranverse Profile
583  std::pair<double, bool> e7x7P, e11x11P, e15x15P;
584  const DetId isoCell = trkDetItr->detIdECAL;
585  e7x7P = spr::eECALmatrix(isoCell,
586  barrelRecHitsHandle,
587  endcapRecHitsHandle,
588  *theEcalChStatus,
589  geo,
590  caloTopology,
591  sevlv,
592  3,
593  3,
594  0.030,
595  0.150,
596  tMinE_,
597  tMaxE_,
598  ((verbosity_ / 10000) % 10 > 0));
599  e11x11P = spr::eECALmatrix(isoCell,
600  barrelRecHitsHandle,
601  endcapRecHitsHandle,
602  *theEcalChStatus,
603  geo,
604  caloTopology,
605  sevlv,
606  5,
607  5,
608  0.030,
609  0.150,
610  tMinE_,
611  tMaxE_,
612  ((verbosity_ / 10000) % 10 > 0));
613  e15x15P = spr::eECALmatrix(isoCell,
614  barrelRecHitsHandle,
615  endcapRecHitsHandle,
616  *theEcalChStatus,
617  geo,
618  caloTopology,
619  sevlv,
620  7,
621  7,
622  0.030,
623  0.150,
624  tMinE_,
625  tMaxE_,
626  ((verbosity_ / 10000) % 10 > 0));
627 
628  double maxNearHcalP7x7 =
629  spr::chargeIsolationHcal(ntrk, trkCaloDets, theHBHETopology, 3, 3, ((verbosity_ / 1000) % 10 > 0));
630  int ieta(0);
631  double h3x3(0), h5x5(0), h7x7(0);
632  fillIsolation(0, maxNearP31x31, e11x11P.first, e15x15P.first);
633  if ((verbosity_ / 10) % 10 > 0)
634  edm::LogVerbatim("IsoTrack") << "Accepted Tracks reaching Ecal maxNearP31x31 " << maxNearP31x31 << " e11x11P "
635  << e11x11P.first << " e15x15P " << e15x15P.first << " okHCAL "
636  << trkDetItr->okHCAL;
637 
638  int trackID = trackPID(pTrack, genParticles);
639  if (trkDetItr->okHCAL) {
641  iEvent.getByToken(tok_hbhe_, hbhe);
642  const DetId ClosestCell(trkDetItr->detIdHCAL);
643  ieta = ((HcalDetId)(ClosestCell)).ietaAbs();
644  h3x3 = spr::eHCALmatrix(theHBHETopology,
645  ClosestCell,
646  hbhe,
647  1,
648  1,
649  false,
650  true,
651  0.7,
652  0.8,
653  -100.0,
654  -100.0,
655  tMinH_,
656  tMaxH_,
657  ((verbosity_ / 10000) % 10 > 0));
658  h5x5 = spr::eHCALmatrix(theHBHETopology,
659  ClosestCell,
660  hbhe,
661  2,
662  2,
663  false,
664  true,
665  0.7,
666  0.8,
667  -100.0,
668  -100.0,
669  tMinH_,
670  tMaxH_,
671  ((verbosity_ / 10000) % 10 > 0));
672  h7x7 = spr::eHCALmatrix(theHBHETopology,
673  ClosestCell,
674  hbhe,
675  3,
676  3,
677  false,
678  true,
679  0.7,
680  0.8,
681  -100.0,
682  -100.0,
683  tMinH_,
684  tMaxH_,
685  ((verbosity_ / 10000) % 10 > 0));
686  fillIsolation(1, maxNearHcalP7x7, h5x5, h7x7);
687  double eByh = ((e11x11P.second) ? (e11x11P.first / std::max(h3x3, 0.001)) : 0.0);
688  bool notAnElec = ((vetoEcal_ && e11x11P.second) ? ((e11x11P.first < cutEcal_) || (eByh < cutRatio_)) : true);
689  if ((verbosity_ / 10) % 10 > 0)
690  edm::LogVerbatim("IsoTrack") << "Tracks Reaching Hcal maxNearHcalP7x7/h5x5/h7x7 " << maxNearHcalP7x7 << "/"
691  << h5x5 << "/" << h7x7 << " eByh " << eByh << " notAnElec " << notAnElec;
692  tr_TrkPt.push_back(pt1);
693  tr_TrkP.push_back(p1);
694  tr_TrkEta.push_back(eta1);
695  tr_TrkPhi.push_back(phi1);
696  tr_TrkID.push_back(trackID);
697  tr_MaxNearP31X31.push_back(maxNearP31x31);
698  tr_MaxNearHcalP7x7.push_back(maxNearHcalP7x7);
699  tr_FE7x7P.push_back(e7x7P.first);
700  tr_FE11x11P.push_back(e11x11P.first);
701  tr_FE15x15P.push_back(e15x15P.first);
702  tr_SE7x7P.push_back(e7x7P.second);
703  tr_SE11x11P.push_back(e11x11P.second);
704  tr_SE15x15P.push_back(e15x15P.second);
705  tr_iEta.push_back(ieta);
706  tr_H3x3.push_back(h3x3);
707  tr_H5x5.push_back(h5x5);
708  tr_H7x7.push_back(h7x7);
709 
710  if (maxNearP31x31 < 0 && notAnElec) {
711  fillTrack(4, pt1, p1, eta1, phi1);
712  fillEnergy(0, ieta, p1, e7x7P.first, h3x3, e11x11P.first, h5x5);
713  if (maxNearHcalP7x7 < 0) {
714  fillTrack(5, pt1, p1, eta1, phi1);
715  fillEnergy(1, ieta, p1, e7x7P.first, h3x3, e11x11P.first, h5x5);
716  if ((e11x11P.second) && (e15x15P.second) && (e15x15P.first - e11x11P.first) < 2.0) {
717  fillTrack(6, pt1, p1, eta1, phi1);
718  fillEnergy(2, ieta, p1, e7x7P.first, h3x3, e11x11P.first, h5x5);
719  if (h7x7 - h5x5 < 2.0) {
720  fillTrack(7, pt1, p1, eta1, phi1);
721  fillEnergy(3, ieta, p1, e7x7P.first, h3x3, e11x11P.first, h5x5);
722  if (nPV >= 0) {
723  fillTrack(nPV + 8, pt1, p1, eta1, phi1);
724  fillEnergy(nPV + 4, ieta, p1, e7x7P.first, h3x3, e11x11P.first, h5x5);
725  }
726  if (trackID > 0) {
727  fillTrack(nPVBin_ + trackID + 7, pt1, p1, eta1, phi1);
728  fillEnergy(nPVBin_ + trackID + 3, ieta, p1, e7x7P.first, h3x3, e11x11P.first, h5x5);
729  }
730  if (p1 < 1000) {
731  h_h_pNew[7]->Fill(p1);
732  ++counter7[(int)(p1)];
733  }
734  }
735  if (p1 < 1000) {
736  h_h_pNew[6]->Fill(p1);
737  ++counter6[(int)(p1)];
738  }
739  }
740  if (p1 < 1000) {
741  h_h_pNew[5]->Fill(p1);
742  ++counter5[(int)(p1)];
743  }
744  }
745  if (p1 < 1000) {
746  h_h_pNew[4]->Fill(p1);
747  ++counter4[(int)(p1)];
748  }
749  }
750  if (p1 < 1000) {
751  h_h_pNew[3]->Fill(p1);
752  ++counter3[(int)(p1)];
753  }
754  }
755  if (p1 < 1000) {
756  h_h_pNew[2]->Fill(p1);
757  ++counter2[(int)(p1)];
758  }
759  }
760  if (p1 < 1000) {
761  h_h_pNew[1]->Fill(p1);
762  ++counter1[(int)(p1)];
763  }
764  }
765  h_ntrk[1]->Fill(ntrk, tr_eventWeight);
766  if ((!tr_TrkPt.empty()) && doTree_)
767  tree_->Fill();
768  for (int i = 0; i < 1000; ++i) {
769  if (counter0[i])
770  h_counter[0]->Fill(i, counter0[i]);
771  if (counter1[i])
772  h_counter[1]->Fill(i, counter1[i]);
773  if (counter2[i])
774  h_counter[2]->Fill(i, counter2[i]);
775  if (counter3[i])
776  h_counter[3]->Fill(i, counter3[i]);
777  if (counter4[i])
778  h_counter[4]->Fill(i, counter4[i]);
779  if (counter5[i])
780  h_counter[5]->Fill(i, counter5[i]);
781  if (counter6[i])
782  h_counter[6]->Fill(i, counter6[i]);
783  if (counter7[i])
784  h_counter[7]->Fill(i, counter7[i]);
785  }
786  }
787  firstEvent_ = false;
788 }
789 
791  // Book histograms
792  h_nHLT = fs_->make<TH1I>("h_nHLT", "size of trigger Names", 1000, 0, 1000);
793  h_HLTAccept = fs_->make<TH1I>("h_HLTAccept", "HLT Accepts for all runs", 500, 0, 500);
794  for (int i = 1; i <= 500; ++i)
795  h_HLTAccept->GetXaxis()->SetBinLabel(i, " ");
796  h_nHLTvsRN = fs_->make<TH2I>("h_nHLTvsRN", "size of trigger Names vs RunNo", 2168, 190949, 193116, 100, 400, 500);
797  h_HLTCorr = fs_->make<TH1I>("h_HLTCorr", "Correlation among different paths", 100, 0, 100);
798  h_numberPV = fs_->make<TH1I>("h_numberPV", "Number of Primary Vertex", 100, 0, 100);
799  h_goodPV = fs_->make<TH1I>("h_goodPV", "Number of good Primary Vertex", 100, 0, 100);
800  h_goodRun = fs_->make<TH1I>("h_goodRun", "Number of accepted events for Run", 4000, 190000, 1940000);
801  char hname[60], htit[200];
802  std::string CollectionNames[2] = {"Reco", "Propagated"};
803  for (unsigned int i = 0; i < 2; i++) {
804  sprintf(hname, "h_nTrk_%s", CollectionNames[i].c_str());
805  sprintf(htit, "Number of %s tracks", CollectionNames[i].c_str());
806  h_ntrk[i] = fs_->make<TH1I>(hname, htit, 500, 0, 500);
807  }
808  std::string TrkNames[8] = {
809  "All", "Quality", "NoIso", "okEcal", "EcalCharIso", "HcalCharIso", "EcalNeutIso", "HcalNeutIso"};
810  std::string particle[4] = {"Electron", "Pion", "Kaon", "Proton"};
811  for (unsigned int i = 0; i <= nGen_ + 1; i++) {
812  if (i < 8) {
813  sprintf(hname, "h_pt_%s", TrkNames[i].c_str());
814  sprintf(htit, "p_{T} of %s tracks", TrkNames[i].c_str());
815  } else if (i < 8 + nPVBin_) {
816  sprintf(hname, "h_pt_%s_%d", TrkNames[7].c_str(), i - 8);
817  sprintf(htit, "p_{T} of %s tracks (PV=%d:%d)", TrkNames[7].c_str(), pvBin_[i - 8], pvBin_[i - 7] - 1);
818  } else if (i >= nGen_) {
819  sprintf(hname, "h_pt_%s_%d", TrkNames[0].c_str(), i - nGen_);
820  sprintf(htit, "p_{T} of %s Generator tracks", TrkNames[0].c_str());
821  } else {
822  sprintf(hname, "h_pt_%s_%s", TrkNames[7].c_str(), particle[i - 8 - nPVBin_].c_str());
823  sprintf(htit, "p_{T} of %s tracks (%s)", TrkNames[7].c_str(), particle[i - 8 - nPVBin_].c_str());
824  }
825  h_pt[i] = fs_->make<TH1D>(hname, htit, 400, 0, 200.0);
826  h_pt[i]->Sumw2();
827 
828  if (i < 8) {
829  sprintf(hname, "h_p_%s", TrkNames[i].c_str());
830  sprintf(htit, "Momentum of %s tracks", TrkNames[i].c_str());
831  } else if (i < 8 + nPVBin_) {
832  sprintf(hname, "h_p_%s_%d", TrkNames[7].c_str(), i - 8);
833  sprintf(htit, "Momentum of %s tracks (PV=%d:%d)", TrkNames[7].c_str(), pvBin_[i - 8], pvBin_[i - 7] - 1);
834  } else if (i >= nGen_) {
835  sprintf(hname, "h_p_%s_%d", TrkNames[0].c_str(), i - nGen_);
836  sprintf(htit, "Momentum of %s Generator tracks", TrkNames[0].c_str());
837  } else {
838  sprintf(hname, "h_p_%s_%s", TrkNames[7].c_str(), particle[i - 8 - nPVBin_].c_str());
839  sprintf(htit, "Momentum of %s tracks (%s)", TrkNames[7].c_str(), particle[i - 8 - nPVBin_].c_str());
840  }
841  h_p[i] = fs_->make<TH1D>(hname, htit, 400, 0, 200.0);
842  h_p[i]->Sumw2();
843 
844  if (i < 8) {
845  sprintf(hname, "h_eta_%s", TrkNames[i].c_str());
846  sprintf(htit, "Eta of %s tracks", TrkNames[i].c_str());
847  } else if (i < 8 + nPVBin_) {
848  sprintf(hname, "h_eta_%s_%d", TrkNames[7].c_str(), i - 8);
849  sprintf(htit, "Eta of %s tracks (PV=%d:%d)", TrkNames[7].c_str(), pvBin_[i - 8], pvBin_[i - 7] - 1);
850  } else if (i >= nGen_) {
851  sprintf(hname, "h_eta_%s_%d", TrkNames[0].c_str(), i - nGen_);
852  sprintf(htit, "Eta of %s Generator tracks", TrkNames[0].c_str());
853  } else {
854  sprintf(hname, "h_eta_%s_%s", TrkNames[7].c_str(), particle[i - 8 - nPVBin_].c_str());
855  sprintf(htit, "Eta of %s tracks (%s)", TrkNames[7].c_str(), particle[i - 8 - nPVBin_].c_str());
856  }
857  h_eta[i] = fs_->make<TH1D>(hname, htit, 60, -3.0, 3.0);
858  h_eta[i]->Sumw2();
859 
860  if (i < 8) {
861  sprintf(hname, "h_phi_%s", TrkNames[i].c_str());
862  sprintf(htit, "Phi of %s tracks", TrkNames[i].c_str());
863  } else if (i < 8 + nPVBin_) {
864  sprintf(hname, "h_phi_%s_%d", TrkNames[7].c_str(), i - 8);
865  sprintf(htit, "Phi of %s tracks (PV=%d:%d)", TrkNames[7].c_str(), pvBin_[i - 8], pvBin_[i - 7] - 1);
866  } else if (i >= nGen_) {
867  sprintf(hname, "h_phi_%s_%d", TrkNames[0].c_str(), i - nGen_);
868  sprintf(htit, "Phi of %s Generator tracks", TrkNames[0].c_str());
869  } else {
870  sprintf(hname, "h_phi_%s_%s", TrkNames[7].c_str(), particle[i - 8 - nPVBin_].c_str());
871  sprintf(htit, "Phi of %s tracks (%s)", TrkNames[7].c_str(), particle[i - 8 - nPVBin_].c_str());
872  }
873  h_phi[i] = fs_->make<TH1D>(hname, htit, 100, -3.15, 3.15);
874  h_phi[i]->Sumw2();
875  }
876  std::string IsolationNames[2] = {"Ecal", "Hcal"};
877  for (unsigned int i = 0; i < 2; i++) {
878  sprintf(hname, "h_maxNearP_%s", IsolationNames[i].c_str());
879  sprintf(htit, "Energy in ChargeIso region for %s", IsolationNames[i].c_str());
880  h_maxNearP[i] = fs_->make<TH1D>(hname, htit, 120, -1.5, 10.5);
881  h_maxNearP[i]->Sumw2();
882 
883  sprintf(hname, "h_ene1_%s", IsolationNames[i].c_str());
884  sprintf(htit, "Energy in smaller cone for %s", IsolationNames[i].c_str());
885  h_ene1[i] = fs_->make<TH1D>(hname, htit, 400, 0.0, 200.0);
886  h_ene1[i]->Sumw2();
887 
888  sprintf(hname, "h_ene2_%s", IsolationNames[i].c_str());
889  sprintf(htit, "Energy in bigger cone for %s", IsolationNames[i].c_str());
890  h_ene2[i] = fs_->make<TH1D>(hname, htit, 400, 0.0, 200.0);
891  h_ene2[i]->Sumw2();
892 
893  sprintf(hname, "h_ediff_%s", IsolationNames[i].c_str());
894  sprintf(htit, "Energy in NeutralIso region for %s", IsolationNames[i].c_str());
895  h_ediff[i] = fs_->make<TH1D>(hname, htit, 100, -0.5, 19.5);
896  h_ediff[i]->Sumw2();
897  }
898  std::string energyNames[6] = {
899  "E_{7x7}", "H_{3x3}", "(E_{7x7}+H_{3x3})", "E_{11x11}", "H_{5x5}", "{E_{11x11}+H_{5x5})"};
900  for (int i = 0; i < 4 + nPVBin_ + 4; ++i) {
901  for (int ip = 0; ip < nPBin_; ++ip) {
902  for (int ie = 0; ie < nEtaBin_; ++ie) {
903  for (int j = 0; j < 6; ++j) {
904  sprintf(hname, "h_energy_%d_%d_%d_%d", i, ip, ie, j);
905  if (i < 4) {
906  sprintf(htit,
907  "%s/p (p=%4.1f:%4.1f; i#eta=%d:%d) for tracks with %s",
908  energyNames[j].c_str(),
909  pBin_[ip],
910  pBin_[ip + 1],
911  etaBin_[ie],
912  (etaBin_[ie + 1] - 1),
913  TrkNames[i + 4].c_str());
914  } else if (i < 4 + nPVBin_) {
915  sprintf(htit,
916  "%s/p (p=%4.1f:%4.1f, i#eta=%d:%d, PV=%d:%d) for tracks with %s",
917  energyNames[j].c_str(),
918  pBin_[ip],
919  pBin_[ip + 1],
920  etaBin_[ie],
921  (etaBin_[ie + 1] - 1),
922  pvBin_[i - 4],
923  (pvBin_[i - 3] - 1),
924  TrkNames[7].c_str());
925  } else {
926  sprintf(htit,
927  "%s/p (p=%4.1f:%4.1f, i#eta=%d:%d %s) for tracks with %s",
928  energyNames[j].c_str(),
929  pBin_[ip],
930  pBin_[ip + 1],
931  etaBin_[ie],
932  (etaBin_[ie + 1] - 1),
933  particle[i - 4 - nPVBin_].c_str(),
934  TrkNames[7].c_str());
935  }
936  h_energy[i][ip][ie][j] = fs_->make<TH1D>(hname, htit, 5000, -0.1, 49.9);
937  h_energy[i][ip][ie][j]->Sumw2();
938  }
939  }
940  }
941  }
942 
943  for (int i = 0; i < 8; ++i) {
944  sprintf(hname, "counter%d", i);
945  sprintf(htit, "Counter with cut %d", i);
946  h_counter[i] = fs_->make<TH1D>(hname, htit, 1000, 0, 1000);
947  sprintf(hname, "h_pTNew%d", i);
948  sprintf(htit, "Track momentum with cut %d", i);
949  h_h_pNew[i] = fs_->make<TH1D>(hname, htit, 1000, 0, 1000);
950  }
951 
952  // Now the tree
953  if (doTree_) {
954  tree_ = fs_->make<TTree>("testTree", "new HLT Tree");
955  tree_->Branch("tr_goodRun", &tr_goodRun, "tr_goodRun/I");
956  tree_->Branch("tr_goodPV", &tr_goodPV, "tr_goodPV/I");
957  tree_->Branch("tr_eventWeight", &tr_eventWeight, "tr_eventWeight/D");
958  tree_->Branch("tr_tr_TrigName", &tr_TrigName);
959  tree_->Branch("tr_TrkPt", &tr_TrkPt);
960  tree_->Branch("tr_TrkP", &tr_TrkP);
961  tree_->Branch("tr_TrkEta", &tr_TrkEta);
962  tree_->Branch("tr_TrkPhi", &tr_TrkPhi);
963  tree_->Branch("tr_TrkID", &tr_TrkID);
964  tree_->Branch("tr_MaxNearP31X31", &tr_MaxNearP31X31);
965  tree_->Branch("tr_MaxNearHcalP7x7", &tr_MaxNearHcalP7x7);
966  tree_->Branch("tr_FE7x7P", &tr_FE7x7P);
967  tree_->Branch("tr_FE11x11P", &tr_FE11x11P);
968  tree_->Branch("tr_FE15x15P", &tr_FE15x15P);
969  tree_->Branch("tr_SE7x7P", &tr_SE7x7P);
970  tree_->Branch("tr_SE11x11P", &tr_SE11x11P);
971  tree_->Branch("tr_SE15x15P", &tr_SE15x15P);
972  tree_->Branch("tr_H3x3", &tr_H3x3);
973  tree_->Branch("tr_H5x5", &tr_H5x5);
974  tree_->Branch("tr_H7x7", &tr_H7x7);
975  tree_->Branch("tr_iEta", &tr_iEta);
976  }
977 }
978 
979 // ------------ method called when starting to processes a run ------------
980 void StudyCaloResponse::beginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {
981  char hname[100], htit[400];
982  edm::LogVerbatim("IsoTrack") << "Run[" << nRun_ << "] " << iRun.run() << " hltconfig.init "
983  << hltConfig_.init(iRun, iSetup, "HLT", changed_);
984  sprintf(hname, "h_HLTAccepts_%i", iRun.run());
985  sprintf(htit, "HLT Accepts for Run No %i", iRun.run());
986  TH1I* hnew = fs_->make<TH1I>(hname, htit, 500, 0, 500);
987  for (int i = 1; i <= 500; ++i)
988  hnew->GetXaxis()->SetBinLabel(i, " ");
989  h_HLTAccepts.push_back(hnew);
990  edm::LogVerbatim("IsoTrack") << "beginRun " << iRun.run();
991  firstEvent_ = true;
992  changed_ = false;
993 }
994 
995 // ------------ method called when ending the processing of a run ------------
997  ++nRun_;
998  edm::LogVerbatim("IsoTrack") << "endRun[" << nRun_ << "] " << iRun.run();
999 }
1000 
1002  tr_TrigName.clear();
1003  tr_TrkPt.clear();
1004  tr_TrkP.clear();
1005  tr_TrkEta.clear();
1006  tr_TrkPhi.clear();
1007  tr_TrkID.clear();
1008  tr_MaxNearP31X31.clear();
1009  tr_MaxNearHcalP7x7.clear();
1010  tr_FE7x7P.clear();
1011  tr_FE11x11P.clear();
1012  tr_FE15x15P.clear();
1013  tr_SE7x7P.clear();
1014  tr_SE11x11P.clear();
1015  tr_SE15x15P.clear();
1016  tr_H3x3.clear();
1017  tr_H5x5.clear();
1018  tr_H7x7.clear();
1019  tr_iEta.clear();
1020 }
1021 
1022 void StudyCaloResponse::fillTrack(int i, double pt, double p, double eta, double phi) {
1023  h_pt[i]->Fill(pt, tr_eventWeight);
1024  h_p[i]->Fill(p, tr_eventWeight);
1025  h_eta[i]->Fill(eta, tr_eventWeight);
1026  h_phi[i]->Fill(phi, tr_eventWeight);
1027 }
1028 
1029 void StudyCaloResponse::fillIsolation(int i, double emaxnearP, double eneutIso1, double eneutIso2) {
1030  h_maxNearP[i]->Fill(emaxnearP, tr_eventWeight);
1031  h_ene1[i]->Fill(eneutIso1, tr_eventWeight);
1032  h_ene2[i]->Fill(eneutIso2, tr_eventWeight);
1033  h_ediff[i]->Fill(eneutIso2 - eneutIso1, tr_eventWeight);
1034 }
1035 
1037  int flag, int ieta, double p, double enEcal1, double enHcal1, double enEcal2, double enHcal2) {
1038  int ip(-1), ie(-1);
1039  for (int i = 0; i < nPBin_; ++i) {
1040  if (p >= pBin_[i] && p < pBin_[i + 1]) {
1041  ip = i;
1042  break;
1043  }
1044  }
1045  for (int i = 0; i < nEtaBin_; ++i) {
1046  if (ieta >= etaBin_[i] && ieta < etaBin_[i + 1]) {
1047  ie = i;
1048  break;
1049  }
1050  }
1051  if (ip >= 0 && ie >= 0 && enEcal1 > 0.02 && enHcal1 > 0.1) {
1052  h_energy[flag][ip][ie][0]->Fill(enEcal1 / p, tr_eventWeight);
1053  h_energy[flag][ip][ie][1]->Fill(enHcal1 / p, tr_eventWeight);
1054  h_energy[flag][ip][ie][2]->Fill((enEcal1 + enHcal1) / p, tr_eventWeight);
1055  h_energy[flag][ip][ie][3]->Fill(enEcal2 / p, tr_eventWeight);
1056  h_energy[flag][ip][ie][4]->Fill(enHcal2 / p, tr_eventWeight);
1057  h_energy[flag][ip][ie][5]->Fill((enEcal2 + enHcal2) / p, tr_eventWeight);
1058  }
1059 }
1060 
1062  std::string truncated_str(str);
1063  int length = str.length();
1064  for (int i = 0; i < length - 2; i++) {
1065  if (str[i] == '_' && str[i + 1] == 'v' && isdigit(str.at(i + 2))) {
1066  int z = i + 1;
1067  truncated_str = str.substr(0, z);
1068  }
1069  }
1070  return (truncated_str);
1071 }
1072 
1075  int id(0);
1076  if (genParticles.isValid()) {
1077  unsigned int indx;
1078  reco::GenParticleCollection::const_iterator p;
1079  double mindR(999.9);
1080  for (p = genParticles->begin(), indx = 0; p != genParticles->end(); ++p, ++indx) {
1081  int pdgId = std::abs(p->pdgId());
1082  int idx = (pdgId == 11) ? 1 : ((pdgId == 211) ? 2 : ((pdgId == 321) ? 3 : ((pdgId == 2212) ? 4 : 0)));
1083  if (idx > 0) {
1084  double dEta = pTrack->eta() - p->momentum().Eta();
1085  double phi1 = pTrack->phi();
1086  double phi2 = p->momentum().Phi();
1087  if (phi1 < 0)
1088  phi1 += 2.0 * M_PI;
1089  if (phi2 < 0)
1090  phi2 += 2.0 * M_PI;
1091  double dPhi = phi1 - phi2;
1092  if (dPhi > M_PI)
1093  dPhi -= 2. * M_PI;
1094  else if (dPhi < -M_PI)
1095  dPhi += 2. * M_PI;
1096  double dR = sqrt(dEta * dEta + dPhi * dPhi);
1097  if (dR < mindR) {
1098  mindR = dR;
1099  id = idx;
1100  }
1101  }
1102  }
1103  }
1104  return id;
1105 }
1106 
RunNumber_t run() const
Definition: EventID.h:38
std::vector< double > tr_TrkEta
static const std::string kSharedResource
Definition: TFileService.h:76
double p() const
momentum vector magnitude
Definition: TrackBase.h:631
Log< level::Info, true > LogVerbatim
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
TH1D * h_eta[nGen_+2]
EventNumber_t event() const
Definition: EventID.h:40
const std::vector< std::string > newNames_
edm::EDGetTokenT< reco::TrackCollection > tok_genTrack_
std::vector< bool > tr_SE11x11P
T getUntrackedParameter(std::string const &, T const &) const
const edm::InputTag theTriggerResultsLabel_
std::vector< spr::propagatedTrackID > propagateCALO(edm::Handle< reco::TrackCollection > &trkCollection, const CaloGeometry *geo, const MagneticField *bField, const std::string &theTrackQuality, bool debug=false)
std::vector< double > tr_H5x5
void fillIsolation(int, double, double, double)
double pBin_[nPBin_+1]
RunNumber_t run() const
Definition: RunBase.h:40
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:25
uint16_t *__restrict__ id
std::vector< std::string > tr_TrigName
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
int trackPID(const reco::Track *, const edm::Handle< reco::GenParticleCollection > &)
edm::EDGetTokenT< reco::MuonCollection > tok_Muon_
TrackQuality
track quality
Definition: TrackBase.h:150
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static const int nPVBin_
edm::Service< TFileService > fs_
spr::trackSelectionParameters selectionParameters_
edm::EDGetTokenT< EcalRecHitCollection > tok_EE_
std::vector< double > tr_FE7x7P
std::vector< double > tr_MaxNearP31X31
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
int bunchCrossing() const
Definition: EventBase.h:64
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:61
std::vector< double > tr_TrkPhi
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:649
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
void analyze(edm::Event const &, edm::EventSetup const &) override
string quality
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:664
TH1D * h_phi[nGen_+2]
edm::EDGetTokenT< trigger::TriggerEvent > tok_trigEvt
edm::ESGetToken< CaloTopology, CaloTopologyRecord > tok_caloTopology_
Strings const & triggerNames() const
Definition: TriggerNames.cc:48
int etaBin_[nEtaBin_+1]
edm::EDGetTokenT< edm::TriggerResults > tok_trigRes
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:275
void fillTrack(int, double, double, double, double)
bool getData(T &iHolder) const
Definition: EventSetup.h:122
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > tok_geom_
const std::string theTrackQuality_
edm::EDGetTokenT< EcalRecHitCollection > tok_EB_
std::string truncate_str(const std::string &)
const std::vector< double > puWeights_
double chargeIsolationEcal(unsigned int trkIndex, std::vector< spr::propagatedTrackID > &vdetIds, const CaloGeometry *geo, const CaloTopology *caloTopology, int ieta, int iphi, bool debug=false)
int iEvent
Definition: GenABIO.cc:224
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:652
const double maxTrackEta_
edm::ESGetToken< EcalChannelStatus, EcalChannelStatusRcd > tok_ecalChStatus_
T sqrt(T t)
Definition: SSEVec.h:19
double pt() const
track transverse momentum
Definition: TrackBase.h:637
const edm::InputTag labelGenTrack_
virtual void beginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &)
const TString p1
Definition: fwPaths.cc:12
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
std::vector< int > tr_iEta
edm::EDGetTokenT< LumiDetails > tok_lumi
static std::string const triggerResults
Definition: EdmProvDump.cc:44
std::vector< double > tr_MaxNearHcalP7x7
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:70
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > tok_magField_
std::vector< double > tr_FE15x15P
std::vector< double > tr_TrkP
#define M_PI
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
std::vector< double > tr_TrkPt
edm::ESGetToken< HcalTopology, HcalRecNumberingRecord > tok_topo_
std::vector< double > tr_H3x3
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void fillEnergy(int, int, double, double, double, double, double)
Definition: DetId.h:17
const std::vector< std::string > trigNames_
std::vector< std::string > HLTNames_
static TrackQuality qualityByName(const std::string &name)
Definition: TrackBase.cc:126
std::vector< int > tr_TrkID
edm::ESGetToken< EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd > tok_sevlv_
T const * product() const
Definition: Handle.h:70
std::vector< bool > tr_SE7x7P
std::vector< double > tr_H7x7
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void add(std::string const &label, ParameterSetDescription const &psetDescription)
edm::EDGetTokenT< reco::GenParticleCollection > tok_parts_
bool quality(const TrackQuality) const
Track quality.
Definition: TrackBase.h:552
std::vector< TH1I * > h_HLTAccepts
edm::EDGetTokenT< HBHERecHitCollection > tok_hbhe_
void beginJob() override
std::string const & label() const
Definition: InputTag.h:36
int pvBin_[nPVBin_+1]
static const int nEtaBin_
TH1D * h_energy[nPVBin_+8][nPBin_][nEtaBin_][6]
const edm::InputTag labelMuon_
edm::EventID id() const
Definition: EventBase.h:59
virtual void endLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &)
edm::EDGetTokenT< reco::VertexCollection > tok_recVtx_
void beginRun(edm::Run const &, edm::EventSetup const &) override
StudyCaloResponse(const edm::ParameterSet &)
reco::TrackBase::TrackQuality minQuality
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
std::vector< double > tr_FE11x11P
Log< level::Warning, false > LogWarning
#define str(s)
static const int nPBin_
double chargeIsolationHcal(unsigned int trkIndex, std::vector< spr::propagatedTrackID > &vdetIds, const HcalTopology *topology, int ieta, int iphi, bool debug=false)
HLTConfigProvider hltConfig_
edm::EDGetTokenT< GenEventInfoProduct > tok_ew_
void endRun(edm::Run const &, edm::EventSetup const &) override
TH1D * h_p[nGen_+2]
Definition: Run.h:45
TH1D * h_pt[nGen_+2]
const edm::InputTag triggerEvent_
static const int nGen_
double eECALmatrix(const DetId &detId, edm::Handle< T > &hitsEB, edm::Handle< T > &hitsEE, const CaloGeometry *geo, const CaloTopology *caloTopology, int ieta, int iphi, double ebThr=-100, double eeThr=-100, double tMin=-500, double tMax=500, bool debug=false)
double eHCALmatrix(const HcalTopology *topology, const DetId &det, edm::Handle< T > &hits, int ieta, int iphi, bool includeHO=false, bool algoNew=true, double hbThr=-100, double heThr=-100, double hfThr=-100, double hoThr=-100, double tMin=-500, double tMax=500, int useRaw=0, bool debug=false)
~StudyCaloResponse() override
std::vector< bool > tr_SE15x15P