ROOT logo
/////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                         //
//  class AliBaseLoader                                                                    //
//                                                                                         //
//  Container of all data needed for full                                                  //
//  description of each data type                                                          //
//  (Hits, Kine, ...)                                                                      //
//                                                                                         //
//  Each data loader has a basic standard setup of BaseLoaders                             //
//  which can be identuified by indexes (defined by EStdBasicLoaders)                      //
//  Data managed by these standard base loaders has fixed naming convention                //
//  e.g. - tree with hits is always named TreeH                                            //
//                     (defined in AliLoader::fgkDefaultHitsContainerName)                 //
//       - task DtectorName+Name defined                                                   //
//                                                                                         //
//  EStdBasicLoaders   idx     Object Type        Description                              //
//      kData           0    TTree or TObject     main data itself (hits,digits,...)       //
//      kTask           1        TTask            object producing main data               //
//      kQA             2        TTree                quality assurance tree               //
//      kQATask         3        TTask            task producing QA object                 //
//                                                                                         //
//                                                                                         //
//  User can define and add more basic loaders even Run Time.                              //
//  Caution: in order to save information about added base loader                          //
//  user must rewrite Run Loader to galice.file, overwriting old setup                     //
//                                                                                         //
/////////////////////////////////////////////////////////////////////////////////////////////

/* $Id$ */

#include "AliBaseLoader.h"
#include "AliTreeLoader.h"
#include "AliDataLoader.h"
#include "AliLoader.h"
#include "AliLog.h"

#include <TFile.h>
#include <TString.h>

ClassImp(AliBaseLoader)

//______________________________________________________________________________
AliBaseLoader::AliBaseLoader():
 fIsLoaded(kFALSE),
 fStoreInTopOfFile(kFALSE),
 fDoNotReload(kFALSE),
 fDataLoader(0x0)
{
  //
  // default constructor
  //
}

//______________________________________________________________________________
AliBaseLoader::AliBaseLoader(const TString& name,  AliDataLoader* dl, Bool_t storeontop):
 TNamed(name,name+" Base Loader"),
 fIsLoaded(kFALSE),
 fStoreInTopOfFile(storeontop),
 fDoNotReload(storeontop),//if stored on top of file - this object is loaded ones pe
 fDataLoader(dl)
{
  //
  // constructor
  //
}

//______________________________________________________________________________
Int_t AliBaseLoader::Load(Option_t* opt)
{
  //
  // Loads and posts the data
  //
  AliDebug(1, Form("data type = %s, option = %s",GetName(),opt));
  
  if (Get())
    {
      AliDebug(1,Form("Data <<%s>> are already loaded. Use ReloadData to force reload. Nothing done",GetName()));
      return 0;
    }
  
  Int_t retval;
  
  if (GetDataLoader()->IsFileOpen() == kTRUE)
    {
      if (GetDataLoader()->IsOptionContrary(opt) == kTRUE)
	{
	  AliError(Form("Data Type %s, Container Name %s", GetDataLoader()->GetName(),GetName()));
	  AliError("File was already opened in READ-ONLY mode, while now WRITEABLE access is requested.");
	  AliError("Use AliDataLoader::SetOption to enforce change of access mode OR");
	  AliError("Load previosly loaded data with coherent option.");
	  return 10;
	}
    }
  else
    {
      retval = GetDataLoader()->OpenFile(opt);
      if (retval) 
	{
	  AliError(Form("Error occured while opening <<%s>> file",GetName()));
	  return retval;
	}
    }
  //if file is recreated there is no sense to search for data to post and get Error message
  if (AliLoader::TestFileOption(opt) == kFALSE)
    {
      AliTreeLoader* tl = dynamic_cast<AliTreeLoader*>(this);
      if (tl) tl->MakeTree();
      fIsLoaded = kTRUE;
      return 0;
    }
  
  retval = Post();
  if (retval)
    {
      AliError(Form("Error occured while posting %s from file to folder.",GetName()));
      return retval;
    }
  
  fIsLoaded = kTRUE;
  return 0;
}

//______________________________________________________________________________
Int_t AliBaseLoader::Post()
{
  //
  // Posts data container to proper folders
  //
  
  if ( GetDirectory() == 0x0)
    {
      AliError(Form("%s directory is NULL. Load before.",GetDataLoader()->GetName()));
      return 2; 
    }
  
  TObject* data = GetFromDirectory(fName);
  if(data)
    {
      //if such an obejct already exists - remove it first
      return Post(data);
    }
  else
    {
      //check if file is in update mode
      Int_t fileupdate = GetDataLoader()->GetFileOption().CompareTo("update",TString::kIgnoreCase);
      if ( fileupdate == 0)
	{ //if it is, it is normal that there is no data yet
	  AliDebug(1, Form("Can not find %s in file %s (file is opened in UPDATE mode).",
			   GetName(),GetDataLoader()->GetFile()->GetName()));
	}
      else
	{
	  AliError(Form("Can not find %s in file %s", GetName(),GetDataLoader()->GetFile()->GetName()));
	  return 5;
	}
    }
  return 0;
}

//______________________________________________________________________________
Int_t AliBaseLoader::Post(TObject* data)
{
  //
  // Posts data container to proper folders
  //
  if (data == 0x0)
    {
      AliError("Pointer to object is NULL");
      return 1;
    }
  
  if ( fName.CompareTo(data->GetName()) != 0)
    {
      AliFatal(Form("Object name is <<%s>> while <<%s>> expected",data->GetName(),GetName()));
      return -1;//pro forma
    }
  
  TObject* obj = Get();
  if (data == obj)
    {
      AliWarning("This object was already posted.");
      return 0;
    }
  if (obj)
    {
      AliWarning(Form("Object named %s already exitsts in data folder. Removing it",GetName()));
      Clean();
    }
  return AddToBoard(data);
}

//______________________________________________________________________________
Int_t AliBaseLoader::WriteData(Option_t* opt)
{
  //
  // Writes data defined by di object
  // opt might be "OVERWRITE" in case of forcing overwriting
  //
  AliDebug(1, Form("Writing %s container for %s data. Option is %s.",
		   GetName(),GetDataLoader()->GetName(),opt));
  
  TObject *data = Get();
  if(data == 0x0)
    {//did not get, nothing to write
      AliWarning(Form("Tree named %s not found in folder. Nothing to write.",GetName()));
      return 0;
    }
  
  //check if file is opened
  if (GetDirectory() == 0x0)
    { 
      //if not try to open
      GetDataLoader()->SetFileOption("UPDATE");
      if (GetDataLoader()->OpenFile("UPDATE"))
	{  
	  //oops, can not open the file, give an error message and return error code
	  AliError(Form("Can not open hits file. %s ARE NOT WRITTEN",GetName()));
	  return 1;
	}
    }
  
  if (GetDataLoader()->IsFileWritable() == kFALSE)
    {
      AliError(Form("File %s is not writable",GetDataLoader()->GetFileName().Data()));
      return 2;
    }
  
  GetDirectory()->cd(); //set the proper directory active
  
  //see if hits container already exists in this (root) directory
  TObject* obj = GetFromDirectory(GetName());
  if (obj)
    { //if they exist, see if option OVERWRITE is used
      const char *oOverWrite = strstr(opt,"OVERWRITE");
      if(!oOverWrite)
	{//if it is not used -  give an error message and return an error code
	  AliError("Tree already exisists. Use option \"OVERWRITE\" to overwrite previous data");
	  return 3;
	}
    }
  
  AliDebug(1, Form("DataName = %s, opt = %s, data object name = %s",
                   GetName(),opt,data->GetName()));
  AliDebug(1, Form("File Name = %s, Directory Name = %s Directory's File Name = %s",
                   GetDataLoader()->GetFile()->GetName(),GetDirectory()->GetName(),
                   GetDirectory()->GetFile()->GetName()));
  
  AliDebug(1, "Writing data");
  data->Write(0,TObject::kOverwrite);
  
  fIsLoaded = kTRUE;  // Just to ensure flag is on. Object can be posted manually to folder structure, not using loader.
  
  return 0;
  
}

//______________________________________________________________________________
Int_t AliBaseLoader::Reload()
{
  //
  // Unloads and loads datat again - if loaded before
  //
  if (IsLoaded())
    {
      Unload();
      return Load(GetDataLoader()->GetFileOption());
    }
  return 0;
}

//______________________________________________________________________________
void AliBaseLoader::Clean()
{
  //
  // Removes objects from folder/task
  //
  AliDebug(1, Form("%s %s",GetName(),GetDataLoader()->GetName()));
  TObject* obj = Get();
  if(obj)
    { 
      AliDebug(1, Form("cleaning %s.",GetName()));
      RemoveFromBoard(obj);
      delete obj;
    }
}

//______________________________________________________________________________
void AliBaseLoader::Unload()
{
  // Unloads data and closes the files
  Clean();
  fIsLoaded = kFALSE;
  GetDataLoader()->CloseFile();
}

//______________________________________________________________________________
AliDataLoader* AliBaseLoader::GetDataLoader() const
{
  //
  // Returns pointer to the data loader
  //
  if (fDataLoader == 0x0) 
    {
      AliFatal("Pointer to Data Loader is NULL");
    }
  return fDataLoader;
}

//______________________________________________________________________________
TDirectory* AliBaseLoader::GetDirectory() const
{
  //
  // returnd TDirectory where data are to be saved
  // if fStoreInTopOfFile flag is true - returns pointer to file
  //
  return (fStoreInTopOfFile)?GetDataLoader()->GetFile():GetDataLoader()->GetDirectory();
}



 AliBaseLoader.cxx:1
 AliBaseLoader.cxx:2
 AliBaseLoader.cxx:3
 AliBaseLoader.cxx:4
 AliBaseLoader.cxx:5
 AliBaseLoader.cxx:6
 AliBaseLoader.cxx:7
 AliBaseLoader.cxx:8
 AliBaseLoader.cxx:9
 AliBaseLoader.cxx:10
 AliBaseLoader.cxx:11
 AliBaseLoader.cxx:12
 AliBaseLoader.cxx:13
 AliBaseLoader.cxx:14
 AliBaseLoader.cxx:15
 AliBaseLoader.cxx:16
 AliBaseLoader.cxx:17
 AliBaseLoader.cxx:18
 AliBaseLoader.cxx:19
 AliBaseLoader.cxx:20
 AliBaseLoader.cxx:21
 AliBaseLoader.cxx:22
 AliBaseLoader.cxx:23
 AliBaseLoader.cxx:24
 AliBaseLoader.cxx:25
 AliBaseLoader.cxx:26
 AliBaseLoader.cxx:27
 AliBaseLoader.cxx:28
 AliBaseLoader.cxx:29
 AliBaseLoader.cxx:30
 AliBaseLoader.cxx:31
 AliBaseLoader.cxx:32
 AliBaseLoader.cxx:33
 AliBaseLoader.cxx:34
 AliBaseLoader.cxx:35
 AliBaseLoader.cxx:36
 AliBaseLoader.cxx:37
 AliBaseLoader.cxx:38
 AliBaseLoader.cxx:39
 AliBaseLoader.cxx:40
 AliBaseLoader.cxx:41
 AliBaseLoader.cxx:42
 AliBaseLoader.cxx:43
 AliBaseLoader.cxx:44
 AliBaseLoader.cxx:45
 AliBaseLoader.cxx:46
 AliBaseLoader.cxx:47
 AliBaseLoader.cxx:48
 AliBaseLoader.cxx:49
 AliBaseLoader.cxx:50
 AliBaseLoader.cxx:51
 AliBaseLoader.cxx:52
 AliBaseLoader.cxx:53
 AliBaseLoader.cxx:54
 AliBaseLoader.cxx:55
 AliBaseLoader.cxx:56
 AliBaseLoader.cxx:57
 AliBaseLoader.cxx:58
 AliBaseLoader.cxx:59
 AliBaseLoader.cxx:60
 AliBaseLoader.cxx:61
 AliBaseLoader.cxx:62
 AliBaseLoader.cxx:63
 AliBaseLoader.cxx:64
 AliBaseLoader.cxx:65
 AliBaseLoader.cxx:66
 AliBaseLoader.cxx:67
 AliBaseLoader.cxx:68
 AliBaseLoader.cxx:69
 AliBaseLoader.cxx:70
 AliBaseLoader.cxx:71
 AliBaseLoader.cxx:72
 AliBaseLoader.cxx:73
 AliBaseLoader.cxx:74
 AliBaseLoader.cxx:75
 AliBaseLoader.cxx:76
 AliBaseLoader.cxx:77
 AliBaseLoader.cxx:78
 AliBaseLoader.cxx:79
 AliBaseLoader.cxx:80
 AliBaseLoader.cxx:81
 AliBaseLoader.cxx:82
 AliBaseLoader.cxx:83
 AliBaseLoader.cxx:84
 AliBaseLoader.cxx:85
 AliBaseLoader.cxx:86
 AliBaseLoader.cxx:87
 AliBaseLoader.cxx:88
 AliBaseLoader.cxx:89
 AliBaseLoader.cxx:90
 AliBaseLoader.cxx:91
 AliBaseLoader.cxx:92
 AliBaseLoader.cxx:93
 AliBaseLoader.cxx:94
 AliBaseLoader.cxx:95
 AliBaseLoader.cxx:96
 AliBaseLoader.cxx:97
 AliBaseLoader.cxx:98
 AliBaseLoader.cxx:99
 AliBaseLoader.cxx:100
 AliBaseLoader.cxx:101
 AliBaseLoader.cxx:102
 AliBaseLoader.cxx:103
 AliBaseLoader.cxx:104
 AliBaseLoader.cxx:105
 AliBaseLoader.cxx:106
 AliBaseLoader.cxx:107
 AliBaseLoader.cxx:108
 AliBaseLoader.cxx:109
 AliBaseLoader.cxx:110
 AliBaseLoader.cxx:111
 AliBaseLoader.cxx:112
 AliBaseLoader.cxx:113
 AliBaseLoader.cxx:114
 AliBaseLoader.cxx:115
 AliBaseLoader.cxx:116
 AliBaseLoader.cxx:117
 AliBaseLoader.cxx:118
 AliBaseLoader.cxx:119
 AliBaseLoader.cxx:120
 AliBaseLoader.cxx:121
 AliBaseLoader.cxx:122
 AliBaseLoader.cxx:123
 AliBaseLoader.cxx:124
 AliBaseLoader.cxx:125
 AliBaseLoader.cxx:126
 AliBaseLoader.cxx:127
 AliBaseLoader.cxx:128
 AliBaseLoader.cxx:129
 AliBaseLoader.cxx:130
 AliBaseLoader.cxx:131
 AliBaseLoader.cxx:132
 AliBaseLoader.cxx:133
 AliBaseLoader.cxx:134
 AliBaseLoader.cxx:135
 AliBaseLoader.cxx:136
 AliBaseLoader.cxx:137
 AliBaseLoader.cxx:138
 AliBaseLoader.cxx:139
 AliBaseLoader.cxx:140
 AliBaseLoader.cxx:141
 AliBaseLoader.cxx:142
 AliBaseLoader.cxx:143
 AliBaseLoader.cxx:144
 AliBaseLoader.cxx:145
 AliBaseLoader.cxx:146
 AliBaseLoader.cxx:147
 AliBaseLoader.cxx:148
 AliBaseLoader.cxx:149
 AliBaseLoader.cxx:150
 AliBaseLoader.cxx:151
 AliBaseLoader.cxx:152
 AliBaseLoader.cxx:153
 AliBaseLoader.cxx:154
 AliBaseLoader.cxx:155
 AliBaseLoader.cxx:156
 AliBaseLoader.cxx:157
 AliBaseLoader.cxx:158
 AliBaseLoader.cxx:159
 AliBaseLoader.cxx:160
 AliBaseLoader.cxx:161
 AliBaseLoader.cxx:162
 AliBaseLoader.cxx:163
 AliBaseLoader.cxx:164
 AliBaseLoader.cxx:165
 AliBaseLoader.cxx:166
 AliBaseLoader.cxx:167
 AliBaseLoader.cxx:168
 AliBaseLoader.cxx:169
 AliBaseLoader.cxx:170
 AliBaseLoader.cxx:171
 AliBaseLoader.cxx:172
 AliBaseLoader.cxx:173
 AliBaseLoader.cxx:174
 AliBaseLoader.cxx:175
 AliBaseLoader.cxx:176
 AliBaseLoader.cxx:177
 AliBaseLoader.cxx:178
 AliBaseLoader.cxx:179
 AliBaseLoader.cxx:180
 AliBaseLoader.cxx:181
 AliBaseLoader.cxx:182
 AliBaseLoader.cxx:183
 AliBaseLoader.cxx:184
 AliBaseLoader.cxx:185
 AliBaseLoader.cxx:186
 AliBaseLoader.cxx:187
 AliBaseLoader.cxx:188
 AliBaseLoader.cxx:189
 AliBaseLoader.cxx:190
 AliBaseLoader.cxx:191
 AliBaseLoader.cxx:192
 AliBaseLoader.cxx:193
 AliBaseLoader.cxx:194
 AliBaseLoader.cxx:195
 AliBaseLoader.cxx:196
 AliBaseLoader.cxx:197
 AliBaseLoader.cxx:198
 AliBaseLoader.cxx:199
 AliBaseLoader.cxx:200
 AliBaseLoader.cxx:201
 AliBaseLoader.cxx:202
 AliBaseLoader.cxx:203
 AliBaseLoader.cxx:204
 AliBaseLoader.cxx:205
 AliBaseLoader.cxx:206
 AliBaseLoader.cxx:207
 AliBaseLoader.cxx:208
 AliBaseLoader.cxx:209
 AliBaseLoader.cxx:210
 AliBaseLoader.cxx:211
 AliBaseLoader.cxx:212
 AliBaseLoader.cxx:213
 AliBaseLoader.cxx:214
 AliBaseLoader.cxx:215
 AliBaseLoader.cxx:216
 AliBaseLoader.cxx:217
 AliBaseLoader.cxx:218
 AliBaseLoader.cxx:219
 AliBaseLoader.cxx:220
 AliBaseLoader.cxx:221
 AliBaseLoader.cxx:222
 AliBaseLoader.cxx:223
 AliBaseLoader.cxx:224
 AliBaseLoader.cxx:225
 AliBaseLoader.cxx:226
 AliBaseLoader.cxx:227
 AliBaseLoader.cxx:228
 AliBaseLoader.cxx:229
 AliBaseLoader.cxx:230
 AliBaseLoader.cxx:231
 AliBaseLoader.cxx:232
 AliBaseLoader.cxx:233
 AliBaseLoader.cxx:234
 AliBaseLoader.cxx:235
 AliBaseLoader.cxx:236
 AliBaseLoader.cxx:237
 AliBaseLoader.cxx:238
 AliBaseLoader.cxx:239
 AliBaseLoader.cxx:240
 AliBaseLoader.cxx:241
 AliBaseLoader.cxx:242
 AliBaseLoader.cxx:243
 AliBaseLoader.cxx:244
 AliBaseLoader.cxx:245
 AliBaseLoader.cxx:246
 AliBaseLoader.cxx:247
 AliBaseLoader.cxx:248
 AliBaseLoader.cxx:249
 AliBaseLoader.cxx:250
 AliBaseLoader.cxx:251
 AliBaseLoader.cxx:252
 AliBaseLoader.cxx:253
 AliBaseLoader.cxx:254
 AliBaseLoader.cxx:255
 AliBaseLoader.cxx:256
 AliBaseLoader.cxx:257
 AliBaseLoader.cxx:258
 AliBaseLoader.cxx:259
 AliBaseLoader.cxx:260
 AliBaseLoader.cxx:261
 AliBaseLoader.cxx:262
 AliBaseLoader.cxx:263
 AliBaseLoader.cxx:264
 AliBaseLoader.cxx:265
 AliBaseLoader.cxx:266
 AliBaseLoader.cxx:267
 AliBaseLoader.cxx:268
 AliBaseLoader.cxx:269
 AliBaseLoader.cxx:270
 AliBaseLoader.cxx:271
 AliBaseLoader.cxx:272
 AliBaseLoader.cxx:273
 AliBaseLoader.cxx:274
 AliBaseLoader.cxx:275
 AliBaseLoader.cxx:276
 AliBaseLoader.cxx:277
 AliBaseLoader.cxx:278
 AliBaseLoader.cxx:279
 AliBaseLoader.cxx:280
 AliBaseLoader.cxx:281
 AliBaseLoader.cxx:282
 AliBaseLoader.cxx:283
 AliBaseLoader.cxx:284
 AliBaseLoader.cxx:285
 AliBaseLoader.cxx:286
 AliBaseLoader.cxx:287
 AliBaseLoader.cxx:288
 AliBaseLoader.cxx:289
 AliBaseLoader.cxx:290
 AliBaseLoader.cxx:291
 AliBaseLoader.cxx:292
 AliBaseLoader.cxx:293
 AliBaseLoader.cxx:294
 AliBaseLoader.cxx:295
 AliBaseLoader.cxx:296
 AliBaseLoader.cxx:297
 AliBaseLoader.cxx:298
 AliBaseLoader.cxx:299
 AliBaseLoader.cxx:300
 AliBaseLoader.cxx:301
 AliBaseLoader.cxx:302
 AliBaseLoader.cxx:303
 AliBaseLoader.cxx:304
 AliBaseLoader.cxx:305
 AliBaseLoader.cxx:306
 AliBaseLoader.cxx:307
 AliBaseLoader.cxx:308
 AliBaseLoader.cxx:309
 AliBaseLoader.cxx:310
 AliBaseLoader.cxx:311
 AliBaseLoader.cxx:312
 AliBaseLoader.cxx:313
 AliBaseLoader.cxx:314
 AliBaseLoader.cxx:315
 AliBaseLoader.cxx:316
 AliBaseLoader.cxx:317
 AliBaseLoader.cxx:318
 AliBaseLoader.cxx:319
 AliBaseLoader.cxx:320