a9bbb414 |
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$ */ |
bfbd5665 |
30 | #include <TFile.h> |
a9bbb414 |
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 | //______________________________________________________________________________ |
a9bbb414 |
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 | |