#ifndef ALIRUNLoader_H
#define ALIRUNLoader_H
class TFile;
class TString;
class TFolder;
class TObjArray;
class TTree;
class TParticle;
class AliRun;
class AliLoader;
class AliDetector;
class AliHeader;
class AliStack;
class AliCDBEntry;
class AliCentralTrigger;
#include <TNamed.h>
#include "AliConfig.h"
#include "AliDataLoader.h"
class AliRunLoader: public TNamed
{
public:
AliRunLoader();
AliRunLoader(const char* topfoldername);
AliRunLoader(TFolder* topfolder);
virtual ~AliRunLoader();
static AliRunLoader* Open(const char* filename = "galice.root",
const char* eventfoldername = AliConfig::GetDefaultEventFolderName(),
Option_t* option = "READ");
Int_t GetEventNumber() const {return fCurrentEvent;}
Int_t GetEvent(Int_t evno);
Int_t GetNextEvent(){return GetEvent(fCurrentEvent+1);}
Int_t SetEventNumber(Int_t evno);
Int_t SetNextEvent(){return SetEventNumber(fCurrentEvent+1);}
Int_t GetNumberOfEvents();
AliCDBEntry* GetCDBEntry(const char* name) const;
void MakeTree(Option_t *option);
void MakeHeader();
void MakeTrigger();
void MakeStack();
Int_t LoadgAlice();
Int_t LoadHeader();
Int_t LoadKinematics(Option_t* option = "READ");
Int_t LoadTrigger(Option_t* option = "READ");
Int_t LoadTrackRefs(Option_t* option = "READ");
void UnloadHeader();
void UnloadTrigger();
void UnloadKinematics();
void UnloadgAlice();
void UnloadTrackRefs();
void SetKineFileName(const TString& fname){fKineDataLoader->SetFileName(fname);}
void SetTrackRefsFileName(const TString& fname){fTrackRefsDataLoader->SetFileName(fname);}
TTree* TreeE() const;
TTree* TreeCT() const;
AliHeader* GetHeader() const;
AliCentralTrigger* GetTrigger() const;
AliStack* Stack() const {return fStack;}
TTree* TreeK() const;
TTree* TreeTR() const;
AliRun* GetAliRun()const;
Int_t GetRunNumber() const {return fRun;}
void SetRunNumber(Int_t run) {fRun=run;}
Int_t WriteHeader(Option_t* opt="");
Int_t WriteTrigger(Option_t* opt="");
Int_t WriteAliRun(Option_t* opt="");
Int_t WriteKinematics(Option_t* opt="");
Int_t WriteTrackRefs(Option_t* opt="");
Int_t WriteRunLoader(Option_t* opt="");
Int_t WriteHits(Option_t* opt="");
Int_t WriteSDigits(Option_t* opt="");
Int_t WriteDigits(Option_t* opt="");
Int_t WriteRecPoints(Option_t* opt="");
Int_t WriteTracks(Option_t* opt="");
Int_t LoadHits(Option_t* detectors = "all",Option_t* opt = "READ");
Int_t LoadSDigits(Option_t* detectors = "all",Option_t* opt = "READ");
Int_t LoadDigits(Option_t* detectors = "all",Option_t* opt = "READ");
Int_t LoadRecPoints(Option_t* detectors = "all",Option_t* opt = "READ");
Int_t LoadTracks(Option_t* detectors = "all",Option_t* opt = "READ");
Int_t LoadRecParticles(Option_t* detectors = "all",Option_t* opt = "READ");
void UnloadHits(Option_t* detectors = "all");
void UnloadSDigits(Option_t* detectors = "all");
void UnloadDigits(Option_t* detectors = "all");
void UnloadRecPoints(Option_t* detectors = "all");
void UnloadTracks(Option_t* detectors = "all");
void UnloadRecParticles(Option_t* detectors = "all");
void UnloadAll(Option_t* detectors = "all");
void AddLoader(AliLoader* loader);
void AddLoader(AliDetector* det);
AliLoader* GetLoader(const char* detname) const;
AliLoader* GetLoader(AliDetector* det) const;
Int_t SetEventFolderName(const TString& name = AliConfig::GetDefaultEventFolderName());
void CleanFolders();
void CleanDetectors();
void CleanKinematics(){Clean(fgkKineContainerName);}
void CleanTrackRefs(){Clean(fgkTrackRefsContainerName);}
void RemoveEventFolder();
void SetCompressionLevel(Int_t cl);
void SetKineComprLevel(Int_t cl);
void SetTrackRefsComprLevel(Int_t cl);
TFolder* GetEventFolder() const {return fEventFolder;}
void CdGAFile();
void MakeTrackRefsContainer();
void SetDirName(TString& dirname);
Int_t GetFileOffset() const;
void SetNumberOfEventsPerFile(Int_t nevpf){fNEventsPerFile = nevpf;}
void SetNumberOfEventsPerRun(Int_t nevpr) {fNEventsPerRun = nevpr;}
Int_t GetNumberOfEventsPerRun() {return fNEventsPerRun;}
void SetDigitsFileNameSuffix(const TString& suffix);
TString GetFileName() const;
const TObjArray* GetArrayOfLoaders() const {return fLoaders;}
void Cd(){fgRunLoader = this;}
void Synchronize();
AliLoader* GetDetectorLoader(const char* detname);
TTree* GetTreeH(const char* detname, Bool_t maketree);
TTree* GetTreeS(const char* detname, Bool_t maketree);
TTree* GetTreeD(const char* detname, Bool_t maketree);
TTree* GetTreeR(const char* detname, Bool_t maketree);
TTree* GetTreeT(const char* detname, Bool_t maketree);
TTree* GetTreeP(const char* detname, Bool_t maketree);
static AliRunLoader* GetRunLoader(const char* eventfoldername);
static AliRunLoader* Instance(){return fgRunLoader;}
static AliLoader* GetDetectorLoader(const char* detname, const char* eventfoldername);
static TTree* GetTreeH(const char* detname, Bool_t maketree, const char* eventfoldername);
static TTree* GetTreeS(const char* detname, Bool_t maketree, const char* eventfoldername);
static TTree* GetTreeD(const char* detname, Bool_t maketree, const char* eventfoldername);
static TTree* GetTreeR(const char* detname, Bool_t maketree, const char* eventfoldername);
static TTree* GetTreeT(const char* detname, Bool_t maketree, const char* eventfoldername);
static TTree* GetTreeP(const char* detname, Bool_t maketree, const char* eventfoldername);
static TString GetRunLoaderName () {return fgkRunLoaderName;}
static TString GetHeaderContainerName () {return fgkHeaderContainerName;}
static TString GetTriggerContainerName () {return fgkTriggerContainerName;}
static TString GetKineContainerName () {return fgkKineContainerName;}
static TString GetTrackRefsContainerName () {return fgkTrackRefsContainerName;}
static TString GetHeaderBranchName () {return fgkHeaderBranchName;}
static TString GetTriggerBranchName () {return fgkTriggerBranchName;}
static TString GetKineBranchName () {return fgkKineBranchName;}
static TString GetTriggerFileName() { return fgkDefaultTriggerFileName; }
static TString GetGAliceName () {return fgkGAliceName;}
protected:
void SetGAliceFile(TFile* gafile);
Int_t OpenKineFile(Option_t* opt);
Int_t OpenTrackRefsFile(Option_t* opt);
Int_t OpenDataFile(const TString& filename,TFile*& file,TDirectory*& dir,Option_t* opt,Int_t cl);
void SetUnixDir(const TString& udirname);
const TString SetFileOffset(const TString& fname);
void SetDetectorAddresses();
TObjArray *fLoaders;
TFolder *fEventFolder;
Int_t fRun;
Int_t fCurrentEvent;
TFile *fGAFile;
AliHeader *fHeader;
AliStack *fStack;
AliCentralTrigger *fCTrigger;
AliDataLoader *fKineDataLoader;
AliDataLoader *fTrackRefsDataLoader;
Int_t fNEventsPerFile;
Int_t fNEventsPerRun;
TString fUnixDirName;
static const TString fgkDefaultKineFileName;
static const TString fgkDefaultTrackRefsFileName;
static const TString fgkDefaultTriggerFileName;
private:
AliRunLoader(const AliRunLoader &r);
AliRunLoader & operator = (const AliRunLoader &);
void GetListOfDetectors(const char * namelist,TObjArray& pointerarray) const;
void CleanHeader(){Clean(fgkHeaderContainerName);}
void CleanTrigger(){Clean(fgkTriggerContainerName);}
void Clean(const TString& name);
Int_t SetEvent();
static AliRunLoader* fgRunLoader;
static const TString fgkRunLoaderName;
static const TString fgkHeaderContainerName;
static const TString fgkTriggerContainerName;
static const TString fgkKineContainerName;
static const TString fgkTrackRefsContainerName;
static const TString fgkHeaderBranchName;
static const TString fgkTriggerBranchName;
static const TString fgkKineBranchName;
static const TString fgkGAliceName;
ClassDef(AliRunLoader,3)
};
#endif