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  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 }
190 
191 
192 
193 template<typename TYPE>
196  edm::Handle<TYPE>& inputObjCollection,
197  const std::map<edm::Ref<TYPE>, reco::PFCandidatePtr> & mapToTheCandidate,
198  const edm::OrphanHandle<reco::PFCandidateCollection> & newPFCandColl) const {
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 }
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
edm::InputTag muonTag_
Input Muons.
Definition: PFLinker.h:63
void setGsfElectronRef(const reco::GsfElectronRef &ref)
set GsfElectronRef
Definition: PFCandidate.cc:565
edm::EDGetTokenT< reco::MuonCollection > inputTagMuons_
Definition: PFLinker.h:64
float mva_nothing_gamma() const
mva for gamma detection
Definition: PFCandidate.h:314
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
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:194
edm::EDGetTokenT< reco::MuonToMuonMap > inputTagMuonMap_
Definition: PFLinker.h:65
std::vector< PFCandidatePtr > pfCandidates(const PFJet &jet, int particleId, bool sort=true)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
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
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:446
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:600
std::string const & label() const
Definition: InputTag.h:42
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:38
void setMuonRef(const reco::MuonRef &ref)
set muon reference
Definition: PFCandidate.cc:432
tuple muons
Definition: patZpeak.py:38
reco::GsfTrackRef gsfTrackRef() const
Definition: PFCandidate.cc:467
void setSuperClusterRef(const reco::SuperClusterRef &scRef)
Definition: PFCandidate.cc:616
virtual ParticleType particleId() const
Definition: PFCandidate.h:355
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:596