CMS 3D CMS Logo

PFElectronTranslator.cc
Go to the documentation of this file.
22 
23 class DetId;
24 namespace edm {
25  class EventSetup;
26 } // namespace edm
27 
29 public:
30  explicit PFElectronTranslator(const edm::ParameterSet&);
31  ~PFElectronTranslator() override;
32 
33  void produce(edm::Event&, const edm::EventSetup&) override;
34 
35  typedef std::vector<edm::Handle<edm::ValueMap<double>>> IsolationValueMaps;
36 
37 private:
38  // to retrieve the collection from the event
40  const edm::InputTag& tag,
41  const edm::Event& iEvent) const;
42  // to retrieve the collection from the event
44  const edm::InputTag& tag,
45  const edm::Event& iEvent) const;
46 
47  // makes a basic cluster from PFBlockElement and add it to the collection ; the corrected energy is taken
48  // from the PFCandidate
50  reco::BasicClusterCollection& basicClusters,
51  std::vector<const reco::PFCluster*>&,
52  const reco::PFCandidate& coCandidate) const;
53  // makes a preshower cluster from of PFBlockElement and add it to the collection
55  reco::PreshowerClusterCollection& preshowerClusters,
56  unsigned plane) const;
57 
58  // make a super cluster from its ingredients and add it to the collection
60 
61  // make GsfElectronCores from ingredients
63 
64  // create the basic cluster Ptr
66 
67  // create the preshower cluster Refs
69 
70  // create the super cluster Refs
72 
73  // create the GsfElectronCore Refs
75 
76  // create the GsfElectrons
80 
81  // The following methods are used to fill the value maps
85  void getAmbiguousGsfTracks(const reco::PFBlockElement& PFBE, std::vector<reco::GsfTrackRef>&) const;
86 
88  const reco::PFBlockElement& pfbe) const;
89 
90 private:
94  std::vector<edm::InputTag> inputTagIsoVals_;
102  double MVACut_;
104 
105  // The following vectors correspond to a GSF track, but the order is not
106  // the order of the tracks in the GSF track collection
107  std::vector<reco::GsfTrackRef> GsfTrackRef_;
108  // the list of candidatePtr
109  std::vector<reco::CandidatePtr> CandidatePtr_;
110  //the list of KfTrackRef
111  std::vector<reco::TrackRef> kfTrackRef_;
112  // the list of ambiguous tracks
113  std::vector<std::vector<reco::GsfTrackRef>> ambiguousGsfTracks_;
114  // the collection of basic clusters associated to a GSF track
115  std::vector<reco::BasicClusterCollection> basicClusters_;
116  // the correcsponding PFCluster ref
117  std::vector<std::vector<const reco::PFCluster*>> pfClusters_;
118  // the collection of preshower clusters associated to a GSF track
119  std::vector<reco::PreshowerClusterCollection> preshowerClusters_;
120  // the super cluster collection (actually only one) associated to a GSF track
121  std::vector<reco::SuperClusterCollection> superClusters_;
122  // the references to the basic clusters associated to a GSF track
123  std::vector<reco::CaloClusterPtrVector> basicClusterPtr_;
124  // the references to the basic clusters associated to a GSF track
125  std::vector<reco::CaloClusterPtrVector> preshowerClusterPtr_;
126  // the references to the GsfElectonCore associated to a GSF track
127  std::vector<reco::GsfElectronCoreRef> gsfElectronCoreRefs_;
128  // keep track of the index of the PF Candidate
129  std::vector<int> gsfPFCandidateIndex_;
130  // maps to ease the creation of the Value Maps
131  std::map<reco::GsfTrackRef, reco::SuperClusterRef> scMap_;
132  std::map<reco::GsfTrackRef, float> gsfMvaMap_;
133 
134  // Mustache SC parameters
137 
139 };
140 
142 
144  inputTagPFCandidates_ = iConfig.getParameter<edm::InputTag>("PFCandidate");
145  inputTagPFCandidateElectrons_ = iConfig.getParameter<edm::InputTag>("PFCandidateElectron");
146  inputTagGSFTracks_ = iConfig.getParameter<edm::InputTag>("GSFTracks");
147 
148  bool useIsolationValues = iConfig.getParameter<bool>("useIsolationValues");
149  if (useIsolationValues) {
150  if (!iConfig.exists("isolationValues"))
151  throw cms::Exception("PFElectronTranslator|InternalError") << "Missing ParameterSet isolationValues";
152  else {
153  edm::ParameterSet isoVals = iConfig.getParameter<edm::ParameterSet>("isolationValues");
154  inputTagIsoVals_.push_back(isoVals.getParameter<edm::InputTag>("pfSumChargedHadronPt"));
155  inputTagIsoVals_.push_back(isoVals.getParameter<edm::InputTag>("pfSumPhotonEt"));
156  inputTagIsoVals_.push_back(isoVals.getParameter<edm::InputTag>("pfSumNeutralHadronEt"));
157  inputTagIsoVals_.push_back(isoVals.getParameter<edm::InputTag>("pfSumPUPt"));
158  }
159  }
160 
161  PFBasicClusterCollection_ = iConfig.getParameter<std::string>("PFBasicClusters");
162  PFPreshowerClusterCollection_ = iConfig.getParameter<std::string>("PFPreshowerClusters");
163  PFSuperClusterCollection_ = iConfig.getParameter<std::string>("PFSuperClusters");
164  GsfElectronCoreCollection_ = iConfig.getParameter<std::string>("PFGsfElectronCore");
165  GsfElectronCollection_ = iConfig.getParameter<std::string>("PFGsfElectron");
166 
167  PFMVAValueMap_ = iConfig.getParameter<std::string>("ElectronMVA");
168  PFSCValueMap_ = iConfig.getParameter<std::string>("ElectronSC");
169  MVACut_ = (iConfig.getParameter<edm::ParameterSet>("MVACutBlock")).getParameter<double>("MVACut");
170  checkStatusFlag_ = iConfig.getParameter<bool>("CheckStatusFlag");
171 
172  if (iConfig.exists("emptyIsOk"))
173  emptyIsOk_ = iConfig.getParameter<bool>("emptyIsOk");
174  else
175  emptyIsOk_ = false;
176 
177  ecalMustacheSCParametersToken_ = esConsumes<EcalMustacheSCParameters, EcalMustacheSCParametersRcd>();
178 
179  produces<reco::BasicClusterCollection>(PFBasicClusterCollection_);
180  produces<reco::PreshowerClusterCollection>(PFPreshowerClusterCollection_);
181  produces<reco::SuperClusterCollection>(PFSuperClusterCollection_);
182  produces<reco::GsfElectronCoreCollection>(GsfElectronCoreCollection_);
183  produces<reco::GsfElectronCollection>(GsfElectronCollection_);
184  produces<edm::ValueMap<float>>(PFMVAValueMap_);
185  produces<edm::ValueMap<reco::SuperClusterRef>>(PFSCValueMap_);
186 }
187 
189 
192 
193  auto gsfElectronCores_p = std::make_unique<reco::GsfElectronCoreCollection>();
194 
195  auto gsfElectrons_p = std::make_unique<reco::GsfElectronCollection>();
196 
197  auto superClusters_p = std::make_unique<reco::SuperClusterCollection>();
198 
199  auto basicClusters_p = std::make_unique<reco::BasicClusterCollection>();
200 
201  auto psClusters_p = std::make_unique<reco::PreshowerClusterCollection>();
202 
203  auto mvaMap_p = std::make_unique<edm::ValueMap<float>>();
204  edm::ValueMap<float>::Filler mvaFiller(*mvaMap_p);
205 
206  auto scMap_p = std::make_unique<edm::ValueMap<reco::SuperClusterRef>>();
207  edm::ValueMap<reco::SuperClusterRef>::Filler scRefFiller(*scMap_p);
208 
211 
213  for (size_t j = 0; j < inputTagIsoVals_.size(); ++j) {
214  iEvent.getByLabel(inputTagIsoVals_[j], isolationValues[j]);
215  }
216 
217  // clear the vectors
218  GsfTrackRef_.clear();
219  CandidatePtr_.clear();
220  ambiguousGsfTracks_.clear();
221  kfTrackRef_.clear();
222  basicClusters_.clear();
223  pfClusters_.clear();
224  preshowerClusters_.clear();
225  superClusters_.clear();
226  basicClusterPtr_.clear();
227  preshowerClusterPtr_.clear();
228  gsfPFCandidateIndex_.clear();
229  gsfElectronCoreRefs_.clear();
230  scMap_.clear();
231 
232  // loop on the candidates
233  //CC@@
234  // we need first to create AND put the SuperCluster,
235  // basic clusters and presh clusters collection
236  // in order to get a working Handle
237  unsigned ncand = (status) ? pfCandidates->size() : 0;
238  unsigned iGSF = 0;
239  for (unsigned i = 0; i < ncand; ++i) {
240  const reco::PFCandidate& cand = (*pfCandidates)[i];
241  if (cand.particleId() != reco::PFCandidate::e)
242  continue;
243  if (cand.gsfTrackRef().isNull())
244  continue;
245  // Note that -1 will still cut some total garbage candidates
246  // Fill the MVA map
247  if (cand.mva_e_pi() < MVACut_)
248  continue;
249 
250  // Check the status flag
251  if (checkStatusFlag_ && !cand.electronExtraRef()->electronStatus(reco::PFCandidateElectronExtra::Selected)) {
252  continue;
253  }
254 
255  GsfTrackRef_.push_back(cand.gsfTrackRef());
256  kfTrackRef_.push_back(cand.trackRef());
257  gsfPFCandidateIndex_.push_back(i);
258 
259  reco::PFCandidatePtr ptrToPFElectron(pfCandidates, i);
260  //CandidatePtr_.push_back(ptrToPFElectron->sourceCandidatePtr(0));
261  CandidatePtr_.push_back(ptrToPFElectron);
262 
264  pfClusters_.push_back(std::vector<const reco::PFCluster*>());
266  ambiguousGsfTracks_.push_back(std::vector<reco::GsfTrackRef>());
267 
268  for (unsigned iele = 0; iele < cand.elementsInBlocks().size(); ++iele) {
269  // first get the block
270  reco::PFBlockRef blockRef = cand.elementsInBlocks()[iele].first;
271  //
272  unsigned elementIndex = cand.elementsInBlocks()[iele].second;
273  // check it actually exists
274  if (blockRef.isNull())
275  continue;
276 
277  // then get the elements of the block
278  const edm::OwnVector<reco::PFBlockElement>& elements = (*blockRef).elements();
279 
280  const reco::PFBlockElement& pfbe(elements[elementIndex]);
281  // The first ECAL element should be the cluster associated to the GSF; defined as the seed
282  if (pfbe.type() == reco::PFBlockElement::ECAL) {
283  // const reco::PFCandidate * coCandidate = &cand;
284  // the Brem photons are saved as daughter PFCandidate; this
285  // is convenient to access the corrected energy
286  // std::cout << " Found candidate " << correspondingDaughterCandidate(coCandidate,pfbe) << " " << coCandidate << std::endl;
288  }
289  if (pfbe.type() == reco::PFBlockElement::PS1) {
291  }
292  if (pfbe.type() == reco::PFBlockElement::PS2) {
294  }
295  if (pfbe.type() == reco::PFBlockElement::GSF) {
297  }
298 
299  } // loop on the elements
300 
301  // save the basic clusters
302  basicClusters_p->insert(basicClusters_p->end(), basicClusters_[iGSF].begin(), basicClusters_[iGSF].end());
303  // save the preshower clusters
304  psClusters_p->insert(psClusters_p->end(), preshowerClusters_[iGSF].begin(), preshowerClusters_[iGSF].end());
305 
306  ++iGSF;
307  } // loop on PFCandidates
308 
309  //Save the basic clusters and get an handle as to be able to create valid Refs (thanks to Claude)
310  // std::cout << " Number of basic clusters " << basicClusters_p->size() << std::endl;
312  iEvent.put(std::move(basicClusters_p), PFBasicClusterCollection_);
313 
314  //preshower clusters
316  iEvent.put(std::move(psClusters_p), PFPreshowerClusterCollection_);
317 
318  // now that the Basic clusters are in the event, the Ref can be created
319  createBasicClusterPtrs(bcRefProd);
320  // now that the preshower clusters are in the event, the Ref can be created
321  createPreshowerClusterPtrs(psRefProd);
322 
323  // and now the Super cluster can be created with valid references
324  if (status)
325  createSuperClusters(*pfCandidates, *superClusters_p);
326 
327  // Let's put the super clusters in the event
329  iEvent.put(std::move(superClusters_p), PFSuperClusterCollection_);
330  // create the super cluster Ref
331  createSuperClusterGsfMapRefs(scRefProd);
332 
333  // Now create the GsfElectronCoers
334  createGsfElectronCores(*gsfElectronCores_p);
335  // Put them in the as to get to be able to build a Ref
336  const edm::OrphanHandle<reco::GsfElectronCoreCollection> gsfElectronCoreRefProd =
337  iEvent.put(std::move(gsfElectronCores_p), GsfElectronCoreCollection_);
338 
339  // now create the Refs
340  createGsfElectronCoreRefs(gsfElectronCoreRefProd);
341 
342  // now make the GsfElectron
343  createGsfElectrons(*pfCandidates, isolationValues, *gsfElectrons_p);
344  iEvent.put(std::move(gsfElectrons_p), GsfElectronCollection_);
345 
346  fillMVAValueMap(iEvent, mvaFiller);
347  mvaFiller.fill();
348 
349  fillSCRefValueMap(iEvent, scRefFiller);
350  scRefFiller.fill();
351 
352  // MVA map
353  iEvent.put(std::move(mvaMap_p), PFMVAValueMap_);
354  // Gsf-SC map
355  iEvent.put(std::move(scMap_p), PFSCValueMap_);
356 }
357 
359  const edm::InputTag& tag,
360  const edm::Event& iEvent) const {
361  bool found = iEvent.getByLabel(tag, c);
362 
363  if (!found && !emptyIsOk_) {
364  std::ostringstream err;
365  err << " cannot get PFCandidates: " << tag << std::endl;
366  edm::LogError("PFElectronTranslator") << err.str();
367  }
368  return found;
369 }
370 
372  const edm::InputTag& tag,
373  const edm::Event& iEvent) const {
374  bool found = iEvent.getByLabel(tag, c);
375 
376  if (!found) {
377  std::ostringstream err;
378  err << " cannot get GSFTracks: " << tag << std::endl;
379  edm::LogError("PFElectronTranslator") << err.str();
380  throw cms::Exception("MissingProduct", err.str());
381  }
382 }
383 
384 // The basic cluster is a copy of the PFCluster -> the energy is not corrected
385 // It should be possible to get the corrected energy (including the associated PS energy)
386 // from the PFCandidate daugthers ; Needs some work
388  reco::BasicClusterCollection& basicClusters,
389  std::vector<const reco::PFCluster*>& pfClusters,
390  const reco::PFCandidate& coCandidate) const {
391  const reco::PFClusterRef& myPFClusterRef = PFBE.clusterRef();
392  if (myPFClusterRef.isNull())
393  return;
394 
395  const reco::PFCluster& myPFCluster(*myPFClusterRef);
396  pfClusters.push_back(&myPFCluster);
397  // std::cout << " Creating BC " << myPFCluster.energy() << " " << coCandidate.ecalEnergy() <<" "<< coCandidate.rawEcalEnergy() <<std::endl;
398  // std::cout << " # hits " << myPFCluster.hitsAndFractions().size() << std::endl;
399 
400  // basicClusters.push_back(reco::CaloCluster(myPFCluster.energy(),
401  basicClusters.push_back(reco::CaloCluster(
402  // myPFCluster.energy(),
403  coCandidate.rawEcalEnergy(),
404  myPFCluster.position(),
405  myPFCluster.caloID(),
406  myPFCluster.hitsAndFractions(),
407  myPFCluster.algo(),
408  myPFCluster.seed()));
409 }
410 
412  reco::PreshowerClusterCollection& preshowerClusters,
413  unsigned plane) const {
414  const reco::PFClusterRef& myPFClusterRef = PFBE.clusterRef();
415  preshowerClusters.push_back(reco::PreshowerCluster(
416  myPFClusterRef->energy(), myPFClusterRef->position(), myPFClusterRef->hitsAndFractions(), plane));
417 }
418 
420  const edm::OrphanHandle<reco::BasicClusterCollection>& basicClustersHandle) {
421  unsigned size = GsfTrackRef_.size();
422  unsigned basicClusterCounter = 0;
423  basicClusterPtr_.resize(size);
424 
425  for (unsigned iGSF = 0; iGSF < size; ++iGSF) // loop on tracks
426  {
427  unsigned nbc = basicClusters_[iGSF].size();
428  for (unsigned ibc = 0; ibc < nbc; ++ibc) // loop on basic clusters
429  {
430  // std::cout << "Track "<< iGSF << " ref " << basicClusterCounter << std::endl;
431  reco::CaloClusterPtr bcPtr(basicClustersHandle, basicClusterCounter);
432  basicClusterPtr_[iGSF].push_back(bcPtr);
433  ++basicClusterCounter;
434  }
435  }
436 }
437 
439  const edm::OrphanHandle<reco::PreshowerClusterCollection>& preshowerClustersHandle) {
440  unsigned size = GsfTrackRef_.size();
441  unsigned psClusterCounter = 0;
442  preshowerClusterPtr_.resize(size);
443 
444  for (unsigned iGSF = 0; iGSF < size; ++iGSF) // loop on tracks
445  {
446  unsigned nbc = preshowerClusters_[iGSF].size();
447  for (unsigned ibc = 0; ibc < nbc; ++ibc) // loop on basic clusters
448  {
449  // std::cout << "Track "<< iGSF << " ref " << basicClusterCounter << std::endl;
450  reco::CaloClusterPtr psPtr(preshowerClustersHandle, psClusterCounter);
451  preshowerClusterPtr_[iGSF].push_back(psPtr);
452  ++psClusterCounter;
453  }
454  }
455 }
456 
458  const edm::OrphanHandle<reco::SuperClusterCollection>& superClustersHandle) {
459  unsigned size = GsfTrackRef_.size();
460 
461  for (unsigned iGSF = 0; iGSF < size; ++iGSF) // loop on tracks
462  {
463  edm::Ref<reco::SuperClusterCollection> scRef(superClustersHandle, iGSF);
464  scMap_[GsfTrackRef_[iGSF]] = scRef;
465  }
466 }
467 
469  gsfMvaMap_.clear();
472 
473  unsigned ncand = (status) ? pfCandidates->size() : 0;
474  for (unsigned i = 0; i < ncand; ++i) {
475  const reco::PFCandidate& cand = (*pfCandidates)[i];
476  if (cand.particleId() != reco::PFCandidate::e)
477  continue;
478  if (cand.gsfTrackRef().isNull())
479  continue;
480  // Fill the MVA map
481  gsfMvaMap_[cand.gsfTrackRef()] = cand.mva_e_pi();
482  }
483 
486  unsigned ngsf = gsfTracks->size();
487  std::vector<float> values;
488  for (unsigned igsf = 0; igsf < ngsf; ++igsf) {
489  reco::GsfTrackRef theTrackRef(gsfTracks, igsf);
490  std::map<reco::GsfTrackRef, float>::const_iterator itcheck = gsfMvaMap_.find(theTrackRef);
491  if (itcheck == gsfMvaMap_.end()) {
492  // edm::LogWarning("PFElectronTranslator") << "MVA Map, missing GSF track ref " << std::endl;
493  values.push_back(-99.);
494  // std::cout << " Push_back -99. " << std::endl;
495  } else {
496  // std::cout << " Value " << itcheck->second << std::endl;
497  values.push_back(itcheck->second);
498  }
499  }
500  filler.insert(gsfTracks, values.begin(), values.end());
501 }
502 
507  unsigned ngsf = gsfTracks->size();
508  std::vector<reco::SuperClusterRef> values;
509  for (unsigned igsf = 0; igsf < ngsf; ++igsf) {
510  reco::GsfTrackRef theTrackRef(gsfTracks, igsf);
511  std::map<reco::GsfTrackRef, reco::SuperClusterRef>::const_iterator itcheck = scMap_.find(theTrackRef);
512  if (itcheck == scMap_.end()) {
513  // edm::LogWarning("PFElectronTranslator") << "SCRef Map, missing GSF track ref" << std::endl;
514  values.push_back(reco::SuperClusterRef());
515  } else {
516  values.push_back(itcheck->second);
517  }
518  }
519  filler.insert(gsfTracks, values.begin(), values.end());
520 }
521 
524  unsigned nGSF = GsfTrackRef_.size();
525  for (unsigned iGSF = 0; iGSF < nGSF; ++iGSF) {
526  // Computes energy position a la e/gamma
527  double sclusterE = 0;
528  double posX = 0.;
529  double posY = 0.;
530  double posZ = 0.;
531 
532  unsigned nbasics = basicClusters_[iGSF].size();
533  for (unsigned ibc = 0; ibc < nbasics; ++ibc) {
534  double e = basicClusters_[iGSF][ibc].energy();
535  sclusterE += e;
536  posX += e * basicClusters_[iGSF][ibc].position().X();
537  posY += e * basicClusters_[iGSF][ibc].position().Y();
538  posZ += e * basicClusters_[iGSF][ibc].position().Z();
539  }
540  posX /= sclusterE;
541  posY /= sclusterE;
542  posZ /= sclusterE;
543 
544  if (pfCand[gsfPFCandidateIndex_[iGSF]].gsfTrackRef() != GsfTrackRef_[iGSF]) {
545  edm::LogError("PFElectronTranslator") << " Major problem in PFElectron Translator" << std::endl;
546  }
547 
548  // compute the width
549  PFClusterWidthAlgo pfwidth(pfClusters_[iGSF]);
550 
551  double correctedEnergy = pfCand[gsfPFCandidateIndex_[iGSF]].ecalEnergy();
552  reco::SuperCluster mySuperCluster(correctedEnergy, math::XYZPoint(posX, posY, posZ));
553  // protection against empty basic cluster collection ; the value is -2 in this case
554  if (nbasics) {
555  // std::cout << "SuperCluster creation; energy " << pfCand[gsfPFCandidateIndex_[iGSF]].ecalEnergy();
556  // std::cout << " " << pfCand[gsfPFCandidateIndex_[iGSF]].rawEcalEnergy() << std::endl;
557  // std::cout << "Seed energy from basic " << basicClusters_[iGSF][0].energy() << std::endl;
558  mySuperCluster.setSeed(basicClusterPtr_[iGSF][0]);
559  } else {
560  // std::cout << "SuperCluster creation ; seed energy " << 0 << std::endl;
561  // std::cout << "SuperCluster creation ; energy " << pfCand[gsfPFCandidateIndex_[iGSF]].ecalEnergy();
562  // std::cout << " " << pfCand[gsfPFCandidateIndex_[iGSF]].rawEcalEnergy() << std::endl;
563  // std::cout << " No seed found " << 0 << std::endl;
564  // std::cout << " MVA " << pfCand[gsfPFCandidateIndex_[iGSF]].mva_e_pi() << std::endl;
565  mySuperCluster.setSeed(reco::CaloClusterPtr());
566  }
567  // the seed should be the first basic cluster
568 
569  for (unsigned ibc = 0; ibc < nbasics; ++ibc) {
570  mySuperCluster.addCluster(basicClusterPtr_[iGSF][ibc]);
571  // std::cout <<"Adding Ref to SC " << basicClusterPtr_[iGSF][ibc].index() << std::endl;
572  const std::vector<std::pair<DetId, float>>& v1 = basicClusters_[iGSF][ibc].hitsAndFractions();
573  // std::cout << " Number of cells " << v1.size() << std::endl;
574  for (std::vector<std::pair<DetId, float>>::const_iterator diIt = v1.begin(); diIt != v1.end(); ++diIt) {
575  // std::cout << " Adding DetId " << (diIt->first).rawId() << " " << diIt->second << std::endl;
576  mySuperCluster.addHitAndFraction(diIt->first, diIt->second);
577  } // loop over rechits
578  }
579 
580  unsigned nps = preshowerClusterPtr_[iGSF].size();
581  for (unsigned ips = 0; ips < nps; ++ips) {
582  mySuperCluster.addPreshowerCluster(preshowerClusterPtr_[iGSF][ips]);
583  }
584 
585  // Set the preshower energy
586  mySuperCluster.setPreshowerEnergy(pfCand[gsfPFCandidateIndex_[iGSF]].pS1Energy() +
587  pfCand[gsfPFCandidateIndex_[iGSF]].pS2Energy());
588 
589  // Set the cluster width
590  mySuperCluster.setEtaWidth(pfwidth.pflowEtaWidth());
591  mySuperCluster.setPhiWidth(pfwidth.pflowPhiWidth());
592  // Force the computation of rawEnergy_ of the reco::SuperCluster
593  mySuperCluster.rawEnergy();
594  superClusters.push_back(mySuperCluster);
595  }
596 }
597 
599  const reco::PFBlockElement& pfbe) const {
600  unsigned refindex = pfbe.index();
601  // std::cout << " N daughters " << cand.numberOfDaughters() << std::endl;
602  reco::PFCandidate::const_iterator myDaughterCandidate = cand.begin();
604 
605  for (; myDaughterCandidate != itend; ++myDaughterCandidate) {
606  const reco::PFCandidate* myPFCandidate = (const reco::PFCandidate*)&*myDaughterCandidate;
607  if (myPFCandidate->elementsInBlocks().size() != 1) {
608  // std::cout << " Daughter with " << myPFCandidate.elementsInBlocks().size()<< " element in block " << std::endl;
609  return cand;
610  }
611  if (myPFCandidate->elementsInBlocks()[0].second == refindex) {
612  // std::cout << " Found it " << cand << std::endl;
613  return *myPFCandidate;
614  }
615  }
616  return cand;
617 }
618 
620  unsigned nGSF = GsfTrackRef_.size();
621  for (unsigned iGSF = 0; iGSF < nGSF; ++iGSF) {
622  reco::GsfElectronCore myElectronCore(GsfTrackRef_[iGSF]);
623  myElectronCore.setCtfTrack(kfTrackRef_[iGSF], -1.);
624  std::map<reco::GsfTrackRef, reco::SuperClusterRef>::const_iterator itcheck = scMap_.find(GsfTrackRef_[iGSF]);
625  if (itcheck != scMap_.end())
626  myElectronCore.setParentSuperCluster(itcheck->second);
627  gsfElectronCores.push_back(myElectronCore);
628  }
629 }
630 
632  const edm::OrphanHandle<reco::GsfElectronCoreCollection>& gsfElectronCoreHandle) {
633  unsigned size = GsfTrackRef_.size();
634 
635  for (unsigned iGSF = 0; iGSF < size; ++iGSF) // loop on tracks
636  {
637  edm::Ref<reco::GsfElectronCoreCollection> elecCoreRef(gsfElectronCoreHandle, iGSF);
638  gsfElectronCoreRefs_.push_back(elecCoreRef);
639  }
640 }
641 
643  std::vector<reco::GsfTrackRef>& tracks) const {
644  const reco::PFBlockElementGsfTrack* GsfEl = dynamic_cast<const reco::PFBlockElementGsfTrack*>(&PFBE);
645  if (GsfEl == nullptr)
646  return;
647  const std::vector<reco::GsfPFRecTrackRef>& ambPFRecTracks(GsfEl->GsftrackRefPF()->convBremGsfPFRecTrackRef());
648  unsigned ntracks = ambPFRecTracks.size();
649  for (unsigned it = 0; it < ntracks; ++it) {
650  tracks.push_back(ambPFRecTracks[it]->gsfTrackRef());
651  }
652 }
653 
656  reco::GsfElectronCollection& gsfelectrons) {
657  unsigned size = GsfTrackRef_.size();
658 
659  for (unsigned iGSF = 0; iGSF < size; ++iGSF) // loop on tracks
660  {
661  const reco::PFCandidate& pfCandidate(pfcand[gsfPFCandidateIndex_[iGSF]]);
662  // Electron
663  reco::GsfElectron myElectron(gsfElectronCoreRefs_[iGSF]);
664  // Warning set p4 error !
665  myElectron.setP4(reco::GsfElectron::P4_PFLOW_COMBINATION, pfCandidate.p4(), pfCandidate.deltaP(), true);
666 
667  // MVA inputs
668  reco::GsfElectron::MvaInput myMvaInput;
669  myMvaInput.earlyBrem = pfCandidate.electronExtraRef()->mvaVariable(reco::PFCandidateElectronExtra::MVA_FirstBrem);
670  myMvaInput.lateBrem = pfCandidate.electronExtraRef()->mvaVariable(reco::PFCandidateElectronExtra::MVA_LateBrem);
671  myMvaInput.deltaEta =
673  myMvaInput.sigmaEtaEta = pfCandidate.electronExtraRef()->sigmaEtaEta();
674  myMvaInput.hadEnergy = pfCandidate.electronExtraRef()->hadEnergy();
675 
676  // Mustache
677  reco::Mustache myMustache(mustacheSCParams_);
678  myMustache.MustacheID(
679  *(myElectron.parentSuperCluster()), myMvaInput.nClusterOutsideMustache, myMvaInput.etOutsideMustache);
680 
681  myElectron.setMvaInput(myMvaInput);
682 
683  // MVA output
684  reco::GsfElectron::MvaOutput myMvaOutput;
685  myMvaOutput.status = pfCandidate.electronExtraRef()->electronStatus();
686  myMvaOutput.mva_e_pi = pfCandidate.mva_e_pi();
687  myElectron.setMvaOutput(myMvaOutput);
688 
689  // ambiguous tracks
690  unsigned ntracks = ambiguousGsfTracks_[iGSF].size();
691  for (unsigned it = 0; it < ntracks; ++it) {
692  myElectron.addAmbiguousGsfTrack(ambiguousGsfTracks_[iGSF][it]);
693  }
694 
695  // isolation
696  if (!isolationValues.empty()) {
698  myPFIso.sumChargedHadronPt = (*isolationValues[0])[CandidatePtr_[iGSF]];
699  myPFIso.sumPhotonEt = (*isolationValues[1])[CandidatePtr_[iGSF]];
700  myPFIso.sumNeutralHadronEt = (*isolationValues[2])[CandidatePtr_[iGSF]];
701  myPFIso.sumPUPt = (*isolationValues[3])[CandidatePtr_[iGSF]];
702  myElectron.setPfIsolationVariables(myPFIso);
703  }
704 
705  gsfelectrons.push_back(myElectron);
706  }
707 }
size
Write out results.
const math::XYZPoint & position() const
cluster centroid position
Definition: CaloCluster.h:153
std::string PFPreshowerClusterCollection_
Abstract base class for a PFBlock element (track, cluster...)
void setCtfTrack(const TrackRef &closestCtfTrack, float ctfGsfOverlap)
void setP4(P4Kind kind, const LorentzVector &p4, float p4Error, bool setCandidate)
Definition: GsfElectron.cc:194
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
void MustacheID(const CaloClusterPtrVector &clusters, int &nclusters, float &EoutsideMustache)
Definition: Mustache.cc:95
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
Definition: CaloCluster.h:209
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
void addHitAndFraction(DetId id, float fraction)
Definition: CaloCluster.h:202
AlgoId algo() const
algorithm identifier
Definition: CaloCluster.h:189
Particle flow cluster, see clustering algorithm in PFClusterAlgo.
Definition: PFCluster.h:42
void produce(edm::Event &, const edm::EventSetup &) override
double pflowPhiWidth() const
void createGsfElectronCoreRefs(const edm::OrphanHandle< reco::GsfElectronCoreCollection > &gsfElectronCoreHandle)
DetId seed() const
return DetId of seed
Definition: CaloCluster.h:218
double rawEnergy() const
raw uncorrected energy (sum of energies of component BasicClusters)
Definition: SuperCluster.h:60
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::vector< reco::CaloClusterPtrVector > basicClusterPtr_
void getAmbiguousGsfTracks(const reco::PFBlockElement &PFBE, std::vector< reco::GsfTrackRef > &) const
std::vector< reco::GsfElectronCoreRef > gsfElectronCoreRefs_
void setMvaInput(const MvaInput &mi)
Definition: GsfElectron.h:739
void createBasicClusterPtrs(const edm::OrphanHandle< reco::BasicClusterCollection > &basicClustersHandle)
float sumPUPt
sum pt of charged Particles not from PV (for Pu corrections)
Definition: GsfElectron.h:670
double pflowEtaWidth() const
void createGsfElectronCores(reco::GsfElectronCoreCollection &) const
void setSeed(const CaloClusterPtr &r)
list of used xtals by DetId // now inherited by CaloCluster
Definition: SuperCluster.h:109
Log< level::Error, false > LogError
std::vector< std::vector< const reco::PFCluster * > > pfClusters_
void createSuperClusters(const reco::PFCandidateCollection &, reco::SuperClusterCollection &superClusters) const
void setPfIsolationVariables(const PflowIsolationVariables &iso)
Definition: GsfElectron.h:738
void setPhiWidth(double pw)
Definition: SuperCluster.h:75
const CaloID & caloID() const
Definition: CaloCluster.h:200
void setMvaOutput(const MvaOutput &mo)
Definition: GsfElectron.h:740
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
std::map< reco::GsfTrackRef, float > gsfMvaMap_
edm::ESGetToken< EcalMustacheSCParameters, EcalMustacheSCParametersRcd > ecalMustacheSCParametersToken_
const LorentzVector & p4() const final
four-momentum Lorentz vector
std::map< reco::GsfTrackRef, reco::SuperClusterRef > scMap_
void setEtaWidth(double ew)
Definition: SuperCluster.h:76
std::vector< reco::GsfTrackRef > GsfTrackRef_
int iEvent
Definition: GenABIO.cc:224
void fillMVAValueMap(edm::Event &iEvent, edm::ValueMap< float >::Filler &filler)
const ElementsInBlocks & elementsInBlocks() const
Definition: PFCandidate.cc:665
void setParentSuperCluster(const SuperClusterRef &scl)
std::vector< SuperCluster > SuperClusterCollection
collection of SuperCluser objectr
void createBasicCluster(const reco::PFBlockElement &, reco::BasicClusterCollection &basicClusters, std::vector< const reco::PFCluster *> &, const reco::PFCandidate &coCandidate) const
float sumPhotonEt
sum pt of PF photons // old float photonIso ;
Definition: GsfElectron.h:665
std::vector< GsfElectronCore > GsfElectronCoreCollection
std::vector< reco::PreshowerClusterCollection > preshowerClusters_
unsigned index() const
void createSuperClusterGsfMapRefs(const edm::OrphanHandle< reco::SuperClusterCollection > &superClustersHandle)
virtual const PFClusterRef & clusterRef() const
std::vector< PreshowerCluster > PreshowerClusterCollection
collection of PreshowerCluster objects
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
float sumNeutralHadronEt
sum pt of neutral hadrons // old float neutralHadronIso ;
Definition: GsfElectron.h:664
void fillSCRefValueMap(edm::Event &iEvent, edm::ValueMap< reco::SuperClusterRef >::Filler &filler) const
void fillValueMap(edm::Event &iEvent, edm::ValueMap< float >::Filler &filler) const
std::vector< int > gsfPFCandidateIndex_
std::vector< edm::Handle< edm::ValueMap< double > > > IsolationValueMaps
bool isNull() const
Checks for null.
Definition: Ref.h:235
edm::InputTag inputTagPFCandidateElectrons_
std::vector< reco::CandidatePtr > CandidatePtr_
edm::InputTag inputTagPFCandidates_
std::vector< std::vector< reco::GsfTrackRef > > ambiguousGsfTracks_
edm::InputTag inputTagGSFTracks_
Definition: DetId.h:17
const EcalMustacheSCParameters * mustacheSCParams_
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
std::string PFBasicClusterCollection_
std::vector< reco::SuperClusterCollection > superClusters_
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
std::vector< reco::CaloClusterPtrVector > preshowerClusterPtr_
void addPreshowerCluster(const CaloClusterPtr &r)
add reference to constituent BasicCluster
Definition: SuperCluster.h:130
std::string GsfElectronCoreCollection_
std::vector< BasicCluster > BasicClusterCollection
collection of BasicCluster objects
std::vector< edm::InputTag > inputTagIsoVals_
const reco::PFCandidate & correspondingDaughterCandidate(const reco::PFCandidate &cand, const reco::PFBlockElement &pfbe) const
void addCluster(const CaloClusterPtr &r)
add reference to constituent BasicCluster
Definition: SuperCluster.h:124
std::vector< reco::BasicClusterCollection > basicClusters_
virtual SuperClusterRef parentSuperCluster() const
Definition: GsfElectron.h:160
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:41
std::vector< reco::TrackRef > kfTrackRef_
HLT enums.
PFElectronTranslator(const edm::ParameterSet &)
const GsfPFRecTrackRef & GsftrackRefPF() const
reco::PFCandidateElectronExtraRef electronExtraRef() const
return a reference to the electron extra
Definition: PFCandidate.cc:573
std::string PFSuperClusterCollection_
double rawEcalEnergy() const
return corrected Ecal energy
Definition: PFCandidate.h:224
void createPreshowerCluster(const reco::PFBlockElement &PFBE, reco::PreshowerClusterCollection &preshowerClusters, unsigned plane) const
void createGsfElectrons(const reco::PFCandidateCollection &, const IsolationValueMaps &isolationValues, reco::GsfElectronCollection &)
float sumChargedHadronPt
sum-pt of charged Hadron // old float chargedHadronIso ;
Definition: GsfElectron.h:663
void addAmbiguousGsfTrack(const reco::GsfTrackRef &t)
Definition: GsfElectron.h:774
void createPreshowerClusterPtrs(const edm::OrphanHandle< reco::PreshowerClusterCollection > &preshowerClustersHandle)
double deltaP() const
uncertainty on 3-momentum
Definition: PFCandidate.h:301
void fetchGsfCollection(edm::Handle< reco::GsfTrackCollection > &c, const edm::InputTag &tag, const edm::Event &iEvent) const
def move(src, dest)
Definition: eostools.py:511
float mva_e_pi() const
mva for electron-pion discrimination
Definition: PFCandidate.h:317
bool fetchCandidateCollection(edm::Handle< reco::PFCandidateCollection > &c, const edm::InputTag &tag, const edm::Event &iEvent) const
void setPreshowerEnergy(double preshowerEnergy)
Definition: SuperCluster.h:72