test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PFLinker.cc
Go to the documentation of this file.
2 
3 
7 
8 
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 }
59 
61 
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  // update energy information since now it is done post-particleFlowTmp
125  cand.setEcalEnergy(electronRef->superCluster()->rawEnergy(),electronRef->ecalEnergy());
126  cand.setDeltaP(electronRef->p4Error(reco::GsfElectron::P4_COMBINATION));
127  cand.setP4(electronRef->p4(reco::GsfElectron::P4_COMBINATION));
128  electronCandidateMap[electronRef] = candPtr;
129  }
130 
131  // if it is a photon, find the one with the same PF super-cluster
132  if (isphoton) {
133  const reco::SuperClusterRef & scRef(cand.superClusterRef());
134  PhotonEqual myEqual(scRef);
135  std::vector<reco::Photon>::const_iterator itcheck=find_if(photons->begin(),photons->end(),myEqual);
136  if(itcheck==photons->end()) {
137  std::ostringstream err;
138  err << " Problem in PFLinker: no Photon " << std::endl;
139  edm::LogError("PFLinker") << err.str();
140  continue; // Watch out ! Continue
141  }
142  reco::PhotonRef photonRef(photons,itcheck-photons->begin());
143  cand.setPhotonRef(photonRef);
144  cand.setSuperClusterRef(photonRef->superCluster());
145  // update energy information since now it is done post-particleFlowTmp
146  cand.setEcalEnergy(photonRef->superCluster()->rawEnergy(),
147  photonRef->getCorrectedEnergy(reco::Photon::regression2));
148  cand.setDeltaP(photonRef->getCorrectedEnergyError(reco::Photon::regression2));
149  cand.setP4(photonRef->p4(reco::Photon::regression2));
150  photonCandidateMap[photonRef] = candPtr;
151  }
152 
153  pfCandidates_p->push_back(cand);
154  }
155  // save the PFCandidates and get a valid handle
156  }
157  const edm::OrphanHandle<reco::PFCandidateCollection> pfCandidateRefProd = (producePFCandidates_) ? iEvent.put(pfCandidates_p,nameOutputPF_) :
159 
160 
161  // now make the valuemaps
162 
163  edm::ValueMap<reco::PFCandidatePtr> pfMapGsfElectrons = fillValueMap<reco::GsfElectronCollection>(iEvent,
165  gsfElectrons,
166  electronCandidateMap,
167  pfCandidateRefProd);
168 
169  edm::ValueMap<reco::PFCandidatePtr> pfMapPhotons = fillValueMap<reco::PhotonCollection>(iEvent,
171  photons,
172  photonCandidateMap,
173  pfCandidateRefProd);
174 
175 
177 
178  if(fillMuonRefs_){
180  iEvent.getByToken(inputTagMuons_, muons);
181 
182  pfMapMuons = fillValueMap<reco::MuonCollection>(iEvent,
183  muonTag_.label(),
184  muons,
185  muonCandidateMap,
186  pfCandidateRefProd);
187  }
188 
189  std::auto_ptr<edm::ValueMap<reco::PFCandidatePtr> >
190  pfMapMerged(new edm::ValueMap<reco::PFCandidatePtr>());
191  edm::ValueMap<reco::PFCandidatePtr>::Filler pfMapMergedFiller(*pfMapMerged);
192 
193  *pfMapMerged += pfMapGsfElectrons;
194  *pfMapMerged += pfMapPhotons;
195  if(fillMuonRefs_) *pfMapMerged += pfMapMuons;
196 
197  iEvent.put(pfMapMerged,nameOutputMergedPF_);
198 }
199 
200 
201 
202 template<typename TYPE>
205  edm::Handle<TYPE>& inputObjCollection,
206  const std::map<edm::Ref<TYPE>, reco::PFCandidatePtr> & mapToTheCandidate,
207  const edm::OrphanHandle<reco::PFCandidateCollection> & newPFCandColl) const {
208 
209  std::auto_ptr<edm::ValueMap<reco::PFCandidatePtr> > pfMap_p(new edm::ValueMap<reco::PFCandidatePtr>());
211 
212  typedef typename std::map<edm::Ref<TYPE>, reco::PFCandidatePtr>::const_iterator MapTYPE_it;
213 
214  unsigned nObj=inputObjCollection->size();
215  std::vector<reco::PFCandidatePtr> values(nObj);
216 
217  for(unsigned iobj=0; iobj < nObj; ++iobj) {
218 
219  edm::Ref<TYPE> objRef(inputObjCollection, iobj);
220  MapTYPE_it itcheck = mapToTheCandidate.find(objRef);
221 
222  reco::PFCandidatePtr candPtr;
223 
224  if(itcheck != mapToTheCandidate.end())
225  candPtr = producePFCandidates_ ? reco::PFCandidatePtr(newPFCandColl,itcheck->second.key()) : itcheck->second;
226 
227  values[iobj] = candPtr;
228  }
229 
230  filler.insert(inputObjCollection,values.begin(),values.end());
231  filler.fill();
232  edm::ValueMap<reco::PFCandidatePtr> returnValue = *pfMap_p;
233  event.put(pfMap_p,label);
234  return returnValue;
235 }
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
edm::InputTag muonTag_
Input Muons.
Definition: PFLinker.h:63
void setDeltaP(double dp)
set uncertainty on momentum
Definition: PFCandidate.h:294
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:252
void setGsfElectronRef(const reco::GsfElectronRef &ref)
set GsfElectronRef
Definition: PFCandidate.cc:569
edm::EDGetTokenT< reco::MuonCollection > inputTagMuons_
Definition: PFLinker.h:64
float mva_nothing_gamma() const
mva for gamma detection
Definition: PFCandidate.h:332
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:462
assert(m_qm.get())
void insert(const H &h, I begin, I end)
Definition: ValueMap.h:52
virtual void produce(edm::Event &, const edm::EventSetup &) override
Definition: PFLinker.cc:62
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
~PFLinker()
Definition: PFLinker.cc:60
PFLinker(const edm::ParameterSet &)
Definition: PFLinker.cc:9
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
Definition: PFLinker.cc:203
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:121
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
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
reco::MuonRef muonRef() const
Definition: PFCandidate.cc:450
void setEcalEnergy(float eeRaw, float eeCorr)
set corrected Ecal energy
Definition: PFCandidate.h:217
tuple tags
Definition: o2o.py:248
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
bool fillMuonRefs_
Set muon refs and produce the value map?
Definition: PFLinker.h:82
void setPhotonRef(const reco::PhotonRef &phRef)
set ref to the corresponding reco::Photon if any
Definition: PFCandidate.cc:604
virtual void setP4(const LorentzVector &p4) final
set 4-momentum
std::string const & label() const
Definition: InputTag.h:36
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:39
void setMuonRef(const reco::MuonRef &ref)
set muon reference
Definition: PFCandidate.cc:436
tuple muons
Definition: patZpeak.py:38
reco::GsfTrackRef gsfTrackRef() const
Definition: PFCandidate.cc:471
void setSuperClusterRef(const reco::SuperClusterRef &scRef)
Definition: PFCandidate.cc:620
virtual ParticleType particleId() const
Definition: PFCandidate.h:373
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
reco::SuperClusterRef superClusterRef() const
return a reference to the corresponding SuperCluster if any
Definition: PFCandidate.cc:600