Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TBranchProxy.cxx
Go to the documentation of this file.
1// @(#)root/base:$Id$
2// Author: Philippe Canal 13/05/2003
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun, Fons Rademakers and al. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class ROOT::Detail::TBranchProxy
13Base class for all the proxy object. It includes the implementation
14of the autoloading of branches as well as all the generic setup routine.
15*/
16
17#include "TBranchProxy.h"
18#include "TLeaf.h"
19#include "TBranchElement.h"
20#include "TBranchObject.h"
21#include "TCollection.h" // TRangeStaticCast
22#include "TStreamerElement.h"
23#include "TStreamerInfo.h"
24#include "ROOT/InternalTreeUtils.hxx" // GetFileNamesFromTree, GetTreeFullPaths
25
26#include <string>
27#include <string_view>
28
30
31using namespace ROOT::Internal;
32
33namespace {
34/**
35 * \brief Find if the input branch name is the prefix for other sub-branches in the same tree.
36 */
37bool AreThereSubBranches(std::string_view parentBrName, TTree &tree)
38{
39 const std::string prefix = [&parentBrName]() {
40 if (parentBrName.back() == '.')
41 return std::string(parentBrName);
42 return std::string(parentBrName) + '.';
43 }();
44
45 for (auto *leaf : ROOT::Detail::TRangeStaticCast<TLeaf>(tree.GetListOfLeaves()))
46 // Compares the prefix string with the leaf name, checking if the first
47 // `prefix.size()` characters match those of the prefix, i.e. if the leaf
48 // name starts with the prefix
49 if (prefix.compare(0, prefix.size(), leaf->GetName(), prefix.size()) == 0)
50 return true;
51 return false;
52}
53} // namespace
54
55////////////////////////////////////////////////////////////////////////////////
56/// Constructor.
57
59 fDirector(nullptr), fInitialized(false), fIsMember(false), fIsClone(false), fIsaPointer(false),
60 fHasLeafCount(false), fBranchName(""), fParent(nullptr), fDataMember(""),
61 fClassName(""), fClass(nullptr), fElement(nullptr), fMemberOffset(0), fOffset(0), fArrayLength(1),
62 fBranch(nullptr), fBranchCount(nullptr),
63 fNotify(this),
64 fRead(-1), fWhere(nullptr),fCollection(nullptr)
65{
66};
67
68////////////////////////////////////////////////////////////////////////////////
69/// Constructor.
70
72 const char* name) :
73 fDirector(boss), fInitialized(false), fIsMember(false), fIsClone(false), fIsaPointer(false),
74 fHasLeafCount(false), fBranchName(top), fParent(nullptr), fDataMember(""),
75 fClassName(""), fClass(nullptr), fElement(nullptr), fMemberOffset(0), fOffset(0), fArrayLength(1),
76 fBranch(nullptr), fBranchCount(nullptr),
77 fNotify(this),
78 fRead(-1), fWhere(nullptr),fCollection(nullptr)
79{
80 if (fBranchName.Length() && fBranchName[fBranchName.Length()-1]!='.' && name) {
81 ((TString&)fBranchName).Append(".");
82 }
83 if (name) ((TString&)fBranchName).Append(name);
84 boss->Attach(this);
85}
86
87////////////////////////////////////////////////////////////////////////////////
88/// Constructor.
89
90ROOT::Detail::TBranchProxy::TBranchProxy(TBranchProxyDirector* boss, const char *top, const char *name, const char *membername) :
91 fDirector(boss), fInitialized(false), fIsMember(true), fIsClone(false), fIsaPointer(false),
92 fHasLeafCount(false), fBranchName(top), fParent(nullptr), fDataMember(membername),
93 fClassName(""), fClass(nullptr), fElement(nullptr), fMemberOffset(0), fOffset(0), fArrayLength(1),
94 fBranch(nullptr), fBranchCount(nullptr),
95 fNotify(this),
96 fRead(-1), fWhere(nullptr),fCollection(nullptr)
97{
98 if (name && strlen(name)) {
99 if (fBranchName.Length() && fBranchName[fBranchName.Length()-1]!='.') {
100 ((TString&)fBranchName).Append(".");
101 }
102 ((TString&)fBranchName).Append(name);
103 }
104 boss->Attach(this);
105}
106
107////////////////////////////////////////////////////////////////////////////////
108/// Constructor.
109
110ROOT::Detail::TBranchProxy::TBranchProxy(TBranchProxyDirector* boss, Detail::TBranchProxy *parent, const char* membername, const char* top,
111 const char* name) :
112 fDirector(boss), fInitialized(false), fIsMember(true), fIsClone(false), fIsaPointer(false),
113 fHasLeafCount(false), fBranchName(top), fParent(parent), fDataMember(membername),
114 fClassName(""), fClass(nullptr), fElement(nullptr), fMemberOffset(0), fOffset(0), fArrayLength(1),
115 fBranch(nullptr), fBranchCount(nullptr),
116 fNotify(this),
117 fRead(-1), fWhere(nullptr),fCollection(nullptr)
119 if (name && strlen(name)) {
120 if (fBranchName.Length() && fBranchName[fBranchName.Length()-1]!='.') {
121 ((TString&)fBranchName).Append(".");
122 }
123 ((TString&)fBranchName).Append(name);
124 }
125 boss->Attach(this);
126}
127
128////////////////////////////////////////////////////////////////////////////////
129/// Constructor.
130
132 fDirector(boss), fInitialized(false), fIsMember(membername != nullptr && membername[0]), fIsClone(false), fIsaPointer(false),
133 fHasLeafCount(false), fBranchName(branch->GetName()), fParent(nullptr), fDataMember(membername),
134 fClassName(""), fClass(nullptr), fElement(nullptr), fMemberOffset(0), fOffset(0), fArrayLength(1),
135 fBranch(nullptr), fBranchCount(nullptr),
136 fNotify(this),
137 fRead(-1), fWhere(nullptr),fCollection(nullptr)
138{
139 boss->Attach(this);
140}
141
142////////////////////////////////////////////////////////////////////////////////
143/// For a fullBranchName that might contain a leading friend tree path (but
144/// access elements designating a leaf), but the leaf name such that it matches
145/// the "path" to branch.
146
147static std::string GetFriendBranchName(TTree* directorTree, TBranch* branch, const char* fullBranchName)
148{
149 // ROOT-10046: Here we need to ask for the tree with GetTree otherwise, if directorTree
150 // is a chain, this check is bogus and a bug can occur (ROOT-10046)
151 if (directorTree->GetTree() == branch->GetTree())
152 return branch->GetFullName().Data();
153
154 // Friend case:
155 std::string sFullBranchName = fullBranchName;
156 std::string::size_type pos = sFullBranchName.rfind(branch->GetFullName());
157 if (pos != std::string::npos) {
158 sFullBranchName.erase(pos);
159 sFullBranchName += branch->GetFullName();
160 }
161 return sFullBranchName;
162}
163
164////////////////////////////////////////////////////////////////////////////////
165/// Constructor taking the branch name, possibly of a friended tree.
166/// Used by TTreeReaderValue in place of TFriendProxy.
167
169 const char *membername, bool suppressMissingBranchError)
170 : fDirector(boss),
171 fInitialized(false),
172 fIsMember(membername != nullptr && membername[0]),
173 fIsClone(false),
174 fIsaPointer(false),
175 fHasLeafCount(false),
176 fSuppressMissingBranchError(suppressMissingBranchError),
177 fBranchName(GetFriendBranchName(boss->GetTree(), branch, branchname)),
178 fParent(nullptr),
179 fDataMember(membername),
180 fClassName(""),
181 fClass(nullptr),
182 fElement(nullptr),
183 fMemberOffset(0),
184 fOffset(0),
185 fArrayLength(1),
186 fBranch(nullptr),
187 fBranchCount(nullptr),
188 fNotify(this),
189 fRead(-1),
190 fWhere(nullptr),
191 fCollection(nullptr)
192{
193 // Constructor.
194
195 boss->Attach(this);
196}
197
198////////////////////////////////////////////////////////////////////////////////
199/// Typical Destructor
200
202{
203 if (fNotify.IsLinked() && fDirector && fDirector->GetTree())
204 fNotify.RemoveLink(*(fDirector->GetTree()));
205}
206
207////////////////////////////////////////////////////////////////////////////////
208/// Completely reset the object.
209
211{
212 fWhere = nullptr;
213 fBranch = nullptr;
214 fBranchCount = nullptr;
215 fRead = -1;
216 fClass = nullptr;
217 fElement = nullptr;
218 fMemberOffset = 0;
219 fOffset = 0;
220 fArrayLength = 1;
221 fIsClone = false;
222 fInitialized = false;
223 fHasLeafCount = false;
224 delete fCollection;
225 fCollection = nullptr;
226}
227
228////////////////////////////////////////////////////////////////////////////////
229/// Display the content of the object
230
232{
233 std::cout << "fBranchName " << fBranchName << std::endl;
234 //std::cout << "fTree " << fDirector->fTree << std::endl;
235 std::cout << "fBranch " << fBranch << std::endl;
236 if (fHasLeafCount)
237 std::cout << "fLeafCount " << fLeafCount << std::endl;
238 else if (fBranchCount)
239 std::cout << "fBranchCount " << fBranchCount << std::endl;
240}
241
242
243////////////////////////////////////////////////////////////////////////////////
244/// Initialize/cache the necessary information.
245
247{
248 // Should we check the type?
249
250 if (!fDirector->GetTree()) {
251 return false;
252 }
253 if (!fNotify.IsLinked()) {
254 fNotify.PrependLink(*fDirector->GetTree());
255 }
256 if (fParent) {
257
258 if (!fParent->Setup()) {
259 return false;
260 }
261
262 TClass *pcl = fParent->GetClass();
263 R__ASSERT(pcl);
264
265 if (pcl==TClonesArray::Class()) {
266 // We always skip the clones array
267
268 Int_t i = fDirector->GetReadEntry();
269 if (i<0) fDirector->SetReadEntry(0);
270 if (fParent->Read()) {
271 if (i<0) fDirector->SetReadEntry(i);
272
273 TClonesArray *clones;
274 clones = (TClonesArray*)fParent->GetStart();
275
276 if (clones) pcl = clones->GetClass();
277 }
278 } else if (pcl->GetCollectionProxy()) {
279 // We always skip the collections.
280
281 if (fCollection) delete fCollection;
282 fCollection = pcl->GetCollectionProxy()->Generate();
283 pcl = fCollection->GetValueClass();
284 if (pcl == nullptr) {
285 // coverity[dereference] fparent is checked jus a bit earlier and can not be null here
286 Error("Setup","Not finding TClass for collection for the data member %s seems no longer be in class %s",fDataMember.Data(),fParent->GetClass()->GetName());
287 return false;
288 }
289 }
290
291 fElement = (TStreamerElement*)pcl->GetStreamerInfo()->GetStreamerElement(fDataMember, fOffset);
292 if (fElement) {
293 fIsaPointer = fElement->IsaPointer();
294 fClass = fElement->GetClassPointer();
295 fMemberOffset = fElement->GetOffset();
296 fArrayLength = fElement->GetArrayLength();
297 } else {
298 Error("Setup","Data member %s seems no longer be in class %s",fDataMember.Data(),pcl->GetName());
299 return false;
300 }
301
302 fIsClone = (fClass==TClonesArray::Class());
303
304 fWhere = fParent->fWhere; // not really used ... it is reset by GetStart and GetClStart
305
306 if (fParent->IsaPointer()) {
307 // fprintf(stderr,"non-split pointer de-referencing non implemented yet \n");
308 // nothing to do!
309 } else {
310 // Accumulate offsets.
311 // or not!? fOffset = fMemberOffset = fMemberOffset + fParent->fOffset;
312 }
313
314 // This is not sufficient for following pointers
315
316 } else {
317
318 // This does not allow (yet) to precede the branch name with
319 // its mother's name
320 fBranch = fDirector->GetTree()->GetBranch(fBranchName.Data());
321 if (!fBranch) {
322 if (!fSuppressMissingBranchError && !AreThereSubBranches(fBranchName.View(), *fDirector->GetTree())) {
323 // The next error refers specifically to the situation where the branch identified by fBranchName
324 // is not present and that is not expected. An example is when traversing a chain of files, the branch
325 // is missing from the file that we are switching into.
326 // Conversely, there are situations where the missing branch is indeed expected. A notable example is when
327 // the TTree contains a split object, the branch referring to the whole object type will actually be elided
328 // and will not be found by `TTree::GetBranch`, only the data members will be present as sub branches.
329 auto *tree = fDirector->GetTree()->GetTree(); // Double GetTree to extract the current TTree being processed
330 Error("TBranchProxy::Setup()", "%s",
331 Form("Branch '%s' is not available from tree '%s' in file '%s'.", fBranchName.Data(),
334 }
335 return false;
336 }
337
338 fWhere = (double*)fBranch->GetAddress();
339
340 if (!fWhere && fBranch->IsA()==TBranchElement::Class()
341 && ((TBranchElement*)fBranch)->GetMother()) {
342
343 TBranchElement* be = ((TBranchElement*)fBranch);
344
345 be->GetMother()->SetAddress(nullptr);
346 fWhere = (double*)fBranch->GetAddress();
347
348 }
349 if (fBranch->IsA()==TBranch::Class()) {
350 TLeaf *leaf2 = nullptr;
351 if (fDataMember.Length()) {
352 leaf2 = fBranch->GetLeaf(fDataMember);
353 } else if (!fWhere) {
354 leaf2 = (TLeaf*)fBranch->GetListOfLeaves()->At(0); // fBranch->GetLeaf(fLeafname);
355 fWhere = leaf2->GetValuePointer();
356 }
357 if (leaf2) {
358 fWhere = leaf2->GetValuePointer();
359 fArrayLength = leaf2->GetLen();
360 if (leaf2->GetLeafCount()) {
361 fLeafCount = leaf2->GetLeafCount();
362 fHasLeafCount = true;
363 }
364 }
365 } else if (fBranch->IsA() == TBranchElement::Class()) {
366 // Calculate fBranchCount for a leaf.
367 TLeaf *leaf = (TLeaf*) fBranch->GetListOfLeaves()->At(0); // fBranch->GetLeaf(fLeafname);
368 if (leaf)
369 leaf = leaf->GetLeafCount();
370 if (leaf) {
371 fBranchCount = dynamic_cast<TBranchElement*>(leaf->GetBranch());
372 }
373 }
374
375 if (!fWhere) {
376 fBranch->SetupAddresses();
377 fWhere = (double*)fBranch->GetAddress();
378 }
379
380
381 if (fWhere && fBranch->IsA()==TBranchElement::Class()) {
382
383 TBranchElement* be = ((TBranchElement*)fBranch);
384
385 TStreamerInfo * info = be->GetInfo();
386 Int_t id = be->GetID();
387 if (be->GetType() == 3) {
388 fClassName = "TClonesArray";
390 } else if (id>=0) {
391 fOffset = info->GetElementOffset(id);
392 fElement = (TStreamerElement*)info->GetElements()->At(id);
393 fIsaPointer = fElement->IsaPointer();
394 fClass = fElement->GetClassPointer();
395
396 if ((fIsMember || (be->GetType()!=3 && be->GetType() !=4))
397 && (be->GetType()!=31 && be->GetType()!=41)) {
398
400 Int_t i = be->GetTree()->GetReadEntry();
401 if (i<0) i = 0;
402 be->GetEntry(i);
403
404 TClonesArray *clones;
405 if ( fIsMember && be->GetType()==3 ) {
406 clones = (TClonesArray*)be->GetObject();
407 } else if (fIsaPointer) {
408 clones = (TClonesArray*)*(void**)((char*)fWhere+fOffset);
409 } else {
410 clones = (TClonesArray*)((char*)fWhere+fOffset);
411 }
412 if (!fIsMember) fIsClone = true;
413 fClass = clones->GetClass();
414 } else if (fClass && fClass->GetCollectionProxy()) {
415 delete fCollection;
416 fCollection = fClass->GetCollectionProxy()->Generate();
417 fClass = fCollection->GetValueClass();
418 }
419
420 }
421 if (fClass) fClassName = fClass->GetName();
422 } else {
423 fClassName = be->GetClassName();
424 fClass = TClass::GetClass(fClassName);
425 }
426
427 if (be->GetType()==3) {
428 // top level TClonesArray
429
430 if (!fIsMember) fIsClone = true;
431 fIsaPointer = false;
432 fWhere = be->GetObject();
433
434 } else if (be->GetType()==4) {
435 // top level TClonesArray
436
437 fCollection = be->GetCollectionProxy()->Generate();
438 fIsaPointer = false;
439 fWhere = be->GetObject();
440
441 } else if (id<0) {
442 // top level object
443
444 fIsaPointer = false;
445 fWhere = be->GetObject();
446
447 } else if (be->GetType()==41) {
448
449 fCollection = be->GetCollectionProxy()->Generate();
450 fWhere = be->GetObject();
451 fOffset += be->GetOffset();
452
453 } else if (be->GetType()==31) {
454
455 fWhere = be->GetObject();
456 fOffset += be->GetOffset();
457
458 } else if (be->GetType()==2) {
459 // this might also be the right path for GetType()==1
460
461 fWhere = be->GetObject();
462
463 } else {
464
465 // fWhere = ((unsigned char*)fWhere) + fOffset;
466 fWhere = ((unsigned char*)be->GetObject()) + fOffset;
467
468 }
469 } else if (fBranch->IsA() == TBranchObject::Class()) {
470 fIsaPointer = true; // this holds for all cases we test
471 fClassName = fBranch->GetClassName();
472 fClass = TClass::GetClass(fClassName);
473 } else {
474 fClassName = fBranch->GetClassName();
475 fClass = TClass::GetClass(fClassName);
476 }
477
478 /*
479 fClassName = fBranch->GetClassName(); // What about TClonesArray?
480 if ( fBranch->IsA()==TBranchElement::Class() &&
481 ((TBranchElement*)fBranch)->GetType()==31 ||((TBranchElement*)fBranch)->GetType()==3 ) {
482
483 Int_t id = ((TBranchElement*)fBranch)->GetID();
484 if (id>=0) {
485
486 fElement = ((TStreamerElement*)(((TBranchElement*)fBranch)->GetInfo())->GetElements()->At(id));
487 fClass = fElement->GetClassPointer();
488 if (fClass) fClassName = fClass->GetName();
489
490 }
491 }
492 if (fClass==0 && fClassName.Length()) fClass = TClass::GetClass(fClassName);
493 */
494 //fprintf(stderr,"For %s fClass is %p which is %s\n",
495 // fBranchName.Data(),fClass,fClass==0?"not set":fClass->GetName());
496
497 if ( fBranch->IsA()==TBranchElement::Class() &&
498 (((TBranchElement*)fBranch)->GetType()==3 || fClass==TClonesArray::Class()) &&
499 !fIsMember ) {
500 fIsClone = true;
501 }
502
503 if (fIsMember) {
504 if ( fBranch->IsA()==TBranchElement::Class() &&
506 (((TBranchElement*)fBranch)->GetType()==31 || ((TBranchElement*)fBranch)->GetType()==3) ) {
507
508 TBranchElement *bcount = ((TBranchElement*)fBranch)->GetBranchCount();
509 TString member;
510 if (bcount) {
511 TString bname = fBranch->GetName();
512 TString bcname = bcount->GetName();
513 member = bname.Remove(0,bcname.Length()+1);
514 } else {
515 member = fDataMember;
516 }
517
518 fMemberOffset = fClass->GetDataMemberOffset(member);
519
520 if (fMemberOffset<0) {
521 Error("Setup","%s",Form("Negative offset %d for %s in %s",
522 fMemberOffset,fBranch->GetName(),
523 bcount?bcount->GetName():"unknown"));
524 }
525
526 } else if (fClass) {
527
528 fElement = (TStreamerElement*)
529 fClass->GetStreamerInfo()->GetElements()->FindObject(fDataMember);
530 if (fElement)
531 fMemberOffset = fElement->GetOffset();
532 else {
533 // Need to compose the proper sub name
534
535 TString member;
536
537 member += fDataMember;
538 fMemberOffset = fClass->GetDataMemberOffset(member);
539
540 }
541 // The extra condition (fElement is not a TStreamerSTL) is to handle the case where fBranch is a
542 // TBranchElement and fElement is a TStreamerSTL. Without the extra condition we get an error
543 // message, although the vector (i.e. the TBranchElement) is accessible.
544 } else if (fBranch->IsA() != TBranch::Class() && fElement->IsA() != TStreamerBasicType::Class()
545 && fElement->IsA() != TStreamerSTL::Class()) {
546 Error("Setup","%s",Form("Missing TClass object for %s\n",fClassName.Data()));
547 }
548
549 if ( fBranch->IsA()==TBranchElement::Class()
550 && (((TBranchElement*)fBranch)->GetType()==31 || ((TBranchElement*)fBranch)->GetType()==3) ) {
551
552 fOffset = fMemberOffset;
553
554 } else {
555
556 fWhere = ((unsigned char*)fWhere) + fMemberOffset;
557 }
558 }
559 }
560 if (fClass==TClonesArray::Class()) fIsClone = true;
561 if (fWhere!=nullptr) {
562 fInitialized = true;
563 return true;
564 } else {
565 return false;
566 }
567}
Cppyy::TCppType_t fClass
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
#define ClassImp(name)
Definition Rtypes.h:382
static std::string GetFriendBranchName(TTree *directorTree, TBranch *branch, const char *fullBranchName)
For a fullBranchName that might contain a leading friend tree path (but access elements designating a...
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Definition TError.h:125
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
Definition TError.cxx:185
char name[80]
Definition TGX11.cxx:110
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2489
Base class for all the proxy object.
bool Setup()
Initialize/cache the necessary information.
void Reset()
Completely reset the object.
virtual void Print()
Display the content of the object.
virtual ~TBranchProxy()
Typical Destructor.
void Attach(Detail::TBranchProxy *p)
Attach a TBranchProxy object to this director.
A Branch for the case of an object.
TBranchElement * GetBranchCount() const
static TClass * Class()
Int_t GetID() const
const char * GetClassName() const override
Return the name of the user class whose content is stored in this branch, if any.
TStreamerInfo * GetInfo() const
Get streamer info for the branch class.
void SetupAddresses() override
If the branch address is not set, we set all addresses starting with the top level parent branch.
TVirtualCollectionProxy * GetCollectionProxy()
Return the collection proxy describing the branch content, if any.
Int_t GetEntry(Long64_t entry=0, Int_t getall=0) override
Read all branches of a BranchElement and return total number of bytes.
char * GetObject() const
Return a pointer to our object.
Int_t GetType() const
TClass * IsA() const override
static TClass * Class()
A TTree is a list of TBranches.
Definition TBranch.h:93
TTree * GetTree() const
Definition TBranch.h:252
static TClass * Class()
virtual TString GetFullName() const
Return the 'full' name of the branch.
Definition TBranch.cxx:2031
virtual void SetAddress(void *add)
Set address of this branch.
Definition TBranch.cxx:2682
Int_t GetOffset() const
Definition TBranch.h:235
TBranch * GetMother() const
Get our top-level parent branch in the tree.
Definition TBranch.cxx:2127
TClass instances represent classes, structs and namespaces in the ROOT type system.
Definition TClass.h:81
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0, Bool_t isTransient=kFALSE) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist,...
Definition TClass.cxx:4666
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
Definition TClass.cxx:2964
TClass * IsA() const override
Definition TClass.h:618
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Definition TClass.cxx:3035
An array of clone (identical) objects.
TClass * GetClass() const
static TClass * Class()
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
Definition TLeaf.h:57
virtual void * GetValuePointer() const
Definition TLeaf.h:138
virtual Int_t GetLen() const
Return the number of effective elements of this leaf, for the current entry.
Definition TLeaf.cxx:404
virtual TLeaf * GetLeafCount() const
If this leaf stores a variable-sized array or a multi-dimensional array whose last dimension has vari...
Definition TLeaf.h:121
TBranch * GetBranch() const
Definition TLeaf.h:116
const char * GetName() const override
Returns name of object.
Definition TNamed.h:47
TObject * At(Int_t idx) const override
Definition TObjArray.h:164
static TClass * Class()
virtual Bool_t IsaPointer() const
Describes a persistent version of a class.
Int_t GetElementOffset(Int_t id) const override
TObjArray * GetElements() const override
static TClass * Class()
Basic string class.
Definition TString.h:139
Ssiz_t Length() const
Definition TString.h:417
const char * Data() const
Definition TString.h:376
TString & Remove(Ssiz_t pos)
Definition TString.h:685
A TTree represents a columnar dataset.
Definition TTree.h:79
virtual Long64_t GetReadEntry() const
Definition TTree.h:549
virtual TTree * GetTree() const
Definition TTree.h:557
virtual TClass * GetValueClass() const =0
If the value type is a user-defined class, return a pointer to the TClass representing the value type...
virtual TVirtualCollectionProxy * Generate() const =0
Returns a clean object of the actual class that derives from TVirtualCollectionProxy.
virtual TStreamerElement * GetStreamerElement(const char *datamember, Int_t &offset) const =0
std::vector< std::string > GetTreeFullPaths(const TTree &tree)
std::vector< std::string > GetFileNamesFromTree(const TTree &tree)
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...