CMS 3D CMS Logo

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