CMS 3D CMS Logo

HcalIsoTrkAnalyzer.cc
Go to the documentation of this file.
1 // system include files
2 #include <cmath>
3 #include <string>
4 #include <vector>
5 
6 // Root objects
7 #include "TLorentzVector.h"
8 #include "TTree.h"
9 
12 
16 
17 //Tracks
22 // Vertices
26 //Muons
30 
31 //Triggers
38 
43 
47 
48 //Generator information
52 
55 
63 
70 
83 
84 //#define EDM_ML_DEBUG
85 
86 class HcalIsoTrkAnalyzer : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::SharedResources> {
87 public:
88  explicit HcalIsoTrkAnalyzer(edm::ParameterSet const&);
89  ~HcalIsoTrkAnalyzer() override {}
90 
91  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
92 
93 private:
94  void analyze(edm::Event const&, edm::EventSetup const&) override;
95  void beginJob() override;
96  void beginRun(edm::Run const&, edm::EventSetup const&) override;
97  void endRun(edm::Run const&, edm::EventSetup const&) override;
98 
99  std::array<int, 3> fillTree(std::vector<math::XYZTLorentzVector>& vecL1,
100  std::vector<math::XYZTLorentzVector>& vecL3,
101  math::XYZPoint& leadPV,
102  std::vector<spr::propagatedTrackDirection>& trkCaloDirections,
103  std::vector<spr::propagatedTrackID>& trkCaloDets,
104  const CaloGeometry* geo,
105  const CaloTopology* topo,
106  const HcalTopology* theHBHETopology,
107  const EcalChannelStatus* theEcalChStatus,
108  const EcalSeverityLevelAlgo* theEcalSevlv,
109  edm::Handle<EcalRecHitCollection>& barrelRecHitsHandle,
110  edm::Handle<EcalRecHitCollection>& endcapRecHitsHandle,
114  const HcalRespCorrs* respCorrs,
115  const edm::Handle<reco::MuonCollection>& muonh);
118  double rhoh(const edm::Handle<CaloTowerCollection>&);
119  double eThreshold(const DetId& id, const CaloGeometry* geo) const;
120  DetId newId(const DetId&);
121  void storeEnergy(int indx,
122  const HcalRespCorrs* respCorrs,
123  const std::vector<DetId>& ids,
124  std::vector<double>& edet,
125  double& eHcal,
126  std::vector<unsigned int>* detIds,
127  std::vector<double>* hitEnergies);
128  bool notaMuon(const reco::Track* pTrack0, const edm::Handle<reco::MuonCollection>& muonh);
129 
132  const std::vector<std::string> trigNames_;
141  const double pTrackLow_, pTrackHigh_;
143  const int useRaw_, dataType_, mode_;
147  const double hitEthrEE2_, hitEthrEE3_;
148  const double hitEthrEELo_, hitEthrEEHi_;
152  const std::vector<int> oldID_, newDepth_;
153  const bool hep17_;
154  const std::vector<int> debEvents_;
155  const bool usePFThresh_;
158 
172 
182 
183  unsigned int nRun_, nLow_, nHigh_;
187 
188  std::vector<double> etabins_, phibins_;
189  std::vector<int> oldDet_, oldEta_, oldDepth_;
191 
192  TTree *tree, *tree2;
193  unsigned int t_RunNo, t_EventNo;
206  std::vector<unsigned int>*t_DetIds, *t_DetIds1, *t_DetIds3;
207  std::vector<double>*t_HitEnergies, *t_HitEnergies1, *t_HitEnergies3;
208  std::vector<bool>*t_trgbits, *t_hltbits;
209  bool t_L1Bit;
212  std::vector<int>*t_ietaAll, *t_ietaGood, *t_trackType;
213 
214  bool debug_;
215 };
216 
218  : trigNames_(iConfig.getParameter<std::vector<std::string>>("triggers")),
219  theTrackQuality_(iConfig.getParameter<std::string>("trackQuality")),
220  processName_(iConfig.getParameter<std::string>("processName")),
221  l1Filter_(iConfig.getParameter<std::string>("l1Filter")),
222  l2Filter_(iConfig.getParameter<std::string>("l2Filter")),
223  l3Filter_(iConfig.getParameter<std::string>("l3Filter")),
224  a_coneR_(iConfig.getParameter<double>("coneRadius")),
225  a_mipR_(iConfig.getParameter<double>("coneRadiusMIP")),
226  a_mipR2_(iConfig.getParameter<double>("coneRadiusMIP2")),
227  a_mipR3_(iConfig.getParameter<double>("coneRadiusMIP3")),
228  a_mipR4_(iConfig.getParameter<double>("coneRadiusMIP4")),
229  a_mipR5_(iConfig.getParameter<double>("coneRadiusMIP5")),
230  pTrackMin_(iConfig.getParameter<double>("minimumTrackP")),
231  eEcalMax_(iConfig.getParameter<double>("maximumEcalEnergy")),
232  maxRestrictionP_(iConfig.getParameter<double>("maxTrackP")),
233  slopeRestrictionP_(iConfig.getParameter<double>("slopeTrackP")),
234  hcalScale_(iConfig.getUntrackedParameter<double>("hHcalScale", 1.0)),
235  eIsolate1_(iConfig.getParameter<double>("isolationEnergyTight")),
236  eIsolate2_(iConfig.getParameter<double>("isolationEnergyLoose")),
237  pTrackLow_(iConfig.getParameter<double>("momentumLow")),
238  pTrackHigh_(iConfig.getParameter<double>("momentumHigh")),
239  prescaleLow_(iConfig.getParameter<int>("prescaleLow")),
240  prescaleHigh_(iConfig.getParameter<int>("prescaleHigh")),
241  useRaw_(iConfig.getUntrackedParameter<int>("useRaw", 0)),
242  dataType_(iConfig.getUntrackedParameter<int>("dataType", 0)),
243  mode_(iConfig.getUntrackedParameter<int>("outMode", 11)),
244  ignoreTrigger_(iConfig.getUntrackedParameter<bool>("ignoreTriggers", false)),
245  useL1Trigger_(iConfig.getUntrackedParameter<bool>("useL1Trigger", false)),
246  unCorrect_(iConfig.getUntrackedParameter<bool>("unCorrect", false)),
247  collapseDepth_(iConfig.getUntrackedParameter<bool>("collapseDepth", false)),
248  hitEthrEB_(iConfig.getParameter<double>("EBHitEnergyThreshold")),
249  hitEthrEE0_(iConfig.getParameter<double>("EEHitEnergyThreshold0")),
250  hitEthrEE1_(iConfig.getParameter<double>("EEHitEnergyThreshold1")),
251  hitEthrEE2_(iConfig.getParameter<double>("EEHitEnergyThreshold2")),
252  hitEthrEE3_(iConfig.getParameter<double>("EEHitEnergyThreshold3")),
253  hitEthrEELo_(iConfig.getParameter<double>("EEHitEnergyThresholdLow")),
254  hitEthrEEHi_(iConfig.getParameter<double>("EEHitEnergyThresholdHigh")),
255  triggerEvent_(iConfig.getParameter<edm::InputTag>("labelTriggerEvent")),
256  theTriggerResultsLabel_(iConfig.getParameter<edm::InputTag>("labelTriggerResult")),
257  labelGenTrack_(iConfig.getParameter<std::string>("labelTrack")),
258  labelRecVtx_(iConfig.getParameter<std::string>("labelVertex")),
259  labelEB_(iConfig.getParameter<std::string>("labelEBRecHit")),
260  labelEE_(iConfig.getParameter<std::string>("labelEERecHit")),
261  labelHBHE_(iConfig.getParameter<std::string>("labelHBHERecHit")),
262  labelTower_(iConfig.getParameter<std::string>("labelCaloTower")),
263  l1TrigName_(iConfig.getUntrackedParameter<std::string>("l1TrigName", "L1_SingleJet60")),
264  oldID_(iConfig.getUntrackedParameter<std::vector<int>>("oldID")),
265  newDepth_(iConfig.getUntrackedParameter<std::vector<int>>("newDepth")),
266  hep17_(iConfig.getUntrackedParameter<bool>("hep17")),
267  debEvents_(iConfig.getParameter<std::vector<int>>("debugEvents")),
268  usePFThresh_(iConfig.getParameter<bool>("usePFThreshold")),
269  labelBS_(iConfig.getParameter<std::string>("labelBeamSpot")),
270  modnam_(iConfig.getUntrackedParameter<std::string>("moduleName", "")),
271  prdnam_(iConfig.getUntrackedParameter<std::string>("producerName", "")),
272  labelMuon_(iConfig.getParameter<std::string>("labelMuon")),
273  algTag_(iConfig.getParameter<edm::InputTag>("algInputTag")),
274  extTag_(iConfig.getParameter<edm::InputTag>("extInputTag")),
275  tok_trigEvt_(consumes<trigger::TriggerEvent>(triggerEvent_)),
276  tok_trigRes_(consumes<edm::TriggerResults>(theTriggerResultsLabel_)),
277  tok_parts_(consumes<reco::GenParticleCollection>(edm::InputTag("genParticles"))),
278  tok_genTrack_(consumes<reco::TrackCollection>(labelGenTrack_)),
279  tok_bs_(consumes<reco::BeamSpot>(labelBS_)),
280  tok_recVtx_((modnam_.empty()) ? consumes<reco::VertexCollection>(labelRecVtx_)
281  : consumes<reco::VertexCollection>(edm::InputTag(modnam_, labelRecVtx_, prdnam_))),
282  tok_EB_((modnam_.empty()) ? consumes<EcalRecHitCollection>(edm::InputTag("ecalRecHit", labelEB_))
283  : consumes<EcalRecHitCollection>(edm::InputTag(modnam_, labelEB_, prdnam_))),
284  tok_EE_((modnam_.empty()) ? consumes<EcalRecHitCollection>(edm::InputTag("ecalRecHit", labelEE_))
285  : consumes<EcalRecHitCollection>(edm::InputTag(modnam_, labelEE_, prdnam_))),
286  tok_hbhe_((modnam_.empty()) ? consumes<HBHERecHitCollection>(labelHBHE_)
287  : consumes<HBHERecHitCollection>(edm::InputTag(modnam_, labelHBHE_, prdnam_))),
288  tok_cala_(consumes<CaloTowerCollection>(labelTower_)),
289  tok_ew_(consumes<GenEventInfoProduct>(edm::InputTag("generator"))),
290  tok_alg_(consumes<BXVector<GlobalAlgBlk>>(algTag_)),
291  tok_Muon_(consumes<reco::MuonCollection>(labelMuon_)),
294  tok_ecalChStatus_(esConsumes<EcalChannelStatus, EcalChannelStatusRcd>()),
297  tok_caloTopology_(esConsumes<CaloTopology, CaloTopologyRecord>()),
300  tok_ecalPFRecHitThresholds_(esConsumes<EcalPFRecHitThresholds, EcalPFRecHitThresholdsRcd>()),
301  nRun_(0),
302  nLow_(0),
303  nHigh_(0),
304  hdc_(nullptr) {
305  usesResource(TFileService::kSharedResource);
306 
307  //now do whatever initialization is needed
308  const double isolationRadius(28.9), innerR(10.0), outerR(30.0);
310  selectionParameter_.minPt = iConfig.getParameter<double>("minTrackPt");
311  ;
312  selectionParameter_.minQuality = trackQuality_;
313  selectionParameter_.maxDxyPV = iConfig.getParameter<double>("maxDxyPV");
314  selectionParameter_.maxDzPV = iConfig.getParameter<double>("maxDzPV");
315  selectionParameter_.maxChi2 = iConfig.getParameter<double>("maxChi2");
316  selectionParameter_.maxDpOverP = iConfig.getParameter<double>("maxDpOverP");
317  selectionParameter_.minOuterHit = iConfig.getParameter<int>("minOuterHit");
318  selectionParameter_.minLayerCrossed = iConfig.getParameter<int>("minLayerCrossed");
319  selectionParameter_.maxInMiss = iConfig.getParameter<int>("maxInMiss");
320  selectionParameter_.maxOutMiss = iConfig.getParameter<int>("maxOutMiss");
321  a_charIsoR_ = a_coneR_ + isolationRadius;
322  a_coneR1_ = a_coneR_ + innerR;
323  a_coneR2_ = a_coneR_ + outerR;
324  // Different isolation cuts are described in DN-2016/029
325  // Tight cut uses 2 GeV; Loose cut uses 10 GeV
326  // Eta dependent cut uses (maxRestrictionP_ * exp(|ieta|*log(2.5)/18))
327  // with the factor for exponential slopeRestrictionP_ = log(2.5)/18
328  // maxRestrictionP_ = 8 GeV as came from a study
329 
330  for (unsigned int k = 0; k < oldID_.size(); ++k) {
331  oldDet_.emplace_back((oldID_[k] / 10000) % 10);
332  oldEta_.emplace_back((oldID_[k] / 100) % 100);
333  oldDepth_.emplace_back(oldID_[k] % 100);
334  }
335 
336  l1GtUtils_ =
338  // define tokens for access
339 
340  if (modnam_.empty()) {
341  edm::LogVerbatim("HcalIsoTrack") << "Labels used " << triggerEvent_ << " " << theTriggerResultsLabel_ << " "
342  << labelBS_ << " " << labelRecVtx_ << " " << labelGenTrack_ << " "
343  << edm::InputTag("ecalRecHit", labelEB_) << " "
344  << edm::InputTag("ecalRecHit", labelEE_) << " " << labelHBHE_ << " " << labelTower_
345  << " " << labelMuon_;
346  } else {
347  edm::LogVerbatim("HcalIsoTrack") << "Labels used " << triggerEvent_ << " " << theTriggerResultsLabel_ << " "
348  << labelBS_ << " " << edm::InputTag(modnam_, labelRecVtx_, prdnam_) << " "
349  << labelGenTrack_ << " " << edm::InputTag(modnam_, labelEB_, prdnam_) << " "
351  << edm::InputTag(modnam_, labelHBHE_, prdnam_) << " " << labelTower_ << " "
352  << labelMuon_;
353  }
354 
355  edm::LogVerbatim("HcalIsoTrack")
356  << "Parameters read from config file \n"
357  << "\t minPt " << selectionParameter_.minPt << "\t theTrackQuality " << theTrackQuality_ << "\t minQuality "
358  << selectionParameter_.minQuality << "\t maxDxyPV " << selectionParameter_.maxDxyPV << "\t maxDzPV "
359  << selectionParameter_.maxDzPV << "\t maxChi2 " << selectionParameter_.maxChi2 << "\t maxDpOverP "
360  << selectionParameter_.maxDpOverP << "\t minOuterHit " << selectionParameter_.minOuterHit << "\t minLayerCrossed "
361  << selectionParameter_.minLayerCrossed << "\t maxInMiss " << selectionParameter_.maxInMiss << "\t maxOutMiss "
362  << selectionParameter_.maxOutMiss << "\t a_coneR " << a_coneR_ << ":" << a_coneR1_ << ":" << a_coneR2_
363  << "\t a_charIsoR " << a_charIsoR_ << "\t a_mipR " << a_mipR_ << "\t a_mipR2 " << a_mipR2_ << "\t a_mipR3 "
364  << a_mipR3_ << "\t a_mipR4 " << a_mipR4_ << "\t a_mipR5 " << a_mipR5_ << "\n pTrackMin_ " << pTrackMin_
365  << "\t eEcalMax_ " << eEcalMax_ << "\t maxRestrictionP_ " << maxRestrictionP_ << "\t slopeRestrictionP_ "
366  << slopeRestrictionP_ << "\t eIsolateStrong_ " << eIsolate1_ << "\t eIsolateSoft_ " << eIsolate2_
367  << "\t hcalScale_ " << hcalScale_ << "\n\t momentumLow_ " << pTrackLow_ << "\t prescaleLow_ " << prescaleLow_
368  << "\t momentumHigh_ " << pTrackHigh_ << "\t prescaleHigh_ " << prescaleHigh_ << "\n\t useRaw_ " << useRaw_
369  << "\t ignoreTrigger_ " << ignoreTrigger_ << "\n\t useL1Trigegr_ " << useL1Trigger_ << "\t dataType_ "
370  << dataType_ << "\t mode_ " << mode_ << "\t unCorrect_ " << unCorrect_ << "\t collapseDepth_ "
371  << collapseDepth_ << "\t L1TrigName_ " << l1TrigName_ << "\nThreshold flag used " << usePFThresh_
372  << " value for EB " << hitEthrEB_ << " EE " << hitEthrEE0_ << ":" << hitEthrEE1_ << ":" << hitEthrEE2_ << ":"
373  << hitEthrEE3_ << ":" << hitEthrEELo_ << ":" << hitEthrEEHi_ << " and " << debEvents_.size()
374  << " events to be debugged";
375  edm::LogVerbatim("HcalIsoTrack") << "Process " << processName_ << " L1Filter:" << l1Filter_
376  << " L2Filter:" << l2Filter_ << " L3Filter:" << l3Filter_;
377  for (unsigned int k = 0; k < trigNames_.size(); ++k) {
378  edm::LogVerbatim("HcalIsoTrack") << "Trigger[" << k << "] " << trigNames_[k];
379  }
380  edm::LogVerbatim("HcalIsoTrack") << oldID_.size() << " DetIDs to be corrected with HEP17 flag:" << hep17_;
381  for (unsigned int k = 0; k < oldID_.size(); ++k)
382  edm::LogVerbatim("HcalIsoTrack") << "[" << k << "] Det " << oldDet_[k] << " EtaAbs " << oldEta_[k] << " Depth "
383  << oldDepth_[k] << ":" << newDepth_[k];
384 
385  for (int i = 0; i < 10; i++)
386  phibins_.push_back(-M_PI + 0.1 * (2 * i + 1) * M_PI);
387  for (int i = 0; i < 8; ++i)
388  etabins_.push_back(-2.1 + 0.6 * i);
389  etadist_ = etabins_[1] - etabins_[0];
390  phidist_ = phibins_[1] - phibins_[0];
391  etahalfdist_ = 0.5 * etadist_;
392  phihalfdist_ = 0.5 * phidist_;
393  edm::LogVerbatim("HcalIsoTrack") << "EtaDist " << etadist_ << " " << etahalfdist_ << " PhiDist " << phidist_ << " "
394  << phihalfdist_;
395  unsigned int k1(0), k2(0);
396  for (auto phi : phibins_) {
397  edm::LogVerbatim("HcalIsoTrack") << "phibin_[" << k1 << "] " << phi;
398  ++k1;
399  }
400  for (auto eta : etabins_) {
401  edm::LogVerbatim("HcalIsoTrack") << "etabin_[" << k2 << "] " << eta;
402  ++k2;
403  }
404 }
405 
407  t_Run = iEvent.id().run();
408  t_Event = iEvent.id().event();
410  debug_ = (debEvents_.empty())
411  ? true
412  : (std::find(debEvents_.begin(), debEvents_.end(), iEvent.id().event()) != debEvents_.end());
413 #ifdef EDM_ML_DEBUG
414  if (debug_)
415  edm::LogVerbatim("HcalIsoTrack") << "Run " << t_Run << " Event " << t_Event << " type " << t_DataType
416  << " Luminosity " << iEvent.luminosityBlock() << " Bunch "
417  << iEvent.bunchCrossing();
418 #endif
419  //Get magnetic field and ECAL channel status
420  const MagneticField* bField = &iSetup.getData(tok_bFieldH_);
421  const EcalChannelStatus* theEcalChStatus = &iSetup.getData(tok_ecalChStatus_);
422  const EcalSeverityLevelAlgo* theEcalSevlv = &iSetup.getData(tok_sevlv_);
424 
425  // get calogeometry and calotopology
426  const CaloGeometry* geo = &iSetup.getData(tok_geom_);
427  const CaloTopology* caloTopology = &iSetup.getData(tok_caloTopology_);
428  const HcalTopology* theHBHETopology = &iSetup.getData(tok_htopo_);
429 
430  // get Hcal response corrections
431  const HcalRespCorrs* respCorrs = &iSetup.getData(tok_resp_);
432 
433  //=== genParticle information
435 
436  bool okC(true);
437  //Get track collection
438  edm::Handle<reco::TrackCollection> trkCollection = iEvent.getHandle(tok_genTrack_);
439  if (!trkCollection.isValid()) {
440  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelGenTrack_;
441  okC = false;
442  }
443 
444  //Get muon collection
445  const edm::Handle<reco::MuonCollection> muonh = iEvent.getHandle(tok_Muon_);
446 
447  //event weight for FLAT sample
448  t_EventWeight = 1.0;
450  if (genEventInfo.isValid())
451  t_EventWeight = genEventInfo->weight();
452 
453  //Define the best vertex and the beamspot
454  const edm::Handle<reco::VertexCollection> recVtxs = iEvent.getHandle(tok_recVtx_);
455  const edm::Handle<reco::BeamSpot> beamSpotH = iEvent.getHandle(tok_bs_);
456  math::XYZPoint leadPV(0, 0, 0);
457  t_goodPV = t_nVtx = 0;
458  if (recVtxs.isValid() && !(recVtxs->empty())) {
459  t_nVtx = recVtxs->size();
460  for (unsigned int k = 0; k < recVtxs->size(); ++k) {
461  if (!((*recVtxs)[k].isFake()) && ((*recVtxs)[k].ndof() > 4)) {
462  if (t_goodPV == 0)
463  leadPV = math::XYZPoint((*recVtxs)[k].x(), (*recVtxs)[k].y(), (*recVtxs)[k].z());
464  t_goodPV++;
465  }
466  }
467  }
468  if (t_goodPV == 0 && beamSpotH.isValid()) {
469  leadPV = beamSpotH->position();
470  }
472 #ifdef EDM_ML_DEBUG
473  if (debug_) {
474  edm::LogVerbatim("HcalIsoTrack") << "Primary Vertex " << leadPV << " out of " << t_goodPV << " vertex";
475  if (beamSpotH.isValid())
476  edm::LogVerbatim("HcalIsoTrack") << " Beam Spot " << beamSpotH->position();
477  }
478 #endif
479  // RecHits
480  edm::Handle<EcalRecHitCollection> barrelRecHitsHandle = iEvent.getHandle(tok_EB_);
481  if (!barrelRecHitsHandle.isValid()) {
482  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelEB_;
483  okC = false;
484  }
485  edm::Handle<EcalRecHitCollection> endcapRecHitsHandle = iEvent.getHandle(tok_EE_);
486  if (!endcapRecHitsHandle.isValid()) {
487  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelEE_;
488  okC = false;
489  }
491  if (!hbhe.isValid()) {
492  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelHBHE_;
493  okC = false;
494  }
495  edm::Handle<CaloTowerCollection> caloTower = iEvent.getHandle(tok_cala_);
496 
497  //Propagate tracks to calorimeter surface)
498  std::vector<spr::propagatedTrackDirection> trkCaloDirections;
499  spr::propagateCALO(trkCollection, geo, bField, theTrackQuality_, trkCaloDirections, false);
500  std::vector<spr::propagatedTrackID> trkCaloDets;
501  spr::propagateCALO(trkCollection, geo, bField, theTrackQuality_, trkCaloDets, false);
502  std::vector<math::XYZTLorentzVector> vecL1, vecL3;
503  t_RunNo = iEvent.id().run();
504  t_EventNo = iEvent.id().event();
505  t_Tracks = trkCollection->size();
506  t_TracksProp = trkCaloDirections.size();
507  t_ietaAll->clear();
508  t_ietaGood->clear();
509  t_trackType->clear();
510  t_trgbits->clear();
511  t_hltbits->clear();
512 #ifdef EDM_ML_DEBUG
513  if (debug_)
514  edm::LogVerbatim("HcalIsoTrack") << "# of propagated tracks " << t_TracksProp << " out of " << t_Tracks
515  << " with Trigger " << ignoreTrigger_;
516 #endif
517 
518  //Trigger
519  t_trgbits->assign(trigNames_.size(), false);
520  t_hltbits->assign(trigNames_.size(), false);
522  t_L1Bit = true;
523  t_TrigPass = false;
524 
525  if (!ignoreTrigger_) {
526  //L1
528  const std::vector<std::pair<std::string, bool>>& finalDecisions = l1GtUtils_->decisionsFinal();
529  for (const auto& decision : finalDecisions) {
530  if (decision.first.find(l1TrigName_) != std::string::npos) {
531  t_L1Bit = decision.second;
532  break;
533  }
534  }
535 #ifdef EDM_ML_DEBUG
536  if (debug_)
537  edm::LogVerbatim("HcalIsoTrack") << "Trigger Information for " << l1TrigName_ << " is " << t_L1Bit
538  << " from a list of " << finalDecisions.size() << " decisions";
539 #endif
540 
541  //HLT
543  if (triggerResults.isValid()) {
544  const edm::TriggerNames& triggerNames = iEvent.triggerNames(*triggerResults);
545  const std::vector<std::string>& names = triggerNames.triggerNames();
546  if (!trigNames_.empty()) {
547  for (unsigned int iHLT = 0; iHLT < triggerResults->size(); iHLT++) {
548  int hlt = triggerResults->accept(iHLT);
549  for (unsigned int i = 0; i < trigNames_.size(); ++i) {
550  if (names[iHLT].find(trigNames_[i]) != std::string::npos) {
551  t_trgbits->at(i) = (hlt > 0);
552  t_hltbits->at(i) = (hlt > 0);
553  if (hlt > 0)
554  t_TrigPass = true;
555 #ifdef EDM_ML_DEBUG
556  if (debug_)
557  edm::LogVerbatim("HcalIsoTrack")
558  << "This trigger " << names[iHLT] << " Flag " << hlt << ":" << t_trgbits->at(i);
559 #endif
560  }
561  }
562  }
563  }
564  }
565 #ifdef EDM_ML_DEBUG
566  if (debug_)
567  edm::LogVerbatim("HcalIsoTrack") << "HLT Information shows " << t_TrigPass << ":" << trigNames_.empty() << ":"
568  << okC;
569 #endif
570  }
571 
572  std::array<int, 3> ntksave{{0, 0, 0}};
573  if (ignoreTrigger_ || useL1Trigger_) {
574  t_l1pt = t_l1eta = t_l1phi = 0;
575  t_l3pt = t_l3eta = t_l3phi = 0;
576  if (ignoreTrigger_ || t_L1Bit)
577  ntksave = fillTree(vecL1,
578  vecL3,
579  leadPV,
580  trkCaloDirections,
581  trkCaloDets,
582  geo,
583  caloTopology,
584  theHBHETopology,
585  theEcalChStatus,
586  theEcalSevlv,
587  barrelRecHitsHandle,
588  endcapRecHitsHandle,
589  hbhe,
590  caloTower,
591  genParticles,
592  respCorrs,
593  muonh);
594  t_TracksSaved = ntksave[0];
595  t_TracksLoose = ntksave[1];
596  t_TracksTight = ntksave[2];
597  } else {
599  const edm::Handle<trigger::TriggerEvent>& triggerEventHandle = iEvent.getHandle(tok_trigEvt_);
600  if (!triggerEventHandle.isValid()) {
601  edm::LogWarning("HcalIsoTrack") << "Error! Can't get the product " << triggerEvent_.label();
602  } else if (okC) {
604  triggerEvent = *(triggerEventHandle.product());
605  const trigger::TriggerObjectCollection& TOC(triggerEvent.getObjects());
606  bool done(false);
607  if (triggerResults.isValid()) {
608  std::vector<std::string> modules;
609  const edm::TriggerNames& triggerNames = iEvent.triggerNames(*triggerResults);
610  const std::vector<std::string>& names = triggerNames.triggerNames();
611  for (unsigned int iHLT = 0; iHLT < triggerResults->size(); iHLT++) {
612  bool ok = (t_TrigPass) || (trigNames_.empty());
613  if (ok) {
614  unsigned int triggerindx = hltConfig_.triggerIndex(names[iHLT]);
615  const std::vector<std::string>& moduleLabels(hltConfig_.moduleLabels(triggerindx));
616  std::vector<math::XYZTLorentzVector> vecL2;
617  vecL1.clear();
618  vecL3.clear();
619  //loop over all trigger filters in event (i.e. filters passed)
620  for (unsigned int ifilter = 0; ifilter < triggerEvent.sizeFilters(); ++ifilter) {
621  std::vector<int> Keys;
622  std::string label = triggerEvent.filterTag(ifilter).label();
623  //loop over keys to objects passing this filter
624  for (unsigned int imodule = 0; imodule < moduleLabels.size(); imodule++) {
625  if (label.find(moduleLabels[imodule]) != std::string::npos) {
626 #ifdef EDM_ML_DEBUG
627  if (debug_)
628  edm::LogVerbatim("HcalIsoTrack") << "FilterName " << label;
629 #endif
630  for (unsigned int ifiltrKey = 0; ifiltrKey < triggerEvent.filterKeys(ifilter).size(); ++ifiltrKey) {
631  Keys.push_back(triggerEvent.filterKeys(ifilter)[ifiltrKey]);
632  const trigger::TriggerObject& TO(TOC[Keys[ifiltrKey]]);
633  math::XYZTLorentzVector v4(TO.px(), TO.py(), TO.pz(), TO.energy());
634  if (label.find(l2Filter_) != std::string::npos) {
635  vecL2.push_back(v4);
636  } else if (label.find(l3Filter_) != std::string::npos) {
637  vecL3.push_back(v4);
638  } else if ((label.find(l1Filter_) != std::string::npos) || (l1Filter_.empty())) {
639  vecL1.push_back(v4);
640  }
641 #ifdef EDM_ML_DEBUG
642  if (debug_)
643  edm::LogVerbatim("HcalIsoTrack")
644  << "key " << ifiltrKey << " : pt " << TO.pt() << " eta " << TO.eta() << " phi " << TO.phi()
645  << " mass " << TO.mass() << " Id " << TO.id();
646 #endif
647  }
648 #ifdef EDM_ML_DEBUG
649  if (debug_)
650  edm::LogVerbatim("HcalIsoTrack")
651  << "sizes " << vecL1.size() << ":" << vecL2.size() << ":" << vecL3.size();
652 #endif
653  }
654  }
655  }
657  math::XYZTLorentzVector mindRvec1;
658  double mindR1(999);
659  for (unsigned int i = 0; i < vecL2.size(); i++) {
660  double dr = dR(vecL1[0], vecL2[i]);
661 #ifdef EDM_ML_DEBUG
662  if (debug_)
663  edm::LogVerbatim("HcalIsoTrack") << "lvl2[" << i << "] dR " << dr;
664 #endif
665  if (dr < mindR1) {
666  mindR1 = dr;
667  mindRvec1 = vecL2[i];
668  }
669  }
670 #ifdef EDM_ML_DEBUG
671  if (debug_)
672  edm::LogVerbatim("HcalIsoTrack") << "L2 object closest to L1 " << mindRvec1 << " at Dr " << mindR1;
673 #endif
674 
675  if (!vecL1.empty()) {
676  t_l1pt = vecL1[0].pt();
677  t_l1eta = vecL1[0].eta();
678  t_l1phi = vecL1[0].phi();
679  } else {
680  t_l1pt = t_l1eta = t_l1phi = 0;
681  }
682  if (!vecL3.empty()) {
683  t_l3pt = vecL3[0].pt();
684  t_l3eta = vecL3[0].eta();
685  t_l3phi = vecL3[0].phi();
686  } else {
687  t_l3pt = t_l3eta = t_l3phi = 0;
688  }
689  // Now fill in the tree for each selected track
690  if (!done) {
691  ntksave = fillTree(vecL1,
692  vecL3,
693  leadPV,
694  trkCaloDirections,
695  trkCaloDets,
696  geo,
697  caloTopology,
698  theHBHETopology,
699  theEcalChStatus,
700  theEcalSevlv,
701  barrelRecHitsHandle,
702  endcapRecHitsHandle,
703  hbhe,
704  caloTower,
705  genParticles,
706  respCorrs,
707  muonh);
708  t_TracksSaved += ntksave[0];
709  t_TracksLoose += ntksave[1];
710  t_TracksTight += ntksave[2];
711  done = true;
712  }
713  }
714  }
715  }
716  }
717  }
718 #ifdef EDM_ML_DEBUG
719  if (debug_)
720  edm::LogVerbatim("HcalIsoTrack") << "Final results on selected tracks " << t_TracksSaved << ":" << t_TracksLoose
721  << ":" << t_TracksTight;
722 #endif
724  tree2->Fill();
725 }
726 
729  tree = fs->make<TTree>("CalibTree", "CalibTree");
730 
731  tree->Branch("t_Run", &t_Run, "t_Run/I");
732  tree->Branch("t_Event", &t_Event, "t_Event/I");
733  tree->Branch("t_DataType", &t_DataType, "t_DataType/I");
734  tree->Branch("t_ieta", &t_ieta, "t_ieta/I");
735  tree->Branch("t_iphi", &t_iphi, "t_iphi/I");
736  tree->Branch("t_EventWeight", &t_EventWeight, "t_EventWeight/D");
737  tree->Branch("t_nVtx", &t_nVtx, "t_nVtx/I");
738  tree->Branch("t_nTrk", &t_nTrk, "t_nTrk/I");
739  tree->Branch("t_goodPV", &t_goodPV, "t_goodPV/I");
740  tree->Branch("t_l1pt", &t_l1pt, "t_l1pt/D");
741  tree->Branch("t_l1eta", &t_l1eta, "t_l1eta/D");
742  tree->Branch("t_l1phi", &t_l1phi, "t_l1phi/D");
743  tree->Branch("t_l3pt", &t_l3pt, "t_l3pt/D");
744  tree->Branch("t_l3eta", &t_l3eta, "t_l3eta/D");
745  tree->Branch("t_l3phi", &t_l3phi, "t_l3phi/D");
746  tree->Branch("t_p", &t_p, "t_p/D");
747  tree->Branch("t_pt", &t_pt, "t_pt/D");
748  tree->Branch("t_phi", &t_phi, "t_phi/D");
749  tree->Branch("t_mindR1", &t_mindR1, "t_mindR1/D");
750  tree->Branch("t_mindR2", &t_mindR2, "t_mindR2/D");
751  tree->Branch("t_eMipDR", &t_eMipDR, "t_eMipDR/D");
752  tree->Branch("t_eMipDR2", &t_eMipDR2, "t_eMipDR2/D");
753  tree->Branch("t_eMipDR3", &t_eMipDR3, "t_eMipDR3/D");
754  tree->Branch("t_eMipDR4", &t_eMipDR4, "t_eMipDR4/D");
755  tree->Branch("t_eMipDR5", &t_eMipDR5, "t_eMipDR5/D");
756  tree->Branch("t_eHcal", &t_eHcal, "t_eHcal/D");
757  tree->Branch("t_eHcal10", &t_eHcal10, "t_eHcal10/D");
758  tree->Branch("t_eHcal30", &t_eHcal30, "t_eHcal30/D");
759  tree->Branch("t_hmaxNearP", &t_hmaxNearP, "t_hmaxNearP/D");
760  tree->Branch("t_emaxNearP", &t_emaxNearP, "t_emaxNearP/D");
761  tree->Branch("t_eAnnular", &t_eAnnular, "t_eAnnular/D");
762  tree->Branch("t_hAnnular", &t_hAnnular, "t_hAnnular/D");
763  tree->Branch("t_rhoh", &t_rhoh, "t_rhoh/D");
764  tree->Branch("t_selectTk", &t_selectTk, "t_selectTk/O");
765  tree->Branch("t_qltyFlag", &t_qltyFlag, "t_qltyFlag/O");
766  tree->Branch("t_qltyMissFlag", &t_qltyMissFlag, "t_qltyMissFlag/O");
767  tree->Branch("t_qltyPVFlag", &t_qltyPVFlag, "t_qltyPVFlag/O");
768  tree->Branch("t_gentrackP", &t_gentrackP, "t_gentrackP/D");
769 
770  t_DetIds = new std::vector<unsigned int>();
771  t_DetIds1 = new std::vector<unsigned int>();
772  t_DetIds3 = new std::vector<unsigned int>();
773  t_HitEnergies = new std::vector<double>();
774  t_HitEnergies1 = new std::vector<double>();
775  t_HitEnergies3 = new std::vector<double>();
776  t_trgbits = new std::vector<bool>();
777  tree->Branch("t_DetIds", "std::vector<unsigned int>", &t_DetIds);
778  tree->Branch("t_HitEnergies", "std::vector<double>", &t_HitEnergies);
779  tree->Branch("t_trgbits", "std::vector<bool>", &t_trgbits);
780  tree->Branch("t_DetIds1", "std::vector<unsigned int>", &t_DetIds1);
781  tree->Branch("t_DetIds3", "std::vector<unsigned int>", &t_DetIds3);
782  tree->Branch("t_HitEnergies1", "std::vector<double>", &t_HitEnergies1);
783  tree->Branch("t_HitEnergies3", "std::vector<double>", &t_HitEnergies3);
784 
785  tree2 = fs->make<TTree>("EventInfo", "Event Information");
786 
787  tree2->Branch("t_RunNo", &t_RunNo, "t_RunNo/i");
788  tree2->Branch("t_EventNo", &t_EventNo, "t_EventNo/i");
789  tree2->Branch("t_Tracks", &t_Tracks, "t_Tracks/I");
790  tree2->Branch("t_TracksProp", &t_TracksProp, "t_TracksProp/I");
791  tree2->Branch("t_TracksSaved", &t_TracksSaved, "t_TracksSaved/I");
792  tree2->Branch("t_TracksLoose", &t_TracksLoose, "t_TracksLoose/I");
793  tree2->Branch("t_TracksTight", &t_TracksTight, "t_TracksTight/I");
794  tree2->Branch("t_TrigPass", &t_TrigPass, "t_TrigPass/O");
795  tree2->Branch("t_TrigPassSel", &t_TrigPassSel, "t_TrigPassSel/O");
796  tree2->Branch("t_L1Bit", &t_L1Bit, "t_L1Bit/O");
797  tree2->Branch("t_allvertex", &t_allvertex, "t_allvertex/I");
798  t_hltbits = new std::vector<bool>();
799  t_ietaAll = new std::vector<int>();
800  t_ietaGood = new std::vector<int>();
801  t_trackType = new std::vector<int>();
802  tree2->Branch("t_ietaAll", "std::vector<int>", &t_ietaAll);
803  tree2->Branch("t_ietaGood", "std::vector<int>", &t_ietaGood);
804  tree2->Branch("t_trackType", "std::vector<int>", &t_trackType);
805  tree2->Branch("t_hltbits", "std::vector<bool>", &t_hltbits);
806 }
807 
808 // ------------ method called when starting to processes a run ------------
809 void HcalIsoTrkAnalyzer::beginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {
810  hdc_ = &iSetup.getData(tok_ddrec_);
811 
812  if (!ignoreTrigger_) {
813  bool changed_(true);
814  bool flag = hltConfig_.init(iRun, iSetup, processName_, changed_);
815  edm::LogVerbatim("HcalIsoTrack") << "Run[" << nRun_ << "] " << iRun.run() << " process " << processName_
816  << " init flag " << flag << " change flag " << changed_;
817  // check if trigger names in (new) config
818  if (changed_) {
819 #ifdef EDM_ML_DEBUG
820  edm::LogVerbatim("HcalIsoTrack") << "New trigger menu found !!!";
821 #endif
822  const unsigned int n(hltConfig_.size());
823  for (unsigned itrig = 0; itrig < trigNames_.size(); itrig++) {
824  unsigned int triggerindx = hltConfig_.triggerIndex(trigNames_[itrig]);
825  if (triggerindx >= n) {
826  edm::LogWarning("HcalIsoTrack") << trigNames_[itrig] << " " << triggerindx << " does not exist in "
827  << "the current menu";
828 #ifdef EDM_ML_DEBUG
829  } else {
830  edm::LogVerbatim("HcalIsoTrack") << trigNames_[itrig] << " " << triggerindx << " exists";
831 #endif
832  }
833  }
834  }
835  }
836 }
837 
838 // ------------ method called when ending the processing of a run ------------
840  nRun_++;
841  edm::LogVerbatim("HcalIsoTrack") << "endRun[" << nRun_ << "] " << iRun.run();
842 }
843 
846  std::vector<std::string> trig = {"HLT_PFJet40",
847  "HLT_PFJet60",
848  "HLT_PFJet80",
849  "HLT_PFJet140",
850  "HLT_PFJet200",
851  "HLT_PFJet260",
852  "HLT_PFJet320",
853  "HLT_PFJet400",
854  "HLT_PFJet450",
855  "HLT_PFJet500"};
856  desc.add<std::vector<std::string>>("triggers", trig);
857  desc.add<std::string>("processName", "HLT");
858  desc.add<std::string>("l1Filter", "");
859  desc.add<std::string>("l2Filter", "L2Filter");
860  desc.add<std::string>("l3Filter", "Filter");
861  // following 10 parameters are parameters to select good tracks
862  desc.add<std::string>("trackQuality", "highPurity");
863  desc.add<double>("minTrackPt", 1.0);
864  desc.add<double>("maxDxyPV", 0.02);
865  desc.add<double>("maxDzPV", 0.02);
866  desc.add<double>("maxChi2", 5.0);
867  desc.add<double>("maxDpOverP", 0.1);
868  desc.add<int>("minOuterHit", 4);
869  desc.add<int>("minLayerCrossed", 8);
870  desc.add<int>("maxInMiss", 0);
871  desc.add<int>("maxOutMiss", 0);
872  // Minimum momentum of selected isolated track and signal zone
873  desc.add<double>("minimumTrackP", 10.0);
874  desc.add<double>("coneRadius", 34.98);
875  // signal zone in ECAL and MIP energy cutoff
876  desc.add<double>("coneRadiusMIP", 14.0);
877  desc.add<double>("coneRadiusMIP2", 18.0);
878  desc.add<double>("coneRadiusMIP3", 20.0);
879  desc.add<double>("coneRadiusMIP4", 22.0);
880  desc.add<double>("coneRadiusMIP5", 24.0);
881  desc.add<double>("maximumEcalEnergy", 2.0);
882  // following 4 parameters are for isolation cuts and described in the code
883  desc.add<double>("maxTrackP", 8.0);
884  desc.add<double>("slopeTrackP", 0.05090504066);
885  desc.add<double>("isolationEnergyTight", 2.0);
886  desc.add<double>("isolationEnergyLoose", 10.0);
887  // energy thershold for ECAL (from Egamma group)
888  desc.add<double>("EBHitEnergyThreshold", 0.08);
889  desc.add<double>("EEHitEnergyThreshold0", 0.30);
890  desc.add<double>("EEHitEnergyThreshold1", 0.00);
891  desc.add<double>("EEHitEnergyThreshold2", 0.00);
892  desc.add<double>("EEHitEnergyThreshold3", 0.00);
893  desc.add<double>("EEHitEnergyThresholdLow", 0.30);
894  desc.add<double>("EEHitEnergyThresholdHigh", 0.30);
895  // prescale factors
896  desc.add<double>("momentumLow", 40.0);
897  desc.add<double>("momentumHigh", 60.0);
898  desc.add<int>("prescaleLow", 1);
899  desc.add<int>("prescaleHigh", 1);
900  // various labels for collections used in the code
901  desc.add<edm::InputTag>("labelTriggerEvent", edm::InputTag("hltTriggerSummaryAOD", "", "HLT"));
902  desc.add<edm::InputTag>("labelTriggerResult", edm::InputTag("TriggerResults", "", "HLT"));
903  desc.add<std::string>("labelTrack", "generalTracks");
904  desc.add<std::string>("labelVertex", "offlinePrimaryVertices");
905  desc.add<std::string>("labelEBRecHit", "EcalRecHitsEB");
906  desc.add<std::string>("labelEERecHit", "EcalRecHitsEE");
907  desc.add<std::string>("labelHBHERecHit", "hbhereco");
908  desc.add<std::string>("labelBeamSpot", "offlineBeamSpot");
909  desc.add<std::string>("labelCaloTower", "towerMaker");
910  desc.add<std::string>("labelMuon", "muons");
911  desc.add<edm::InputTag>("algInputTag", edm::InputTag("gtStage2Digis"));
912  desc.add<edm::InputTag>("extInputTag", edm::InputTag("gtStage2Digis"));
913  desc.addUntracked<std::string>("moduleName", "");
914  desc.addUntracked<std::string>("producerName", "");
915  // Various flags used for selecting tracks, choice of energy Method2/0
916  // Data type 0/1 for single jet trigger or others
917  desc.addUntracked<int>("useRaw", 0);
918  desc.addUntracked<bool>("ignoreTriggers", false);
919  desc.addUntracked<bool>("useL1Trigger", false);
920  desc.addUntracked<double>("hcalScale", 1.0);
921  desc.addUntracked<int>("dataType", 0);
922  desc.addUntracked<bool>("unCorrect", false);
923  desc.addUntracked<bool>("collapseDepth", false);
924  desc.addUntracked<std::string>("l1TrigName", "L1_SingleJet60");
925  desc.addUntracked<int>("outMode", 11);
926  std::vector<int> dummy;
927  desc.addUntracked<std::vector<int>>("oldID", dummy);
928  desc.addUntracked<std::vector<int>>("newDepth", dummy);
929  desc.addUntracked<bool>("hep17", false);
930  std::vector<int> events;
931  desc.add<std::vector<int>>("debugEvents", events);
932  desc.add<bool>("usePFThreshold", true);
933  descriptions.add("hcalIsoTrkAnalyzer", desc);
934 }
935 
936 std::array<int, 3> HcalIsoTrkAnalyzer::fillTree(std::vector<math::XYZTLorentzVector>& vecL1,
937  std::vector<math::XYZTLorentzVector>& vecL3,
938  math::XYZPoint& leadPV,
939  std::vector<spr::propagatedTrackDirection>& trkCaloDirections,
940  std::vector<spr::propagatedTrackID>& trkCaloDets,
941  const CaloGeometry* geo,
942  const CaloTopology* caloTopology,
943  const HcalTopology* theHBHETopology,
944  const EcalChannelStatus* theEcalChStatus,
945  const EcalSeverityLevelAlgo* theEcalSevlv,
946  edm::Handle<EcalRecHitCollection>& barrelRecHitsHandle,
947  edm::Handle<EcalRecHitCollection>& endcapRecHitsHandle,
951  const HcalRespCorrs* respCorrs,
952  const edm::Handle<reco::MuonCollection>& muonh) {
953  int nSave(0), nLoose(0), nTight(0);
954  //Loop over tracks
955  unsigned int nTracks(0);
956  t_nTrk = trkCaloDirections.size();
957  t_rhoh = (tower.isValid()) ? rhoh(tower) : 0;
958  for (const auto& trkDetItr : trkCaloDirections) {
959  const reco::Track* pTrack = &(*(trkDetItr.trkItr));
960  math::XYZTLorentzVector v4(pTrack->px(), pTrack->py(), pTrack->pz(), pTrack->p());
961  t_p = pTrack->p();
962  t_pt = pTrack->pt();
963  t_phi = pTrack->phi();
964 
965 #ifdef EDM_ML_DEBUG
966  if (debug_)
967  edm::LogVerbatim("HcalIsoTrack") << "This track : " << nTracks << " (pt|eta|phi|p) : " << t_pt << "|"
968  << pTrack->eta() << "|" << t_phi << "|" << t_p;
969 #endif
970  t_mindR2 = 999;
971  for (unsigned int k = 0; k < vecL3.size(); ++k) {
972  double dr = dR(vecL3[k], v4);
973  if (dr < t_mindR2) {
974  t_mindR2 = dr;
975  }
976  }
977  t_mindR1 = (!vecL1.empty()) ? dR(vecL1[0], v4) : 999;
978 #ifdef EDM_ML_DEBUG
979  if (debug_)
980  edm::LogVerbatim("HcalIsoTrack") << "Closest L3 object at dr : " << t_mindR2 << " and from L1 " << t_mindR1;
981 #endif
982 
983  t_ieta = t_iphi = 0;
984  if (trkDetItr.okHCAL) {
985  HcalDetId detId = (HcalDetId)(trkDetItr.detIdHCAL);
986  t_ieta = detId.ieta();
987  t_iphi = detId.iphi();
988  if (t_p > 40.0 && t_p <= 60.0)
989  t_ietaAll->emplace_back(t_ieta);
990  }
991  //Selection of good track
992  t_selectTk = spr::goodTrack(pTrack, leadPV, selectionParameter_, false);
994  oneCutParameters.maxDxyPV = 10;
995  oneCutParameters.maxDzPV = 100;
996  oneCutParameters.maxInMiss = 2;
997  oneCutParameters.maxOutMiss = 2;
998  bool qltyFlag = spr::goodTrack(pTrack, leadPV, oneCutParameters, false);
999  oneCutParameters = selectionParameter_;
1000  oneCutParameters.maxDxyPV = 10;
1001  oneCutParameters.maxDzPV = 100;
1002  t_qltyMissFlag = spr::goodTrack(pTrack, leadPV, oneCutParameters, false);
1003  oneCutParameters = selectionParameter_;
1004  oneCutParameters.maxInMiss = 2;
1005  oneCutParameters.maxOutMiss = 2;
1006  t_qltyPVFlag = spr::goodTrack(pTrack, leadPV, oneCutParameters, false);
1007  double eIsolation = maxRestrictionP_ * exp(slopeRestrictionP_ * std::abs((double)t_ieta));
1008  if (eIsolation < eIsolate1_)
1009  eIsolation = eIsolate1_;
1010  if (eIsolation < eIsolate2_)
1011  eIsolation = eIsolate2_;
1012 #ifdef EDM_ML_DEBUG
1013  if (debug_)
1014  edm::LogVerbatim("HcalIsoTrack") << "qltyFlag|okECAL|okHCAL : " << qltyFlag << "|" << trkDetItr.okECAL << "|"
1015  << trkDetItr.okHCAL << " eIsolation " << eIsolation;
1016 #endif
1017  t_qltyFlag = (qltyFlag && trkDetItr.okECAL && trkDetItr.okHCAL);
1018  bool notMuon = (muonh.isValid()) ? notaMuon(pTrack, muonh) : true;
1019  if (t_qltyFlag && notMuon) {
1020  int nNearTRKs(0);
1022  std::vector<DetId> eIds;
1023  std::vector<double> eHit;
1024  t_eMipDR = spr::eCone_ecal(geo,
1025  barrelRecHitsHandle,
1026  endcapRecHitsHandle,
1027  trkDetItr.pointHCAL,
1028  trkDetItr.pointECAL,
1029  a_mipR_,
1030  trkDetItr.directionECAL,
1031  eIds,
1032  eHit);
1033  double eEcal(0);
1034  for (unsigned int k = 0; k < eIds.size(); ++k) {
1035  if (eHit[k] > eThreshold(eIds[k], geo))
1036  eEcal += eHit[k];
1037  }
1038 #ifdef EDM_ML_DEBUG
1039  if (debug_)
1040  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << t_eMipDR << ":" << eEcal;
1041 #endif
1042  t_eMipDR = eEcal;
1045  std::vector<DetId> eIds2;
1046  std::vector<double> eHit2;
1047  t_eMipDR2 = spr::eCone_ecal(geo,
1048  barrelRecHitsHandle,
1049  endcapRecHitsHandle,
1050  trkDetItr.pointHCAL,
1051  trkDetItr.pointECAL,
1052  a_mipR2_,
1053  trkDetItr.directionECAL,
1054  eIds2,
1055  eHit2);
1056  double eEcal2(0);
1057  for (unsigned int k = 0; k < eIds2.size(); ++k) {
1058  if (eHit2[k] > eThreshold(eIds2[k], geo))
1059  eEcal2 += eHit2[k];
1060  }
1061 #ifdef EDM_ML_DEBUG
1062  if (debug_)
1063  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << t_eMipDR2 << ":" << eEcal2;
1064 #endif
1065  t_eMipDR2 = eEcal2;
1068  std::vector<DetId> eIds3;
1069  std::vector<double> eHit3;
1070  t_eMipDR3 = spr::eCone_ecal(geo,
1071  barrelRecHitsHandle,
1072  endcapRecHitsHandle,
1073  trkDetItr.pointHCAL,
1074  trkDetItr.pointECAL,
1075  a_mipR3_,
1076  trkDetItr.directionECAL,
1077  eIds3,
1078  eHit3);
1079  double eEcal3(0);
1080  for (unsigned int k = 0; k < eIds3.size(); ++k) {
1081  if (eHit3[k] > eThreshold(eIds3[k], geo))
1082  eEcal3 += eHit3[k];
1083  }
1084 #ifdef EDM_ML_DEBUG
1085  if (debug_)
1086  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << t_eMipDR3 << ":" << eEcal3;
1087 #endif
1088  t_eMipDR3 = eEcal3;
1091  std::vector<DetId> eIds4;
1092  std::vector<double> eHit4;
1093  t_eMipDR4 = spr::eCone_ecal(geo,
1094  barrelRecHitsHandle,
1095  endcapRecHitsHandle,
1096  trkDetItr.pointHCAL,
1097  trkDetItr.pointECAL,
1098  a_mipR4_,
1099  trkDetItr.directionECAL,
1100  eIds4,
1101  eHit4);
1102  double eEcal4(0);
1103  for (unsigned int k = 0; k < eIds4.size(); ++k) {
1104  if (eHit4[k] > eThreshold(eIds4[k], geo))
1105  eEcal4 += eHit4[k];
1106  }
1107 #ifdef EDM_ML_DEBUG
1108  if (debug_)
1109  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << t_eMipDR4 << ":" << eEcal4;
1110 #endif
1111  t_eMipDR4 = eEcal4;
1114  std::vector<DetId> eIds5;
1115  std::vector<double> eHit5;
1116  t_eMipDR5 = spr::eCone_ecal(geo,
1117  barrelRecHitsHandle,
1118  endcapRecHitsHandle,
1119  trkDetItr.pointHCAL,
1120  trkDetItr.pointECAL,
1121  a_mipR5_,
1122  trkDetItr.directionECAL,
1123  eIds5,
1124  eHit5);
1125  double eEcal5(0);
1126  for (unsigned int k = 0; k < eIds5.size(); ++k) {
1127  if (eHit5[k] > eThreshold(eIds5[k], geo))
1128  eEcal5 += eHit5[k];
1129  }
1130 #ifdef EDM_ML_DEBUG
1131  if (debug_)
1132  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << t_eMipDR5 << ":" << eEcal5;
1133 #endif
1134  t_eMipDR5 = eEcal5;
1136 
1137  t_emaxNearP = spr::chargeIsolationEcal(nTracks, trkCaloDets, geo, caloTopology, 15, 15);
1138  const DetId cellE(trkDetItr.detIdECAL);
1139  std::pair<double, bool> e11x11P = spr::eECALmatrix(cellE,
1140  barrelRecHitsHandle,
1141  endcapRecHitsHandle,
1142  *theEcalChStatus,
1143  geo,
1144  caloTopology,
1145  theEcalSevlv,
1146  5,
1147  5,
1148  -100.0,
1149  -100.0,
1150  -100.0,
1151  100.0);
1152  std::pair<double, bool> e15x15P = spr::eECALmatrix(cellE,
1153  barrelRecHitsHandle,
1154  endcapRecHitsHandle,
1155  *theEcalChStatus,
1156  geo,
1157  caloTopology,
1158  theEcalSevlv,
1159  7,
1160  7,
1161  -100.0,
1162  -100.0,
1163  -100.0,
1164  100.0);
1165  if (e11x11P.second && e15x15P.second) {
1166  t_eAnnular = (e15x15P.first - e11x11P.first);
1167  } else {
1168  t_eAnnular = -(e15x15P.first - e11x11P.first);
1169  }
1170  t_hmaxNearP = spr::chargeIsolationCone(nTracks, trkCaloDirections, a_charIsoR_, nNearTRKs, false);
1171  const DetId cellH(trkDetItr.detIdHCAL);
1172  double h5x5 = spr::eHCALmatrix(
1173  theHBHETopology, cellH, hbhe, 2, 2, false, true, -100.0, -100.0, -100.0, -100.0, -100.0, 100.0);
1174  double h7x7 = spr::eHCALmatrix(
1175  theHBHETopology, cellH, hbhe, 3, 3, false, true, -100.0, -100.0, -100.0, -100.0, -100.0, 100.0);
1176  t_hAnnular = h7x7 - h5x5;
1177 #ifdef EDM_ML_DEBUG
1178  if (debug_)
1179  edm::LogVerbatim("HcalIsoTrack") << "max p Near (Ecal) " << t_emaxNearP << " (Hcal) " << t_hmaxNearP
1180  << " Annular E (Ecal) " << e11x11P.first << ":" << e15x15P.first << ":"
1181  << t_eAnnular << " (Hcal) " << h5x5 << ":" << h7x7 << ":" << t_hAnnular;
1182 #endif
1183  t_gentrackP = trackP(pTrack, genParticles);
1184  if (t_eMipDR < eEcalMax_ && t_hmaxNearP < eIsolation) {
1185  t_DetIds->clear();
1186  t_HitEnergies->clear();
1187  t_DetIds1->clear();
1188  t_HitEnergies1->clear();
1189  t_DetIds3->clear();
1190  t_HitEnergies3->clear();
1191  int nRecHits(-999), nRecHits1(-999), nRecHits3(-999);
1192  std::vector<DetId> ids, ids1, ids3;
1193  std::vector<double> edet0, edet1, edet3;
1194  t_eHcal = spr::eCone_hcal(geo,
1195  hbhe,
1196  trkDetItr.pointHCAL,
1197  trkDetItr.pointECAL,
1198  a_coneR_,
1199  trkDetItr.directionHCAL,
1200  nRecHits,
1201  ids,
1202  edet0,
1203  useRaw_);
1204  if (!oldID_.empty()) {
1205  for (unsigned k = 0; k < ids.size(); ++k)
1206  ids[k] = newId(ids[k]);
1207  }
1208  storeEnergy(0, respCorrs, ids, edet0, t_eHcal, t_DetIds, t_HitEnergies);
1209 
1210  //----- hcal energy in the extended cone 1 (a_coneR+10) --------------
1211  t_eHcal10 = spr::eCone_hcal(geo,
1212  hbhe,
1213  trkDetItr.pointHCAL,
1214  trkDetItr.pointECAL,
1215  a_coneR1_,
1216  trkDetItr.directionHCAL,
1217  nRecHits1,
1218  ids1,
1219  edet1,
1220  useRaw_);
1221  if (!oldID_.empty()) {
1222  for (unsigned k = 0; k < ids1.size(); ++k)
1223  ids1[k] = newId(ids1[k]);
1224  }
1225  storeEnergy(1, respCorrs, ids1, edet1, t_eHcal10, t_DetIds1, t_HitEnergies1);
1226 
1227  //----- hcal energy in the extended cone 3 (a_coneR+30) --------------
1228  t_eHcal30 = spr::eCone_hcal(geo,
1229  hbhe,
1230  trkDetItr.pointHCAL,
1231  trkDetItr.pointECAL,
1232  a_coneR2_,
1233  trkDetItr.directionHCAL,
1234  nRecHits3,
1235  ids3,
1236  edet3,
1237  useRaw_);
1238  if (!oldID_.empty()) {
1239  for (unsigned k = 0; k < ids3.size(); ++k)
1240  ids3[k] = newId(ids3[k]);
1241  }
1242  storeEnergy(3, respCorrs, ids3, edet3, t_eHcal30, t_DetIds3, t_HitEnergies3);
1243 
1244 #ifdef EDM_ML_DEBUG
1245  if (debug_) {
1246  edm::LogVerbatim("HcalIsoTrack")
1247  << "This track : " << nTracks << " (pt|eta|phi|p) : " << t_pt << "|" << pTrack->eta() << "|" << t_phi
1248  << "|" << t_p << " Generator Level p " << t_gentrackP;
1249  edm::LogVerbatim("HcalIsoTrack")
1250  << "e_MIP " << t_eMipDR << " Chg Isolation " << t_hmaxNearP << " eHcal" << t_eHcal << " ieta " << t_ieta
1251  << " Quality " << t_qltyMissFlag << ":" << t_qltyPVFlag << ":" << t_selectTk;
1252  for (unsigned int ll = 0; ll < t_DetIds->size(); ll++) {
1253  edm::LogVerbatim("HcalIsoTrack")
1254  << "det id is = " << HcalDetId(t_DetIds->at(ll)) << " hit enery is = " << t_HitEnergies->at(ll);
1255  }
1256  for (unsigned int ll = 0; ll < t_DetIds1->size(); ll++) {
1257  edm::LogVerbatim("HcalIsoTrack")
1258  << "det id is = " << HcalDetId(t_DetIds1->at(ll)) << " hit enery is = " << t_HitEnergies1->at(ll);
1259  }
1260  for (unsigned int ll = 0; ll < t_DetIds3->size(); ll++) {
1261  edm::LogVerbatim("HcalIsoTrack")
1262  << "det id is = " << HcalDetId(t_DetIds3->at(ll)) << " hit enery is = " << t_HitEnergies3->at(ll);
1263  }
1264  }
1265 #endif
1266  bool accept(false);
1267  if (t_p > pTrackMin_) {
1268  if (t_p < pTrackLow_) {
1269  ++nLow_;
1270  if (prescaleLow_ <= 1)
1271  accept = true;
1272  else if (nLow_ % prescaleLow_ == 1)
1273  accept = true;
1274  } else if (t_p > pTrackHigh_) {
1275  ++nHigh_;
1276  if (prescaleHigh_ <= 1)
1277  accept = true;
1278  else if (nHigh_ % prescaleHigh_ == 1)
1279  accept = true;
1280  } else {
1281  accept = true;
1282  }
1283  }
1284  if (accept) {
1285  tree->Fill();
1286  edm::LogVerbatim("HcalIsoTrackX")
1287  << "Run " << t_RunNo << " Event " << t_EventNo << " Track " << nTracks << " p " << t_p;
1288  nSave++;
1289  int type(0);
1290  if (t_eMipDR < 1.0) {
1291  if (t_hmaxNearP < eIsolate2_) {
1292  ++nLoose;
1293  type = 1;
1294  }
1295  if (t_hmaxNearP < eIsolate1_) {
1296  ++nTight;
1297  type = 2;
1298  }
1299  }
1300  if (t_p > 40.0 && t_p <= 60.0 && t_selectTk) {
1301  t_ietaGood->emplace_back(t_ieta);
1302  t_trackType->emplace_back(type);
1303  }
1304 #ifdef EDM_ML_DEBUG
1305  if (debug_) {
1306  for (unsigned int k = 0; k < t_trgbits->size(); k++) {
1307  edm::LogVerbatim("HcalIsoTrack") << "trigger bit is = " << t_trgbits->at(k);
1308  }
1309  }
1310 #endif
1311  }
1312  }
1313  }
1314  ++nTracks;
1315  }
1316  std::array<int, 3> i3{{nSave, nLoose, nTight}};
1317  return i3;
1318 }
1319 
1321  return reco::deltaR(vec1.eta(), vec1.phi(), vec2.eta(), vec2.phi());
1322 }
1323 
1326  double pmom = -1.0;
1327  if (genParticles.isValid()) {
1328  double mindR(999.9);
1329  for (const auto& p : (*genParticles)) {
1330  double dR = reco::deltaR(pTrack->eta(), pTrack->phi(), p.momentum().Eta(), p.momentum().Phi());
1331  if (dR < mindR) {
1332  mindR = dR;
1333  pmom = p.momentum().R();
1334  }
1335  }
1336  }
1337  return pmom;
1338 }
1339 
1341  std::vector<double> sumPFNallSMDQH2;
1342  sumPFNallSMDQH2.reserve(phibins_.size() * etabins_.size());
1343 
1344  for (auto eta : etabins_) {
1345  for (auto phi : phibins_) {
1346  double hadder = 0;
1347  for (const auto& pf_it : (*tower)) {
1348  if (fabs(eta - pf_it.eta()) > etahalfdist_)
1349  continue;
1350  if (fabs(reco::deltaPhi(phi, pf_it.phi())) > phihalfdist_)
1351  continue;
1352  hadder += pf_it.hadEt();
1353  }
1354  sumPFNallSMDQH2.emplace_back(hadder);
1355  }
1356  }
1357 
1358  double evt_smdq(0);
1359  std::sort(sumPFNallSMDQH2.begin(), sumPFNallSMDQH2.end());
1360  if (sumPFNallSMDQH2.size() % 2)
1361  evt_smdq = sumPFNallSMDQH2[(sumPFNallSMDQH2.size() - 1) / 2];
1362  else
1363  evt_smdq = (sumPFNallSMDQH2[sumPFNallSMDQH2.size() / 2] + sumPFNallSMDQH2[(sumPFNallSMDQH2.size() - 2) / 2]) / 2.;
1364  double rhoh = evt_smdq / (etadist_ * phidist_);
1365 #ifdef EDM_ML_DEBUG
1366  if (debug_)
1367  edm::LogVerbatim("HcalIsoTrack") << "Rho " << evt_smdq << ":" << rhoh;
1368 #endif
1369  return rhoh;
1370 }
1371 
1372 double HcalIsoTrkAnalyzer::eThreshold(const DetId& id, const CaloGeometry* geo) const {
1373  double eThr(hitEthrEB_);
1374  if (usePFThresh_) {
1375  eThr = static_cast<double>((*eThresholds_)[id]);
1376  } else {
1377  const GlobalPoint& pos = geo->getPosition(id);
1378  double eta = std::abs(pos.eta());
1379  if (id.subdetId() != EcalBarrel) {
1380  eThr = (((eta * hitEthrEE3_ + hitEthrEE2_) * eta + hitEthrEE1_) * eta + hitEthrEE0_);
1381  if (eThr < hitEthrEELo_)
1382  eThr = hitEthrEELo_;
1383  else if (eThr > hitEthrEEHi_)
1384  eThr = hitEthrEEHi_;
1385  }
1386  }
1387  return eThr;
1388 }
1389 
1391  HcalDetId hid(id);
1392  if (hep17_ && ((hid.iphi() < 63) || (hid.iphi() > 66) || (hid.zside() < 0)))
1393  return id;
1394  for (unsigned int k = 0; k < oldID_.size(); ++k) {
1395  if ((hid.subdetId() == oldDet_[k]) && (hid.ietaAbs() == oldEta_[k]) && (hid.depth() == oldDepth_[k])) {
1396  return static_cast<DetId>(HcalDetId(hid.subdet(), hid.ieta(), hid.iphi(), newDepth_[k]));
1397  }
1398  }
1399  return id;
1400 }
1401 
1403  const HcalRespCorrs* respCorrs,
1404  const std::vector<DetId>& ids,
1405  std::vector<double>& edet,
1406  double& eHcal,
1407  std::vector<unsigned int>* detIds,
1408  std::vector<double>* hitEnergies) {
1409  double ehcal(0);
1410  if (unCorrect_) {
1411  for (unsigned int k = 0; k < ids.size(); ++k) {
1412  double corr = (respCorrs->getValues(ids[k]))->getValue();
1413  if (corr != 0)
1414  edet[k] /= corr;
1415  ehcal += edet[k];
1416  }
1417  } else {
1418  for (const auto& en : edet)
1419  ehcal += en;
1420  }
1421  if ((std::abs(ehcal - eHcal) > 0.001) && (!unCorrect_))
1422  edm::LogWarning("HcalIsoTrack") << "Check inconsistent energies: " << indx << " " << eHcal << ":" << ehcal
1423  << " from " << ids.size() << " cells";
1424  eHcal = hcalScale_ * ehcal;
1425 
1426  if (collapseDepth_) {
1427  std::map<HcalDetId, double> hitMap;
1428  for (unsigned int k = 0; k < ids.size(); ++k) {
1429  HcalDetId id = hdc_->mergedDepthDetId(HcalDetId(ids[k]));
1430  auto itr = hitMap.find(id);
1431  if (itr == hitMap.end()) {
1432  hitMap[id] = edet[k];
1433  } else {
1434  (itr->second) += edet[k];
1435  }
1436  }
1437  detIds->reserve(hitMap.size());
1438  hitEnergies->reserve(hitMap.size());
1439  for (const auto& hit : hitMap) {
1440  detIds->emplace_back(hit.first.rawId());
1441  hitEnergies->emplace_back(hit.second);
1442  }
1443  } else {
1444  detIds->reserve(ids.size());
1445  hitEnergies->reserve(ids.size());
1446  for (unsigned int k = 0; k < ids.size(); ++k) {
1447  detIds->emplace_back(ids[k].rawId());
1448  hitEnergies->emplace_back(edet[k]);
1449  }
1450  }
1451 #ifdef EDM_ML_DEBUG
1452  if (debug_) {
1453  edm::LogVerbatim("HcalIsoTrack") << "Input to storeEnergy with " << ids.size() << " cells";
1454  for (unsigned int k = 0; k < ids.size(); ++k)
1455  edm::LogVerbatim("HcalIsoTrack") << "Hit [" << k << "] " << HcalDetId(ids[k]) << " E " << edet[k];
1456  edm::LogVerbatim("HcalIsoTrack") << "Output of storeEnergy with " << detIds->size() << " cells and Etot " << eHcal;
1457  for (unsigned int k = 0; k < detIds->size(); ++k)
1458  edm::LogVerbatim("HcalIsoTrack") << "Hit [" << k << "] " << HcalDetId((*detIds)[k]) << " E " << (*hitEnergies)[k];
1459  }
1460 #endif
1461 }
1462 
1464  bool flag(true);
1465  for (reco::MuonCollection::const_iterator recMuon = muonh->begin(); recMuon != muonh->end(); ++recMuon) {
1466  if (recMuon->innerTrack().isNonnull()) {
1467  const reco::Track* pTrack = (recMuon->innerTrack()).get();
1468  bool mediumMuon = (((recMuon->isPFMuon()) && (recMuon->isGlobalMuon() || recMuon->isTrackerMuon())) &&
1469  (recMuon->innerTrack()->validFraction() > 0.49));
1470  if (mediumMuon) {
1471  double chiGlobal = ((recMuon->globalTrack().isNonnull()) ? recMuon->globalTrack()->normalizedChi2() : 999);
1472  bool goodGlob = (recMuon->isGlobalMuon() && chiGlobal < 3 &&
1473  recMuon->combinedQuality().chi2LocalPosition < 12 && recMuon->combinedQuality().trkKink < 20);
1474  mediumMuon = muon::segmentCompatibility(*recMuon) > (goodGlob ? 0.303 : 0.451);
1475  }
1476  if (mediumMuon) {
1477  double dR = reco::deltaR(pTrack->eta(), pTrack->phi(), pTrack0->eta(), pTrack0->phi());
1478  if (dR < 0.1) {
1479  flag = false;
1480  break;
1481  }
1482  }
1483  }
1484  }
1485  return flag;
1486 }
1487 
1488 //define this as a plug-in
static const std::string kSharedResource
Definition: TFileService.h:76
const std::string labelHBHE_
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
const std::vector< std::string > trigNames_
double eCone_hcal(const CaloGeometry *geo, edm::Handle< T > &hits, const GlobalPoint &hpoint1, const GlobalPoint &point1, double dR, const GlobalVector &trackMom, int &nRecHits, double hbThr=-100, double heThr=-100, double hfThr=-100, double hoThr=-100, double tMin=-500, double tMax=500, int detOnly=-1, int useRaw=0, bool debug=false)
Log< level::Info, true > LogVerbatim
spr::trackSelectionParameters selectionParameter_
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
const edm::EDGetTokenT< edm::TriggerResults > tok_trigRes_
std::vector< spr::propagatedTrackID > propagateCALO(edm::Handle< reco::TrackCollection > &trkCollection, const CaloGeometry *geo, const MagneticField *bField, const std::string &theTrackQuality, bool debug=false)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
~HcalIsoTrkAnalyzer() override
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
const std::string l1TrigName_
const double maxRestrictionP_
const std::string modnam_
std::vector< int > oldEta_
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:26
HcalDetId mergedDepthDetId(const HcalDetId &id) const
const std::string labelRecVtx_
constexpr int zside() const
get the z-side of the cell (1/-1)
Definition: HcalDetId.h:141
const Point & position() const
position
Definition: BeamSpot.h:59
const edm::ESGetToken< EcalPFRecHitThresholds, EcalPFRecHitThresholdsRcd > tok_ecalPFRecHitThresholds_
TrackQuality
track quality
Definition: TrackBase.h:150
constexpr int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
const std::string labelTower_
double px() const
x coordinate of momentum vector
Definition: TrackBase.h:640
double p() const
momentum vector magnitude
Definition: TrackBase.h:631
std::vector< int > * t_ietaAll
const edm::ESGetToken< HcalTopology, HcalRecNumberingRecord > tok_htopo_
T const * product() const
Definition: Handle.h:70
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
std::vector< int > oldDepth_
const edm::ESGetToken< EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd > tok_sevlv_
double py() const
y coordinate of momentum vector
Definition: TrackBase.h:643
const std::string labelBS_
const edm::EDGetTokenT< CaloTowerCollection > tok_cala_
std::vector< double > * t_HitEnergies
double chargeIsolationCone(unsigned int trkIndex, std::vector< spr::propagatedTrackDirection > &trkDirs, double dR, int &nNearTRKs, bool debug=false)
void beginRun(edm::Run const &, edm::EventSetup const &) override
std::string const & label() const
Definition: InputTag.h:36
const edm::EDGetTokenT< reco::VertexCollection > tok_recVtx_
void storeEnergy(int indx, const HcalRespCorrs *respCorrs, const std::vector< DetId > &ids, std::vector< double > &edet, double &eHcal, std::vector< unsigned int > *detIds, std::vector< double > *hitEnergies)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
const edm::EDGetTokenT< GenEventInfoProduct > tok_ew_
std::vector< Vertex > VertexCollection
Definition: Vertex.h:31
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:31
std::vector< double > etabins_
float energy() const
Definition: TriggerObject.h:61
std::vector< unsigned int > * t_DetIds
const std::string names[nVars_]
const edm::EDGetTokenT< reco::BeamSpot > tok_bs_
std::vector< double > * t_HitEnergies1
void analyze(edm::Event const &, edm::EventSetup const &) override
const edm::ESGetToken< CaloTopology, CaloTopologyRecord > tok_caloTopology_
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
const Item * getValues(DetId fId, bool throwOnFail=true) const
const edm::InputTag extTag_
const edm::InputTag algTag_
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:21
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
double pt() const
track transverse momentum
Definition: TrackBase.h:637
constexpr HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
char const * label
const EcalPFRecHitThresholds * eThresholds_
const edm::EDGetTokenT< EcalRecHitCollection > tok_EE_
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > tok_geom_
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
std::vector< double > * t_HitEnergies3
RunNumber_t run() const
Definition: RunBase.h:40
const std::string labelGenTrack_
dictionary corr
double trackP(const reco::Track *, const edm::Handle< reco::GenParticleCollection > &)
std::array< int, 3 > fillTree(std::vector< math::XYZTLorentzVector > &vecL1, std::vector< math::XYZTLorentzVector > &vecL3, math::XYZPoint &leadPV, std::vector< spr::propagatedTrackDirection > &trkCaloDirections, std::vector< spr::propagatedTrackID > &trkCaloDets, const CaloGeometry *geo, const CaloTopology *topo, const HcalTopology *theHBHETopology, const EcalChannelStatus *theEcalChStatus, const EcalSeverityLevelAlgo *theEcalSevlv, edm::Handle< EcalRecHitCollection > &barrelRecHitsHandle, edm::Handle< EcalRecHitCollection > &endcapRecHitsHandle, edm::Handle< HBHERecHitCollection > &hbhe, edm::Handle< CaloTowerCollection > &towerHandle, edm::Handle< reco::GenParticleCollection > &genParticles, const HcalRespCorrs *respCorrs, const edm::Handle< reco::MuonCollection > &muonh)
GlobalPoint getPosition(const DetId &id) const
Get the position of a given detector id.
Definition: CaloGeometry.cc:50
unsigned int size() const
number of trigger paths in trigger table
bool goodTrack(const reco::Track *pTrack, math::XYZPoint leadPV, trackSelectionParameters parameters, bool debug=false)
std::vector< double > vec1
Definition: HCALResponse.h:15
constexpr int ieta() const
get the cell ieta
Definition: HcalDetId.h:155
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
l1t::L1TGlobalUtil * l1GtUtils_
const std::vector< std::string > & moduleLabels(unsigned int trigger) const
label(s) of module(s) on a trigger path
std::vector< bool > * t_hltbits
const edm::EDGetTokenT< reco::GenParticleCollection > tok_parts_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Transition
Definition: Transition.h:12
int id() const
getters
Definition: TriggerObject.h:51
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:649
double eCone_ecal(const CaloGeometry *geo, edm::Handle< T > &barrelhits, edm::Handle< T > &endcaphits, const GlobalPoint &hpoint1, const GlobalPoint &point1, double dR, const GlobalVector &trackMom, int &nRecHits, double ebThr=-100, double eeThr=-100, double tMin=-500, double tMax=500, bool debug=false)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
unsigned int triggerIndex(const std::string &triggerName) const
slot position of trigger path in trigger table (0 to size-1)
static std::string const triggerResults
Definition: EdmProvDump.cc:47
HLTConfigProvider hltConfig_
const std::string l3Filter_
#define M_PI
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
const edm::ESGetToken< HcalRespCorrs, HcalRespCorrsRcd > tok_resp_
const edm::EDGetTokenT< HBHERecHitCollection > tok_hbhe_
std::vector< bool > * t_trgbits
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:75
const double slopeRestrictionP_
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:652
Definition: DetId.h:17
const std::vector< int > debEvents_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
static TrackQuality qualityByName(const std::string &name)
Definition: TrackBase.cc:126
const std::string l2Filter_
const edm::EDGetTokenT< trigger::TriggerEvent > tok_trigEvt_
const std::string processName_
const edm::EDGetTokenT< reco::MuonCollection > tok_Muon_
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
std::vector< size_type > Keys
const edm::EDGetTokenT< reco::TrackCollection > tok_genTrack_
const std::string labelEB_
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
double pz() const
z coordinate of momentum vector
Definition: TrackBase.h:646
std::vector< double > phibins_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
double rhoh(const edm::Handle< CaloTowerCollection > &)
double dR(math::XYZTLorentzVector &, math::XYZTLorentzVector &)
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > tok_bFieldH_
const edm::EDGetTokenT< EcalRecHitCollection > tok_EB_
std::vector< int > oldDet_
const edm::InputTag theTriggerResultsLabel_
bool isValid() const
Definition: HandleBase.h:70
void endRun(edm::Run const &, edm::EventSetup const &) override
fixed size matrix
HLT enums.
HcalIsoTrkAnalyzer(edm::ParameterSet const &)
const edm::ESGetToken< EcalChannelStatus, EcalChannelStatusRcd > tok_ecalChStatus_
const HcalDDDRecConstants * hdc_
reco::TrackBase::TrackQuality minQuality
const edm::EDGetTokenT< BXVector< GlobalAlgBlk > > tok_alg_
const edm::ESGetToken< HcalDDDRecConstants, HcalRecNumberingRecord > tok_ddrec_
const std::vector< std::pair< std::string, bool > > & decisionsFinal()
const JetExtendedData & getValue(const Container &, const reco::JetBaseRef &)
get value for the association. Throw exception if no association found
std::vector< unsigned int > * t_DetIds1
const std::string prdnam_
Definition: tree.py:1
const std::vector< int > newDepth_
const edm::InputTag triggerEvent_
Log< level::Warning, false > LogWarning
std::vector< int > * t_ietaGood
void beginJob() override
std::vector< vec1 > vec2
Definition: HCALResponse.h:16
std::vector< unsigned int > * t_DetIds3
double eThreshold(const DetId &id, const CaloGeometry *geo) const
const std::vector< int > oldID_
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
int events
const std::string labelEE_
const std::string labelMuon_
void retrieveL1(const edm::Event &iEvent, const edm::EventSetup &evSetup)
initialize the class (mainly reserve)
Definition: Run.h:45
bool notaMuon(const reco::Track *pTrack0, const edm::Handle< reco::MuonCollection > &muonh)
DetId newId(const DetId &)
const std::string l1Filter_
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)
const std::string theTrackQuality_
std::vector< int > * t_trackType
constexpr int depth() const
get the tower depth
Definition: HcalDetId.h:164