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 |
|
|
60 |
|
t->Bronch(name, cname, obj, bsize, level); |
61 |
|
} |
62 |
|
|
63 |
+ |
|
64 |
+ |
//__________________________________________________________________________________________________ |
65 |
+ |
void TreeWriter::AddBranch(const char *name, void *obj, Int_t bsize, Int_t level) |
66 |
+ |
{ |
67 |
+ |
// Add branch with name "name" into tree with name "tname" and set its address |
68 |
+ |
// to object pointer using a given buffer size and splitlevel. |
69 |
+ |
|
70 |
+ |
AddBranch(name, CName(obj), obj, bsize, level); |
71 |
+ |
} |
72 |
+ |
|
73 |
|
//__________________________________________________________________________________________________ |
74 |
|
void TreeWriter::AddBranch(const char *name, const char *cname, |
75 |
|
void *obj, Int_t bsize) |
82 |
|
} |
83 |
|
|
84 |
|
//__________________________________________________________________________________________________ |
85 |
+ |
void TreeWriter::AddBranch(const char *name, void *obj, Int_t bsize) |
86 |
+ |
{ |
87 |
+ |
// Add branch with name "name" into tree with name "tname" and set its address |
88 |
+ |
// to object pointer using a given buffer size and default splitlevel. |
89 |
+ |
|
90 |
+ |
AddBranch(name, CName(obj), obj, bsize); |
91 |
+ |
} |
92 |
+ |
|
93 |
+ |
//__________________________________________________________________________________________________ |
94 |
|
void TreeWriter::AddBranch(const char *name, const char *cname, |
95 |
|
void *obj) |
96 |
|
{ |
97 |
|
// Add branch with name "name" into tree with name "tname" and set its address |
98 |
< |
// to object pointer for class name "cname" using a given buffer size and default splitlevel. |
98 |
> |
// to object pointer for class name "cname" using a default buffer size and splitlevel. |
99 |
|
|
100 |
|
MyTree *t = AddOrGetMyTree(GetName()); |
101 |
|
t->Bronch(name, cname, obj, fDefBrSize, fDefSL); |
102 |
|
} |
103 |
|
|
104 |
|
//__________________________________________________________________________________________________ |
105 |
+ |
void TreeWriter::AddBranch(const char *name, void *obj) |
106 |
+ |
{ |
107 |
+ |
// Add branch with name "name" into tree with name "tname" and set its address |
108 |
+ |
// to object pointer using a default buffer size and splitlevel. |
109 |
+ |
|
110 |
+ |
AddBranch(name, CName(obj), obj); |
111 |
+ |
} |
112 |
+ |
|
113 |
+ |
//__________________________________________________________________________________________________ |
114 |
|
void TreeWriter::AddBranchToTree(const char *tname, const char *name, const char *cname, |
115 |
|
void *obj, Int_t bsize, Int_t level) |
116 |
|
{ |
122 |
|
} |
123 |
|
|
124 |
|
//__________________________________________________________________________________________________ |
125 |
+ |
void TreeWriter::AddBranchToTree(const char *tname, const char *name, void *obj, |
126 |
+ |
Int_t bsize, Int_t level) |
127 |
+ |
{ |
128 |
+ |
// Add branch with name "name" into tree with name "tname" and set its address |
129 |
+ |
// to object pointer using a given buffer size and splitlevel. |
130 |
+ |
|
131 |
+ |
AddBranchToTree(tname, name, CName(obj), obj, bsize, level); |
132 |
+ |
} |
133 |
+ |
|
134 |
+ |
//__________________________________________________________________________________________________ |
135 |
|
void TreeWriter::AddBranchToTree(const char *tname, const char *name, const char *cname, |
136 |
< |
void *obj, Int_t bsize) |
136 |
> |
void *obj, Int_t bsize) |
137 |
|
{ |
138 |
|
// Add branch with name "name" into tree with name "tname" and set its address |
139 |
|
// to object pointer for class name "cname" using a given buffer size and default splitlevel. |
143 |
|
} |
144 |
|
|
145 |
|
//__________________________________________________________________________________________________ |
146 |
+ |
void TreeWriter::AddBranchToTree(const char *tname, const char *name, void *obj, |
147 |
+ |
Int_t bsize) |
148 |
+ |
{ |
149 |
+ |
// Add branch with name "name" into tree with name "tname" and set its address |
150 |
+ |
// to object pointer using a given buffer size and default splitlevel. |
151 |
+ |
|
152 |
+ |
AddBranchToTree(tname, name, CName(obj), obj, bsize); |
153 |
+ |
} |
154 |
+ |
|
155 |
+ |
//__________________________________________________________________________________________________ |
156 |
|
void TreeWriter::AddBranchToTree(const char *tname, const char *name, const char *cname, |
157 |
< |
void *obj) |
157 |
> |
void *obj) |
158 |
|
{ |
159 |
|
// Add branch with name "name" into tree with name "tname" and set its address |
160 |
< |
// to object pointer for class name "cname" using a given buffer size and default splitlevel. |
160 |
> |
// to object pointer for class name "cname" using a default buffer size and splitlevel. |
161 |
|
|
162 |
|
MyTree *t = AddOrGetMyTree(tname); |
163 |
|
t->Bronch(name, cname, obj, fDefBrSize, fDefSL); |
164 |
|
} |
165 |
|
|
166 |
|
//__________________________________________________________________________________________________ |
167 |
+ |
void TreeWriter::AddBranchToTree(const char *tname, const char *name, void *obj) |
168 |
+ |
{ |
169 |
+ |
// Add branch with name "name" into tree with name "tname" and set its address |
170 |
+ |
// to object pointer for class name "cname" using a default buffer size and splitlevel. |
171 |
+ |
|
172 |
+ |
AddBranchToTree(tname, name, CName(obj), obj); |
173 |
+ |
} |
174 |
+ |
|
175 |
+ |
//__________________________________________________________________________________________________ |
176 |
|
MyTree *TreeWriter::AddOrGetMyTree(const char *tn) |
177 |
|
{ |
178 |
|
// Add new tree if not present in array of trees or return |
179 |
|
// present tree. |
180 |
|
|
181 |
|
MyTree *tree = dynamic_cast<MyTree*>(fTrees.FindObject(tn)); |
182 |
< |
if (tree) return tree; |
182 |
> |
if (tree) |
183 |
> |
return tree; |
184 |
|
|
185 |
|
TDirectory::TContext context(fFile); |
186 |
|
tree = new MyTree(tn, tn); |
235 |
|
} |
236 |
|
|
237 |
|
//__________________________________________________________________________________________________ |
238 |
+ |
const char *TreeWriter::CName(void *obj) const |
239 |
+ |
{ |
240 |
+ |
// Dereference void* pointer into TObject* pointer |
241 |
+ |
|
242 |
+ |
TObject *tobj = dynamic_cast<TObject*>(*(TObject**)obj); |
243 |
+ |
if (tobj==0) { |
244 |
+ |
Fatal("ClassName", "Given void* ptr can not be dereferenced into TObject*"); |
245 |
+ |
} |
246 |
+ |
return tobj->ClassName(); |
247 |
+ |
} |
248 |
+ |
|
249 |
+ |
//__________________________________________________________________________________________________ |
250 |
|
Bool_t TreeWriter::EndEvent(Bool_t doreset) |
251 |
|
{ |
252 |
|
// Store the event in the tree. If doreset or fDoObjNumReset is kTRUE |
261 |
|
Int_t r = 0; |
262 |
|
for (Int_t i=0;i<fTrees.GetEntries();++i) { |
263 |
|
MyTree *mt = static_cast<MyTree*>(fTrees.At(i)); |
264 |
< |
if (mt->GetAutoFill()==0) continue; |
264 |
> |
if (mt->GetAutoFill()==0) |
265 |
> |
continue; |
266 |
|
r += mt->Fill(); |
267 |
|
} |
268 |
|
|
290 |
|
|
291 |
|
if (tn) { |
292 |
|
const TTree *mt=GetTree(tn); |
293 |
< |
if (mt) return mt->GetEntries(); |
294 |
< |
else return -1; |
293 |
> |
if (mt) |
294 |
> |
return mt->GetEntries(); |
295 |
> |
else |
296 |
> |
return -1; |
297 |
|
} |
298 |
|
|
299 |
|
Long64_t ret = 0; |
438 |
|
{ |
439 |
|
// Set auto-fill mode of tree with given name. |
440 |
|
|
441 |
< |
if (fTrees.GetEntries()==0) return; |
441 |
> |
if (fTrees.GetEntries()==0) |
442 |
> |
return; |
443 |
|
|
444 |
|
MyTree *mt = GetMyTree(tn); |
445 |
< |
if (!mt) return; |
445 |
> |
if (!mt) |
446 |
> |
return; |
447 |
|
|
448 |
|
mt->SetAutoFill(b); |
449 |
|
} |
450 |
|
|
451 |
+ |
|
452 |
+ |
//------------------------------------------------------------------------------------------------- |
453 |
+ |
void TreeWriter::SetMaxSize(Long64_t s) |
454 |
+ |
{ |
455 |
+ |
// Set maximum file size. Check if this exceeds the ROOT file size and if, |
456 |
+ |
// print a warning and adjust it. |
457 |
+ |
|
458 |
+ |
if (s>=(Long64_t)(0.99 * TTree::GetMaxTreeSize())) { |
459 |
+ |
Long64_t news = (Long64_t)(s/0.99); |
460 |
+ |
Warning("SetMaxSize", "Maximum tree size increased from %lld to %lld", |
461 |
+ |
TTree::GetMaxTreeSize(), news); |
462 |
+ |
TTree::SetMaxTreeSize(news); |
463 |
+ |
} |
464 |
+ |
|
465 |
+ |
fMaxSize=s; |
466 |
+ |
} |
467 |
+ |
|
468 |
|
//__________________________________________________________________________________________________ |
469 |
|
void TreeWriter::StoreObject(const TObject *obj) |
470 |
|
{ |