/*
$Log$
-Revision 1.7 2002/10/14 14:57:33 hristov
-Merging the VirtualMC branch to the main development branch (HEAD)
+Revision 1.4.4.4 2002/12/11 10:00:34 hristov
+Merging with v3-09-04 (P.Skowronski)
-Revision 1.4.6.2 2002/07/24 10:08:13 alibrary
-Updating VirtualMC
+Revision 1.4.4.3 2002/11/22 14:19:50 hristov
+Merging NewIO-01 with v3-09-04 (part one) (P.Skowronski)
-Revision 1.6 2002/07/16 13:48:39 jchudoba
-Add methods to get access to names of files used in merging. Correct memory leak in dtor (thanks to Yves Schutz.)
+Revision 1.4.4.2 2002/06/18 10:18:32 hristov
+Important update (P.Skowronski)
+
+Revision 1.4.4.1 2002/05/31 09:37:59 hristov
+First set of changes done by Piotr
Revision 1.5 2002/04/09 13:38:47 jchudoba
Add const to the filename argument
#include "TROOT.h"
#include "AliStream.h"
-
#include "AliRun.h"
+#include "TObjString.h"
+#include "TArrayI.h"
+#include "TClonesArray.h"
+#include "TFile.h"
+#include "AliLoader.h"
+
ClassImp(AliStream)
-AliStream::AliStream()
+AliStream::AliStream():
+ fLastEventSerialNr(-1),
+ fLastEventNr(0),
+ fCurrentFileIndex(-1),
+ fEvents(0),
+ fMode(0),
+ fFileNames(0x0),
+ fEventFolderName(0)
{
// root requires default ctor, where no new objects can be created
// do not use this ctor, it is supplied only for root needs
- fCurrentFile = 0;
- fEvents = 0;
- fFileNames = 0;
}
-
-////////////////////////////////////////////////////////////////////////
-AliStream::AliStream(Option_t *option)
+//_______________________________________________________________________
+
+AliStream::AliStream(const char* foldername,Option_t *option):
+ fLastEventSerialNr(-1),
+ fLastEventNr(0),
+ fCurrentFileIndex(-1),
+ fEvents(0),
+ fMode(option),
+ fFileNames(new TObjArray(1)),
+ fEventFolderName(foldername)
{
// ctor
- fLastEventSerialNr = -1;
- fLastEventNr = 0;
- fCurrentFileIndex = -1;
- fCurrentFile = 0;
- fEvents = 0;
- fFileNames = new TObjArray(1);
- fMode = option;
}
+//_______________________________________________________________________
-////////////////////////////////////////////////////////////////////////
AliStream::~AliStream()
{
// default dtor
- if (fFileNames) {
- fFileNames->Delete();
- delete fFileNames;
- }
+ delete AliRunLoader::GetRunLoader(fEventFolderName); //clear the eventuall session
+ if (fFileNames) delete fFileNames;
}
+//_______________________________________________________________________
-////////////////////////////////////////////////////////////////////////
void AliStream::AddFile(const char *fileName)
{
// stores the name of the file
TObjString *name = new TObjString(fileName);
fFileNames->Add(name);
}
+//_______________________________________________________________________
-////////////////////////////////////////////////////////////////////////
-Bool_t AliStream::NextEventInStream(Int_t &serialNr)
+Bool_t AliStream::NextEventInStream()
{
// returns kFALSE if no more events
// returns kTRUE and the serial nr of the next event
// no files given:
if (fFileNames->GetLast() < 0) return kFALSE;
-
- if (!fCurrentFile) {
- if (!OpenNextFile()) return kFALSE;
- }
- if (fLastEventSerialNr+1 >= fEvents) {
+ AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
+ if (currentloader == 0x0)
+ {
+ Info("NextEventInStream",
+ "Can not get RL from folder named %s. Attempting to open next file",
+ fEventFolderName.Data());
+ Int_t res = OpenNextFile();
+ if ( res == 0) return kFALSE;
+ currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
+ }
+
+ if (fLastEventSerialNr+1 >= fEvents)
+ {
if (!OpenNextFile()) return kFALSE;
- }
- serialNr = ++fLastEventSerialNr;
+ }
+ Info("NextEventInStream","Trying to get event ",fLastEventSerialNr+1);
+ currentloader->GetEvent(++fLastEventSerialNr);
return kTRUE;
}
+//_______________________________________________________________________
-////////////////////////////////////////////////////////////////////////
void AliStream::ChangeMode(Option_t* option)
// set the mode to READ or UPDATE, reopen file with the new mode
// only change from UPDATE to READ have sense in the current scheme,
// other changes are possible but not usefull
{
+
fMode = option;
- if (fCurrentFile) {
- fCurrentFile->Close();
+ AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
+ if (currentloader) {
+ delete currentloader;
fCurrentFileIndex--;
OpenNextFile();
}
}
+//_______________________________________________________________________
-////////////////////////////////////////////////////////////////////////
Bool_t AliStream::OpenNextFile()
{
if (++fCurrentFileIndex > fFileNames->GetLast()) {
return kFALSE;
}
- const char * filename =
- static_cast<TObjString*>(fFileNames->At(fCurrentFileIndex))->GetName();
+ const char* filename = static_cast<TObjString*>(fFileNames->At(fCurrentFileIndex))->GetName();
// check if the file was already opened by some other code
TFile *f = (TFile *)(gROOT->GetListOfFiles()->FindObject(filename));
if (f) f->Close();
- if (fCurrentFile) {
- if (fCurrentFile->IsOpen()) {
- fCurrentFile->Close();
- }
- }
+ AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
+
+ if (currentloader)
+ {
+ delete currentloader;
+ }
+
+ currentloader = AliRunLoader::Open(filename,fEventFolderName,fMode);
+
- fCurrentFile = TFile::Open(filename,fMode.Data());
- if (!fCurrentFile) {
+ if (currentloader == 0x0)
+ {
// cannot open file specified on input. Do not skip it silently.
- cerr<<"Cannot open file "<<filename<<endl;
+ cerr<<"Cannot open session "<<filename<<endl;
return kFALSE;
- }
+ }
+
// find nr of events in the given file
- TTree * te = (TTree *) fCurrentFile->Get("TE") ;
- if (!te) {
- Error("OpenNextFile", "input file does not contain TE");
- return kFALSE;
- }
- fEvents = static_cast<Int_t>(te->GetEntries());
+
+ if ( AliLoader::TestFileOption(fMode) )//tests if file is opened in read or update mode
+ {
+ Int_t res = currentloader->LoadHeader();
+ if (res)
+ {
+ Error("OpenNextFile","Problems with loading header");
+ return kFALSE;
+ }
+ fEvents = static_cast<Int_t>(currentloader->TreeE()->GetEntries());
+ }
+ else
+ {
+ //if it is new, create or recreate there is no chance to find header in file
+ fEvents = 0;
+ }
+
fLastEventSerialNr = -1;
return kTRUE;
}
+//_______________________________________________________________________
-////////////////////////////////////////////////////////////////////////
Bool_t AliStream::ImportgAlice()
{
if (fFileNames->GetLast() < 0) return kFALSE;
- if (!fCurrentFile) {
+
+ AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
+ if (!currentloader)
+ {
if (!OpenNextFile()) return kFALSE;
- }
- gAlice = (AliRun*)fCurrentFile->Get("gAlice");
+ currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
+ }
+ currentloader->LoadgAlice();
+ gAlice = currentloader->GetAliRun();
if (!gAlice) return kFALSE;
return kTRUE;
}
-////////////////////////////////////////////////////////////////////////
+
+//_______________________________________________________________________
TString AliStream::GetFileName(const Int_t order) const
// returns name of the order-th file
// returns empty string if such file does not exist
if (fileNameStored) fileName = fileNameStored->GetString();
return fileName;
}
-////////////////////////////////////////////////////////////////////////
+