CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
PFLinker Class Reference
Inheritance diagram for PFLinker:
edm::stream::EDProducer<>

Public Member Functions

 PFLinker (const edm::ParameterSet &)
 
void produce (edm::Event &, const edm::EventSetup &) override
 
 ~PFLinker () override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 

Private Member Functions

template<typename TYPE >
edm::ValueMap< reco::PFCandidatePtrfillValueMap (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...
 
bool forceElectronsInHGCAL_
 Put Electrons within HGCAL coming from SimPFProducer. More...
 
edm::EDGetTokenT< reco::GsfElectronCollectioninputTagGsfElectrons_
 Input GsfElectrons. More...
 
edm::EDGetTokenT< reco::MuonToMuonMapinputTagMuonMap_
 
edm::EDGetTokenT< reco::MuonCollectioninputTagMuons_
 
std::vector< edm::EDGetTokenT< reco::PFCandidateCollection > > inputTagPFCandidates_
 Input PFCandidates. More...
 
edm::EDGetTokenT< reco::PhotonCollectioninputTagPhotons_
 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, GlobalCacheLuminosityBlockContext
 
typedef CacheTypes::LuminosityBlockSummaryCache LuminosityBlockSummaryCache
 
typedef CacheTypes::RunCache RunCache
 
typedef RunContextT< RunCache, GlobalCacheRunContext
 
typedef CacheTypes::RunSummaryCache RunSummaryCache
 

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 25 of file PFLinker.cc.

Constructor & Destructor Documentation

◆ PFLinker()

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

Definition at line 80 of file PFLinker.cc.

80  {
81  // vector of InputTag; more than 1 is not for RECO, it is for analysis
82 
83  std::vector<edm::InputTag> tags = iConfig.getParameter<std::vector<edm::InputTag>>("PFCandidate");
84  for (unsigned int i = 0; i < tags.size(); ++i)
85  inputTagPFCandidates_.push_back(consumes<reco::PFCandidateCollection>(tags[i]));
86 
87  inputTagGsfElectrons_ = consumes<reco::GsfElectronCollection>(iConfig.getParameter<edm::InputTag>("GsfElectrons"));
88 
89  inputTagPhotons_ = consumes<reco::PhotonCollection>(iConfig.getParameter<edm::InputTag>("Photons"));
90 
91  muonTag_ = iConfig.getParameter<edm::InputTag>("Muons");
92  inputTagMuons_ = consumes<reco::MuonCollection>(edm::InputTag(muonTag_.label()));
93  inputTagMuonMap_ = consumes<reco::MuonToMuonMap>(muonTag_);
94 
95  nameOutputPF_ = iConfig.getParameter<std::string>("OutputPF");
96 
97  nameOutputElectronsPF_ = iConfig.getParameter<std::string>("ValueMapElectrons");
98 
99  nameOutputPhotonsPF_ = iConfig.getParameter<std::string>("ValueMapPhotons");
100 
101  producePFCandidates_ = iConfig.getParameter<bool>("ProducePFCandidates");
102 
103  nameOutputMergedPF_ = iConfig.getParameter<std::string>("ValueMapMerged");
104 
105  fillMuonRefs_ = iConfig.getParameter<bool>("FillMuonRefs");
106 
107  forceElectronsInHGCAL_ = iConfig.getParameter<bool>("forceElectronsInHGCAL");
108 
109  // should not produce PFCandidates and read seve
110  if (producePFCandidates_ && inputTagPFCandidates_.size() > 1) {
111  edm::LogError("PFLinker")
112  << " cannot read several collections of PFCandidates and produce a new collection at the same time. "
113  << std::endl;
114  assert(false);
115  }
116  if (producePFCandidates_) {
117  produces<reco::PFCandidateCollection>(nameOutputPF_);
118  }
119  produces<edm::ValueMap<reco::PFCandidatePtr>>(nameOutputElectronsPF_);
120  produces<edm::ValueMap<reco::PFCandidatePtr>>(nameOutputPhotonsPF_);
121  produces<edm::ValueMap<reco::PFCandidatePtr>>(nameOutputMergedPF_);
122  if (fillMuonRefs_)
123  produces<edm::ValueMap<reco::PFCandidatePtr>>(muonTag_.label());
124 }

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

◆ ~PFLinker()

PFLinker::~PFLinker ( )
override

Definition at line 126 of file PFLinker.cc.

126 { ; }

Member Function Documentation

◆ fillValueMap()

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 256 of file PFLinker.cc.

261  {
262  auto pfMap_p = std::make_unique<edm::ValueMap<reco::PFCandidatePtr>>();
264 
265  typedef typename std::map<edm::Ref<TYPE>, reco::PFCandidatePtr>::const_iterator MapTYPE_it;
266 
267  unsigned nObj = inputObjCollection->size();
268  std::vector<reco::PFCandidatePtr> values(nObj);
269 
270  for (unsigned iobj = 0; iobj < nObj; ++iobj) {
271  edm::Ref<TYPE> objRef(inputObjCollection, iobj);
272  MapTYPE_it itcheck = mapToTheCandidate.find(objRef);
273 
274  reco::PFCandidatePtr candPtr;
275 
276  if (itcheck != mapToTheCandidate.end())
277  candPtr = producePFCandidates_ ? reco::PFCandidatePtr(newPFCandColl, itcheck->second.key()) : itcheck->second;
278 
279  values[iobj] = candPtr;
280  }
281 
282  filler.insert(inputObjCollection, values.begin(), values.end());
283  filler.fill();
284  edm::ValueMap<reco::PFCandidatePtr> returnValue = *pfMap_p;
285  event.put(std::move(pfMap_p), label);
286  return returnValue;
287 }

References trigObjTnPSource_cfi::filler, label, eostools::move(), producePFCandidates_, and contentValuesCheck::values.

◆ produce()

void PFLinker::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
override

Definition at line 128 of file PFLinker.cc.

128  {
129  auto pfCandidates_p = std::make_unique<reco::PFCandidateCollection>();
130 
131  auto gsfElectrons = iEvent.getHandle(inputTagGsfElectrons_);
132 
133  std::map<reco::GsfElectronRef, reco::PFCandidatePtr> electronCandidateMap;
134 
135  auto photons = iEvent.getHandle(inputTagPhotons_);
136  std::map<reco::PhotonRef, reco::PFCandidatePtr> photonCandidateMap;
137 
139  if (fillMuonRefs_)
140  muonMap = iEvent.getHandle(inputTagMuonMap_);
141  std::map<reco::MuonRef, reco::PFCandidatePtr> muonCandidateMap;
142 
143  unsigned nColPF = inputTagPFCandidates_.size();
144 
145  for (unsigned icol = 0; icol < nColPF; ++icol) {
146  auto pfCandidates = iEvent.getHandle(inputTagPFCandidates_[icol]);
147  unsigned ncand = pfCandidates->size();
148 
149  for (unsigned i = 0; i < ncand; ++i) {
151  reco::PFCandidate cand(candPtr);
152 
153  bool isphoton = cand.particleId() == reco::PFCandidate::gamma && cand.mva_nothing_gamma() > 0.;
154  bool iselectron = cand.particleId() == reco::PFCandidate::e;
155  // PFCandidates may have a valid MuonRef though they are not muons.
156  bool hasNonNullMuonRef = cand.muonRef().isNonnull() && fillMuonRefs_;
157 
158  // if not an electron or a photon or a muon just fill the PFCandidate collection
159  if (!(isphoton || iselectron || hasNonNullMuonRef)) {
160  pfCandidates_p->push_back(cand);
161  continue;
162  }
163 
164  if (hasNonNullMuonRef) {
165  reco::MuonRef muRef = (*muonMap)[cand.muonRef()];
166  cand.setMuonRef(muRef);
167  muonCandidateMap[muRef] = candPtr;
168  }
169 
170  // if it is an electron. Find the GsfElectron with the same GsfTrack
171  if (iselectron) {
172  const reco::GsfTrackRef& gsfTrackRef(cand.gsfTrackRef());
173  auto itcheck = find_if(gsfElectrons->begin(), gsfElectrons->end(), [&gsfTrackRef](const auto& ele) {
174  return (ele.gsfTrack() == gsfTrackRef);
175  });
176  if (itcheck == gsfElectrons->end()) {
177  if (!forceElectronsInHGCAL_) {
178  std::ostringstream err;
179  err << " Problem in PFLinker: no GsfElectron " << std::endl;
180  edm::LogError("PFLinker") << err.str();
181  } else {
182  LogDebug("PFLinker") << "Forcing an electron pfCandidate at: " << cand.eta() << " in HGCAL" << std::endl;
183  pfCandidates_p->push_back(cand);
184  }
185  continue; // Watch out ! Continue
186  }
187  reco::GsfElectronRef electronRef(gsfElectrons, itcheck - gsfElectrons->begin());
188  cand.setGsfElectronRef(electronRef);
189  cand.setSuperClusterRef(electronRef->superCluster());
190  // update energy information since now it is done post-particleFlowTmp
191  cand.setEcalEnergy(electronRef->superCluster()->rawEnergy(), electronRef->ecalEnergy());
192  cand.setDeltaP(electronRef->p4Error(reco::GsfElectron::P4_COMBINATION));
193  cand.setP4(electronRef->p4(reco::GsfElectron::P4_COMBINATION));
194  electronCandidateMap[electronRef] = candPtr;
195  }
196 
197  // if it is a photon, find the one with the same PF super-cluster
198  if (isphoton) {
199  const reco::SuperClusterRef& scRef(cand.superClusterRef());
200  auto itcheck = find_if(
201  photons->begin(), photons->end(), [&scRef](const auto& photon) { return photon.superCluster() == scRef; });
202  if (itcheck == photons->end()) {
203  std::ostringstream err;
204  err << " Problem in PFLinker: no Photon " << std::endl;
205  edm::LogError("PFLinker") << err.str();
206  continue; // Watch out ! Continue
207  }
208  reco::PhotonRef photonRef(photons, itcheck - photons->begin());
209  cand.setPhotonRef(photonRef);
210  cand.setSuperClusterRef(photonRef->superCluster());
211  // update energy information since now it is done post-particleFlowTmp
212  cand.setEcalEnergy(photonRef->superCluster()->rawEnergy(),
213  photonRef->getCorrectedEnergy(reco::Photon::regression2));
214  cand.setDeltaP(photonRef->getCorrectedEnergyError(reco::Photon::regression2));
215  cand.setP4(photonRef->p4(reco::Photon::regression2));
216  photonCandidateMap[photonRef] = candPtr;
217  }
218 
219  pfCandidates_p->push_back(cand);
220  }
221  // save the PFCandidates and get a valid handle
222  }
223  const edm::OrphanHandle<reco::PFCandidateCollection> pfCandidateRefProd =
224  (producePFCandidates_) ? iEvent.put(std::move(pfCandidates_p), nameOutputPF_)
226 
227  // now make the valuemaps
228 
229  edm::ValueMap<reco::PFCandidatePtr> pfMapGsfElectrons = fillValueMap<reco::GsfElectronCollection>(
230  iEvent, nameOutputElectronsPF_, gsfElectrons, electronCandidateMap, pfCandidateRefProd);
231 
232  edm::ValueMap<reco::PFCandidatePtr> pfMapPhotons = fillValueMap<reco::PhotonCollection>(
233  iEvent, nameOutputPhotonsPF_, photons, photonCandidateMap, pfCandidateRefProd);
234 
236 
237  if (fillMuonRefs_) {
238  auto muons = iEvent.getHandle(inputTagMuons_);
239 
240  pfMapMuons =
241  fillValueMap<reco::MuonCollection>(iEvent, muonTag_.label(), muons, muonCandidateMap, pfCandidateRefProd);
242  }
243 
244  auto pfMapMerged = std::make_unique<edm::ValueMap<reco::PFCandidatePtr>>();
245  edm::ValueMap<reco::PFCandidatePtr>::Filler pfMapMergedFiller(*pfMapMerged);
246 
247  *pfMapMerged += pfMapGsfElectrons;
248  *pfMapMerged += pfMapPhotons;
249  if (fillMuonRefs_)
250  *pfMapMerged += pfMapMuons;
251 
252  iEvent.put(std::move(pfMapMerged), nameOutputMergedPF_);
253 }

References reco::PFCandidate::e, submitPVResolutionJobs::err, fillMuonRefs_, forceElectronsInHGCAL_, reco::PFCandidate::gamma, electronIsolatorFromEffectiveArea_cfi::gsfElectrons, mps_fire::i, iEvent, inputTagGsfElectrons_, inputTagMuonMap_, inputTagMuons_, inputTagPFCandidates_, inputTagPhotons_, edm::InputTag::label(), LogDebug, eostools::move(), PDWG_BPHSkim_cff::muons, muonTag_, nameOutputElectronsPF_, nameOutputMergedPF_, nameOutputPF_, nameOutputPhotonsPF_, reco::GsfElectron::P4_COMBINATION, zmumugammaAnalyzer_cfi::pfCandidates, muons2muons_cfi::photon, BPHMonitor_cfi::photons, producePFCandidates_, and reco::Photon::regression2.

Member Data Documentation

◆ fillMuonRefs_

bool PFLinker::fillMuonRefs_
private

Set muon refs and produce the value map?

Definition at line 72 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ forceElectronsInHGCAL_

bool PFLinker::forceElectronsInHGCAL_
private

Put Electrons within HGCAL coming from SimPFProducer.

Definition at line 75 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ inputTagGsfElectrons_

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

Input GsfElectrons.

Definition at line 47 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ inputTagMuonMap_

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

Definition at line 55 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ inputTagMuons_

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

Definition at line 54 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ inputTagPFCandidates_

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

Input PFCandidates.

Definition at line 44 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ inputTagPhotons_

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

Input Photons.

Definition at line 50 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ muonTag_

edm::InputTag PFLinker::muonTag_
private

Input Muons.

Definition at line 53 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ nameOutputElectronsPF_

std::string PFLinker::nameOutputElectronsPF_
private

name of output ValueMap electrons

Definition at line 60 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ nameOutputMergedPF_

std::string PFLinker::nameOutputMergedPF_
private

name of output merged ValueMap

Definition at line 66 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ nameOutputPF_

std::string PFLinker::nameOutputPF_
private

name of output collection of PFCandidate

Definition at line 57 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ nameOutputPhotonsPF_

std::string PFLinker::nameOutputPhotonsPF_
private

name of output ValueMap photons

Definition at line 63 of file PFLinker.cc.

Referenced by PFLinker(), and produce().

◆ producePFCandidates_

bool PFLinker::producePFCandidates_
private

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

Definition at line 69 of file PFLinker.cc.

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

PDWG_BPHSkim_cff.muons
muons
Definition: PDWG_BPHSkim_cff.py:47
muons2muons_cfi.photon
photon
Definition: muons2muons_cfi.py:28
zmumugammaAnalyzer_cfi.pfCandidates
pfCandidates
Definition: zmumugammaAnalyzer_cfi.py:11
mps_fire.i
i
Definition: mps_fire.py:428
PFLinker::inputTagMuons_
edm::EDGetTokenT< reco::MuonCollection > inputTagMuons_
Definition: PFLinker.cc:54
reco::PFCandidate::e
Definition: PFCandidate.h:47
PFLinker::inputTagMuonMap_
edm::EDGetTokenT< reco::MuonToMuonMap > inputTagMuonMap_
Definition: PFLinker.cc:55
reco::GsfElectron::P4_COMBINATION
Definition: GsfElectron.h:769
cms::cuda::assert
assert(be >=bs)
electronIsolatorFromEffectiveArea_cfi.gsfElectrons
gsfElectrons
Definition: electronIsolatorFromEffectiveArea_cfi.py:4
edm::Handle
Definition: AssociativeIterator.h:50
edm::Ref
Definition: AssociativeIterator.h:58
PFLinker::inputTagPFCandidates_
std::vector< edm::EDGetTokenT< reco::PFCandidateCollection > > inputTagPFCandidates_
Input PFCandidates.
Definition: PFLinker.cc:44
edm::InputTag::label
std::string const & label() const
Definition: InputTag.h:36
PFLinker::forceElectronsInHGCAL_
bool forceElectronsInHGCAL_
Put Electrons within HGCAL coming from SimPFProducer.
Definition: PFLinker.cc:75
contentValuesCheck.values
values
Definition: contentValuesCheck.py:38
PFLinker::nameOutputPF_
std::string nameOutputPF_
name of output collection of PFCandidate
Definition: PFLinker.cc:57
PFLinker::producePFCandidates_
bool producePFCandidates_
Flags - if true: References will be towards new collection ; if false to the original one.
Definition: PFLinker.cc:69
PFLinker::muonTag_
edm::InputTag muonTag_
Input Muons.
Definition: PFLinker.cc:53
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:223
trigObjTnPSource_cfi.filler
filler
Definition: trigObjTnPSource_cfi.py:21
cand
Definition: decayParser.h:32
iEvent
int iEvent
Definition: GenABIO.cc:224
PFLinker::nameOutputElectronsPF_
std::string nameOutputElectronsPF_
name of output ValueMap electrons
Definition: PFLinker.cc:60
reco::PFCandidate::gamma
Definition: PFCandidate.h:49
PFLinker::nameOutputMergedPF_
std::string nameOutputMergedPF_
name of output merged ValueMap
Definition: PFLinker.cc:66
BPHMonitor_cfi.photons
photons
Definition: BPHMonitor_cfi.py:91
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
submitPVResolutionJobs.err
err
Definition: submitPVResolutionJobs.py:85
PFLinker::fillMuonRefs_
bool fillMuonRefs_
Set muon refs and produce the value map?
Definition: PFLinker.cc:72
edm::Ptr< PFCandidate >
eostools.move
def move(src, dest)
Definition: eostools.py:511
edm::OrphanHandle
Definition: EDProductfwd.h:39
PFLinker::inputTagPhotons_
edm::EDGetTokenT< reco::PhotonCollection > inputTagPhotons_
Input Photons.
Definition: PFLinker.cc:50
edm::ValueMap
Definition: ValueMap.h:107
PFLinker::inputTagGsfElectrons_
edm::EDGetTokenT< reco::GsfElectronCollection > inputTagGsfElectrons_
Input GsfElectrons.
Definition: PFLinker.cc:47
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
triggerMatcherToHLTDebug_cfi.tags
tags
Definition: triggerMatcherToHLTDebug_cfi.py:9
reco::PFCandidate
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:41
edm::helper::Filler
Definition: ValueMap.h:22
reco::Photon::regression2
Definition: Photon.h:273
edm::InputTag
Definition: InputTag.h:15
label
const char * label
Definition: PFTauDecayModeTools.cc:11
PFLinker::nameOutputPhotonsPF_
std::string nameOutputPhotonsPF_
name of output ValueMap photons
Definition: PFLinker.cc:63