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