CMS 3D CMS Logo

PuppiPhoton.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 
4 // user include files
23 //Main File
25 
26 // ------------------------------------------------------------------------------------------
28  tokenPFCandidates_ = consumes<CandidateView>(iConfig.getParameter<edm::InputTag>("candName"));
29  tokenPuppiCandidates_ = consumes<CandidateView>(iConfig.getParameter<edm::InputTag>("puppiCandName"));
30  usePFphotons_ = iConfig.getParameter<bool>("usePFphotons");
31  if (!usePFphotons_)
32  tokenPhotonCandidates_ = consumes<CandidateView>(iConfig.getParameter<edm::InputTag>("photonName"));
33  usePhotonId_ = !(iConfig.getParameter<edm::InputTag>("photonId")).label().empty();
34  if (usePhotonId_)
35  tokenPhotonId_ = consumes<edm::ValueMap<bool>>(iConfig.getParameter<edm::InputTag>("photonId"));
36  runOnMiniAOD_ = iConfig.getParameter<bool>("runOnMiniAOD");
37  if (!runOnMiniAOD_)
38  reco2pf_ =
39  consumes<edm::ValueMap<std::vector<reco::PFCandidateRef>>>(iConfig.getParameter<edm::InputTag>("recoToPFMap"));
40  useValueMap_ = iConfig.getParameter<bool>("useValueMap");
41  if (useValueMap_)
42  tokenWeights_ = consumes<edm::ValueMap<float>>(iConfig.getParameter<edm::InputTag>("weightsName"));
43 
44  pt_ = iConfig.getParameter<double>("pt");
45  eta_ = iConfig.getParameter<double>("eta");
46  dRMatch_ = iConfig.getParameter<std::vector<double>>("dRMatch");
47  pdgIds_ = iConfig.getParameter<std::vector<int32_t>>("pdgids");
48  usePFRef_ = iConfig.getParameter<bool>("useRefs");
49  weight_ = iConfig.getParameter<double>("weight");
50  produces<PFOutputCollection>();
51  produces<edm::ValueMap<reco::CandidatePtr>>();
52 }
53 // ------------------------------------------------------------------------------------------
55 // ------------------------------------------------------------------------------------------
57  int iC = -1;
58  std::vector<const reco::Candidate *> phoCands;
59  std::vector<uint16_t> phoIndx;
60 
62  if (!runOnMiniAOD_)
63  iEvent.getByToken(reco2pf_, reco2pf);
64 
65  // Get PFCandidate Collection
66  edm::Handle<CandidateView> hPFProduct;
67  iEvent.getByToken(tokenPFCandidates_, hPFProduct);
68  const CandidateView *pfCol = hPFProduct.product();
69 
70  edm::Handle<CandidateView> hPuppiProduct;
71  iEvent.getByToken(tokenPuppiCandidates_, hPuppiProduct);
72  const CandidateView *pupCol = hPuppiProduct.product();
73  if (usePFphotons_) {
74  for (const auto &pho : *pfCol) {
75  iC++;
76  if (pho.pt() < pt_)
77  continue;
78  if (std::abs(pho.pdgId()) != 22)
79  continue;
80  if (fabs(pho.eta()) < eta_) {
81  phoIndx.push_back(iC);
82  phoCands.push_back(&pho);
83  }
84  }
85  } else {
86  edm::Handle<CandidateView> hPhoProduct;
87  iEvent.getByToken(tokenPhotonCandidates_, hPhoProduct);
88  const CandidateView *phoCol = hPhoProduct.product();
89 
91  if (usePhotonId_)
92  iEvent.getByToken(tokenPhotonId_, photonId);
93 
94  for (CandidateView::const_iterator itPho = phoCol->begin(); itPho != phoCol->end(); itPho++) {
95  iC++;
96  bool passObject = false;
97  if (itPho->isPhoton() && usePhotonId_)
98  passObject = (*photonId)[phoCol->ptrAt(iC)];
99  if (itPho->pt() < pt_)
100  continue;
101  if (!passObject && usePhotonId_)
102  continue;
103  if (runOnMiniAOD_) {
104  const pat::Photon *pPho = dynamic_cast<const pat::Photon *>(&(*itPho));
105  if (pPho != nullptr) {
107  if (fabs(ref->eta()) < eta_) {
108  phoIndx.push_back(ref.key());
109  phoCands.push_back(&(*(pfCol->ptrAt(ref.key()))));
110  }
111  }
112  continue;
113  }
114  const pat::Electron *pElectron = dynamic_cast<const pat::Electron *>(&(*itPho));
115  if (pElectron != nullptr) {
117  if (fabs(ref->eta()) < eta_) {
118  phoIndx.push_back(ref.key());
119  phoCands.push_back(&(*(pfCol->ptrAt(ref.key()))));
120  }
121  }
122  } else {
123  for (const edm::Ref<std::vector<reco::PFCandidate>> &ref : (*reco2pf)[phoCol->ptrAt(iC)]) {
124  if (fabs(ref->eta()) < eta_) {
125  phoIndx.push_back(ref.key());
126  phoCands.push_back(&(*(pfCol->ptrAt(ref.key()))));
127  }
128  }
129  }
130  }
131  }
132  //Get Weights
134  if (useValueMap_)
135  iEvent.getByToken(tokenWeights_, pupWeights);
136  std::unique_ptr<edm::ValueMap<LorentzVector>> p4PupOut(new edm::ValueMap<LorentzVector>());
137  LorentzVectorCollection puppiP4s;
138  std::vector<reco::CandidatePtr> values(hPFProduct->size());
139  int iPF = 0;
140  std::vector<float> lWeights;
141  static const reco::PFCandidate dummySinceTranslateIsNotStatic;
142  corrCandidates_ = std::make_unique<PFOutputCollection>();
143  std::set<int> foundPhoIndex;
144  for (CandidateView::const_iterator itPF = pupCol->begin(); itPF != pupCol->end(); itPF++) {
145  auto id = dummySinceTranslateIsNotStatic.translatePdgIdToType(itPF->pdgId());
146  const reco::PFCandidate *pPF = dynamic_cast<const reco::PFCandidate *>(&(*itPF));
147  reco::PFCandidate pCand(pPF ? *pPF : reco::PFCandidate(itPF->charge(), itPF->p4(), id));
148  LorentzVector pVec = itPF->p4();
149  float pWeight = 1.;
150  if (useValueMap_)
151  pWeight = (*pupWeights)[pupCol->ptrAt(iPF)];
152  if (!usePFRef_) {
153  int iPho = -1;
154  for (std::vector<const reco::Candidate *>::iterator itPho = phoCands.begin(); itPho != phoCands.end(); itPho++) {
155  iPho++;
156  if ((!matchPFCandidate(&(*itPF), *itPho)) || (foundPhoIndex.count(iPho) != 0))
157  continue;
158  pWeight = weight_;
159  if (!useValueMap_ && itPF->pt() != 0)
160  pWeight = pWeight * (phoCands[iPho]->pt() / itPF->pt());
161  if (!useValueMap_ && itPF->pt() == 0)
162  pVec.SetPxPyPzE(phoCands[iPho]->px() * pWeight,
163  phoCands[iPho]->py() * pWeight,
164  phoCands[iPho]->pz() * pWeight,
165  phoCands[iPho]->energy() * pWeight);
166  foundPhoIndex.insert(iPho);
167  }
168  } else {
169  int iPho = -1;
170  for (std::vector<uint16_t>::const_iterator itPho = phoIndx.begin(); itPho != phoIndx.end(); itPho++) {
171  iPho++;
172  if (pupCol->refAt(iPF).key() != *itPho)
173  continue;
174  pWeight = weight_;
175  if (!useValueMap_ && itPF->pt() != 0)
176  pWeight = pWeight * (phoCands[iPho]->pt() / itPF->pt());
177  if (!useValueMap_ && itPF->pt() == 0)
178  pVec.SetPxPyPzE(phoCands[iPho]->px() * pWeight,
179  phoCands[iPho]->py() * pWeight,
180  phoCands[iPho]->pz() * pWeight,
181  phoCands[iPho]->energy() * pWeight);
182  foundPhoIndex.insert(iPho);
183  }
184  }
185  if (itPF->pt() != 0)
186  pVec.SetPxPyPzE(itPF->px() * pWeight, itPF->py() * pWeight, itPF->pz() * pWeight, itPF->energy() * pWeight);
187 
188  lWeights.push_back(pWeight);
189  pCand.setP4(pVec);
190  puppiP4s.push_back(pVec);
191  pCand.setSourceCandidatePtr(itPF->sourceCandidatePtr(0));
192  corrCandidates_->push_back(pCand);
193  iPF++;
194  }
195  //Add the missing pfcandidates
196  for (unsigned int iPho = 0; iPho < phoCands.size(); iPho++) {
197  if (foundPhoIndex.count(iPho) != 0)
198  continue;
199  auto id = dummySinceTranslateIsNotStatic.translatePdgIdToType(phoCands[iPho]->pdgId());
200  reco::PFCandidate pCand(reco::PFCandidate(phoCands[iPho]->charge(), phoCands[iPho]->p4(), id));
201  pCand.setSourceCandidatePtr(phoCands[iPho]->sourceCandidatePtr(0));
202  LorentzVector pVec = phoCands[iPho]->p4();
203  pVec.SetPxPyPzE(phoCands[iPho]->px() * weight_,
204  phoCands[iPho]->py() * weight_,
205  phoCands[iPho]->pz() * weight_,
206  phoCands[iPho]->energy() * weight_);
207  pCand.setP4(pVec);
208  lWeights.push_back(weight_);
209  puppiP4s.push_back(pVec);
210  corrCandidates_->push_back(pCand);
211  }
212  //Fill it into the event
214  for (unsigned int ic = 0, nc = pupCol->size(); ic < nc; ++ic) {
215  reco::CandidatePtr pkref(oh, ic);
216  values[ic] = pkref;
217  }
218  std::unique_ptr<edm::ValueMap<reco::CandidatePtr>> pfMap_p(new edm::ValueMap<reco::CandidatePtr>());
220  filler.insert(hPFProduct, values.begin(), values.end());
221  filler.fill();
222  iEvent.put(std::move(pfMap_p));
223 }
224 // ------------------------------------------------------------------------------------------
226  if (iPF->pdgId() != iPho->pdgId())
227  return false;
228  double lDR = deltaR(iPF->eta(), iPF->phi(), iPho->eta(), iPho->phi());
229  for (unsigned int i0 = 0; i0 < pdgIds_.size(); i0++) {
230  if (std::abs(iPF->pdgId()) == pdgIds_[i0] && lDR < dRMatch_[i0])
231  return true;
232  }
233  return false;
234 }
235 // ------------------------------------------------------------------------------------------
237  //The following says we do not know what parameters are allowed so do no validation
238  // Please change this to state exactly what you do use, even if it is no parameters
240  desc.setUnknown();
241  descriptions.addDefault(desc);
242 }
243 //define this as a plug-in
edm::View::begin
const_iterator begin() const
PuppiPhoton::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: PuppiPhoton.cc:236
edm::Handle::product
T const * product() const
Definition: Handle.h:70
PuppiPhoton::pt_
double pt_
Definition: PuppiPhoton.h:41
EDProducer.h
ESHandle.h
PuppiPhoton::~PuppiPhoton
~PuppiPhoton() override
Definition: PuppiPhoton.cc:54
DiDispStaMuonMonitor_cfi.pt
pt
Definition: DiDispStaMuonMonitor_cfi.py:39
PuppiPhoton::pdgIds_
std::vector< int32_t > pdgIds_
Definition: PuppiPhoton.h:48
edm::View::refAt
RefToBase< value_type > refAt(size_type i) const
reco::Candidate::eta
virtual double eta() const =0
momentum pseudorapidity
multPhiCorr_741_25nsDY_cfi.py
py
Definition: multPhiCorr_741_25nsDY_cfi.py:12
PuppiPhoton::useValueMap_
bool useValueMap_
Definition: PuppiPhoton.h:51
Photon.h
pat::Photon
Analysis-level Photon class.
Definition: Photon.h:46
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
PuppiPhoton.h
PuppiPhoton::usePFRef_
bool usePFRef_
Definition: PuppiPhoton.h:43
PuppiPhoton::usePFphotons_
bool usePFphotons_
Definition: PuppiPhoton.h:44
pat::Electron::associatedPackedPFCandidates
edm::RefVector< pat::PackedCandidateCollection > associatedPackedPFCandidates() const
References to PFCandidates linked to this object (e.g. for isolation vetos or masking before jet recl...
Association.h
edm::Handle
Definition: AssociativeIterator.h:50
PuppiPhoton
Definition: PuppiPhoton.h:20
edm::Ref< pat::PackedCandidateCollection >
CandidateFwd.h
MakerMacros.h
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
contentValuesCheck.values
values
Definition: contentValuesCheck.py:38
PuppiPhoton::tokenPFCandidates_
edm::EDGetTokenT< CandidateView > tokenPFCandidates_
Definition: PuppiPhoton.h:35
HCALHighEnergyHPDFilter_cfi.energy
energy
Definition: HCALHighEnergyHPDFilter_cfi.py:5
PuppiPhoton::weight_
double weight_
Definition: PuppiPhoton.h:50
pat::Photon::associatedPackedPFCandidates
edm::RefVector< pat::PackedCandidateCollection > associatedPackedPFCandidates() const
References to PFCandidates linked to this object (e.g. for isolation vetos or masking before jet recl...
PbPb_ZMuSkimMuonDPG_cff.deltaR
deltaR
Definition: PbPb_ZMuSkimMuonDPG_cff.py:63
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
edm::View::size
size_type size() const
PuppiPhoton::tokenPhotonId_
edm::EDGetTokenT< edm::ValueMap< bool > > tokenPhotonId_
Definition: PuppiPhoton.h:40
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
edm::View
Definition: CaloClusterFwd.h:14
edm::ParameterSet
Definition: ParameterSet.h:47
Event.h
deltaR.h
trigObjTnPSource_cfi.filler
filler
Definition: trigObjTnPSource_cfi.py:21
PackedCandidate.h
PuppiPhoton::tokenWeights_
edm::EDGetTokenT< edm::ValueMap< float > > tokenWeights_
Definition: PuppiPhoton.h:39
iEvent
int iEvent
Definition: GenABIO.cc:224
p4
double p4[4]
Definition: TauolaWrapper.h:92
GsfTrack.h
PuppiPhoton::matchPFCandidate
bool matchPFCandidate(const reco::Candidate *iPF, const reco::Candidate *iPho)
Definition: PuppiPhoton.cc:225
EgammaValidation_cff.pdgId
pdgId
Definition: EgammaValidation_cff.py:117
edm::EventSetup
Definition: EventSetup.h:58
reco::Candidate::pdgId
virtual int pdgId() const =0
PDG identifier.
edm::Ptr< Candidate >
reco::Candidate
Definition: Candidate.h:27
VertexFwd.h
multPhiCorr_741_25nsDY_cfi.px
px
Definition: multPhiCorr_741_25nsDY_cfi.py:10
reco::LeafCandidate::setP4
void setP4(const LorentzVector &p4) final
set 4-momentum
Definition: LeafCandidate.h:158
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
edm::OrphanHandle
Definition: EDProductfwd.h:39
GsfTrackFwd.h
PuppiPhoton::LorentzVector
math::XYZTLorentzVector LorentzVector
Definition: PuppiPhoton.h:26
PuppiPhoton::usePhotonId_
bool usePhotonId_
Definition: PuppiPhoton.h:46
Vertex.h
Frameworkfwd.h
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:29
edm::ValueMap
Definition: ValueMap.h:107
PuppiPhoton::LorentzVectorCollection
std::vector< LorentzVector > LorentzVectorCollection
Definition: PuppiPhoton.h:27
PuppiPhoton::corrCandidates_
std::unique_ptr< PFOutputCollection > corrCandidates_
Definition: PuppiPhoton.h:49
PuppiPhoton::eta_
double eta_
Definition: PuppiPhoton.h:42
PuppiPhoton::reco2pf_
edm::EDGetTokenT< edm::ValueMap< std::vector< reco::PFCandidateRef > > > reco2pf_
Definition: PuppiPhoton.h:38
PuppiPhoton::tokenPhotonCandidates_
edm::EDGetTokenT< CandidateView > tokenPhotonCandidates_
Definition: PuppiPhoton.h:37
EventSetup.h
reco::PFCandidate::translatePdgIdToType
ParticleType translatePdgIdToType(int pdgid) const
Definition: PFCandidate.cc:209
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
PuppiPhoton::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: PuppiPhoton.cc:56
Electron.h
edm::View::const_iterator
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:86
reco::PFCandidate
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:41
edm::helper::Filler
Definition: ValueMap.h:22
pat::Electron
Analysis-level electron class.
Definition: Electron.h:51
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
PuppiPhoton::tokenPuppiCandidates_
edm::EDGetTokenT< CandidateView > tokenPuppiCandidates_
Definition: PuppiPhoton.h:36
edm::View::end
const_iterator end() const
View.h
ParameterSet.h
edm::Event
Definition: Event.h:73
reco::PFCandidate::setSourceCandidatePtr
void setSourceCandidatePtr(const PFCandidatePtr &ptr)
Definition: PFCandidate.h:120
edm::ConfigurationDescriptions::addDefault
void addDefault(ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:99
reco::Candidate::phi
virtual double phi() const =0
momentum azimuthal angle
edm::View::ptrAt
Ptr< value_type > ptrAt(size_type i) const
PuppiPhoton::dRMatch_
std::vector< double > dRMatch_
Definition: PuppiPhoton.h:47
edm::InputTag
Definition: InputTag.h:15
PuppiPhoton::runOnMiniAOD_
bool runOnMiniAOD_
Definition: PuppiPhoton.h:45
PuppiPhoton::PuppiPhoton
PuppiPhoton(const edm::ParameterSet &)
Definition: PuppiPhoton.cc:27