CMS 3D CMS Logo

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