#include "AliLoader.h"
#include <TROOT.h>
#include <TFile.h>
#include <TFolder.h>
#include <TString.h>
#include "AliConfig.h"
#include "AliDetector.h"
#include "AliLog.h"
#include "AliRun.h"
#include "AliRunLoader.h"
const TString AliLoader::fgkDefaultHitsContainerName("TreeH");
const TString AliLoader::fgkDefaultDigitsContainerName = "TreeD";
const TString AliLoader::fgkDefaultSDigitsContainerName = "TreeS";
const TString AliLoader::fgkDefaultRecPointsContainerName = "TreeR";
const TString AliLoader::fgkDefaultTracksContainerName = "TreeT";
const TString AliLoader::fgkDefaultRecParticlesContainerName = "TreeP";
const TString AliLoader::fgkLoaderBaseName("Loader");
ClassImp(AliLoader)
AliLoader::AliLoader():
fDataLoaders(0x0),
fDetectorName(""),
fEventFolder(0x0),
fDataFolder(0x0),
fDetectorDataFolder(0x0),
fModuleFolder(0x0)
{
}
AliLoader::AliLoader(const Char_t* detname,const Char_t* eventfoldername):
fDataLoaders(new TObjArray(kNDataTypes)),
fDetectorName(""),
fEventFolder(0x0),
fDataFolder(0x0),
fDetectorDataFolder(0x0),
fModuleFolder(0x0)
{
AliDebug(1, Form("detname = %s eventfoldername = %s",detname,eventfoldername));
fDetectorName = detname;
fName = fDetectorName+"Loader";
InitDefaults();
TObject* fobj = GetTopFolder()->FindObject(eventfoldername);
fEventFolder = (fobj)?dynamic_cast<TFolder*>(fobj):0x0;
SetEventFolder(fEventFolder);
}
AliLoader::AliLoader(const Char_t * detname,TFolder* eventfolder):
fDataLoaders(new TObjArray(kNDataTypes)),
fDetectorName(detname),
fEventFolder(0x0),
fDataFolder(0x0),
fDetectorDataFolder(0x0),
fModuleFolder(0x0)
{
fDetectorName = detname;
fName = fDetectorName+"Loader";
InitDefaults();
SetEventFolder(eventfolder);
}
AliLoader::~AliLoader()
{
if (fDataLoaders) fDataLoaders->SetOwner();
delete fDataLoaders;
}
void AliLoader::InitDefaults()
{
AliDataLoader* dl;
dl = new AliDataLoader(fDetectorName + ".Hits.root",fgkDefaultHitsContainerName, "Hits" );
fDataLoaders->AddAt(dl,kHits);
dl = new AliDataLoader(fDetectorName + ".SDigits.root",fgkDefaultSDigitsContainerName, "Summable Digits");
fDataLoaders->AddAt(dl,kSDigits);
dl = new AliDataLoader(fDetectorName + ".Digits.root",fgkDefaultDigitsContainerName, "Digits");
fDataLoaders->AddAt(dl,kDigits);
dl = new AliDataLoader(fDetectorName + ".RecPoints.root",fgkDefaultRecPointsContainerName, "Reconstructed Points");
fDataLoaders->AddAt(dl,kRecPoints);
dl = new AliDataLoader(fDetectorName + ".Tracks.root",fgkDefaultTracksContainerName, "Tracks");
fDataLoaders->AddAt(dl,kTracks);
dl = new AliDataLoader(fDetectorName + ".RecParticles.root",fgkDefaultRecParticlesContainerName, "Reconstructed Particles");
fDataLoaders->AddAt(dl,kRecParticles);
}
AliDataLoader* AliLoader::GetDataLoader(const char* name)
{
return dynamic_cast<AliDataLoader*>(fDataLoaders->FindObject(name));
}
void AliLoader::AddDataLoader(AliDataLoader* dl)
{
if (dl == 0x0)
{
AliError("Pointer is NULL");
return;
}
if (fDataLoaders->FindObject(dl->GetName()))
{
AliError("Such a loader exists");
return;
}
fDataLoaders->AddLast(dl);
dl->SetEventFolder(fEventFolder);
dl->SetFolder(GetDetectorDataFolder());
}
Int_t AliLoader::SetEvent()
{
TIter next(fDataLoaders);
AliDataLoader* dl;
while ((dl = (AliDataLoader*)next()))
{
dl->SetEvent();
}
return 0;
}
void AliLoader::UnloadAll()
{
TIter next(fDataLoaders);
AliDataLoader* dl;
while ((dl = (AliDataLoader*)next()))
{
dl->UnloadAll();
}
}
Int_t AliLoader::GetEvent()
{
Int_t retval;
TIter next(fDataLoaders);
AliDataLoader* dl;
while ((dl = (AliDataLoader*)next()))
{
retval = dl->GetEvent();
if (retval)
{
AliError(Form("Error occured while GetEvent for %s",dl->GetName()));
return retval;
}
}
return 0;
}
TFolder* AliLoader::GetTopFolder()
{
return AliConfig::Instance()->GetTopFolder();
}
TFolder* AliLoader::GetEventFolder()
{
return fEventFolder;
}
TFolder* AliLoader::GetDataFolder()
{
if (!fDataFolder)
{
fDataFolder = dynamic_cast<TFolder*>(GetEventFolder()->FindObject(AliConfig::Instance()->GetDataFolderName()));
if (!fDataFolder)
{
AliFatal("Can not find AliRoot data folder. Aborting");
return 0x0;
}
}
return fDataFolder;
}
TFolder* AliLoader::GetModulesFolder()
{
if (!fModuleFolder)
{
fModuleFolder = dynamic_cast<TFolder*>(GetEventFolder()->FindObjectAny(AliConfig::GetModulesFolderName()));
if (!fModuleFolder)
{
AliFatal("Can not find modules folder. Aborting");
return 0x0;
}
}
return fModuleFolder;
}
TDirectory* AliLoader::ChangeDir(TFile* file, Int_t eventno)
{
if (file == 0x0)
{
AliErrorClass("File is null");
return 0x0;
}
if (file->IsOpen() == kFALSE)
{
AliErrorClass("File is not opened");
return 0x0;
}
TString dirname("Event");
dirname+=eventno;
AliDebugClass(1, Form("Changing Dir to %s in file %s.",dirname.Data(),file->GetName()));
Bool_t result;
TDirectory* dir = dynamic_cast<TDirectory*>(file->Get(dirname));
if (dir == 0x0)
{
AliDebugClass(1, Form("Can not find directory %s in file %s, creating...",
dirname.Data(),file->GetName()));
if (file->IsWritable() == kFALSE)
{
AliErrorClass(Form("Can not create directory. File %s in not writable.",
file->GetName()));
return 0x0;
}
TDirectory* newdir = file->mkdir(dirname);
if (newdir == 0x0)
{
AliErrorClass(Form("Failed to create new directory in file %s.",
file->GetName()));
return 0x0;
}
result = file->cd(dirname);
if (result == kFALSE)
{
return 0x0;
}
}
else
{
file->cd();
file->cd(dirname);
}
return gDirectory;
}
TString AliLoader::GetUnixDir() const
{
TString dir;
return dir;
}
void AliLoader::MakeTree(Option_t *option)
{
const char *oH = strstr(option,"H");
const char *oD = strstr(option,"D");
const char *oS = strstr(option,"S");
const char *oR = strstr(option,"R");
const char *oT = strstr(option,"T");
const char *oP = strstr(option,"P");
if (oH) MakeHitsContainer();
if (oD) MakeDigitsContainer();
if (oS) MakeSDigitsContainer();
if (oR) MakeRecPointsContainer();
if (oT) MakeTracksContainer();
if (oP) MakeRecParticlesContainer();
}
Int_t AliLoader::WriteHits(Option_t* opt) const
{
AliDataLoader* dl = GetHitsDataLoader();
Int_t ret = dl->WriteData(opt);
return ret;
}
Int_t AliLoader::WriteSDigits(Option_t* opt) const
{
AliDataLoader* dl = GetSDigitsDataLoader();
Int_t ret = dl->WriteData(opt);
return ret;
}
TObject** AliLoader::GetDetectorDataRef(TObject *obj)
{
if (obj == 0x0)
{
return 0x0;
}
return GetDetectorDataFolder()->GetListOfFolders()->GetObjectRef(obj) ;
}
void AliLoader::CleanFolders()
{
TIter next(fDataLoaders);
AliDataLoader* dl;
while ((dl = (AliDataLoader*)next()))
{
AliDebug(1, Form("name = %s cleaning",dl->GetName()));
dl->Clean();
}
}
Int_t AliLoader::ReloadAll()
{
TIter next(fDataLoaders);
AliDataLoader* dl;
while((dl = (AliDataLoader*)next()))
{
Int_t err = dl->Reload();
if (err)
{
AliError(Form("Reload returned error for %s",dl->GetName()));
return err;
}
}
return 0;
}
void AliLoader::CloseFiles()
{
TIter next(fDataLoaders);
AliDataLoader* dl;
while((dl = (AliDataLoader*)next()))
{
dl->CloseFile();
}
}
Int_t AliLoader::SetEventFolder(TFolder* eventfolder)
{
if (eventfolder == 0x0)
{
AliError("Stupid joke. Argument is NULL");
return 1;
}
fEventFolder = eventfolder;
TIter next(fDataLoaders);
AliDataLoader* dl;
while((dl = (AliDataLoader*)next()))
{
dl->SetEventFolder(fEventFolder);
dl->SetFolder(GetDetectorDataFolder());
}
return 0;
}
Int_t AliLoader::Register(TFolder* eventFolder)
{
AliDebug(1, Form("Name is %s.",GetName()));
if (eventFolder == 0x0)
{
AliError("Event folder is not set.");
return 1;
}
Int_t retval = AliConfig::Instance()->AddDetector(eventFolder,fDetectorName,fDetectorName);
if(retval)
{
AliError(Form("Can not create folders for %s. Event folder name is %s",
fDetectorName.Data(),eventFolder->GetName()));
return retval;
}
SetEventFolder(eventFolder);
return 0;
}
AliRunLoader* AliLoader::GetRunLoader()
{
AliRunLoader* rg = 0x0;
TObject * obj = GetEventFolder()->FindObject(AliRunLoader::GetRunLoaderName());
if (obj) rg = dynamic_cast<AliRunLoader*>(obj);
return rg;
}
Bool_t AliLoader::TestFileOption(Option_t* opt)
{
TString option(opt);
if (option.CompareTo("recreate",TString::kIgnoreCase) == 0) return kFALSE;
if (option.CompareTo("new",TString::kIgnoreCase) == 0) return kFALSE;
if (option.CompareTo("create",TString::kIgnoreCase) == 0) return kFALSE;
return kTRUE;
}
void AliLoader::SetDirName(TString& dirname)
{
TIter next(fDataLoaders);
AliDataLoader* dl;
while((dl = (AliDataLoader*)next()))
{
dl->SetDirName(dirname);
}
}
void AliLoader::SetDigitsFileNameSuffix(const TString& suffix) const
{
GetDigitsDataLoader()->SetFileNameSuffix(suffix);
}
void AliLoader::SetCompressionLevel(Int_t cl)
{
TIter next(fDataLoaders);
AliDataLoader* dl;
while((dl = (AliDataLoader*)next()))
{
dl->SetCompressionLevel(cl);
}
}
void AliLoader::Clean()
{
TIter next(fDataLoaders);
AliDataLoader* dl;
while((dl = (AliDataLoader*)next()))
{
dl->Clean();
}
}
void AliLoader::Clean(const TString& name)
{
TObject* obj = GetDetectorDataFolder()->FindObject(name);
if(obj)
{
AliDebug(1, Form("name=%s, cleaning %s.",GetName(),name.Data()));
GetDetectorDataFolder()->Remove(obj);
delete obj;
}
}
Bool_t AliLoader::IsOptionWritable(const TString& opt)
{
if (opt.CompareTo("recreate",TString::kIgnoreCase)) return kTRUE;
if (opt.CompareTo("new",TString::kIgnoreCase)) return kTRUE;
if (opt.CompareTo("create",TString::kIgnoreCase)) return kTRUE;
if (opt.CompareTo("update",TString::kIgnoreCase)) return kTRUE;
return kFALSE;
}
void AliLoader::SetDebug(Int_t deb)
{
AliLog::SetClassDebugLevel("AliRunLoader", deb);
AliLog::SetClassDebugLevel("AliLoader", deb);
AliLog::SetClassDebugLevel("AliDataLoader", deb);
AliLog::SetClassDebugLevel("AliBaseLoader", deb);
AliLog::SetClassDebugLevel("AliObjectLoader", deb);
AliLog::SetClassDebugLevel("AliTreeLoader", deb);
AliLog::SetClassDebugLevel("AliConfig", deb);
}
void AliLoader::SetTAddrInDet()
{
AliRunLoader* rl = GetRunLoader();
if (rl == 0x0) return;
AliRun* ar = rl->GetAliRun();
if (ar == 0x0) return;
AliDetector* det = ar->GetDetector(fDetectorName);
if (det == 0x0) return;
det->SetTreeAddress();
}
void AliLoader::Synchronize()
{
TIter next(fDataLoaders);
AliDataLoader* dl;
while ((dl = (AliDataLoader*)next()))
{
dl->Synchronize();
}
}