CMS 3D CMS Logo

EgHLTOffHelper.cc
Go to the documentation of this file.
2 
8 
10 
13 
19 
23 
24 #include <iostream>
25 
26 using namespace egHLT;
27 
30  delete hltEleTrkIsolAlgo_;
32  delete hltPhoTrkIsolAlgo_;
33 }
34 
36  ecalRecHitsEBToken = iC.consumes<EcalRecHitCollection>(conf.getParameter<edm::InputTag>("BarrelRecHitCollection"));
37  ecalRecHitsEEToken = iC.consumes<EcalRecHitCollection>(conf.getParameter<edm::InputTag>("EndcapRecHitCollection"));
38  caloJetsToken = iC.consumes<reco::CaloJetCollection>(conf.getParameter<edm::InputTag>("CaloJetCollection"));
39  isolTrkToken = iC.consumes<reco::TrackCollection>(conf.getParameter<edm::InputTag>("IsolTrackCollection"));
40  hbheHitsToken = iC.consumes<HBHERecHitCollection>(conf.getParameter<edm::InputTag>("HBHERecHitCollection"));
41  hfHitsToken = iC.consumes<HFRecHitCollection>(conf.getParameter<edm::InputTag>("HFRecHitCollection"));
42  electronsToken = iC.consumes<reco::GsfElectronCollection>(conf.getParameter<edm::InputTag>("ElectronCollection"));
43  photonsToken = iC.consumes<reco::PhotonCollection>(conf.getParameter<edm::InputTag>("PhotonCollection"));
44  triggerSummaryToken = iC.consumes<trigger::TriggerEvent>(conf.getParameter<edm::InputTag>("triggerSummaryLabel"));
45  hltTag_ = conf.getParameter<std::string>("hltTag");
46  beamSpotToken = iC.consumes<reco::BeamSpot>(conf.getParameter<edm::InputTag>("BeamSpotProducer"));
47  caloTowersToken = iC.consumes<CaloTowerCollection>(conf.getParameter<edm::InputTag>("CaloTowers"));
48  trigResultsToken = iC.consumes<edm::TriggerResults>(conf.getParameter<edm::InputTag>("TrigResults"));
49  vertexToken = iC.consumes<reco::VertexCollection>(conf.getParameter<edm::InputTag>("VertexCollection"));
50 
51  caloGeomToken_ = iC.esConsumes();
52  caloTopoToken_ = iC.esConsumes();
53  magFieldToken_ = iC.esConsumes();
54  ecalSeverityToken_ = iC.esConsumes();
55 
56  eleCuts_.setup(conf.getParameter<edm::ParameterSet>("eleCuts"));
57  eleLooseCuts_.setup(conf.getParameter<edm::ParameterSet>("eleLooseCuts"));
58  phoCuts_.setup(conf.getParameter<edm::ParameterSet>("phoCuts"));
59  phoLooseCuts_.setup(conf.getParameter<edm::ParameterSet>("phoLooseCuts"));
60 
61  //now we have the isolations completely configurable via python
62  hltEMIsolOuterCone_ = conf.getParameter<double>("hltEMIsolOuterCone");
63  hltEMIsolInnerConeEB_ = conf.getParameter<double>("hltEMIsolInnerConeEB");
64  hltEMIsolEtaSliceEB_ = conf.getParameter<double>("hltEMIsolEtaSliceEB");
65  hltEMIsolEtMinEB_ = conf.getParameter<double>("hltEMIsolEtMinEB");
66  hltEMIsolEMinEB_ = conf.getParameter<double>("hltEMIsolEMinEB");
67  hltEMIsolInnerConeEE_ = conf.getParameter<double>("hltEMIsolInnerConeEE");
68  hltEMIsolEtaSliceEE_ = conf.getParameter<double>("hltEMIsolEtaSliceEE");
69  hltEMIsolEtMinEE_ = conf.getParameter<double>("hltEMIsolEtMinEE");
70  hltEMIsolEMinEE_ = conf.getParameter<double>("hltEMIsolEMinEE");
71 
72  hltPhoTrkIsolPtMin_ = conf.getParameter<double>("hltPhoTrkIsolPtMin");
73  hltPhoTrkIsolOuterCone_ = conf.getParameter<double>("hltPhoTrkIsolOuterCone");
74  hltPhoTrkIsolInnerCone_ = conf.getParameter<double>("hltPhoTrkIsolInnerCone");
75  hltPhoTrkIsolZSpan_ = conf.getParameter<double>("hltPhoTrkIsolZSpan");
76  hltPhoTrkIsolRSpan_ = conf.getParameter<double>("hltPhoTrkIsolZSpan");
77  hltPhoTrkIsolCountTrks_ = conf.getParameter<bool>("hltPhoTrkIsolCountTrks");
78 
79  hltEleTrkIsolPtMin_ = conf.getParameter<double>("hltEleTrkIsolPtMin");
80  hltEleTrkIsolOuterCone_ = conf.getParameter<double>("hltEleTrkIsolOuterCone");
81  hltEleTrkIsolInnerCone_ = conf.getParameter<double>("hltEleTrkIsolInnerCone");
82  hltEleTrkIsolZSpan_ = conf.getParameter<double>("hltEleTrkIsolZSpan");
83  hltEleTrkIsolRSpan_ = conf.getParameter<double>("hltEleTrkIsolZSpan");
84 
85  hltHadIsolOuterCone_ = conf.getParameter<double>("hltHadIsolOuterCone");
86  hltHadIsolInnerCone_ = conf.getParameter<double>("hltHadIsolInnerCone");
87  hltHadIsolEtMin_ = conf.getParameter<double>("hltHadIsolEtMin");
88  hltHadIsolDepth_ = conf.getParameter<int>("hltHadIsolDepth");
89 
90  calHLTHcalIsol_ = conf.getParameter<bool>("calHLTHcalIsol");
91  calHLTEmIsol_ = conf.getParameter<bool>("calHLTEmIsol");
92  calHLTEleTrkIsol_ = conf.getParameter<bool>("calHLTEleTrkIsol");
93  calHLTPhoTrkIsol_ = conf.getParameter<bool>("calHLTPhoTrkIsol");
94 
95  trigCutParams_ = conf.getParameter<std::vector<edm::ParameterSet> >(
96  "triggerCuts"); //setupTriggers used to be in this function but had to be moved due to HLTConfigChanges (has to be called beginRun) so we have to save this for later.
97 
102 }
103 
104 //this code was taken out of OffHelper::setup due to HLTConfigProvider changes
105 //it still assumes that this is called only once
107  const std::vector<std::string>& hltFiltersUsed,
108  const TrigCodes& trigCodes) {
109  hltFiltersUsed_ = hltFiltersUsed; //expensive but only do this once and faster ways could make things less clear
110  //now work out how many objects are requires to pass filter for it to accept
113  for (size_t filterNr = 0; filterNr < hltFiltersUsed_.size(); filterNr++) {
114  hltFiltersUsedWithNrCandsCut_.push_back(std::make_pair(hltFiltersUsed_[filterNr], getMRObjs[filterNr]));
115  }
116 
117  //now loading the cuts for every trigger into our vector which stores them
118  //only load cuts for triggers that are in hltFiltersUsed
119 
120  for (auto& trigCutParam : trigCutParams_) {
121  std::string trigName = trigCutParam.getParameter<std::string>("trigName");
122  if (std::find(hltFiltersUsed_.begin(), hltFiltersUsed_.end(), trigName) !=
123  hltFiltersUsed_.end()) { //perhaps I should sort hltFiltersUsed_....
124  trigCuts_.push_back(std::make_pair(trigCodes.getCode(trigName), OffEgSel(trigCutParam)));
125  // std::cout<<trigName<<std::endl<<"between"<<std::endl<<trigCutParams_[trigNr]<<std::endl<<"after"<<std::endl;
126  }
127  }
128  trigCutParams_.clear(); //dont need it any more, get rid of it
129 
130  //to make my life difficult, the scaled l1 paths are special
131  //and arent stored in trigger event
132  //to I have to figure out the path, see if it passes
133  //and then hunt down the l1 seed filter and use that to match to the pho/ele
134  //matching on l1 seed filter is not enough as that will be passed for normal
135  //electron triggers even if pre-scale hasnt fired
136  l1PreScaledFilters_.clear();
137  l1PreScaledPaths_.clear();
138  l1PreAndSeedFilters_.clear();
139  for (auto& filterNr : hltFiltersUsed_) {
140  if (filterNr.find("hltPreL1") == 0) { //l1 prescaled path
141  l1PreScaledFilters_.push_back(filterNr);
142  }
143  }
144 
146  if (l1PreScaledPaths_.size() == l1PreScaledFilters_.size()) {
147  for (size_t pathNr = 0; pathNr < l1PreScaledPaths_.size(); pathNr++) {
149  //---Morse====
150  //std::cout<<l1PreScaledFilters_[pathNr]<<" "<<l1PreScaledPaths_[pathNr]<<" "<<l1SeedFilter<<std::endl;
151  //------------
152  l1PreAndSeedFilters_.push_back(std::make_pair(l1PreScaledFilters_[pathNr], l1SeedFilter));
153  }
154  }
155 }
156 
157 int OffHelper::makeOffEvt(const edm::Event& edmEvent,
158  const edm::EventSetup& setup,
159  egHLT::OffEvt& offEvent,
160  const TrigCodes& c) {
161  offEvent.clear();
162  int errCode = 0; //excution stops as soon as an error is flagged
163  if (errCode == 0)
164  errCode = getHandles(edmEvent, setup);
165  if (errCode == 0)
166  errCode = fillOffEleVec(offEvent.eles());
167  if (errCode == 0)
168  errCode = fillOffPhoVec(offEvent.phos());
169  if (errCode == 0)
170  errCode = setTrigInfo(edmEvent, offEvent, c);
171  if (errCode == 0)
172  offEvent.setJets(recoJets_);
173  return errCode;
174 }
175 
177  try {
178  caloGeom_ = setup.getHandle(caloGeomToken_);
179  caloTopology_ = setup.getHandle(caloTopoToken_);
180  //ecalSeverityLevel_ = setup.getHandle(ecalSeverityToken_);
181  } catch (cms::Exception& iException) {
182  return errCodes::Geom;
183  }
184  try {
185  magField_ = setup.getHandle(magFieldToken_);
186  } catch (cms::Exception& iException) {
187  return errCodes::MagField;
188  }
189 
190  //get objects
192  return errCodes::TrigEvent; //must have this, otherwise skip event
194  return errCodes::TrigEvent; //re using bit to minimise bug fix code changes
196  return errCodes::OffEle; //need for electrons
198  return errCodes::OffPho; //need for photons
200  return errCodes::OffJet; //need for electrons and photons
202  return errCodes::OffVertex; //need for eff vs nVertex
203 
204  //need for HLT isolations (rec hits also need for sigmaIPhiIPhi (ele/pho) and r9 pho)
206  return errCodes::EBRecHits;
208  return errCodes::EERecHits;
210  return errCodes::IsolTrks;
212  return errCodes::HBHERecHits; //I dont think we need hbhe rec-hits any more
214  return errCodes::HFRecHits; //I dont think we need hf rec-hits any more
216  return errCodes::BeamSpot;
218  return errCodes::CaloTowers;
219 
220  return 0;
221 }
222 
223 //this function coverts GsfElectrons to a format which is actually useful to me
224 int OffHelper::fillOffEleVec(std::vector<OffEle>& egHLTOffEles) {
225  egHLTOffEles.clear();
226  egHLTOffEles.reserve(recoEles_->size());
227  for (auto const& gsfIter : *recoEles_) {
228  if (!gsfIter.ecalDrivenSeed())
229  continue; //avoid PF electrons (this is Eg HLT validation and HLT is ecal driven)
230 
231  int nVertex = 0;
232  for (auto const& nVit : *recoVertices_) {
233  if (!nVit.isFake() && nVit.ndof() > 4 && std::fabs(nVit.z() < 24.0) &&
234  sqrt(nVit.x() * nVit.x() + nVit.y() * nVit.y()) < 2.0) {
235  nVertex++;
236  }
237  }
238  //if(nVertex>20)std::cout<<"nVertex: "<<nVertex<<std::endl;
239  OffEle::EventData eventData;
240  eventData.NVertex = nVertex;
241 
242  OffEle::IsolData isolData;
243  fillIsolData(gsfIter, isolData);
244 
245  OffEle::ClusShapeData clusShapeData;
246  fillClusShapeData(gsfIter, clusShapeData);
247 
248  OffEle::HLTData hltData;
249  fillHLTData(gsfIter, hltData);
250 
251  egHLTOffEles.emplace_back(gsfIter, clusShapeData, isolData, hltData, eventData);
252 
253  //now we would like to set the cut results
254  OffEle& ele = egHLTOffEles.back();
255  ele.setCutCode(eleCuts_.getCutCode(ele));
257 
258  std::vector<std::pair<TrigCodes::TrigBitSet, int> > trigCutsCutCodes;
259  trigCutsCutCodes.reserve(trigCuts_.size());
260  for (auto& trigCut : trigCuts_)
261  trigCutsCutCodes.push_back(std::make_pair(trigCut.first, trigCut.second.getCutCode(ele)));
262  ele.setTrigCutsCutCodes(trigCutsCutCodes);
263  } //end loop over gsf electron collection
264  return 0;
265 }
266 
268  EgammaTowerIsolation hcalIsolAlgo(
275  caloGeom_,
276  *ebRecHits_,
278  DetId::Ecal);
284  caloGeom_,
285  *eeRecHits_,
287  DetId::Ecal);
288 
289  isolData.ptTrks = ele.dr03TkSumPt();
290  isolData.nrTrks = 999; //no longer supported
291  isolData.em = ele.dr03EcalRecHitSumEt();
292  isolData.hadDepth1 = ele.dr03HcalTowerSumEt(1);
293  isolData.hadDepth2 = ele.dr03HcalTowerSumEt(2);
294 
295  //now time to do the HLT algos
296  if (calHLTHcalIsol_)
297  isolData.hltHad = hcalIsolAlgo.getTowerESum(&ele);
298  else
299  isolData.hltHad = 0.;
300  if (calHLTEleTrkIsol_)
302  else
303  isolData.hltTrksEle = 0.;
304  if (calHLTPhoTrkIsol_) {
306  isolData.hltTrksPho = hltPhoTrkIsolAlgo_->photonTrackCount(&ele, isolTrks_.product(), false);
307  else
308  isolData.hltTrksPho = hltPhoTrkIsolAlgo_->photonPtSum(&ele, isolTrks_.product(), false);
309  } else
310  isolData.hltTrksPho = 0.;
311  if (calHLTEmIsol_)
312  isolData.hltEm = ecalIsolAlgoEB.getEtSum(&ele, thresholds) + ecalIsolAlgoEE.getEtSum(&ele, thresholds);
313  else
314  isolData.hltEm = 0.;
315 }
316 
318  clusShapeData.sigmaEtaEta = ele.sigmaEtaEta();
319  clusShapeData.sigmaIEtaIEta = ele.sigmaIetaIeta();
320  double e5x5 = ele.e5x5();
321  if (e5x5 != 0.) {
322  clusShapeData.e1x5Over5x5 = ele.e1x5() / e5x5;
323  clusShapeData.e2x5MaxOver5x5 = ele.e2x5Max() / e5x5;
324  } else {
325  clusShapeData.e1x5Over5x5 = -1;
326  clusShapeData.e2x5MaxOver5x5 = -1;
327  }
328 
329  //want to calculate r9, sigmaPhiPhi and sigmaIPhiIPhi, have to do old fashioned way
330  const reco::BasicCluster& seedClus = *(ele.superCluster()->seed());
331  const DetId seedDetId =
332  seedClus.hitsAndFractions()[0]
333  .first; //note this may not actually be the seed hit but it doesnt matter because all hits will be in the barrel OR endcap
334  if (seedDetId.subdetId() == EcalBarrel) {
335  const auto& stdCov =
336  EcalClusterTools::covariances(seedClus, ebRecHits_.product(), caloTopology_.product(), caloGeom_.product());
337  const auto& crysCov = EcalClusterTools::localCovariances(seedClus, ebRecHits_.product(), caloTopology_.product());
338  clusShapeData.sigmaPhiPhi = sqrt(stdCov[2]);
339  clusShapeData.sigmaIPhiIPhi = sqrt(crysCov[2]);
340  if (ele.superCluster()->rawEnergy() != 0.) {
341  clusShapeData.r9 = EcalClusterTools::e3x3(seedClus, ebRecHits_.product(), caloTopology_.product()) /
342  ele.superCluster()->rawEnergy();
343  } else
344  clusShapeData.r9 = -1.;
345 
346  } else {
347  const auto& stdCov =
348  EcalClusterTools::covariances(seedClus, eeRecHits_.product(), caloTopology_.product(), caloGeom_.product());
349  const auto& crysCov = EcalClusterTools::localCovariances(seedClus, eeRecHits_.product(), caloTopology_.product());
350  clusShapeData.sigmaPhiPhi = sqrt(stdCov[2]);
351  clusShapeData.sigmaIPhiIPhi = sqrt(crysCov[2]);
352  if (ele.superCluster()->rawEnergy() != 0.) {
353  clusShapeData.r9 = EcalClusterTools::e3x3(seedClus, eeRecHits_.product(), caloTopology_.product()) /
354  ele.superCluster()->rawEnergy();
355  } else
356  clusShapeData.r9 = -1.;
357  }
358 }
359 
360 //reco approximations of hlt quantities
362  if (ele.closestCtfTrackRef().isNonnull() && ele.closestCtfTrackRef()->extra().isNonnull()) {
363  reco::TrackRef ctfTrack = ele.closestCtfTrackRef();
364  reco::SuperClusterRef scClus = ele.superCluster();
365 
366  //dEta
368  math::XYZPoint scPosWRTVtx(scClus->x() - bsPos.x(), scClus->y() - bsPos.y(), scClus->z() - ctfTrack->vz());
369  hltData.dEtaIn = fabs(scPosWRTVtx.eta() - ctfTrack->eta());
370 
371  //dPhi: lifted straight from hlt code
372  float deltaPhi = fabs(ctfTrack->outerPosition().phi() - scClus->phi());
373  if (deltaPhi > 6.283185308)
374  deltaPhi -= 6.283185308;
375  if (deltaPhi > 3.141592654)
376  deltaPhi = 6.283185308 - deltaPhi;
377  hltData.dPhiIn = deltaPhi;
378 
379  //invEInvP
380  if (ele.ecalEnergy() != 0 && ctfTrack->p() != 0)
381  hltData.invEInvP = 1 / ele.ecalEnergy() - 1 / ctfTrack->p();
382  else
383  hltData.invEInvP = 0;
384  } else {
385  hltData.dEtaIn = 999;
386  hltData.dPhiIn = 999;
387  hltData.invEInvP = 999;
388  }
389 
390  //Now get HLT p4 from triggerobject
391  //reset the position first
392  hltData.HLTeta = 999;
393  hltData.HLTphi = 999;
394  hltData.HLTenergy = -999;
396  //trigTools::fillHLTposition(phos(),hltFiltersUsed_,l1PreAndSeedFilters_,evtTrigBits,trigEvt_.product(),hltTag_);
397 }
398 
400  //Now get HLT p4 from triggerobject
401  //reset the position first
402  hltData.HLTeta = 999;
403  hltData.HLTphi = 999;
404  hltData.HLTenergy = -999;
406  //trigTools::fillHLTposition(phos(),hltFiltersUsed_,l1PreAndSeedFilters_,evtTrigBits,trigEvt_.product(),hltTag_);
407 }
408 
409 //this function coverts Photons to a format which more useful to me
410 int OffHelper::fillOffPhoVec(std::vector<OffPho>& egHLTOffPhos) {
411  egHLTOffPhos.clear();
412  egHLTOffPhos.reserve(recoPhos_->size());
413  for (auto const& phoIter : *recoPhos_) {
414  OffPho::IsolData isolData;
415  OffPho::ClusShapeData clusShapeData;
416 
417  fillIsolData(phoIter, isolData);
418  fillClusShapeData(phoIter, clusShapeData);
419 
420  OffPho::HLTData hltData;
421  fillHLTDataPho(phoIter, hltData);
422 
423  egHLTOffPhos.emplace_back(phoIter, clusShapeData, isolData, hltData);
424  OffPho& pho = egHLTOffPhos.back();
425  pho.setCutCode(phoCuts_.getCutCode(pho));
427 
428  std::vector<std::pair<TrigCodes::TrigBitSet, int> > trigCutsCutCodes;
429  trigCutsCutCodes.reserve(trigCuts_.size());
430  for (auto& trigCut : trigCuts_)
431  trigCutsCutCodes.push_back(std::make_pair(trigCut.first, trigCut.second.getCutCode(pho)));
432  pho.setTrigCutsCutCodes(trigCutsCutCodes);
433 
434  } //end loop over photon collection
435  return 0;
436 }
437 
439  EgammaTowerIsolation hcalIsolAlgo(
446  caloGeom_,
447  *ebRecHits_,
449  DetId::Ecal);
455  caloGeom_,
456  *eeRecHits_,
458  DetId::Ecal);
459 
460  isolData.nrTrks = pho.nTrkHollowConeDR03();
461  isolData.ptTrks = pho.trkSumPtHollowConeDR03();
462  isolData.em = pho.ecalRecHitSumEtConeDR03();
463  isolData.had = pho.hcalTowerSumEtConeDR03();
464 
465  //now calculate hlt algos
466  if (calHLTHcalIsol_)
467  isolData.hltHad = hcalIsolAlgo.getTowerESum(&pho);
468  else
469  isolData.hltHad = 0.;
470  if (calHLTPhoTrkIsol_) {
472  isolData.hltTrks = hltPhoTrkIsolAlgo_->photonTrackCount(&pho, isolTrks_.product(), false);
473  else
474  isolData.hltTrks = hltPhoTrkIsolAlgo_->photonPtSum(&pho, isolTrks_.product(), false);
475  } else
476  isolData.hltTrks = 0.;
477  if (calHLTEmIsol_)
478  isolData.hltEm = ecalIsolAlgoEB.getEtSum(&pho, thresholds) + ecalIsolAlgoEE.getEtSum(&pho, thresholds);
479  else
480  isolData.hltEm = 0.;
481 }
482 
484  clusShapeData.sigmaEtaEta = pho.sigmaEtaEta();
485  clusShapeData.sigmaIEtaIEta = pho.sigmaIetaIeta();
486  double e5x5 = pho.e5x5();
487  if (e5x5 !=
488  0.) { //even though it is almost impossible for this to be 0., this code can never ever crash under any situation
489  clusShapeData.e1x5Over5x5 = pho.e1x5() / e5x5;
490  clusShapeData.e2x5MaxOver5x5 = pho.e2x5() / e5x5;
491  } else {
492  clusShapeData.e1x5Over5x5 = -1;
493  clusShapeData.e2x5MaxOver5x5 = -1;
494  }
495  clusShapeData.r9 = pho.r9();
496 
497  //sigmaPhiPhi and sigmaIPhiIPhi are not in object (and nor should they be) so have to get them old fashioned way
498  //need to figure out if its in the barrel or endcap
499  //get the first hit of the cluster and figure out if its barrel or endcap
500  const reco::BasicCluster& seedClus = *(pho.superCluster()->seed());
501  const DetId seedDetId =
502  seedClus.hitsAndFractions()[0]
503  .first; //note this may not actually be the seed hit but it doesnt matter because all hits will be in the barrel OR endcap (it is also incredably inefficient as it getHitsByDetId passes the vector by value not reference
504  if (seedDetId.subdetId() == EcalBarrel) {
505  const auto& stdCov =
506  EcalClusterTools::covariances(seedClus, ebRecHits_.product(), caloTopology_.product(), caloGeom_.product());
507  const auto& crysCov = EcalClusterTools::localCovariances(seedClus, ebRecHits_.product(), caloTopology_.product());
508  clusShapeData.sigmaPhiPhi = sqrt(stdCov[2]);
509  clusShapeData.sigmaIPhiIPhi = sqrt(crysCov[2]);
510  } else {
511  const auto& stdCov =
512  EcalClusterTools::covariances(seedClus, eeRecHits_.product(), caloTopology_.product(), caloGeom_.product());
513  const auto& crysCov = EcalClusterTools::localCovariances(seedClus, eeRecHits_.product(), caloTopology_.product());
514  clusShapeData.sigmaPhiPhi = sqrt(stdCov[2]);
515  clusShapeData.sigmaIPhiIPhi = sqrt(crysCov[2]);
516  }
517 }
518 
519 int OffHelper::setTrigInfo(const edm::Event& edmEvent, egHLT::OffEvt& offEvent, const TrigCodes& trigCodes) {
520  TrigCodes::TrigBitSet evtTrigBits =
522  //the l1 prescale paths dont have a filter with I can figure out if it passed or failed with so have to use TriggerResults
523  if (l1PreScaledPaths_.size() ==
524  l1PreScaledFilters_.size()) { //check to ensure both vectors have same number of events incase of screw ups
526  for (size_t pathNr = 0; pathNr < l1PreScaledPaths_.size();
527  pathNr++) { //now we have to check the prescaled l1 trigger paths
528  unsigned int pathIndex = triggerNames.triggerIndex(l1PreScaledPaths_[pathNr]);
529  if (pathIndex < trigResults_->size() && trigResults_->accept(pathIndex)) {
530  evtTrigBits |= trigCodes.getCode(l1PreScaledFilters_[pathNr]);
531  }
532  }
533  }
534 
535  offEvent.setEvtTrigBits(evtTrigBits);
536 
538  offEvent.eles(), hltFiltersUsed_, l1PreAndSeedFilters_, evtTrigBits, trigCodes, trigEvt_.product(), hltTag_);
540  offEvent.phos(), hltFiltersUsed_, l1PreAndSeedFilters_, evtTrigBits, trigCodes, trigEvt_.product(), hltTag_);
541  return 0;
542 }
bool accept() const
Has at least one path accepted the event?
void setTrigCutsCutCodes(const std::vector< std::pair< TrigCodes::TrigBitSet, int > > &trigCutsCutCodes)
Definition: EgHLTOffPho.h:96
void fillHLTposition(T &obj, U &hltData, const std::vector< std::string > &filters, const trigger::TriggerEvent *trigEvt, const std::string &hltTag)
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:283
double hltEMIsolEtaSliceEB_
edm::ESGetToken< CaloTopology, CaloTopologyRecord > caloTopoToken_
edm::Handle< reco::TrackCollection > isolTrks_
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:210
float sigmaEtaEta() const
Definition: Photon.h:275
float hcalTowerSumEtConeDR03(int depth=0) const
Hcal isolation sum for each depth excluding the region containing the rechits used for hcalOverEcal()...
Definition: Photon.h:509
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:26
int fillOffPhoVec(std::vector< OffPho > &offPhos)
double hltPhoTrkIsolRSpan_
edm::EDGetTokenT< CaloTowerCollection > caloTowersToken
const Point & position() const
position
Definition: BeamSpot.h:59
float e2x5Max() const
Definition: GsfElectron.h:422
void setLooseCutCode(int code)
Definition: EgHLTOffEle.h:114
OffEgSel phoLooseCuts_
void fillClusShapeData(const reco::GsfElectron &ele, OffEle::ClusShapeData &clusShapeData)
edm::Handle< reco::PhotonCollection > recoPhos_
int setTrigInfo(const edm::Event &edmEvent, egHLT::OffEvt &offEvent, const TrigCodes &trigCodes)
std::vector< std::pair< std::string, std::string > > l1PreAndSeedFilters_
float sigmaIetaIeta() const
Definition: GsfElectron.h:419
double hltEMIsolOuterCone_
T const * product() const
Definition: Handle.h:70
OffEgSel eleLooseCuts_
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
edm::EDGetTokenT< HBHERecHitCollection > hbheHitsToken
std::vector< std::string > l1PreScaledPaths_
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:232
EgammaHLTTrackIsolation * hltPhoTrkIsolAlgo_
const std::vector< OffEle > & eles() const
Definition: EgHLTOffEvt.h:48
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
float e1x5() const
Shower shape variables.
Definition: Photon.h:270
double hltEleTrkIsolOuterCone_
void clear()
Definition: EgHLTOffEvt.cc:5
math::XYZPoint Point
point in the space
Definition: BeamSpot.h:27
void fillIsolData(const reco::GsfElectron &ele, OffEle::IsolData &isolData)
int photonTrackCount(const reco::RecoCandidate *const recocand, const reco::TrackCollection *isoTracks, bool useVertex)
const std::vector< OffPho > & phos() const
Definition: EgHLTOffEvt.h:50
void fillHLTData(const reco::GsfElectron &ele, OffEle::HLTData &hltData)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
edm::EDGetTokenT< reco::TrackCollection > isolTrkToken
int nTrkHollowConeDR03() const
Definition: Photon.h:519
double hltEMIsolInnerConeEE_
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
void setEvtTrigBits(TrigCodes::TrigBitSet bits)
Definition: EgHLTOffEvt.h:57
edm::EDGetTokenT< reco::GsfElectronCollection > electronsToken
float e1x5() const
Definition: GsfElectron.h:421
std::vector< edm::ParameterSet > trigCutParams_
double hltEleTrkIsolInnerCone_
float e5x5() const
Definition: Photon.h:273
edm::Handle< HBHERecHitCollection > hbheHits_
double hltPhoTrkIsolPtMin_
std::vector< std::pair< std::string, int > > hltFiltersUsedWithNrCandsCut_
double hltEleTrkIsolZSpan_
float dr03TkSumPt() const
Definition: GsfElectron.h:557
GsfTrackRef gsfTrack() const override
reference to a GsfTrack
Definition: GsfElectron.h:156
edm::EDGetTokenT< trigger::TriggerEvent > triggerSummaryToken
const EcalPFRecHitThresholds * thresholds
void fillHLTDataPho(const reco::Photon &pho, OffPho::HLTData &hltData)
T const * product() const
Definition: ESHandle.h:86
double hltHadIsolInnerCone_
reco::SuperClusterRef superCluster() const override
Ref to SuperCluster.
float e5x5() const
Definition: GsfElectron.h:423
float electronPtSum(const reco::Track *const tr, const reco::TrackCollection *isoTracks)
Get Pt sum of tracks inside an isolation cone for electrons.
float sigmaIetaIeta() const
Definition: Photon.h:276
void setup(const edm::ParameterSet &)
T sqrt(T t)
Definition: SSEVec.h:23
std::string getL1SeedFilterOfPath(const HLTConfigProvider &hltConfig, const std::string &path)
double hltPhoTrkIsolZSpan_
edm::EDGetTokenT< EcalRecHitCollection > ecalRecHitsEEToken
double hltEleTrkIsolRSpan_
double hltHadIsolOuterCone_
std::vector< int > getMinNrObjsRequiredByFilter(const std::vector< std::string > &filterName)
edm::EDGetTokenT< reco::PhotonCollection > photonsToken
static bool getHandle(const edm::Event &event, const edm::EDGetTokenT< T > &token, edm::Handle< T > &handle)
edm::EDGetTokenT< reco::BeamSpot > beamSpotToken
edm::Handle< HFRecHitCollection > hfHits_
void setLooseCutCode(int code)
Definition: EgHLTOffPho.h:93
edm::Handle< std::vector< reco::CaloJet > > recoJets_
double hltEleTrkIsolPtMin_
float ecalRecHitSumEtConeDR03() const
Isolation variables in cone dR=0.3.
Definition: Photon.h:507
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
TrigCodes::TrigBitSet getFiltersPassed(const std::vector< std::pair< std::string, int > > &filters, const trigger::TriggerEvent *trigEvt, const std::string &hltTag, const TrigCodes &trigCodes)
float trkSumPtHollowConeDR03() const
Definition: Photon.h:515
void setCutCode(int code)
Definition: EgHLTOffEle.h:113
edm::ESHandle< MagneticField > magField_
edm::Handle< trigger::TriggerEvent > trigEvt_
edm::ESHandle< CaloGeometry > caloGeom_
double hltPhoTrkIsolInnerCone_
float sigmaEtaEta() const
Definition: GsfElectron.h:418
Definition: DetId.h:17
void setCutCode(int code)
Definition: EgHLTOffPho.h:92
double hltEMIsolEtaSliceEE_
double hltEMIsolInnerConeEB_
edm::Handle< reco::GsfElectronCollection > recoEles_
edm::EDGetTokenT< edm::TriggerResults > trigResultsToken
edm::EDGetTokenT< HFRecHitCollection > hfHitsToken
edm::Handle< edm::TriggerResults > trigResults_
edm::ESHandle< CaloTopology > caloTopology_
float ecalEnergy() const
Definition: GsfElectron.h:896
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
int makeOffEvt(const edm::Event &edmEvent, const edm::EventSetup &setup, egHLT::OffEvt &offEvent, const TrigCodes &trigCodes)
std::vector< Photon > PhotonCollection
collectin of Photon objects
Definition: PhotonFwd.h:9
edm::EDGetTokenT< reco::CaloJetCollection > caloJetsToken
std::vector< std::string > l1PreScaledFilters_
std::vector< std::pair< TrigCodes::TrigBitSet, OffEgSel > > trigCuts_
float r9() const
Definition: Photon.h:279
void setJets(edm::Handle< std::vector< reco::CaloJet > > jets)
Definition: EgHLTOffEvt.h:58
edm::EDGetTokenT< EcalRecHitCollection > ecalRecHitsEBToken
edm::Handle< EcalRecHitCollection > eeRecHits_
void setTrigCutsCutCodes(const std::vector< std::pair< TrigCodes::TrigBitSet, int > > &trigCutsCutCodes)
Definition: EgHLTOffEle.h:116
virtual TrackRef closestCtfTrackRef() const
Definition: GsfElectron.h:180
int getHandles(const edm::Event &event, const edm::EventSetup &setup)
void setup(const edm::ParameterSet &conf, edm::ConsumesCollector &&iC)
double hltPhoTrkIsolOuterCone_
TrigBitSet getCode(const char *descript) const
edm::Handle< CaloTowerCollection > caloTowers_
edm::Handle< EcalRecHitCollection > ebRecHits_
std::vector< std::string > hltFiltersUsed_
edm::Handle< reco::VertexCollection > recoVertices_
float dr03EcalRecHitSumEt() const
Definition: GsfElectron.h:559
edm::ESHandle< EcalSeverityLevelAlgo > ecalSeverityLevel_
void setupTriggers(const HLTConfigProvider &config, const std::vector< std::string > &hltFiltersUsed, const TrigCodes &trigCodes)
EgammaHLTTrackIsolation * hltEleTrkIsolAlgo_
edm::Handle< reco::BeamSpot > beamSpot_
std::string hltTag_
int getCutCode(const OffEle &ele, int cutMask=~0x0) const
float dr03HcalTowerSumEt(int depth=0) const
Definition: GsfElectron.h:576
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeomToken_
void setFiltersObjPasses(std::vector< T > &objs, const std::vector< std::string > &filters, const std::vector< std::pair< std::string, std::string > > &l1PreAndSeedFilters, const TrigCodes::TrigBitSet &evtTrigBits, const TrigCodes &trigCodes, const trigger::TriggerEvent *trigEvt, const std::string &hltTag)
std::bitset< maxNrBits_ > TrigBitSet
edm::ESGetToken< EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd > ecalSeverityToken_
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magFieldToken_
SuperClusterRef superCluster() const override
reference to a SuperCluster
Definition: GsfElectron.h:155
float photonPtSum(const reco::RecoCandidate *const recocand, const reco::TrackCollection *isoTracks, bool useVertex)
void translateFiltersToPathNames(const HLTConfigProvider &hltConfig, const std::vector< std::string > &filters, std::vector< std::string > &paths)
Definition: event.py:1
std::vector< CaloJet > CaloJetCollection
collection of CaloJet objects
edm::EDGetTokenT< reco::VertexCollection > vertexToken
int fillOffEleVec(std::vector< OffEle > &offEles)
float e2x5() const
Definition: Photon.h:271