X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliRunLoader.cxx;h=b1e03afabd083973040fd01200d0cc9e904a01a0;hb=adc4b00f8371e211833fc95e865351945663e92e;hp=8c5b82311d0e320bca10d1f0d1f366580ef60fd9;hpb=2c8628ddce01f1800421ff7bbf285f49cecd549a;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliRunLoader.cxx b/STEER/AliRunLoader.cxx index 8c5b82311d0..b1e03afabd0 100644 --- a/STEER/AliRunLoader.cxx +++ b/STEER/AliRunLoader.cxx @@ -49,7 +49,6 @@ #include #include #include -#include #include #include class TTask; @@ -62,36 +61,41 @@ class TTask; #include "AliHeader.h" #include "AliStack.h" #include "AliDetector.h" -#include "AliRunDataStorage.h" -#include "AliRunDataFile.h" -#include "AliRunLoader.h" +#include "AliCDBManager.h" +#include "AliCDBLocal.h" +#include "AliCentralTrigger.h" ClassImp(AliRunLoader) AliRunLoader* AliRunLoader::fgRunLoader = 0x0; const TString AliRunLoader::fgkRunLoaderName("RunLoader"); - const TString AliRunLoader::fgkHeaderBranchName("Header"); +const TString AliRunLoader::fgkTriggerBranchName("ClassMask"); const TString AliRunLoader::fgkHeaderContainerName("TE"); +const TString AliRunLoader::fgkTriggerContainerName("TreeCT"); const TString AliRunLoader::fgkKineContainerName("TreeK"); const TString AliRunLoader::fgkTrackRefsContainerName("TreeTR"); const TString AliRunLoader::fgkKineBranchName("Particles"); const TString AliRunLoader::fgkDefaultKineFileName("Kinematics.root"); const TString AliRunLoader::fgkDefaultTrackRefsFileName("TrackRefs.root"); const TString AliRunLoader::fgkGAliceName("gAlice"); +const TString AliRunLoader::fgkDefaultTriggerFileName("Trigger.root"); /**************************************************************************/ AliRunLoader::AliRunLoader(): fLoaders(0x0), fEventFolder(0x0), + fRun(-1), fCurrentEvent(0), fGAFile(0x0), fHeader(0x0), fStack(0x0), + fCTrigger(0x0), fKineDataLoader(0x0), fTrackRefsDataLoader(0x0), fNEventsPerFile(1), + fNEventsPerRun(0), fUnixDirName(".") { AliConfig::Instance();//force to build the folder structure @@ -103,13 +107,16 @@ AliRunLoader::AliRunLoader(const char* eventfoldername): TNamed(fgkRunLoaderName,fgkRunLoaderName), fLoaders(new TObjArray()), fEventFolder(0x0), + fRun(-1), fCurrentEvent(0), fGAFile(0x0), fHeader(0x0), fStack(0x0), + fCTrigger(0x0), fKineDataLoader(new AliDataLoader(fgkDefaultKineFileName,fgkKineContainerName,"Kinematics")), fTrackRefsDataLoader(new AliDataLoader(fgkDefaultTrackRefsFileName,fgkTrackRefsContainerName,"Track References")), fNEventsPerFile(1), + fNEventsPerRun(0), fUnixDirName(".") { //ctor @@ -118,26 +125,6 @@ AliRunLoader::AliRunLoader(const char* eventfoldername): } /**************************************************************************/ -AliRunLoader::AliRunLoader(const AliRunLoader &rl): - TNamed(rl), - fLoaders(0x0), - fEventFolder(0x0), - fCurrentEvent(0), - fGAFile(0x0), - fHeader(0x0), - fStack(0x0), - fKineDataLoader(0x0), - fTrackRefsDataLoader(0x0), - fNEventsPerFile(0), - fUnixDirName(".") -{ - // - // Copy ctor - // - rl.Copy(*this); -} -/**************************************************************************/ - AliRunLoader::~AliRunLoader() { //dtor @@ -158,6 +145,7 @@ AliRunLoader::~AliRunLoader() RemoveEventFolder(); //fEventFolder is deleted by the way of removing - TopAliceFolder owns it + if( fCTrigger ) delete fCTrigger; delete fHeader; delete fStack; delete fGAFile; @@ -168,13 +156,16 @@ AliRunLoader::AliRunLoader(TFolder* topfolder): TNamed(fgkRunLoaderName,fgkRunLoaderName), fLoaders(new TObjArray()), fEventFolder(topfolder), + fRun(-1), fCurrentEvent(0), fGAFile(0x0), fHeader(0x0), fStack(0x0), + fCTrigger(0x0), fKineDataLoader(new AliDataLoader(fgkDefaultKineFileName,fgkKineContainerName,"Kinematics")), fTrackRefsDataLoader(new AliDataLoader(fgkDefaultTrackRefsFileName,fgkTrackRefsContainerName,"Track References")), fNEventsPerFile(1), + fNEventsPerRun(0), fUnixDirName(".") { //ctor @@ -203,19 +194,14 @@ AliRunLoader::AliRunLoader(TFolder* topfolder): fEventFolder->Add(this);//put myself to the folder to accessible for all } -/**************************************************************************/ -void AliRunLoader::Copy(TObject &) const -{ - AliFatal("Not implemented"); -} /**************************************************************************/ Int_t AliRunLoader::GetEvent(Int_t evno) { //Gets event number evno //Reloads all data properly - if (fCurrentEvent == evno) return 0; +//PH if (fCurrentEvent == evno) return 0; if (evno < 0) { @@ -254,13 +240,12 @@ Int_t AliRunLoader::GetEvent(Int_t evno) //Reload stack (If header was loaded) if (TreeE()) fStack = GetHeader()->Stack(); //Set event folder in stack (it does not mean that we read kinematics from file) - if (fStack) - { - fStack->SetEventFolderName(fEventFolder->GetName()); - } - else - { - AliWarning("Stack not found in header"); + if( GetTrigger() && TreeCT() ) { + retval = TreeCT()->GetEvent(fCurrentEvent); + if ( retval < 0 ) { + AliError(Form("Error occured while GetEvent for Trigger. Event %d",evno)); + return 2; + } } retval = SetEvent(); @@ -279,15 +264,24 @@ Int_t AliRunLoader::GetEvent(Int_t evno) } //Read Kinematics if loaded - fKineDataLoader->GetEvent(); + retval = fKineDataLoader->GetEvent(); if (retval) { AliError(Form("Error occured while GetEvent for Kinematics. Event %d",evno)); return 2; } - if (fStack && fKineDataLoader->GetBaseLoader(0)->IsLoaded()) fStack->GetEvent(); - + if (fStack && fKineDataLoader->GetBaseLoader(0)->IsLoaded()) + { + fStack->ConnectTree(TreeK()); + + if (fStack->GetEvent() == kFALSE) + { + AliError(Form("Error occured while GetEvent for Stack. Event %d",evno)); + return 2; + } + } + //Trigger data reloading in all loaders TIter next(fLoaders); AliLoader *loader; @@ -351,15 +345,16 @@ Int_t AliRunLoader::SetEventNumber(Int_t evno) } /**************************************************************************/ -const TObject* AliRunLoader::GetRunObject(const char* name) const +AliCDBEntry* AliRunLoader::GetCDBEntry(const char* name) const { -//Get an object from the run data storage +//Get an AliCDBEntry from the run data storage - if (!AliRunDataStorage::Instance()) { - AliWarning("No run data storage defined. Using AliRunDataFile."); - new AliRunDataFile; + if ( !(AliCDBManager::Instance()->IsDefaultStorageSet()) ) { + AliError("No run data storage defined!"); + return 0x0; } - return AliRunDataStorage::Instance()->Get(name, GetEventNumber()); + return AliCDBManager::Instance()->GetDefaultStorage()->Get(name, GetHeader()->GetRun()); + } /**************************************************************************/ @@ -423,6 +418,7 @@ AliRunLoader* AliRunLoader::Open } AliWarningClass("Session is already opened and mounted in demanded folder"); + if (!fgRunLoader) fgRunLoader = result; //PH get access from any place return result; } //end of checking in case of existance of object named identically that folder session is being opened @@ -480,15 +476,16 @@ AliRunLoader* AliRunLoader::Open //procedure for extracting dir name from the file name TString fname(filename); - Int_t nsl = fname.Last('/');//look for slash in file name + Int_t nsl = fname.Last('#');//look for hash in file name TString dirname; - if (nsl < 0) - {//slash not found - Int_t nsl = fname.Last(':');//look for colon e.g. rfio:galice.root - if (nsl < 0) dirname = ".";//not found - else dirname = fname.Remove(nsl);//found - } - else dirname = fname.Remove(nsl);//slash found + if (nsl < 0) {//hash not found + nsl = fname.Last('/');// look for slash + if (nsl < 0) + nsl = fname.Last(':');// look for colon e.g. rfio:galice.root + } + + if (nsl < 0) dirname = "./"; // no directory path, use "." + else dirname = fname.Remove(nsl+1);// directory path AliDebugClass(1, Form("Dir name is : %s",dirname.Data())); @@ -543,8 +540,10 @@ void AliRunLoader::MakeHeader() fStack = fHeader->Stack(); //should be safe - if we created Stack, header returns pointer to the same object if (fStack) { - fStack->SetEventFolderName(fEventFolder->GetName()); - if (TreeK()) fStack->GetEvent(); + if (TreeK()) { + fStack->ConnectTree(TreeK()); + fStack->GetEvent(); + } } else { @@ -562,32 +561,51 @@ void AliRunLoader::MakeStack() if(fStack == 0x0) { fStack = new AliStack(10000); - fStack->SetEventFolderName(fEventFolder->GetName()); } } +/**************************************************************************/ + +void AliRunLoader::MakeTrigger() +{ + // Makes trigger object and connects it to trigger tree (if it exists) + AliDebug( 1, "" ); + if( fCTrigger == 0x0 ) { + AliDebug( 1, "Creating new Trigger Object" ); + fCTrigger = new AliCentralTrigger(); + } + TTree* tree = TreeCT(); + if( tree ) { + fCTrigger->MakeBranch( fgkTriggerBranchName, tree ); + tree->GetEvent( fCurrentEvent ); + } + AliDebug( 1, "Exiting MakeTrigger method" ); +} /**************************************************************************/ void AliRunLoader::MakeTree(Option_t *option) { //Creates trees - const char *oK = strstr(option,"K"); //Kine - const char *oE = strstr(option,"E"); //Header - - if(oK && !TreeK()) - { - if (fKineDataLoader->GetBaseLoader(0)->IsLoaded() == kFALSE) + const char *oK = strstr(option,"K"); //Kine + const char *oE = strstr(option,"E"); //Header + const char *oGG = strstr(option,"GG"); //Central TriGGer + + if(oK) + { + if (fKineDataLoader->GetBaseLoader(0)->IsLoaded() == kFALSE) { - AliError("Load Kinematics first"); + AliError("Load Kinematics first"); } - else + else { - fKineDataLoader->MakeTree(); - MakeStack(); - fStack->ConnectTree(); - WriteKinematics("OVERWRITE"); - } - } + if (!TreeK()) { + fKineDataLoader->MakeTree(); + MakeStack(); + } + fStack->ConnectTree(TreeK()); + WriteKinematics("OVERWRITE"); + } + } // TreeK if(oE && !TreeE()) { @@ -598,6 +616,23 @@ void AliRunLoader::MakeTree(Option_t *option) WriteHeader("OVERWRITE"); } + if(oGG && !TreeCT()) + { + // create the CTP Trigger output file and tree + TFile* file = gROOT->GetFile( fgkDefaultTriggerFileName ); + if( !file ) { + char* tmp = gSystem->ConcatFileName( fUnixDirName.Data(), fgkDefaultTriggerFileName.Data() ); + file = TFile::Open(tmp , "RECREATE" ) ; + delete[] tmp; + } + + file->cd(); + TTree* tree = new TTree( fgkTriggerContainerName, "Tree with Central Trigger Mask" ); + GetEventFolder()->Add(tree); + MakeTrigger(); + // WriteHeader("OVERWRITE"); + } + TIter next(fLoaders); AliLoader *loader; while((loader = (AliLoader*)next())) @@ -682,6 +717,53 @@ Int_t AliRunLoader::LoadHeader() } /**************************************************************************/ +Int_t AliRunLoader::LoadTrigger(Option_t* option) +{ + //Load treeCT + + if( TreeCT() ) { + AliWarning("Trigger is already loaded. Nothing done"); + return 0; + } + + if( GetEventFolder() == 0x0 ) { + AliError("Event folder not specified yet"); + return 1; + } + // get the CTP Trigger output file and tree + char* tmp = gSystem->ConcatFileName( fUnixDirName.Data(), + fgkDefaultTriggerFileName.Data() ); + TString trgfile(tmp); + delete[] tmp; + + TFile* file = gROOT->GetFile( trgfile ); + if( !file ) { + file = TFile::Open( trgfile, option ) ; + if (!file || file->IsOpen() == kFALSE ) { + AliError( Form( "Can not open trigger file %s", trgfile.Data() ) ); + return 2; + } + } + file->cd(); + + TTree* tree = dynamic_cast(file->Get( fgkTriggerContainerName )); + if( !tree ) { + AliError( Form( "Can not find trigger tree named %s in file %s", + fgkTriggerContainerName.Data(), file->GetName() ) ); + return 2; + } + + CleanTrigger(); + + fCTrigger = dynamic_cast(file->Get( "AliCentralTrigger" )); + GetEventFolder()->Add( tree ); + MakeTrigger(); + + return 0; +} + +/**************************************************************************/ + Int_t AliRunLoader::LoadKinematics(Option_t* option) { //Loads the kinematics @@ -693,7 +775,8 @@ Int_t AliRunLoader::LoadKinematics(Option_t* option) } if (fStack) { - retval = fStack->GetEvent(); + fStack->ConnectTree(TreeK()); + retval = fStack->GetEvent(); if ( retval == kFALSE) { AliError("Error occured while loading kinamatics tree."); @@ -766,12 +849,29 @@ TTree* AliRunLoader::TreeE() const } /**************************************************************************/ +TTree* AliRunLoader::TreeCT() const +{ + //returns the tree from folder; shortcut method + if (AliDebugLevel() > 10) fEventFolder->ls(); + TObject *obj = fEventFolder->FindObject(fgkTriggerContainerName); + return (obj)?dynamic_cast(obj):0x0; +} +/**************************************************************************/ + AliHeader* AliRunLoader::GetHeader() const { //returns pointer header object return fHeader; } /**************************************************************************/ + +AliCentralTrigger* AliRunLoader::GetTrigger() const +{ +//returns pointer trigger object + return fCTrigger; +} + +/**************************************************************************/ TTree* AliRunLoader::TreeK() const { @@ -798,21 +898,6 @@ AliRun* AliRunLoader::GetAliRun() const } /**************************************************************************/ -Int_t AliRunLoader::WriteGeometry(Option_t* /*opt*/) -{ -//writes geometry to the file - fGAFile->cd(); - TGeometry* geo = GetAliRun()->GetGeometry(); - if (geo == 0x0) - { - AliError("Can not get geometry from gAlice"); - return 1; - } - geo->Write(); - return 0; -} -/**************************************************************************/ - Int_t AliRunLoader::WriteHeader(Option_t* opt) { //writes treeE @@ -848,6 +933,44 @@ Int_t AliRunLoader::WriteHeader(Option_t* opt) return 0; } + +/**************************************************************************/ + +Int_t AliRunLoader::WriteTrigger(Option_t* opt) +{ + //writes TreeCT + AliDebug( 1, "WRITING TRIGGER" ); + + TTree* tree = TreeCT(); + if ( tree == 0x0) { + AliWarning("Can not find Trigger Tree in Folder"); + return 0; + } + + TFile* file = gROOT->GetFile( gSystem->ConcatFileName( fUnixDirName.Data(), fgkDefaultTriggerFileName.Data() ) ) ; + if( !file || !file->IsOpen() ) { + AliError( "can't write Trigger, file is not open" ); + return kFALSE; + } + + TObject* obj = file->Get( fgkTriggerContainerName ); + if( obj ) { //if they exist, see if option OVERWRITE is used + TString tmp(opt); + if( tmp.Contains( "OVERWRITE", TString::kIgnoreCase ) == 0) { + //if it is not used - give an error message and return an error code + AliError( "Tree already exisists. Use option \"OVERWRITE\" to overwrite previous data" ); + return 3; + } + } + file->cd(); + fCTrigger->Write( 0, TObject::kOverwrite ); + tree->Write( 0, TObject::kOverwrite ); + file->Flush(); + + AliDebug(1, "WRITTEN\n\n"); + + return 0; +} /**************************************************************************/ Int_t AliRunLoader::WriteAliRun(Option_t* /*opt*/) @@ -1032,7 +1155,6 @@ Int_t AliRunLoader::SetEventFolderName(const TString& name) fEventFolder = AliConfig::Instance()->BuildEventFolder(name,"Event Folder"); fEventFolder->Add(this);//put myself to the folder to accessible for all - if (Stack()) Stack()->SetEventFolderName(fEventFolder->GetName()); TIter next(fLoaders); AliLoader *loader; while((loader = (AliLoader*)next())) @@ -1109,6 +1231,7 @@ void AliRunLoader::CleanFolders() CleanDetectors(); CleanHeader(); CleanKinematics(); + CleanTrigger(); } /**************************************************************************/ @@ -1739,6 +1862,7 @@ void AliRunLoader::Clean(const TString& name) AliDebug(1, Form("name=%s, cleaning %s.",GetName(),name.Data())); GetEventFolder()->Remove(obj); delete obj; + obj = 0x0; } } @@ -1845,6 +1969,17 @@ void AliRunLoader::UnloadHeader() } /**************************************************************************/ +void AliRunLoader::UnloadTrigger() +{ + //removes TreeCT from folder and deletes it + // as well as fHeader object + CleanTrigger(); + delete fCTrigger; + fCTrigger = 0x0; +} + +/**************************************************************************/ + void AliRunLoader::UnloadKinematics() { //Unloads Kinematics @@ -1980,6 +2115,9 @@ void AliRunLoader::Synchronize() fKineDataLoader->Synchronize(); fTrackRefsDataLoader->Synchronize(); + + TFile* file = gROOT->GetFile( gSystem->ConcatFileName( fUnixDirName.Data(), fgkDefaultTriggerFileName.Data() ) ) ; + if( file ) file->Flush(); if (fGAFile) fGAFile->Flush(); }