CMS 3D CMS Logo

BPHTrackReference.h
Go to the documentation of this file.
1 #ifndef HeavyFlavorAnalysis_RecoDecay_BPHTrackReference_h
2 #define HeavyFlavorAnalysis_RecoDecay_BPHTrackReference_h
3 
13 //----------------------
14 // Base Class Headers --
15 //----------------------
16 
17 //------------------------------------
18 // Collaborating Class Declarations --
19 //------------------------------------
27 
28 //---------------
29 // C++ Headers --
30 //---------------
31 #include <iostream>
32 
33 // ---------------------
34 // -- Class Interface --
35 // ---------------------
36 
38 public:
40 
44 
48 
51  static const reco::Track* getTrack(const reco::Candidate& rc,
66  const char* modeList = "cfhbpmnigse",
67  char* modeFlag = nullptr) {
68  if (rc.charge() == 0)
69  return nullptr;
70  const char* mptr = modeList;
71  char c;
72  if (modeFlag == nullptr)
73  modeFlag = &c;
74  char& mode = *modeFlag;
75  const reco::Track* tkp = nullptr;
76  while ((mode = *mptr++)) {
77  switch (mode) {
78  case 'c':
79  if ((tkp = getFromRC(rc)) != nullptr)
80  return tkp;
81  break;
82  case 'f':
83  if ((tkp = getFromPF(rc)) != nullptr)
84  return tkp;
85  break;
86  case 'h':
87  if ((tkp = getFromGP(rc)) != nullptr)
88  return tkp;
89  break;
90  case 'b':
91  if ((tkp = getFromBT(rc)) != nullptr)
92  return tkp;
93  break;
94  case 'p':
95  if ((tkp = getFromPC(rc)) != nullptr)
96  return tkp;
97  break;
98  case 'm':
99  if ((tkp = getMuonPF(rc)) != nullptr)
100  return tkp;
101  break;
102  case 'n':
103  if ((tkp = getMuonBT(rc)) != nullptr)
104  return tkp;
105  break;
106  case 'i':
107  if ((tkp = getMuonIT(rc)) != nullptr)
108  return tkp;
109  break;
110  case 'g':
111  if ((tkp = getMuonGT(rc)) != nullptr)
112  return tkp;
113  break;
114  case 's':
115  if ((tkp = getMuonSA(rc)) != nullptr)
116  return tkp;
117  break;
118  case 'e':
119  if ((tkp = getElecPF(rc)) != nullptr)
120  return tkp;
121  break;
122  }
123  }
124  return nullptr;
125  }
126 
127  static const reco::Track* getFromRC(const reco::Candidate& rc) {
128  // std::cout << "getFromRC" << std::endl;
129  try {
130  const reco::TrackRef& tkr = rc.get<reco::TrackRef>();
131  if (tkr.isNonnull() && tkr.isAvailable())
132  return tkr.get();
133  } catch (edm::Exception const&) {
134  }
135  return nullptr;
136  }
137  static const reco::Track* getFromPF(const reco::Candidate& rc) {
138  // std::cout << "getFromPF" << std::endl;
139  const reco::PFCandidate* pf = dynamic_cast<const reco::PFCandidate*>(&rc);
140  if (pf == nullptr)
141  return nullptr;
142  try {
143  const reco::TrackRef& tkr = pf->trackRef();
144  if (tkr.isNonnull() && tkr.isAvailable())
145  return tkr.get();
146  } catch (edm::Exception const&) {
147  }
148  return nullptr;
149  }
150  static const reco::Track* getFromGP(const reco::Candidate& rc) {
151  // std::cout << "getFromGC" << std::endl;
152  const pat::GenericParticle* gp = dynamic_cast<const pat::GenericParticle*>(&rc);
153  if (gp == nullptr)
154  return nullptr;
155  try {
156  const reco::TrackRef& tkr = gp->track();
157  if (tkr.isNonnull() && tkr.isAvailable())
158  return tkr.get();
159  } catch (edm::Exception const&) {
160  }
161  return nullptr;
162  }
163  static const reco::Track* getFromBT(const reco::Candidate& rc) {
164  // std::cout << "getFromBT" << std::endl;
165  try {
166  const reco::Track* trk = rc.bestTrack();
167  return trk;
168  } catch (edm::Exception const&) {
169  }
170  return nullptr;
171  }
172  static const reco::Track* getFromPC(const reco::Candidate& rc) {
173  // std::cout << "getFromPC" << std::endl;
174  const pat::PackedCandidate* pp = dynamic_cast<const pat::PackedCandidate*>(&rc);
175  if (pp == nullptr)
176  return nullptr;
177  try {
178  const reco::Track* trk = &pp->pseudoTrack();
179  return trk;
180  } catch (edm::Exception const&) {
181  }
182  return nullptr;
183  }
184  static const reco::Track* getMuonPF(const reco::Candidate& rc) {
185  // std::cout << "getMuonPF" << std::endl;
186  const pat::Muon* mu = dynamic_cast<const pat::Muon*>(&rc);
187  if (mu == nullptr)
188  return nullptr;
189  return getMuonPF(mu);
190  }
191  static const reco::Track* getMuonPF(const pat::Muon* mu) {
192  try {
193  const reco::PFCandidateRef& pcr = mu->pfCandidateRef();
194  if (pcr.isNonnull() && pcr.isAvailable()) {
195  const reco::TrackRef& tkr = pcr->trackRef();
196  if (tkr.isNonnull() && tkr.isAvailable())
197  return tkr.get();
198  }
199  } catch (edm::Exception const&) {
200  }
201  return nullptr;
202  }
203  static const reco::Track* getMuonBT(const reco::Candidate& rc) {
204  // std::cout << "getMuonBT" << std::endl;
205  const reco::Muon* mu = dynamic_cast<const reco::Muon*>(&rc);
206  if (mu == nullptr)
207  return nullptr;
208  return getMuonBT(mu);
209  }
210  static const reco::Track* getMuonBT(const reco::Muon* mu) {
211  try {
212  const reco::TrackRef& tkr = mu->muonBestTrack();
213  if (tkr.isNonnull() && tkr.isAvailable())
214  return tkr.get();
215  } catch (edm::Exception const&) {
216  }
217  return nullptr;
218  }
219  static const reco::Track* getMuonIT(const reco::Candidate& rc) {
220  // std::cout << "getMuonIT" << std::endl;
221  const pat::Muon* mu = dynamic_cast<const pat::Muon*>(&rc);
222  if (mu == nullptr)
223  return nullptr;
224  return getMuonIT(mu);
225  }
226  static const reco::Track* getMuonIT(const pat::Muon* mu) {
227  if (!mu->isTrackerMuon())
228  return nullptr;
229  try {
230  const reco::TrackRef& mit = mu->innerTrack();
231  if (mit.isNonnull() && mit.isAvailable())
232  return mit.get();
233  } catch (edm::Exception const&) {
234  }
235  return nullptr;
236  }
237  static const reco::Track* getMuonGT(const reco::Candidate& rc) {
238  // std::cout << "getMuonGT" << std::endl;
239  const pat::Muon* mu = dynamic_cast<const pat::Muon*>(&rc);
240  if (mu == nullptr)
241  return nullptr;
242  return getMuonGT(mu);
243  }
244  static const reco::Track* getMuonGT(const pat::Muon* mu) {
245  if (!mu->isGlobalMuon())
246  return nullptr;
247  try {
248  const reco::TrackRef& mgt = mu->globalTrack();
249  if (mgt.isNonnull() && mgt.isAvailable())
250  return mgt.get();
251  } catch (edm::Exception const&) {
252  }
253  return nullptr;
254  }
255  static const reco::Track* getMuonSA(const reco::Candidate& rc) {
256  // std::cout << "getMuonGT" << std::endl;
257  const pat::Muon* mu = dynamic_cast<const pat::Muon*>(&rc);
258  if (mu == nullptr)
259  return nullptr;
260  return getMuonSA(mu);
261  }
262  static const reco::Track* getMuonSA(const pat::Muon* mu) {
263  if (!mu->isStandAloneMuon())
264  return nullptr;
265  try {
266  const reco::TrackRef& msa = mu->standAloneMuon();
267  if (msa.isNonnull() && msa.isAvailable())
268  return msa.get();
269  } catch (edm::Exception const&) {
270  }
271  return nullptr;
272  }
273  static const reco::Track* getElecPF(const reco::Candidate& rc) {
274  // std::cout << "getElecPF" << std::endl;
275  const pat::Electron* el = dynamic_cast<const pat::Electron*>(&rc);
276  if (el == nullptr)
277  return nullptr;
278  return getElecPF(el);
279  }
280  static const reco::Track* getElecPF(const pat::Electron* el) {
281  try {
282  const reco::PFCandidateRef& pcr = el->pfCandidateRef();
283  if (pcr.isNonnull() && pcr.isAvailable()) {
284  const reco::TrackRef& tkr = pcr->trackRef();
285  if (tkr.isNonnull() && tkr.isAvailable())
286  return tkr.get();
287  }
288  } catch (edm::Exception const&) {
289  }
290  return nullptr;
291  }
292 
293 private:
294  // private copy and assigment constructors
297 };
298 
299 #endif
static const reco::Track * getMuonPF(const reco::Candidate &rc)
static const reco::Track * getFromPF(const reco::Candidate &rc)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
static const reco::Track * getMuonSA(const reco::Candidate &rc)
bool isStandAloneMuon() const override
Definition: Muon.h:300
static const reco::Track * getMuonGT(const pat::Muon *mu)
virtual const Track * bestTrack() const
Definition: Candidate.h:269
static const reco::Track * getMuonIT(const pat::Muon *mu)
bool isAvailable() const
Definition: Ref.h:537
pat::PackedCandidate candidate
bool isTrackerMuon() const override
Definition: Muon.h:299
reco::TrackRef trackRef() const
Definition: PFCandidate.cc:408
static const reco::Track * getFromRC(const reco::Candidate &rc)
Analysis-level Generic Particle class (e.g. for hadron or muon not fully reconstructed) ...
virtual TrackRef muonBestTrack() const
Definition: Muon.h:60
reco::TrackRef innerTrack() const override
reference to Track reconstructed in the tracker only (reimplemented from reco::Muon) ...
Definition: Muon.h:72
static const reco::Track * getMuonPF(const pat::Muon *mu)
reco::PFCandidateRef pfCandidateRef() const
reference to the source PFCandidates; null if this has been built from a standard electron ...
static const reco::Track * getTrack(const reco::Candidate &rc, const char *modeList="cfhbpmnigse", char *modeFlag=0)
static const reco::Track * getMuonIT(const reco::Candidate &rc)
bool isGlobalMuon() const override
Definition: Muon.h:298
static const reco::Track * getMuonGT(const reco::Candidate &rc)
reco::PFCandidateRef pfCandidateRef() const
static const reco::Track * getMuonSA(const pat::Muon *mu)
virtual const reco::Track & pseudoTrack() const
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:232
reco::TrackRef track() const override
reco::TrackRef globalTrack() const override
reference to Track reconstructed in both tracked and muon detector (reimplemented from reco::Muon) ...
Definition: Muon.h:80
reco::TrackRef standAloneMuon() const override
reference to Track reconstructed in the muon detector only (reimplemented from reco::Muon) ...
static const reco::Track * getMuonBT(const reco::Muon *mu)
Analysis-level electron class.
Definition: Electron.h:51
static const reco::Track * getElecPF(const reco::Candidate &rc)
virtual int charge() const =0
electric charge
BPHTrackReference & operator=(const BPHTrackReference &x)
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:40
T get() const
get a component
Definition: Candidate.h:222
static const reco::Track * getFromPC(const reco::Candidate &rc)
static const reco::Track * getElecPF(const pat::Electron *el)
Analysis-level muon class.
Definition: Muon.h:51
static const reco::Track * getFromGP(const reco::Candidate &rc)
static const reco::Track * getMuonBT(const reco::Candidate &rc)
static const reco::Track * getFromBT(const reco::Candidate &rc)