#ifndef ALI_STACK_H
#define ALI_STACK_H
class TClonesArray;
class TFile;
class TObjArray;
class TParticle;
class TString;
class TTree;
#include <TClonesArray.h>
#include <TArrayI.h>
#include <TVirtualMCStack.h>
class AliHeader;
enum {kKeepBit=1, kDaughtersBit=2, kDoneBit=4, kTransportBit=BIT(14)};
class AliStack : public TVirtualMCStack
{
public:
AliStack(Int_t size, const char* name = "");
AliStack();
AliStack(const AliStack& st);
virtual ~AliStack();
AliStack& operator=(const AliStack& st)
{st.Copy(*this); return(*this);}
virtual void PushTrack(Int_t done, Int_t parent, Int_t pdg,
const Float_t *pmom, const Float_t *vpos, const Float_t *polar,
Float_t tof, TMCProcess mech, Int_t &ntr,
Float_t weight, Int_t is);
virtual void PushTrack(Int_t done, Int_t parent, Int_t pdg,
Double_t px, Double_t py, Double_t pz, Double_t e,
Double_t vx, Double_t vy, Double_t vz, Double_t tof,
Double_t polx, Double_t poly, Double_t polz,
TMCProcess mech, Int_t &ntr, Double_t weight,
Int_t is);
virtual TParticle* PopNextTrack(Int_t& track);
virtual TParticle* GetCurrentTrack() const {return fCurrentTrack;}
virtual TParticle* PopPrimaryForTracking(Int_t i);
void ConnectTree(TTree* tree);
Bool_t GetEvent();
Bool_t PurifyKine();
Bool_t ReorderKine();
void FinishEvent();
void FlagTrack(Int_t track);
void KeepTrack(Int_t itrack);
void Clean(Int_t size = 0);
void Reset(Int_t size = 0);
void DumpPart(Int_t i) const;
void DumpPStack ();
void DumpLoadedStack () const;
void SetNtrack(Int_t ntrack);
virtual void SetCurrentTrack(Int_t track);
void SetHighWaterMark(Int_t hgwmk);
virtual Int_t GetNtrack() const;
Int_t GetNprimary() const;
virtual Int_t GetCurrentTrackNumber() const;
virtual Int_t GetCurrentParentTrackNumber() const;
TParticle* Particle(Int_t id);
Int_t GetPrimary(Int_t id);
TTree* TreeK() const {return fTreeK;}
TParticle* ParticleFromTreeK(Int_t id) const;
Int_t TreeKEntry(Int_t id) const;
Bool_t IsPhysicalPrimary(Int_t i);
Bool_t IsSecondaryFromWeakDecay(Int_t index);
Bool_t IsSecondaryFromMaterial (Int_t index);
Int_t TrackLabel(Int_t label) const {return fTrackLabelMap[label];}
Int_t* TrackLabelMap() {return fTrackLabelMap.GetArray();}
const TObjArray* Particles() const;
protected:
void CleanParents();
void ResetArrays(Int_t size);
TParticle* GetParticleMapEntry(Int_t id) const;
TParticle* GetNextParticle();
Bool_t KeepPhysics(const TParticle* part);
Bool_t IsStable(Int_t pdg) const;
private:
void Copy(TObject &st) const;
TClonesArray fParticles;
TObjArray fParticleMap;
TArrayI fParticleFileMap;
TParticle *fParticleBuffer;
TParticle *fCurrentTrack;
TTree *fTreeK;
Int_t fNtrack;
Int_t fNprimary;
Int_t fCurrent;
Int_t fCurrentPrimary;
Int_t fHgwmk;
Int_t fLoadPoint;
TArrayI fTrackLabelMap;
ClassDef(AliStack,5)
};
inline void AliStack::SetNtrack(Int_t ntrack)
{ fNtrack = ntrack; }
inline Int_t AliStack::GetNtrack() const
{ return fNtrack; }
inline Int_t AliStack::GetNprimary() const
{ return fNprimary; }
inline Int_t AliStack::GetCurrentTrackNumber() const
{ return fCurrent; }
inline const TObjArray* AliStack::Particles() const
{ return &fParticleMap; }
inline TParticle* AliStack::GetParticleMapEntry(Int_t id) const
{ return (TParticle*) fParticleMap.At(id); }
#endif //ALI_STACK_H