]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliDataLoader.cxx
AODZDC introduced.
[u/mrichter/AliRoot.git] / STEER / AliDataLoader.cxx
CommitLineData
88cb7938 1/////////////////////////////////////////////////////////////////////////////////////////////
2// //
3// class AliDataLoader //
4// //
5// Container of all data needed for full //
6// description of each data type //
7// (Hits, Kine, ...) //
8// //
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 //
15// //
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 //
21// //
22// //
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 //
26// //
27/////////////////////////////////////////////////////////////////////////////////////////////
28
a9bbb414 29/* $Id$ */
30
a9bbb414 31#include "AliDataLoader.h"
88cb7938 32#include "AliRunLoader.h"
c93255fe 33#include "AliLoader.h"
34#include "AliObjectLoader.h"
a9bbb414 35#include "AliTreeLoader.h"
c93255fe 36#include "AliTaskLoader.h"
37#include "AliLog.h"
38
39#include <TFile.h>
40#include <TROOT.h>
41#include <TString.h>
42#include <TBits.h>
88cb7938 43
44ClassImp(AliDataLoader)
45
a9bbb414 46//______________________________________________________________________________
88cb7938 47AliDataLoader::AliDataLoader():
48 fFileName(0),
49 fFile(0x0),
50 fDirectory(0x0),
51 fFileOption(),
52 fCompressionLevel(2),
18b43626 53 fNEventsPerFile(0),
88cb7938 54 fBaseLoaders(0x0),
55 fHasTask(kFALSE),
56 fTaskName(),
57 fParentalTask(0x0),
58 fEventFolder(0x0),
59 fFolder(0x0)
60{
61
62}
88cb7938 63
a9bbb414 64//______________________________________________________________________________
65AliDataLoader::AliDataLoader(const char* filename, const char* contname,
66 const char* name, Option_t* opt):
88cb7938 67 TNamed(name,name),
68 fFileName(filename),
69 fFile(0x0),
70 fDirectory(0x0),
71 fFileOption(0),
72 fCompressionLevel(2),
18b43626 73 fNEventsPerFile(0),
88cb7938 74 fBaseLoaders(new TObjArray(4)),
75 fHasTask(kFALSE),
76 fTaskName(),
77 fParentalTask(0x0),
78 fEventFolder(0x0),
79 fFolder(0x0)
80{
a9bbb414 81 //constructor
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
21bf7095 85 AliDebug(1, Form("File name is %s",fFileName.Data()));
a9bbb414 86
88cb7938 87 TString option(opt);
88 AliBaseLoader* bl;
89 if (option.CompareTo("T",TString::kIgnoreCase) == 0)
90 bl = new AliTreeLoader(contname,this);
91 else
92 bl = new AliObjectLoader(contname,this);
93 fBaseLoaders->AddAt(bl,kData);
94
95}
a9bbb414 96
a9bbb414 97//______________________________________________________________________________
88cb7938 98AliDataLoader::~AliDataLoader()
99{
a9bbb414 100 //
101 //dtor
102 //
103 UnloadAll();
88cb7938 104}
88cb7938 105
a9bbb414 106//______________________________________________________________________________
88cb7938 107Int_t AliDataLoader::SetEvent()
108{
a9bbb414 109 //
110 // The same that GetEvent but do not post data to folders
111 //
112 AliRunLoader* rl = GetRunLoader();
113 if (rl == 0x0)
114 {
115 AliError("Can not get RunGettr");
116 return 1;
117 }
118
119 Int_t evno = rl->GetEventNumber();
120
121 TIter next(fBaseLoaders);
122 AliBaseLoader* bl;
123 while ((bl = (AliBaseLoader*)next()))
124 {
125 if (bl->DoNotReload() == kFALSE) bl->Clean();
126 }
127
128 if(fFile)
129 {
130 if (CheckReload())
131 {
132 delete fFile;
133 fFile = 0x0;
134 AliDebug(1, Form("Reloading new file. File opt is %s",fFileOption.Data()));
135 OpenFile(fFileOption);
136 }
137
138 fDirectory = AliLoader::ChangeDir(fFile,evno);
139 if (fDirectory == 0x0)
140 {
141 AliError(Form("Can not chage directory in file %s",fFile->GetName()));
142 return 1;
143 }
144 }
145 return 0;
88cb7938 146}
88cb7938 147
a9bbb414 148//______________________________________________________________________________
88cb7938 149Int_t AliDataLoader::GetEvent()
150{
a9bbb414 151 // posts all loaded data from files to White Board
152 // event number is defined in RunLoader
153 //
154 //returns:
155 // 0 - in case of no error
156 // 1 - event not found
157 //
158 //for each base laoder post, if was loaded before GetEvent
159
160 //call set event to switch to new directory in file
161
162
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
166
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);
170 AliBaseLoader* bl;
171 while ((bl = (AliBaseLoader*)nextbl()))
172 {
173 if (bl->IsLoaded())
174 {
175 if (bl->DoNotReload() == kFALSE) bl->Post();
176 }
177 }
178 }
179 return 0;
88cb7938 180}
88cb7938 181
a9bbb414 182//______________________________________________________________________________
88cb7938 183Int_t AliDataLoader::OpenFile(Option_t* opt)
184{
a9bbb414 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
88cb7938 188 if (fFile)
a9bbb414 189 {
190 if(fFile->IsOpen() == kTRUE)
191 {
192 AliWarning(Form(" File %s already opened. First close it.",fFile->GetName()));
193 return 0;
194 }
195 else
196 {
197 AliWarning(Form("Pointer to file %s is not null, but file is not opened",
198 fFile->GetName()));
199 delete fFile;
200 fFile = 0x0;
201 }
202 }
88cb7938 203
204 TString fname(SetFileOffset(fFileName));
205
206 fFile = (TFile *)(gROOT->GetListOfFiles()->FindObject(fname));
207 if (fFile)
a9bbb414 208 {
209 if(fFile->IsOpen() == kTRUE)
210 {
eeb1fb79 211 TString option1 = fFile->GetOption();
212 if (option1.CompareTo("read",TString::kIgnoreCase) == 0)
213 {
214 AliInfo(Form("File %s already opened in read mode.",fFile->GetName()));
215 }
216 else
217 {
218 TString option2 = opt;
219 if (option2.CompareTo("read",TString::kIgnoreCase) == 0)
220 {
221 AliInfo(Form("Open already opened file %s in read mode.",fFile->GetName()));
222 }
223 else {
224 AliWarning(Form("File %s already opened by sombody else. First close it.",
225 fFile->GetName()));
226 return 0;
227 }
228 }
a9bbb414 229 }
230 }
88cb7938 231
232 fFileOption = opt;
233 fFile = TFile::Open(fname,fFileOption);//open the file
234 if (fFile == 0x0)
a9bbb414 235 {//file is null
236 AliError(Form("Can not open file %s",fname.Data()));
237 return 1;
238 }
88cb7938 239 if (fFile->IsOpen() == kFALSE)
a9bbb414 240 {//file is null
241 AliError(Form("Can not open file %s",fname.Data()));
242 return 1;
243 }
244
88cb7938 245 fFile->SetCompressionLevel(fCompressionLevel);
246
247 AliRunLoader* rg = GetRunLoader();
248 if (rg == 0x0)
a9bbb414 249 {
250 AliError("Can not find Run-Loader in folder.");
251 return 2;
252 }
88cb7938 253 Int_t evno = rg->GetEventNumber();
254
255 fDirectory = AliLoader::ChangeDir(fFile,evno);
256 if (fDirectory == 0x0)
a9bbb414 257 {
258 AliError(Form("Can not chage fDirectory in file %s.",fFile->GetName()));
259 return 3;
260 }
88cb7938 261 return 0;
262}
88cb7938 263
a9bbb414 264//______________________________________________________________________________
88cb7938 265void AliDataLoader::Unload()
266{
a9bbb414 267 //
268 //unloads main data - shortcut method
269 //
88cb7938 270 GetBaseLoader(0)->Unload();
271}
88cb7938 272
a9bbb414 273//______________________________________________________________________________
88cb7938 274void AliDataLoader::UnloadAll()
275{
a9bbb414 276 //
277 // Unloads all data and tasks
278 //
279 if ( fFile == 0x0 ) return; //nothing loaded
280
281 TIter next(fBaseLoaders);
282 AliBaseLoader* bl;
283 while ((bl = (AliBaseLoader*)next()))
284 {
285 bl->Unload();
286 }
88cb7938 287}
88cb7938 288
a9bbb414 289
290//______________________________________________________________________________
88cb7938 291Int_t AliDataLoader::Reload()
292{
a9bbb414 293 //
294 // Unloads and loads data again
295 //
296 if ( fFile == 0x0 ) return 0;
297
298 TBits loaded(fBaseLoaders->GetEntries());
299 TIter next(fBaseLoaders);
300 AliBaseLoader* bl;
301
302 Int_t i = 0;
303 while ((bl = (AliBaseLoader*)next()))
304 {
305 if (bl->IsLoaded())
306 {
307 loaded.SetBitNumber(i++,kTRUE);
308 bl->Unload();
309 }
310 }
311
312 Int_t retval;
313 i = 0;
314 next.Reset();
315 while ((bl = (AliBaseLoader*)next()))
316 {
317 if (loaded.TestBitNumber(i++))
318 {
319 retval = bl->Load(fFileOption);
320 if (retval)
321 {
322 AliError(Form("Error occur while loading %s",bl->GetName()));
323 return retval;
324 }
325 }
326 }
327 return 0;
328}
88cb7938 329
88cb7938 330
a9bbb414 331//______________________________________________________________________________
88cb7938 332Int_t AliDataLoader::WriteData(Option_t* opt)
333{
a9bbb414 334 //
335 // Writes primary data == first BaseLoader
336 //
21bf7095 337 AliDebug(1, Form("Writing %s container for %s data. Option is %s.",
338 GetBaseLoader(0)->GetName(),GetName(),opt));
88cb7938 339 return GetBaseLoader(0)->WriteData(opt);
340}
88cb7938 341
a9bbb414 342//______________________________________________________________________________
88cb7938 343Int_t AliDataLoader::Load(Option_t* opt)
344{
a9bbb414 345 //
346 // Writes primary data == first BaseLoader
347 //
88cb7938 348 return GetBaseLoader(0)->Load(opt);
349}
88cb7938 350
a9bbb414 351//______________________________________________________________________________
88cb7938 352Int_t AliDataLoader::SetEventFolder(TFolder* eventfolder)
353{
a9bbb414 354 //
355 // Sets the event folder
356 //
357 if (eventfolder == 0x0)
358 {
359 AliError("Stupid joke. Argument is NULL");
360 return 1;
361 }
362 AliDebug(1, Form("name = %s Setting Event Folder named %s.",
363 GetName(),eventfolder->GetName()));
364
365 fEventFolder = eventfolder;
366 return 0;
88cb7938 367}
88cb7938 368
a9bbb414 369
370//______________________________________________________________________________
88cb7938 371Int_t AliDataLoader::SetFolder(TFolder* folder)
372{
d0d4a6b3 373 // Sets the folder and the data loaders
a9bbb414 374 if (folder == 0x0)
375 {
376 AliError("Stupid joke. Argument is NULL");
88cb7938 377 return 1;
a9bbb414 378 }
379
380 AliDebug(1, Form("name = %s Setting folder named %s.",GetName(),folder->GetName()));
381
382 fFolder = folder;
383 TIter next(fBaseLoaders);
384 AliBaseLoader* bl;
385
386 while ((bl = (AliBaseLoader*)next()))
387 {
388 bl->SetDataLoader(this);
389 }
390
391 return 0;
88cb7938 392}
88cb7938 393
a9bbb414 394//______________________________________________________________________________
88cb7938 395TFolder* AliDataLoader::GetEventFolder()
396{
a9bbb414 397 //
398 // Get EVENT folder
399 // Data that are changing from event to event, even in single run
400 //
21bf7095 401 AliDebug(1, "EF = %#x");
88cb7938 402 return fEventFolder;
403}
88cb7938 404
a9bbb414 405//______________________________________________________________________________
88cb7938 406AliRunLoader* AliDataLoader::GetRunLoader()
407{
a9bbb414 408 //
409 // Gets the run-loader from event folder
410 //
88cb7938 411 AliRunLoader* rg = 0x0;
412 TFolder* ef = GetEventFolder();
413 if (ef == 0x0)
414 {
21bf7095 415 AliError("Can not get event folder.");
88cb7938 416 return 0;
417 }
024a7e64 418 rg = dynamic_cast<AliRunLoader*>(ef->FindObject(AliRunLoader::GetRunLoaderName()));
88cb7938 419 return rg;
420}
421
a9bbb414 422//______________________________________________________________________________
88cb7938 423void AliDataLoader::CloseFile()
424{
a9bbb414 425 //
426 // Closes file
427 //
88cb7938 428 TIter next(fBaseLoaders);
429 AliBaseLoader* bl;
430 while ((bl = (AliBaseLoader*)next()))
a9bbb414 431 {
432 if (bl->IsLoaded()) return;
433 }
88cb7938 434
21bf7095 435 AliDebug(1, "Closing and deleting (object) file.");
a9bbb414 436
88cb7938 437 delete fFile;
438 fFile = 0x0;
439 fDirectory = 0x0;
440}
88cb7938 441
a9bbb414 442
443//______________________________________________________________________________
88cb7938 444void AliDataLoader::Clean()
445{
a9bbb414 446 //
447 // Cleans main data
448 //
88cb7938 449 GetBaseLoader(0)->Clean();
a9bbb414 450}
88cb7938 451
a9bbb414 452//______________________________________________________________________________
88cb7938 453void AliDataLoader::CleanAll()
454{
a9bbb414 455 //
456 // Cleans all folders and tasks
457 //
88cb7938 458 TIter next(fBaseLoaders);
459 AliBaseLoader* bl;
460 while ((bl = (AliBaseLoader*)next()))
a9bbb414 461 {
88cb7938 462 bl->Clean();
a9bbb414 463 }
88cb7938 464}
88cb7938 465
a9bbb414 466//______________________________________________________________________________
88cb7938 467void AliDataLoader::SetFileNameSuffix(const TString& suffix)
468{
a9bbb414 469 //
470 // adds the suffix before ".root",
471 // e.g. TPC.Digits.root -> TPC.DigitsMerged.root
472 // made on Jiri Chudoba demand
473 //
21bf7095 474 AliDebug(1, Form("suffix=%s",suffix.Data()));
475 AliDebug(1, Form(" Digits File Name before: %s",fFileName.Data()));
a9bbb414 476
eeb1fb79 477 static const TString dotroot(".root");
88cb7938 478 const TString& suffixdotroot = suffix + dotroot;
479 fFileName = fFileName.ReplaceAll(dotroot,suffixdotroot);
a9bbb414 480
21bf7095 481 AliDebug(1, Form(" after : %s",fFileName.Data()));
88cb7938 482}
88cb7938 483
a9bbb414 484//______________________________________________________________________________
88cb7938 485Bool_t AliDataLoader::CheckReload()
486{
a9bbb414 487 //
488 // Checks if we have to reload given file
489 //
490 if (fFile == 0x0) return kFALSE;
491 TString tmp = SetFileOffset(fFileName);
492 if (tmp.CompareTo(fFile->GetName())) return kTRUE; //file must be reloaded
493 return kFALSE;
88cb7938 494}
88cb7938 495
a9bbb414 496//______________________________________________________________________________
88cb7938 497const TString AliDataLoader::SetFileOffset(const TString& fname)
498{
a9bbb414 499 //
500 // Return fname
501 //
88cb7938 502 Long_t offset = (Long_t)GetRunLoader()->GetFileOffset();
18b43626 503 if (fNEventsPerFile > 0) {
504 offset = GetRunLoader()->GetEventNumber()/fNEventsPerFile;
505 }
88cb7938 506 if (offset < 1) return fname;
a9bbb414 507
88cb7938 508 TString soffset;
509 soffset += offset;//automatic conversion to string
510 TString dotroot(".root");
511 const TString& offfsetdotroot = offset + dotroot;
512 TString out = fname;
513 out = out.ReplaceAll(dotroot,offfsetdotroot);
21bf7095 514 AliDebug(1, Form("in=%s out=%s.",fname.Data(),out.Data()));
88cb7938 515 return out;
88cb7938 516}
88cb7938 517
a9bbb414 518//______________________________________________________________________________
88cb7938 519void AliDataLoader::SetFileOption(Option_t* newopt)
520{
a9bbb414 521 //
522 // Sets file option
523 //
88cb7938 524 if (fFileOption.CompareTo(newopt) == 0) return;
525 fFileOption = newopt;
526 Reload();
527}
88cb7938 528
a9bbb414 529//______________________________________________________________________________
88cb7938 530void AliDataLoader::SetCompressionLevel(Int_t cl)
531{
a9bbb414 532 //
533 // Sets comression level for data defined by di
534 //
88cb7938 535 fCompressionLevel = cl;
536 if (fFile) fFile->SetCompressionLevel(cl);
537}
88cb7938 538
a9bbb414 539//______________________________________________________________________________
88cb7938 540void AliDataLoader::MakeTree()
541{
a9bbb414 542 //
d0d4a6b3 543 // Makes tree for the current data loader
a9bbb414 544 //
88cb7938 545 AliTreeLoader* tl = dynamic_cast<AliTreeLoader*>(fBaseLoaders->At(0));
546 if (tl == 0x0)
547 {
21bf7095 548 AliError("Can not make a tree because main base loader is not a tree loader");
88cb7938 549 return;
550 }
551 tl->MakeTree();
552}
88cb7938 553
a9bbb414 554//______________________________________________________________________________
88cb7938 555Bool_t AliDataLoader::IsFileWritable() const
556{
a9bbb414 557 //
558 // Returns true if file is writable
559 //
560 return (fFile)?fFile->IsWritable():kFALSE;
88cb7938 561}
88cb7938 562
a9bbb414 563//______________________________________________________________________________
88cb7938 564Bool_t AliDataLoader::IsFileOpen() const
565{
a9bbb414 566 //
567 // Returns true if file is writable
568 //
569 return (fFile)?fFile->IsOpen():kFALSE;
88cb7938 570}
88cb7938 571
a9bbb414 572//______________________________________________________________________________
88cb7938 573Bool_t AliDataLoader::IsOptionContrary(const TString& option) const
574{
a9bbb414 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
88cb7938 578 if (fFile == 0x0) return kFALSE; //file is not opened - no problem
579
580 if ( ( AliLoader::IsOptionWritable(option) == kTRUE ) && // passed option is writable and
581 ( AliLoader::IsOptionWritable(fFileOption) == kFALSE ) ) // existing one is not writable
582 {
583 return kTRUE;
584 }
a9bbb414 585
88cb7938 586 return kFALSE;
587}
a9bbb414 588
589
590//______________________________________________________________________________
88cb7938 591void AliDataLoader::AddBaseLoader(AliBaseLoader* bl)
592{
a9bbb414 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,
595 //and posted to
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
598
599 if (bl == 0x0)
600 {
601 AliWarning("Pointer is null.");
602 return;
603 }
604
605 TObject* obj = fBaseLoaders->FindObject(bl->GetName());
606 if (obj)
607 {
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()));
610 return;
611 }
88cb7938 612
a9bbb414 613 fBaseLoaders->Add(bl);
88cb7938 614}
615
a9bbb414 616//______________________________________________________________________________
88cb7938 617AliBaseLoader* AliDataLoader::GetBaseLoader(const TString& name) const
618{
a9bbb414 619 //
620 // Return pointer to base loader
621 //
88cb7938 622 return dynamic_cast<AliBaseLoader*>(fBaseLoaders->FindObject(name));
623}
88cb7938 624
a9bbb414 625//______________________________________________________________________________
88cb7938 626AliBaseLoader* AliDataLoader::GetBaseLoader(Int_t n) const
627{
a9bbb414 628 //
d0d4a6b3 629 // Gets the n-th base loader (what is n?)
a9bbb414 630 //
631 return dynamic_cast<AliBaseLoader*>(fBaseLoaders->At(n));
88cb7938 632}
88cb7938 633
a9bbb414 634//______________________________________________________________________________
88cb7938 635TTree* AliDataLoader::Tree() const
636{
a9bbb414 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;
643 return tl->Tree();
88cb7938 644}
88cb7938 645
a9bbb414 646//______________________________________________________________________________
88cb7938 647void AliDataLoader::SetDirName(TString& dirname)
648{
a9bbb414 649 //
d0d4a6b3 650 // Sets the directory name where the files will be stored
a9bbb414 651 //
21bf7095 652 AliDebug(10, Form("FileName before %s",fFileName.Data()));
88cb7938 653 Int_t n = fFileName.Last('/');
21bf7095 654 AliDebug(10, Form("Slash found on pos %d",n));
88cb7938 655 if (n > 0) fFileName = fFileName.Remove(0,n+1);
21bf7095 656 AliDebug(10, Form("Core FileName %s",fFileName.Data()));
fca6cd9f 657 fFileName = dirname + fFileName;
21bf7095 658 AliDebug(10, Form("FileName after %s",fFileName.Data()));
88cb7938 659}
a9bbb414 660
661//______________________________________________________________________________
88cb7938 662AliObjectLoader* AliDataLoader::GetBaseDataLoader()
663{
a9bbb414 664 //
d0d4a6b3 665 // Gets the base data loader
a9bbb414 666 //
667 return dynamic_cast<AliObjectLoader*>(GetBaseLoader(kData));
88cb7938 668}
a9bbb414 669
670//______________________________________________________________________________
88cb7938 671AliTaskLoader* AliDataLoader::GetBaseTaskLoader()
672{
a9bbb414 673 //
d0d4a6b3 674 // Gets the base task loader
a9bbb414 675 //
676 return dynamic_cast<AliTaskLoader*>(GetBaseLoader(kTask));
88cb7938 677}
a9bbb414 678
679//______________________________________________________________________________
88cb7938 680AliBaseLoader* AliDataLoader::GetBaseQALoader()
681{
a9bbb414 682 //
d0d4a6b3 683 // Gets the base QA loader
a9bbb414 684 //
88cb7938 685 return GetBaseLoader(kQA);
686}
a9bbb414 687
688//______________________________________________________________________________
88cb7938 689AliTaskLoader* AliDataLoader::GetBaseQATaskLoader()
690{
a9bbb414 691 //
692 // Returns pointer to QA base loader
693 //
694 return dynamic_cast<AliTaskLoader*>(GetBaseLoader(kQATask));
88cb7938 695}
a9bbb414 696
697//______________________________________________________________________________
88cb7938 698void AliDataLoader::SetBaseDataLoader(AliBaseLoader* bl)
699{
a9bbb414 700 //
701 // Sets data base loader
702 //
88cb7938 703 if (bl == 0x0)
a9bbb414 704 {
705 AliError("Parameter is null");
706 return;
707 }
88cb7938 708 if (GetBaseDataLoader()) delete GetBaseDataLoader();
709 fBaseLoaders->AddAt(bl,kData);
710}
a9bbb414 711
712//______________________________________________________________________________
88cb7938 713void AliDataLoader::SetBaseTaskLoader(AliTaskLoader* bl)
714{
a9bbb414 715 //
716 // Sets Task base loader
717 //
88cb7938 718 if (bl == 0x0)
719 {
21bf7095 720 AliError("Parameter is null");
88cb7938 721 return;
722 }
723 if (GetBaseTaskLoader()) delete GetBaseTaskLoader();
724 fBaseLoaders->AddAt(bl,kTask);
725}
a9bbb414 726
727//______________________________________________________________________________
88cb7938 728void AliDataLoader::SetBaseQALoader(AliBaseLoader* bl)
729{
a9bbb414 730 //
731 // Sets QA base loader
732 //
88cb7938 733 if (bl == 0x0)
a9bbb414 734 {
735 AliError("Parameter is null");
736 return;
737 }
88cb7938 738 if (GetBaseQALoader()) delete GetBaseQALoader();
739 fBaseLoaders->AddAt(bl,kQA);
740}
a9bbb414 741
742//______________________________________________________________________________
88cb7938 743void AliDataLoader::SetBaseQATaskLoader(AliTaskLoader* bl)
744{
a9bbb414 745 //
746 // Sets QA Task base loader
747 //
88cb7938 748 if (bl == 0x0)
a9bbb414 749 {
750 AliError("Parameter is null");
751 return;
88cb7938 752 }
753 if (GetBaseQATaskLoader()) delete GetBaseQATaskLoader();
754 fBaseLoaders->AddAt(bl,kQATask);
755}
a9bbb414 756
757//______________________________________________________________________________
f0f6f856 758void AliDataLoader::Synchronize()
759{
a9bbb414 760 //
761 // Synchronizes all writable files
762 //
504b172d 763 if ( fFile ) fFile->Flush();
f0f6f856 764}
88cb7938 765
88cb7938 766
767