CMS 3D CMS Logo

GoodSeedProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: PFTracking
4 // Class: GoodSeedProducer
5 //
6 // Original Author: Michele Pioppi
7 // March 2010. F. Beaudette. Produce PreId information
8 
10 
54 
55 #include "TMath.h"
56 #include "Math/VectorUtil.h"
57 
58 #include <fstream>
59 
60 namespace goodseedhelpers {
62  constexpr static unsigned int kMaxWeights = 9;
64  std::array<std::unique_ptr<const GBRForest>, kMaxWeights> gbr;
65  };
66 } // namespace goodseedhelpers
67 
68 class GoodSeedProducer final : public edm::stream::EDProducer<edm::GlobalCache<goodseedhelpers::HeavyObjectCache>> {
70 
71 public:
73 
74  static std::unique_ptr<goodseedhelpers::HeavyObjectCache> initializeGlobalCache(const edm::ParameterSet& conf) {
75  return std::make_unique<goodseedhelpers::HeavyObjectCache>(conf);
76  }
77 
79 
80 private:
81  void beginRun(const edm::Run& run, const edm::EventSetup&) override;
82  void produce(edm::Event&, const edm::EventSetup&) override;
83 
85  int getBin(float, float);
86 
90  // ----------member data ---------------------------
91 
94 
97 
100 
101  // needed by the above
103 
105  std::unique_ptr<PFTrackTransformer> pfTransformer_;
106 
109 
111  double minPt_;
112  double maxPt_;
113  double maxEta_;
114 
120  double minEoverP_;
121  double maxHoverP_;
122 
125 
127  double minEp_;
128  double maxEp_;
129 
132 
135 
138 
141 
143  float thr[150];
144 
145  // ----------access to event data
150  std::vector<edm::EDGetTokenT<std::vector<Trajectory>>> trajContainers_;
151  std::vector<edm::EDGetTokenT<reco::TrackCollection>> tracksContainers_;
152 
157 
158  std::unique_ptr<PFResolutionMap> resMapEtaECAL_;
159  std::unique_ptr<PFResolutionMap> resMapPhiECAL_;
160 
166 
170 
174  double Min_dr_;
175 
177  bool useTmva_;
178 
181 
183  std::map<reco::TrackRef, unsigned> refMap_;
184 };
185 
186 using namespace edm;
187 using namespace std;
188 using namespace reco;
189 
191  : pfTransformer_(nullptr),
192  conf_(iConfig),
193  resMapEtaECAL_(nullptr),
194  resMapPhiECAL_(nullptr),
195  fitterToken_(esConsumes(edm::ESInputTag("", iConfig.getParameter<string>("Fitter")))),
196  smootherToken_(esConsumes(edm::ESInputTag("", iConfig.getParameter<string>("Smoother")))),
197  trackerRecHitBuilderToken_(esConsumes(edm::ESInputTag("", iConfig.getParameter<std::string>("TTRHBuilder")))),
198  magneticFieldToken_(esConsumes()),
199  magneticFieldTokenBeginRun_(esConsumes<edm::Transition::BeginRun>()) {
200  LogInfo("GoodSeedProducer") << "Electron PreIdentification started ";
201 
202  //now do what ever initialization is needed
203  std::vector<edm::InputTag> tags = iConfig.getParameter<vector<InputTag>>("TkColList");
204  for (unsigned int i = 0; i < tags.size(); ++i) {
205  trajContainers_.push_back(consumes<vector<Trajectory>>(tags[i]));
206  tracksContainers_.push_back(consumes<reco::TrackCollection>(tags[i]));
207  }
208 
209  minPt_ = iConfig.getParameter<double>("MinPt");
210  maxPt_ = iConfig.getParameter<double>("MaxPt");
211  maxEta_ = iConfig.getParameter<double>("MaxEta");
212 
213  HcalIsolWindow_ = iConfig.getParameter<double>("HcalWindow");
214  EcalStripSumE_minClusEnergy_ = iConfig.getParameter<double>("EcalStripSumE_minClusEnergy");
215  EcalStripSumE_deltaEta_ = iConfig.getParameter<double>("EcalStripSumE_deltaEta");
216  EcalStripSumE_deltaPhiOverQ_minValue_ = iConfig.getParameter<double>("EcalStripSumE_deltaPhiOverQ_minValue");
217  EcalStripSumE_deltaPhiOverQ_maxValue_ = iConfig.getParameter<double>("EcalStripSumE_deltaPhiOverQ_maxValue");
218  minEoverP_ = iConfig.getParameter<double>("EOverPLead_minValue");
219  maxHoverP_ = iConfig.getParameter<double>("HOverPLead_maxValue");
220 
221  pfCLusTagECLabel_ = consumes<reco::PFClusterCollection>(iConfig.getParameter<InputTag>("PFEcalClusterLabel"));
222 
223  pfCLusTagHCLabel_ = consumes<reco::PFClusterCollection>(iConfig.getParameter<InputTag>("PFHcalClusterLabel"));
224 
225  pfCLusTagPSLabel_ = consumes<reco::PFClusterCollection>(iConfig.getParameter<InputTag>("PFPSClusterLabel"));
226 
227  preidgsf_ = iConfig.getParameter<string>("PreGsfLabel");
228  preidckf_ = iConfig.getParameter<string>("PreCkfLabel");
229  preidname_ = iConfig.getParameter<string>("PreIdLabel");
230 
231  fitterName_ = iConfig.getParameter<string>("Fitter");
232  smootherName_ = iConfig.getParameter<string>("Smoother");
233 
234  nHitsInSeed_ = iConfig.getParameter<int>("NHitsInSeed");
235 
236  clusThreshold_ = iConfig.getParameter<double>("ClusterThreshold");
237 
238  minEp_ = iConfig.getParameter<double>("MinEOverP");
239  maxEp_ = iConfig.getParameter<double>("MaxEOverP");
240 
241  //collection to produce
242  produceCkfseed_ = iConfig.getUntrackedParameter<bool>("ProduceCkfSeed", false);
243 
244  // to disable the electron part (for HI collisions for examples)
245  disablePreId_ = iConfig.getUntrackedParameter<bool>("DisablePreId", false);
246 
247  producePreId_ = iConfig.getUntrackedParameter<bool>("ProducePreId", true);
248  // if no electron, cannot produce the preid
249  if (disablePreId_)
250  producePreId_ = false;
251  PtThresholdSavePredId_ = iConfig.getUntrackedParameter<double>("PtThresholdSavePreId", 1.);
252 
253  LogDebug("GoodSeedProducer") << "Seeds for GSF will be produced ";
254 
255  // no disablePreId_ switch here. The collection will be empty if it is true
256  produces<ElectronSeedCollection>(preidgsf_);
257 
258  if (produceCkfseed_) {
259  LogDebug("GoodSeedProducer") << "Seeds for CKF will be produced ";
260  produces<TrajectorySeedCollection>(preidckf_);
261  }
262 
263  if (producePreId_) {
264  LogDebug("GoodSeedProducer") << "PreId debugging information will be produced ";
265 
266  produces<PreIdCollection>(preidname_);
267  if (tracksContainers_.size() == 1) // do not make a value map if more than one input track collection
269  }
270 
271  useQuality_ = iConfig.getParameter<bool>("UseQuality");
273 
274  useTmva_ = iConfig.getUntrackedParameter<bool>("UseTMVA", false);
275 
276  Min_dr_ = iConfig.getParameter<double>("Min_dr");
277 
278  trackerRecHitBuilderName_ = iConfig.getParameter<std::string>("TTRHBuilder");
279 }
280 
281 //
282 // member functions
283 //
284 
285 // ------------ method called to produce the data ------------
287  LogDebug("GoodSeedProducer") << "START event: " << iEvent.id().event() << " in run " << iEvent.id().run();
288  //Create empty output collections
289  auto output_preid = std::make_unique<ElectronSeedCollection>();
290  auto output_nopre = std::make_unique<TrajectorySeedCollection>();
291  auto output_preidinfo = std::make_unique<PreIdCollection>();
292  auto preIdMap_p = std::make_unique<edm::ValueMap<reco::PreIdRef>>();
293  edm::ValueMap<reco::PreIdRef>::Filler mapFiller(*preIdMap_p);
294 
295  std::unique_ptr<TrajectoryFitter> fitter;
296  std::unique_ptr<TrajectorySmoother> smoother;
297 
298  //Tracking Tools
299  if (!disablePreId_) {
300  auto const& aFitter = &iSetup.getData(fitterToken_);
301  auto const& aSmoother = &iSetup.getData(smootherToken_);
302 
303  smoother.reset(aSmoother->clone());
304  fitter = aFitter->clone();
305  auto const& theTrackerRecHitBuilder = &iSetup.getData(trackerRecHitBuilderToken_);
306  hitCloner = static_cast<TkTransientTrackingRecHitBuilder const*>(theTrackerRecHitBuilder)->cloner();
307  fitter->setHitCloner(&hitCloner);
308  smoother->setHitCloner(&hitCloner);
309  }
310 
311  // clear temporary maps
312  refMap_.clear();
313 
314  //Magnetic Field
315  auto const& magneticField = &iSetup.getData(magneticFieldToken_);
316 
317  //Handle input collections
318  //ECAL clusters
319  Handle<PFClusterCollection> theECPfClustCollection;
320  iEvent.getByToken(pfCLusTagECLabel_, theECPfClustCollection);
321 
322  vector<PFCluster const*> basClus;
323  for (auto const& klus : *theECPfClustCollection.product()) {
324  if (klus.correctedEnergy() > clusThreshold_)
325  basClus.push_back(&klus);
326  }
327 
328  //HCAL clusters
329  Handle<PFClusterCollection> theHCPfClustCollection;
330  iEvent.getByToken(pfCLusTagHCLabel_, theHCPfClustCollection);
331 
332  //PS clusters
333  Handle<PFClusterCollection> thePSPfClustCollection;
334  iEvent.getByToken(pfCLusTagPSLabel_, thePSPfClustCollection);
335 
336  //Vector of track collections
337  for (unsigned int istr = 0; istr < tracksContainers_.size(); ++istr) {
338  //Track collection
339  Handle<TrackCollection> tkRefCollection;
340  iEvent.getByToken(tracksContainers_[istr], tkRefCollection);
341  const TrackCollection& Tk = *(tkRefCollection.product());
342 
343  LogDebug("GoodSeedProducer") << "Number of tracks in collection "
344  << "tracksContainers_[" << istr << "] to be analyzed " << Tk.size();
345 
346  //loop over the track collection
347  for (unsigned int i = 0; i < Tk.size(); ++i) {
348  if (useQuality_ && (!(Tk[i].quality(trackQuality_))))
349  continue;
350 
351  reco::PreId myPreId;
352  bool GoodPreId = false;
353 
354  TrackRef trackRef(tkRefCollection, i);
355  math::XYZVectorF tkmom(Tk[i].momentum());
356  auto tketa = tkmom.eta();
357  auto tkpt = std::sqrt(tkmom.perp2());
358  auto const& Seed = (*trackRef->seedRef());
359 
360  if (!disablePreId_) {
361  int ipteta = getBin(Tk[i].eta(), Tk[i].pt());
362  int ibin = ipteta * 9;
363 
364  // FIXME the original code was buggy should be outerMomentum...
365  float oPTOB = 1.f / std::sqrt(Tk[i].innerMomentum().mag2());
366  // float chikfred=Tk[i].normalizedChi2();
367  float nchi = Tk[i].normalizedChi2();
368 
369  int nhitpi = Tk[i].found();
370  float EP = 0;
371 
372  // set track info
373  myPreId.setTrack(trackRef);
374  //CLUSTERS - TRACK matching
375 
376  auto pfmass = 0.0005;
377  auto pfoutenergy = sqrt((pfmass * pfmass) + Tk[i].outerMomentum().Mag2());
378 
380  Tk[i].outerMomentum().x(), Tk[i].outerMomentum().y(), Tk[i].outerMomentum().z(), pfoutenergy);
382  XYZTLorentzVector(Tk[i].outerPosition().x(), Tk[i].outerPosition().y(), Tk[i].outerPosition().z(), 0.);
383 
384  BaseParticlePropagator theOutParticle(RawParticle(mom, pos, Tk[i].charge()), 0, 0, B_.z());
385 
386  theOutParticle.propagateToEcalEntrance(false);
387 
388  float toteta = 1000.f;
389  float totphi = 1000.f;
390  float dr = 1000.f;
391  float EE = 0.f;
392  float feta = 0.f;
393  GlobalPoint ElecTrkEcalPos(0, 0, 0);
394 
395  PFClusterRef clusterRef;
396  math::XYZPoint meanShowerSaved;
397  if (theOutParticle.getSuccess() != 0) {
398  ElecTrkEcalPos = GlobalPoint(theOutParticle.particle().vertex().x(),
399  theOutParticle.particle().vertex().y(),
400  theOutParticle.particle().vertex().z());
401 
402  constexpr float psLim = 2.50746495928f; // std::sinh(1.65f);
403  bool isBelowPS = (ElecTrkEcalPos.z() * ElecTrkEcalPos.z()) > (psLim * psLim) * ElecTrkEcalPos.perp2();
404  // bool isBelowPS=(std::abs(ElecTrkEcalPos.eta())>1.65f);
405 
406  unsigned clusCounter = 0;
407  float max_ee = 0;
408  for (auto aClus : basClus) {
409  float tmp_ep = float(aClus->correctedEnergy()) * oPTOB;
410  if ((tmp_ep < minEp_) | (tmp_ep > maxEp_)) {
411  ++clusCounter;
412  continue;
413  }
414 
415  double ecalShowerDepth = PFCluster::getDepthCorrection(aClus->correctedEnergy(), isBelowPS, false);
416  auto mom = theOutParticle.particle().momentum().Vect();
417  auto meanShower = ElecTrkEcalPos + GlobalVector(mom.x(), mom.y(), mom.z()).unit() * ecalShowerDepth;
418 
419  float etarec = meanShower.eta();
420  float phirec = meanShower.phi();
421 
422  float tmp_phi = std::abs(aClus->positionREP().phi() - phirec);
423  if (tmp_phi > float(TMath::Pi()))
424  tmp_phi -= float(TMath::TwoPi());
425 
426  float tmp_dr = std::sqrt(std::pow(tmp_phi, 2.f) + std::pow(aClus->positionREP().eta() - etarec, 2.f));
427 
428  if (tmp_dr < dr) {
429  dr = tmp_dr;
430  if (dr < Min_dr_) { // find the most closest and energetic ECAL cluster
431  if (aClus->correctedEnergy() > max_ee) {
432  toteta = aClus->positionREP().eta() - etarec;
433  totphi = tmp_phi;
434  EP = tmp_ep;
435  EE = aClus->correctedEnergy();
436  feta = aClus->positionREP().eta();
437  clusterRef = PFClusterRef(theECPfClustCollection, clusCounter);
438  meanShowerSaved = meanShower;
439  }
440  }
441  }
442  ++clusCounter;
443  }
444  }
445  float trk_ecalDeta_ = fabs(toteta);
446  float trk_ecalDphi_ = fabs(totphi);
447 
448  //Resolution maps
449  auto ecaletares = resMapEtaECAL_->GetBinContent(resMapEtaECAL_->FindBin(feta, EE));
450  auto ecalphires = resMapPhiECAL_->GetBinContent(resMapPhiECAL_->FindBin(feta, EE));
451 
452  //geomatrical compatibility
453  float chieta = (toteta != 1000.f) ? toteta / ecaletares : toteta;
454  float chiphi = (totphi != 1000.f) ? totphi / ecalphires : totphi;
455  float chichi = sqrt(chieta * chieta + chiphi * chiphi);
456 
457  //Matching criteria
458  float eta_cut = thr[ibin + 0];
459  float phi_cut = thr[ibin + 1];
460  float ep_cutmin = thr[ibin + 2];
461  bool GoodMatching =
462  ((trk_ecalDeta_ < eta_cut) && (trk_ecalDphi_ < phi_cut) && (EP > ep_cutmin) && (nhitpi > 10));
463 
464  bool EcalMatching = GoodMatching;
465 
466  if (tkpt > maxPt_)
467  GoodMatching = true;
468  if (tkpt < minPt_)
469  GoodMatching = false;
470 
471  math::XYZPoint myPoint(ElecTrkEcalPos.x(), ElecTrkEcalPos.y(), ElecTrkEcalPos.z());
473  clusterRef, myPoint, meanShowerSaved, std::abs(toteta), std::abs(totphi), chieta, chiphi, chichi, EP);
474  myPreId.setECALMatching(EcalMatching);
475 
476  bool GoodRange = ((std::abs(tketa) < maxEta_) & (tkpt > minPt_));
477  //KF FILTERING FOR UNMATCHED EVENTS
478  int hit1max = int(thr[ibin + 3]);
479  float chiredmin = thr[ibin + 4];
480  bool GoodKFFiltering = ((nchi > chiredmin) | (nhitpi < hit1max));
481 
482  myPreId.setTrackFiltering(GoodKFFiltering);
483 
484  bool GoodTkId = false;
485 
486  if ((!GoodMatching) && (GoodKFFiltering) && (GoodRange)) {
487  chired = 1000;
488  chiRatio = 1000;
489  dpt = 0;
490  nhit = nhitpi;
491  chikfred = nchi;
492  trk_ecalDeta = trk_ecalDeta_;
493  trk_ecalDphi = trk_ecalDphi_;
494 
496  for (auto const& hit : Tk[i].recHits())
497  tmp.push_back(hit->cloneSH());
498  auto const& theTrack = Tk[i];
499  GlobalVector gv(theTrack.innerMomentum().x(), theTrack.innerMomentum().y(), theTrack.innerMomentum().z());
500  GlobalPoint gp(theTrack.innerPosition().x(), theTrack.innerPosition().y(), theTrack.innerPosition().z());
501  GlobalTrajectoryParameters gtps(gp, gv, theTrack.charge(), &*magneticField);
502  TrajectoryStateOnSurface tsos(gtps, theTrack.innerStateCovariance(), *tmp[0]->surface());
503  Trajectory&& FitTjs = fitter->fitOne(Seed, tmp, tsos);
504 
505  if (FitTjs.isValid()) {
506  Trajectory&& SmooTjs = smoother->trajectory(FitTjs);
507  if (SmooTjs.isValid()) {
508  //Track refitted with electron hypothesis
509 
510  float pt_out = SmooTjs.firstMeasurement().updatedState().globalMomentum().perp();
511  float pt_in = SmooTjs.lastMeasurement().updatedState().globalMomentum().perp();
512  dpt = (pt_in > 0) ? fabs(pt_out - pt_in) / pt_in : 0.;
513  // the following is simply the number of degrees of freedom
514  chiRatio = SmooTjs.chiSquared() / Tk[i].chi2();
516  }
517  }
518 
519  //TMVA Analysis
520  if (useTmva_) {
521  float vars[10] = {nhit, chikfred, dpt, EP, chiRatio, chired, trk_ecalDeta, trk_ecalDphi, tkpt, tketa};
522 
523  float Ytmva = globalCache()->gbr[ipteta]->GetClassifier(vars);
524 
525  float BDTcut = thr[ibin + 5];
526  if (Ytmva > BDTcut)
527  GoodTkId = true;
528  myPreId.setMVA(GoodTkId, Ytmva);
530  } else {
531  float chiratiocut = thr[ibin + 6];
532  float gschicut = thr[ibin + 7];
533  float gsptmin = thr[ibin + 8];
534 
535  GoodTkId = ((dpt > gsptmin) & (chired < gschicut) & (chiRatio < chiratiocut));
536  }
537  }
538 
539  GoodPreId = GoodTkId | GoodMatching;
540 
541  myPreId.setFinalDecision(GoodPreId);
542 
543 #ifdef EDM_ML_DEBUG
544  if (GoodPreId)
545  LogDebug("GoodSeedProducer") << "Track (pt= " << Tk[i].pt() << "GeV/c, eta= " << Tk[i].eta()
546  << ") preidentified for agreement between track and ECAL cluster";
547  if (GoodPreId && (!GoodMatching))
548  LogDebug("GoodSeedProducer") << "Track (pt= " << Tk[i].pt() << "GeV/c, eta= " << Tk[i].eta()
549  << ") preidentified only for track properties";
550 #endif
551 
552  } // end of !disablePreId_
553 
554  if (GoodPreId) {
555  //NEW SEED with n hits
556  ElectronSeed NewSeed(Seed);
557  NewSeed.setCtfTrack(trackRef);
558  output_preid->push_back(NewSeed);
559  } else {
560  if (produceCkfseed_) {
561  output_nopre->push_back(Seed);
562  }
563  }
564  if (producePreId_ && myPreId.pt() > PtThresholdSavePredId_) {
565  // save the index of the PreId object as to be able to create a Ref later
566  refMap_[trackRef] = output_preidinfo->size();
567  output_preidinfo->push_back(myPreId);
568  }
569  } //end loop on track collection
570  } //end loop on the vector of track collections
571 
572  // no disablePreId_ switch, it is simpler to have an empty collection rather than no collection
573  iEvent.put(std::move(output_preid), preidgsf_);
574  if (produceCkfseed_)
575  iEvent.put(std::move(output_nopre), preidckf_);
576  if (producePreId_) {
577  const edm::OrphanHandle<reco::PreIdCollection> preIdRefProd = iEvent.put(std::move(output_preidinfo), preidname_);
578  // now make the Value Map, but only if one input collection
579  if (tracksContainers_.size() == 1) {
580  Handle<TrackCollection> tkRefCollection;
581  iEvent.getByToken(tracksContainers_[0], tkRefCollection);
582  fillPreIdRefValueMap(tkRefCollection, preIdRefProd, mapFiller);
583  mapFiller.fill();
584  iEvent.put(std::move(preIdMap_p), preidname_);
585  }
586  }
587  // clear temporary maps
588  refMap_.clear();
589 }
590 
591 // intialize the cross-thread cache to hold gbr trees and resolution maps
592 namespace goodseedhelpers {
594  // mvas
595  const bool useTmva = conf.getUntrackedParameter<bool>("UseTMVA", false);
596 
597  if (useTmva) {
598  std::array<edm::FileInPath, kMaxWeights> weights = {{edm::FileInPath(conf.getParameter<string>("Weights1")),
599  edm::FileInPath(conf.getParameter<string>("Weights2")),
600  edm::FileInPath(conf.getParameter<string>("Weights3")),
601  edm::FileInPath(conf.getParameter<string>("Weights4")),
602  edm::FileInPath(conf.getParameter<string>("Weights5")),
603  edm::FileInPath(conf.getParameter<string>("Weights6")),
604  edm::FileInPath(conf.getParameter<string>("Weights7")),
605  edm::FileInPath(conf.getParameter<string>("Weights8")),
606  edm::FileInPath(conf.getParameter<string>("Weights9"))}};
607 
608  for (UInt_t j = 0; j < gbr.size(); ++j) {
610  }
611  }
612  }
613 } // namespace goodseedhelpers
614 
615 // ------------ method called once each job just before starting event loop ------------
617  //Magnetic Field
619  B_ = magneticField->inTesla(GlobalPoint(0, 0, 0));
620 
621  pfTransformer_ = std::make_unique<PFTrackTransformer>(B_);
622  pfTransformer_->OnlyProp();
623 
624  //Resolution maps
625  FileInPath ecalEtaMap(conf_.getParameter<string>("EtaMap"));
626  FileInPath ecalPhiMap(conf_.getParameter<string>("PhiMap"));
627  resMapEtaECAL_ = std::make_unique<PFResolutionMap>("ECAL_eta", ecalEtaMap.fullPath().c_str());
628  resMapPhiECAL_ = std::make_unique<PFResolutionMap>("ECAL_phi", ecalPhiMap.fullPath().c_str());
629 
630  //read threshold
631  FileInPath parFile(conf_.getParameter<string>("ThresholdFile"));
632  ifstream ifs(parFile.fullPath().c_str());
633  for (int iy = 0; iy < 81; ++iy)
634  ifs >> thr[iy];
635 }
636 
637 int GoodSeedProducer::getBin(float eta, float pt) {
638  int ie = 0;
639  int ip = 0;
640  if (fabs(eta) < 0.8)
641  ie = 0;
642  else {
643  if (fabs(eta) < 1.479)
644  ie = 1;
645  else
646  ie = 2;
647  }
648  if (pt < 6)
649  ip = 0;
650  else {
651  if (pt < 12)
652  ip = 1;
653  else
654  ip = 2;
655  }
656  int iep = ie * 3 + ip;
657  LogDebug("GoodSeedProducer") << "Track pt =" << pt << " eta=" << eta << " bin=" << iep;
658  return iep;
659 }
660 
662  const edm::OrphanHandle<reco::PreIdCollection>& preidhandle,
664  std::vector<reco::PreIdRef> values;
665 
666  unsigned ntracks = tracks->size();
667  for (unsigned itrack = 0; itrack < ntracks; ++itrack) {
668  reco::TrackRef theTrackRef(tracks, itrack);
669  std::map<reco::TrackRef, unsigned>::const_iterator itcheck = refMap_.find(theTrackRef);
670  if (itcheck == refMap_.end()) {
671  // the track has been early discarded
672  values.push_back(reco::PreIdRef());
673  } else {
674  edm::Ref<reco::PreIdCollection> preIdRef(preidhandle, itcheck->second);
675  values.push_back(preIdRef);
676  // std::cout << " Checking Refs " << (theTrackRef==preIdRef->trackRef()) << std::endl;
677  }
678  }
679  filler.insert(tracks, values.begin(), values.end());
680 }
681 
int nHitsInSeed_
Number of hits in the seed;.
const double TwoPi
const double Pi
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magneticFieldToken_
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
HeavyObjectCache(const edm::ParameterSet &conf)
T perp() const
Definition: PV3DBase.h:69
void setECALMatchingProperties(PFClusterRef clusterRef, const math::XYZPoint &ecalpos, const math::XYZPoint &meanShower, float deta, float dphi, float chieta, float chiphi, float chi2, float eop)
Definition: PreId.h:33
bool isValid() const
Definition: Trajectory.h:257
std::string preidckf_
Name of the Seed(Ckf) Collection.
std::string fullPath() const
Definition: FileInPath.cc:161
Quality qualityByName(std::string const &name)
edm::EDGetTokenT< reco::PFClusterCollection > pfCLusTagPSLabel_
T z() const
Definition: PV3DBase.h:61
TrackQuality
track quality
Definition: TrackBase.h:150
T const * product() const
Definition: Handle.h:70
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
float pt() const
Definition: PreId.h:80
std::unique_ptr< PFResolutionMap > resMapEtaECAL_
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:14
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > magneticFieldTokenBeginRun_
float chiSquared() const
Definition: Trajectory.h:241
double EcalStripSumE_minClusEnergy_
float thr[150]
vector of thresholds for different bins of eta and pt
std::array< std::unique_ptr< const GBRForest >, kMaxWeights > gbr
GoodSeedProducer(const edm::ParameterSet &, const goodseedhelpers::HeavyObjectCache *)
TrajectoryMeasurement const & lastMeasurement() const
Definition: Trajectory.h:150
TkClonerImpl hitCloner
void setCtfTrack(const CtfTrackRef &)
Set additional info.
Definition: ElectronSeed.cc:39
T getUntrackedParameter(std::string const &, T const &) const
void setTrack(reco::TrackRef trackref)
Definition: PreId.h:31
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
int getBin(float, float)
Find the bin in pt and eta.
int iEvent
Definition: GenABIO.cc:224
edm::ParameterSet conf_
void setMVA(bool accepted, float mva, unsigned n=0)
Definition: PreId.h:63
double EcalStripSumE_deltaPhiOverQ_minValue_
double EcalStripSumE_deltaPhiOverQ_maxValue_
void setTrackFiltering(bool accepted, unsigned n=0)
Definition: PreId.h:62
void produce(edm::Event &, const edm::EventSetup &) override
T sqrt(T t)
Definition: SSEVec.h:19
TrajectoryStateOnSurface TSOS
math::XYZVector B_
B field.
std::string preidname_
Name of the preid Collection (FB)
std::string propagatorName_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Transition
Definition: Transition.h:12
bool useQuality_
TRACK QUALITY.
void fillPreIdRefValueMap(edm::Handle< reco::TrackCollection > tkhandle, const edm::OrphanHandle< reco::PreIdCollection > &, edm::ValueMap< reco::PreIdRef >::Filler &filler)
double f[11][100]
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::vector< edm::EDGetTokenT< reco::TrackCollection > > tracksContainers_
double minPt_
Minimum transverse momentum and maximum pseudorapidity.
bool getData(T &iHolder) const
Definition: EventSetup.h:122
std::string fitterName_
bool disablePreId_
switch to disable the pre-id
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< float > > XYZVectorF
spatial vector with cartesian internal representation
Definition: Vector3D.h:16
static void globalEndJob(goodseedhelpers::HeavyObjectCache const *)
void beginRun(const edm::Run &run, const edm::EventSetup &) override
reco::TrackBase::TrackQuality trackQuality_
Basic3DVector unit() const
double clusThreshold_
Cut on the energy of the clusters.
bool propagateToEcalEntrance(bool first=true)
Log< level::Info, false > LogInfo
static constexpr unsigned int kMaxWeights
bool produceCkfseed_
Produce the Seed for Ckf tracks?
const edm::ESGetToken< TrajectorySmoother, TrajectoryFitter::Record > smootherToken_
auto const & tracks
cannot be loose
bool useTmva_
USE OF TMVA.
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
std::unique_ptr< PFResolutionMap > resMapPhiECAL_
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
const edm::ESGetToken< TrajectoryFitter, TrajectoryFitter::Record > fitterToken_
std::map< reco::TrackRef, unsigned > refMap_
Map used to create the TrackRef, PreIdRef value map.
GlobalVector globalMomentum() const
T perp2() const
Definition: PV3DBase.h:68
TrajectoryStateOnSurface const & updatedState() const
TrackingRecHit::ConstRecHitContainer ConstRecHitContainer
Definition: Trajectory.h:41
void setTrackProperties(float newchi2, float chi2ratio, float dpt)
Definition: PreId.h:53
fixed size matrix
HLT enums.
void setECALMatching(bool accepted, unsigned n=0)
Definition: PreId.h:60
TrajectoryMeasurement const & firstMeasurement() const
Definition: Trajectory.h:166
bool producePreId_
Produce the pre-id debugging collection.
std::unique_ptr< PFTrackTransformer > pfTransformer_
PFTrackTransformer.
std::string trackerRecHitBuilderName_
std::string smootherName_
edm::EDGetTokenT< reco::PFClusterCollection > pfCLusTagHCLabel_
const edm::ESGetToken< TransientTrackingRecHitBuilder, TransientRecHitRecord > trackerRecHitBuilderToken_
vars
Definition: DeepTauId.cc:30
string quality
tmp
align.sh
Definition: createJobs.py:716
std::string preidgsf_
Name of the Seed(Gsf) Collection.
edm::EDGetTokenT< reco::PFClusterCollection > pfCLusTagECLabel_
double minEp_
Min and MAx allowed values forEoverP.
float nhit
VARIABLES NEEDED FOR TMVA.
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
def move(src, dest)
Definition: eostools.py:511
std::vector< edm::EDGetTokenT< std::vector< Trajectory > > > trajContainers_
static std::unique_ptr< goodseedhelpers::HeavyObjectCache > initializeGlobalCache(const edm::ParameterSet &conf)
std::unique_ptr< const GBRForest > createGBRForest(const std::string &weightsFile)
Definition: Run.h:45
double PtThresholdSavePredId_
Threshold to save Pre Idinfo.
Global3DVector GlobalVector
Definition: GlobalVector.h:10
void setFinalDecision(bool accepted, unsigned n=0)
Definition: PreId.h:59
math::XYZTLorentzVector XYZTLorentzVector
Definition: RawParticle.h:25
edm::Ref< l1t::PFClusterCollection > PFClusterRef
Definition: PFCluster.h:75
#define LogDebug(id)