CMS 3D CMS Logo

PATDiObjectProxy.h
Go to the documentation of this file.
1 #ifndef PhysicsTools_PatUtils_interface_PATDiObjectProxy_h
2 #define PhysicsTools_PatUtils_interface_PATDiObjectProxy_h
3 
6 
15 
16 namespace pat {
17 
18  /* Now we implement PATDiObjectProxy with typeid & static_casts on the fly. */
19  class DiObjectProxy {
20  public:
23  : cand1_(nullptr), cand2_(nullptr), type1_(nullptr), type2_(nullptr), totalP4ok_(false), totalP4_() {}
27  : cand1_(&c1), cand2_(&c2), type1_(&typeid(c1)), type2_(&typeid(c2)), totalP4ok_(false), totalP4_() {}
28 
30  const reco::Candidate &cand1() const { return *cand1_; }
32  const reco::Candidate &cand2() const { return *cand2_; }
33 
35  double deltaR() const { return ::deltaR(*cand1_, *cand2_); }
37  double deltaPhi() const { return ::deltaPhi(cand1_->phi(), cand2_->phi()); }
38 
40  // Implementation notice: return by const reference, not by value,
41  // as it's easier for Reflex.
43  if (!totalP4ok_) {
44  totalP4_ = cand1_->p4() + cand2_->p4();
45  totalP4ok_ = true;
46  }
47  return totalP4_;
48  }
49 
51  const Electron &ele() const { return tryGetOne_<Electron>(); }
53  const Muon &mu() const { return tryGetOne_<Muon>(); }
55  const Tau &tau() const { return tryGetOne_<Tau>(); }
57  const Photon &gam() const { return tryGetOne_<Photon>(); }
59  const Jet &jet() const { return tryGetOne_<Jet>(); }
61  const MET &met() const { return tryGetOne_<MET>(); }
63  const GenericParticle &part() const { return tryGetOne_<GenericParticle>(); }
65  const PFParticle &pf() const { return tryGetOne_<PFParticle>(); }
66 
68  const Electron &ele1() const { return tryGet_<Electron>(cand1_, type1_); }
70  const Muon &mu1() const { return tryGet_<Muon>(cand1_, type1_); }
72  const Tau &tau1() const { return tryGet_<Tau>(cand1_, type1_); }
74  const Photon &gam1() const { return tryGet_<Photon>(cand1_, type1_); }
76  const Jet &jet1() const { return tryGet_<Jet>(cand1_, type1_); }
78  const MET &met1() const { return tryGet_<MET>(cand1_, type1_); }
80  const GenericParticle &part1() const { return tryGet_<GenericParticle>(cand1_, type1_); }
82  const PFParticle &pf1() const { return tryGet_<PFParticle>(cand1_, type1_); }
83 
85  const Electron &ele2() const { return tryGet_<Electron>(cand2_, type2_); }
87  const Muon &mu2() const { return tryGet_<Muon>(cand2_, type2_); }
89  const Tau &tau2() const { return tryGet_<Tau>(cand2_, type2_); }
91  const Photon &gam2() const { return tryGet_<Photon>(cand2_, type2_); }
93  const Jet &jet2() const { return tryGet_<Jet>(cand2_, type2_); }
95  const MET &met2() const { return tryGet_<MET>(cand2_, type2_); }
97  const GenericParticle &part2() const { return tryGet_<GenericParticle>(cand2_, type2_); }
99  const PFParticle &pf2() const { return tryGet_<PFParticle>(cand2_, type2_); }
100 
101  private:
102  template <typename T>
103  const T &tryGet_(const reco::Candidate *ptr, const std::type_info *type) const {
104  if (typeid(T) != *type) {
105  throw cms::Exception("Type Error")
106  << "pat::DiObjectProxy: the object of the pair is not of the type you request.\n"
107  << " Item Index in pair: " << (ptr == cand1_ ? "first" : "second") << "\n"
108  << " Requested TypeID : " << ClassName<T>::name() << "\n"
109  << " Found TypeID : " << className(*ptr) << "\n";
110  }
111  return static_cast<const T &>(*ptr);
112  }
113 
114  template <typename T>
115  const T &tryGetOne_() const {
116  if (typeid(T) == *type1_) {
117  if (typeid(T) == *type2_) {
118  throw cms::Exception("Type Error")
119  << "pat::DiObjectProxy: "
120  << "you can't get use methods that get a particle by type if the two are of the same type!\n"
121  << " Requested Type:" << ClassName<T>::name() << "\n";
122  }
123  return static_cast<const T &>(*cand1_);
124  } else {
125  if (typeid(T) != *type2_) {
126  throw cms::Exception("Type Error")
127  << "pat::DiObjectProxy: "
128  << "you can't get use methods that get a particle by type if neither of the two is of that type!\n"
129  << " Requested Type:" << ClassName<T>::name() << "\n"
130  << " Type of first :" << className(*cand1_) << "\n"
131  << " Type of second:" << className(*cand2_) << "\n";
132  }
133  return static_cast<const T &>(*cand2_);
134  }
135  }
136 
138  const std::type_info *type1_, *type2_;
139 
140  mutable bool totalP4ok_;
142  };
143 
144 } // namespace pat
145 #endif
Analysis-level MET class.
Definition: MET.h:40
double deltaPhi() const
Get the phi separation.
Definition: Photon.py:1
const Electron & ele() const
Get the PAT Electron, if the pair contains one and only one PAT Electron (throw exception otherwise) ...
const PFParticle & pf1() const
Get the first item, if it&#39;s a PAT PFParticle (throw exception otherwise)
const MET & met2() const
Get the second item, if it&#39;s a PAT MET (throw exception otherwise)
const Photon & gam1() const
Get the first item, if it&#39;s a PAT Photon (throw exception otherwise)
const reco::Candidate * cand2_
const Muon & mu1() const
Get the first item, if it&#39;s a PAT Muon (throw exception otherwise)
double deltaR() const
Get the angular separation.
const Muon & mu2() const
Get the second item, if it&#39;s a PAT Muon (throw exception otherwise)
const GenericParticle & part() const
Get the PAT GenericParticle, if the pair contains one and only one PAT GenericParticle (throw excepti...
const reco::Candidate * cand1_
const PFParticle & pf2() const
Get the second item, if it&#39;s a PAT PFParticle (throw exception otherwise)
const Muon & mu() const
Get the PAT Muon, if the pair contains one and only one PAT Muon (throw exception otherwise) ...
const Tau & tau() const
Get the PAT Tau, if the pair contains one and only one PAT Tau (throw exception otherwise) ...
const PFParticle & pf() const
Get the PAT PFParticle, if the pair contains one and only one PAT PFParticle (throw exception otherwi...
const MET & met() const
Get the PAT MET, if the pair contains one and only one PAT MET (throw exception otherwise) ...
const reco::Candidate & cand1() const
Gets the first Candidate.
const std::type_info * type1_
const T & tryGet_(const reco::Candidate *ptr, const std::type_info *type) const
Definition: HeavyIon.h:7
Analysis-level Generic Particle class (e.g. for hadron or muon not fully reconstructed) ...
Definition: Muon.py:1
Definition: Jet.py:1
const Photon & gam() const
Get the PAT Photon, if the pair contains one and only one PAT Photon (throw exception otherwise) ...
static const std::string & name()
Definition: ClassName.h:38
DiObjectProxy(const reco::Candidate &c1, const reco::Candidate &c2)
const Electron & ele1() const
Get the first item, if it&#39;s a PAT Electron (throw exception otherwise)
const Photon & gam2() const
Get the second item, if it&#39;s a PAT Photon (throw exception otherwise)
Definition: Tau.py:1
const GenericParticle & part2() const
Get the second item, if it&#39;s a PAT GenericParticle (throw exception otherwise)
const std::type_info * type2_
const Jet & jet() const
Get the PAT Jet, if the pair contains one and only one PAT Jet (throw exception otherwise) ...
const Tau & tau1() const
Get the first item, if it&#39;s a PAT Tau (throw exception otherwise)
const GenericParticle & part1() const
Get the first item, if it&#39;s a PAT GenericParticle (throw exception otherwise)
reco::Candidate::LorentzVector totalP4_
const Electron & ele2() const
Get the second item, if it&#39;s a PAT Electron (throw exception otherwise)
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:36
const Jet & jet1() const
Get the first item, if it&#39;s a PAT Jet (throw exception otherwise)
Analysis-level class for reconstructed particles.
Definition: PFParticle.h:32
const Jet & jet2() const
Get the second item, if it&#39;s a PAT Jet (throw exception otherwise)
const Tau & tau2() const
Get the second item, if it&#39;s a PAT Tau (throw exception otherwise)
const reco::Candidate::LorentzVector & totalP4() const
Get the total four momentum.
const reco::Candidate & cand2() const
Gets the second Candidate.
long double T
const T & tryGetOne_() const
const MET & met1() const
Get the first item, if it&#39;s a PAT MET (throw exception otherwise)
std::string className(const T &t)
Definition: ClassName.h:31
DiObjectProxy()
Default constructor, requested by ROOT. NEVER use a default constructed item!
virtual double phi() const =0
momentum azimuthal angle
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector