Fixes for bug #52499: Field polarities inconsistiency
[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 Int_t AliTreeLoader::WriteData(Option_t* opt)
50 {
51   //
52   // Writes data defined by di object
53   // opt might be "OVERWRITE" in case of forcing overwriting
54   //
55   AliDebug(1, Form("Writing %s container for %s data. Option is %s.",
56                    GetName(),GetDataLoader()->GetName(),opt));
57   
58   TObject *data = Get();
59   if(data == 0x0)
60     {//did not get, nothing to write
61       AliWarning(Form("Tree named %s not found in folder. Nothing to write.",GetName()));
62       return 0;
63     }
64   
65   //check if file is opened
66   if (GetDirectory() == 0x0)
67     { 
68       //if not try to open
69       GetDataLoader()->SetFileOption("UPDATE");
70       if (GetDataLoader()->OpenFile("UPDATE"))
71         {  
72           //oops, can not open the file, give an error message and return error code
73           AliError(Form("Can not open hits file. %s ARE NOT WRITTEN",GetName()));
74           return 1;
75         }
76     }
77   
78   if (GetDataLoader()->IsFileWritable() == kFALSE)
79     {
80       AliError(Form("File %s is not writable",GetDataLoader()->GetFileName().Data()));
81       return 2;
82     }
83   
84   GetDirectory()->cd(); //set the proper directory active
85   
86   //see if hits container already exists in this (root) directory
87   TObject* obj = GetFromDirectory(GetName());
88   if (obj)
89     { //if they exist, see if option OVERWRITE is used
90       const char *oOverWrite = strstr(opt,"OVERWRITE");
91       if(!oOverWrite)
92         {//if it is not used -  give an error message and return an error code
93           AliError("Tree already exisists. Use option \"OVERWRITE\" to overwrite previous data");
94           return 3;
95         }
96     }
97   
98   AliDebug(1, Form("DataName = %s, opt = %s, data object name = %s",
99                    GetName(),opt,data->GetName()));
100   AliDebug(1, Form("File Name = %s, Directory Name = %s Directory's File Name = %s",
101                    GetDataLoader()->GetFile()->GetName(),GetDirectory()->GetName(),
102                    GetDirectory()->GetFile()->GetName()));
103   
104   //if a data object is a tree set the directory
105   TTree* tree = dynamic_cast<TTree*>(data);
106   if (tree) tree->SetDirectory(GetDirectory()); //forces setting the directory to this directory (we changed dir few lines above)
107   
108   AliDebug(1, "Writing tree");
109   data->Write(0,TObject::kOverwrite);
110   
111   fIsLoaded = kTRUE;  // Just to ensure flag is on. Object can be posted manually to folder structure, not using loader.
112   
113   return 0;
114   
115 }
116
117 //______________________________________________________________________________
118 void AliTreeLoader::MakeTree()
119 {
120   //
121   // This virtual method creates the tree in the file
122   //
123   if (Tree()) 
124     {
125       AliDebug(1, Form("name = %s, Data Name = %s Tree already exists.",
126                        GetName(),GetDataLoader()->GetName()));
127       return;//tree already made 
128     }
129   AliDebug(1, Form("Making Tree named %s.",GetName()));
130   
131   TString dtypename(GetDataLoader()->GetName());
132   TTree* tree = new TTree(GetName(), dtypename + " Container"); //make a tree
133   if (tree == 0x0)
134     {
135       AliError(Form("Can not create %s tree.",GetName()));
136       return;
137    }
138   tree->SetAutoSave(1000000000); //no autosave
139   GetFolder()->Add(tree);
140   WriteData("OVERWRITE");//write tree to the file
141 }
142
143