CMS 3D CMS Logo

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