7 |
|
#include <TSystem.h> |
8 |
|
#include <TProcessID.h> |
9 |
|
|
10 |
+ |
#include "MitAna/DataUtil/interface/Debug.h" |
11 |
+ |
|
12 |
|
using namespace mithep; |
13 |
|
|
14 |
|
ClassImp(mithep::TreeWriter) |
15 |
|
|
16 |
|
//__________________________________________________________________________________________________ |
17 |
< |
TreeWriter::TreeWriter(const char *tname, Bool_t doreset) |
18 |
< |
: TNamed(tname,Form("%s written by mithep::TreeWriter", tname)), |
19 |
< |
fBaseURL("."), |
20 |
< |
fPrefix("mithep"), |
21 |
< |
fFileNumber(0), |
22 |
< |
fCompressLevel(9), |
23 |
< |
fDefBrSize(64*1024), |
24 |
< |
fDefSL(99), |
25 |
< |
fMaxSize((Long64_t)(0.99 * TTree::GetMaxTreeSize())), |
26 |
< |
fkMinFreeSpace(1024*1024), |
27 |
< |
fkMinAvgSize(10*1024), |
28 |
< |
fEvtObjNum(-1), |
29 |
< |
fIsInit(kFALSE), |
30 |
< |
fDoObjNumReset(doreset), |
31 |
< |
fFile(0), |
32 |
< |
fTrees(0) |
17 |
> |
TreeWriter::TreeWriter(const char *tname, Bool_t doreset) : |
18 |
> |
TNamed(tname,Form("%s written by mithep::TreeWriter", tname)), |
19 |
> |
fBaseURL("."), |
20 |
> |
fPrefix("mithep"), |
21 |
> |
fFileNumber(0), |
22 |
> |
fCompressLevel(9), |
23 |
> |
fDefBrSize(64*1024), |
24 |
> |
fDefSL(99), |
25 |
> |
fMaxSize((Long64_t)(0.99 * TTree::GetMaxTreeSize())), |
26 |
> |
fkMinFreeSpace(1024*1024), |
27 |
> |
fkMinAvgSize(10*1024), |
28 |
> |
fEvtObjNum(-1), |
29 |
> |
fIsInit(kFALSE), |
30 |
> |
fDoObjNumReset(doreset), |
31 |
> |
fFile(0), |
32 |
> |
fTrees(0) |
33 |
|
{ |
34 |
|
// Constructor. |
35 |
|
|
56 |
|
// Add branch with name "name" into tree with name "tname" and set its address |
57 |
|
// to object pointer for class name "cname" using a given buffer size and splitlevel. |
58 |
|
|
59 |
< |
MyTree *t = AddOrGetMyTree(GetName()); |
60 |
< |
t->Bronch(name, cname, obj, bsize, level); |
59 |
> |
MyTree *t = AddOrGetMyTree(GetName()); |
60 |
> |
TBranch *b = t->Bronch(name, cname, obj, bsize, level); |
61 |
> |
b->SetCompressionLevel(GetCompressLevel()); |
62 |
> |
} |
63 |
> |
|
64 |
> |
|
65 |
> |
//__________________________________________________________________________________________________ |
66 |
> |
void TreeWriter::AddBranch(const char *name, void *obj, Int_t bsize, Int_t level) |
67 |
> |
{ |
68 |
> |
// Add branch with name "name" into tree with name "tname" and set its address |
69 |
> |
// to object pointer using a given buffer size and splitlevel. |
70 |
> |
|
71 |
> |
AddBranch(name, CName(obj), obj, bsize, level); |
72 |
|
} |
73 |
|
|
74 |
|
//__________________________________________________________________________________________________ |
78 |
|
// Add branch with name "name" into tree with name "tname" and set its address |
79 |
|
// to object pointer for class name "cname" using a given buffer size and default splitlevel. |
80 |
|
|
81 |
< |
MyTree *t = AddOrGetMyTree(GetName()); |
82 |
< |
t->Bronch(name, cname, obj, bsize, fDefSL); |
81 |
> |
MyTree *t = AddOrGetMyTree(GetName()); |
82 |
> |
TBranch *b = t->Bronch(name, cname, obj, bsize, fDefSL); |
83 |
> |
b->SetCompressionLevel(GetCompressLevel()); |
84 |
> |
} |
85 |
> |
|
86 |
> |
//__________________________________________________________________________________________________ |
87 |
> |
void TreeWriter::AddBranch(const char *name, void *obj, Int_t bsize) |
88 |
> |
{ |
89 |
> |
// Add branch with name "name" into tree with name "tname" and set its address |
90 |
> |
// to object pointer using a given buffer size and default splitlevel. |
91 |
> |
|
92 |
> |
AddBranch(name, CName(obj), obj, bsize); |
93 |
|
} |
94 |
|
|
95 |
|
//__________________________________________________________________________________________________ |
97 |
|
void *obj) |
98 |
|
{ |
99 |
|
// Add branch with name "name" into tree with name "tname" and set its address |
100 |
< |
// to object pointer for class name "cname" using a given buffer size and default splitlevel. |
100 |
> |
// to object pointer for class name "cname" using a default buffer size and splitlevel. |
101 |
|
|
102 |
< |
MyTree *t = AddOrGetMyTree(GetName()); |
103 |
< |
t->Bronch(name, cname, obj, fDefBrSize, fDefSL); |
102 |
> |
MyTree *t = AddOrGetMyTree(GetName()); |
103 |
> |
TBranch *b = t->Bronch(name, cname, obj, fDefBrSize, fDefSL); |
104 |
> |
b->SetCompressionLevel(GetCompressLevel()); |
105 |
> |
} |
106 |
> |
|
107 |
> |
//__________________________________________________________________________________________________ |
108 |
> |
void TreeWriter::AddBranch(const char *name, void *obj) |
109 |
> |
{ |
110 |
> |
// Add branch with name "name" into tree with name "tname" and set its address |
111 |
> |
// to object pointer using a default buffer size and splitlevel. |
112 |
> |
|
113 |
> |
AddBranch(name, CName(obj), obj); |
114 |
|
} |
115 |
|
|
116 |
|
//__________________________________________________________________________________________________ |
120 |
|
// Add branch with name "name" into tree with name "tname" and set its address |
121 |
|
// to object pointer for class name "cname" using a given buffer size and splitlevel. |
122 |
|
|
123 |
< |
MyTree *t = AddOrGetMyTree(tname); |
124 |
< |
t->Bronch(name, cname, obj, bsize, level); |
123 |
> |
MyTree *t = AddOrGetMyTree(tname); |
124 |
> |
TBranch *b = t->Bronch(name, cname, obj, bsize, level); |
125 |
> |
b->SetCompressionLevel(GetCompressLevel()); |
126 |
> |
} |
127 |
> |
|
128 |
> |
//__________________________________________________________________________________________________ |
129 |
> |
void TreeWriter::AddBranchToTree(const char *tname, const char *name, void *obj, |
130 |
> |
Int_t bsize, Int_t level) |
131 |
> |
{ |
132 |
> |
// Add branch with name "name" into tree with name "tname" and set its address |
133 |
> |
// to object pointer using a given buffer size and splitlevel. |
134 |
> |
|
135 |
> |
AddBranchToTree(tname, name, CName(obj), obj, bsize, level); |
136 |
|
} |
137 |
|
|
138 |
|
//__________________________________________________________________________________________________ |
139 |
|
void TreeWriter::AddBranchToTree(const char *tname, const char *name, const char *cname, |
140 |
< |
void *obj, Int_t bsize) |
140 |
> |
void *obj, Int_t bsize) |
141 |
|
{ |
142 |
|
// Add branch with name "name" into tree with name "tname" and set its address |
143 |
|
// to object pointer for class name "cname" using a given buffer size and default splitlevel. |
144 |
|
|
145 |
< |
MyTree *t = AddOrGetMyTree(tname); |
146 |
< |
t->Bronch(name, cname, obj, bsize, fDefSL); |
145 |
> |
MyTree *t = AddOrGetMyTree(tname); |
146 |
> |
TBranch *b = t->Bronch(name, cname, obj, bsize, fDefSL); |
147 |
> |
b->SetCompressionLevel(GetCompressLevel()); |
148 |
> |
} |
149 |
> |
|
150 |
> |
//__________________________________________________________________________________________________ |
151 |
> |
void TreeWriter::AddBranchToTree(const char *tname, const char *name, void *obj, |
152 |
> |
Int_t bsize) |
153 |
> |
{ |
154 |
> |
// Add branch with name "name" into tree with name "tname" and set its address |
155 |
> |
// to object pointer using a given buffer size and default splitlevel. |
156 |
> |
|
157 |
> |
AddBranchToTree(tname, name, CName(obj), obj, bsize); |
158 |
|
} |
159 |
|
|
160 |
|
//__________________________________________________________________________________________________ |
161 |
|
void TreeWriter::AddBranchToTree(const char *tname, const char *name, const char *cname, |
162 |
< |
void *obj) |
162 |
> |
void *obj) |
163 |
|
{ |
164 |
|
// Add branch with name "name" into tree with name "tname" and set its address |
165 |
< |
// to object pointer for class name "cname" using a given buffer size and default splitlevel. |
165 |
> |
// to object pointer for class name "cname" using a default buffer size and splitlevel. |
166 |
|
|
167 |
< |
MyTree *t = AddOrGetMyTree(tname); |
168 |
< |
t->Bronch(name, cname, obj, fDefBrSize, fDefSL); |
167 |
> |
MyTree *t = AddOrGetMyTree(tname); |
168 |
> |
TBranch *b = t->Bronch(name, cname, obj, fDefBrSize, fDefSL); |
169 |
> |
b->SetCompressionLevel(GetCompressLevel()); |
170 |
> |
} |
171 |
> |
|
172 |
> |
//__________________________________________________________________________________________________ |
173 |
> |
void TreeWriter::AddBranchToTree(const char *tname, const char *name, void *obj) |
174 |
> |
{ |
175 |
> |
// Add branch with name "name" into tree with name "tname" and set its address |
176 |
> |
// to object pointer for class name "cname" using a default buffer size and splitlevel. |
177 |
> |
|
178 |
> |
AddBranchToTree(tname, name, CName(obj), obj); |
179 |
|
} |
180 |
|
|
181 |
|
//__________________________________________________________________________________________________ |
185 |
|
// present tree. |
186 |
|
|
187 |
|
MyTree *tree = dynamic_cast<MyTree*>(fTrees.FindObject(tn)); |
188 |
< |
if (tree) return tree; |
188 |
> |
if (tree) |
189 |
> |
return tree; |
190 |
|
|
191 |
|
TDirectory::TContext context(fFile); |
192 |
|
tree = new MyTree(tn, tn); |
241 |
|
} |
242 |
|
|
243 |
|
//__________________________________________________________________________________________________ |
244 |
+ |
const char *TreeWriter::CName(void *obj) const |
245 |
+ |
{ |
246 |
+ |
// Dereference void* pointer into TObject* pointer |
247 |
+ |
|
248 |
+ |
TObject *tobj = dynamic_cast<TObject*>(*(TObject**)obj); |
249 |
+ |
if (tobj==0) { |
250 |
+ |
Fatal("ClassName", "Given void* ptr can not be dereferenced into TObject*"); |
251 |
+ |
} |
252 |
+ |
return tobj->ClassName(); |
253 |
+ |
} |
254 |
+ |
|
255 |
+ |
//__________________________________________________________________________________________________ |
256 |
|
Bool_t TreeWriter::EndEvent(Bool_t doreset) |
257 |
|
{ |
258 |
|
// Store the event in the tree. If doreset or fDoObjNumReset is kTRUE |
267 |
|
Int_t r = 0; |
268 |
|
for (Int_t i=0;i<fTrees.GetEntries();++i) { |
269 |
|
MyTree *mt = static_cast<MyTree*>(fTrees.At(i)); |
270 |
< |
if (mt->GetAutoFill()==0) continue; |
270 |
> |
if (mt->GetAutoFill()==0) |
271 |
> |
continue; |
272 |
|
r += mt->Fill(); |
273 |
|
} |
274 |
|
|
290 |
|
//------------------------------------------------------------------------------------------------- |
291 |
|
Long64_t TreeWriter::GetEntries(const char *tn) const |
292 |
|
{ |
293 |
< |
// |
293 |
> |
// Return entries of tree with given name. If no tree is given, return sum of entries |
294 |
> |
// of all trees. |
295 |
|
|
296 |
|
if (fTrees.GetEntries()==0) return -1; |
297 |
|
|
298 |
|
if (tn) { |
299 |
|
const TTree *mt=GetTree(tn); |
300 |
< |
if (mt) return mt->GetEntries(); |
301 |
< |
else return -1; |
300 |
> |
if (mt) |
301 |
> |
return mt->GetEntries(); |
302 |
> |
else |
303 |
> |
return -1; |
304 |
|
} |
305 |
|
|
306 |
|
Long64_t ret = 0; |
445 |
|
{ |
446 |
|
// Set auto-fill mode of tree with given name. |
447 |
|
|
448 |
< |
if (fTrees.GetEntries()==0) return; |
448 |
> |
if (fTrees.GetEntries()==0) |
449 |
> |
return; |
450 |
|
|
451 |
|
MyTree *mt = GetMyTree(tn); |
452 |
< |
if (!mt) return; |
452 |
> |
if (!mt) |
453 |
> |
return; |
454 |
|
|
455 |
|
mt->SetAutoFill(b); |
456 |
|
} |
457 |
|
|
458 |
+ |
|
459 |
+ |
//------------------------------------------------------------------------------------------------- |
460 |
+ |
void TreeWriter::SetMaxSize(Long64_t s) |
461 |
+ |
{ |
462 |
+ |
// Set maximum file size. Check if this exceeds the ROOT file size and if, |
463 |
+ |
// print a warning and adjust it. |
464 |
+ |
|
465 |
+ |
if (s>=(Long64_t)(0.99 * TTree::GetMaxTreeSize())) { |
466 |
+ |
Long64_t news = (Long64_t)(s/0.99); |
467 |
+ |
Warning("SetMaxSize", "Maximum tree size increased from %lld to %lld", |
468 |
+ |
TTree::GetMaxTreeSize(), news); |
469 |
+ |
TTree::SetMaxTreeSize(news); |
470 |
+ |
} |
471 |
+ |
|
472 |
+ |
fMaxSize=s; |
473 |
+ |
} |
474 |
+ |
|
475 |
|
//__________________________________________________________________________________________________ |
476 |
|
void TreeWriter::StoreObject(const TObject *obj) |
477 |
|
{ |