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>
27 #include "AliConfig.h"
29 Int_t AliLoader::fgDebug = 0;
31 const TString AliLoader::fgkDefaultHitsContainerName("TreeH");
32 const TString AliLoader::fgkDefaultDigitsContainerName = "TreeD";
33 const TString AliLoader::fgkDefaultSDigitsContainerName = "TreeS";
34 const TString AliLoader::fgkDefaultRecPointsContainerName = "TreeR";
35 const TString AliLoader::fgkDefaultTracksContainerName = "TreeT";
36 const TString AliLoader::fgkDefaultRecParticlesContainerName = "TreeP";
37 const TString AliLoader::fgkLoaderBaseName("Loader");
40 //___________________________________________________________________
41 /////////////////////////////////////////////////////////////////////
45 // Base class for Loaders. //
46 // Loader provides base I/O fascilities for "standard" data. //
47 // Each detector has a laoder data member //
48 // loader is accessible via folder structure as well //
50 /////////////////////////////////////////////////////////////////////
52 /*****************************************************************************/
54 AliLoader::AliLoader():
59 fDetectorDataFolder(0x0),
67 /******************************************************************/
69 AliLoader::AliLoader(const Char_t* detname,const Char_t* eventfoldername):
70 fDataLoaders(new TObjArray(kNDataTypes)),
74 fDetectorDataFolder(0x0),
80 if (GetDebug()) Info("AliLoader(const Char_t* detname,const Char_t* eventfoldername)",
81 "detname = %s eventfoldername = %s",detname,eventfoldername);
83 //try to find folder eventfoldername in top alice folder
84 //safe because GetTopFolder will abort in case of failure
86 fDetectorName = detname;
87 fName = fDetectorName+"Loader";
90 TObject* fobj = GetTopFolder()->FindObject(eventfoldername);
91 fEventFolder = (fobj)?dynamic_cast<TFolder*>(fobj):0x0;//in case FindObject returns NULL dynamic cast cause seg. fault
92 SetEventFolder(fEventFolder);
95 /*****************************************************************************/
97 AliLoader::AliLoader(const Char_t * detname,TFolder* eventfolder):
98 fDataLoaders(new TObjArray(kNDataTypes)),
99 fDetectorName(detname),
102 fDetectorDataFolder(0x0),
108 fDetectorName = detname;
109 fName = fDetectorName+"Loader";
111 SetEventFolder(eventfolder);
112 //fileoption's don't need to initialized because default TString ctor does it correctly
114 /*****************************************************************************/
115 AliLoader::AliLoader(const AliLoader& source):TNamed(source) {
116 // dummy copy constructor
117 if(&source==this)return;
119 Fatal("AliLoader","Copy constructor not implemented. Aborting");
123 /*****************************************************************************/
124 AliLoader& AliLoader::operator=(const AliLoader& source) {
125 // dummy assignment operator
126 if(&source==this) return *this;
128 Fatal("AliLoader","Assignment operator not implemented. Aborting");
132 /*****************************************************************************/
133 AliLoader::~AliLoader()
136 if (fDataLoaders) fDataLoaders->SetOwner();
139 /*****************************************************************************/
141 void AliLoader::InitDefaults()
145 dl = new AliDataLoader(fDetectorName + ".Hits.root",fgkDefaultHitsContainerName, "Hits" );
146 fDataLoaders->AddAt(dl,kHits);
149 // S U M M A B L E D I G I T S
150 dl = new AliDataLoader(fDetectorName + ".SDigits.root",fgkDefaultSDigitsContainerName, "Summable Digits");
151 AliTaskLoader* tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetSDigitizerTaskName(),
152 dl,AliRunLoader::GetRunSDigitizer(),kTRUE);
153 dl->SetBaseTaskLoader(tl);
154 fDataLoaders->AddAt(dl,kSDigits);
157 dl = new AliDataLoader(fDetectorName + ".Digits.root",fgkDefaultDigitsContainerName, "Digits");
158 tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetDigitizerTaskName(),
159 dl,AliRunLoader::GetRunDigitizer(),kTRUE);
160 dl->SetBaseTaskLoader(tl);
161 fDataLoaders->AddAt(dl,kDigits);
163 // 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
164 dl = new AliDataLoader(fDetectorName + ".RecPoints.root",fgkDefaultRecPointsContainerName, "Reconstructed Points");
165 tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetReconstructionerTaskName(),
166 dl,AliRunLoader::GetRunReconstructioner(),kTRUE);
167 dl->SetBaseTaskLoader(tl);
168 fDataLoaders->AddAt(dl,kRecPoints);
171 dl = new AliDataLoader(fDetectorName + ".Tracks.root",fgkDefaultTracksContainerName, "Tracks");
172 tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetTrackerTaskName(),
173 dl,AliRunLoader::GetRunTracker(),kTRUE);
174 dl->SetBaseTaskLoader(tl);
175 fDataLoaders->AddAt(dl,kTracks);
177 // 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
178 dl = new AliDataLoader(fDetectorName + ".RecParticles.root",fgkDefaultRecParticlesContainerName, "Reconstructed Particles");
179 tl = new AliTaskLoader(fDetectorName + AliConfig::Instance()->GetPIDTaskName(),
180 dl,AliRunLoader::GetRunPIDTask(),kTRUE);
181 dl->SetBaseTaskLoader(tl);
182 fDataLoaders->AddAt(dl,kRecParticles);
185 /*****************************************************************************/
187 AliDataLoader* AliLoader::GetDataLoader(const char* name)
189 //returns Data Loader with specified name
190 return dynamic_cast<AliDataLoader*>(fDataLoaders->FindObject(name));
192 /*****************************************************************************/
194 Int_t AliLoader::SetEvent()
196 //basically the same that GetEvent but do not post data to folders
197 TIter next(fDataLoaders);
199 while ((dl = (AliDataLoader*)next()))
205 /******************************************************************/
207 void AliLoader::UnloadAll()
209 //calls UnloadAll for all base laoders
211 TIter next(fDataLoaders);
213 while ((dl = (AliDataLoader*)next()))
218 /******************************************************************/
220 Int_t AliLoader::GetEvent()
222 //changes to proper root directory and tries to load data from files to folders
223 // event number is defined in RunLoader
226 // 0 - in case of no error
227 // 1 - event not found
231 TIter next(fDataLoaders);
233 while ((dl = (AliDataLoader*)next()))
235 retval = dl->GetEvent();
238 Error("GetEvent","Error occured while GetEvent for %s",dl->GetName());
246 /******************************************************************/
248 TFolder* AliLoader::GetTopFolder()
250 //returns TOP aliroot folder, just a simple interface to AliConfig (gives shorter notation)
251 return AliConfig::Instance()->GetTopFolder();
254 /******************************************************************/
256 TFolder* AliLoader::GetEventFolder()
258 //get EVENT folder (data that are changing from event to event, even in single run)
261 /******************************************************************/
262 TFolder* AliLoader::GetDataFolder()
264 //returns the folder speciofic to given detector e.g. /Folders/Event/Data/
267 fDataFolder = dynamic_cast<TFolder*>(GetEventFolder()->FindObject(AliConfig::fgkDataFolderName));
271 Fatal("GetDataFolder","Can not find AliRoot data folder. Aborting");
278 /*****************************************************************************/
280 TFolder* AliLoader::GetTasksFolder()
282 //Returns pointer to Folder with Alice Tasks
285 fTasksFolder = dynamic_cast<TFolder*>(GetTopFolder()->FindObject(AliConfig::fgkTasksFolderName));
289 Fatal("GetTasksFolder","Can not find tasks folder. Aborting");
296 /*****************************************************************************/
298 TFolder* AliLoader::GetModulesFolder()
300 //returns pointer to the folder containing modules
303 fModuleFolder = dynamic_cast<TFolder*>(GetEventFolder()->FindObjectAny(AliConfig::GetModulesFolderName()));
307 Fatal("GetModulesFolder","Can not find modules folder. Aborting");
311 return fModuleFolder;
314 /*****************************************************************************/
316 TFolder* AliLoader::GetQAFolder()
318 //returns folder with Quality assurance
319 if (fQAFolder == 0x0)
321 TObject *obj = GetEventFolder()->FindObjectAny(AliConfig::Instance()->GetQAFolderName());
322 fQAFolder = (obj)?dynamic_cast<TFolder*>(obj):0x0;
324 if (fQAFolder == 0x0)
326 Fatal("GetQAFolder","Can not find Quality Assurance folder. Aborting");
333 /*****************************************************************************/
334 TTask* AliLoader::SDigitizer() const
336 //returns SDigitizer task for this detector
337 return GetSDigitsDataLoader()->GetBaseTaskLoader()->Task();
340 /*****************************************************************************/
342 AliDigitizer* AliLoader::Digitizer() const
344 //returns Digitizer task for this detector
345 return dynamic_cast<AliDigitizer*>(GetDigitsDataLoader()->GetBaseTaskLoader()->Task());
347 /*****************************************************************************/
349 TTask* AliLoader::Reconstructioner() const
351 //returns Recontructioner (Cluster Finder, Cluster Maker,
352 //or whatever you want to call it) task for this detector
353 return GetRecPointsDataLoader()->GetBaseTaskLoader()->Task();
355 /*****************************************************************************/
357 TTask* AliLoader::Tracker() const
360 return dynamic_cast<TTask*>(GetTracksDataLoader()->GetBaseTaskLoader()->Task());
363 /*****************************************************************************/
364 TTask* AliLoader::PIDTask() const
367 return dynamic_cast<TTask*>(GetRecParticlesDataLoader()->GetBaseTaskLoader()->Task());
370 /*****************************************************************************/
372 TTask* AliLoader::QAtask(const char* name) const
374 // Returns pointer to the quality assurance task
375 TTask* qat = AliRunLoader::GetRunQATask();
378 Error("QAtask","Can not get RunQATask. (Name:%s)",GetName());
382 TString dqatname(fDetectorName + AliConfig::Instance()->GetQATaskName());
383 TTask* dqat = dynamic_cast<TTask*>(qat->GetListOfTasks()->FindObject(dqatname));
387 Error("QAtask","Can not find QATask in RunQATask for %s",GetDetectorName().Data());
391 if (strlen(name) == 0) return dqat;
393 TList* list = dqat->GetListOfTasks();
397 while((task = static_cast<TTask *>(it.Next()) ))
399 TString taskname(task->GetName()) ;
400 if(taskname.BeginsWith(name))
403 Error("QAtask","Can not find sub-task with name starting with %s in task %s",name,dqat->GetName());
406 /*****************************************************************************/
408 TDirectory* AliLoader::ChangeDir(TFile* file, Int_t eventno)
410 //changes the root directory in "file" to "dirname" which corresponds to event 'eventno'
411 //in case of success returns the pointer to directory
416 ::Error("AliLoader::ChangeDir","File is null");
419 if (file->IsOpen() == kFALSE)
421 ::Error("AliLoader::ChangeDir","File is not opened");
425 TString dirname("Event");
427 if (AliLoader::fgDebug > 1)
428 ::Info("AliLoader::ChangeDir","Changing Dir to %s in file %s.",dirname.Data(),file->GetName());
432 TDirectory* dir = dynamic_cast<TDirectory*>(file->Get(dirname));
436 if (AliLoader::fgDebug > 1)
437 ::Info("AliLoader::ChangeDir","Can not find directory %s in file %s, creating...",
438 dirname.Data(),file->GetName());
440 if (file->IsWritable() == kFALSE)
442 ::Error("AliLoader::ChangeDir","Can not create directory. File %s in not writable.",
447 TDirectory* newdir = file->mkdir(dirname);
450 ::Error("AliLoader::ChangeDir","Failed to create new directory in file %s.",
454 result = file->cd(dirname);
455 if (result == kFALSE)
462 file->cd();//make a file active
463 file->cd(dirname);//cd event dir
468 /*****************************************************************************/
470 TString AliLoader::GetUnixDir() const
472 //This Method will manage jumping through unix directories in case of
473 //run with more events per run than defined in gAlice
479 /*****************************************************************************/
480 /************************************************************/
482 void AliLoader::MakeTree(Option_t *option)
484 //Makes a tree depending on option
487 // S: - Summable Digits
488 // R: - Reconstructed Points (clusters)
489 // T: - Tracks (tracklets)
491 const char *oH = strstr(option,"H");
492 const char *oD = strstr(option,"D");
493 const char *oS = strstr(option,"S");
494 const char *oR = strstr(option,"R");
495 const char *oT = strstr(option,"T");
496 const char *oP = strstr(option,"P");
498 if (oH) MakeHitsContainer();
499 if (oD) MakeDigitsContainer();
500 if (oS) MakeSDigitsContainer();
501 if (oR) MakeRecPointsContainer();
502 if (oT) MakeTracksContainer();
503 if (oP) MakeRecParticlesContainer();
506 /*****************************************************************************/
507 Int_t AliLoader::WriteHits(Option_t* opt) const
510 AliDataLoader* dl = GetHitsDataLoader();
511 Int_t ret = dl->WriteData(opt);
514 /*****************************************************************************/
516 Int_t AliLoader::WriteSDigits(Option_t* opt) const
518 // Writes summable digits
519 AliDataLoader* dl = GetSDigitsDataLoader();
520 Int_t ret = dl->WriteData(opt);
524 /*****************************************************************************/
526 Int_t AliLoader::PostSDigitizer(TTask* sdzer) const
529 return GetSDigitsDataLoader()->GetBaseTaskLoader()->Post(sdzer);
531 /*****************************************************************************/
533 Int_t AliLoader::PostDigitizer(AliDigitizer* task) const
536 return GetDigitsDataLoader()->GetBaseTaskLoader()->Post(task);
538 /*****************************************************************************/
540 Int_t AliLoader::PostReconstructioner(TTask* task) const
542 // Posts Reconstructioner
543 return GetRecPointsDataLoader()->GetBaseTaskLoader()->Post(task);
545 /*****************************************************************************/
547 Int_t AliLoader::PostTracker(TTask* task) const
550 return GetTracksDataLoader()->GetBaseTaskLoader()->Post(task);
552 /*****************************************************************************/
554 Int_t AliLoader::PostPIDTask(TTask* task) const
556 // Posts particle identification task
557 return GetRecParticlesDataLoader()->GetBaseTaskLoader()->Post(task);
559 /*****************************************************************************/
561 TObject** AliLoader::GetDetectorDataRef(TObject *obj)
563 // Returns pointer to an entry in the list of folders pointing to "obj"
568 return GetDetectorDataFolder()->GetListOfFolders()->GetObjectRef(obj) ;
570 /*****************************************************************************/
572 TObject** AliLoader::SDigitizerRef()
574 // Returns pointer to a Runloader's task-list entry pointing to SDigitizer
575 TTask* rsd = AliRunLoader::GetRunSDigitizer();
580 return rsd->GetListOfTasks()->GetObjectRef(SDigitizer());
582 /*****************************************************************************/
584 TObject** AliLoader::DigitizerRef()
586 // Returns pointer to a Runloader's task-list entry pointing to Digitizer
587 TTask* rd = AliRunLoader::GetRunDigitizer();
592 return rd->GetListOfTasks()->GetObjectRef(Digitizer()) ;
594 /*****************************************************************************/
596 TObject** AliLoader::ReconstructionerRef()
598 // Returns pointer to a Runloader's task-list entry pointing to Reconstructioner
599 TTask* rrec = AliRunLoader::GetRunReconstructioner();
604 return rrec->GetListOfTasks()->GetObjectRef(Reconstructioner());
606 /*****************************************************************************/
608 TObject** AliLoader::TrackerRef()
610 // Returns pointer to a Runloader's task-list entry pointing to Tracker
611 TTask* rrec = AliRunLoader::GetRunTracker();
616 return rrec->GetListOfTasks()->GetObjectRef(Tracker());
618 /*****************************************************************************/
620 TObject** AliLoader::PIDTaskRef()
622 // Returns pointer to a Runloader's task-list entry pointing to PIDTask
623 TTask* rrec = AliRunLoader::GetRunPIDTask();
628 return rrec->GetListOfTasks()->GetObjectRef(PIDTask());
631 /*****************************************************************************/
632 void AliLoader::CleanFolders()
634 //Cleans all posted objects == removes from folders and deletes them
635 TIter next(fDataLoaders);
637 while ((dl = (AliDataLoader*)next()))
639 if (GetDebug()) Info("CleanFolders","name = %s cleaning",dl->GetName());
643 /*****************************************************************************/
645 /*****************************************************************************/
647 void AliLoader::CleanSDigitizer()
649 //removes and deletes detector task from Run Task
650 TTask* task = AliRunLoader::GetRunSDigitizer();
653 Error("CleanSDigitizer","Can not get RunSDigitizer from folder. Can not clean");
657 if (GetDebug()) Info("CleanSDigitizer","Attempting to delete S Digitizer");
658 delete task->GetListOfTasks()->Remove(SDigitizer()); //TTList::Remove does not delete object
660 /*****************************************************************************/
662 void AliLoader::CleanDigitizer()
664 //removes and deletes detector task from Run Task
665 TTask* task = AliRunLoader::GetRunDigitizer();
668 Error("CleanDigitizer","Can not get RunDigitizer from folder. Can not clean");
673 Info("CleanDigitizer","Attempting to delete Digitizer %X",
674 task->GetListOfTasks()->Remove(Digitizer()));
675 delete task->GetListOfTasks()->Remove(Digitizer()); //TTList::Remove does not delete object
677 /*****************************************************************************/
679 void AliLoader::CleanReconstructioner()
681 //removes and deletes detector Reconstructioner from Run Reconstructioner
682 TTask* task = AliRunLoader::GetRunReconstructioner();
685 Error("CleanReconstructioner","Can not get RunReconstructioner from folder. Can not clean");
690 Info("CleanReconstructioner","Attempting to delete Reconstructioner");
691 delete task->GetListOfTasks()->Remove(Reconstructioner()); //TTList::Remove does not delete object
693 /*****************************************************************************/
695 void AliLoader::CleanTracker()
697 //removes and deletes detector tracker from Run Tracker
698 TTask* task = AliRunLoader::GetRunTracker();
701 Error("CleanTracker","Can not get RunTracker from folder. Can not clean");
706 Info("CleanTracker","Attempting to delete Tracker %X",
707 task->GetListOfTasks()->Remove(Tracker()));
708 delete task->GetListOfTasks()->Remove(Tracker()); //TTList::Remove does not delete object
710 /*****************************************************************************/
712 void AliLoader::CleanPIDTask()
714 //removes and deletes detector Reconstructioner from Run Reconstructioner
715 TTask* task = AliRunLoader::GetRunPIDTask();
718 Error("CleanPIDTask","Can not get Run PID Task from folder. Can not clean");
723 Info("CleanPIDTask","Attempting to delete PID Task");
724 delete task->GetListOfTasks()->Remove(PIDTask()); //TTList::Remove does not delete object
726 /*****************************************************************************/
728 Int_t AliLoader::ReloadAll()
730 // Calling Reload function for all the data loaders
731 TIter next(fDataLoaders);
734 while((dl = (AliDataLoader*)next()))
736 Int_t err = dl->Reload();
739 Error("ReloadAll","Reload returned error for %s",dl->GetName());
745 /*****************************************************************************/
747 void AliLoader::CloseFiles()
749 //close files for data loaders
750 TIter next(fDataLoaders);
752 while((dl = (AliDataLoader*)next()))
757 /*****************************************************************************/
759 Int_t AliLoader::SetEventFolder(TFolder* eventfolder)
761 //sets the event folder
762 if (eventfolder == 0x0)
764 Error("SetEventFolder","Stupid joke. Argument is NULL");
768 fEventFolder = eventfolder;
769 TIter next(fDataLoaders);
772 while((dl = (AliDataLoader*)next()))
774 dl->SetEventFolder(fEventFolder);
775 dl->SetFolder(GetDetectorDataFolder()); //Must exists - ensure register is called before
779 }//sets the event folder
780 /*****************************************************************************/
782 Int_t AliLoader::Register(TFolder* eventFolder)
784 //triggers creation of subfolders for a given detector
785 //this method is called when session is read from disk
787 //warning: AliDetector in constructor (not default) calls
788 //creation of folder structure as well (some detectors needs folders
789 //alrady in constructors)
791 if (GetDebug()) Info("Register","Name is %s.",GetName());
792 if (eventFolder == 0x0)
794 Error("Register","Event folder is not set.");
797 Int_t retval = AliConfig::Instance()->AddDetector(eventFolder,fDetectorName,fDetectorName);
800 Error("SetEventFolder","Can not create tasks and/or folders for %s. Event folder name is %s",
801 fDetectorName.Data(),eventFolder->GetName());
804 SetEventFolder(eventFolder);
807 /*****************************************************************************/
808 AliRunLoader* AliLoader::GetRunLoader()
810 //gets the run-loader from event folder
811 AliRunLoader* rg = 0x0;
812 TObject * obj = GetEventFolder()->FindObject(AliRunLoader::fgkRunLoaderName);
813 if (obj) rg = dynamic_cast<AliRunLoader*>(obj);
816 /*****************************************************************************/
817 Bool_t AliLoader::TestFileOption(Option_t* opt)
819 //tests the TFile::Option
820 //if file is truncated at opening moment ("recreate", "new" or "create") returns kFALSE;
821 //else kTRUE (means opened with "read" or "update" mode)
823 if (option.CompareTo("recreate",TString::kIgnoreCase) == 0) return kFALSE;
824 if (option.CompareTo("new",TString::kIgnoreCase) == 0) return kFALSE;
825 if (option.CompareTo("create",TString::kIgnoreCase) == 0) return kFALSE;
828 /*****************************************************************************/
829 void AliLoader::SetDirName(TString& dirname)
831 //adds "dirname/" to each file
832 TIter next(fDataLoaders);
834 while((dl = (AliDataLoader*)next()))
836 dl->SetDirName(dirname);
840 /*****************************************************************************/
842 void AliLoader::SetDigitsFileNameSuffix(const TString& suffix) const
844 //adds the suffix before ".root",
845 //e.g. TPC.Digits.root -> TPC.DigitsMerged.root
846 //made on Jiri Chudoba demand
847 GetDigitsDataLoader()->SetFileNameSuffix(suffix);
849 /*****************************************************************************/
851 void AliLoader::SetCompressionLevel(Int_t cl)
853 //sets comression level for data defined by di
854 TIter next(fDataLoaders);
856 while((dl = (AliDataLoader*)next()))
858 dl->SetCompressionLevel(cl);
861 /*****************************************************************************/
863 void AliLoader::Clean()
865 //Cleans all data loaders
866 TIter next(fDataLoaders);
868 while((dl = (AliDataLoader*)next()))
873 /*****************************************************************************/
875 void AliLoader::Clean(const TString& name)
877 // Removes object with "name" from the detector's data folder
878 // and from the memory
879 TObject* obj = GetDetectorDataFolder()->FindObject(name);
883 Info("Clean(const TString&)","name=%s, cleaning %s.",GetName(),name.Data());
884 GetDetectorDataFolder()->Remove(obj);
889 /*****************************************************************************/
891 Bool_t AliLoader::IsOptionWritable(const TString& opt)
893 // Returns "true" if the option means also "writable"
894 if (opt.CompareTo("recreate",TString::kIgnoreCase)) return kTRUE;
895 if (opt.CompareTo("new",TString::kIgnoreCase)) return kTRUE;
896 if (opt.CompareTo("create",TString::kIgnoreCase)) return kTRUE;
897 if (opt.CompareTo("update",TString::kIgnoreCase)) return kTRUE;
900 /*****************************************************************************/
902 void AliLoader::SetTAddrInDet()
904 //calls SetTreeAddress for corresponding detector
905 AliRunLoader* rl = GetRunLoader();
906 if (rl == 0x0) return;
907 AliRun* ar = rl->GetAliRun();
908 if (ar == 0x0) return;
909 AliDetector* det = ar->GetDetector(fDetectorName);
910 if (det == 0x0) return;
911 det->SetTreeAddress();
913 /*****************************************************************************/
915 void AliLoader::Synchronize()
917 //synchrinizes all writtable files
918 TIter next(fDataLoaders);
920 while ((dl = (AliDataLoader*)next()))
926 /*****************************************************************************/
927 /*****************************************************************************/
928 /*****************************************************************************/