ROOT logo
/////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                         //
//  class AliTreeLoader                                                                    //
//                                                                                         //
//  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 "AliTreeLoader.h"
#include "AliRunLoader.h"
#include "AliLog.h"

#include <TFile.h>
#include <TFolder.h>

ClassImp(AliTreeLoader)

//______________________________________________________________________________
AliTreeLoader::AliTreeLoader(const TString& name, AliDataLoader* dl,Bool_t storeontop):
 AliObjectLoader(name,dl,storeontop)
{
  //
  // Constructor
  //
}

//______________________________________________________________________________
Int_t AliTreeLoader::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()));
  
  //if a data object is a tree set the directory
  TTree* tree = dynamic_cast<TTree*>(data);
  if (tree) tree->SetDirectory(GetDirectory()); //forces setting the directory to this directory (we changed dir few lines above)
  
  AliDebug(1, "Writing tree");
  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;
  
}

//______________________________________________________________________________
void AliTreeLoader::MakeTree()
{
  //
  // This virtual method creates the tree in the file
  //
  if (Tree()) 
    {
      AliDebug(1, Form("name = %s, Data Name = %s Tree already exists.",
		       GetName(),GetDataLoader()->GetName()));
      return;//tree already made 
    }
  AliDebug(1, Form("Making Tree named %s.",GetName()));
  
  TString dtypename(GetDataLoader()->GetName());
  TTree* tree = new TTree(GetName(), dtypename + " Container"); //make a tree
  if (tree == 0x0)
    {
      AliError(Form("Can not create %s tree.",GetName()));
      return;
   }
  tree->SetAutoSave(1000000000); //no autosave
  GetFolder()->Add(tree);
  WriteData("OVERWRITE");//write tree to the file
}


 AliTreeLoader.cxx:1
 AliTreeLoader.cxx:2
 AliTreeLoader.cxx:3
 AliTreeLoader.cxx:4
 AliTreeLoader.cxx:5
 AliTreeLoader.cxx:6
 AliTreeLoader.cxx:7
 AliTreeLoader.cxx:8
 AliTreeLoader.cxx:9
 AliTreeLoader.cxx:10
 AliTreeLoader.cxx:11
 AliTreeLoader.cxx:12
 AliTreeLoader.cxx:13
 AliTreeLoader.cxx:14
 AliTreeLoader.cxx:15
 AliTreeLoader.cxx:16
 AliTreeLoader.cxx:17
 AliTreeLoader.cxx:18
 AliTreeLoader.cxx:19
 AliTreeLoader.cxx:20
 AliTreeLoader.cxx:21
 AliTreeLoader.cxx:22
 AliTreeLoader.cxx:23
 AliTreeLoader.cxx:24
 AliTreeLoader.cxx:25
 AliTreeLoader.cxx:26
 AliTreeLoader.cxx:27
 AliTreeLoader.cxx:28
 AliTreeLoader.cxx:29
 AliTreeLoader.cxx:30
 AliTreeLoader.cxx:31
 AliTreeLoader.cxx:32
 AliTreeLoader.cxx:33
 AliTreeLoader.cxx:34
 AliTreeLoader.cxx:35
 AliTreeLoader.cxx:36
 AliTreeLoader.cxx:37
 AliTreeLoader.cxx:38
 AliTreeLoader.cxx:39
 AliTreeLoader.cxx:40
 AliTreeLoader.cxx:41
 AliTreeLoader.cxx:42
 AliTreeLoader.cxx:43
 AliTreeLoader.cxx:44
 AliTreeLoader.cxx:45
 AliTreeLoader.cxx:46
 AliTreeLoader.cxx:47
 AliTreeLoader.cxx:48
 AliTreeLoader.cxx:49
 AliTreeLoader.cxx:50
 AliTreeLoader.cxx:51
 AliTreeLoader.cxx:52
 AliTreeLoader.cxx:53
 AliTreeLoader.cxx:54
 AliTreeLoader.cxx:55
 AliTreeLoader.cxx:56
 AliTreeLoader.cxx:57
 AliTreeLoader.cxx:58
 AliTreeLoader.cxx:59
 AliTreeLoader.cxx:60
 AliTreeLoader.cxx:61
 AliTreeLoader.cxx:62
 AliTreeLoader.cxx:63
 AliTreeLoader.cxx:64
 AliTreeLoader.cxx:65
 AliTreeLoader.cxx:66
 AliTreeLoader.cxx:67
 AliTreeLoader.cxx:68
 AliTreeLoader.cxx:69
 AliTreeLoader.cxx:70
 AliTreeLoader.cxx:71
 AliTreeLoader.cxx:72
 AliTreeLoader.cxx:73
 AliTreeLoader.cxx:74
 AliTreeLoader.cxx:75
 AliTreeLoader.cxx:76
 AliTreeLoader.cxx:77
 AliTreeLoader.cxx:78
 AliTreeLoader.cxx:79
 AliTreeLoader.cxx:80
 AliTreeLoader.cxx:81
 AliTreeLoader.cxx:82
 AliTreeLoader.cxx:83
 AliTreeLoader.cxx:84
 AliTreeLoader.cxx:85
 AliTreeLoader.cxx:86
 AliTreeLoader.cxx:87
 AliTreeLoader.cxx:88
 AliTreeLoader.cxx:89
 AliTreeLoader.cxx:90
 AliTreeLoader.cxx:91
 AliTreeLoader.cxx:92
 AliTreeLoader.cxx:93
 AliTreeLoader.cxx:94
 AliTreeLoader.cxx:95
 AliTreeLoader.cxx:96
 AliTreeLoader.cxx:97
 AliTreeLoader.cxx:98
 AliTreeLoader.cxx:99
 AliTreeLoader.cxx:100
 AliTreeLoader.cxx:101
 AliTreeLoader.cxx:102
 AliTreeLoader.cxx:103
 AliTreeLoader.cxx:104
 AliTreeLoader.cxx:105
 AliTreeLoader.cxx:106
 AliTreeLoader.cxx:107
 AliTreeLoader.cxx:108
 AliTreeLoader.cxx:109
 AliTreeLoader.cxx:110
 AliTreeLoader.cxx:111
 AliTreeLoader.cxx:112
 AliTreeLoader.cxx:113
 AliTreeLoader.cxx:114
 AliTreeLoader.cxx:115
 AliTreeLoader.cxx:116
 AliTreeLoader.cxx:117
 AliTreeLoader.cxx:118
 AliTreeLoader.cxx:119
 AliTreeLoader.cxx:120
 AliTreeLoader.cxx:121
 AliTreeLoader.cxx:122
 AliTreeLoader.cxx:123
 AliTreeLoader.cxx:124
 AliTreeLoader.cxx:125
 AliTreeLoader.cxx:126
 AliTreeLoader.cxx:127
 AliTreeLoader.cxx:128
 AliTreeLoader.cxx:129
 AliTreeLoader.cxx:130
 AliTreeLoader.cxx:131
 AliTreeLoader.cxx:132
 AliTreeLoader.cxx:133
 AliTreeLoader.cxx:134
 AliTreeLoader.cxx:135
 AliTreeLoader.cxx:136
 AliTreeLoader.cxx:137
 AliTreeLoader.cxx:138
 AliTreeLoader.cxx:139
 AliTreeLoader.cxx:140
 AliTreeLoader.cxx:141
 AliTreeLoader.cxx:142
 AliTreeLoader.cxx:143
 AliTreeLoader.cxx:144