CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PuppiPhoton.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 
4 // user include files
26 //Main File
28 
29 // ------------------------------------------------------------------------------------------
31  tokenPFCandidates_ = consumes<CandidateView>(iConfig.getParameter<edm::InputTag>("candName"));
32  tokenPuppiCandidates_ = consumes<CandidateView>(iConfig.getParameter<edm::InputTag>("puppiCandName"));
33  tokenPhotonCandidates_ = consumes<CandidateView>(iConfig.getParameter<edm::InputTag>("photonName"));
34  tokenPhotonId_ = consumes<edm::ValueMap<bool> >(iConfig.getParameter<edm::InputTag>("photonId"));
35  pt_ = iConfig.getParameter<double>("pt");
36  dRMatch_ = iConfig.getParameter<std::vector<double> > ("dRMatch");
37  pdgIds_ = iConfig.getParameter<std::vector<int32_t> >("pdgids");
38  usePFRef_ = iConfig.getParameter<bool>("useRefs");
39  weight_ = iConfig.getParameter<double>("weight");
40  useValueMap_ = iConfig.getParameter<bool>("useValueMap");
41  tokenWeights_ = consumes<edm::ValueMap<float> >(iConfig.getParameter<edm::InputTag>("weightsName"));
42 
43  usePhotonId_ = (iConfig.getParameter<edm::InputTag>("photonId")).label().size() == 0;
44  produces<PFOutputCollection>();
45  produces< edm::ValueMap<reco::CandidatePtr> >();
46 }
47 // ------------------------------------------------------------------------------------------
49 // ------------------------------------------------------------------------------------------
51 
52  edm::Handle<CandidateView> hPhoProduct;
53  iEvent.getByToken(tokenPhotonCandidates_,hPhoProduct);
54  const CandidateView *phoCol = hPhoProduct.product();
55 
57  if(usePhotonId_) iEvent.getByToken(tokenPhotonId_,photonId);
58  int iC = -1;
59  std::vector<const reco::Candidate*> phoCands;
60  std::vector<uint16_t> phoIndx;
61 
62  // Get PFCandidate Collection
63  edm::Handle<CandidateView> hPFProduct;
64  iEvent.getByToken(tokenPFCandidates_,hPFProduct);
65  const CandidateView *pfCol = hPFProduct.product();
66 
67  edm::Handle<CandidateView> hPuppiProduct;
68  iEvent.getByToken(tokenPuppiCandidates_,hPuppiProduct);
69  const CandidateView *pupCol = hPuppiProduct.product();
70  for(CandidateView::const_iterator itPho = phoCol->begin(); itPho!=phoCol->end(); itPho++) {
71  iC++;
72  bool passObject = false;
73  if(itPho->isPhoton() && usePhotonId_) passObject = (*photonId) [phoCol->ptrAt(iC)];
74  if(itPho->pt() < pt_) continue;
75  if(!passObject && usePhotonId_) continue;
76  if(!usePFRef_) phoCands.push_back(&(*itPho));
77  if(!usePFRef_) continue;
78  const pat::Photon *pPho = dynamic_cast<const pat::Photon*>(&(*itPho));
79  if(pPho != 0) {
81  if(matchPFCandidate(&(*(pfCol->ptrAt(ref.key()))),&(*itPho))) {
82  phoIndx.push_back(ref.key());
83  phoCands.push_back(&(*(pfCol->ptrAt(ref.key()))));
84  }
85  }
86  continue;
87  }
88  const pat::Electron *pElectron = dynamic_cast<const pat::Electron*>(&(*itPho));
89  if(pElectron != 0) {
91  if(matchPFCandidate(&(*(pfCol->ptrAt(ref.key()))),&(*itPho))) {
92  phoIndx.push_back(ref.key());
93  phoCands.push_back(&(*(pfCol->ptrAt(ref.key()))));
94  }
95  }
96  }
97  //Get Weights
99  iEvent.getByToken(tokenWeights_,pupWeights);
100  std::auto_ptr<edm::ValueMap<LorentzVector> > p4PupOut(new edm::ValueMap<LorentzVector>());
101  LorentzVectorCollection puppiP4s;
102  std::vector<reco::CandidatePtr> values(hPFProduct->size());
103  int iPF = 0;
104  std::vector<float> lWeights;
105  static const reco::PFCandidate dummySinceTranslateIsNotStatic;
106  corrCandidates_.reset( new PFOutputCollection );
107  std::vector<int> foundPhoIndex;
108  for(CandidateView::const_iterator itPF = pupCol->begin(); itPF!=pupCol->end(); itPF++) {
109  auto id = dummySinceTranslateIsNotStatic.translatePdgIdToType(itPF->pdgId());
110  const reco::PFCandidate *pPF = dynamic_cast<const reco::PFCandidate*>(&(*itPF));
111  reco::PFCandidate pCand( pPF ? *pPF : reco::PFCandidate(itPF->charge(), itPF->p4(), id) );
112  LorentzVector pVec = itPF->p4();
113  float pWeight = 1.;
114  if(useValueMap_) pWeight = (*pupWeights)[pupCol->ptrAt(iPF)];
115  if(!usePFRef_) {
116  for(std::vector<const reco::Candidate*>::iterator itPho = phoCands.begin(); itPho!=phoCands.end(); itPho++) {
117  if(matchPFCandidate(&(*itPF),*itPho)) pWeight = weight_;
118  }
119  } else {
120  int iPho = -1;
121  for(std::vector<uint16_t>::const_iterator itPho = phoIndx.begin(); itPho!=phoIndx.end(); itPho++) {
122  iPho++;
123  if(pupCol->refAt(iPF).key() != *itPho) continue;
124  pWeight = weight_;
125  if(!useValueMap_ && itPF->pt() != 0) pWeight = pWeight*(phoCands[iPho]->pt()/itPF->pt());
126  foundPhoIndex.push_back(iPho); }
127  }
128 
129  if(itPF->pt() != 0) pVec.SetPxPyPzE(itPF->px()*pWeight,itPF->py()*pWeight,itPF->pz()*pWeight,itPF->energy()*pWeight);
130 
131  lWeights.push_back(pWeight);
132  pCand.setP4(pVec);
133  puppiP4s.push_back( pVec );
134  pCand.setSourceCandidatePtr( itPF->sourceCandidatePtr(0) );
135  corrCandidates_->push_back(pCand);
136  iPF++;
137  }
138  //Add the missing pfcandidates
139  for(unsigned int iPho = 0; iPho < phoCands.size(); iPho++) {
140  bool pFound = false;
141  for(unsigned int jPho = 0; jPho < foundPhoIndex.size(); jPho++) {
142  if(foundPhoIndex[jPho] == int(iPho)) {
143  pFound = true;
144  break;
145  }
146  }
147  if(pFound) continue;
148  auto id = dummySinceTranslateIsNotStatic.translatePdgIdToType(phoCands[iPho]->pdgId());
149  reco::PFCandidate pCand(reco::PFCandidate(phoCands[iPho]->charge(), phoCands[iPho]->p4(),id) );
150  pCand.setSourceCandidatePtr( phoCands[iPho]->sourceCandidatePtr(0) );
151  LorentzVector pVec = phoCands[iPho]->p4();
152  pVec.SetPxPyPzE(phoCands[iPho]->px()*weight_,phoCands[iPho]->py()*weight_,phoCands[iPho]->pz()*weight_,phoCands[iPho]->energy()*weight_);
153  pCand.setP4(pVec);
154  lWeights.push_back(weight_);
155  puppiP4s.push_back( pVec );
156  corrCandidates_->push_back(pCand);
157  }
158  //Fill it into the event
160  for(unsigned int ic=0, nc = pupCol->size(); ic < nc; ++ic) {
161  reco::CandidatePtr pkref( oh, ic );
162  values[ic] = pkref;
163  }
164  std::auto_ptr<edm::ValueMap<reco::CandidatePtr> > pfMap_p(new edm::ValueMap<reco::CandidatePtr>());
166  filler.insert(hPFProduct, values.begin(), values.end());
167  filler.fill();
168  iEvent.put(pfMap_p);
169 }
170 // ------------------------------------------------------------------------------------------
172  double lDR = deltaR(iPF->eta(),iPF->phi(),iPho->eta(),iPho->phi());
173  for(unsigned int i0 = 0; i0 < pdgIds_.size(); i0++) {
174  if(std::abs(iPF->pdgId()) == pdgIds_[i0] && lDR < dRMatch_[i0]) return true;
175  }
176  return false;
177 }
178 // ------------------------------------------------------------------------------------------
180  //The following says we do not know what parameters are allowed so do no validation
181  // Please change this to state exactly what you do use, even if it is no parameters
183  desc.setUnknown();
184  descriptions.addDefault(desc);
185 }
186 //define this as a plug-in
std::vector< int32_t > pdgIds_
Definition: PuppiPhoton.h:43
double pt_
Definition: PuppiPhoton.h:39
T getParameter(std::string const &) const
Analysis-level Photon class.
Definition: Photon.h:47
edm::EDGetTokenT< CandidateView > tokenPhotonCandidates_
Definition: PuppiPhoton.h:36
PuppiPhoton(const edm::ParameterSet &)
Definition: PuppiPhoton.cc:30
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:462
Ptr< value_type > ptrAt(size_type i) const
std::vector< reco::PFCandidate > PFOutputCollection
Definition: PuppiPhoton.h:28
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::auto_ptr< PFOutputCollection > corrCandidates_
Definition: PuppiPhoton.h:44
void insert(const H &h, I begin, I end)
Definition: ValueMap.h:52
edm::RefVector< pat::PackedCandidateCollection > associatedPackedPFCandidates() const
References to PFCandidates linked to this object (e.g. for isolation vetos or masking before jet recl...
size_type size() const
void setSourceCandidatePtr(const PFCandidatePtr &ptr)
Definition: PFCandidate.h:125
edm::EDGetTokenT< CandidateView > tokenPuppiCandidates_
Definition: PuppiPhoton.h:35
bool usePFRef_
Definition: PuppiPhoton.h:40
RefToBase< value_type > refAt(size_type i) const
int iEvent
Definition: GenABIO.cc:230
void addDefault(ParameterSetDescription const &psetDescription)
const_iterator begin() const
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:121
double p4[4]
Definition: TauolaWrapper.h:92
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual void produce(edm::Event &, const edm::EventSetup &)
Definition: PuppiPhoton.cc:50
bool matchPFCandidate(const reco::Candidate *iPF, const reco::Candidate *iPho)
Definition: PuppiPhoton.cc:171
bool usePhotonId_
Definition: PuppiPhoton.h:41
double weight_
Definition: PuppiPhoton.h:45
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
virtual int pdgId() const =0
PDG identifier.
T const * product() const
Definition: Handle.h:81
edm::EDGetTokenT< edm::ValueMap< float > > tokenWeights_
Definition: PuppiPhoton.h:37
Analysis-level electron class.
Definition: Electron.h:52
virtual void setP4(const LorentzVector &p4) final
set 4-momentum
ParticleType translatePdgIdToType(int pdgid) const
Definition: PFCandidate.cc:224
std::vector< double > dRMatch_
Definition: PuppiPhoton.h:42
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:39
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:81
edm::EDGetTokenT< edm::ValueMap< bool > > tokenPhotonId_
Definition: PuppiPhoton.h:38
const_iterator end() const
math::XYZTLorentzVector LorentzVector
Definition: PuppiPhoton.h:25
edm::EDGetTokenT< CandidateView > tokenPFCandidates_
Definition: PuppiPhoton.h:34
edm::RefVector< pat::PackedCandidateCollection > associatedPackedPFCandidates() const
References to PFCandidates linked to this object (e.g. for isolation vetos or masking before jet recl...
std::vector< LorentzVector > LorentzVectorCollection
Definition: PuppiPhoton.h:26
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: PuppiPhoton.cc:179
bool useValueMap_
Definition: PuppiPhoton.h:46
virtual double phi() const =0
momentum azimuthal angle
virtual double eta() const =0
momentum pseudorapidity