41 const char* branchname ,
44 fHaveStaticClassOffsets(0),
45 fReadStatus(kReadNothingYet),
46 fBranchName(branchname),
105 &&
"leafness disagreement");
107 &&
"static class offset disagreement");
141 std::string ret = buf;
157 Error(
"TTreeReaderValueBase::GetLeaf()",
"Unable to get the branch from the tree");
163 Error(
"TTreeReaderValueBase::GetLeaf()",
"Failed to get the leaf from the branch");
179 Error(
"TTreeReaderValueBase::GetAddress()",
"Unable to get the leaf");
212 TRegexp leafNameExpression (
"\\.[a-zA-Z0-9_]+$");
217 std::vector<TString> nameStack;
218 nameStack.push_back(
TString());
227 while (!branch && branchName.
Contains(
".")){
238 TString traversingBranch = nameStack.back();
239 nameStack.pop_back();
245 std::vector<Long64_t> offsets;
252 while (nameStack.size() && found){
255 for (
int i = 0; i < myObjArray->
GetEntries(); ++i){
259 if (!strcmp(tempStreamerElement->
GetName(), traversingBranch.
Data())){
262 traversingBranch = nameStack.back();
263 nameStack.pop_back();
265 elementClass = tempStreamerElement->
GetClass();
273 if (!finalDataType) {
282 offsets.push_back(offset);
292 offsets.push_back(offset);
298 if (
fDict != finalDataType &&
fDict != elementClass){
299 errMsg =
"Wrong data type ";
300 errMsg += finalDataType ? finalDataType->
GetName() : elementClass ? elementClass->
GetName() :
"UNKNOWN";
310 errMsg =
"The tree does not have a branch called ";
312 errMsg +=
". You could check with TTree::Print() for available branches.";
319 myLeaf = branch->GetLeaf(
TString(leafName(1, leafName.
Length())));
321 errMsg =
"The tree does not have a branch, nor a sub-branch called ";
323 errMsg +=
". You could check with TTree::Print() for available branches.";
332 branchActualType =
fDict;
340 errMsg =
"Leaf of type ";
342 errMsg +=
" cannot be read by TTreeReaderValue<";
359 constexpr
const char* errPrefix =
"TTreeReaderValueBase::CreateProxy()";
367 Error(errPrefix,
"TTreeReader object not set / available for branch %s!",
376 const char* brDataType =
"{UNDETERMINED}";
377 if (branchFromFullName) {
381 Error(errPrefix,
"The template argument type T of %s accessing branch %s (which contains data of type %s) is not known to ROOT. You will need to create a dictionary for it.",
398 TLeaf *myLeaf =
nullptr;
416 branch = branchFromFullName;
421 if (errMsg.empty()) {
422 errMsg =
"The tree does not have a branch called ";
424 errMsg +=
". You could check with TTree::Print() for available branches.";
426 #pragma GCC diagnostic push 427 #pragma GCC diagnostic ignored "-Wformat-security" 428 Error(errPrefix, errMsg.c_str());
429 #pragma GCC diagnostic pop 444 if (!branchActualType) {
445 Error(errPrefix,
"The branch %s contains data of type %s, which does not have a dictionary.",
446 fBranchName.
Data(), branchActualTypeName ? branchActualTypeName :
"{UNDETERMINED TYPE}");
451 if (
fDict != branchActualType) {
454 bool complainAboutMismatch =
true;
455 if (dictdt && actualdt) {
458 complainAboutMismatch =
false;
463 complainAboutMismatch =
false;
466 if (complainAboutMismatch) {
468 "The branch %s contains data of type %s. It cannot be accessed by a TTreeReaderValue<%s>",
484 bool isTopLevel = branch->
GetMother() == branch;
486 membername = strrchr(branch->
GetName(),
'.');
487 if (membername.
IsNull()) {
488 membername = branch->
GetName();
567 return "TClonesArray";
568 }
else if (brElement->
GetType() == 31
569 || brElement->
GetType() == 41) {
571 Error(
"TTreeReaderValueBase::GetBranchDataType()",
"Must use TTreeReaderArray to access a member of an object that is stored in a collection.");
577 Error(
"TTreeReaderValueBase::GetBranchDataType()",
"Unknown type and class combination: %i, %s", brElement->
GetType(), brElement->
GetClassName());
588 if ((!dataTypeName || !dataTypeName[0])
595 Error(
"TTreeReaderValueBase::GetBranchDataType()",
"Must use TTreeReaderArray to read branch %s: it contains an array or a collection.", branch->
GetName());
604 Error(
"TTreeReaderValueBase::GetBranchDataType()",
"The branch %s was created using a leaf list and cannot be represented as a C++ type. Please access one of its siblings using a TTreeReaderArray:", branch->
GetName());
607 while ((leaf = (
TLeaf*) iLeaves())) {
608 Error(
"TTreeReaderValueBase::GetBranchDataType()",
" %s.%s", branch->
GetName(), leaf->GetName());
616 return "TClonesArray";
619 Error(
"TTreeReaderValueBase::GetBranchDataType()",
"The branch %s is a TBranchRef and cannot be represented as a C++ type.", branch->
GetName());
622 Error(
"TTreeReaderValueBase::GetBranchDataType()",
"The branch %s is of type %s - something that is not handled yet.", branch->
GetName(), branch->IsA()->
GetName());
ROOT::Internal::TNamedBranchProxy * FindProxy(const char *branchname) const
Describe Streamer information for one class version.
virtual const char * GetName() const
Returns name of object.
virtual const char * GetClassName() const
Return the name of the user class whose content is stored in this branch, if any. ...
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
static TDataType * GetDataType(EDataType type)
Given a EDataType type, get the TDataType* that represents it.
To read this branch, we need a dictionary.
TTreeReader is a simple, robust and fast interface to read values from a TTree, TChain or TNtuple...
The branch class type is not a collection.
virtual const char * GetTypeName() const
int fHaveStaticClassOffsets
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist...
virtual ~TTreeReaderValueBase()
Unregister from tree reader, cleanup.
Regular expression class.
static TDictionary * GetDictionary(const char *name)
TStreamerInfo * GetInfo() const
Get streamer info for the branch class.
EReadStatus ProxyRead()
Try to read the value from the TBranchProxy, returns the status of the read.
std::vector< Long64_t > fStaticClassOffsets
Type GetType(const std::string &Name)
The array cannot find its counter branch: Array[CounterBranch].
TObject * At(Int_t idx) const
Bool_t RegisterValueReader(ROOT::Internal::TTreeReaderValueBase *reader)
Add a value reader for this tree.
const Detail::TBranchProxy * GetProxy() const
TDictionary * GetDict() const
virtual TLeaf * GetLeaf(const char *name) const
Return pointer to the 1st Leaf named name in thisBranch.
std::string ResolveTypedef(const char *tname, bool resolveAll=false)
ESetupStatus fSetupStatus
char * DemangleTypeIdName(const std::type_info &ti, int &errorCode)
Demangle in a portable way the type id name.
TTreeReaderValueBase & operator=(const TTreeReaderValueBase &)
Copy-assign.
The specified branch cannot be found.
virtual TBranch * GetBranch(const char *name)
Return pointer to the branch with the given name in this tree or its friends.
virtual const char * GetTypeName() const
Return type name of element in the branch.
void SetDict(TDictionary *dict)
void RegisterWithTreeReader()
Register with tree reader.
ROOT::Internal::TBranchProxyDirector * fDirector
proxying director, owned
TTreeReader * fTreeReader
TTreeReaderValueBase(TTreeReader *reader, const char *branchname, TDictionary *dict)
Construct a tree value reader and register it with the reader object.
Basic data type descriptor (datatype information is obtained from CINT).
This class defines an abstract interface that must be implemented by all classes that contain diction...
void AddProxy(ROOT::Internal::TNamedBranchProxy *p)
virtual void CreateProxy()
Create the proxy object for our branch.
Some other error - hopefully the error message helps.
virtual TLeaf * GetLeafCount() const
If this leaf stores a variable-sized array or a multi-dimensional array whose last dimension has vari...
TClass * GetCurrentClass()
Return a pointer to the current type of the data member corresponding to branch element.
virtual void * GetValuePointer() const
TSubString Strip(EStripType s=kTrailing, char c=' ') const
Return a substring of self stripped at beginning and/or end.
void * GetAddress()
Returns the memory address of the object being read.
The ROOT global object gROOT contains a list of all defined classes.
No initialization has happened yet.
virtual Int_t GetLenStatic() const
Return the fixed length of this leaf.
A Branch for the case of an object.
static std::string GetElementTypeName(const std::type_info &ti)
Stringify the template argument.
virtual TObjArray * GetElements() const =0
virtual Bool_t IsaPointer() const
virtual const char * GetClassName() const
Return the name of the user class whose content is stored in this branch, if any. ...
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
void DeregisterValueReader(ROOT::Internal::TTreeReaderValueBase *reader)
Remove a value reader for this tree.
TObjArray * GetListOfLeaves()
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.
TBranch * SearchBranchWithCompositeName(TLeaf *&myleaf, TDictionary *&branchActualType, std::string &err)
Search a branch the name of which contains a ".".
TLeaf * GetLeaf()
If we are reading a leaf, return the corresponding TLeaf.
TObjArray * GetElements() const
const char * GetTypeName() const
Detail::TBranchProxy * fProxy
virtual const char * GetDerivedTypeName() const =0
void NotifyNewTree(TTree *newTree)
The TTreeReader has switched to a new TTree. Update the leaf.
Int_t GetEntries() const
Return the number of objects in array (i.e.
A TTree object has a header with a name and a title.
A TTree is a list of TBranches.
Abstract Interface class describing Streamer information for one class.
const char * GetBranchDataType(TBranch *branch, TDictionary *&dict) const
Retrieve the type of data stored by branch; put its dictionary into dict, return its type name...
TBranch * GetMother() const
Get our top-level parent branch in the tree.
virtual Int_t GetElementOffset(Int_t id) const =0
void Error(ErrorHandler_t func, int code, const char *va_(fmt),...)
Write error message and call a handler, if required.
TClass * GetClass() const
const char * Data() const