1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 Revision 1.8 2002/10/22 15:02:15 alibrary
19 Introducing Riostream.h
21 Revision 1.7 2002/10/14 14:57:33 hristov
22 Merging the VirtualMC branch to the main development branch (HEAD)
24 Revision 1.4.6.2 2002/07/24 10:08:13 alibrary
27 Revision 1.6 2002/07/16 13:48:39 jchudoba
28 Add methods to get access to names of files used in merging. Correct memory leak in dtor (thanks to Yves Schutz.)
30 Revision 1.5 2002/04/09 13:38:47 jchudoba
31 Add const to the filename argument
33 Revision 1.4 2001/12/03 07:10:13 jchudoba
34 Default ctor cannot create new objects, create dummy default ctor which leaves object in not well defined state - to be used only by root for I/O
36 Revision 1.3 2001/10/15 17:31:56 jchudoba
39 Revision 1.2 2001/10/04 15:58:52 jchudoba
40 Option to open the stream in READ or UPDATE mode
42 Revision 1.1 2001/09/19 06:20:50 jchudoba
43 Class to manage input filenames, used by AliRunDigitizer
47 ////////////////////////////////////////////////////////////////////////
51 // - store file names associated with a given stream
52 // - open and close files
53 // - return serial event number of the next event in the stream
54 // and the TFile pointer for a proper file
56 ////////////////////////////////////////////////////////////////////////
58 #include <Riostream.h>
61 #include "TObjString.h"
66 #include "AliStream.h"
70 //_______________________________________________________________________
71 AliStream::AliStream():
72 fLastEventSerialNr(0),
81 // root requires default ctor, where no new objects can be created
82 // do not use this ctor, it is supplied only for root needs
86 //_______________________________________________________________________
87 AliStream::AliStream(Option_t *option):
88 fLastEventSerialNr(-1),
90 fCurrentFileIndex(-1),
94 fFileNames(new TObjArray(1))
101 //_______________________________________________________________________
102 AliStream::AliStream(const AliStream& str):
104 fLastEventSerialNr(0),
106 fCurrentFileIndex(0),
118 //_______________________________________________________________________
119 void AliStream::Copy(AliStream& ) const
121 Fatal("Copy","Not implemented\n");
124 //_______________________________________________________________________
125 AliStream::~AliStream()
129 fFileNames->Delete();
134 //_______________________________________________________________________
135 void AliStream::AddFile(const char *fileName)
137 // stores the name of the file
138 TObjString *name = new TObjString(fileName);
139 fFileNames->Add(name);
142 //_______________________________________________________________________
143 Bool_t AliStream::NextEventInStream(Int_t &serialNr)
145 // returns kFALSE if no more events
146 // returns kTRUE and the serial nr of the next event
147 // fCurrentFile points to the file containing offered event
150 if (fFileNames->GetLast() < 0) return kFALSE;
153 if (!OpenNextFile()) return kFALSE;
156 if (fLastEventSerialNr+1 >= fEvents) {
157 if (!OpenNextFile()) return kFALSE;
159 serialNr = ++fLastEventSerialNr;
163 //_______________________________________________________________________
164 void AliStream::ChangeMode(Option_t* option)
165 // set the mode to READ or UPDATE, reopen file with the new mode
166 // only change from UPDATE to READ have sense in the current scheme,
167 // other changes are possible but not usefull
171 fCurrentFile->Close();
177 //_______________________________________________________________________
178 Bool_t AliStream::OpenNextFile()
180 if (++fCurrentFileIndex > fFileNames->GetLast()) {
181 cerr<<"No more files in the stream"<<endl;
185 const char * filename =
186 static_cast<TObjString*>(fFileNames->At(fCurrentFileIndex))->GetName();
188 // check if the file was already opened by some other code
189 TFile *f = dynamic_cast<TFile*>(gROOT->GetListOfFiles()->FindObject(filename));
193 if (fCurrentFile->IsOpen()) {
194 fCurrentFile->Close();
198 fCurrentFile = TFile::Open(filename,fMode.Data());
200 // cannot open file specified on input. Do not skip it silently.
201 cerr<<"Cannot open file "<<filename<<endl;
204 // find nr of events in the given file
205 TTree * te = dynamic_cast<TTree *>(fCurrentFile->Get("TE"));
207 Error("OpenNextFile", "input file does not contain TE");
210 fEvents = static_cast<Int_t>(te->GetEntries());
211 fLastEventSerialNr = -1;
215 //_______________________________________________________________________
216 Bool_t AliStream::ImportgAlice()
218 if (fFileNames->GetLast() < 0) return kFALSE;
220 if (!OpenNextFile()) return kFALSE;
222 gAlice = dynamic_cast<AliRun*>(fCurrentFile->Get("gAlice"));
223 if (!gAlice) return kFALSE;
227 //_______________________________________________________________________
228 TString AliStream::GetFileName(const Int_t order) const
229 // returns name of the order-th file
230 // returns empty string if such file does not exist
231 // first file in the input stream is 0
233 TString fileName("");
234 if (order > fFileNames->GetLast()) return fileName;
235 TObjString *fileNameStored = dynamic_cast<TObjString*>(fFileNames->At(order));
236 if (fileNameStored) fileName = fileNameStored->GetString();