CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
AlCaHcalIsotrkProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 
3 // system include files
4 #include <algorithm>
5 #include <atomic>
6 #include <memory>
7 #include <string>
8 #include <cmath>
9 #include <iostream>
10 #include <sstream>
11 #include <fstream>
12 #include <vector>
13 
14 // user include files
21 
25 
55 
64 
73 
78 
79 //#define EDM_ML_DEBUG
80 //
81 // class declaration
82 //
83 
84 namespace alcaHcalIsoTracks {
85  struct Counters {
86  Counters() : nAll_(0), nGood_(0), nRange_(0) {}
87  mutable std::atomic<unsigned int> nAll_, nGood_, nRange_;
88  };
89 } // namespace alcaHcalIsoTracks
90 
91 class AlCaHcalIsotrkProducer : public edm::stream::EDProducer<edm::GlobalCache<alcaHcalIsoTracks::Counters>> {
92 public:
94  ~AlCaHcalIsotrkProducer() override = default;
95 
96  static std::unique_ptr<alcaHcalIsoTracks::Counters> initializeGlobalCache(edm::ParameterSet const&) {
97  return std::make_unique<alcaHcalIsoTracks::Counters>();
98  }
99 
100  void produce(edm::Event&, edm::EventSetup const&) override;
101  void endStream() override;
103  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
104 
105 private:
106  void beginRun(edm::Run const&, edm::EventSetup const&) override;
107  void endRun(edm::Run const&, edm::EventSetup const&) override;
108  std::array<int, 3> getProducts(int goodPV,
109  double eventWeight,
110  std::vector<math::XYZTLorentzVector>& vecL1,
111  std::vector<math::XYZTLorentzVector>& vecL3,
112  math::XYZPoint& leadPV,
113  std::vector<spr::propagatedTrackDirection>& trkCaloDirections,
114  std::vector<spr::propagatedTrackID>& trkCaloDets,
115  const CaloGeometry* geo,
116  const CaloTopology* topo,
117  const HcalTopology* theHBHETopology,
118  const EcalChannelStatus* theEcalChStatus,
119  const EcalSeverityLevelAlgo* theEcalSevlv,
120  edm::Handle<EcalRecHitCollection>& barrelRecHitsHandle,
121  edm::Handle<EcalRecHitCollection>& endcapRecHitsHandle,
125  const HcalRespCorrs* respCorrs,
127  std::vector<HcalIsoTrkCalibVariables>& hocalib,
128  HcalIsoTrkEventVariables& hocalibEvent);
131  double rhoh(const edm::Handle<CaloTowerCollection>&);
132  double eThreshold(const DetId& id, const CaloGeometry* geo) const;
133  DetId newId(const DetId&);
134  void storeEnergy(const HcalRespCorrs* respCorrs,
135  const std::vector<DetId>& ids,
136  std::vector<double>& edet,
137  double& eHcal,
138  std::vector<unsigned int>& detIds,
139  std::vector<double>& hitEnergies);
140  std::pair<double, double> storeEnergy(const HcalRespCorrs* respCorrs,
142  const std::vector<DetId>& ids,
143  std::vector<double>& hitEnergy1,
144  std::vector<double>& hitEnergy2);
145  bool notaMuon(const reco::Track* pTrack0, const edm::Handle<reco::MuonCollection>& muonh);
146 
147  // ----------member data ---------------------------
150  unsigned int nRun_, nAll_, nGood_, nRange_;
151  const std::vector<std::string> trigNames_;
160  const double pTrackLow_, pTrackHigh_;
164  const double hitEthrEE2_, hitEthrEE3_;
165  const double hitEthrEELo_, hitEthrEEHi_;
169  const std::vector<int> oldID_, newDepth_;
170  const bool hep17_;
172  const std::vector<int> debEvents_;
173 
176  std::vector<double> etabins_, phibins_;
177  std::vector<int> oldDet_, oldEta_, oldDepth_;
179 
193 
202 
203  bool debug_;
204 };
205 
208  : nRun_(0),
209  nAll_(0),
210  nGood_(0),
211  nRange_(0),
212  trigNames_(iConfig.getParameter<std::vector<std::string>>("triggers")),
213  theTrackQuality_(iConfig.getParameter<std::string>("trackQuality")),
214  processName_(iConfig.getParameter<std::string>("processName")),
215  l1Filter_(iConfig.getParameter<std::string>("l1Filter")),
216  l2Filter_(iConfig.getParameter<std::string>("l2Filter")),
217  l3Filter_(iConfig.getParameter<std::string>("l3Filter")),
218  a_coneR_(iConfig.getParameter<double>("coneRadius")),
219  a_mipR_(iConfig.getParameter<double>("coneRadiusMIP")),
220  a_mipR2_(iConfig.getParameter<double>("coneRadiusMIP2")),
221  a_mipR3_(iConfig.getParameter<double>("coneRadiusMIP3")),
222  a_mipR4_(iConfig.getParameter<double>("coneRadiusMIP4")),
223  a_mipR5_(iConfig.getParameter<double>("coneRadiusMIP5")),
224  pTrackMin_(iConfig.getParameter<double>("minimumTrackP")),
225  eEcalMax_(iConfig.getParameter<double>("maximumEcalEnergy")),
226  maxRestrictionP_(iConfig.getParameter<double>("maxTrackP")),
227  slopeRestrictionP_(iConfig.getParameter<double>("slopeTrackP")),
228  hcalScale_(iConfig.getUntrackedParameter<double>("hHcalScale", 1.0)),
229  eIsolate1_(iConfig.getParameter<double>("isolationEnergyTight")),
230  eIsolate2_(iConfig.getParameter<double>("isolationEnergyLoose")),
231  pTrackLow_(iConfig.getParameter<double>("momentumLow")),
232  pTrackHigh_(iConfig.getParameter<double>("momentumHigh")),
233  ignoreTrigger_(iConfig.getUntrackedParameter<bool>("ignoreTriggers", false)),
234  useL1Trigger_(iConfig.getUntrackedParameter<bool>("useL1Trigger", false)),
235  unCorrect_(iConfig.getUntrackedParameter<bool>("unCorrect", false)),
236  collapseDepth_(iConfig.getUntrackedParameter<bool>("collapseDepth", false)),
237  hitEthrEB_(iConfig.getParameter<double>("EBHitEnergyThreshold")),
238  hitEthrEE0_(iConfig.getParameter<double>("EEHitEnergyThreshold0")),
239  hitEthrEE1_(iConfig.getParameter<double>("EEHitEnergyThreshold1")),
240  hitEthrEE2_(iConfig.getParameter<double>("EEHitEnergyThreshold2")),
241  hitEthrEE3_(iConfig.getParameter<double>("EEHitEnergyThreshold3")),
242  hitEthrEELo_(iConfig.getParameter<double>("EEHitEnergyThresholdLow")),
243  hitEthrEEHi_(iConfig.getParameter<double>("EEHitEnergyThresholdHigh")),
244  triggerEvent_(iConfig.getParameter<edm::InputTag>("labelTriggerEvent")),
245  theTriggerResultsLabel_(iConfig.getParameter<edm::InputTag>("labelTriggerResult")),
246  labelGenTrack_(iConfig.getParameter<std::string>("labelTrack")),
247  labelRecVtx_(iConfig.getParameter<std::string>("labelVertex")),
248  labelEB_(iConfig.getParameter<std::string>("labelEBRecHit")),
249  labelEE_(iConfig.getParameter<std::string>("labelEERecHit")),
250  labelHBHE_(iConfig.getParameter<std::string>("labelHBHERecHit")),
251  labelTower_(iConfig.getParameter<std::string>("labelCaloTower")),
252  l1TrigName_(iConfig.getUntrackedParameter<std::string>("l1TrigName", "L1_SingleJet60")),
253  oldID_(iConfig.getUntrackedParameter<std::vector<int>>("oldID")),
254  newDepth_(iConfig.getUntrackedParameter<std::vector<int>>("newDepth")),
255  hep17_(iConfig.getUntrackedParameter<bool>("hep17")),
256  labelIsoTkVar_(iConfig.getParameter<std::string>("isoTrackLabel")),
257  labelIsoTkEvtVar_(iConfig.getParameter<std::string>("isoTrackEventLabel")),
258  debEvents_(iConfig.getParameter<std::vector<int>>("debugEvents")) {
259  // Get the run parameters
260  const double isolationRadius(28.9), innerR(10.0), outerR(30.0);
262  selectionParameter_.minPt = iConfig.getParameter<double>("minTrackPt");
263  selectionParameter_.maxChi2 = iConfig.getParameter<double>("maxChi2");
264  selectionParameter_.maxDpOverP = iConfig.getParameter<double>("maxDpOverP");
265  selectionParameter_.minOuterHit = iConfig.getParameter<int>("minOuterHit");
266  selectionParameter_.minLayerCrossed = iConfig.getParameter<int>("minLayerCrossed");
267  selectionParameter_.maxInMiss = iConfig.getParameter<int>("maxInMiss");
268  selectionParameter_.minQuality = trackQuality_;
269  selectionParameter_.maxDxyPV = iConfig.getParameter<double>("maxDxyPV");
270  selectionParameter_.maxDzPV = iConfig.getParameter<double>("maxDzPV");
271  selectionParameter_.maxChi2 = iConfig.getParameter<double>("maxChi2");
272  selectionParameter_.maxDpOverP = iConfig.getParameter<double>("maxDpOverP");
273  selectionParameter_.minOuterHit = iConfig.getParameter<int>("minOuterHit");
274  selectionParameter_.minLayerCrossed = iConfig.getParameter<int>("minLayerCrossed");
275  selectionParameter_.maxInMiss = iConfig.getParameter<int>("maxInMiss");
276  selectionParameter_.maxOutMiss = iConfig.getParameter<int>("maxOutMiss");
277  a_charIsoR_ = a_coneR_ + isolationRadius;
278  a_coneR1_ = a_coneR_ + innerR;
279  a_coneR2_ = a_coneR_ + outerR;
280  // Different isolation cuts are described in DN-2016/029
281  // Tight cut uses 2 GeV; Loose cut uses 10 GeV
282  // Eta dependent cut uses (maxRestrictionP_ * exp(|ieta|*log(2.5)/18))
283  // with the factor for exponential slopeRestrictionP_ = log(2.5)/18
284  // maxRestrictionP_ = 8 GeV as came from a study
285  std::string labelBS = iConfig.getParameter<std::string>("labelBeamSpot");
286  edm::InputTag algTag = iConfig.getParameter<edm::InputTag>("algInputTag");
287  edm::InputTag extTag = iConfig.getParameter<edm::InputTag>("extInputTag");
288  std::string labelMuon = iConfig.getParameter<std::string>("labelMuon");
289 
290  for (unsigned int k = 0; k < oldID_.size(); ++k) {
291  oldDet_.emplace_back((oldID_[k] / 10000) % 10);
292  oldEta_.emplace_back((oldID_[k] / 100) % 100);
293  oldDepth_.emplace_back(oldID_[k] % 100);
294  }
295  l1GtUtils_ = new l1t::L1TGlobalUtil(iConfig, consumesCollector(), *this, algTag, extTag, l1t::UseEventSetupIn::Event);
296  // define tokens for access
297  tok_trigEvt_ = consumes<trigger::TriggerEvent>(triggerEvent_);
298  tok_trigRes_ = consumes<edm::TriggerResults>(theTriggerResultsLabel_);
299  tok_bs_ = consumes<reco::BeamSpot>(labelBS);
300  tok_genTrack_ = consumes<reco::TrackCollection>(labelGenTrack_);
301  tok_ew_ = consumes<GenEventInfoProduct>(edm::InputTag("generator"));
302  tok_parts_ = consumes<reco::GenParticleCollection>(edm::InputTag("genParticles"));
303  tok_cala_ = consumes<CaloTowerCollection>(labelTower_);
304  tok_alg_ = consumes<BXVector<GlobalAlgBlk>>(algTag);
305  tok_Muon_ = consumes<reco::MuonCollection>(labelMuon);
306  tok_recVtx_ = consumes<reco::VertexCollection>(labelRecVtx_);
307  tok_EB_ = consumes<EcalRecHitCollection>(edm::InputTag("ecalRecHit", labelEB_));
308  tok_EE_ = consumes<EcalRecHitCollection>(edm::InputTag("ecalRecHit", labelEE_));
309  tok_hbhe_ = consumes<HBHERecHitCollection>(labelHBHE_);
310  edm::LogVerbatim("HcalIsoTrack") << "Labels used " << triggerEvent_ << " " << theTriggerResultsLabel_ << " "
311  << labelBS << " " << labelRecVtx_ << " " << labelGenTrack_ << " "
312  << edm::InputTag("ecalRecHit", labelEB_) << " "
313  << edm::InputTag("ecalRecHit", labelEE_) << " " << labelHBHE_ << " " << labelTower_
314  << " " << labelMuon;
315 
316  tok_ddrec_ = esConsumes<HcalDDDRecConstants, HcalRecNumberingRecord, edm::Transition::BeginRun>();
317  tok_bFieldH_ = esConsumes<MagneticField, IdealMagneticFieldRecord>();
318  tok_ecalChStatus_ = esConsumes<EcalChannelStatus, EcalChannelStatusRcd>();
319  tok_sevlv_ = esConsumes<EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd>();
320  tok_geom_ = esConsumes<CaloGeometry, CaloGeometryRecord>();
321  tok_caloTopology_ = esConsumes<CaloTopology, CaloTopologyRecord>();
322  tok_htopo_ = esConsumes<HcalTopology, HcalRecNumberingRecord>();
323  tok_resp_ = esConsumes<HcalRespCorrs, HcalRespCorrsRcd>();
324 
325  edm::LogVerbatim("HcalIsoTrack") << "Parameters read from config file \n"
326  << "\t minPt " << selectionParameter_.minPt << "\t theTrackQuality "
327  << theTrackQuality_ << "\t minQuality " << selectionParameter_.minQuality
328  << "\t maxDxyPV " << selectionParameter_.maxDxyPV << "\t maxDzPV "
330  << "\t maxDpOverP " << selectionParameter_.maxDpOverP << "\t minOuterHit "
331  << selectionParameter_.minOuterHit << "\t minLayerCrossed "
332  << selectionParameter_.minLayerCrossed << "\t maxInMiss "
333  << selectionParameter_.maxInMiss << "\t maxOutMiss "
334  << selectionParameter_.maxOutMiss << "\t a_coneR " << a_coneR_ << ":" << a_coneR1_
335  << ":" << a_coneR2_ << "\t a_charIsoR " << a_charIsoR_ << "\t a_mipR " << a_mipR_
336  << "\t a_mipR2 " << a_mipR2_ << "\t a_mipR3 " << a_mipR3_ << "\t a_mipR4 "
337  << a_mipR4_ << "\t a_mipR5 " << a_mipR5_ << "\n pTrackMin_ " << pTrackMin_
338  << "\t eEcalMax_ " << eEcalMax_ << "\t maxRestrictionP_ " << maxRestrictionP_
339  << "\t slopeRestrictionP_ " << slopeRestrictionP_ << "\t eIsolateStrong_ "
340  << eIsolate1_ << "\t eIsolateSoft_ " << eIsolate2_ << "\t hcalScale_ " << hcalScale_
341  << "\n\t momentumLow_ " << pTrackLow_ << "\t momentumHigh_ " << pTrackHigh_
342  << "\n\t ignoreTrigger_ " << ignoreTrigger_ << "\n\t useL1Trigger_ " << useL1Trigger_
343  << "\t unCorrect_ " << unCorrect_ << "\t collapseDepth_ " << collapseDepth_
344  << "\t L1TrigName_ " << l1TrigName_ << "\nThreshold for EB " << hitEthrEB_
345  << " EE " << hitEthrEE0_ << ":" << hitEthrEE1_ << ":" << hitEthrEE2_ << ":"
346  << hitEthrEE3_ << ":" << hitEthrEELo_ << ":" << hitEthrEEHi_;
347  edm::LogVerbatim("HcalIsoTrack") << "Process " << processName_ << " L1Filter:" << l1Filter_
348  << " L2Filter:" << l2Filter_ << " L3Filter:" << l3Filter_ << " and "
349  << debEvents_.size() << " events to be debugged";
350  for (unsigned int k = 0; k < trigNames_.size(); ++k) {
351  edm::LogVerbatim("HcalIsoTrack") << "Trigger[" << k << "] " << trigNames_[k];
352  }
353  edm::LogVerbatim("HcalIsoTrack") << oldID_.size() << " DetIDs to be corrected with HEP17 flag:" << hep17_;
354  for (unsigned int k = 0; k < oldID_.size(); ++k)
355  edm::LogVerbatim("HcalIsoTrack") << "[" << k << "] Det " << oldDet_[k] << " EtaAbs " << oldEta_[k] << " Depth "
356  << oldDepth_[k] << ":" << newDepth_[k];
357 
358  for (int i = 0; i < 10; i++)
359  phibins_.push_back(-M_PI + 0.1 * (2 * i + 1) * M_PI);
360  for (int i = 0; i < 8; ++i)
361  etabins_.push_back(-2.1 + 0.6 * i);
362  etadist_ = etabins_[1] - etabins_[0];
363  phidist_ = phibins_[1] - phibins_[0];
364  etahalfdist_ = 0.5 * etadist_;
365  phihalfdist_ = 0.5 * phidist_;
366  edm::LogVerbatim("HcalIsoTrack") << "EtaDist " << etadist_ << " " << etahalfdist_ << " PhiDist " << phidist_ << " "
367  << phihalfdist_;
368  //create also IsolatedPixelTrackCandidateCollection which contains isolation info and reference to primary track
369  produces<HcalIsoTrkCalibVariablesCollection>(labelIsoTkVar_);
370  produces<HcalIsoTrkEventVariablesCollection>(labelIsoTkEvtVar_);
371  edm::LogVerbatim("HcalIsoTrack") << " Expected to produce the collections:\n"
372  << "HcalIsoTrkCalibVariablesCollection with label " << labelIsoTkVar_
373  << "\nand HcalIsoTrkEventVariablesCollection with label " << labelIsoTkEvtVar_;
374 }
375 
378  desc.add<std::string>("processName", "HLT");
379  std::vector<std::string> trig;
380  desc.add<std::vector<std::string>>("triggers", trig);
381  desc.add<std::string>("l1Filter", "");
382  desc.add<std::string>("l2Filter", "L2Filter");
383  desc.add<std::string>("l3Filter", "Filter");
384  // following 10 parameters are parameters to select good tracks
385  desc.add<std::string>("trackQuality", "highPurity");
386  desc.add<double>("minTrackPt", 1.0);
387  desc.add<double>("maxDxyPV", 0.02);
388  desc.add<double>("maxDzPV", 0.02);
389  desc.add<double>("maxChi2", 5.0);
390  desc.add<double>("maxDpOverP", 0.1);
391  desc.add<int>("minOuterHit", 4);
392  desc.add<int>("minLayerCrossed", 8);
393  desc.add<int>("maxInMiss", 0);
394  desc.add<int>("maxOutMiss", 0);
395  // Minimum momentum of selected isolated track and signal zone
396  desc.add<double>("minimumTrackP", 10.0);
397  desc.add<double>("coneRadius", 34.98);
398  // signal zone in ECAL and MIP energy cutoff
399  desc.add<double>("coneRadiusMIP", 14.0);
400  desc.add<double>("coneRadiusMIP2", 18.0);
401  desc.add<double>("coneRadiusMIP3", 20.0);
402  desc.add<double>("coneRadiusMIP4", 22.0);
403  desc.add<double>("coneRadiusMIP5", 24.0);
404  desc.add<double>("maximumEcalEnergy", 2.0);
405  // following 4 parameters are for isolation cuts and described in the code
406  desc.add<double>("maxTrackP", 8.0);
407  desc.add<double>("slopeTrackP", 0.05090504066);
408  desc.add<double>("isolationEnergyTight", 2.0);
409  desc.add<double>("isolationEnergyLoose", 10.0);
410  // energy thershold for ECAL (from Egamma group)
411  desc.add<double>("EBHitEnergyThreshold", 0.08);
412  desc.add<double>("EEHitEnergyThreshold0", 0.30);
413  desc.add<double>("EEHitEnergyThreshold1", 0.00);
414  desc.add<double>("EEHitEnergyThreshold2", 0.00);
415  desc.add<double>("EEHitEnergyThreshold3", 0.00);
416  desc.add<double>("EEHitEnergyThresholdLow", 0.30);
417  desc.add<double>("EEHitEnergyThresholdHigh", 0.30);
418  // prescale factors
419  desc.add<double>("momentumLow", 40.0);
420  desc.add<double>("momentumHigh", 60.0);
421  desc.add<int>("prescaleLow", 1);
422  desc.add<int>("prescaleHigh", 1);
423  // various labels for collections used in the code
424  desc.add<edm::InputTag>("labelTriggerEvent", edm::InputTag("hltTriggerSummaryAOD", "", "HLT"));
425  desc.add<edm::InputTag>("labelTriggerResult", edm::InputTag("TriggerResults", "", "HLT"));
426  desc.add<std::string>("labelTrack", "generalTracks");
427  desc.add<std::string>("labelVertex", "offlinePrimaryVertices");
428  desc.add<std::string>("labelEBRecHit", "EcalRecHitsEB");
429  desc.add<std::string>("labelEERecHit", "EcalRecHitsEE");
430  desc.add<std::string>("labelHBHERecHit", "hbhereco");
431  desc.add<std::string>("labelBeamSpot", "offlineBeamSpot");
432  desc.add<std::string>("labelCaloTower", "towerMaker");
433  desc.add<std::string>("labelMuon", "muons");
434  desc.add<edm::InputTag>("algInputTag", edm::InputTag("gtStage2Digis"));
435  desc.add<edm::InputTag>("extInputTag", edm::InputTag("gtStage2Digis"));
436  desc.add<std::string>("isoTrackLabel", "HcalIsoTrack");
437  desc.add<std::string>("isoTrackEventLabel", "HcalIsoTrackEvent");
438  // Various flags used for selecting tracks, choice of energy Method2/0
439  // Data type 0/1 for single jet trigger or others
440  desc.addUntracked<bool>("ignoreTriggers", false);
441  desc.addUntracked<bool>("useL1Trigger", false);
442  desc.addUntracked<double>("hcalScale", 1.0);
443  desc.addUntracked<bool>("unCorrect", false);
444  desc.addUntracked<bool>("collapseDepth", false);
445  desc.addUntracked<std::string>("l1TrigName", "L1_SingleJet60");
446  std::vector<int> dummy;
447  desc.addUntracked<std::vector<int>>("oldID", dummy);
448  desc.addUntracked<std::vector<int>>("newDepth", dummy);
449  desc.addUntracked<bool>("hep17", false);
450  std::vector<int> events;
451  desc.add<std::vector<int>>("debugEvents", events);
452  descriptions.add("alcaHcalIsotrkProducer", desc);
453 }
454 
456  nAll_++;
457  debug_ = (debEvents_.empty())
458  ? true
459  : (std::find(debEvents_.begin(), debEvents_.end(), iEvent.id().event()) != debEvents_.end());
460 #ifdef EDM_ML_DEBUG
461  if (debug_)
462  edm::LogVerbatim("HcalIsoTrack") << "Run " << iEvent.id().run() << " Event " << iEvent.id().event()
463  << " Luminosity " << iEvent.luminosityBlock() << " Bunch "
464  << iEvent.bunchCrossing();
465 #endif
466 
467  HcalIsoTrkEventVariables isoTrkEvent;
468  //Step1: Get all the relevant containers
469  const MagneticField* bField = &iSetup.getData(tok_bFieldH_);
470  const EcalChannelStatus* theEcalChStatus = &iSetup.getData(tok_ecalChStatus_);
471  const EcalSeverityLevelAlgo* theEcalSevlv = &iSetup.getData(tok_sevlv_);
472 
473  // get handles to calogeometry and calotopology
474  const CaloGeometry* geo = &iSetup.getData(tok_geom_);
475  const CaloTopology* caloTopology = &iSetup.getData(tok_caloTopology_);
476  const HcalTopology* theHBHETopology = &iSetup.getData(tok_htopo_);
477  const HcalRespCorrs* respCorrs = &iSetup.getData(tok_resp_);
478  bool okC(true);
479  //Get track collection
480  auto trkCollection = iEvent.getHandle(tok_genTrack_);
481  if (!trkCollection.isValid()) {
482  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelGenTrack_;
483  okC = false;
484  }
485 
486  //Get muon collection
487  auto const& muonh = iEvent.getHandle(tok_Muon_);
488 
489  //Define the best vertex and the beamspot
490  auto const& recVtxs = iEvent.getHandle(tok_recVtx_);
491  auto const& beamSpotH = iEvent.getHandle(tok_bs_);
492  math::XYZPoint leadPV(0, 0, 0);
493  int goodPV(0);
494  if (recVtxs.isValid() && !(recVtxs->empty())) {
495  isoTrkEvent.allvertex_ = recVtxs->size();
496  for (unsigned int k = 0; k < recVtxs->size(); ++k) {
497  if (!((*recVtxs)[k].isFake()) && ((*recVtxs)[k].ndof() > 4)) {
498  if (goodPV == 0)
499  leadPV = math::XYZPoint((*recVtxs)[k].x(), (*recVtxs)[k].y(), (*recVtxs)[k].z());
500  goodPV++;
501  }
502  }
503  }
504  if (goodPV == 0 && beamSpotH.isValid()) {
505  leadPV = beamSpotH->position();
506  }
507 #ifdef EDM_ML_DEBUG
508  if (debug_) {
509  edm::LogVerbatim("HcalIsoTrack") << "Primary Vertex " << leadPV << " out of " << goodPV << " vertex";
510  if (beamSpotH.isValid())
511  edm::LogVerbatim("HcalIsoTrack") << " Beam Spot " << beamSpotH->position();
512  }
513 #endif
514 
515  // RecHits
516  auto barrelRecHitsHandle = iEvent.getHandle(tok_EB_);
517  if (!barrelRecHitsHandle.isValid()) {
518  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelEB_;
519  okC = false;
520  }
521  auto endcapRecHitsHandle = iEvent.getHandle(tok_EE_);
522  if (!endcapRecHitsHandle.isValid()) {
523  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelEE_;
524  okC = false;
525  }
526  auto hbhe = iEvent.getHandle(tok_hbhe_);
527  if (!hbhe.isValid()) {
528  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelHBHE_;
529  okC = false;
530  }
531  auto caloTower = iEvent.getHandle(tok_cala_);
532 
533  //=== genParticle information
534  auto const& genParticles = iEvent.getHandle(tok_parts_);
535  auto const& genEventInfo = iEvent.getHandle(tok_ew_);
536  double eventWeight = (genEventInfo.isValid()) ? genEventInfo->weight() : 1.0;
537 
538  //Propagate tracks to calorimeter surface)
539  std::vector<spr::propagatedTrackDirection> trkCaloDirections;
540  spr::propagateCALO(trkCollection, geo, bField, theTrackQuality_, trkCaloDirections, false);
541  std::vector<spr::propagatedTrackID> trkCaloDets;
542  spr::propagateCALO(trkCollection, geo, bField, theTrackQuality_, trkCaloDets, false);
543  std::vector<math::XYZTLorentzVector> vecL1, vecL3;
544  isoTrkEvent.tracks_ = trkCollection->size();
545  isoTrkEvent.tracksProp_ = trkCaloDirections.size();
546  isoTrkEvent.hltbits_.assign(trigNames_.size(), false);
547 
548  if (!ignoreTrigger_) {
549  //L1
550  l1GtUtils_->retrieveL1(iEvent, iSetup, tok_alg_);
551  const std::vector<std::pair<std::string, bool>>& finalDecisions = l1GtUtils_->decisionsFinal();
552  for (const auto& decision : finalDecisions) {
553  if (decision.first.find(l1TrigName_) != std::string::npos) {
554  isoTrkEvent.l1Bit_ = decision.second;
555  break;
556  }
557  }
558 #ifdef EDM_ML_DEBUG
559  if (debug_)
560  edm::LogVerbatim("HcalIsoTrack") << "Trigger Information for " << l1TrigName_ << " is " << isoTrkEvent.l1Bit_
561  << " from a list of " << finalDecisions.size() << " decisions";
562 #endif
563 
564  //HLT
565  auto const& triggerResults = iEvent.getHandle(tok_trigRes_);
566  if (triggerResults.isValid()) {
568  const std::vector<std::string>& names = triggerNames.triggerNames();
569  if (!trigNames_.empty()) {
570  for (unsigned int iHLT = 0; iHLT < triggerResults->size(); iHLT++) {
571  int hlt = triggerResults->accept(iHLT);
572  for (unsigned int i = 0; i < trigNames_.size(); ++i) {
573  if (names[iHLT].find(trigNames_[i]) != std::string::npos) {
574  isoTrkEvent.hltbits_[i] = (hlt > 0);
575  if (hlt > 0)
576  isoTrkEvent.trigPass_ = true;
577 #ifdef EDM_ML_DEBUG
578  if (debug_)
579  edm::LogVerbatim("HcalIsoTrack")
580  << "This trigger " << names[iHLT] << " Flag " << hlt << ":" << isoTrkEvent.hltbits_[i];
581 #endif
582  }
583  }
584  }
585  }
586  }
587 #ifdef EDM_ML_DEBUG
588  if (debug_)
589  edm::LogVerbatim("HcalIsoTrack") << "HLT Information shows " << isoTrkEvent.trigPass_ << ":" << trigNames_.empty()
590  << ":" << okC;
591 #endif
592  }
593 
594  auto outputHcalIsoTrackColl = std::make_unique<HcalIsoTrkCalibVariablesCollection>();
595  std::array<int, 3> ntksave{{0, 0, 0}};
596  if (ignoreTrigger_ || useL1Trigger_) {
597  if (ignoreTrigger_ || isoTrkEvent.l1Bit_)
598  ntksave = getProducts(goodPV,
599  eventWeight,
600  vecL1,
601  vecL3,
602  leadPV,
603  trkCaloDirections,
604  trkCaloDets,
605  geo,
606  caloTopology,
607  theHBHETopology,
608  theEcalChStatus,
609  theEcalSevlv,
610  barrelRecHitsHandle,
611  endcapRecHitsHandle,
612  hbhe,
613  caloTower,
614  genParticles,
615  respCorrs,
616  muonh,
617  *outputHcalIsoTrackColl,
618  isoTrkEvent);
619  isoTrkEvent.tracksSaved_ = ntksave[0];
620  isoTrkEvent.tracksLoose_ = ntksave[1];
621  isoTrkEvent.tracksTight_ = ntksave[2];
622  } else {
623  trigger::TriggerEvent triggerEvent;
624  auto const& triggerEventHandle = iEvent.getHandle(tok_trigEvt_);
625  if (!triggerEventHandle.isValid()) {
626  edm::LogWarning("HcalIsoTrack") << "Error! Can't get the product " << triggerEvent_.label();
627  } else if (okC) {
628  triggerEvent = *(triggerEventHandle.product());
629  const trigger::TriggerObjectCollection& TOC(triggerEvent.getObjects());
630  bool done(false);
631  auto const& triggerResults = iEvent.getHandle(tok_trigRes_);
632  if (triggerResults.isValid()) {
633  std::vector<std::string> modules;
635  const std::vector<std::string>& names = triggerNames.triggerNames();
636  for (unsigned int iHLT = 0; iHLT < triggerResults->size(); iHLT++) {
637  bool ok = (isoTrkEvent.trigPass_) || (trigNames_.empty());
638  if (ok) {
639  unsigned int triggerindx = hltConfig_.triggerIndex(names[iHLT]);
640  const std::vector<std::string>& moduleLabels(hltConfig_.moduleLabels(triggerindx));
641  std::vector<math::XYZTLorentzVector> vecL2;
642  vecL1.clear();
643  vecL3.clear();
644  //loop over all trigger filters in event (i.e. filters passed)
645  for (unsigned int ifilter = 0; ifilter < triggerEvent.sizeFilters(); ++ifilter) {
646  std::vector<int> Keys;
647  std::string label = triggerEvent.filterTag(ifilter).label();
648  //loop over keys to objects passing this filter
649  for (unsigned int imodule = 0; imodule < moduleLabels.size(); imodule++) {
650  if (label.find(moduleLabels[imodule]) != std::string::npos) {
651 #ifdef EDM_ML_DEBUG
652  if (debug_)
653  edm::LogVerbatim("HcalIsoTrack") << "FilterName " << label;
654 #endif
655  for (unsigned int ifiltrKey = 0; ifiltrKey < triggerEvent.filterKeys(ifilter).size(); ++ifiltrKey) {
656  Keys.push_back(triggerEvent.filterKeys(ifilter)[ifiltrKey]);
657  const trigger::TriggerObject& TO(TOC[Keys[ifiltrKey]]);
658  math::XYZTLorentzVector v4(TO.px(), TO.py(), TO.pz(), TO.energy());
659  if (label.find(l2Filter_) != std::string::npos) {
660  vecL2.push_back(v4);
661  } else if (label.find(l3Filter_) != std::string::npos) {
662  vecL3.push_back(v4);
663  } else if ((label.find(l1Filter_) != std::string::npos) || (l1Filter_.empty())) {
664  vecL1.push_back(v4);
665  }
666 #ifdef EDM_ML_DEBUG
667  if (debug_)
668  edm::LogVerbatim("HcalIsoTrack")
669  << "key " << ifiltrKey << " : pt " << TO.pt() << " eta " << TO.eta() << " phi " << TO.phi()
670  << " mass " << TO.mass() << " Id " << TO.id();
671 #endif
672  }
673 #ifdef EDM_ML_DEBUG
674  if (debug_)
675  edm::LogVerbatim("HcalIsoTrack")
676  << "sizes " << vecL1.size() << ":" << vecL2.size() << ":" << vecL3.size();
677 #endif
678  }
679  }
680  }
681 
682  // Now Make the products for all selected tracks
683  if (!done) {
684  ntksave = getProducts(goodPV,
685  eventWeight,
686  vecL1,
687  vecL3,
688  leadPV,
689  trkCaloDirections,
690  trkCaloDets,
691  geo,
692  caloTopology,
693  theHBHETopology,
694  theEcalChStatus,
695  theEcalSevlv,
696  barrelRecHitsHandle,
697  endcapRecHitsHandle,
698  hbhe,
699  caloTower,
700  genParticles,
701  respCorrs,
702  muonh,
703  *outputHcalIsoTrackColl,
704  isoTrkEvent);
705  isoTrkEvent.tracksSaved_ += ntksave[0];
706  isoTrkEvent.tracksLoose_ += ntksave[1];
707  isoTrkEvent.tracksTight_ += ntksave[2];
708  done = true;
709  }
710  }
711  }
712  }
713  }
714  }
715  isoTrkEvent.trigPassSel_ = (isoTrkEvent.tracksSaved_ > 0);
716  if (isoTrkEvent.trigPassSel_) {
717  ++nGood_;
718  for (auto itr = outputHcalIsoTrackColl->begin(); itr != outputHcalIsoTrackColl->end(); ++itr) {
719  if (itr->p_ > pTrackLow_ && itr->p_ < pTrackHigh_)
720  ++nRange_;
721  }
722  }
723 
724  auto outputEventcol = std::make_unique<HcalIsoTrkEventVariablesCollection>();
725  outputEventcol->emplace_back(isoTrkEvent);
726  iEvent.put(std::move(outputEventcol), labelIsoTkEvtVar_);
727  iEvent.put(std::move(outputHcalIsoTrackColl), labelIsoTkVar_);
728 }
729 
731  globalCache()->nAll_ += nAll_;
732  globalCache()->nGood_ += nGood_;
733  globalCache()->nRange_ += nRange_;
734 }
735 
737  edm::LogVerbatim("HcalIsoTrack") << "Finds " << count->nGood_ << " good tracks in " << count->nAll_ << " events and "
738  << count->nRange_ << " events in the momentum range";
739 }
740 
742  hdc_ = &iSetup.getData(tok_ddrec_);
743  if (!ignoreTrigger_) {
744  bool changed(false);
745  edm::LogVerbatim("HcalIsoTrack") << "Run[" << nRun_ << "] " << iRun.run() << " hltconfig.init "
746  << hltConfig_.init(iRun, iSetup, processName_, changed);
747  }
748 }
749 
751  edm::LogVerbatim("HcalIsoTrack") << "endRun [" << nRun_ << "] " << iRun.run();
752  ++nRun_;
753 }
754 
755 std::array<int, 3> AlCaHcalIsotrkProducer::getProducts(int goodPV,
756  double eventWeight,
757  std::vector<math::XYZTLorentzVector>& vecL1,
758  std::vector<math::XYZTLorentzVector>& vecL3,
759  math::XYZPoint& leadPV,
760  std::vector<spr::propagatedTrackDirection>& trkCaloDirections,
761  std::vector<spr::propagatedTrackID>& trkCaloDets,
762  const CaloGeometry* geo,
763  const CaloTopology* caloTopology,
764  const HcalTopology* theHBHETopology,
765  const EcalChannelStatus* theEcalChStatus,
766  const EcalSeverityLevelAlgo* theEcalSevlv,
767  edm::Handle<EcalRecHitCollection>& barrelRecHitsHandle,
768  edm::Handle<EcalRecHitCollection>& endcapRecHitsHandle,
772  const HcalRespCorrs* respCorrs,
774  std::vector<HcalIsoTrkCalibVariables>& hocalib,
775  HcalIsoTrkEventVariables& hocalibEvent) {
776  int nSave(0), nLoose(0), nTight(0);
777  unsigned int nTracks(0), nselTracks(0);
778  double rhohEV = (tower.isValid()) ? rhoh(tower) : 0;
779 
780  //Loop over tracks
781  std::vector<spr::propagatedTrackDirection>::const_iterator trkDetItr;
782  for (trkDetItr = trkCaloDirections.begin(), nTracks = 0; trkDetItr != trkCaloDirections.end();
783  trkDetItr++, nTracks++) {
784  const reco::Track* pTrack = &(*(trkDetItr->trkItr));
785  math::XYZTLorentzVector v4(pTrack->px(), pTrack->py(), pTrack->pz(), pTrack->p());
786  bool accept(false);
788  isoTk.eventWeight_ = eventWeight;
789  isoTk.goodPV_ = goodPV;
790  isoTk.nVtx_ = hocalibEvent.allvertex_;
791  isoTk.nTrk_ = trkCaloDirections.size();
792  isoTk.rhoh_ = rhohEV;
793  for (const auto& trig : hocalibEvent.hltbits_)
794  isoTk.trgbits_.emplace_back(trig);
795  if (!vecL1.empty()) {
796  isoTk.l1pt_ = vecL1[0].pt();
797  isoTk.l1eta_ = vecL1[0].eta();
798  isoTk.l1phi_ = vecL1[0].phi();
799  }
800  if (!vecL3.empty()) {
801  isoTk.l3pt_ = vecL3[0].pt();
802  isoTk.l3eta_ = vecL3[0].eta();
803  isoTk.l3phi_ = vecL3[0].phi();
804  }
805 
806  isoTk.p_ = pTrack->p();
807  isoTk.pt_ = pTrack->pt();
808  isoTk.phi_ = pTrack->phi();
809 #ifdef EDM_ML_DEBUG
810  if (debug_)
811  edm::LogVerbatim("HcalIsoTrack") << "This track : " << nTracks << " (pt|eta|phi|p) : " << isoTk.pt_ << "|"
812  << pTrack->eta() << "|" << isoTk.phi_ << "|" << isoTk.p_;
813  int flag(0);
814 #endif
815  isoTk.mindR2_ = 999;
816  for (unsigned int k = 0; k < vecL3.size(); ++k) {
817  double dr = dR(vecL3[k], v4);
818  if (dr < isoTk.mindR2_) {
819  isoTk.mindR2_ = dr;
820  }
821  }
822  isoTk.mindR1_ = (!vecL1.empty()) ? dR(vecL1[0], v4) : 999;
823 #ifdef EDM_ML_DEBUG
824  if (debug_)
825  edm::LogVerbatim("HcalIsoTrack") << "Closest L3 object at dr : " << isoTk.mindR2_ << " and from L1 "
826  << isoTk.mindR1_;
827 #endif
828  isoTk.ieta_ = isoTk.iphi_ = 0;
829  if (trkDetItr->okHCAL) {
830  HcalDetId detId = (HcalDetId)(trkDetItr->detIdHCAL);
831  isoTk.ieta_ = detId.ieta();
832  isoTk.iphi_ = detId.iphi();
833  if (isoTk.p_ > 40.0 && isoTk.p_ <= 60.0)
834  hocalibEvent.ietaAll_.emplace_back(isoTk.ieta_);
835  }
836  //Selection of good track
837  isoTk.selectTk_ = spr::goodTrack(pTrack, leadPV, selectionParameter_, false);
839  oneCutParameters.maxDxyPV = 10;
840  oneCutParameters.maxDzPV = 100;
841  oneCutParameters.maxInMiss = 2;
842  oneCutParameters.maxOutMiss = 2;
843  bool qltyFlag = spr::goodTrack(pTrack, leadPV, oneCutParameters, false);
844  oneCutParameters = selectionParameter_;
845  oneCutParameters.maxDxyPV = 10;
846  oneCutParameters.maxDzPV = 100;
847  isoTk.qltyMissFlag_ = spr::goodTrack(pTrack, leadPV, oneCutParameters, false);
848  oneCutParameters = selectionParameter_;
849  oneCutParameters.maxInMiss = 2;
850  oneCutParameters.maxOutMiss = 2;
851  isoTk.qltyPVFlag_ = spr::goodTrack(pTrack, leadPV, oneCutParameters, false);
852  double eIsolation = maxRestrictionP_ * exp(slopeRestrictionP_ * std::abs((double)isoTk.ieta_));
853  if (eIsolation < eIsolate1_)
854  eIsolation = eIsolate1_;
855  if (eIsolation < eIsolate2_)
856  eIsolation = eIsolate2_;
857 #ifdef EDM_ML_DEBUG
858  if (debug_)
859  edm::LogVerbatim("HcalIsoTrack") << "qltyFlag|okECAL|okHCAL : " << qltyFlag << "|" << trkDetItr->okECAL << "|"
860  << trkDetItr->okHCAL << " eIsolation " << eIsolation;
861  if (qltyFlag)
862  flag += 1;
863  if (trkDetItr->okECAL)
864  flag += 2;
865  if (trkDetItr->okHCAL)
866  flag += 4;
867 #endif
868  isoTk.qltyFlag_ = (qltyFlag && trkDetItr->okECAL && trkDetItr->okHCAL);
869  bool notMuon = (muonh.isValid()) ? notaMuon(pTrack, muonh) : true;
870 #ifdef EDM_ML_DEBUG
871  if (notMuon)
872  flag += 8;
873 #endif
874  if (isoTk.qltyFlag_ && notMuon) {
875  nselTracks++;
876  int nNearTRKs(0);
878  std::vector<DetId> eIds;
879  std::vector<double> eHit;
880 #ifdef EDM_ML_DEBUG
881  double eMipDR =
882 #endif
883  spr::eCone_ecal(geo,
884  barrelRecHitsHandle,
885  endcapRecHitsHandle,
886  trkDetItr->pointHCAL,
887  trkDetItr->pointECAL,
888  a_mipR_,
889  trkDetItr->directionECAL,
890  eIds,
891  eHit);
892  double eEcal(0);
893  for (unsigned int k = 0; k < eIds.size(); ++k) {
894  if (eHit[k] > eThreshold(eIds[k], geo))
895  eEcal += eHit[k];
896  }
897 #ifdef EDM_ML_DEBUG
898  if (debug_)
899  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << eMipDR << ":" << eEcal;
900 #endif
901  isoTk.eMipDR_.emplace_back(eEcal);
904  std::vector<DetId> eIds2;
905  std::vector<double> eHit2;
906 #ifdef EDM_ML_DEBUG
907  double eMipDR2 =
908 #endif
909  spr::eCone_ecal(geo,
910  barrelRecHitsHandle,
911  endcapRecHitsHandle,
912  trkDetItr->pointHCAL,
913  trkDetItr->pointECAL,
914  a_mipR2_,
915  trkDetItr->directionECAL,
916  eIds2,
917  eHit2);
918  double eEcal2(0);
919  for (unsigned int k = 0; k < eIds2.size(); ++k) {
920  if (eHit2[k] > eThreshold(eIds2[k], geo))
921  eEcal2 += eHit2[k];
922  }
923 #ifdef EDM_ML_DEBUG
924  if (debug_)
925  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << eMipDR2 << ":" << eEcal2;
926 #endif
927  isoTk.eMipDR_.emplace_back(eEcal2);
930  std::vector<DetId> eIds3;
931  std::vector<double> eHit3;
932 #ifdef EDM_ML_DEBUG
933  double eMipDR3 =
934 #endif
935  spr::eCone_ecal(geo,
936  barrelRecHitsHandle,
937  endcapRecHitsHandle,
938  trkDetItr->pointHCAL,
939  trkDetItr->pointECAL,
940  a_mipR3_,
941  trkDetItr->directionECAL,
942  eIds3,
943  eHit3);
944  double eEcal3(0);
945  for (unsigned int k = 0; k < eIds3.size(); ++k) {
946  if (eHit3[k] > eThreshold(eIds3[k], geo))
947  eEcal3 += eHit3[k];
948  }
949 #ifdef EDM_ML_DEBUG
950  if (debug_)
951  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << eMipDR3 << ":" << eEcal3;
952 #endif
953  isoTk.eMipDR_.emplace_back(eEcal3);
956  std::vector<DetId> eIds4;
957  std::vector<double> eHit4;
958 #ifdef EDM_ML_DEBUG
959  double eMipDR4 =
960 #endif
961  spr::eCone_ecal(geo,
962  barrelRecHitsHandle,
963  endcapRecHitsHandle,
964  trkDetItr->pointHCAL,
965  trkDetItr->pointECAL,
966  a_mipR4_,
967  trkDetItr->directionECAL,
968  eIds4,
969  eHit4);
970  double eEcal4(0);
971  for (unsigned int k = 0; k < eIds4.size(); ++k) {
972  if (eHit4[k] > eThreshold(eIds4[k], geo))
973  eEcal4 += eHit4[k];
974  }
975 #ifdef EDM_ML_DEBUG
976  if (debug_)
977  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << eMipDR4 << ":" << eEcal4;
978 #endif
979  isoTk.eMipDR_.emplace_back(eEcal4);
982  std::vector<DetId> eIds5;
983  std::vector<double> eHit5;
984 #ifdef EDM_ML_DEBUG
985  double eMipDR5 =
986 #endif
987  spr::eCone_ecal(geo,
988  barrelRecHitsHandle,
989  endcapRecHitsHandle,
990  trkDetItr->pointHCAL,
991  trkDetItr->pointECAL,
992  a_mipR5_,
993  trkDetItr->directionECAL,
994  eIds5,
995  eHit5);
996  double eEcal5(0);
997  for (unsigned int k = 0; k < eIds5.size(); ++k) {
998  if (eHit5[k] > eThreshold(eIds5[k], geo))
999  eEcal5 += eHit5[k];
1000  }
1001 #ifdef EDM_ML_DEBUG
1002  if (debug_)
1003  edm::LogVerbatim("HcalIsoTrack") << "eMIP before and after: " << eMipDR5 << ":" << eEcal5;
1004 #endif
1005  isoTk.eMipDR_.emplace_back(eEcal5);
1007 
1008  isoTk.emaxNearP_ = spr::chargeIsolationEcal(nTracks, trkCaloDets, geo, caloTopology, 15, 15);
1009  const DetId cellE(trkDetItr->detIdECAL);
1010  std::pair<double, bool> e11x11P = spr::eECALmatrix(cellE,
1011  barrelRecHitsHandle,
1012  endcapRecHitsHandle,
1013  *theEcalChStatus,
1014  geo,
1015  caloTopology,
1016  theEcalSevlv,
1017  5,
1018  5,
1019  -100.0,
1020  -100.0,
1021  -100.0,
1022  100.0);
1023  std::pair<double, bool> e15x15P = spr::eECALmatrix(cellE,
1024  barrelRecHitsHandle,
1025  endcapRecHitsHandle,
1026  *theEcalChStatus,
1027  geo,
1028  caloTopology,
1029  theEcalSevlv,
1030  7,
1031  7,
1032  -100.0,
1033  -100.0,
1034  -100.0,
1035  100.0);
1036  if (e11x11P.second && e15x15P.second) {
1037  isoTk.eAnnular_ = (e15x15P.first - e11x11P.first);
1038  } else {
1039  isoTk.eAnnular_ = -(e15x15P.first - e11x11P.first);
1040  }
1041  isoTk.hmaxNearP_ = spr::chargeIsolationCone(nTracks, trkCaloDirections, a_charIsoR_, nNearTRKs, false);
1042  const DetId cellH(trkDetItr->detIdHCAL);
1043  double h5x5 = spr::eHCALmatrix(
1044  theHBHETopology, cellH, hbhe, 2, 2, false, true, -100.0, -100.0, -100.0, -100.0, -100.0, 100.0);
1045  double h7x7 = spr::eHCALmatrix(
1046  theHBHETopology, cellH, hbhe, 3, 3, false, true, -100.0, -100.0, -100.0, -100.0, -100.0, 100.0);
1047  isoTk.hAnnular_ = h7x7 - h5x5;
1048 #ifdef EDM_ML_DEBUG
1049  if (debug_)
1050  edm::LogVerbatim("HcalIsoTrack") << "max p Near (Ecal) " << isoTk.emaxNearP_ << " (Hcal) " << isoTk.hmaxNearP_
1051  << " Annular E (Ecal) " << e11x11P.first << ":" << e15x15P.first << ":"
1052  << isoTk.eAnnular_ << " (Hcal) " << h5x5 << ":" << h7x7 << ":"
1053  << isoTk.hAnnular_;
1054  if (isoTk.eMipDR_[0] < eEcalMax_)
1055  flag += 16;
1056  if (isoTk.hmaxNearP_ < eIsolation)
1057  flag += 32;
1058 #endif
1059  isoTk.gentrackP_ = trackP(pTrack, genParticles);
1060  if (isoTk.eMipDR_[0] < eEcalMax_ && isoTk.hmaxNearP_ < eIsolation) {
1061  int nRecHits(-999), nRecHits1(-999), nRecHits3(-999);
1062  std::vector<DetId> ids, ids1, ids3;
1063  std::vector<double> edet0, edet1, edet3;
1064  isoTk.eHcal_ = spr::eCone_hcal(geo,
1065  hbhe,
1066  trkDetItr->pointHCAL,
1067  trkDetItr->pointECAL,
1068  a_coneR_,
1069  trkDetItr->directionHCAL,
1070  nRecHits,
1071  ids,
1072  edet0,
1073  0);
1074  if (!oldID_.empty()) {
1075  for (unsigned k = 0; k < ids.size(); ++k)
1076  ids[k] = newId(ids[k]);
1077  }
1078  storeEnergy(respCorrs, ids, edet0, isoTk.eHcal_, isoTk.detIds_, isoTk.hitEnergies_);
1079  std::pair<double, double> ehcal0 =
1080  storeEnergy(respCorrs, hbhe, ids, isoTk.hitEnergiesRaw_, isoTk.hitEnergiesAux_);
1081  isoTk.eHcalRaw_ = ehcal0.first;
1082  isoTk.eHcalAux_ = ehcal0.second;
1083 
1084  //----- hcal energy in the extended cone 1 (a_coneR+10) --------------
1085  isoTk.eHcal10_ = spr::eCone_hcal(geo,
1086  hbhe,
1087  trkDetItr->pointHCAL,
1088  trkDetItr->pointECAL,
1089  a_coneR1_,
1090  trkDetItr->directionHCAL,
1091  nRecHits1,
1092  ids1,
1093  edet1,
1094  0);
1095  if (!oldID_.empty()) {
1096  for (unsigned k = 0; k < ids1.size(); ++k)
1097  ids1[k] = newId(ids1[k]);
1098  }
1099  storeEnergy(respCorrs, ids1, edet1, isoTk.eHcal10_, isoTk.detIds1_, isoTk.hitEnergies1_);
1100  std::pair<double, double> ehcal1 =
1101  storeEnergy(respCorrs, hbhe, ids1, isoTk.hitEnergies1Raw_, isoTk.hitEnergies1Aux_);
1102  isoTk.eHcal10Raw_ = ehcal1.first;
1103  isoTk.eHcal10Aux_ = ehcal1.second;
1104 
1105  //----- hcal energy in the extended cone 3 (a_coneR+30) --------------
1106  isoTk.eHcal30_ = spr::eCone_hcal(geo,
1107  hbhe,
1108  trkDetItr->pointHCAL,
1109  trkDetItr->pointECAL,
1110  a_coneR2_,
1111  trkDetItr->directionHCAL,
1112  nRecHits3,
1113  ids3,
1114  edet3,
1115  0);
1116  if (!oldID_.empty()) {
1117  for (unsigned k = 0; k < ids3.size(); ++k)
1118  ids3[k] = newId(ids3[k]);
1119  }
1120  storeEnergy(respCorrs, ids3, edet3, isoTk.eHcal30_, isoTk.detIds3_, isoTk.hitEnergies3_);
1121  std::pair<double, double> ehcal3 =
1122  storeEnergy(respCorrs, hbhe, ids3, isoTk.hitEnergies3Raw_, isoTk.hitEnergies3Aux_);
1123  isoTk.eHcal30Raw_ = ehcal3.first;
1124  isoTk.eHcal30Aux_ = ehcal3.second;
1125 
1126  if (isoTk.p_ > pTrackMin_)
1127  accept = true;
1128 #ifdef EDM_ML_DEBUG
1129  if (accept)
1130  flag += 64;
1131  if (debug_) {
1132  std::string ctype = accept ? " ***** ACCEPT *****" : "";
1133  edm::LogVerbatim("HcalIsoTrack")
1134  << "This track : " << nTracks << " (pt|eta|phi|p) : " << isoTk.pt_ << "|" << pTrack->eta() << "|"
1135  << isoTk.phi_ << "|" << isoTk.p_ << " Generator Level p " << isoTk.gentrackP_;
1136  edm::LogVerbatim("HcalIsoTrack")
1137  << "e_MIP " << isoTk.eMipDR_[0] << " Chg Isolation " << isoTk.hmaxNearP_ << " eHcal" << isoTk.eHcal_
1138  << ":" << isoTk.eHcalRaw_ << ":" << isoTk.eHcalAux_ << " ieta " << isoTk.ieta_ << " Quality "
1139  << isoTk.qltyMissFlag_ << ":" << isoTk.qltyPVFlag_ << ":" << isoTk.selectTk_ << ctype;
1140  for (unsigned int ll = 0; ll < isoTk.detIds_.size(); ll++) {
1141  edm::LogVerbatim("HcalIsoTrack")
1142  << "det id is = " << HcalDetId(isoTk.detIds_[ll]) << " hit enery is = " << isoTk.hitEnergies_[ll]
1143  << " : " << isoTk.hitEnergiesRaw_[ll] << " : " << isoTk.hitEnergiesAux_[ll];
1144  }
1145  for (unsigned int ll = 0; ll < isoTk.detIds1_.size(); ll++) {
1146  edm::LogVerbatim("HcalIsoTrack")
1147  << "det id is = " << HcalDetId(isoTk.detIds1_[ll]) << " hit enery is = " << isoTk.hitEnergies1_[ll]
1148  << " : " << isoTk.hitEnergies1Raw_[ll] << " : " << isoTk.hitEnergies1Aux_[ll];
1149  }
1150  for (unsigned int ll = 0; ll < isoTk.detIds3_.size(); ll++) {
1151  edm::LogVerbatim("HcalIsoTrack")
1152  << "det id is = " << HcalDetId(isoTk.detIds3_[ll]) << " hit enery is = " << isoTk.hitEnergies3_[ll]
1153  << " : " << isoTk.hitEnergies3Raw_[ll] << " : " << isoTk.hitEnergies3Aux_[ll];
1154  }
1155  }
1156 #endif
1157  if (accept) {
1158  hocalib.emplace_back(isoTk);
1159  nSave++;
1160  int type(0);
1161  if (isoTk.eMipDR_[0] < 1.0) {
1162  if (isoTk.hmaxNearP_ < eIsolate2_) {
1163  ++nLoose;
1164  type = 1;
1165  }
1166  if (isoTk.hmaxNearP_ < eIsolate1_) {
1167  ++nTight;
1168  type = 2;
1169  }
1170  }
1171  if (isoTk.p_ > 40.0 && isoTk.p_ <= 60.0 && isoTk.selectTk_) {
1172  hocalibEvent.ietaGood_.emplace_back(isoTk.ieta_);
1173  hocalibEvent.trackType_.emplace_back(type);
1174  }
1175 #ifdef EDM_ML_DEBUG
1176  for (unsigned int k = 0; k < isoTk.trgbits_.size(); k++) {
1177  edm::LogVerbatim("HcalIsoTrack") << "trigger bit is = " << isoTk.trgbits_[k];
1178  }
1179 #endif
1180  }
1181  }
1182  }
1183 #ifdef EDM_ML_DEBUG
1184  if (debug_) {
1185  if (isoTk.eMipDR_.empty())
1186  edm::LogVerbatim("HcalIsoTrack") << "Track " << nTracks << " Selection Flag " << std::hex << flag << std::dec
1187  << " Accept " << accept << " Momentum " << isoTk.p_ << ":" << pTrackMin_;
1188  else
1189  edm::LogVerbatim("HcalIsoTrack") << "Track " << nTracks << " Selection Flag " << std::hex << flag << std::dec
1190  << " Accept " << accept << " Momentum " << isoTk.p_ << ":" << pTrackMin_
1191  << " Ecal Energy " << isoTk.eMipDR_[0] << ":" << eEcalMax_
1192  << " Charge Isolation " << isoTk.hmaxNearP_ << ":" << eIsolation;
1193  }
1194 #endif
1195  }
1196  std::array<int, 3> i3{{nSave, nLoose, nTight}};
1197  return i3;
1198 }
1199 
1201  return reco::deltaR(vec1.eta(), vec1.phi(), vec2.eta(), vec2.phi());
1202 }
1203 
1206  double pmom = -1.0;
1207  if (genParticles.isValid()) {
1208  double mindR(999.9);
1209  for (const auto& p : (*genParticles)) {
1210  double dR = reco::deltaR(pTrack->eta(), pTrack->phi(), p.momentum().Eta(), p.momentum().Phi());
1211  if (dR < mindR) {
1212  mindR = dR;
1213  pmom = p.momentum().R();
1214  }
1215  }
1216  }
1217  return pmom;
1218 }
1219 
1221  std::vector<double> sumPFNallSMDQH2;
1222  sumPFNallSMDQH2.reserve(phibins_.size() * etabins_.size());
1223  for (auto eta : etabins_) {
1224  for (auto phi : phibins_) {
1225  double hadder = 0;
1226  for (const auto& pf_it : (*tower)) {
1227  if (fabs(eta - pf_it.eta()) > etahalfdist_)
1228  continue;
1229  if (fabs(reco::deltaPhi(phi, pf_it.phi())) > phihalfdist_)
1230  continue;
1231  hadder += pf_it.hadEt();
1232  }
1233  sumPFNallSMDQH2.emplace_back(hadder);
1234  }
1235  }
1236 
1237  double evt_smdq(0);
1238  std::sort(sumPFNallSMDQH2.begin(), sumPFNallSMDQH2.end());
1239  if (sumPFNallSMDQH2.size() % 2)
1240  evt_smdq = sumPFNallSMDQH2[(sumPFNallSMDQH2.size() - 1) / 2];
1241  else
1242  evt_smdq = (sumPFNallSMDQH2[sumPFNallSMDQH2.size() / 2] + sumPFNallSMDQH2[(sumPFNallSMDQH2.size() - 2) / 2]) / 2.;
1243  double rhoh = evt_smdq / (etadist_ * phidist_);
1244 #ifdef EDM_ML_DEBUG
1245  if (debug_)
1246  edm::LogVerbatim("HcalIsoTrack") << "Rho " << evt_smdq << ":" << rhoh;
1247 #endif
1248  return rhoh;
1249 }
1250 
1251 double AlCaHcalIsotrkProducer::eThreshold(const DetId& id, const CaloGeometry* geo) const {
1252  const GlobalPoint& pos = geo->getPosition(id);
1253  double eta = std::abs(pos.eta());
1254  double eThr(hitEthrEB_);
1255  if (id.subdetId() != EcalBarrel) {
1256  eThr = (((eta * hitEthrEE3_ + hitEthrEE2_) * eta + hitEthrEE1_) * eta + hitEthrEE0_);
1257  if (eThr < hitEthrEELo_)
1258  eThr = hitEthrEELo_;
1259  else if (eThr > hitEthrEEHi_)
1260  eThr = hitEthrEEHi_;
1261  }
1262  return eThr;
1263 }
1264 
1266  HcalDetId hid(id);
1267  if (hep17_ && ((hid.iphi() < 63) || (hid.iphi() > 66) || (hid.zside() < 0)))
1268  return id;
1269  for (unsigned int k = 0; k < oldID_.size(); ++k) {
1270  if ((hid.subdetId() == oldDet_[k]) && (hid.ietaAbs() == oldEta_[k]) && (hid.depth() == oldDepth_[k])) {
1271  return static_cast<DetId>(HcalDetId(hid.subdet(), hid.ieta(), hid.iphi(), newDepth_[k]));
1272  }
1273  }
1274  return id;
1275 }
1276 
1278  const std::vector<DetId>& ids,
1279  std::vector<double>& edet,
1280  double& eHcal,
1281  std::vector<unsigned int>& detIds,
1282  std::vector<double>& hitEnergies) {
1283  double ehcal(0);
1284  if (unCorrect_) {
1285  for (unsigned int k = 0; k < ids.size(); ++k) {
1286  double corr = (respCorrs->getValues(ids[k]))->getValue();
1287  if (corr != 0)
1288  edet[k] /= corr;
1289  ehcal += edet[k];
1290  }
1291  } else {
1292  for (const auto& en : edet)
1293  ehcal += en;
1294  }
1295  if ((std::abs(ehcal - eHcal) > 0.001) && (!unCorrect_))
1296  edm::LogWarning("HcalIsoTrack") << "Check inconsistent energies: " << eHcal << ":" << ehcal << " from "
1297  << ids.size() << " cells";
1298  eHcal = hcalScale_ * ehcal;
1299 
1300  if (collapseDepth_) {
1301  std::map<HcalDetId, double> hitMap;
1302  for (unsigned int k = 0; k < ids.size(); ++k) {
1303  HcalDetId id = hdc_->mergedDepthDetId(HcalDetId(ids[k]));
1304  auto itr = hitMap.find(id);
1305  if (itr == hitMap.end()) {
1306  hitMap[id] = edet[k];
1307  } else {
1308  (itr->second) += edet[k];
1309  }
1310  }
1311  detIds.reserve(hitMap.size());
1312  hitEnergies.reserve(hitMap.size());
1313  for (const auto& hit : hitMap) {
1314  detIds.emplace_back(hit.first.rawId());
1315  hitEnergies.emplace_back(hit.second);
1316  }
1317  } else {
1318  detIds.reserve(ids.size());
1319  hitEnergies.reserve(ids.size());
1320  for (unsigned int k = 0; k < ids.size(); ++k) {
1321  detIds.emplace_back(ids[k].rawId());
1322  hitEnergies.emplace_back(edet[k]);
1323  }
1324  }
1325 #ifdef EDM_ML_DEBUG
1326  if (debug_) {
1327  edm::LogVerbatim("HcalIsoTrack") << "StoreEnergy1::Input to storeEnergy with " << ids.size() << " cells";
1328  for (unsigned int k = 0; k < ids.size(); ++k)
1329  edm::LogVerbatim("HcalIsoTrack") << "Hit [" << k << "] " << HcalDetId(ids[k]) << " E " << edet[k];
1330  edm::LogVerbatim("HcalIsoTrack") << "StoreEnergy1::Output of storeEnergy with " << detIds.size()
1331  << " cells and Etot " << eHcal;
1332  for (unsigned int k = 0; k < detIds.size(); ++k)
1333  edm::LogVerbatim("HcalIsoTrack") << "Hit [" << k << "] " << HcalDetId(detIds[k]) << " E " << hitEnergies[k];
1334  }
1335 #endif
1336 }
1337 
1338 std::pair<double, double> AlCaHcalIsotrkProducer::storeEnergy(const HcalRespCorrs* respCorrs,
1340  const std::vector<DetId>& ids,
1341  std::vector<double>& hitEnergy1,
1342  std::vector<double>& hitEnergy2) {
1343  double ehcal1(0), ehcal2(0);
1344  std::vector<double> edet1, edet2;
1345  for (unsigned int k = 0; k < ids.size(); ++k) {
1346  double e1(0), e2(0);
1347  for (auto itr = hbhe->begin(); itr != hbhe->end(); ++itr) {
1348  if (itr->id() == ids[k]) {
1349  e1 = itr->eraw();
1350  e2 = itr->eaux();
1351  break;
1352  }
1353  }
1354  if (e1 < 1.e-10)
1355  e1 = 0;
1356  if (e2 < 1.e-10)
1357  e2 = 0;
1358  edet1.emplace_back(e1);
1359  edet2.emplace_back(e2);
1360  }
1361  if (unCorrect_) {
1362  for (unsigned int k = 0; k < ids.size(); ++k) {
1363  double corr = (respCorrs->getValues(ids[k]))->getValue();
1364  if (corr != 0) {
1365  edet1[k] /= corr;
1366  edet2[k] /= corr;
1367  }
1368  }
1369  }
1370  for (unsigned int k = 0; k < ids.size(); ++k) {
1371  ehcal1 += edet1[k];
1372  ehcal2 += edet2[k];
1373  }
1374  ehcal1 *= hcalScale_;
1375  ehcal2 *= hcalScale_;
1376 
1377  if (collapseDepth_) {
1378  std::map<HcalDetId, std::pair<double, double>> hitMap;
1379  for (unsigned int k = 0; k < ids.size(); ++k) {
1380  HcalDetId id = hdc_->mergedDepthDetId(HcalDetId(ids[k]));
1381  auto itr = hitMap.find(id);
1382  if (itr == hitMap.end()) {
1383  hitMap[id] = std::make_pair(edet1[k], edet2[k]);
1384  } else {
1385  (itr->second).first += edet1[k];
1386  (itr->second).second += edet2[k];
1387  }
1388  }
1389  hitEnergy1.reserve(hitMap.size());
1390  hitEnergy2.reserve(hitMap.size());
1391  for (const auto& hit : hitMap) {
1392  hitEnergy1.emplace_back(hit.second.first);
1393  hitEnergy2.emplace_back(hit.second.second);
1394  }
1395  } else {
1396  hitEnergy1.reserve(ids.size());
1397  hitEnergy2.reserve(ids.size());
1398  for (unsigned int k = 0; k < ids.size(); ++k) {
1399  hitEnergy1.emplace_back(edet1[k]);
1400  hitEnergy2.emplace_back(edet2[k]);
1401  }
1402  }
1403 #ifdef EDM_ML_DEBUG
1404  if (debug_) {
1405  edm::LogVerbatim("HcalIsoTrack") << "StoreEnergy2::Input to storeEnergy with " << ids.size() << " cells";
1406  edm::LogVerbatim("HcalIsoTrack") << "StoreEnergy2::Output of storeEnergy with " << hitEnergy1.size()
1407  << " cells and Etot " << ehcal1 << ":" << ehcal2;
1408  for (unsigned int k = 0; k < hitEnergy1.size(); ++k)
1409  edm::LogVerbatim("HcalIsoTrack") << "Hit [" << k << "] " << hitEnergy1[k] << " : " << hitEnergy2[k];
1410  }
1411 #endif
1412  return std::make_pair(ehcal1, ehcal2);
1413 }
1414 
1416  bool flag(true);
1417  for (reco::MuonCollection::const_iterator recMuon = muonh->begin(); recMuon != muonh->end(); ++recMuon) {
1418  if (recMuon->innerTrack().isNonnull()) {
1419  const reco::Track* pTrack = (recMuon->innerTrack()).get();
1420  bool mediumMuon = (((recMuon->isPFMuon()) && (recMuon->isGlobalMuon() || recMuon->isTrackerMuon())) &&
1421  (recMuon->innerTrack()->validFraction() > 0.49));
1422  if (mediumMuon) {
1423  double chiGlobal = ((recMuon->globalTrack().isNonnull()) ? recMuon->globalTrack()->normalizedChi2() : 999);
1424  bool goodGlob = (recMuon->isGlobalMuon() && chiGlobal < 3 &&
1425  recMuon->combinedQuality().chi2LocalPosition < 12 && recMuon->combinedQuality().trkKink < 20);
1426  mediumMuon = muon::segmentCompatibility(*recMuon) > (goodGlob ? 0.303 : 0.451);
1427  }
1428  if (mediumMuon) {
1429  double dR = reco::deltaR(pTrack->eta(), pTrack->phi(), pTrack0->eta(), pTrack0->phi());
1430  if (dR < 0.1) {
1431  flag = false;
1432  break;
1433  }
1434  }
1435  }
1436  }
1437  return flag;
1438 }
1439 
1441 
RunNumber_t run() const
Definition: EventID.h:38
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
double p() const
momentum vector magnitude
Definition: TrackBase.h:631
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
EventNumber_t event() const
Definition: EventID.h:40
edm::EDGetTokenT< reco::TrackCollection > tok_genTrack_
std::vector< spr::propagatedTrackID > propagateCALO(edm::Handle< reco::TrackCollection > &trkCollection, const CaloGeometry *geo, const MagneticField *bField, const std::string &theTrackQuality, bool debug=false)
std::vector< double > hitEnergies1Raw_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
constexpr int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
std::vector< double > hitEnergies3_
int id() const
getters
Definition: TriggerObject.h:51
RunNumber_t run() const
Definition: RunBase.h:40
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:25
trigger::size_type sizeFilters() const
Definition: TriggerEvent.h:146
uint16_t *__restrict__ id
std::vector< unsigned int > detIds3_
constexpr int zside() const
get the z-side of the cell (1/-1)
Definition: HcalDetId.h:141
std::vector< double > hitEnergies_
~AlCaHcalIsotrkProducer() override=default
float phi() const
Definition: TriggerObject.h:54
TrackQuality
track quality
Definition: TrackBase.h:150
HcalDetId mergedDepthDetId(const HcalDetId &id) const
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void beginRun(edm::Run const &, edm::EventSetup const &) override
std::vector< unsigned int > detIds1_
const Keys & filterKeys(trigger::size_type index) const
Definition: TriggerEvent.h:118
edm::EDGetTokenT< EcalRecHitCollection > tok_EB_
edm::EDGetTokenT< trigger::TriggerEvent > tok_trigEvt_
int bunchCrossing() const
Definition: EventBase.h:64
edm::EDGetTokenT< HBHERecHitCollection > tok_hbhe_
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:61
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:649
const std::string labelIsoTkEvtVar_
const Item * getValues(DetId fId, bool throwOnFail=true) const
float energy() const
Definition: TriggerObject.h:61
Exp< T >::type exp(const T &t)
Definition: Exp.h:22
double chargeIsolationCone(unsigned int trkIndex, std::vector< spr::propagatedTrackDirection > &trkDirs, double dR, int &nNearTRKs, bool debug=false)
float eta() const
Definition: TriggerObject.h:53
double px() const
x coordinate of momentum vector
Definition: TrackBase.h:640
static std::unique_ptr< alcaHcalIsoTracks::Counters > initializeGlobalCache(edm::ParameterSet const &)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:31
edm::EDGetTokenT< reco::GenParticleCollection > tok_parts_
std::vector< unsigned int > detIds_
Strings const & triggerNames() const
Definition: TriggerNames.cc:48
void storeEnergy(const HcalRespCorrs *respCorrs, const std::vector< DetId > &ids, std::vector< double > &edet, double &eHcal, std::vector< unsigned int > &detIds, std::vector< double > &hitEnergies)
const std::string names[nVars_]
bool notaMuon(const reco::Track *pTrack0, const edm::Handle< reco::MuonCollection > &muonh)
std::vector< double > hitEnergiesRaw_
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:275
unsigned int triggerIndex(const std::string &triggerName) const
slot position of trigger path in trigger table (0 to size-1)
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:21
bool getData(T &iHolder) const
Definition: EventSetup.h:128
U second(std::pair< T, U > const &p)
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
edm::EDGetTokenT< BXVector< GlobalAlgBlk > > tok_alg_
constexpr HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
char const * label
double dR(math::XYZTLorentzVector &, math::XYZTLorentzVector &)
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
Definition: Event.h:563
const HcalDDDRecConstants * hdc_
spr::trackSelectionParameters selectionParameter_
edm::EDGetTokenT< CaloTowerCollection > tok_cala_
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
caConstants::TupleMultiplicity const CAHitNtupletGeneratorKernelsGPU::HitToTuple const cms::cuda::AtomicPairCounter GPUCACell const *__restrict__ uint32_t const *__restrict__ gpuPixelDoublets::CellNeighborsVector const gpuPixelDoublets::CellTracksVector const GPUCACell::OuterHitOfCell const int32_t uint32_t CAHitNtupletGeneratorKernelsGPU::Counters * counters
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:652
std::vector< double > phibins_
std::vector< double > hitEnergies1Aux_
const std::vector< int > debEvents_
double rhoh(const edm::Handle< CaloTowerCollection > &)
const edm::InputTag triggerEvent_
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
bool goodTrack(const reco::Track *pTrack, math::XYZPoint leadPV, trackSelectionParameters parameters, bool debug=false)
const TriggerObjectCollection & getObjects() const
Definition: TriggerEvent.h:101
l1t::L1TGlobalUtil * l1GtUtils_
std::vector< double > vec1
Definition: HCALResponse.h:15
double pt() const
track transverse momentum
Definition: TrackBase.h:637
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > tok_geom_
def move
Definition: eostools.py:511
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
GlobalPoint getPosition(const DetId &id) const
Get the position of a given detector id.
Definition: CaloGeometry.cc:50
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static void globalEndJob(const alcaHcalIsoTracks::Counters *counters)
constexpr int ieta() const
get the cell ieta
Definition: HcalDetId.h:155
float segmentCompatibility(const reco::Muon &muon, reco::Muon::ArbitrationType arbitrationType=reco::Muon::SegmentAndTrackArbitration)
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)
std::vector< double > hitEnergies1_
double trackP(const reco::Track *, const edm::Handle< reco::GenParticleCollection > &)
static std::string const triggerResults
Definition: EdmProvDump.cc:44
edm::ESGetToken< HcalTopology, HcalRecNumberingRecord > tok_htopo_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::atomic< unsigned int > nRange_
bool isValid() const
Definition: HandleBase.h:70
const std::vector< int > newDepth_
std::vector< double > hitEnergies3Raw_
#define M_PI
const edm::InputTag theTriggerResultsLabel_
double pz() const
z coordinate of momentum vector
Definition: TrackBase.h:646
edm::ESGetToken< EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd > tok_sevlv_
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
edm::EDGetTokenT< reco::BeamSpot > tok_bs_
const std::vector< std::string > & moduleLabels(unsigned int trigger) const
label(s) of module(s) on a trigger path
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:75
edm::EDGetTokenT< reco::MuonCollection > tok_Muon_
Definition: DetId.h:17
const edm::InputTag filterTag(trigger::size_type index) const
Definition: TriggerEvent.h:108
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > tok_bFieldH_
static TrackQuality qualityByName(const std::string &name)
Definition: TrackBase.cc:126
double eThreshold(const DetId &id, const CaloGeometry *geo) const
std::vector< double > hitEnergies3Aux_
edm::EDGetTokenT< EcalRecHitCollection > tok_EE_
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
std::vector< size_type > Keys
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
AlCaHcalIsotrkProducer(edm::ParameterSet const &, const alcaHcalIsoTracks::Counters *)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
std::atomic< unsigned int > nAll_
edm::ESGetToken< HcalDDDRecConstants, HcalRecNumberingRecord > tok_ddrec_
std::string const & label() const
Definition: InputTag.h:36
T eta() const
Definition: PV3DBase.h:73
edm::EventID id() const
Definition: EventBase.h:59
edm::EDGetTokenT< GenEventInfoProduct > tok_ew_
edm::ESGetToken< EcalChannelStatus, EcalChannelStatusRcd > tok_ecalChStatus_
tuple events
Definition: patZpeak.py:20
edm::EDGetTokenT< edm::TriggerResults > tok_trigRes_
reco::TrackBase::TrackQuality minQuality
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
edm::ESGetToken< HcalRespCorrs, HcalRespCorrsRcd > tok_resp_
const std::vector< int > oldID_
edm::ESGetToken< CaloTopology, CaloTopologyRecord > tok_caloTopology_
constexpr int depth() const
get the tower depth
Definition: HcalDetId.h:164
Log< level::Warning, false > LogWarning
float mass() const
Definition: TriggerObject.h:55
std::vector< vec1 > vec2
Definition: HCALResponse.h:16
const std::string theTrackQuality_
std::vector< double > hitEnergiesAux_
std::array< int, 3 > getProducts(int goodPV, double eventWeight, 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, const edm::Handle< reco::GenParticleCollection > &genParticles, const HcalRespCorrs *respCorrs, const edm::Handle< reco::MuonCollection > &muonh, std::vector< HcalIsoTrkCalibVariables > &hocalib, HcalIsoTrkEventVariables &hocalibEvent)
const std::vector< std::string > trigNames_
void retrieveL1(const edm::Event &iEvent, const edm::EventSetup &evSetup)
initialize the class (mainly reserve)
double py() const
y coordinate of momentum vector
Definition: TrackBase.h:643
Definition: Run.h:45
std::atomic< unsigned int > nGood_
std::vector< double > etabins_
void produce(edm::Event &, edm::EventSetup const &) override
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)
void endRun(edm::Run const &, edm::EventSetup const &) override
edm::EDGetTokenT< reco::VertexCollection > tok_recVtx_