CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
PFLinker Class Reference

#include <PFLinker.h>

Inheritance diagram for PFLinker:
edm::stream::EDProducer<> edm::stream::EDProducerBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

 PFLinker (const edm::ParameterSet &)
 
virtual void produce (edm::Event &, const edm::EventSetup &) override
 
 ~PFLinker ()
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
- Public Member Functions inherited from edm::stream::EDProducerBase
 EDProducerBase ()
 
ModuleDescription const & moduleDescription () const
 
virtual ~EDProducerBase ()
 
- Public Member Functions inherited from edm::ProducerBase
 ProducerBase ()
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription
const &)> 
registrationCallback () const
 used by the fwk to register list of products More...
 
virtual ~ProducerBase ()
 
- Public Member Functions inherited from edm::EDConsumerBase
 EDConsumerBase ()
 
ProductHolderIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
std::vector
< ProductHolderIndexAndSkipBit >
const & 
itemsToGetFromEvent () const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesDependentUpon (const std::string &iProcessName, std::vector< const char * > &oModuleLabels) const
 
bool registeredToConsume (ProductHolderIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void updateLookup (BranchType iBranchType, ProductHolderIndexHelper const &)
 
virtual ~EDConsumerBase ()
 

Private Member Functions

template<typename TYPE >
edm::ValueMap
< reco::PFCandidatePtr
fillValueMap (edm::Event &event, std::string label, edm::Handle< TYPE > &inputObjCollection, const std::map< edm::Ref< TYPE >, reco::PFCandidatePtr > &mapToTheCandidate, const edm::OrphanHandle< reco::PFCandidateCollection > &newPFCandColl) const
 

Private Attributes

bool fillMuonRefs_
 Set muon refs and produce the value map? More...
 
edm::EDGetTokenT
< reco::GsfElectronCollection
inputTagGsfElectrons_
 Input GsfElectrons. More...
 
edm::EDGetTokenT
< reco::MuonToMuonMap
inputTagMuonMap_
 
edm::EDGetTokenT
< reco::MuonCollection
inputTagMuons_
 
std::vector< edm::EDGetTokenT
< reco::PFCandidateCollection > > 
inputTagPFCandidates_
 Input PFCandidates. More...
 
edm::EDGetTokenT
< reco::PhotonCollection
inputTagPhotons_
 Input Photons. More...
 
edm::InputTag muonTag_
 Input Muons. More...
 
std::string nameOutputElectronsPF_
 name of output ValueMap electrons More...
 
std::string nameOutputMergedPF_
 name of output merged ValueMap More...
 
std::string nameOutputPF_
 name of output collection of PFCandidate More...
 
std::string nameOutputPhotonsPF_
 name of output ValueMap photons More...
 
bool producePFCandidates_
 Flags - if true: References will be towards new collection ; if false to the original one. More...
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
typedef CacheContexts< T...> CacheTypes
 
typedef CacheTypes::GlobalCache GlobalCache
 
typedef AbilityChecker< T...> HasAbility
 
typedef
CacheTypes::LuminosityBlockCache 
LuminosityBlockCache
 
typedef
LuminosityBlockContextT
< LuminosityBlockCache,
RunCache, GlobalCache
LuminosityBlockContext
 
typedef
CacheTypes::LuminosityBlockSummaryCache 
LuminosityBlockSummaryCache
 
typedef CacheTypes::RunCache RunCache
 
typedef RunContextT< RunCache,
GlobalCache
RunContext
 
typedef CacheTypes::RunSummaryCache RunSummaryCache
 
- Public Types inherited from edm::stream::EDProducerBase
typedef EDProducerAdaptorBase ModuleType
 
- Public Types inherited from edm::ProducerBase
typedef
ProductRegistryHelper::TypeLabelList 
TypeLabelList
 
- Static Public Member Functions inherited from edm::stream::EDProducerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- Protected Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

Producer meant for the Post PF reconstruction.

Fills the GsfElectron, Photon and Muon Ref into the PFCandidate Produces the ValueMap between GsfElectronRef/Photon/Mupns with PFCandidateRef

Author
R. Bellan - UCSB ricca.nosp@m.rdo..nosp@m.bella.nosp@m.n@ce.nosp@m.rn.ch, F. Beaudette - CERN Flori.nosp@m.an.B.nosp@m.eaude.nosp@m.tte@.nosp@m.cern..nosp@m.ch

Definition at line 34 of file PFLinker.h.

Constructor & Destructor Documentation

PFLinker::PFLinker ( const edm::ParameterSet iConfig)
explicit

Definition at line 9 of file PFLinker.cc.

References fillMuonRefs_, edm::ParameterSet::getParameter(), i, inputTagGsfElectrons_, inputTagMuonMap_, inputTagMuons_, inputTagPFCandidates_, inputTagPhotons_, edm::InputTag::label(), muonTag_, nameOutputElectronsPF_, nameOutputMergedPF_, nameOutputPF_, nameOutputPhotonsPF_, producePFCandidates_, AlCaHLTBitMon_QueryRunRegistry::string, and o2o::tags.

9  {
10  // vector of InputTag; more than 1 is not for RECO, it is for analysis
11 
12  std::vector<edm::InputTag> tags = iConfig.getParameter<std::vector<edm::InputTag> >("PFCandidate");
13  for (unsigned int i=0;i<tags.size();++i)
14  inputTagPFCandidates_.push_back(consumes<reco::PFCandidateCollection>(tags[i]));
15 
16 
17  inputTagGsfElectrons_=consumes<reco::GsfElectronCollection>(
18  iConfig.getParameter<edm::InputTag>("GsfElectrons"));
19 
20  inputTagPhotons_=consumes<reco::PhotonCollection>(iConfig.getParameter<edm::InputTag>("Photons"));
21 
22 
23  muonTag_ = iConfig.getParameter<edm::InputTag>("Muons");
24  inputTagMuons_=consumes<reco::MuonCollection>(edm::InputTag(muonTag_.label()));
25  inputTagMuonMap_=consumes<reco::MuonToMuonMap>(muonTag_);
26 
28  = iConfig.getParameter<std::string>("OutputPF");
29 
31  = iConfig.getParameter<std::string>("ValueMapElectrons");
32 
34  = iConfig.getParameter<std::string>("ValueMapPhotons");
35 
37  = iConfig.getParameter<bool>("ProducePFCandidates");
38 
40  = iConfig.getParameter<std::string>("ValueMapMerged");
41 
43  = iConfig.getParameter<bool>("FillMuonRefs");
44 
45  // should not produce PFCandidates and read seve
46  if(producePFCandidates_ && inputTagPFCandidates_.size()>1) {
47  edm::LogError("PFLinker") << " cannot read several collections of PFCandidates and produce a new collection at the same time. " << std::endl;
48  assert(0);
49  }
50  if(producePFCandidates_) {
51  produces<reco::PFCandidateCollection>(nameOutputPF_);
52  }
53  produces<edm::ValueMap<reco::PFCandidatePtr> > (nameOutputElectronsPF_);
54  produces<edm::ValueMap<reco::PFCandidatePtr> > (nameOutputPhotonsPF_);
55  produces<edm::ValueMap<reco::PFCandidatePtr> > (nameOutputMergedPF_);
56  if(fillMuonRefs_) produces<edm::ValueMap<reco::PFCandidatePtr> > (muonTag_.label());
57 
58 }
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
edm::InputTag muonTag_
Input Muons.
Definition: PFLinker.h:63
edm::EDGetTokenT< reco::MuonCollection > inputTagMuons_
Definition: PFLinker.h:64
bool producePFCandidates_
Flags - if true: References will be towards new collection ; if false to the original one...
Definition: PFLinker.h:79
edm::EDGetTokenT< reco::PhotonCollection > inputTagPhotons_
Input Photons.
Definition: PFLinker.h:60
edm::EDGetTokenT< reco::MuonToMuonMap > inputTagMuonMap_
Definition: PFLinker.h:65
std::string nameOutputElectronsPF_
name of output ValueMap electrons
Definition: PFLinker.h:70
std::string nameOutputPhotonsPF_
name of output ValueMap photons
Definition: PFLinker.h:73
std::string nameOutputPF_
name of output collection of PFCandidate
Definition: PFLinker.h:67
tuple tags
Definition: o2o.py:248
bool fillMuonRefs_
Set muon refs and produce the value map?
Definition: PFLinker.h:82
std::string const & label() const
Definition: InputTag.h:42
edm::EDGetTokenT< reco::GsfElectronCollection > inputTagGsfElectrons_
Input GsfElectrons.
Definition: PFLinker.h:57
std::vector< edm::EDGetTokenT< reco::PFCandidateCollection > > inputTagPFCandidates_
Input PFCandidates.
Definition: PFLinker.h:54
std::string nameOutputMergedPF_
name of output merged ValueMap
Definition: PFLinker.h:76
PFLinker::~PFLinker ( )

Definition at line 60 of file PFLinker.cc.

60 {;}

Member Function Documentation

template<typename TYPE >
edm::ValueMap< reco::PFCandidatePtr > PFLinker::fillValueMap ( edm::Event event,
std::string  label,
edm::Handle< TYPE > &  inputObjCollection,
const std::map< edm::Ref< TYPE >, reco::PFCandidatePtr > &  mapToTheCandidate,
const edm::OrphanHandle< reco::PFCandidateCollection > &  newPFCandColl 
) const
private

Definition at line 194 of file PFLinker.cc.

References edm::helper::Filler< Map >::fill(), edm::helper::Filler< Map >::insert(), producePFCandidates_, and makeHLTPrescaleTable::values.

198  {
199 
200  std::auto_ptr<edm::ValueMap<reco::PFCandidatePtr> > pfMap_p(new edm::ValueMap<reco::PFCandidatePtr>());
202 
203  typedef typename std::map<edm::Ref<TYPE>, reco::PFCandidatePtr>::const_iterator MapTYPE_it;
204 
205  unsigned nObj=inputObjCollection->size();
206  std::vector<reco::PFCandidatePtr> values(nObj);
207 
208  for(unsigned iobj=0; iobj < nObj; ++iobj) {
209 
210  edm::Ref<TYPE> objRef(inputObjCollection, iobj);
211  MapTYPE_it itcheck = mapToTheCandidate.find(objRef);
212 
213  reco::PFCandidatePtr candPtr;
214 
215  if(itcheck != mapToTheCandidate.end())
216  candPtr = producePFCandidates_ ? reco::PFCandidatePtr(newPFCandColl,itcheck->second.key()) : itcheck->second;
217 
218  values[iobj] = candPtr;
219  }
220 
221  filler.insert(inputObjCollection,values.begin(),values.end());
222  filler.fill();
223  edm::ValueMap<reco::PFCandidatePtr> returnValue = *pfMap_p;
224  event.put(pfMap_p,label);
225  return returnValue;
226 }
bool producePFCandidates_
Flags - if true: References will be towards new collection ; if false to the original one...
Definition: PFLinker.h:79
void PFLinker::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
overridevirtual

Implements edm::stream::EDProducerBase.

Definition at line 62 of file PFLinker.cc.

References reco::PFCandidate::e, fillMuonRefs_, reco::PFCandidate::gamma, edm::Event::getByToken(), gsfElectrons_cfi::gsfElectrons, reco::PFCandidate::gsfTrackRef(), i, iEvent, inputTagGsfElectrons_, inputTagMuonMap_, inputTagMuons_, inputTagPFCandidates_, inputTagPhotons_, edm::Ref< C, T, F >::isNonnull(), edm::InputTag::label(), reco::PFCandidate::muonRef(), patZpeak::muons, muonTag_, reco::PFCandidate::mva_nothing_gamma(), nameOutputElectronsPF_, nameOutputMergedPF_, nameOutputPF_, nameOutputPhotonsPF_, reco::PFCandidate::particleId(), reco::tau::pfCandidates(), interactiveExample::photons, producePFCandidates_, edm::Event::put(), reco::PFCandidate::setGsfElectronRef(), reco::PFCandidate::setMuonRef(), reco::PFCandidate::setPhotonRef(), reco::PFCandidate::setSuperClusterRef(), and reco::PFCandidate::superClusterRef().

62  {
63 
64  std::auto_ptr<reco::PFCandidateCollection>
65  pfCandidates_p(new reco::PFCandidateCollection);
66 
68  iEvent.getByToken(inputTagGsfElectrons_,gsfElectrons);
69 
70  std::map<reco::GsfElectronRef,reco::PFCandidatePtr> electronCandidateMap;
71 
72 
74  iEvent.getByToken(inputTagPhotons_,photons);
75  std::map<reco::PhotonRef,reco::PFCandidatePtr> photonCandidateMap;
76 
77 
79  if(fillMuonRefs_)
80  iEvent.getByToken(inputTagMuonMap_,muonMap);
81  std::map<reco::MuonRef,reco::PFCandidatePtr> muonCandidateMap;
82 
83  unsigned nColPF=inputTagPFCandidates_.size();
84 
86  for(unsigned icol=0;icol<nColPF;++icol) {
87  iEvent.getByToken(inputTagPFCandidates_[icol],pfCandidates);
88  unsigned ncand=pfCandidates->size();
89 
90  for( unsigned i=0; i<ncand; ++i) {
91  edm::Ptr<reco::PFCandidate> candPtr(pfCandidates,i);
92  reco::PFCandidate cand(candPtr);
93 
94  bool isphoton = cand.particleId() == reco::PFCandidate::gamma && cand.mva_nothing_gamma()>0.;
95  bool iselectron = cand.particleId() == reco::PFCandidate::e;
96  // PFCandidates may have a valid MuonRef though they are not muons.
97  bool hasNonNullMuonRef = cand.muonRef().isNonnull() && fillMuonRefs_;
98 
99  // if not an electron or a photon or a muon just fill the PFCandidate collection
100  if ( !(isphoton || iselectron || hasNonNullMuonRef)){pfCandidates_p->push_back(cand); continue;}
101 
102 
103  if (hasNonNullMuonRef) {
104  reco::MuonRef muRef = (*muonMap)[cand.muonRef()];
105  cand.setMuonRef(muRef);
106  muonCandidateMap[muRef] = candPtr;
107  }
108 
109 
110  // if it is an electron. Find the GsfElectron with the same GsfTrack
111  if (iselectron) {
112  const reco::GsfTrackRef & gsfTrackRef(cand.gsfTrackRef());
113  GsfElectronEqual myEqual(gsfTrackRef);
114  std::vector<reco::GsfElectron>::const_iterator itcheck=find_if(gsfElectrons->begin(),gsfElectrons->end(),myEqual);
115  if(itcheck==gsfElectrons->end()) {
116  std::ostringstream err;
117  err << " Problem in PFLinker: no GsfElectron " << std::endl;
118  edm::LogError("PFLinker") << err.str();
119  continue; // Watch out ! Continue
120  }
121  reco::GsfElectronRef electronRef(gsfElectrons,itcheck-gsfElectrons->begin());
122  cand.setGsfElectronRef(electronRef);
123  cand.setSuperClusterRef(electronRef->superCluster());
124  electronCandidateMap[electronRef] = candPtr;
125  }
126 
127  // if it is a photon, find the one with the same PF super-cluster
128  if (isphoton) {
129  const reco::SuperClusterRef & scRef(cand.superClusterRef());
130  PhotonEqual myEqual(scRef);
131  std::vector<reco::Photon>::const_iterator itcheck=find_if(photons->begin(),photons->end(),myEqual);
132  if(itcheck==photons->end()) {
133  std::ostringstream err;
134  err << " Problem in PFLinker: no Photon " << std::endl;
135  edm::LogError("PFLinker") << err.str();
136  continue; // Watch out ! Continue
137  }
138  reco::PhotonRef photonRef(photons,itcheck-photons->begin());
139  cand.setPhotonRef(photonRef);
140  cand.setSuperClusterRef(photonRef->superCluster());
141  photonCandidateMap[photonRef] = candPtr;
142  }
143 
144  pfCandidates_p->push_back(cand);
145  }
146  // save the PFCandidates and get a valid handle
147  }
148  const edm::OrphanHandle<reco::PFCandidateCollection> pfCandidateRefProd = (producePFCandidates_) ? iEvent.put(pfCandidates_p,nameOutputPF_) :
150 
151 
152  // now make the valuemaps
153 
154  edm::ValueMap<reco::PFCandidatePtr> pfMapGsfElectrons = fillValueMap<reco::GsfElectronCollection>(iEvent,
156  gsfElectrons,
157  electronCandidateMap,
158  pfCandidateRefProd);
159 
160  edm::ValueMap<reco::PFCandidatePtr> pfMapPhotons = fillValueMap<reco::PhotonCollection>(iEvent,
162  photons,
163  photonCandidateMap,
164  pfCandidateRefProd);
165 
166 
168 
169  if(fillMuonRefs_){
171  iEvent.getByToken(inputTagMuons_, muons);
172 
173  pfMapMuons = fillValueMap<reco::MuonCollection>(iEvent,
174  muonTag_.label(),
175  muons,
176  muonCandidateMap,
177  pfCandidateRefProd);
178  }
179 
180  std::auto_ptr<edm::ValueMap<reco::PFCandidatePtr> >
181  pfMapMerged(new edm::ValueMap<reco::PFCandidatePtr>());
182  edm::ValueMap<reco::PFCandidatePtr>::Filler pfMapMergedFiller(*pfMapMerged);
183 
184  *pfMapMerged += pfMapGsfElectrons;
185  *pfMapMerged += pfMapPhotons;
186  if(fillMuonRefs_) *pfMapMerged += pfMapMuons;
187 
188  iEvent.put(pfMapMerged,nameOutputMergedPF_);
189 }
int i
Definition: DBlmapReader.cc:9
edm::InputTag muonTag_
Input Muons.
Definition: PFLinker.h:63
edm::EDGetTokenT< reco::MuonCollection > inputTagMuons_
Definition: PFLinker.h:64
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
bool producePFCandidates_
Flags - if true: References will be towards new collection ; if false to the original one...
Definition: PFLinker.h:79
edm::EDGetTokenT< reco::PhotonCollection > inputTagPhotons_
Input Photons.
Definition: PFLinker.h:60
edm::EDGetTokenT< reco::MuonToMuonMap > inputTagMuonMap_
Definition: PFLinker.h:65
std::vector< PFCandidatePtr > pfCandidates(const PFJet &jet, int particleId, bool sort=true)
int iEvent
Definition: GenABIO.cc:230
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:116
std::string nameOutputElectronsPF_
name of output ValueMap electrons
Definition: PFLinker.h:70
std::string nameOutputPhotonsPF_
name of output ValueMap photons
Definition: PFLinker.h:73
std::string nameOutputPF_
name of output collection of PFCandidate
Definition: PFLinker.h:67
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
bool fillMuonRefs_
Set muon refs and produce the value map?
Definition: PFLinker.h:82
std::string const & label() const
Definition: InputTag.h:42
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:38
tuple muons
Definition: patZpeak.py:38
edm::EDGetTokenT< reco::GsfElectronCollection > inputTagGsfElectrons_
Input GsfElectrons.
Definition: PFLinker.h:57
std::vector< edm::EDGetTokenT< reco::PFCandidateCollection > > inputTagPFCandidates_
Input PFCandidates.
Definition: PFLinker.h:54
std::string nameOutputMergedPF_
name of output merged ValueMap
Definition: PFLinker.h:76

Member Data Documentation

bool PFLinker::fillMuonRefs_
private

Set muon refs and produce the value map?

Definition at line 82 of file PFLinker.h.

Referenced by PFLinker(), and produce().

edm::EDGetTokenT<reco::GsfElectronCollection> PFLinker::inputTagGsfElectrons_
private

Input GsfElectrons.

Definition at line 57 of file PFLinker.h.

Referenced by PFLinker(), and produce().

edm::EDGetTokenT<reco::MuonToMuonMap> PFLinker::inputTagMuonMap_
private

Definition at line 65 of file PFLinker.h.

Referenced by PFLinker(), and produce().

edm::EDGetTokenT<reco::MuonCollection> PFLinker::inputTagMuons_
private

Definition at line 64 of file PFLinker.h.

Referenced by PFLinker(), and produce().

std::vector<edm::EDGetTokenT<reco::PFCandidateCollection> > PFLinker::inputTagPFCandidates_
private

Input PFCandidates.

Definition at line 54 of file PFLinker.h.

Referenced by PFLinker(), and produce().

edm::EDGetTokenT<reco::PhotonCollection> PFLinker::inputTagPhotons_
private

Input Photons.

Definition at line 60 of file PFLinker.h.

Referenced by PFLinker(), and produce().

edm::InputTag PFLinker::muonTag_
private

Input Muons.

Definition at line 63 of file PFLinker.h.

Referenced by PFLinker(), and produce().

std::string PFLinker::nameOutputElectronsPF_
private

name of output ValueMap electrons

Definition at line 70 of file PFLinker.h.

Referenced by PFLinker(), and produce().

std::string PFLinker::nameOutputMergedPF_
private

name of output merged ValueMap

Definition at line 76 of file PFLinker.h.

Referenced by PFLinker(), and produce().

std::string PFLinker::nameOutputPF_
private

name of output collection of PFCandidate

Definition at line 67 of file PFLinker.h.

Referenced by PFLinker(), and produce().

std::string PFLinker::nameOutputPhotonsPF_
private

name of output ValueMap photons

Definition at line 73 of file PFLinker.h.

Referenced by PFLinker(), and produce().

bool PFLinker::producePFCandidates_
private

Flags - if true: References will be towards new collection ; if false to the original one.

Definition at line 79 of file PFLinker.h.

Referenced by fillValueMap(), PFLinker(), and produce().