#include <TROOT.h>
#include <TFile.h>
#include <TObjString.h>
#include <TTree.h>
#include "AliLog.h"
#include "AliLoader.h"
#include "AliRun.h"
#include "AliStream.h"
ClassImp(AliStream)
AliStream::AliStream():
fLastEventSerialNr(-1),
fLastEventNr(0),
fCurrentFileIndex(-1),
fEvents(0),
fMode(0),
fFileNames(0x0),
fEventFolderName(0)
{
}
AliStream::AliStream(const char* foldername,Option_t *option):
fLastEventSerialNr(-1),
fLastEventNr(0),
fCurrentFileIndex(-1),
fEvents(0),
fMode(option),
fFileNames(new TObjArray(1)),
fEventFolderName(foldername)
{
}
AliStream::AliStream(const AliStream &as):
TNamed(as),
fLastEventSerialNr(-1),
fLastEventNr(0),
fCurrentFileIndex(-1),
fEvents(0),
fMode(0),
fFileNames(0x0),
fEventFolderName(" ")
{
as.Copy(*this);
}
AliStream::~AliStream()
{
delete AliRunLoader::GetRunLoader(fEventFolderName);
if (fFileNames) delete fFileNames;
}
void AliStream::Copy(TObject &) const
{
AliFatal("Not implemented!");
}
void AliStream::AddFile(const char *fileName)
{
TObjString *name = new TObjString(fileName);
fFileNames->Add(name);
}
Bool_t AliStream::NextEventInStream()
{
if (fFileNames->GetLast() < 0) return kFALSE;
AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
if (currentloader == 0x0)
{
AliDebug(1, Form(
"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;
}
AliDebug(1, Form("Trying to get event %d",fLastEventSerialNr+1));
currentloader->GetEvent(++fLastEventSerialNr);
return kTRUE;
}
void AliStream::ChangeMode(Option_t* option)
{
fMode = option;
AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
if (currentloader) {
delete currentloader;
fCurrentFileIndex--;
OpenNextFile();
}
}
Bool_t AliStream::OpenNextFile()
{
if (++fCurrentFileIndex > fFileNames->GetLast()) {
AliInfo("No more files in the stream") ;
return kFALSE;
}
const char* filename = static_cast<TObjString*>(fFileNames->At(fCurrentFileIndex))->GetName();
TFile *f = (TFile *)(gROOT->GetListOfFiles()->FindObject(filename));
if (f) f->Close();
AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
if (currentloader)
{
delete currentloader;
}
currentloader = AliRunLoader::Open(filename,fEventFolderName,fMode);
if (currentloader == 0x0)
{
AliError("Cannot open session ");
return kFALSE;
}
if ( AliLoader::TestFileOption(fMode) )
{
Int_t res = currentloader->LoadHeader();
if (res)
{
AliError("Problems with loading header");
return kFALSE;
}
fEvents = static_cast<Int_t>(currentloader->TreeE()->GetEntries());
}
else
{
fEvents = 0;
}
fLastEventSerialNr = -1;
return kTRUE;
}
Bool_t AliStream::ImportgAlice()
{
if (fFileNames->GetLast() < 0) return kFALSE;
AliRunLoader* currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
if (!currentloader)
{
if (!OpenNextFile()) return kFALSE;
currentloader = AliRunLoader::GetRunLoader(fEventFolderName);
}
currentloader->LoadgAlice();
gAlice = currentloader->GetAliRun();
if (!gAlice) return kFALSE;
return kTRUE;
}
TString AliStream::GetFileName(Int_t order) const
{
TString fileName("");
if (order > fFileNames->GetLast()) return fileName;
TObjString *fileNameStored = dynamic_cast<TObjString*>(fFileNames->At(order));
if (fileNameStored) fileName = fileNameStored->GetString();
return fileName;
}