00001 #ifndef Candidate_LeafCandidate_h
00002 #define Candidate_LeafCandidate_h
00003
00012 #include "DataFormats/Candidate/interface/Candidate.h"
00013
00014 #include "DataFormats/Candidate/interface/iterator_imp_specific.h"
00015
00016 namespace reco {
00017
00018 class LeafCandidate : public Candidate {
00019 public:
00021 typedef CandidateCollection daughters;
00023 typedef int Charge;
00025 typedef math::XYZTLorentzVector LorentzVector;
00027 typedef math::PtEtaPhiMLorentzVector PolarLorentzVector;
00029 typedef math::XYZPoint Point;
00031 typedef math::XYZVector Vector;
00032
00033 typedef unsigned int index;
00034
00036 LeafCandidate() :
00037 qx3_(0), pt_(0), eta_(0), phi_(0), mass_(0),
00038 vertex_(0, 0, 0), pdgId_(0), status_(0),
00039 cachePolarFixed_( false ), cacheCartesianFixed_( false ) { }
00040
00041 explicit LeafCandidate( const Candidate & c) :
00042 qx3_( c.charge()*3 ), pt_( c.p4().pt() ), eta_( c.p4().eta() ), phi_( c.p4().phi() )\
00043 , mass_( c.p4().mass() ),
00044 vertex_( c.vertex() ), pdgId_( c.pdgId() ), status_( c.status() ),
00045 cachePolarFixed_( false ), cacheCartesianFixed_( false ) {}
00046
00048 LeafCandidate( Charge q, const LorentzVector & p4, const Point & vtx = Point( 0, \
00049 0, 0 ),
00050 int pdgId = 0, int status = 0, bool integerCharge = true ) :
00051 qx3_( q ), pt_( p4.pt() ), eta_( p4.eta() ), phi_( p4.phi() ), mass_( p4.mass() ),
00052 vertex_( vtx ), pdgId_( pdgId ), status_( status ),
00053 cachePolarFixed_( false ), cacheCartesianFixed_( false ) {
00054 if ( integerCharge ) qx3_ *= 3;
00055 }
00057 LeafCandidate( Charge q, const PolarLorentzVector & p4, const Point & vtx = Point\
00058 ( 0, 0, 0 ),
00059 int pdgId = 0, int status = 0, bool integerCharge = true ) :
00060 qx3_( q ), pt_( p4.pt() ), eta_( p4.eta() ), phi_( p4.phi() ), mass_( p4.mass() ),
00061 vertex_( vtx ), pdgId_( pdgId ), status_( status ),
00062 cachePolarFixed_( false ), cacheCartesianFixed_( false ){
00063 if ( integerCharge ) qx3_ *= 3;
00064 }
00065
00067 virtual ~LeafCandidate();
00069 virtual const_iterator begin() const;
00071 virtual const_iterator end() const;
00073 virtual iterator begin();
00075 virtual iterator end();
00077 virtual size_t numberOfDaughters() const;
00079 virtual const Candidate * daughter( size_type ) const;
00081 virtual size_t numberOfMothers() const;
00083 virtual const Candidate * mother( size_type ) const;
00085 virtual Candidate * daughter( size_type );
00087 virtual Candidate * daughter(const std::string& s );
00089 virtual const Candidate * daughter(const std::string& s ) const;
00092 virtual size_t numberOfSourceCandidatePtrs() const { return 0;}
00095 virtual CandidatePtr sourceCandidatePtr( size_type i ) const {
00096 return CandidatePtr();
00097 }
00098
00100 virtual int charge() const { return qx3_ / 3; }
00102 virtual void setCharge( Charge q ) { qx3_ = q * 3; }
00104 virtual int threeCharge() const { return qx3_; }
00106 virtual void setThreeCharge( Charge qx3 ) { qx3_ = qx3; }
00108 virtual const LorentzVector & p4() const { cacheCartesian(); return p4Cartesian_; }
00110 virtual const PolarLorentzVector & polarP4() const { cachePolar(); return p4Polar_; }
00112 virtual Vector momentum() const { cacheCartesian(); return p4Cartesian_.Vect(); }
00115 virtual Vector boostToCM() const { cacheCartesian(); return p4Cartesian_.BoostToCM(); }
00117 virtual double p() const { cacheCartesian(); return p4Cartesian_.P(); }
00119 virtual double energy() const { cacheCartesian(); return p4Cartesian_.E(); }
00121 virtual double et() const { cachePolar(); return p4Polar_.Et(); }
00123 virtual double mass() const { return mass_; }
00125 virtual double massSqr() const { return mass_ * mass_; }
00127 virtual double mt() const { cachePolar(); return p4Polar_.Mt(); }
00129 virtual double mtSqr() const { cachePolar(); return p4Polar_.Mt2(); }
00131 virtual double px() const { cacheCartesian(); return p4Cartesian_.Px(); }
00133 virtual double py() const { cacheCartesian(); return p4Cartesian_.Py(); }
00135 virtual double pz() const { cacheCartesian(); return p4Cartesian_.Pz(); }
00137 virtual double pt() const;
00139 virtual double phi() const { return phi_; }
00141 virtual double theta() const { cacheCartesian(); return p4Cartesian_.Theta(); }
00143 virtual double eta() const { return eta_; }
00145 virtual double rapidity() const { cachePolar(); return p4Polar_.Rapidity(); }
00147 virtual double y() const { return rapidity(); }
00149 virtual void setP4( const LorentzVector & p4 ) {
00150 p4Cartesian_ = p4;
00151 p4Polar_ = p4;
00152 pt_ = p4Polar_.pt();
00153 eta_ = p4Polar_.eta();
00154 phi_ = p4Polar_.phi();
00155 mass_ = p4Polar_.mass();
00156 cachePolarFixed_ = true;
00157 cacheCartesianFixed_ = true;
00158 }
00160 virtual void setP4( const PolarLorentzVector & p4 ) {
00161 p4Polar_ = p4;
00162 pt_ = p4Polar_.pt();
00163 eta_ = p4Polar_.eta();
00164 phi_ = p4Polar_.phi();
00165 mass_ = p4Polar_.mass();
00166 cachePolarFixed_ = true;
00167 cacheCartesianFixed_ = false;
00168 }
00170 virtual void setMass( double m ) {
00171 mass_ = m;
00172 clearCache();
00173 }
00174 virtual void setPz( double pz ) {
00175 cacheCartesian();
00176 p4Cartesian_.SetPz(pz);
00177 p4Polar_ = p4Cartesian_;
00178 pt_ = p4Polar_.pt();
00179 eta_ = p4Polar_.eta();
00180 phi_ = p4Polar_.phi();
00181 mass_ = p4Polar_.mass();
00182 }
00184 virtual const Point & vertex() const { return vertex_; }
00186 virtual double vx() const { return vertex_.X(); }
00188 virtual double vy() const { return vertex_.Y(); }
00190 virtual double vz() const { return vertex_.Z(); }
00192 virtual void setVertex( const Point & vertex ) { vertex_ = vertex; }
00194 virtual int pdgId() const { return pdgId_; }
00195
00196 virtual void setPdgId( int pdgId ) { pdgId_ = pdgId; }
00198 virtual int status() const { return status_; }
00200 virtual void setStatus( int status ) { status_ = status; }
00202 static const unsigned int longLivedTag;
00204 virtual void setLongLived() { status_ |= longLivedTag; }
00206 virtual bool longLived() const { return status_ & longLivedTag; }
00208 static const unsigned int massConstraintTag;
00210 virtual void setMassConstraint() { status_ |= massConstraintTag;}
00212 virtual bool massConstraint() const { return status_ & massConstraintTag; }
00214 virtual LeafCandidate * clone() const {
00215 return new LeafCandidate( *this );
00216 }
00217
00219 virtual double vertexChi2() const;
00226 virtual double vertexNdof() const;
00228 virtual double vertexNormalizedChi2() const;
00230 virtual double vertexCovariance(int i, int j) const;
00232 CovarianceMatrix vertexCovariance() const { CovarianceMatrix m; fillVertexCovariance(m); return m; }
00234 virtual void fillVertexCovariance(CovarianceMatrix & v) const;
00237 virtual bool hasMasterClone() const;
00240 virtual const CandidateBaseRef & masterClone() const;
00243 virtual bool hasMasterClonePtr() const;
00246 virtual const CandidatePtr & masterClonePtr() const;
00247
00249 template<typename Ref>
00250 Ref masterRef() const { return masterClone().template castTo<Ref>(); }
00252
00253 template<typename T> T get() const {
00254 if ( hasMasterClone() ) return masterClone()->get<T>();
00255 else return reco::get<T>( * this );
00256 }
00258 template<typename T, typename Tag> T get() const {
00259 if ( hasMasterClone() ) return masterClone()->get<T, Tag>();
00260 else return reco::get<T, Tag>( * this );
00261 }
00263 template<typename T> T get( size_type i ) const {
00264 if ( hasMasterClone() ) return masterClone()->get<T>( i );
00265 else return reco::get<T>( * this, i );
00266 }
00268 template<typename T, typename Tag> T get( size_type i ) const {
00269 if ( hasMasterClone() ) return masterClone()->get<T, Tag>( i );
00270 else return reco::get<T, Tag>( * this, i );
00271 }
00273 template<typename T> size_type numberOf() const {
00274 if ( hasMasterClone() ) return masterClone()->numberOf<T>();
00275 else return reco::numberOf<T>( * this );
00276 }
00278 template<typename T, typename Tag> size_type numberOf() const {
00279 if ( hasMasterClone() ) return masterClone()->numberOf<T, Tag>();
00280 else return reco::numberOf<T, Tag>( * this );
00281 }
00282
00283 template<typename S>
00284 struct daughter_iterator {
00285 typedef boost::filter_iterator<S, const_iterator> type;
00286 };
00287
00288 template<typename S>
00289 typename daughter_iterator<S>::type beginFilter( const S & s ) const {
00290 return boost::make_filter_iterator(s, begin(), end());
00291 }
00292 template<typename S>
00293 typename daughter_iterator<S>::type endFilter( const S & s ) const {
00294 return boost::make_filter_iterator(s, end(), end());
00295 }
00296
00297
00298 virtual bool isElectron() const;
00299 virtual bool isMuon() const;
00300 virtual bool isStandAloneMuon() const;
00301 virtual bool isGlobalMuon() const;
00302 virtual bool isTrackerMuon() const;
00303 virtual bool isCaloMuon() const;
00304 virtual bool isPhoton() const;
00305 virtual bool isConvertedPhoton() const;
00306 virtual bool isJet() const;
00307
00308 protected:
00310 Charge qx3_;
00312 float pt_, eta_, phi_, mass_;
00314 Point vertex_;
00316 int pdgId_;
00318 int status_;
00320 mutable PolarLorentzVector p4Polar_;
00322 mutable LorentzVector p4Cartesian_;
00324 mutable bool cachePolarFixed_, cacheCartesianFixed_;
00326 inline void cachePolar() const {
00327 if ( cachePolarFixed_ ) return;
00328 p4Polar_ = PolarLorentzVector( pt_, eta_, phi_, mass_ );
00329 cachePolarFixed_ = true;
00330 }
00332 inline void cacheCartesian() const {
00333 if ( cacheCartesianFixed_ ) return;
00334 cachePolar();
00335 p4Cartesian_ = p4Polar_;
00336 cacheCartesianFixed_ = true;
00337 }
00339 inline void clearCache() const {
00340 cachePolarFixed_ = false;
00341 cacheCartesianFixed_ = false;
00342 }
00344 virtual bool overlap( const Candidate & ) const;
00345 template<typename, typename, typename> friend struct component;
00346 friend class ::OverlapChecker;
00347 friend class ShallowCloneCandidate;
00348 friend class ShallowClonePtrCandidate;
00349
00350 private:
00351
00352 typedef candidate::const_iterator_imp_specific<daughters> const_iterator_imp_specific;
00353
00354 typedef candidate::iterator_imp_specific<daughters> iterator_imp_specific;
00355 };
00356
00357 }
00358
00359 #endif