// @(#)root/eg:$Name:  $:$Id: TParticlePDG.h,v 1.6 2004/01/23 08:49:40 brun Exp $
// Author: Pasha Murat   12/02/99

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/
#ifndef TParticlePDG_hh
#define TParticlePDG_hh

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif
#ifndef ROOT_TObjArray
#include "TObjArray.h"
#endif

class TDecayChannel;

class TParticlePDG : public TNamed {
public:
//------------------------------------------------------------------------------
//     data members
//------------------------------------------------------------------------------
protected:
  Int_t            fPdgCode;		        // PDG code of the particle
  Double_t         fMass;                       // particle mass in GeV
  Double_t         fCharge;                     // charge in units of |e|/3
  Double_t         fLifetime;                   // proper lifetime in nanoseconds
  Double_t         fWidth;                      // total width in GeV
  Int_t            fParity;
  Double_t         fSpin;
  Double_t         fIsospin;                    // isospin
  Double_t         fI3;                         // i3
  Int_t            fStrangeness;                // flavours are defined if i3 != -1
  Int_t            fCharm;                      // 1 or -1 for C-particles,
                                                // 0 for others
  Int_t            fBeauty;                     //
  Int_t            fTop;                        //
  Int_t            fY;                          // X,Y: quantum numbers for the 4-th generation
  Int_t            fX;                          //
  Int_t            fStable;                     // 1 if stable, 0 otherwise
					
  TObjArray*       fDecayList;                  // array of decay channels
				
  TString          fParticleClass;              // lepton, meson etc

  Int_t            fTrackingCode;		// G3 tracking code of the particle
  TParticlePDG*    fAntiParticle;		// pointer to antiparticle
//------------------------------------------------------------------------------
// functions
//------------------------------------------------------------------------------
public:
					// ****** constructors  and destructor
  TParticlePDG();
  TParticlePDG(int pdg_code);
  TParticlePDG(const char* Name, const char* Title, Double_t Mass,
	       Bool_t Stable, Double_t Width, Double_t Charge,
	       const char* ParticleClass, Int_t PdgCode, Int_t Anti, 
	       Int_t TrackingCode);

  virtual ~TParticlePDG();
				// ****** access methods
  
  Int_t           PdgCode      () const { return fPdgCode; }
  Double_t        Mass         () const { return fMass; }
  Double_t        Charge       () const { return fCharge; } //charge in units of |e|/3
  Double_t        Lifetime     () const { return fLifetime; }
  Double_t        Width        () const { return fWidth; }
  Int_t           Parity       () const { return fParity; }
  Double_t        Spin         () const { return fSpin; }
  Double_t        Isospin      () const { return fIsospin; }
  Double_t        I3           () const { return fI3; }
  Int_t           Strangeness  () const { return fStrangeness; }
  Int_t           Charm        () const { return fCharm; }
  Int_t           Beauty       () const { return fBeauty; }
  Int_t           Top          () const { return fTop; }
  Int_t           X            () const { return fX; }
  Int_t           Y            () const { return fY; }
  Int_t           Stable       () const { return fStable; }
  const char*     ParticleClass() const { return fParticleClass.Data(); }

  TObjArray*      DecayList    () { return fDecayList; }

  Int_t   NDecayChannels () { 
    return (fDecayList) ? fDecayList->GetEntriesFast() : 0;
  }

  Int_t   TrackingCode() { return fTrackingCode; }

  TDecayChannel* DecayChannel(Int_t i);

  TParticlePDG* AntiParticle() { return fAntiParticle; }

				// ****** modifiers

  void   SetAntiParticle(TParticlePDG* ap) { fAntiParticle = ap; }

  Int_t  AddDecayChannel(Int_t        Type, 
			 Double_t     BranchingRatio, 
			 Int_t        NDaughters, 
			 Int_t*       DaughterPdgCode);

  virtual void  PrintDecayChannel(TDecayChannel* dc, Option_t* opt = "") const; 

  virtual void  Print(Option_t* opt = "") const; // *MENU*

  ClassDef(TParticlePDG,2)		// PDG static particle definition
};

#endif
