1 #ifndef UserCode_ICHiggsTauTau_ICPFCandidateProducer_h
2 #define UserCode_ICHiggsTauTau_ICPFCandidateProducer_h
6 #include "boost/functional/hash.hpp"
7 #include "boost/format.hpp"
8 #include "FWCore/Framework/interface/EDProducer.h"
9 #include "FWCore/ParameterSet/interface/ParameterSet.h"
10 #include "FWCore/Framework/interface/Event.h"
11 #include "FWCore/Framework/interface/EventSetup.h"
12 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
13 #if CMSSW_MAJOR_VERSION >= 7
14 #include "DataFormats/PatCandidates/interface/PackedCandidate.h"
18 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
19 #include "DataFormats/TrackReco/interface/Track.h"
20 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
21 #include "DataFormats/EgammaCandidates/interface/Conversion.h"
37 virtual void beginJob();
38 virtual void produce(edm::Event &,
const edm::EventSetup &);
39 virtual void endJob();
40 void constructSpecific(edm::Handle<edm::View<T> >
const& cands_handle,
41 reco::TrackRefVector* trk_requests,
42 reco::GsfTrackRefVector* gsf_trk_requests,
43 edm::Event& event,
const edm::EventSetup& setup);
45 std::vector<ic::PFCandidate> *cands_;
49 bool request_gsf_trks_;
50 boost::hash<T const*> cand_hasher_;
51 boost::hash<reco::Track const*> track_hasher_;
52 edm::InputTag track_input_;
60 : input_(config.getParameter<
edm::InputTag>(
"input")),
61 branch_(config.getParameter<
std::string>(
"branch")),
62 request_trks_(config.getParameter<bool>(
"requestTracks")),
63 request_gsf_trks_(config.getParameter<bool>(
"requestGsfTracks")),
64 track_input_(config.getParameter<
edm::InputTag>(
"inputUnpackedTracks")) {
65 consumes<edm::View<T>>(input_);
66 consumes<edm::View<reco::Track>>(track_input_);
67 cands_ =
new std::vector<ic::PFCandidate>();
70 produces<reco::TrackRefVector>(
"requestedTracks");
73 if (request_gsf_trks_) {
74 produces<reco::GsfTrackRefVector>(
"requestedGsfTracks");
91 const edm::EventSetup& setup) {
92 edm::Handle<edm::View<T> > cands_handle;
93 event.getByLabel(input_, cands_handle);
98 std::auto_ptr<reco::TrackRefVector> trk_requests(
new reco::TrackRefVector());
99 std::auto_ptr<reco::GsfTrackRefVector> gsf_trk_requests(
new reco::GsfTrackRefVector());
103 for (
unsigned i = 0; i < cands_handle->size(); ++i) {
104 T
const& src = cands_handle->at(i);
107 dest.
set_id(cand_hasher_(&src));
119 constructSpecific(cands_handle, trk_requests.get(), gsf_trk_requests.get(),
121 if (request_trks_)
event.put(trk_requests,
"requestedTracks");
122 if (request_gsf_trks_)
event.put(gsf_trk_requests,
"requestedGsfTracks");
130 edm::Handle<edm::View<T> >
const& cands_handle,
131 reco::TrackRefVector* trk_requests,
132 reco::GsfTrackRefVector* gsf_trk_requests, edm::Event& event,
133 const edm::EventSetup& setup) {}
137 edm::Handle<edm::View<reco::PFCandidate> >
const& cands_handle,
138 reco::TrackRefVector* trk_requests,
139 reco::GsfTrackRefVector* gsf_trk_requests, edm::Event& event,
140 const edm::EventSetup& setup) {
141 for (
unsigned i = 0; i < cands_handle->size(); ++i) {
142 reco::PFCandidate
const& src = cands_handle->at(i);
144 unsigned flag_val = 0;
146 if (src.flag(reco::PFCandidate::Flags(i))) flag_val = flag_val | (1 << i);
150 std::vector<std::size_t> trk_ids;
152 if (src.trackRef().isNonnull()) {
153 reco::TrackRef
const& trk = src.trackRef();
154 trk_requests->push_back(trk);
155 trk_ids.push_back(track_hasher_(&(*trk)));
160 if (request_gsf_trks_) {
161 std::vector<std::size_t> gsf_trk_ids;
162 if (src.gsfTrackRef().isNonnull()) {
163 reco::GsfTrackRef
const& trk = src.gsfTrackRef();
164 gsf_trk_requests->push_back(trk);
165 gsf_trk_ids.push_back(track_hasher_(&(*trk)));
172 #if CMSSW_MAJOR_VERSION >= 7
175 edm::Handle<edm::View<pat::PackedCandidate> >
const& cands_handle,
176 reco::TrackRefVector* trk_requests,
177 reco::GsfTrackRefVector* , edm::Event& event,
178 const edm::EventSetup& setup) {
183 edm::Handle<edm::View<reco::Track> > tracks_handle;
184 typedef std::set<reco::Track const*> TrackSet;
185 typedef std::map<reco::Track const*, unsigned> TrackMap;
190 event.getByLabel(track_input_, tracks_handle);
191 for (
unsigned i = 0; i < tracks_handle->size(); ++i) {
192 trk_set.insert(&(tracks_handle->at(i)));
193 trk_map[&(tracks_handle->at(i))] = i;
197 for (
unsigned i = 0; i < cands_handle->size(); ++i) {
198 pat::PackedCandidate
const& src = cands_handle->at(i);
205 std::vector<std::size_t> trk_ids;
206 if (request_trks_ && src.charge() != 0) {
207 reco::Track pseudo = src.pseudoTrack();
208 for (TrackSet::iterator it = trk_set.begin(); it != trk_set.end(); ++it) {
211 if (pseudo.momentum().x() != (*it)->momentum().x() ||
212 pseudo.momentum().y() != (*it)->momentum().y() ||
213 pseudo.momentum().z() != (*it)->momentum().z())
continue;
215 trk_requests->push_back(tracks_handle->refAt(trk_map.at(*it))
216 .
template castTo<reco::TrackRef>());
217 trk_ids.push_back(track_hasher_(*it));
void set_constituent_gsf_tracks(std::vector< std::size_t > const &constituent_gsf_tracks)
void set_phi(double const &phi)
Direct access to .
void set_id(std::size_t const &id)
Unique identifier.
Stores the basic properties of PFCandidates (and PackedCandidates for CMSSW 7_X_Y) ...
ICPFCandidateProducer(const edm::ParameterSet &)
void set_charge(int const &charge)
Electric charge.
void set_constituent_tracks(std::vector< std::size_t > const &constituent_tracks)
A vector to refer to the constituent track ic::Track::id() values.
void set_pdgid(int const &pdgid)
PDG number to identify the PF candidate type.
void set_energy(double const &energy)
Direct access to the energy.
void set_flags(unsigned const &flags)
PF flags.
void set_pt(double const &pt)
Direct access to the .
void set_eta(double const &eta)
Direct access to .