Including TFile.h
[u/mrichter/AliRoot.git] / STEER / AliTreeLoader.cxx
1 /////////////////////////////////////////////////////////////////////////////////////////////
2 //                                                                                         //
3 //  class AliTreeLoader                                                                    //
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
29 /* $Id$ */
30 #include <TFile.h>
31
32 #include "AliTreeLoader.h"
33 #include "AliLog.h"
34 #include "AliRunLoader.h"
35
36
37 ClassImp(AliTreeLoader)
38
39 //______________________________________________________________________________
40 AliTreeLoader::AliTreeLoader(const TString& name, AliDataLoader* dl,Bool_t storeontop):
41  AliObjectLoader(name,dl,storeontop)
42 {
43   //
44   // Constructor
45   //
46 }
47
48 //______________________________________________________________________________
49 AliTreeLoader::AliTreeLoader(const AliTreeLoader& source):
50   AliObjectLoader(source) 
51 {
52   //
53   // copy constructor
54   //
55   AliFatal("Copy constructor not implemented");
56 }
57
58 //______________________________________________________________________________
59 AliTreeLoader& AliTreeLoader::operator=(const AliTreeLoader& /*source*/) 
60 {
61   //
62   // Assignment operator
63   //
64   AliFatal("Assignment operator not implemented");
65   return *this;
66 }
67
68 //______________________________________________________________________________
69 Int_t AliTreeLoader::WriteData(Option_t* opt)
70 {
71   //
72   // Writes data defined by di object
73   // opt might be "OVERWRITE" in case of forcing overwriting
74   //
75   AliDebug(1, Form("Writing %s container for %s data. Option is %s.",
76                    GetName(),GetDataLoader()->GetName(),opt));
77   
78   TObject *data = Get();
79   if(data == 0x0)
80     {//did not get, nothing to write
81       AliWarning(Form("Tree named %s not found in folder. Nothing to write.",GetName()));
82       return 0;
83     }
84   
85   //check if file is opened
86   if (GetDirectory() == 0x0)
87     { 
88       //if not try to open
89       GetDataLoader()->SetFileOption("UPDATE");
90       if (GetDataLoader()->OpenFile("UPDATE"))
91         {  
92           //oops, can not open the file, give an error message and return error code
93           AliError(Form("Can not open hits file. %s ARE NOT WRITTEN",GetName()));
94           return 1;
95         }
96     }
97   
98   if (GetDataLoader()->IsFileWritable() == kFALSE)
99     {
100       AliError(Form("File %s is not writable",GetDataLoader()->GetFileName().Data()));
101       return 2;
102     }
103   
104   GetDirectory()->cd(); //set the proper directory active
105   
106   //see if hits container already exists in this (root) directory
107   TObject* obj = GetFromDirectory(GetName());
108   if (obj)
109     { //if they exist, see if option OVERWRITE is used
110       const char *oOverWrite = strstr(opt,"OVERWRITE");
111       if(!oOverWrite)
112         {//if it is not used -  give an error message and return an error code
113           AliError("Tree already exisists. Use option \"OVERWRITE\" to overwrite previous data");
114           return 3;
115         }
116     }
117   
118   AliDebug(1, Form("DataName = %s, opt = %s, data object name = %s",
119                    GetName(),opt,data->GetName()));
120   AliDebug(1, Form("File Name = %s, Directory Name = %s Directory's File Name = %s",
121                    GetDataLoader()->GetFile()->GetName(),GetDirectory()->GetName(),
122                    GetDirectory()->GetFile()->GetName()));
123   
124   //if a data object is a tree set the directory
125   TTree* tree = dynamic_cast<TTree*>(data);
126   if (tree) tree->SetDirectory(GetDirectory()); //forces setting the directory to this directory (we changed dir few lines above)
127   
128   AliDebug(1, "Writing tree");
129   data->Write(0,TObject::kOverwrite);
130   
131   fIsLoaded = kTRUE;  // Just to ensure flag is on. Object can be posted manually to folder structure, not using loader.
132   
133   return 0;
134   
135 }
136
137 //______________________________________________________________________________
138 void AliTreeLoader::MakeTree()
139 {
140   //
141   // This virtual method creates the tree in the file
142   //
143   if (Tree()) 
144     {
145       AliDebug(1, Form("name = %s, Data Name = %s Tree already exists.",
146                        GetName(),GetDataLoader()->GetName()));
147       return;//tree already made 
148     }
149   AliDebug(1, Form("Making Tree named %s.",GetName()));
150   
151   TString dtypename(GetDataLoader()->GetName());
152   TTree* tree = new TTree(GetName(), dtypename + " Container"); //make a tree
153   if (tree == 0x0)
154     {
155       AliError(Form("Can not create %s tree.",GetName()));
156       return;
157    }
158   tree->SetAutoSave(1000000000); //no autosave
159   GetFolder()->Add(tree);
160   WriteData("OVERWRITE");//write tree to the file
161 }
162
163