Go to the documentation of this file.00001 #ifndef Candidate_Candidate_h
00002 #define Candidate_Candidate_h
00003
00011 #include "DataFormats/Candidate/interface/component.h"
00012 #include "DataFormats/Candidate/interface/const_iterator.h"
00013 #include "DataFormats/Candidate/interface/iterator.h"
00014 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00015 #include "DataFormats/Math/interface/Error.h"
00016 #include "boost/iterator/filter_iterator.hpp"
00017
00018 #include "DataFormats/Math/interface/Point3D.h"
00019 #include "DataFormats/Math/interface/Vector3D.h"
00020 #include "DataFormats/Math/interface/LorentzVector.h"
00021 #include "Rtypes.h"
00022
00023 #include "DataFormats/Candidate/interface/Particle.h"
00024
00025 #include "FWCore/Utilities/interface/GCC11Compatibility.h"
00026
00027
00028 class OverlapChecker;
00029
00030 namespace reco {
00031
00032 class Candidate {
00033 public:
00034 typedef size_t size_type;
00035 typedef candidate::const_iterator const_iterator;
00036 typedef candidate::iterator iterator;
00037
00039 typedef int Charge;
00041 typedef math::XYZTLorentzVector LorentzVector;
00043 typedef math::PtEtaPhiMLorentzVector PolarLorentzVector;
00045 typedef math::XYZPoint Point;
00047 typedef math::XYZVector Vector;
00048
00049 enum { dimension = 3 };
00051 typedef math::Error<dimension>::type CovarianceMatrix;
00053 enum { size = dimension * (dimension + 1)/2 };
00055 typedef unsigned int index;
00056
00058 Candidate() {};
00060 virtual ~Candidate();
00062 virtual int charge() const = 0;
00064 virtual void setCharge( Charge q ) = 0;
00066 virtual int threeCharge() const = 0;
00068 virtual void setThreeCharge( Charge qx3 ) = 0;
00070 virtual const LorentzVector & p4() const = 0;
00072 virtual const PolarLorentzVector & polarP4() const = 0;
00074 virtual Vector momentum() const = 0;
00077 virtual Vector boostToCM() const = 0;
00079 virtual double p() const = 0;
00081 virtual double energy() const = 0;
00083 virtual double et() const = 0;
00085 virtual float mass() const = 0;
00087 virtual float massSqr() const = 0;
00089 virtual double mt() const = 0;
00091 virtual double mtSqr() const = 0;
00093 virtual double px() const = 0;
00095 virtual double py() const = 0;
00097 virtual double pz() const = 0;
00099 virtual float pt() const = 0;
00101 virtual float phi() const = 0;
00103 virtual double theta() const = 0;
00105 virtual float eta() const = 0;
00107 virtual double rapidity() const = 0;
00109 virtual double y() const = 0;
00111 virtual void setP4( const LorentzVector & p4 ) = 0;
00113 virtual void setP4( const PolarLorentzVector & p4 ) = 0;
00115 virtual void setMass( double m ) = 0;
00116 virtual void setPz( double pz ) = 0;
00118 virtual const Point & vertex() const = 0;
00120 virtual double vx() const = 0;
00122 virtual double vy() const = 0;
00124 virtual double vz() const = 0;
00126 virtual void setVertex( const Point & vertex ) = 0;
00128 virtual int pdgId() const = 0;
00129
00130 virtual void setPdgId( int pdgId ) = 0;
00132 virtual int status() const = 0;
00134 virtual void setStatus( int status ) = 0;
00136 virtual void setLongLived() = 0;
00138 virtual bool longLived() const = 0;
00140 virtual void setMassConstraint() = 0;
00142 virtual bool massConstraint() const = 0;
00144 virtual Candidate * clone() const = 0;
00146 virtual const_iterator begin() const = 0;
00148 virtual const_iterator end() const = 0;
00150 virtual iterator begin() = 0;
00152 virtual iterator end() = 0;
00154 virtual size_type numberOfDaughters() const = 0;
00156 virtual const Candidate * daughter( size_type i ) const = 0;
00158 virtual Candidate * daughter( size_type i ) = 0;
00160 virtual Candidate * daughter(const std::string& s ) = 0;
00162 virtual const Candidate * daughter(const std::string& s ) const = 0;
00164 virtual size_type numberOfMothers() const = 0;
00166 virtual const Candidate * mother( size_type i = 0 ) const = 0;
00169 virtual size_t numberOfSourceCandidatePtrs() const = 0;
00172 virtual CandidatePtr sourceCandidatePtr( size_type i ) const {
00173 return CandidatePtr();
00174 }
00184 virtual void setSourceCandidatePtr( const CandidatePtr& ptr ) {};
00185
00187 virtual double vertexChi2() const = 0;
00194 virtual double vertexNdof() const = 0;
00196 virtual double vertexNormalizedChi2() const = 0;
00198 virtual double vertexCovariance(int i, int j) const = 0;
00200 virtual CovarianceMatrix vertexCovariance() const { CovarianceMatrix m; fillVertexCovariance(m); return m; }
00201 virtual void fillVertexCovariance(CovarianceMatrix & v) const = 0;
00204 virtual bool hasMasterClone() const = 0;
00207 virtual const CandidateBaseRef & masterClone() const = 0;
00210 virtual bool hasMasterClonePtr() const = 0;
00213 virtual const CandidatePtr & masterClonePtr() const = 0;
00215 template<typename Ref>
00216 Ref masterRef() const { return masterClone().template castTo<Ref>(); }
00218
00219 template<typename T> T get() const {
00220 if ( hasMasterClone() ) return masterClone()->get<T>();
00221 else return reco::get<T>( * this );
00222 }
00224 template<typename T, typename Tag> T get() const {
00225 if ( hasMasterClone() ) return masterClone()->get<T, Tag>();
00226 else return reco::get<T, Tag>( * this );
00227 }
00229 template<typename T> T get( size_type i ) const {
00230 if ( hasMasterClone() ) return masterClone()->get<T>( i );
00231 else return reco::get<T>( * this, i );
00232 }
00234 template<typename T, typename Tag> T get( size_type i ) const {
00235 if ( hasMasterClone() ) return masterClone()->get<T, Tag>( i );
00236 else return reco::get<T, Tag>( * this, i );
00237 }
00239 template<typename T> size_type numberOf() const {
00240 if ( hasMasterClone() ) return masterClone()->numberOf<T>();
00241 else return reco::numberOf<T>( * this );
00242 }
00244 template<typename T, typename Tag> size_type numberOf() const {
00245 if ( hasMasterClone() ) return masterClone()->numberOf<T, Tag>();
00246 else return reco::numberOf<T, Tag>( * this );
00247 }
00248
00249 template<typename S>
00250 struct daughter_iterator {
00251 typedef boost::filter_iterator<S, const_iterator> type;
00252 };
00253
00254 template<typename S>
00255 typename daughter_iterator<S>::type beginFilter( const S & s ) const {
00256 return boost::make_filter_iterator(s, begin(), end());
00257 }
00258 template<typename S>
00259 typename daughter_iterator<S>::type endFilter( const S & s ) const {
00260 return boost::make_filter_iterator(s, end(), end());
00261 }
00262
00263 virtual bool isElectron() const = 0;
00264 virtual bool isMuon() const = 0;
00265 virtual bool isStandAloneMuon() const = 0;
00266 virtual bool isGlobalMuon() const = 0;
00267 virtual bool isTrackerMuon() const = 0;
00268 virtual bool isCaloMuon() const = 0;
00269 virtual bool isPhoton() const = 0;
00270 virtual bool isConvertedPhoton() const = 0;
00271 virtual bool isJet() const = 0;
00272
00273 protected:
00275 virtual bool overlap( const Candidate & ) const = 0;
00276 template<typename, typename, typename> friend struct component;
00277 friend class ::OverlapChecker;
00278 friend class ShallowCloneCandidate;
00279 friend class ShallowClonePtrCandidate;
00280
00281 };
00282
00283 }
00284
00285 #endif