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 hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () 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, runTheMatrix::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:355
PFLinker::inputTagMuons_
edm::EDGetTokenT< reco::MuonCollection > inputTagMuons_
Definition: PFLinker.cc:54
reco::PFCandidate::e
Definition: PFCandidate.h:46
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:670
edm::LogError
Definition: MessageLogger.h:183
runTheMatrix.err
err
Definition: runTheMatrix.py:288
trigObjTnPSource_cfi.filler
filler
Definition: trigObjTnPSource_cfi.py:21
cand
Definition: decayParser.h:34
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:48
PFLinker::nameOutputMergedPF_
std::string nameOutputMergedPF_
name of output merged ValueMap
Definition: PFLinker.cc:66
BPHMonitor_cfi.photons
photons
Definition: BPHMonitor_cfi.py:91
PFLinker::fillMuonRefs_
bool fillMuonRefs_
Set muon refs and produce the value map?
Definition: PFLinker.cc:72
edm::Ptr< PFCandidate >
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
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
triggerMatcherToHLTDebug_cfi.tags
tags
Definition: triggerMatcherToHLTDebug_cfi.py:9
reco::PFCandidate
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:40
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