Fixing Coding violations
[u/mrichter/AliRoot.git] / STEER / AliStream.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 #include <TFile.h>
19 #include <TObjString.h>
20
21 #include "AliLoader.h"
22 #include "AliRun.h"
23 #include "AliStream.h"
24
25 ////////////////////////////////////////////////////////////////////////
26 //
27 // AliStream.cxx
28 //
29 // - store file names associated with a given stream
30 // - open and close files
31 // - return serial event number of the next event in the stream
32 // and the TFile pointer for a proper file
33 //
34 ////////////////////////////////////////////////////////////////////////
35
36 ClassImp(AliStream)
37
38 AliStream::AliStream():
39   fLastEventSerialNr(-1),
40   fLastEventNr(0),
41   fCurrentFileIndex(-1),
42   fEvents(0),
43   fMode(0),
44   fFileNames(0x0),
45   fEventFolderName(0)
46 {
47   // root requires default ctor, where no new objects can be created
48   // do not use this ctor, it is supplied only for root needs
49 }
50 //_______________________________________________________________________
51
52 AliStream::AliStream(const char* foldername,Option_t *option):
53   fLastEventSerialNr(-1),
54   fLastEventNr(0),
55   fCurrentFileIndex(-1),
56   fEvents(0),
57   fMode(option),
58   fFileNames(new TObjArray(1)),
59   fEventFolderName(foldername)
60 {
61 // ctor
62 }
63 //_______________________________________________________________________
64
65 AliStream::AliStream(const AliStream &as):
66   TNamed(as),
67   fLastEventSerialNr(-1),
68   fLastEventNr(0),
69   fCurrentFileIndex(-1),
70   fEvents(0),
71   fMode(0),
72   fFileNames(0x0),
73   fEventFolderName(" ")
74 {
75   //
76   // Copy ctor
77   //
78   as.Copy(*this);
79 }
80 //_______________________________________________________________________
81
82 AliStream::~AliStream()
83 {
84 // default dtor
85   delete AliRunLoader::GetRunLoader(fEventFolderName); //clear the eventuall session
86   if (fFileNames) delete fFileNames;
87 }
88 //_______________________________________________________________________
89
90 void AliStream::Copy(TObject &) const
91 {
92   //
93   // Copy function
94   //
95   Fatal("Copy","Not implemented!");
96 }
97 //_______________________________________________________________________
98
99 void AliStream::AddFile(const char *fileName)
100 {
101 // stores the name of the file
102   TObjString *name = new TObjString(fileName);
103   fFileNames->Add(name);
104 }
105 //_______________________________________________________________________
106
107 Bool_t AliStream::NextEventInStream()
108 {
109 // returns kFALSE if no more events
110 // returns kTRUE and the serial nr of the next event
111 // fCurrentFile points to the file containing offered event
112
113 // no files given:
114   if (fFileNames->GetLast() < 0) return kFALSE;
115   
116   AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
117   if (currentloader == 0x0) 
118    {
119     Info("NextEventInStream",
120          "Can not get RL from folder named %s. Attempting to open next file",
121          fEventFolderName.Data());
122     Int_t res = OpenNextFile();
123     if ( res == 0) return kFALSE;
124     currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
125    }
126   
127   if (fLastEventSerialNr+1 >= fEvents) 
128    {
129     if (!OpenNextFile()) return kFALSE;
130    }
131   Info("NextEventInStream","Trying to get event %d",fLastEventSerialNr+1);
132   currentloader->GetEvent(++fLastEventSerialNr);
133   return kTRUE;
134 }
135 //_______________________________________________________________________
136
137 void AliStream::ChangeMode(Option_t* option)
138 {
139   // set the mode to READ or UPDATE, reopen file with the new mode
140   // only change from UPDATE to READ have sense in the current scheme,
141   // other changes are possible but not usefull
142
143   fMode = option;
144   AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
145   if (currentloader) {
146     delete currentloader;
147     fCurrentFileIndex--;
148     OpenNextFile();
149   }
150 }
151 //_______________________________________________________________________
152
153 Bool_t AliStream::OpenNextFile()
154 {
155   //
156   // Opens next file in the list
157   //
158   if (++fCurrentFileIndex > fFileNames->GetLast()) {
159     Error("OpenNextFile", "No more files in the stream") ;
160     return kFALSE;
161   }
162
163   const char* filename =   static_cast<TObjString*>(fFileNames->At(fCurrentFileIndex))->GetName();
164
165 // check if the file was already opened by some other code
166   TFile *f = (TFile *)(gROOT->GetListOfFiles()->FindObject(filename));
167   if (f) f->Close();
168
169   AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
170   
171   if (currentloader) 
172    {
173      delete currentloader;
174    }
175   
176   currentloader = AliRunLoader::Open(filename,fEventFolderName,fMode);
177   
178
179   if (currentloader == 0x0) 
180    {
181 // cannot open file specified on input. Do not skip it silently.
182     Error("OpenNextFile", "Cannot open session ");
183     return kFALSE;
184    }
185    
186 // find nr of events in the given file  
187   
188   if ( AliLoader::TestFileOption(fMode) )//tests if file is opened in read or update mode
189    {
190     Int_t res = currentloader->LoadHeader();
191     if (res)
192      {
193        Error("OpenNextFile","Problems with loading header");
194        return kFALSE;
195      }
196     fEvents = static_cast<Int_t>(currentloader->TreeE()->GetEntries());
197    }
198   else
199     {
200      //if it is new, create or recreate there is no chance to find header in file
201       fEvents = 0;
202     }
203    
204   fLastEventSerialNr = -1;
205   return kTRUE;
206 }
207 //_______________________________________________________________________
208
209 Bool_t AliStream::ImportgAlice()
210 {
211   //
212   // Imports gAlice object from file
213   //
214   if (fFileNames->GetLast() < 0) return kFALSE;
215   
216   AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
217   if (!currentloader) 
218    {
219     if (!OpenNextFile()) return kFALSE;
220     currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
221    }
222   currentloader->LoadgAlice();
223   gAlice = currentloader->GetAliRun();
224   if (!gAlice)  return kFALSE;
225   return kTRUE;
226 }
227
228 //_______________________________________________________________________
229 TString AliStream::GetFileName(Int_t order) const
230 {
231   // returns name of the order-th file
232   // returns empty string if such file does not exist
233   // first file in the input stream is 0
234   TString fileName("");
235   if (order > fFileNames->GetLast()) return fileName;
236   TObjString *fileNameStored = dynamic_cast<TObjString*>(fFileNames->At(order));
237   if (fileNameStored) fileName = fileNameStored->GetString();
238   return fileName;
239 }
240