// @(#)root/eg:$Name:  $:$Id: TParticle.h,v 1.11 2005/03/03 11:37:40 brun Exp $
// Author: Rene Brun , Federico Carminati  26/04/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.             *
 *************************************************************************/
//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TParticle: defines  equivalent of HEPEVT particle                    //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TParticle
#define ROOT_TParticle

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif
#ifndef ROOT_TAttLine
#include "TAttLine.h"
#endif
#ifndef ROOT_TAtt3D
#include "TAtt3D.h"
#endif
#ifndef ROOT_X3DBuffer
#include "X3DBuffer.h"
#endif
#ifndef ROOT_TLorentzVector
#include "TLorentzVector.h"
#endif
#ifndef ROOT_TParticlePDG
#include "TParticlePDG.h"
#endif
#ifndef ROOT_TDatabasePDG
#include "TDatabasePDG.h"
#endif

class TParticle : public TObject, public TAttLine, public TAtt3D {

protected:

  Int_t          fPdgCode;              // PDG code of the particle
  Int_t          fStatusCode;           // generation status code
  Int_t          fMother[2];            // Indices of the mother particles
  Int_t          fDaughter[2];          // Indices of the daughter particles
  Float_t        fWeight;               // particle weight

  Double_t       fCalcMass;             // Calculated mass

  Double_t       fPx;                   // x component of momentum
  Double_t       fPy;                   // y component of momentum
  Double_t       fPz;                   // z component of momentum
  Double_t       fE;                    // Energy

  Double_t       fVx;                   // x of production vertex
  Double_t       fVy;                   // y of production vertex
  Double_t       fVz;                   // z of production vertex
  Double_t       fVt;                   // t of production vertex

  Double_t       fPolarTheta;           // Polar angle of polarisation
  Double_t       fPolarPhi;             // azymutal angle of polarisation

  TParticlePDG*  fParticlePDG;          //! reference to the particle record in PDG database
  //the line above should be changed to the following line when all compilers
  //will be able to digest the mutable keyword (We want to have GetPDG const !!)
  //mutable TParticlePDG*  fParticlePDG;  //! reference to the particle record in PDG database
  //----------------------------------------------------------------------------
  //  functions
  //----------------------------------------------------------------------------
public:
                                // ****** constructors and destructor
  TParticle();

  TParticle(Int_t pdg, Int_t status,
            Int_t mother1, Int_t mother2,
            Int_t daughter1, Int_t daughter2,
            Double_t px, Double_t py, Double_t pz, Double_t etot,
            Double_t vx, Double_t vy, Double_t vz, Double_t time);

  TParticle(Int_t pdg, Int_t status,
            Int_t mother1, Int_t mother2,
            Int_t daughter1, Int_t daughter2,
            const TLorentzVector &p,
            const TLorentzVector &v);

  TParticle(const TParticle &part);

  virtual ~TParticle();


//   virtual TString* Name   () const { return fName.Data(); }
//   virtual char*  GetName()   const { return fName.Data(); }

  Int_t          GetStatusCode   ()            const { return fStatusCode;                                     }
  Int_t          GetPdgCode      ()            const { return fPdgCode;                                        }
  Int_t          GetFirstMother  ()            const { return fMother[0];                                      }
  Int_t          GetMother       (Int_t i)     const { return fMother[i];                                      }
  Int_t          GetSecondMother ()            const { return fMother[1];                                      }
  Bool_t         IsPrimary       ()            const { return fMother[0]>-1 ? kFALSE : kTRUE;                  } //Is this particle primary one?
  Int_t          GetFirstDaughter()            const { return fDaughter[0];                                    }
  Int_t          GetDaughter     (Int_t i)     const { return fDaughter[i];                                    }
  Int_t          GetLastDaughter ()            const { return fDaughter[1];                                    }
  Double_t       GetCalcMass     ()            const { return fCalcMass;                                       }
  Double_t       GetMass         ()                  { return GetPDG()->Mass();                                }
  Int_t          GetNDaughters   ()            const { return fDaughter[1]>0 ? fDaughter[1]-fDaughter[0]+1 : 0;}
  Float_t        GetWeight       ()            const { return fWeight;                                         }
  void           GetPolarisation(TVector3 &v);
  TParticlePDG*  GetPDG          (Int_t mode = 0);
  Int_t          Beauty          ()                  { return GetPDG()->Beauty();                              }
  Int_t          Charm           ()                  { return GetPDG()->Charm();                               }
  Int_t          Strangeness     ()                  { return GetPDG()->Strangeness();                         }
  void           Momentum(TLorentzVector &v)   const { v.SetPxPyPzE(fPx,fPy,fPz,fE);                           }
  void           ProductionVertex(TLorentzVector &v) const { v.SetXYZT(fVx,fVy,fVz,fVt);                       }

// ****** redefine several most oftenly used methods of LORENTZ_VECTOR

  Double_t       Vx              ()            const { return fVx;                                             }
  Double_t       Vy              ()            const { return fVy;                                             }
  Double_t       Vz              ()            const { return fVz;                                             }
  Double_t       T               ()            const { return fVt;                                             }
  Double_t       R               ()            const { return TMath::Sqrt(fVx*fVx+fVy*fVy);                    } //Radius of production vertex in cylindrical system
  Double_t       Rho             ()            const { return TMath::Sqrt(fVx*fVx+fVy*fVy+fVz*fVz);            } //Radius of production vertex in spherical system
  Double_t       Px              ()            const { return fPx;                                             }
  Double_t       Py              ()            const { return fPy;                                             }
  Double_t       Pz              ()            const { return fPz;                                             }
  Double_t       P               ()            const { return TMath::Sqrt(fPx*fPx+fPy*fPy+fPz*fPz);            }
  Double_t       Pt              ()            const { return TMath::Sqrt(fPx*fPx+fPy*fPy);                    }
  Double_t       Energy          ()            const { return fE;                                              }
  Double_t       Eta             ()            const
  { if (TMath::Abs(P() != fPz)) return 0.5*TMath::Log((P()+fPz)/(P()-fPz));
      else                      return 1.e30;
  }

  Double_t         Phi   () const { return TMath::Pi()+TMath::ATan2(-fPy,-fPx); }  // note that Phi() returns an angle between 0 and 2pi
  Double_t         Theta () const { return (fPz==0)?TMath::PiOver2():TMath::ACos(fPz/P()); }

                                // setters

  void           SetFirstMother  (int code)                                               { fMother[0]   = code ; }
  void           SetMother  (int i, int code)                                             { fMother[i]   = code ; }
  void           SetLastMother  (int code)                                                { fMother[1]   = code ; }
  void           SetFirstDaughter(int code)                                               { fDaughter[0] = code ; }
  void           SetDaughter(int i, int code)                                             { fDaughter[i] = code ; }
  void           SetLastDaughter(int code)                                                { fDaughter[1] = code ; }
  void           SetCalcMass(Double_t mass)                                               { fCalcMass=mass;}
  void           SetPolarisation(Double_t polx, Double_t poly, Double_t polz);
  void           SetPolarisation(const TVector3& v)                                       {SetPolarisation(v.X(), v.Y(), v.Z());}
  void           SetStatusCode(int status)                                                {fStatusCode = status;}
  void           SetWeight(Float_t weight = 1)                                            {fWeight = weight; }
  void           SetMomentum(Double_t px, Double_t py, Double_t pz, Double_t e)           {fPx=px; fPy=py; fPz=pz; fE=e;}
  void           SetMomentum(const TLorentzVector& p)                                     {SetMomentum(p.Px(),p.Py(),p.Pz(),p.Energy());}
  void           SetProductionVertex(Double_t vx, Double_t vy, Double_t vz, Double_t t)   {fVx=vx; fVy=vy; fVz=vz; fVt=t;}
  void           SetProductionVertex(const TLorentzVector& v)                             {SetProductionVertex(v.X(),v.Y(),v.Z(),v.T());}

                                // ****** overloaded functions of TObject

  virtual void      Paint(Option_t *option = "");
  virtual void      Print(Option_t *option = "") const;
  virtual void      Sizeof3D() const;
  virtual Int_t     DistancetoPrimitive(Int_t px, Int_t py);
  virtual void      ExecuteEvent(Int_t event, Int_t px, Int_t py);
  virtual const     char *GetName() const;
  virtual const     char *GetTitle() const;


  ClassDef(TParticle,2)  // TParticle vertex particle information
};

#endif


syntax highlighted by Code2HTML, v. 0.9.1