#ifndef ALIMC_H
#define ALIMC_H
#include <TArrayF.h>
#include <TArrayI.h>
#include <TClonesArray.h>
#include <TList.h>
#include <TMCProcess.h>
#include <TVirtualMCApplication.h>
class TParticle;
class TFile;
class TTree;
class AliGenerator;
class AliTrackReference;
class AliTransportMonitor;
class AliMC : public TVirtualMCApplication {
public:
AliMC();
AliMC(const char *name, const char *title);
virtual ~AliMC();
virtual void ConstructGeometry();
virtual Bool_t MisalignGeometry();
virtual void ConstructOpGeometry();
virtual void AddParticles();
virtual void InitGeometry();
virtual void SetAllAlignableVolumes();
virtual void GeneratePrimaries();
virtual void BeginEvent();
virtual void BeginPrimary();
virtual void PreTrack();
virtual void Stepping();
virtual void PostTrack();
virtual void FinishPrimary();
virtual void FinishEvent();
virtual Double_t TrackingZmax() const {return fTrZmax;}
virtual Double_t TrackingRmax() const {return fTrRmax;}
virtual Int_t DetFromMate(Int_t i) const { return (*fImedia)[i];}
virtual AliGenerator* Generator() const {return fGenerator;}
virtual void SetGenerator(AliGenerator *generator);
virtual void ResetGenerator(AliGenerator *generator);
virtual void ReadTransPar();
virtual void MediaTable();
virtual void EnergySummary();
virtual void FinishRun();
void AddEnergyDeposit(Int_t id, Float_t edep)
{fEventEnergy[id]+=edep;}
virtual void ResetHits();
virtual void ResetDigits();
virtual void ResetSDigits();
virtual void TrackingLimits( Float_t rmax=1.e10, Float_t zmax=1.e10)
{fTrRmax=rmax; fTrZmax=zmax;}
virtual void DecayLimits( Float_t rmin = -1., Float_t rmax = -1., Int_t pdg = 0)
{fRDecayMin = rmin; fRDecayMax = rmax; fDecayPdg = pdg;}
virtual void Init();
virtual void SetTransPar(const char *filename="$(ALICE_ROOT)/data/galice.cuts");
virtual void AddHit(Int_t id, Int_t track, Int_t *vol, Float_t *hits) const;
virtual void AddDigit(Int_t id, Int_t *tracks, Int_t *digits) const;
virtual void AddHitList(TCollection *hitList) {if (hitList) fHitLists->Add(hitList);}
Int_t GetCurrentTrackNumber() const;
virtual void DumpPart (Int_t i) const;
virtual void DumpPStack () const;
TList* GetHitLists() const {return fHitLists ;}
Int_t GetNtrack() const;
virtual Int_t GetPrimary(Int_t track) const;
const TObjArray* Particles() const;
TParticle *Particle(Int_t i) const;
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 = 1, Int_t is = 0) const;
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, Float_t weight=1,
Int_t is = 0) const;
virtual void SetHighWaterMark(Int_t nt) const;
virtual void KeepTrack(Int_t itra) const;
virtual void FlagTrack(Int_t track) const;
virtual void SetCurrentTrack(Int_t track) const;
AliTrackReference* AddTrackReference(Int_t label, Int_t id = -999);
virtual void RemapTrackReferencesIDs(const Int_t *map);
virtual void ResetTrackReferences();
virtual void FixParticleDecaytime();
void SetGeometryFromCDB();
Bool_t IsGeometryFromCDB() const;
void SetUseMonitoring(Bool_t flag=kTRUE) { fUseMonitoring = flag; }
AliTransportMonitor *GetTransportMonitor() const { return fMonitor; }
void SetSaveRndmStatus(Bool_t value) { fSaveRndmStatus = value; }
void SetSaveRndmStatusPerEvent(Bool_t value) { fSaveRndmEventStatus = value; }
void SetReadRndmStatus(Bool_t value) { fReadRndmStatus = value; };
void SetRndmFileName(const TString& fileName) { fRndmFileName = fileName; };
private:
AliMC(const AliMC&);
AliMC& operator= (const AliMC&);
void MakeTmpTrackRefsTree();
void ReorderAndExpandTreeTR();
private:
void RemapHits();
AliGenerator *fGenerator;
Bool_t fSaveRndmStatus;
Bool_t fSaveRndmEventStatus;
Bool_t fReadRndmStatus;
Bool_t fUseMonitoring;
TString fRndmFileName;
TArrayF fEventEnergy;
TArrayF fSummEnergy;
TArrayF fSum2Energy;
Float_t fTrRmax;
Float_t fTrZmax;
Float_t fRDecayMax;
Float_t fRDecayMin;
Int_t fDecayPdg;
TArrayI *fImedia;
TString fTransParName;
AliTransportMonitor *fMonitor;
TList *fHitLists;
TTree *fTmpTreeTR;
TFile *fTmpFileTR;
TClonesArray fTrackReferences;
TClonesArray fTmpTrackReferences;
ClassDef(AliMC, 4)
};
#endif