ROOT logo
#ifndef ALIMCPARTICLE_H
#define ALIMCPARTICLE_H
/* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

//-------------------------------------------------------------------------
//     AliVParticle realisation for MC Particles
//     Author: Andreas Morsch, CERN
//-------------------------------------------------------------------------

#include <Rtypes.h>
#include <TParticle.h>
#include <TParticlePDG.h>
#include <TObjArray.h>

#include "AliTrackReference.h"
#include "AliVParticle.h"

class AliMCParticle: public AliVParticle {
public:
    AliMCParticle();
    AliMCParticle(TParticle* part, TObjArray* rarray = 0, Int_t label=-1);
    virtual ~AliMCParticle();
    AliMCParticle(const AliMCParticle& mcPart); 
    AliMCParticle& operator=(const AliMCParticle& mcPart);
    
    // Kinematics
    virtual Double_t Px()        const;
    virtual Double_t Py()        const;
    virtual Double_t Pz()        const;
    virtual Double_t Pt()        const;
    virtual Double_t P()         const;
    virtual Bool_t   PxPyPz(Double_t p[3]) const;
   
    virtual Double_t OneOverPt() const;
    virtual Double_t Phi()       const;
    virtual Double_t Theta()     const;
    
    virtual Double_t Xv()        const;
    virtual Double_t Yv()        const;
    virtual Double_t Zv()        const;
    virtual Bool_t   XvYvZv(Double_t x[3]) const;  
    virtual Double_t T()         const;

    virtual Double_t E()          const;
    virtual Double_t M()          const;
    
    virtual Double_t Eta()        const;
    virtual Double_t Y()          const;
    
    virtual Short_t Charge()      const;

    virtual Int_t    Label()         const;
    virtual Int_t    GetLabel()      const {return Label();}
    virtual Int_t    PdgCode()       const {return fParticle->GetPdgCode();}
    virtual TParticle* Particle() const {return fParticle;}
    
    // PID
    virtual const Double_t *PID() const {return 0;} // return PID object (to be defined, still)

    // Track References
    Int_t              GetNumberOfTrackReferences() const {return fNTrackRef;}
    AliTrackReference* GetTrackReference(Int_t i)
      {return dynamic_cast<AliTrackReference*>((*fTrackReferences)[i]);}

    // "Trackable" criteria
    Float_t  GetTPCTrackLength(Float_t bz, Float_t ptmin, Int_t &counter, Float_t deadWidth, Float_t zMax=230. );
    // Navigation
    virtual Int_t GetMother()        const {return fMother;}
    Int_t GetFirstDaughter() const {return fFirstDaughter;}
    Int_t GetLastDaughter()  const {return fLastDaughter;}
    void  SetMother(Int_t idx)        {fMother        = idx;}
    void  SetFirstDaughter(Int_t idx) {fFirstDaughter = idx;}
    void  SetLastDaughter(Int_t idx)  {fLastDaughter  = idx;}
    void  SetLabel(Int_t label)       {fLabel         = label;}
    virtual void    SetGeneratorIndex(Short_t i) {fGeneratorIndex = i;}
    virtual Short_t GetGeneratorIndex() const {return fGeneratorIndex;}
    
 private:
    TParticle *fParticle;             // The wrapped TParticle
    TObjArray *fTrackReferences;      // Array to track references
    Int_t      fNTrackRef;            // Number of track references
    Int_t      fLabel;                // fParticle Label in the Stack
    Int_t      fMother;               // Mother particles
    Int_t      fFirstDaughter;        // First daughter
    Int_t      fLastDaughter;         // LastDaughter
    Short_t    fGeneratorIndex;       // !Generator index in cocktail  
  ClassDef(AliMCParticle,0)  // AliVParticle realisation for MCParticles
};

inline Double_t AliMCParticle::Px()        const {return fParticle->Px();}
inline Double_t AliMCParticle::Py()        const {return fParticle->Py();}
inline Double_t AliMCParticle::Pz()        const {return fParticle->Pz();}
inline Double_t AliMCParticle::Pt()        const {return fParticle->Pt();}
inline Double_t AliMCParticle::P()         const {return fParticle->P(); }
inline Double_t AliMCParticle::OneOverPt() const {return 1. / fParticle->Pt();}
inline Bool_t   AliMCParticle::PxPyPz(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
inline Double_t AliMCParticle::Phi()       const {return fParticle->Phi();}
inline Double_t AliMCParticle::Theta()     const {return fParticle->Theta();}
inline Double_t AliMCParticle::Xv()        const {return fParticle->Vx();}
inline Double_t AliMCParticle::Yv()        const {return fParticle->Vy();}
inline Double_t AliMCParticle::Zv()        const {return fParticle->Vz();}
inline Bool_t   AliMCParticle::XvYvZv(Double_t x[3]) const { x[0] = Xv(); x[1] = Yv(); x[2] = Zv(); return kTRUE; }
inline Double_t AliMCParticle::T()        const {return fParticle->T();}
inline Double_t AliMCParticle::E()         const {return fParticle->Energy();}
inline Double_t AliMCParticle::Eta()       const {return fParticle->Eta();}


inline Double_t AliMCParticle::M()         const
{
    TParticlePDG* pdg = fParticle->GetPDG();
    if (pdg) {
	return (pdg->Mass());
    } else {
	return (fParticle->GetCalcMass());
    }
}


inline Double_t AliMCParticle::Y()         const 
{
    Double_t e  = E();
    Double_t pz = Pz();
    
    if ( TMath::Abs(e - TMath::Abs(pz)) > FLT_EPSILON ) {
	return 0.5*TMath::Log((e+pz)/(e-pz));
    } else { 
	return -999.;
    }
}

inline Short_t AliMCParticle::Charge()     const
{
    TParticlePDG* pdg = fParticle->GetPDG();
    if (pdg) {
	return (Short_t (pdg->Charge()));
    } else {
	return -99;
    }
}

inline Int_t AliMCParticle::Label()       const {return fLabel;}

#endif
 AliMCParticle.h:1
 AliMCParticle.h:2
 AliMCParticle.h:3
 AliMCParticle.h:4
 AliMCParticle.h:5
 AliMCParticle.h:6
 AliMCParticle.h:7
 AliMCParticle.h:8
 AliMCParticle.h:9
 AliMCParticle.h:10
 AliMCParticle.h:11
 AliMCParticle.h:12
 AliMCParticle.h:13
 AliMCParticle.h:14
 AliMCParticle.h:15
 AliMCParticle.h:16
 AliMCParticle.h:17
 AliMCParticle.h:18
 AliMCParticle.h:19
 AliMCParticle.h:20
 AliMCParticle.h:21
 AliMCParticle.h:22
 AliMCParticle.h:23
 AliMCParticle.h:24
 AliMCParticle.h:25
 AliMCParticle.h:26
 AliMCParticle.h:27
 AliMCParticle.h:28
 AliMCParticle.h:29
 AliMCParticle.h:30
 AliMCParticle.h:31
 AliMCParticle.h:32
 AliMCParticle.h:33
 AliMCParticle.h:34
 AliMCParticle.h:35
 AliMCParticle.h:36
 AliMCParticle.h:37
 AliMCParticle.h:38
 AliMCParticle.h:39
 AliMCParticle.h:40
 AliMCParticle.h:41
 AliMCParticle.h:42
 AliMCParticle.h:43
 AliMCParticle.h:44
 AliMCParticle.h:45
 AliMCParticle.h:46
 AliMCParticle.h:47
 AliMCParticle.h:48
 AliMCParticle.h:49
 AliMCParticle.h:50
 AliMCParticle.h:51
 AliMCParticle.h:52
 AliMCParticle.h:53
 AliMCParticle.h:54
 AliMCParticle.h:55
 AliMCParticle.h:56
 AliMCParticle.h:57
 AliMCParticle.h:58
 AliMCParticle.h:59
 AliMCParticle.h:60
 AliMCParticle.h:61
 AliMCParticle.h:62
 AliMCParticle.h:63
 AliMCParticle.h:64
 AliMCParticle.h:65
 AliMCParticle.h:66
 AliMCParticle.h:67
 AliMCParticle.h:68
 AliMCParticle.h:69
 AliMCParticle.h:70
 AliMCParticle.h:71
 AliMCParticle.h:72
 AliMCParticle.h:73
 AliMCParticle.h:74
 AliMCParticle.h:75
 AliMCParticle.h:76
 AliMCParticle.h:77
 AliMCParticle.h:78
 AliMCParticle.h:79
 AliMCParticle.h:80
 AliMCParticle.h:81
 AliMCParticle.h:82
 AliMCParticle.h:83
 AliMCParticle.h:84
 AliMCParticle.h:85
 AliMCParticle.h:86
 AliMCParticle.h:87
 AliMCParticle.h:88
 AliMCParticle.h:89
 AliMCParticle.h:90
 AliMCParticle.h:91
 AliMCParticle.h:92
 AliMCParticle.h:93
 AliMCParticle.h:94
 AliMCParticle.h:95
 AliMCParticle.h:96
 AliMCParticle.h:97
 AliMCParticle.h:98
 AliMCParticle.h:99
 AliMCParticle.h:100
 AliMCParticle.h:101
 AliMCParticle.h:102
 AliMCParticle.h:103
 AliMCParticle.h:104
 AliMCParticle.h:105
 AliMCParticle.h:106
 AliMCParticle.h:107
 AliMCParticle.h:108
 AliMCParticle.h:109
 AliMCParticle.h:110
 AliMCParticle.h:111
 AliMCParticle.h:112
 AliMCParticle.h:113
 AliMCParticle.h:114
 AliMCParticle.h:115
 AliMCParticle.h:116
 AliMCParticle.h:117
 AliMCParticle.h:118
 AliMCParticle.h:119
 AliMCParticle.h:120
 AliMCParticle.h:121
 AliMCParticle.h:122
 AliMCParticle.h:123
 AliMCParticle.h:124
 AliMCParticle.h:125
 AliMCParticle.h:126
 AliMCParticle.h:127
 AliMCParticle.h:128
 AliMCParticle.h:129
 AliMCParticle.h:130
 AliMCParticle.h:131
 AliMCParticle.h:132
 AliMCParticle.h:133
 AliMCParticle.h:134
 AliMCParticle.h:135
 AliMCParticle.h:136
 AliMCParticle.h:137
 AliMCParticle.h:138
 AliMCParticle.h:139
 AliMCParticle.h:140
 AliMCParticle.h:141
 AliMCParticle.h:142
 AliMCParticle.h:143
 AliMCParticle.h:144
 AliMCParticle.h:145
 AliMCParticle.h:146