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