2 //Class (base) responsible for management of data:
3 // - opening and closing proper files
4 // - posting data to folders
5 // - writing data from folders to proper files
7 //Author: Alice Offline Group http://alisoft.cern.ch
8 //Responsible: Piotr.Skowronski@cern.ch
10 #include <AliLoader.h>
23 #include <AliRunLoader.h>
24 #include <AliRunDigitizer.h>
25 #include <AliDigitizer.h>
26 #include <AliDetector.h>
28 Int_t AliLoader::fgDebug = 0;
30 const TString AliLoader::fgkDefaultHitsContainerName("TreeH");
31 const TString AliLoader::fgkDefaultDigitsContainerName = "TreeD";
32 const TString AliLoader::fgkDefaultSDigitsContainerName = "TreeS";
33 const TString AliLoader::fgkDefaultRecPointsContainerName = "TreeR";
34 const TString AliLoader::fgkDefaultTracksContainerName = "TreeT";
35 const TString AliLoader::fgkDefaultRecParticlesContainerName = "TreeP";
36 const TString AliLoader::fgkLoaderBaseName("Loader");
39 //___________________________________________________________________
40 /////////////////////////////////////////////////////////////////////
44 // Base class for Loaders. //
45 // Loader provides base I/O fascilities for "standard" data. //
46 // Each detector has a laoder data member //
47 // loader is accessible via folder structure as well //
49 /////////////////////////////////////////////////////////////////////
51 /*****************************************************************************/
53 AliLoader::AliLoader():
58 fDetectorDataFolder(0x0),
66 /******************************************************************/
68 AliLoader::AliLoader(const Char_t* detname,const Char_t* eventfoldername):
69 fDataLoaders(new TObjArray(kNDataTypes)),
73 fDetectorDataFolder(0x0),
79 if (GetDebug()) Info("AliLoader(const Char_t* detname,const Char_t* eventfoldername)",
80 "detname = %s eventfoldername = %s",detname,eventfoldername);
82 //try to find folder eventfoldername in top alice folder
83 //safe because GetTopFolder will abort in case of failure
85 fDetectorName = detname;
86 fName = fDetectorName+"Loader";
89 TObject* fobj = GetTopFolder()->FindObject(eventfoldername);
90 fEventFolder = (fobj)?dynamic_cast<TFolder*>(fobj):0x0;//in case FindObject returns NULL dynamic cast cause seg. fault
91 SetEventFolder(fEventFolder);
94 /*****************************************************************************/
96 AliLoader::AliLoader(const Char_t * detname,TFolder* eventfolder):
97 fDataLoaders(new TObjArray(kNDataTypes)),
98 fDetectorName(detname),
101 fDetectorDataFolder(0x0),
107 fDetectorName = detname;
108 fName = fDetectorName+"Loader";
110 SetEventFolder(eventfolder);
111 //fileoption's don't need to initialized because default TString ctor does it correctly
113 /*****************************************************************************/
115 AliLoader::~AliLoader()
118 if (fDataLoaders) fDataLoaders->SetOwner();
121 /*****************************************************************************/
123 void AliLoader::InitDefaults()
127 dl = new AliDataLoader(fDetectorName + ".Hits.root",fgkDefaultHitsContainerName, "Hits" );
128 fDataLoaders->AddAt(dl,kHits);
131 // S U M M A B L E D I G I T S
132 dl = new AliDataLoader(fDetectorName + ".SDigits.root",fgkDefaultSDigitsContainerName, "Summable Digits");
133 AliTaskLoader* tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetSDigitizerTaskName(),
134 dl,AliRunLoader::GetRunSDigitizer(),kTRUE);
135 dl->SetBaseTaskLoader(tl);
136 fDataLoaders->AddAt(dl,kSDigits);
139 dl = new AliDataLoader(fDetectorName + ".Digits.root",fgkDefaultDigitsContainerName, "Digits");
140 tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetDigitizerTaskName(),
141 dl,AliRunLoader::GetRunDigitizer(),kTRUE);
142 dl->SetBaseTaskLoader(tl);
143 fDataLoaders->AddAt(dl,kDigits);
145 // R E C O N S T R U C T E D P O I N T S aka C L U S T E R S
146 dl = new AliDataLoader(fDetectorName + ".RecPoints.root",fgkDefaultRecPointsContainerName, "Reconstructed Points");
147 tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetReconstructionerTaskName(),
148 dl,AliRunLoader::GetRunReconstructioner(),kTRUE);
149 dl->SetBaseTaskLoader(tl);
150 fDataLoaders->AddAt(dl,kRecPoints);
153 dl = new AliDataLoader(fDetectorName + ".Tracks.root",fgkDefaultTracksContainerName, "Tracks");
154 tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetTrackerTaskName(),
155 dl,AliRunLoader::GetRunTracker(),kTRUE);
156 dl->SetBaseTaskLoader(tl);
157 fDataLoaders->AddAt(dl,kTracks);
159 // R E C O N S T R U C T E D P O I N T S aka C L U S T E R S
160 dl = new AliDataLoader(fDetectorName + ".RecParticles.root",fgkDefaultRecParticlesContainerName, "Reconstructed Particles");
161 tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetPIDTaskName(),
162 dl,AliRunLoader::GetRunPIDTask(),kTRUE);
163 dl->SetBaseTaskLoader(tl);
164 fDataLoaders->AddAt(dl,kRecParticles);
167 /*****************************************************************************/
169 AliDataLoader* AliLoader::GetDataLoader(const char* name)
171 //returns Data Loader with specified name
172 return dynamic_cast<AliDataLoader*>(fDataLoaders->FindObject(name));
174 /*****************************************************************************/
176 Int_t AliLoader::SetEvent()
178 //basically the same that GetEvent but do not post data to folders
179 TIter next(fDataLoaders);
181 while ((dl = (AliDataLoader*)next()))
187 /******************************************************************/
189 void AliLoader::UnloadAll()
191 //calls UnloadAll for all base laoders
193 TIter next(fDataLoaders);
195 while ((dl = (AliDataLoader*)next()))
200 /******************************************************************/
202 Int_t AliLoader::GetEvent()
204 //changes to proper root directory and tries to load data from files to folders
205 // event number is defined in RunLoader
208 // 0 - in case of no error
209 // 1 - event not found
213 TIter next(fDataLoaders);
215 while ((dl = (AliDataLoader*)next()))
217 retval = dl->GetEvent();
220 Error("GetEvent","Error occured while GetEvent for %s",dl->GetName());
228 /******************************************************************/
230 TFolder* AliLoader::GetTopFolder()
232 //returns TOP aliroot folder, just a simple interface to AliConfig (gives shorter notation)
233 return AliConfig::Instance()->GetTopFolder();
236 /******************************************************************/
238 TFolder* AliLoader::GetEventFolder()
240 //get EVENT folder (data that are changing from event to event, even in single run)
243 /******************************************************************/
244 TFolder* AliLoader::GetDataFolder()
246 //returns the folder speciofic to given detector e.g. /Folders/Event/Data/
249 fDataFolder = dynamic_cast<TFolder*>(GetEventFolder()->FindObject(AliConfig::fgkDataFolderName));
253 Fatal("GetDataFolder","Can not find AliRoot data folder. Aborting");
260 /*****************************************************************************/
262 TFolder* AliLoader::GetTasksFolder()
264 //Returns pointer to Folder with Alice Tasks
267 fTasksFolder = dynamic_cast<TFolder*>(GetTopFolder()->FindObject(AliConfig::fgkTasksFolderName));
271 Fatal("GetTasksFolder","Can not find tasks folder. Aborting");
278 /*****************************************************************************/
280 TFolder* AliLoader::GetModulesFolder()
284 fModuleFolder = dynamic_cast<TFolder*>(GetEventFolder()->FindObjectAny(AliConfig::GetModulesFolderName()));
288 Fatal("GetModulesFolder","Can not find modules folder. Aborting");
292 return fModuleFolder;
295 /*****************************************************************************/
297 TFolder* AliLoader::GetQAFolder()
299 //returns folder with Quality assurance
300 if (fQAFolder == 0x0)
302 TObject *obj = GetEventFolder()->FindObjectAny(AliConfig::Instance()->GetQAFolderName());
303 fQAFolder = (obj)?dynamic_cast<TFolder*>(obj):0x0;
305 if (fQAFolder == 0x0)
307 Fatal("GetQAFolder","Can not find Quality Assurance folder. Aborting");
314 /*****************************************************************************/
315 TTask* AliLoader::SDigitizer()
317 //returns SDigitizer task for this detector
318 return GetSDigitsDataLoader()->GetBaseTaskLoader()->Task();
321 /*****************************************************************************/
323 AliDigitizer* AliLoader::Digitizer()
325 //returns Digitizer task for this detector
326 return dynamic_cast<AliDigitizer*>(GetDigitsDataLoader()->GetBaseTaskLoader()->Task());
328 /*****************************************************************************/
330 TTask* AliLoader::Reconstructioner()
332 //returns Recontructioner (Cluster Finder, Cluster Maker,
333 //or whatever you want to call it) task for this detector
334 return GetRecPointsDataLoader()->GetBaseTaskLoader()->Task();
336 /*****************************************************************************/
338 TTask* AliLoader::Tracker()
341 return dynamic_cast<TTask*>(GetTracksDataLoader()->GetBaseTaskLoader()->Task());
344 /*****************************************************************************/
345 TTask* AliLoader::PIDTask()
348 return dynamic_cast<TTask*>(GetRecParticlesDataLoader()->GetBaseTaskLoader()->Task());
351 /*****************************************************************************/
353 TTask* AliLoader::QAtask(const char* name)
355 TTask* qat = AliRunLoader::GetRunQATask();
358 Error("QAtask","Can not get RunQATask. (Name:%s)",GetName());
362 TString dqatname(fDetectorName + AliConfig::Instance()->GetQATaskName());
363 TTask* dqat = dynamic_cast<TTask*>(qat->GetListOfTasks()->FindObject(dqatname));
367 Error("QAtask","Can not find QATask in RunQATask for %s",GetDetectorName().Data());
371 if (strlen(name) == 0) return dqat;
373 TList* list = dqat->GetListOfTasks();
377 while((task = static_cast<TTask *>(it.Next()) ))
379 TString taskname(task->GetName()) ;
380 if(taskname.BeginsWith(name))
383 Error("QAtask","Can not find sub-task with name starting with %s in task %s",name,dqat->GetName());
386 /*****************************************************************************/
388 TDirectory* AliLoader::ChangeDir(TFile* file, Int_t eventno)
390 //changes the root directory in "file" to "dirname" which corresponds to event 'eventno'
391 //in case of success returns the pointer to directory
396 ::Error("AliLoader::ChangeDir","File is null");
399 if (file->IsOpen() == kFALSE)
401 ::Error("AliLoader::ChangeDir","File is not opened");
405 TString dirname("Event");
407 if (AliLoader::fgDebug > 1)
408 ::Info("AliLoader::ChangeDir","Changing Dir to %s in file %s.",dirname.Data(),file->GetName());
412 TDirectory* dir = dynamic_cast<TDirectory*>(file->Get(dirname));
416 if (AliLoader::fgDebug > 1)
417 ::Info("AliLoader::ChangeDir","Can not find directory %s in file %s, creating...",
418 dirname.Data(),file->GetName());
420 if (file->IsWritable() == kFALSE)
422 ::Error("AliLoader::ChangeDir","Can not create directory. File %s in not writable.",
427 TDirectory* newdir = file->mkdir(dirname);
430 ::Error("AliLoader::ChangeDir","Failed to create new directory in file %s.",
434 result = file->cd(dirname);
435 if (result == kFALSE)
442 file->cd();//make a file active
443 file->cd(dirname);//cd event dir
448 /*****************************************************************************/
450 TString AliLoader::GetUnixDir()
452 //This Method will manage jumping through unix directories in case of
453 //run with more events per run than defined in gAlice
459 /*****************************************************************************/
460 /************************************************************/
462 void AliLoader::MakeTree(Option_t *option)
464 //Makes a tree depending on option
467 // S: - Summable Digits
468 // R: - Reconstructed Points (clusters)
469 // T: - Tracks (tracklets)
471 const char *oH = strstr(option,"H");
472 const char *oD = strstr(option,"D");
473 const char *oS = strstr(option,"S");
474 const char *oR = strstr(option,"R");
475 const char *oT = strstr(option,"T");
476 const char *oP = strstr(option,"P");
478 if (oH) MakeHitsContainer();
479 if (oD) MakeDigitsContainer();
480 if (oS) MakeSDigitsContainer();
481 if (oR) MakeRecPointsContainer();
482 if (oT) MakeTracksContainer();
483 if (oP) MakeRecParticlesContainer();
486 /*****************************************************************************/
487 Int_t AliLoader::WriteHits(Option_t* opt)
489 AliDataLoader* dl = GetHitsDataLoader();
490 Int_t ret = dl->WriteData(opt);
493 /*****************************************************************************/
495 Int_t AliLoader::WriteSDigits(Option_t* opt)
497 AliDataLoader* dl = GetSDigitsDataLoader();
498 Int_t ret = dl->WriteData(opt);
502 /*****************************************************************************/
504 Int_t AliLoader::PostSDigitizer(TTask* sdzer)
506 return GetSDigitsDataLoader()->GetBaseTaskLoader()->Post(sdzer);
508 /*****************************************************************************/
510 Int_t AliLoader::PostDigitizer(AliDigitizer* task)
512 return GetDigitsDataLoader()->GetBaseTaskLoader()->Post(task);
514 /*****************************************************************************/
516 Int_t AliLoader::PostReconstructioner(TTask* task)
518 return GetRecPointsDataLoader()->GetBaseTaskLoader()->Post(task);
520 /*****************************************************************************/
522 Int_t AliLoader::PostTracker(TTask* task)
524 return GetTracksDataLoader()->GetBaseTaskLoader()->Post(task);
526 /*****************************************************************************/
528 Int_t AliLoader::PostPIDTask(TTask* task)
530 return GetRecParticlesDataLoader()->GetBaseTaskLoader()->Post(task);
532 /*****************************************************************************/
534 TObject** AliLoader::GetDetectorDataRef(TObject *obj)
540 return GetDetectorDataFolder()->GetListOfFolders()->GetObjectRef(obj) ;
542 /*****************************************************************************/
544 TObject** AliLoader::SDigitizerRef()
546 TTask* rsd = AliRunLoader::GetRunSDigitizer();
551 return rsd->GetListOfTasks()->GetObjectRef(SDigitizer());
553 /*****************************************************************************/
555 TObject** AliLoader::DigitizerRef()
557 TTask* rd = AliRunLoader::GetRunDigitizer();
562 return rd->GetListOfTasks()->GetObjectRef(Digitizer()) ;
564 /*****************************************************************************/
566 TObject** AliLoader::ReconstructionerRef()
568 TTask* rrec = AliRunLoader::GetRunReconstructioner();
573 return rrec->GetListOfTasks()->GetObjectRef(Reconstructioner());
575 /*****************************************************************************/
577 TObject** AliLoader::TrackerRef()
579 TTask* rrec = AliRunLoader::GetRunTracker();
584 return rrec->GetListOfTasks()->GetObjectRef(Tracker());
586 /*****************************************************************************/
588 TObject** AliLoader::PIDTaskRef()
590 TTask* rrec = AliRunLoader::GetRunPIDTask();
595 return rrec->GetListOfTasks()->GetObjectRef(PIDTask());
598 /*****************************************************************************/
599 void AliLoader::CleanFolders()
601 //Cleans all posted objects == removes from folders and deletes them
602 TIter next(fDataLoaders);
604 while ((dl = (AliDataLoader*)next()))
606 if (GetDebug()) Info("CleanFolders","name = %s cleaning",dl->GetName());
610 /*****************************************************************************/
612 /*****************************************************************************/
614 void AliLoader::CleanSDigitizer()
616 //removes and deletes detector task from Run Task
617 TTask* task = AliRunLoader::GetRunSDigitizer();
620 Error("CleanSDigitizer","Can not get RunSDigitizer from folder. Can not clean");
624 if (GetDebug()) Info("CleanSDigitizer","Attempting to delete S Digitizer");
625 delete task->GetListOfTasks()->Remove(SDigitizer()); //TTList::Remove does not delete object
627 /*****************************************************************************/
629 void AliLoader::CleanDigitizer()
631 //removes and deletes detector task from Run Task
632 TTask* task = AliRunLoader::GetRunDigitizer();
635 Error("CleanDigitizer","Can not get RunDigitizer from folder. Can not clean");
640 Info("CleanDigitizer","Attempting to delete Digitizer %X",
641 task->GetListOfTasks()->Remove(Digitizer()));
642 delete task->GetListOfTasks()->Remove(Digitizer()); //TTList::Remove does not delete object
644 /*****************************************************************************/
646 void AliLoader::CleanReconstructioner()
648 //removes and deletes detector Reconstructioner from Run Reconstructioner
649 TTask* task = AliRunLoader::GetRunReconstructioner();
652 Error("CleanReconstructioner","Can not get RunReconstructioner from folder. Can not clean");
657 Info("CleanReconstructioner","Attempting to delete Reconstructioner");
658 delete task->GetListOfTasks()->Remove(Reconstructioner()); //TTList::Remove does not delete object
660 /*****************************************************************************/
662 void AliLoader::CleanTracker()
664 //removes and deletes detector tracker from Run Tracker
665 TTask* task = AliRunLoader::GetRunTracker();
668 Error("CleanTracker","Can not get RunTracker from folder. Can not clean");
673 Info("CleanTracker","Attempting to delete Tracker %X",
674 task->GetListOfTasks()->Remove(Tracker()));
675 delete task->GetListOfTasks()->Remove(Tracker()); //TTList::Remove does not delete object
677 /*****************************************************************************/
679 void AliLoader::CleanPIDTask()
681 //removes and deletes detector Reconstructioner from Run Reconstructioner
682 TTask* task = AliRunLoader::GetRunPIDTask();
685 Error("CleanPIDTask","Can not get Run PID Task from folder. Can not clean");
690 Info("CleanPIDTask","Attempting to delete PID Task");
691 delete task->GetListOfTasks()->Remove(PIDTask()); //TTList::Remove does not delete object
693 /*****************************************************************************/
695 Int_t AliLoader::ReloadAll()
697 TIter next(fDataLoaders);
700 while((dl = (AliDataLoader*)next()))
702 Int_t err = dl->Reload();
705 Error("ReloadAll","Reload returned error for %s",dl->GetName());
711 /*****************************************************************************/
713 void AliLoader::CloseFiles()
715 //close files for data loaders
716 TIter next(fDataLoaders);
718 while((dl = (AliDataLoader*)next()))
723 /*****************************************************************************/
725 Int_t AliLoader::SetEventFolder(TFolder* eventfolder)
727 if (eventfolder == 0x0)
729 Error("SetEventFolder","Stupid joke. Argument is NULL");
733 fEventFolder = eventfolder;
734 TIter next(fDataLoaders);
737 while((dl = (AliDataLoader*)next()))
739 dl->SetEventFolder(fEventFolder);
740 dl->SetFolder(GetDetectorDataFolder()); //Must exists - ensure register is called before
744 }//sets the event folder
745 /*****************************************************************************/
747 Int_t AliLoader::Register(TFolder* eventFolder)
749 //triggers creation of subfolders for a given detector
750 //this method is called when session is read from disk
752 //warning: AliDetector in constructor (not default) calls
753 //creation of folder structure as well (some detectors needs folders
754 //alrady in constructors)
756 if (GetDebug()) Info("Register","Name is %s.",GetName());
757 if (eventFolder == 0x0)
759 Error("Register","Event folder is not set.");
762 Int_t retval = AliConfig::Instance()->AddDetector(eventFolder,fDetectorName,fDetectorName);
765 Error("SetEventFolder","Can not create tasks and/or folders for %s. Event folder name is %s",
766 fDetectorName.Data(),eventFolder->GetName());
769 SetEventFolder(eventFolder);
772 /*****************************************************************************/
773 AliRunLoader* AliLoader::GetRunLoader()
775 //gets the run-loader from event folder
776 AliRunLoader* rg = 0x0;
777 TObject * obj = GetEventFolder()->FindObject(AliRunLoader::fgkRunLoaderName);
778 if (obj) rg = dynamic_cast<AliRunLoader*>(obj);
781 /*****************************************************************************/
782 Bool_t AliLoader::TestFileOption(Option_t* opt)
784 //tests the TFile::Option
785 //if file is truncated at opening moment ("recreate", "new" or "create") returns kFALSE;
786 //else kTRUE (means opened with "read" or "update" mode)
788 if (option.CompareTo("recreate",TString::kIgnoreCase) == 0) return kFALSE;
789 if (option.CompareTo("new",TString::kIgnoreCase) == 0) return kFALSE;
790 if (option.CompareTo("create",TString::kIgnoreCase) == 0) return kFALSE;
793 /*****************************************************************************/
794 void AliLoader::SetDirName(TString& dirname)
796 //adds "dirname/" to each file
797 TIter next(fDataLoaders);
799 while((dl = (AliDataLoader*)next()))
801 dl->SetDirName(dirname);
805 /*****************************************************************************/
807 void AliLoader::SetDigitsFileNameSuffix(const TString& suffix)
809 //adds the suffix before ".root",
810 //e.g. TPC.Digits.root -> TPC.DigitsMerged.root
811 //made on Jiri Chudoba demand
812 GetDigitsDataLoader()->SetFileNameSuffix(suffix);
814 /*****************************************************************************/
816 void AliLoader::SetCompressionLevel(Int_t cl)
818 //sets comression level for data defined by di
819 TIter next(fDataLoaders);
821 while((dl = (AliDataLoader*)next()))
823 dl->SetCompressionLevel(cl);
826 /*****************************************************************************/
828 void AliLoader::Clean()
830 //Cleans all data loaders
831 TIter next(fDataLoaders);
833 while((dl = (AliDataLoader*)next()))
838 /*****************************************************************************/
840 void AliLoader::Clean(const TString& name)
842 TObject* obj = GetDetectorDataFolder()->FindObject(name);
846 Info("Clean(const TString&)","name=%s, cleaning %s.",GetName(),name.Data());
847 GetDetectorDataFolder()->Remove(obj);
852 /*****************************************************************************/
854 Bool_t AliLoader::IsOptionWritable(const TString& opt)
856 if (opt.CompareTo("recreate",TString::kIgnoreCase)) return kTRUE;
857 if (opt.CompareTo("new",TString::kIgnoreCase)) return kTRUE;
858 if (opt.CompareTo("create",TString::kIgnoreCase)) return kTRUE;
859 if (opt.CompareTo("update",TString::kIgnoreCase)) return kTRUE;
862 /*****************************************************************************/
864 void AliLoader::SetTAddrInDet()
866 //calls SetTreeAddress for corresponding detector
867 AliRunLoader* rl = GetRunLoader();
868 if (rl == 0x0) return;
869 AliRun* ar = rl->GetAliRun();
870 if (ar == 0x0) return;
871 AliDetector* det = ar->GetDetector(fDetectorName);
872 if (det == 0x0) return;
873 det->SetTreeAddress();
875 /*****************************************************************************/
877 void AliLoader::Synchronize()
879 //synchrinizes all writtable files
880 TIter next(fDataLoaders);
882 while ((dl = (AliDataLoader*)next()))
888 /*****************************************************************************/
889 /*****************************************************************************/
890 /*****************************************************************************/