1 /////////////////////////////////////////////////////////////////////////////////////////////
3 // class AliDataLoader //
5 // Container of all data needed for full //
6 // description of each data type //
7 // (Hits, Kine, ...) //
9 // Each data loader has a basic standard setup of BaseLoaders //
10 // which can be identuified by indexes (defined by EStdBasicLoaders) //
11 // Data managed by these standard base loaders has fixed naming convention //
12 // e.g. - tree with hits is always named TreeH //
13 // (defined in AliLoader::fgkDefaultHitsContainerName) //
14 // - task DtectorName+Name defined //
16 // EStdBasicLoaders idx Object Type Description //
17 // kData 0 TTree or TObject main data itself (hits,digits,...) //
18 // kTask 1 TTask object producing main data //
19 // kQA 2 TTree quality assurance tree //
20 // kQATask 3 TTask task producing QA object //
23 // User can define and add more basic loaders even Run Time. //
24 // Caution: in order to save information about added base loader //
25 // user must rewrite Run Loader to galice.file, overwriting old setup //
27 /////////////////////////////////////////////////////////////////////////////////////////////
31 #include "AliDataLoader.h"
32 #include "AliRunLoader.h"
33 #include "AliLoader.h"
34 #include "AliObjectLoader.h"
35 #include "AliTreeLoader.h"
36 #include "AliTaskLoader.h"
44 ClassImp(AliDataLoader)
46 //______________________________________________________________________________
47 AliDataLoader::AliDataLoader():
64 //______________________________________________________________________________
65 AliDataLoader::AliDataLoader(const char* filename, const char* contname,
66 const char* name, Option_t* opt):
74 fBaseLoaders(new TObjArray(4)),
82 // creates a 0 loader, depending on option, default "T" is specialized loader for trees
83 // else standard object loader
84 // trees needs special care, becouse we need to set dir before writing
85 AliDebug(1, Form("File name is %s",fFileName.Data()));
89 if (option.CompareTo("T",TString::kIgnoreCase) == 0)
90 bl = new AliTreeLoader(contname,this);
92 bl = new AliObjectLoader(contname,this);
93 fBaseLoaders->AddAt(bl,kData);
97 //______________________________________________________________________________
98 AliDataLoader::~AliDataLoader()
106 //______________________________________________________________________________
107 Int_t AliDataLoader::SetEvent()
110 // The same that GetEvent but do not post data to folders
112 AliRunLoader* rl = GetRunLoader();
115 AliError("Can not get RunGettr");
119 Int_t evno = rl->GetEventNumber();
121 TIter next(fBaseLoaders);
123 while ((bl = (AliBaseLoader*)next()))
125 if (bl->DoNotReload() == kFALSE) bl->Clean();
134 AliDebug(1, Form("Reloading new file. File opt is %s",fFileOption.Data()));
135 OpenFile(fFileOption);
138 fDirectory = AliLoader::ChangeDir(fFile,evno);
139 if (fDirectory == 0x0)
141 AliError(Form("Can not chage directory in file %s",fFile->GetName()));
148 //______________________________________________________________________________
149 Int_t AliDataLoader::GetEvent()
151 // posts all loaded data from files to White Board
152 // event number is defined in RunLoader
155 // 0 - in case of no error
156 // 1 - event not found
158 //for each base laoder post, if was loaded before GetEvent
160 //call set event to switch to new directory in file
163 //post all data that were loaded before
164 // ->SetEvent does not call Unload, but only cleans White Board
165 // such IsLoaded flag stays untached
167 if ( AliLoader::TestFileOption(fFileOption) == kTRUE ) //if file is read or update mode try to post
168 { //in other case there is no sense to post: file is new
169 TIter nextbl(fBaseLoaders);
171 while ((bl = (AliBaseLoader*)nextbl()))
175 if (bl->DoNotReload() == kFALSE) bl->Post();
182 //______________________________________________________________________________
183 Int_t AliDataLoader::OpenFile(Option_t* opt)
185 //Opens file named 'filename', and assigns pointer to it to 'file'
186 //jumps to fDirectoryectory corresponding to current event and stores the pointer to it in 'fDirectory'
187 //option 'opt' is passed to TFile::Open
190 if(fFile->IsOpen() == kTRUE)
192 AliWarning(Form(" File %s already opened. First close it.",fFile->GetName()));
197 AliWarning(Form("Pointer to file %s is not null, but file is not opened",
204 TString fname(SetFileOffset(fFileName));
206 fFile = (TFile *)(gROOT->GetListOfFiles()->FindObject(fname));
209 if(fFile->IsOpen() == kTRUE)
211 TString option1 = fFile->GetOption();
212 if (option1.CompareTo("read",TString::kIgnoreCase) == 0)
214 AliInfo(Form("File %s already opened in read mode.",fFile->GetName()));
218 TString option2 = opt;
219 if (option2.CompareTo("read",TString::kIgnoreCase) == 0)
221 AliInfo(Form("Open already opened file %s in read mode.",fFile->GetName()));
224 AliWarning(Form("File %s already opened by sombody else. First close it.",
233 fFile = TFile::Open(fname,fFileOption);//open the file
236 AliError(Form("Can not open file %s",fname.Data()));
239 if (fFile->IsOpen() == kFALSE)
241 AliError(Form("Can not open file %s",fname.Data()));
245 fFile->SetBit(TFile::kDevNull);
246 fFile->SetCompressionLevel(fCompressionLevel);
248 AliRunLoader* rg = GetRunLoader();
251 AliError("Can not find Run-Loader in folder.");
254 Int_t evno = rg->GetEventNumber();
256 fDirectory = AliLoader::ChangeDir(fFile,evno);
257 if (fDirectory == 0x0)
259 AliError(Form("Can not chage fDirectory in file %s.",fFile->GetName()));
265 //______________________________________________________________________________
266 void AliDataLoader::Unload()
269 //unloads main data - shortcut method
271 GetBaseLoader(0)->Unload();
274 //______________________________________________________________________________
275 void AliDataLoader::UnloadAll()
278 // Unloads all data and tasks
280 if ( fFile == 0x0 ) return; //nothing loaded
282 TIter next(fBaseLoaders);
284 while ((bl = (AliBaseLoader*)next()))
291 //______________________________________________________________________________
292 Int_t AliDataLoader::Reload()
295 // Unloads and loads data again
297 if ( fFile == 0x0 ) return 0;
299 TBits loaded(fBaseLoaders->GetEntries());
300 TIter next(fBaseLoaders);
304 while ((bl = (AliBaseLoader*)next()))
308 loaded.SetBitNumber(i++,kTRUE);
316 while ((bl = (AliBaseLoader*)next()))
318 if (loaded.TestBitNumber(i++))
320 retval = bl->Load(fFileOption);
323 AliError(Form("Error occur while loading %s",bl->GetName()));
332 //______________________________________________________________________________
333 Int_t AliDataLoader::WriteData(Option_t* opt)
336 // Writes primary data == first BaseLoader
338 AliDebug(1, Form("Writing %s container for %s data. Option is %s.",
339 GetBaseLoader(0)->GetName(),GetName(),opt));
340 return GetBaseLoader(0)->WriteData(opt);
343 //______________________________________________________________________________
344 Int_t AliDataLoader::Load(Option_t* opt)
347 // Writes primary data == first BaseLoader
349 return GetBaseLoader(0)->Load(opt);
352 //______________________________________________________________________________
353 Int_t AliDataLoader::SetEventFolder(TFolder* eventfolder)
356 // Sets the event folder
358 if (eventfolder == 0x0)
360 AliError("Stupid joke. Argument is NULL");
363 AliDebug(1, Form("name = %s Setting Event Folder named %s.",
364 GetName(),eventfolder->GetName()));
366 fEventFolder = eventfolder;
371 //______________________________________________________________________________
372 Int_t AliDataLoader::SetFolder(TFolder* folder)
374 // Sets the folder and the data loaders
377 AliError("Stupid joke. Argument is NULL");
381 AliDebug(1, Form("name = %s Setting folder named %s.",GetName(),folder->GetName()));
384 TIter next(fBaseLoaders);
387 while ((bl = (AliBaseLoader*)next()))
389 bl->SetDataLoader(this);
395 //______________________________________________________________________________
396 TFolder* AliDataLoader::GetEventFolder()
400 // Data that are changing from event to event, even in single run
402 AliDebug(1, "EF = %#x");
406 //______________________________________________________________________________
407 AliRunLoader* AliDataLoader::GetRunLoader()
410 // Gets the run-loader from event folder
412 AliRunLoader* rg = 0x0;
413 TFolder* ef = GetEventFolder();
416 AliError("Can not get event folder.");
419 rg = dynamic_cast<AliRunLoader*>(ef->FindObject(AliRunLoader::GetRunLoaderName()));
423 //______________________________________________________________________________
424 void AliDataLoader::CloseFile()
429 TIter next(fBaseLoaders);
431 while ((bl = (AliBaseLoader*)next()))
433 if (bl->IsLoaded()) return;
436 AliDebug(1, "Closing (object) file.");
446 //______________________________________________________________________________
447 void AliDataLoader::Clean()
452 GetBaseLoader(0)->Clean();
455 //______________________________________________________________________________
456 void AliDataLoader::CleanAll()
459 // Cleans all folders and tasks
461 TIter next(fBaseLoaders);
463 while ((bl = (AliBaseLoader*)next()))
469 //______________________________________________________________________________
470 void AliDataLoader::SetFileNameSuffix(const TString& suffix)
473 // adds the suffix before ".root",
474 // e.g. TPC.Digits.root -> TPC.DigitsMerged.root
475 // made on Jiri Chudoba demand
477 AliDebug(1, Form("suffix=%s",suffix.Data()));
478 AliDebug(1, Form(" Digits File Name before: %s",fFileName.Data()));
480 static const TString dotroot(".root");
481 const TString& suffixdotroot = suffix + dotroot;
482 fFileName = fFileName.ReplaceAll(dotroot,suffixdotroot);
484 AliDebug(1, Form(" after : %s",fFileName.Data()));
487 //______________________________________________________________________________
488 Bool_t AliDataLoader::CheckReload()
491 // Checks if we have to reload given file
493 if (fFile == 0x0) return kFALSE;
494 TString tmp = SetFileOffset(fFileName);
495 if (tmp.CompareTo(fFile->GetName())) return kTRUE; //file must be reloaded
499 //______________________________________________________________________________
500 const TString AliDataLoader::SetFileOffset(const TString& fname)
505 Long_t offset = (Long_t)GetRunLoader()->GetFileOffset();
506 if (fNEventsPerFile > 0) {
507 offset = GetRunLoader()->GetEventNumber()/fNEventsPerFile;
509 if (offset < 1) return fname;
512 soffset += offset;//automatic conversion to string
513 TString dotroot(".root");
514 const TString& offfsetdotroot = offset + dotroot;
516 out = out.ReplaceAll(dotroot,offfsetdotroot);
517 AliDebug(1, Form("in=%s out=%s.",fname.Data(),out.Data()));
521 //______________________________________________________________________________
522 void AliDataLoader::SetFileOption(Option_t* newopt)
527 if (fFileOption.CompareTo(newopt) == 0) return;
528 fFileOption = newopt;
532 //______________________________________________________________________________
533 void AliDataLoader::SetCompressionLevel(Int_t cl)
536 // Sets comression level for data defined by di
538 fCompressionLevel = cl;
539 if (fFile) fFile->SetCompressionLevel(cl);
542 //______________________________________________________________________________
543 void AliDataLoader::MakeTree()
546 // Makes tree for the current data loader
548 AliTreeLoader* tl = dynamic_cast<AliTreeLoader*>(fBaseLoaders->At(0));
551 AliError("Can not make a tree because main base loader is not a tree loader");
557 //______________________________________________________________________________
558 Bool_t AliDataLoader::IsFileWritable() const
561 // Returns true if file is writable
563 return (fFile)?fFile->IsWritable():kFALSE;
566 //______________________________________________________________________________
567 Bool_t AliDataLoader::IsFileOpen() const
570 // Returns true if file is writable
572 return (fFile)?fFile->IsOpen():kFALSE;
575 //______________________________________________________________________________
576 Bool_t AliDataLoader::IsOptionContrary(const TString& option) const
578 // Checks if passed option is contrary with file open option
579 // which is passed option "writable" and existing option not wriable
580 // in reverse case it is no harm so it is NOT contrary
581 if (fFile == 0x0) return kFALSE; //file is not opened - no problem
583 if ( ( AliLoader::IsOptionWritable(option) == kTRUE ) && // passed option is writable and
584 ( AliLoader::IsOptionWritable(fFileOption) == kFALSE ) ) // existing one is not writable
593 //______________________________________________________________________________
594 void AliDataLoader::AddBaseLoader(AliBaseLoader* bl)
596 //Adds a base loader to lits of base loaders managed by this data loader
597 //Managed data/task will be stored in proper root directory,
599 // - in case of tree/object - data folder connected with detector associated with this data loader
600 // - in case of task - parental task which defined in this AliTaskLoader
604 AliWarning("Pointer is null.");
608 TObject* obj = fBaseLoaders->FindObject(bl->GetName());
611 AliError("Can not add this base loader.");
612 AliError(Form("There exists already base loader which manages data named %s for this detector.",obj->GetName()));
616 fBaseLoaders->Add(bl);
619 //______________________________________________________________________________
620 AliBaseLoader* AliDataLoader::GetBaseLoader(const TString& name) const
623 // Return pointer to base loader
625 return dynamic_cast<AliBaseLoader*>(fBaseLoaders->FindObject(name));
628 //______________________________________________________________________________
629 AliBaseLoader* AliDataLoader::GetBaseLoader(Int_t n) const
632 // Gets the n-th base loader (what is n?)
634 return dynamic_cast<AliBaseLoader*>(fBaseLoaders->At(n));
637 //______________________________________________________________________________
638 TTree* AliDataLoader::Tree() const
640 // Returns tree from the main base loader
641 // it is just shortcut method for comfort of user
642 // main storage object does not have to be Tree -
643 // that is why first we need to check if it is a TreeLoader
644 AliTreeLoader* tl = dynamic_cast<AliTreeLoader*>(GetBaseLoader(0));
645 if (tl == 0x0) return 0x0;
649 //______________________________________________________________________________
650 void AliDataLoader::SetDirName(TString& dirname)
653 // Sets the directory name where the files will be stored
655 AliDebug(10, Form("FileName before %s",fFileName.Data()));
656 Int_t n = fFileName.Last('/');
657 AliDebug(10, Form("Slash found on pos %d",n));
658 if (n > 0) fFileName = fFileName.Remove(0,n+1);
659 AliDebug(10, Form("Core FileName %s",fFileName.Data()));
660 fFileName = dirname + fFileName;
661 AliDebug(10, Form("FileName after %s",fFileName.Data()));
664 //______________________________________________________________________________
665 AliObjectLoader* AliDataLoader::GetBaseDataLoader()
668 // Gets the base data loader
670 return dynamic_cast<AliObjectLoader*>(GetBaseLoader(kData));
673 //______________________________________________________________________________
674 AliTaskLoader* AliDataLoader::GetBaseTaskLoader()
677 // Gets the base task loader
679 return dynamic_cast<AliTaskLoader*>(GetBaseLoader(kTask));
682 //______________________________________________________________________________
683 AliBaseLoader* AliDataLoader::GetBaseQALoader()
686 // Gets the base QA loader
688 return GetBaseLoader(kQA);
691 //______________________________________________________________________________
692 AliTaskLoader* AliDataLoader::GetBaseQATaskLoader()
695 // Returns pointer to QA base loader
697 return dynamic_cast<AliTaskLoader*>(GetBaseLoader(kQATask));
700 //______________________________________________________________________________
701 void AliDataLoader::SetBaseDataLoader(AliBaseLoader* bl)
704 // Sets data base loader
708 AliError("Parameter is null");
711 if (GetBaseDataLoader()) delete GetBaseDataLoader();
712 fBaseLoaders->AddAt(bl,kData);
715 //______________________________________________________________________________
716 void AliDataLoader::SetBaseTaskLoader(AliTaskLoader* bl)
719 // Sets Task base loader
723 AliError("Parameter is null");
726 if (GetBaseTaskLoader()) delete GetBaseTaskLoader();
727 fBaseLoaders->AddAt(bl,kTask);
730 //______________________________________________________________________________
731 void AliDataLoader::SetBaseQALoader(AliBaseLoader* bl)
734 // Sets QA base loader
738 AliError("Parameter is null");
741 if (GetBaseQALoader()) delete GetBaseQALoader();
742 fBaseLoaders->AddAt(bl,kQA);
745 //______________________________________________________________________________
746 void AliDataLoader::SetBaseQATaskLoader(AliTaskLoader* bl)
749 // Sets QA Task base loader
753 AliError("Parameter is null");
756 if (GetBaseQATaskLoader()) delete GetBaseQATaskLoader();
757 fBaseLoaders->AddAt(bl,kQATask);
760 //______________________________________________________________________________
761 void AliDataLoader::Synchronize()
764 // Synchronizes all writable files
766 if ( fFile ) fFile->Flush();