#ifndef ANALYSIS_IPARTICLEDETAILS_HXX #define ANALYSIS_IPARTICLEDETAILS_HXX #include #include #include namespace COMET{ class IParticle; class IParticleDetails; } class COMET::IParticle{ public: IParticle():fIsValid(false){} IParticle( const std::string& name, int pdgCode, const TParticlePDG* rooParticle ); bool IsDynamic()const{return fParticleName=="dynamic";} int GetCharge()const{ if(!fRootParticle) return 0; return fRootParticle->Charge()*3; } const TParticlePDG* GetRootParticle(){return fRootParticle;} const std::string& Name()const{return fParticleName;} int Code()const{return fParticleCode;} int LineColour()const{return fLineColour;} int LineStyle()const{return fLineStyle;} double Mass()const{ if(!fRootParticle) return 0; return fRootParticle->Mass(); } bool operator!()const{return ! IsValid();} bool IsValid()const{return fIsValid;} private: std::string fParticleName; int fParticleCode; int fLineColour; int fLineStyle; const TParticlePDG* fRootParticle; bool fIsValid; friend class COMET::IParticleDetails; }; class COMET::IParticleDetails{ private: IParticleDetails(); virtual ~IParticleDetails(){} static void Initialise(); const COMET::IParticle* GetDetails(int pdgCode, const TParticlePDG* rooParticle); COMET::IParticle* AddParticle( const std::string& name, int pdgCode, const TParticlePDG* rooParticle, int lineColour=-1, int lineStyle=-1 ); enum {kDynamicParticle=1000000000 }; const COMET::IParticle* MakeOrGetDynamicParticle(int pdgCode=kDynamicParticle); const COMET::IParticle* MakeNewParticle( int pdgCode); const COMET::IParticle* MakeNewParticle( const std::string& name); public: static const COMET::IParticle& GetParticle(const std::string& name); static const COMET::IParticle& GetParticle(int pdgCode); private: typedef std::map PdgParticleDetailsMap; PdgParticleDetailsMap fParticleDetailsMap; static IParticleDetails* fThis; static COMET::IParticle fInvalidParticle; }; #endif // ANALYSIS_IPARTICLEDETAILS_HXX