+
+//_______________________________________________________________________
+Int_t AliRun::CurrentTrack() const {
+ //
+ // Returns current track
+ //
+ return fStack->CurrentTrack();
+}
+
+//_______________________________________________________________________
+Int_t AliRun::GetNtrack() const {
+ //
+ // Returns number of tracks in stack
+ //
+ return fStack->GetNtrack();
+}
+
+//_______________________________________________________________________
+TObjArray* AliRun::Particles() const {
+ //
+ // Returns pointer to Particles array
+ //
+ return fStack->Particles();
+}
+
+//_______________________________________________________________________
+TTree* AliRun::TreeK() const {
+ //
+ // Returns pointer to the TreeK array
+ //
+ return fStack->TreeK();
+}
+
+
+//_______________________________________________________________________
+void AliRun::SetGenEventHeader(AliGenEventHeader* header)
+{
+ fHeader->SetGenEventHeader(header);
+}
+
+//_______________________________________________________________________
+TFile* AliRun::InitFile(TString fileName)
+{
+//
+// create the file where the whole tree will be saved
+//
+ TDirectory *wd = gDirectory;
+ TFile* file = TFile::Open(fileName,"update");
+ gDirectory = wd;
+ if (!file->IsOpen()) {
+ Error("Cannot open file, %s\n",fileName);
+ return 0;
+ }
+ return file;
+}
+
+//_______________________________________________________________________
+TFile* AliRun::InitTreeFile(Option_t *option, TString fileName)
+{
+ //
+ // create the file where one of the following trees will be saved
+ // trees: S,D,R
+ // WARNING: by default these trees are saved on the file on which
+ // hits are stored. If you divert one of these trees, you cannot restore
+ // it to the original file (usually galice.root) in the same aliroot session
+ Bool_t oS = (strstr(option,"S")!=0);
+ Bool_t oR = (strstr(option,"R")!=0);
+ Bool_t oD = (strstr(option,"D")!=0);
+ Int_t choice[3];
+ for (Int_t i=0; i<3; i++) choice[i] = 0;
+ if(oS)choice[0] = 1;
+ if(oD)choice[1] = 1;
+ if(oR)choice[2] = 1;
+
+ TFile *ptr=0;
+
+ if(!(oS || oR || oD))return ptr;
+
+ Int_t active[3];
+ for (Int_t i=0; i<3; i++) active[i] = 0;
+ if(fTreeSFileName != "") active[0] = 1;
+ if(fTreeDFileName != "") active[1] = 1;
+ if(fTreeDFileName != "") active[2] = 1;
+
+ Bool_t alreadyopen1 = kFALSE;
+ Bool_t alreadyopen2 = kFALSE;
+
+ if(oS){
+ // if already active and same name with non-null ptr
+ if(active[0]==1 && fileName == fTreeSFileName && fTreeSFile){
+ Warning("InitTreeFile","File %s already opened",fTreeSFileName.Data());
+ ptr = fTreeSFile;
+ }
+ else {
+ // if already active with different name with non-null ptr
+ if(active[0]==1 && fileName != fTreeSFileName && fTreeSFile){
+ // close the active files and also the other possible files in option
+ CloseTreeFile(option);
+ }
+ fTreeSFileName = fileName;
+ alreadyopen1 =
+ (active[1] == 1 && fTreeDFileName == fTreeSFileName && fTreeDFile);
+ alreadyopen2 =
+ (active[2] == 1 && fTreeRFileName == fTreeSFileName && fTreeRFile);
+ if(!(alreadyopen1 || alreadyopen2)){
+ ptr = InitFile(fileName);
+ fTreeSFile = ptr;
+ }
+ else {
+ if(alreadyopen1){fTreeSFile = fTreeDFile; ptr = fTreeSFile;}
+ if(alreadyopen2){fTreeSFile = fTreeRFile; ptr = fTreeSFile;}
+ }
+ if(choice[1] == 1) { fTreeDFileName = fileName; fTreeDFile = ptr;}
+ if(choice[2] == 1) { fTreeRFileName = fileName; fTreeRFile = ptr;}
+ }
+ return ptr;
+ }
+
+ if(oD){
+ // if already active and same name with non-null ptr
+ if(active[1]==1 && fileName == fTreeDFileName && fTreeDFile){
+ Warning("InitTreeFile","File %s already opened",fTreeDFileName.Data());
+ ptr = fTreeDFile;
+ }
+ else {
+ // if already active with different name with non-null ptr
+ if(active[1]==1 && fileName != fTreeDFileName && fTreeDFile){
+ // close the active files and also the other possible files in option
+ CloseTreeFile(option);
+ }
+ fTreeDFileName = fileName;
+ alreadyopen1 =
+ (active[0] == 1 && fTreeSFileName == fTreeDFileName && fTreeSFile);
+ alreadyopen2 =
+ (active[2] == 1 && fTreeRFileName == fTreeDFileName && fTreeRFile);
+ if(!(alreadyopen1 || alreadyopen2)){
+ ptr = InitFile(fileName);
+ fTreeDFile = ptr;
+ }
+ else {
+ if(alreadyopen1){fTreeDFile = fTreeSFile; ptr = fTreeDFile;}
+ if(alreadyopen2){fTreeDFile = fTreeRFile; ptr = fTreeDFile;}
+ }
+ if(choice[2] == 1) { fTreeRFileName = fileName; fTreeRFile = ptr;}
+ }
+ return ptr;
+ }
+
+ if(oR){
+ // if already active and same name with non-null ptr
+ if(active[2]==1 && fileName == fTreeRFileName && fTreeRFile){
+ Warning("InitTreeFile","File %s already opened",fTreeRFileName.Data());
+ ptr = fTreeRFile;
+ }
+ else {
+ // if already active with different name with non-null ptr
+ if(active[2]==1 && fileName != fTreeRFileName && fTreeRFile){
+ // close the active files and also the other possible files in option
+ CloseTreeFile(option);
+ }
+ fTreeRFileName = fileName;
+ alreadyopen1 =
+ (active[1] == 1 && fTreeDFileName == fTreeRFileName && fTreeDFile);
+ alreadyopen2 =
+ (active[0]== 1 && fTreeSFileName == fTreeRFileName && fTreeSFile);
+ if(!(alreadyopen1 || alreadyopen2)){
+ ptr = InitFile(fileName);
+ fTreeRFile = ptr;
+ }
+ else {
+ if(alreadyopen1){fTreeRFile = fTreeDFile; ptr = fTreeRFile;}
+ if(alreadyopen2){fTreeRFile = fTreeSFile; ptr = fTreeRFile;}
+ }
+ }
+ return ptr;
+ }
+ return 0;