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->SetCompressionLevel(fCompressionLevel);
247 AliRunLoader* rg = GetRunLoader();
250 AliError("Can not find Run-Loader in folder.");
253 Int_t evno = rg->GetEventNumber();
255 fDirectory = AliLoader::ChangeDir(fFile,evno);
256 if (fDirectory == 0x0)
258 AliError(Form("Can not chage fDirectory in file %s.",fFile->GetName()));
264 //______________________________________________________________________________
265 void AliDataLoader::Unload()
268 //unloads main data - shortcut method
270 GetBaseLoader(0)->Unload();
273 //______________________________________________________________________________
274 void AliDataLoader::UnloadAll()
277 // Unloads all data and tasks
279 if ( fFile == 0x0 ) return; //nothing loaded
281 TIter next(fBaseLoaders);
283 while ((bl = (AliBaseLoader*)next()))
290 //______________________________________________________________________________
291 Int_t AliDataLoader::Reload()
294 // Unloads and loads data again
296 if ( fFile == 0x0 ) return 0;
298 TBits loaded(fBaseLoaders->GetEntries());
299 TIter next(fBaseLoaders);
303 while ((bl = (AliBaseLoader*)next()))
307 loaded.SetBitNumber(i++,kTRUE);
315 while ((bl = (AliBaseLoader*)next()))
317 if (loaded.TestBitNumber(i++))
319 retval = bl->Load(fFileOption);
322 AliError(Form("Error occur while loading %s",bl->GetName()));
331 //______________________________________________________________________________
332 Int_t AliDataLoader::WriteData(Option_t* opt)
335 // Writes primary data == first BaseLoader
337 AliDebug(1, Form("Writing %s container for %s data. Option is %s.",
338 GetBaseLoader(0)->GetName(),GetName(),opt));
339 return GetBaseLoader(0)->WriteData(opt);
342 //______________________________________________________________________________
343 Int_t AliDataLoader::Load(Option_t* opt)
346 // Writes primary data == first BaseLoader
348 return GetBaseLoader(0)->Load(opt);
351 //______________________________________________________________________________
352 Int_t AliDataLoader::SetEventFolder(TFolder* eventfolder)
355 // Sets the event folder
357 if (eventfolder == 0x0)
359 AliError("Stupid joke. Argument is NULL");
362 AliDebug(1, Form("name = %s Setting Event Folder named %s.",
363 GetName(),eventfolder->GetName()));
365 fEventFolder = eventfolder;
370 //______________________________________________________________________________
371 Int_t AliDataLoader::SetFolder(TFolder* folder)
373 // Sets the folder and the data loaders
376 AliError("Stupid joke. Argument is NULL");
380 AliDebug(1, Form("name = %s Setting folder named %s.",GetName(),folder->GetName()));
383 TIter next(fBaseLoaders);
386 while ((bl = (AliBaseLoader*)next()))
388 bl->SetDataLoader(this);
394 //______________________________________________________________________________
395 TFolder* AliDataLoader::GetEventFolder()
399 // Data that are changing from event to event, even in single run
401 AliDebug(1, "EF = %#x");
405 //______________________________________________________________________________
406 AliRunLoader* AliDataLoader::GetRunLoader()
409 // Gets the run-loader from event folder
411 AliRunLoader* rg = 0x0;
412 TFolder* ef = GetEventFolder();
415 AliError("Can not get event folder.");
418 rg = dynamic_cast<AliRunLoader*>(ef->FindObject(AliRunLoader::GetRunLoaderName()));
422 //______________________________________________________________________________
423 void AliDataLoader::CloseFile()
428 TIter next(fBaseLoaders);
430 while ((bl = (AliBaseLoader*)next()))
432 if (bl->IsLoaded()) return;
435 AliDebug(1, "Closing and deleting (object) file.");
443 //______________________________________________________________________________
444 void AliDataLoader::Clean()
449 GetBaseLoader(0)->Clean();
452 //______________________________________________________________________________
453 void AliDataLoader::CleanAll()
456 // Cleans all folders and tasks
458 TIter next(fBaseLoaders);
460 while ((bl = (AliBaseLoader*)next()))
466 //______________________________________________________________________________
467 void AliDataLoader::SetFileNameSuffix(const TString& suffix)
470 // adds the suffix before ".root",
471 // e.g. TPC.Digits.root -> TPC.DigitsMerged.root
472 // made on Jiri Chudoba demand
474 AliDebug(1, Form("suffix=%s",suffix.Data()));
475 AliDebug(1, Form(" Digits File Name before: %s",fFileName.Data()));
477 static const TString dotroot(".root");
478 const TString& suffixdotroot = suffix + dotroot;
479 fFileName = fFileName.ReplaceAll(dotroot,suffixdotroot);
481 AliDebug(1, Form(" after : %s",fFileName.Data()));
484 //______________________________________________________________________________
485 Bool_t AliDataLoader::CheckReload()
488 // Checks if we have to reload given file
490 if (fFile == 0x0) return kFALSE;
491 TString tmp = SetFileOffset(fFileName);
492 if (tmp.CompareTo(fFile->GetName())) return kTRUE; //file must be reloaded
496 //______________________________________________________________________________
497 const TString AliDataLoader::SetFileOffset(const TString& fname)
502 Long_t offset = (Long_t)GetRunLoader()->GetFileOffset();
503 if (fNEventsPerFile > 0) {
504 offset = GetRunLoader()->GetEventNumber()/fNEventsPerFile;
506 if (offset < 1) return fname;
509 soffset += offset;//automatic conversion to string
510 TString dotroot(".root");
511 const TString& offfsetdotroot = offset + dotroot;
513 out = out.ReplaceAll(dotroot,offfsetdotroot);
514 AliDebug(1, Form("in=%s out=%s.",fname.Data(),out.Data()));
518 //______________________________________________________________________________
519 void AliDataLoader::SetFileOption(Option_t* newopt)
524 if (fFileOption.CompareTo(newopt) == 0) return;
525 fFileOption = newopt;
529 //______________________________________________________________________________
530 void AliDataLoader::SetCompressionLevel(Int_t cl)
533 // Sets comression level for data defined by di
535 fCompressionLevel = cl;
536 if (fFile) fFile->SetCompressionLevel(cl);
539 //______________________________________________________________________________
540 void AliDataLoader::MakeTree()
543 // Makes tree for the current data loader
545 AliTreeLoader* tl = dynamic_cast<AliTreeLoader*>(fBaseLoaders->At(0));
548 AliError("Can not make a tree because main base loader is not a tree loader");
554 //______________________________________________________________________________
555 Bool_t AliDataLoader::IsFileWritable() const
558 // Returns true if file is writable
560 return (fFile)?fFile->IsWritable():kFALSE;
563 //______________________________________________________________________________
564 Bool_t AliDataLoader::IsFileOpen() const
567 // Returns true if file is writable
569 return (fFile)?fFile->IsOpen():kFALSE;
572 //______________________________________________________________________________
573 Bool_t AliDataLoader::IsOptionContrary(const TString& option) const
575 // Checks if passed option is contrary with file open option
576 // which is passed option "writable" and existing option not wriable
577 // in reverse case it is no harm so it is NOT contrary
578 if (fFile == 0x0) return kFALSE; //file is not opened - no problem
580 if ( ( AliLoader::IsOptionWritable(option) == kTRUE ) && // passed option is writable and
581 ( AliLoader::IsOptionWritable(fFileOption) == kFALSE ) ) // existing one is not writable
590 //______________________________________________________________________________
591 void AliDataLoader::AddBaseLoader(AliBaseLoader* bl)
593 //Adds a base loader to lits of base loaders managed by this data loader
594 //Managed data/task will be stored in proper root directory,
596 // - in case of tree/object - data folder connected with detector associated with this data loader
597 // - in case of task - parental task which defined in this AliTaskLoader
601 AliWarning("Pointer is null.");
605 TObject* obj = fBaseLoaders->FindObject(bl->GetName());
608 AliError("Can not add this base loader.");
609 AliError(Form("There exists already base loader which manages data named %s for this detector.",obj->GetName()));
613 fBaseLoaders->Add(bl);
616 //______________________________________________________________________________
617 AliBaseLoader* AliDataLoader::GetBaseLoader(const TString& name) const
620 // Return pointer to base loader
622 return dynamic_cast<AliBaseLoader*>(fBaseLoaders->FindObject(name));
625 //______________________________________________________________________________
626 AliBaseLoader* AliDataLoader::GetBaseLoader(Int_t n) const
629 // Gets the n-th base loader (what is n?)
631 return dynamic_cast<AliBaseLoader*>(fBaseLoaders->At(n));
634 //______________________________________________________________________________
635 TTree* AliDataLoader::Tree() const
637 // Returns tree from the main base loader
638 // it is just shortcut method for comfort of user
639 // main storage object does not have to be Tree -
640 // that is why first we need to check if it is a TreeLoader
641 AliTreeLoader* tl = dynamic_cast<AliTreeLoader*>(GetBaseLoader(0));
642 if (tl == 0x0) return 0x0;
646 //______________________________________________________________________________
647 void AliDataLoader::SetDirName(TString& dirname)
650 // Sets the directory name where the files will be stored
652 AliDebug(10, Form("FileName before %s",fFileName.Data()));
653 Int_t n = fFileName.Last('/');
654 AliDebug(10, Form("Slash found on pos %d",n));
655 if (n > 0) fFileName = fFileName.Remove(0,n+1);
656 AliDebug(10, Form("Core FileName %s",fFileName.Data()));
657 fFileName = dirname + fFileName;
658 AliDebug(10, Form("FileName after %s",fFileName.Data()));
661 //______________________________________________________________________________
662 AliObjectLoader* AliDataLoader::GetBaseDataLoader()
665 // Gets the base data loader
667 return dynamic_cast<AliObjectLoader*>(GetBaseLoader(kData));
670 //______________________________________________________________________________
671 AliTaskLoader* AliDataLoader::GetBaseTaskLoader()
674 // Gets the base task loader
676 return dynamic_cast<AliTaskLoader*>(GetBaseLoader(kTask));
679 //______________________________________________________________________________
680 AliBaseLoader* AliDataLoader::GetBaseQALoader()
683 // Gets the base QA loader
685 return GetBaseLoader(kQA);
688 //______________________________________________________________________________
689 AliTaskLoader* AliDataLoader::GetBaseQATaskLoader()
692 // Returns pointer to QA base loader
694 return dynamic_cast<AliTaskLoader*>(GetBaseLoader(kQATask));
697 //______________________________________________________________________________
698 void AliDataLoader::SetBaseDataLoader(AliBaseLoader* bl)
701 // Sets data base loader
705 AliError("Parameter is null");
708 if (GetBaseDataLoader()) delete GetBaseDataLoader();
709 fBaseLoaders->AddAt(bl,kData);
712 //______________________________________________________________________________
713 void AliDataLoader::SetBaseTaskLoader(AliTaskLoader* bl)
716 // Sets Task base loader
720 AliError("Parameter is null");
723 if (GetBaseTaskLoader()) delete GetBaseTaskLoader();
724 fBaseLoaders->AddAt(bl,kTask);
727 //______________________________________________________________________________
728 void AliDataLoader::SetBaseQALoader(AliBaseLoader* bl)
731 // Sets QA base loader
735 AliError("Parameter is null");
738 if (GetBaseQALoader()) delete GetBaseQALoader();
739 fBaseLoaders->AddAt(bl,kQA);
742 //______________________________________________________________________________
743 void AliDataLoader::SetBaseQATaskLoader(AliTaskLoader* bl)
746 // Sets QA Task base loader
750 AliError("Parameter is null");
753 if (GetBaseQATaskLoader()) delete GetBaseQATaskLoader();
754 fBaseLoaders->AddAt(bl,kQATask);
757 //______________________________________________________________________________
758 void AliDataLoader::Synchronize()
761 // Synchronizes all writable files
763 if ( fFile ) fFile->Flush();