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");
205 Error(
"TTreeReaderValueBase::CreateProxy()",
"TTreeReader object not set / available for branch %s!",
212 const char* brDataType =
"{UNDETERMINED}";
217 Error(
"TTreeReaderValueBase::CreateProxy()",
"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.",
241 TLeaf *myLeaf = NULL;
246 TRegexp leafNameExpression (
"\\.[a-zA-Z0-9_]+$");
251 std::vector<TString> nameStack;
252 nameStack.push_back(
TString());
261 while (!branch && branchName.
Contains(
".")){
272 TString traversingBranch = nameStack.back();
273 nameStack.pop_back();
279 std::vector<Long64_t> offsets;
286 while (nameStack.size() && found){
289 for (
int i = 0; i < myObjArray->
GetEntries(); ++i){
293 if (!strcmp(tempStreamerElement->
GetName(), traversingBranch.
Data())){
296 traversingBranch = nameStack.back();
297 nameStack.pop_back();
299 elementClass = tempStreamerElement->
GetClass();
307 if (!finalDataType) {
316 offsets.push_back(offset);
326 offsets.push_back(offset);
332 if (
fDict != finalDataType &&
fDict != elementClass){
333 Error(
"TTreeReaderValueBase::CreateProxy",
"Wrong data type %s", finalDataType ? finalDataType->
GetName() : elementClass ? elementClass->
GetName() :
"UNKNOWN");
343 Error(
"TTreeReaderValueBase::CreateProxy()",
"The tree does not have a branch called %s. You could check with TTree::Print() for available branches.",
fBranchName.
Data());
350 myLeaf = branch->GetLeaf(
TString(leafName(1, leafName.
Length())));
352 Error(
"TTreeReaderValueBase::CreateProxy()",
353 "The tree does not have a branch, nor a sub-branch called %s. You could check with TTree::Print() for available branches.",
fBranchName.
Data());
362 branchActualType =
fDict;
370 Error(
"TTreeReaderValueBase::CreateProxy()",
378 Error(
"TTreeReaderValueBase::CreateProxy()",
"The tree does not have a branch called %s. You could check with TTree::Print() for available branches.",
fBranchName.
Data());
387 if (!branchActualType) {
388 Error(
"TTreeReaderValueBase::CreateProxy()",
"The branch %s contains data of type %s, which does not have a dictionary.",
389 fBranchName.
Data(), branchActualTypeName ? branchActualTypeName :
"{UNDETERMINED TYPE}");
394 if (
fDict != branchActualType) {
397 bool complainAboutMismatch =
true;
398 if (dictdt && actualdt) {
401 complainAboutMismatch =
false;
406 complainAboutMismatch =
false;
409 if (complainAboutMismatch) {
410 Error(
"TTreeReaderValueBase::CreateProxy()",
411 "The branch %s contains data of type %s. It cannot be accessed by a TTreeReaderValue<%s>",
421 if (namedProxy && !namedProxy->
GetDict()) {
436 bool isTopLevel = branch->
GetMother() == branch;
438 membername = strrchr(branch->
GetName(),
'.');
439 if (membername.
IsNull()) {
440 membername = branch->
GetName();
513 return "TClonesArray";
514 }
else if (brElement->
GetType() == 31
515 || brElement->
GetType() == 41) {
517 Error(
"TTreeReaderValueBase::GetBranchDataType()",
"Must use TTreeReaderArray to access a member of an object that is stored in a collection.");
523 Error(
"TTreeReaderValueBase::GetBranchDataType()",
"Unknown type and class combination: %i, %s", brElement->
GetType(), brElement->
GetClassName());
534 if ((!dataTypeName || !dataTypeName[0])
547 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());
550 while ((leaf = (
TLeaf*) iLeaves())) {
551 Error(
"TTreeReaderValueBase::GetBranchDataType()",
" %s.%s", branch->
GetName(), leaf->GetName());
559 return "TClonesArray";
562 Error(
"TTreeReaderValueBase::GetBranchDataType()",
"The branch %s is a TBranchRef and cannot be represented as a C++ type.", branch->
GetName());
565 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)
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.
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.
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)
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.
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