#ifndef UPARTICLE_H
#define UPARTICLE_H
#include "TObject.h"
#include "TLorentzVector.h"
#include "TMath.h"
class TParticle;
class UParticle : public TObject {
 private:
    Int_t      fIndex;        
    Int_t      fPdg;          
    Int_t      fStatus;       
    Int_t      fParent;       
    Int_t      fParentDecay;  
    Int_t      fMate;         
    Int_t      fDecay;        
    Int_t      fChild[2];     
    Double32_t fPx;           
    Double32_t fPy;           
    Double32_t fPz;           
    Double32_t fE;            
    Double32_t fX;            
    Double32_t fY;            
    Double32_t fZ;            
    Double32_t fT;            
    Double32_t fWeight;       
    
 public:
    UParticle();
    UParticle(Int_t index, Int_t pdg, Int_t status,
	      Int_t parent, Int_t parentDecay,
	      Int_t mate, Int_t decay, Int_t child[2],
	      Double_t px, Double_t py, Double_t pz, Double_t e,
	      Double_t x, Double_t y, Double_t z, Double_t t,
	      Double_t weight);
    UParticle(Int_t index, Int_t pdg, Int_t status,
	      Int_t parent, Int_t parentDecay,
	      Int_t mate, Int_t decay, Int_t child[2],
	      TLorentzVector mom, TLorentzVector pos,
	      Double_t weight);
    UParticle(const UParticle &right);
    UParticle(const TParticle &right);
    virtual ~UParticle();
    const UParticle& operator =  (const UParticle& right);
    const UParticle& operator =  (const TParticle& right);
    Bool_t operator == (UParticle& right) const;
    using TObject::Print;
    void Print(Option_t *option = "");
    inline Int_t    GetIndex()       const {return fIndex;}
    inline Int_t    GetPdg()         const {return fPdg;}
    inline Int_t    GetStatus()      const {return fStatus;}
    inline Int_t    GetParent()      const {return fParent;}
    inline Int_t    GetParentDecay() const {return fParentDecay;}
    inline Int_t    GetMate()        const {return fMate;}
    inline Int_t    GetDecay()       const {return fDecay;}
    inline Int_t    GetFirstChild()  const {return fChild[0];}
    inline Int_t    GetLastChild()   const {return fChild[1];}
    inline Double_t Px()             const {return fPx;}
    inline Double_t Py()             const {return fPy;}
    inline Double_t Pz()             const {return fPz;}
    inline Double_t E()              const {return fE;}
    inline TLorentzVector GetMomentum() const {return TLorentzVector(fPx,fPy,fPz,fE);}
    inline void Momentum(TLorentzVector& mom) const {mom.SetPxPyPzE(fPx,fPy,fPz,fE);}
    inline Double_t X()              const {return fX;}
    inline Double_t Y()              const {return fY;}
    inline Double_t Z()              const {return fZ;}
    inline Double_t T()              const {return fT;}
    inline TLorentzVector GetPosition() const {return TLorentzVector(fX,fY,fZ,fT);}
    inline void Position(TLorentzVector& pos) const {pos.SetXYZT(fX,fY,fZ,fT);}
    inline Double_t GetWeight()      const {return fWeight;}
    inline void SetIndex      (Int_t index)       {fIndex = index;}
    inline void SetPdg        (Int_t pdg)         {fPdg = pdg;}
    inline void SetStatus     (Int_t status)      {fStatus = status;}
    inline void SetParent     (Int_t parent)      {fParent = parent;}
    inline void SetParentDecay(Int_t parentDecay) {fParentDecay = parentDecay;}
    inline void SetMate       (Int_t mate)        {fMate = mate;}
    inline void SetDecay      (Int_t decay)       {fDecay = decay;}
    inline void SetChild      (Int_t child[2])    {fChild[0] = child[0]; fChild[1] = child[1];}
    inline void SetFirstChild (Int_t child)       {fChild[0] = child;}
    inline void SetLastChild  (Int_t child)       {fChild[1] = child;}
    inline void SetPx         (Double_t px)       {fPx = px;}
    inline void SetPy         (Double_t py)       {fPy = py;}
    inline void SetPz         (Double_t pz)       {fPz = pz;}
    inline void SetE          (Double_t e)        {fE = e;}
    inline void SetMomentum(Double_t px, Double_t py, Double_t pz, Double_t e)
    {fPx = px; fPy = py; fPz = pz; fE = e;}
    inline void SetMomentum(TLorentzVector mom) {fPx=mom.Px(); fPy=mom.Py(); fPz=mom.Pz(); fE=mom.E();}
    inline void SetX          (Double_t x)        {fX = x;}
    inline void SetY          (Double_t y)        {fY = y;}
    inline void SetZ          (Double_t z)        {fZ = z;}
    inline void SetT          (Double_t t)        {fT = t;}
    inline void SetPosition(Double_t x, Double_t y, Double_t z, Double_t t) {fX = x; fY = y; fZ = z; fT = t;}
    inline void SetPosition(TLorentzVector pos)   {fX=pos.X(); fY=pos.Y(); fZ=pos.Z(); fT=pos.T();}
    inline void SetWeight     (Double_t weight)   {fWeight = weight;}
    
    ClassDef(UParticle, 1);
};
#endif