45 ~TClonesReader()
override {}
50 Error(
"TClonesReader::GetCA()",
"Read error in TBranchProxy.");
75 ~TSTLReader()
override {}
80 Error(
"TSTLReader::GetCP()",
"Read error in TBranchProxy.");
84 Error(
"TSTLReader::GetCP()",
"Logic error, proxy object not set in TBranchProxy.");
93 if (!myCollectionProxy)
return 0;
94 return myCollectionProxy->
Size();
99 if (!myCollectionProxy)
return nullptr;
101 return *(
void**)myCollectionProxy->
At(idx);
104 return myCollectionProxy->
At(idx);
116 if (!proxy->
Read()) {
119 Error(
"TCollectionLessSTLReader::GetCP()",
"Read error in TBranchProxy.");
123 Error(
"TCollectionLessSTLReader::GetCP()",
"Logic error, proxy object not set in TBranchProxy.");
127 return fLocalCollection;
132 if (!myCollectionProxy)
return 0;
137 return myCollectionProxy->
Size();
142 if (!myCollectionProxy)
return nullptr;
149 return *(
void**)myCollectionProxy->
At(idx);
151 return myCollectionProxy->
At(idx);
161 Int_t fBasicTypeSize;
163 TObjectArrayReader() : fBasicTypeSize(-1) { }
164 ~TObjectArrayReader()
override {}
169 Error(
"TObjectArrayReader::GetCP()",
"Read error in TBranchProxy.");
177 if (!myCollectionProxy)
return 0;
178 return myCollectionProxy->
Size();
181 if (!proxy->
Read())
return nullptr;
184 void *array = (
void*)proxy->
GetStart();
186 if (fBasicTypeSize == -1){
189 Error(
"TObjectArrayReader::At()",
"Cannot get class info from branch proxy.");
195 objectSize = fBasicTypeSize;
197 return (
void*)((
Byte_t*)array + (objectSize * idx));
201 fBasicTypeSize =
size;
205 template <
class BASE>
206 class TDynamicArrayReader :
public BASE {
209 class TVirtualSizeReaderImpl {
211 virtual ~TVirtualSizeReaderImpl() =
default;
212 virtual size_t GetSize() = 0;
215 template <
typename T>
216 class TSizeReaderImpl final :
public TVirtualSizeReaderImpl {
220 TSizeReaderImpl(
TTreeReader &
r,
const char *leafName) : fSizeReader(
r, leafName) {}
221 size_t GetSize() final {
return *fSizeReader; }
224 std::unique_ptr<TVirtualSizeReaderImpl> fSizeReader;
227 template <
class...
ARGS>
228 TDynamicArrayReader(
TTreeReader *treeReader,
const char *leafName,
ARGS &&...args)
231 std::string foundLeafName = leafName;
237 std::string leafNameNoParent = leafName;
239 auto posLastDot = leafNameNoParent.rfind(
'.');
240 if (posLastDot != leafNameNoParent.npos) {
241 parent = leafNameNoParent.substr(0, posLastDot);
242 leafNameNoParent.erase(0, posLastDot + 1);
246 if (!sizeLeaf && !parent.empty()) {
247 auto posLastDotParent = parent.rfind(
'.');
248 if (posLastDotParent != parent.npos)
249 parent = parent.substr(0, posLastDot);
254 foundLeafName = parent;
256 foundLeafName +=
".";
257 foundLeafName += leafNameNoParent;
259 }
while (!sizeLeaf && !parent.empty());
263 Error(
"TDynamicArrayReader ",
"Cannot find leaf count for %s or any parent branch!", leafName);
267 const std::string leafType = sizeLeaf->
GetTypeName();
268 if (leafType ==
"Int_t") {
269 fSizeReader.reset(
new TSizeReaderImpl<Int_t>(*treeReader, foundLeafName.c_str()));
270 }
else if (leafType ==
"UInt_t") {
271 fSizeReader.reset(
new TSizeReaderImpl<UInt_t>(*treeReader, foundLeafName.c_str()));
272 }
else if (leafType ==
"Short_t") {
273 fSizeReader.reset(
new TSizeReaderImpl<Short_t>(*treeReader, foundLeafName.c_str()));
274 }
else if (leafType ==
"UShort_t") {
275 fSizeReader.reset(
new TSizeReaderImpl<UShort_t>(*treeReader, foundLeafName.c_str()));
276 }
else if (leafType ==
"Long_t") {
277 fSizeReader.reset(
new TSizeReaderImpl<Long_t>(*treeReader, foundLeafName.c_str()));
278 }
else if (leafType ==
"ULong_t") {
279 fSizeReader.reset(
new TSizeReaderImpl<ULong_t>(*treeReader, foundLeafName.c_str()));
280 }
else if (leafType ==
"Long64_t") {
281 fSizeReader.reset(
new TSizeReaderImpl<Long64_t>(*treeReader, foundLeafName.c_str()));
282 }
else if (leafType ==
"ULong64_t") {
283 fSizeReader.reset(
new TSizeReaderImpl<ULong64_t>(*treeReader, foundLeafName.c_str()));
285 Error(
"TDynamicArrayReader ",
286 "Unsupported size type for leaf %s. Supported types are int, short int, long int, long long int and "
287 "their unsigned counterparts.",
295 class TArrayParameterSizeReader :
public TDynamicArrayReader<TObjectArrayReader> {
297 TArrayParameterSizeReader(
TTreeReader *treeReader,
const char *branchName)
298 : TDynamicArrayReader<TObjectArrayReader>(treeReader, branchName)
304 class TArrayFixedSizeReader :
public TObjectArrayReader {
309 TArrayFixedSizeReader(
Int_t sizeArg) :
fSize(sizeArg) {}
316 ~TBasicTypeArrayReader()
override {}
322 Error(
"TBasicTypeArrayReader::GetCP()",
"Read error in TBranchProxy.");
331 if (!myCollectionProxy)
return 0;
332 return myCollectionProxy->
Size();
337 if (!myCollectionProxy)
return nullptr;
342 class TBasicTypeClonesReader final:
public TClonesReader {
346 TBasicTypeClonesReader(
Int_t offsetArg) : fOffset(offsetArg) {}
350 if (!myClonesArray)
return nullptr;
351 return (
Byte_t*)myClonesArray->
At(idx) + fOffset;
360 TLeafReader(
TTreeReaderValueBase *valueReaderArg) : fValueReader(valueReaderArg), fElementSize(-1) {}
364 return myLeaf ? myLeaf->
GetLen() : 0;
370 if (fElementSize == -1){
372 if (!myLeaf)
return nullptr;
375 return (
Byte_t*)address + (fElementSize * idx);
384 class TLeafParameterSizeReader :
public TDynamicArrayReader<TLeafReader> {
387 : TDynamicArrayReader<TLeafReader>(treeReader, leafName, valueReaderArg)
393 return TDynamicArrayReader<TLeafReader>::GetSize(proxy);
411 fSetupStatus = kSetupInternalError;
413 Error(
"TTreeReaderArrayBase::CreateProxy()",
"TTreeReader object not set / available for branch %s!",
415 fSetupStatus = kSetupTreeDestructed;
420 const char* brDataType =
"{UNDETERMINED}";
423 brDataType = GetBranchDataType(br, dictUnused, fDict);
425 Error(
"TTreeReaderArrayBase::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.",
426 GetDerivedTypeName(), fBranchName.Data(), brDataType);
427 fSetupStatus = kSetupMissingDictionary;
438 const bool suppressErrorsForThisBranch =
439 (std::find(fTreeReader->fSuppressErrorsForMissingBranches.cbegin(),
440 fTreeReader->fSuppressErrorsForMissingBranches.cend(),
441 fBranchName.Data()) != fTreeReader->fSuppressErrorsForMissingBranches.cend());
445 TLeaf *myLeaf =
nullptr;
446 if (!GetBranchAndLeaf(branch, myLeaf, branchActualType, suppressErrorsForThisBranch))
450 Error(
"TTreeReaderArrayBase::CreateProxy()",
451 "No dictionary for branch %s.", fBranchName.Data());
458 fSetupStatus = kSetupMatch;
460 SetImpl(branch, myLeaf);
469 fSetupStatus = kSetupMatch;
471 Error(
"TTreeReaderArrayBase::CreateProxy()",
472 "Type ambiguity (want %s, have %s) for branch %s.",
479 bool isTopLevel = branch->
GetMother() == branch;
481 membername = strrchr(branch->
GetName(),
'.');
482 if (membername.
IsNull()) {
483 membername = branch->
GetName();
486 auto *director = fTreeReader->fDirector.get();
490 std::optional<std::size_t>
index;
491 std::size_t current{};
492 auto &&friends = fTreeReader->GetTree()->GetTree()->GetListOfFriends();
500 if (!
index.has_value()) {
501 Error(
"TTreeReaderArrayBase::CreateProxy()",
502 "The branch %s is contained in a Friend TTree that is not directly attached to the main.\n"
503 "This is not yet supported by TTreeReader.",
508 auto &&friendProxy = fTreeReader->AddFriendProxy(
index.value());
509 director = friendProxy.GetDirector();
511 fTreeReader->AddProxy(
512 std::make_unique<TNamedBranchProxy>(director, branch, fBranchName, membername, suppressErrorsForThisBranch));
514 namedProxy = fTreeReader->FindProxy(fBranchName);
517 fSetupStatus = kSetupMatch;
519 fSetupStatus = kSetupMismatch;
524 const char* nonCollTypeName = GetBranchContentDataType(branch, branchActualTypeName, branchActualType);
525 if (nonCollTypeName) {
526 Error(
"TTreeReaderArrayBase::CreateContentProxy()",
"The branch %s contains data of type %s, which should be accessed through a TTreeReaderValue< %s >.",
527 fBranchName.Data(), nonCollTypeName, nonCollTypeName);
528 if (fSetupStatus == kSetupInternalError)
529 fSetupStatus = kSetupNotACollection;
533 if (!branchActualType) {
534 if (branchActualTypeName.
IsNull()) {
535 Error(
"TTreeReaderArrayBase::CreateContentProxy()",
"Cannot determine the type contained in the collection of branch %s. That's weird - please report!",
538 Error(
"TTreeReaderArrayBase::CreateContentProxy()",
"The branch %s contains data of type %s, which does not have a dictionary.",
539 fBranchName.Data(), branchActualTypeName.
Data());
540 if (fSetupStatus == kSetupInternalError)
541 fSetupStatus = kSetupMissingDictionary;
552 auto left_datatype =
dynamic_cast<TDataType *
>(left);
553 auto right_datatype =
dynamic_cast<TDataType *
>(right);
554 auto left_enum =
dynamic_cast<TEnum*
>(left);
555 auto right_enum =
dynamic_cast<TEnum*
>(right);
557 if ((left_datatype && left_datatype->GetType() ==
kInt_t && right_enum)
558 || (right_datatype && right_datatype->GetType() ==
kInt_t && left_enum))
560 if (!left_datatype || !right_datatype)
562 auto l = left_datatype->GetType();
563 auto r = right_datatype->GetType();
564 if (
l > 0 &&
l ==
r)
573 if (! matchingDataType(fDict, branchActualType)) {
574 Error(
"TTreeReaderArrayBase::CreateContentProxy()",
"The branch %s contains data of type %s. It cannot be accessed by a TTreeReaderArray<%s>",
575 fBranchName.Data(), branchActualType->
GetName(), fDict->GetName());
576 if (fSetupStatus == kSetupInternalError || fSetupStatus >= 0)
577 fSetupStatus = kSetupMismatch;
589 SetImpl(branch, myLeaf);
597 bool suppressErrorsForMissingBranch)
604 if (!fBranchName.Contains(
".")) {
605 if (!suppressErrorsForMissingBranch) {
606 Error(
"TTreeReaderArrayBase::GetBranchAndLeaf()",
607 "The tree does not have a branch called %s. You could check with TTree::Print() for available branches.",
610 fSetupStatus = kSetupMissingBranch;
615 TRegexp leafNameExpression (
"\\.[a-zA-Z0-9_]+$");
616 TString leafName (fBranchName(leafNameExpression));
617 TString branchName = fBranchName(0, fBranchName.Length() - leafName.
Length());
620 if (!suppressErrorsForMissingBranch) {
621 Error(
"TTreeReaderArrayBase::GetBranchAndLeaf()",
622 "The tree does not have a branch called %s. You could check with TTree::Print() for available branches.",
625 fSetupStatus = kSetupMissingBranch;
632 if (!suppressErrorsForMissingBranch) {
633 Error(
"TTreeReaderArrayBase::GetBranchAndLeaf()",
634 "The tree does not have a branch, nor a sub-branch called %s. You could check with TTree::Print() for "
635 "available branches.",
638 fSetupStatus = kSetupMissingBranch;
645 Error(
"TTreeReaderArrayBase::GetBranchAndLeaf()",
"Failed to get the dictionary for %s.", myLeaf->
GetTypeName());
646 fSetupStatus = kSetupMissingDictionary;
653 branchActualType = fDict;
655 fBranchName = branchName;
656 fLeafName = leafName(1, leafName.
Length());
657 fHaveLeaf = (fLeafName.Length() > 0);
658 fSetupStatus = kSetupMatchLeaf;
661 Error(
"TTreeReaderArrayBase::GetBranchAndLeaf()",
"Leaf of type %s cannot be read by TTreeReaderValue<%s>.", myLeaf->
GetTypeName(), fDict->GetName());
663 fSetupStatus = kSetupMismatch;
686 fImpl = std::make_unique<TLeafReader>(
this);
692 fImpl = std::make_unique<TLeafParameterSizeReader>(fTreeReader, leafFullName.
Data(),
this);
694 fSetupStatus = kSetupMatchLeaf;
708 if (fSetupStatus == kSetupInternalError)
709 fSetupStatus = kSetupMatch;
711 if (branchElement->
GetType() == 31) {
712 Error(
"TTreeReaderArrayBase::SetImpl",
713 "STL Collection nested in a TClonesArray not yet supported");
714 fSetupStatus = kSetupInternalError;
717 fImpl = std::make_unique<TSTLReader>();
723 fImpl = std::make_unique<TClonesReader>();
726 fImpl = std::make_unique<TBasicTypeArrayReader>();
730 fImpl = std::make_unique<TBasicTypeClonesReader>(element->
GetOffset());
733 fImpl = std::make_unique<TArrayFixedSizeReader>(element->
GetArrayLength());
737 fImpl = std::make_unique<TArrayParameterSizeReader>(fTreeReader, branchElement->
GetBranchCount()->
GetName());
741 fImpl = std::make_unique<TBasicTypeArrayReader>();
744 fImpl = std::make_unique<TBasicTypeClonesReader>(element->
GetOffset());
747 fImpl = std::make_unique<TArrayFixedSizeReader>(element->
GetArrayLength());
748 ((TObjectArrayReader*)fImpl.get())->SetBasicTypeSize(
sizeof(
Int_t));
750 fImpl = std::make_unique<TArrayFixedSizeReader>(element->
GetArrayLength());
751 ((TObjectArrayReader*)fImpl.get())->SetBasicTypeSize(((
TDataType*)fDict)->Size());
755 fImpl = std::make_unique<TArrayParameterSizeReader>(fTreeReader, branchElement->
GetBranchCount()->
GetName());
756 ((TArrayParameterSizeReader*)fImpl.get())->SetBasicTypeSize(((
TDataType*)fDict)->Size());
759 fImpl = std::make_unique<TClonesReader>();
761 Error(
"TTreeReaderArrayBase::SetImpl()",
762 "Cannot read branch %s: unhandled streamer element type %s",
763 fBranchName.Data(), element->
IsA()->
GetName());
764 fSetupStatus = kSetupInternalError;
775 Error(
"TTreeReaderArrayBase::SetImpl",
"Failed to get the top leaf from the branch");
776 fSetupStatus = kSetupMissingBranch;
781 if (fSetupStatus == kSetupInternalError)
782 fSetupStatus = kSetupMatch;
784 fImpl = std::make_unique<TArrayFixedSizeReader>(topLeaf->GetLenStatic());
787 fImpl = std::make_unique<TArrayParameterSizeReader>(fTreeReader, sizeLeaf->
GetName());
789 ((TObjectArrayReader*)fImpl.get())->SetBasicTypeSize(((
TDataType*)fDict)->Size());
791 Error(
"TTreeReaderArrayBase::SetImpl",
"Support for branches of type TBranchClones not implemented");
792 fSetupStatus = kSetupInternalError;
794 Error(
"TTreeReaderArrayBase::SetImpl",
"Support for branches of type TBranchObject not implemented");
795 fSetupStatus = kSetupInternalError;
797 Error(
"TTreeReaderArrayBase::SetImpl",
"Support for branches of type TBranchSTL not implemented");
798 fImpl = std::make_unique<TSTLReader>();
799 fSetupStatus = kSetupInternalError;
801 Error(
"TTreeReaderArrayBase::SetImpl",
"Support for branches of type TBranchRef not implemented");
802 fSetupStatus = kSetupInternalError;
821 contentTypeName =
"";
825 || brElement->
GetType() == 3) {
830 Error(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"Could not get value class.");
839 if (brElement->
GetType() == 3) {
848 Error(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"Cannot determine STL collection type of %s stored in branch %s", brElement->
GetClassName(), branch->
GetName());
853 if (isMap) contentTypeName =
"std::pair< ";
854 contentTypeName += splitType.
fElements[1];
856 contentTypeName += splitType.
fElements[2];
857 contentTypeName +=
" >";
862 }
else if (brElement->
GetType() == 31
863 || brElement->
GetType() == 41) {
868 if (ExpectedTypeRet == 0) {
880 Error(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"The branch %s contains a data type %d for which the dictionary cannot be retrieved.",
881 branch->
GetName(), (
int)dtData);
886 }
else if (ExpectedTypeRet == 1) {
887 int brID = brElement->
GetID();
890 Error(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"The branch %s contains data of type %s for which the dictionary does not exist. It's needed.",
905 return "{CANNOT DETERMINE TBranchElement DATA TYPE}";
917 Error(
"TTreeReaderArrayBase::GetBranchDataType()",
"Could not get class from branch element.");
921 if (!myCollectionProxy){
922 Error(
"TTreeReaderArrayBase::GetBranchDataType()",
"Could not get collection proxy from STL class");
930 Error(
"TTreeReaderArrayBase::GetBranchDataType()",
"Could not get valueClass from collectionProxy.");
933 contentTypeName = dict->
GetName();
937 if (!fProxy->Setup() || !fProxy->Read()){
938 Error(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"Failed to get type from proxy, unable to check type");
939 contentTypeName =
"UNKNOWN";
941 return contentTypeName;
945 contentTypeName = dict->
GetName();
959 contentTypeName =
"TClonesArray";
960 Warning(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"Not able to check type correctness, ignoring check");
962 fSetupStatus = kSetupNoCheck;
969 if (dict) contentTypeName = dict->
GetName();
974 contentTypeName = dict->
GetName();
985 if ((!dataTypeName || !dataTypeName[0])
1003 Error(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"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());
1005 TLeaf* leaf =
nullptr;
1006 while ((leaf = (
TLeaf*) iLeaves())) {
1007 Error(
"TTreeReaderArrayBase::GetBranchContentDataType()",
" %s.%s", branch->
GetName(), leaf->
GetName());
1013 Warning(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"Not able to check type correctness, ignoring check");
1015 fSetupStatus = kSetupNoCheck;
1018 return dataTypeName;
1021 return "TClonesArray";
1024 Error(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"The branch %s is a TBranchRef and cannot be represented as a C++ type.", branch->
GetName());
1027 Error(
"TTreeReaderArrayBase::GetBranchContentDataType()",
"The branch %s is of type %s - something that is not handled yet.", branch->
GetName(), branch->
IsA()->
GetName());
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Base class for all the proxy object.
virtual void * GetStart(UInt_t=0)
bool GetSuppressErrorsForMissingBranch() const
TVirtualCollectionProxy * GetCollection()
const Detail::TBranchProxy * GetProxy() const
TDictionary * GetContentDict() const
void SetContentDict(TDictionary *dict)
Base class of TTreeReaderArray.
void CreateProxy() override
Create the proxy object for our branch.
bool GetBranchAndLeaf(TBranch *&branch, TLeaf *&myLeaf, TDictionary *&branchActualType, bool suppressErrorsForMissingBranch=false)
Determine the branch / leaf and its type; reset fProxy / fSetupStatus on error.
void SetImpl(TBranch *branch, TLeaf *myLeaf)
Create the TVirtualCollectionReader object for our branch.
const char * GetBranchContentDataType(TBranch *branch, TString &contentTypeName, TDictionary *&dict)
Access a branch's collection content (not the collection itself) through a proxy.
Base class of TTreeReaderValue.
void * GetAddress()
Returns the memory address of the object being read.
@ kReadError
Problem reading data.
@ kReadSuccess
Data read okay.
TLeaf * GetLeaf()
If we are reading a leaf, return the corresponding TLeaf.
virtual ~TVirtualCollectionReader()
A Branch for the case of an object.
TBranchElement * GetBranchCount() 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.
TVirtualCollectionProxy * GetCollectionProxy()
Return the collection proxy describing the branch content, if any.
TClass * GetCurrentClass()
Return a pointer to the current type of the data member corresponding to branch element.
virtual const char * GetTypeName() const
Return type name of element in the branch.
virtual const char * GetClonesName() const
virtual TClass * GetClass() const
Int_t GetExpectedType(TClass *&clptr, EDataType &type) override
Fill expectedClass and expectedType with information on the data type of the object/values contained ...
A TTree is a list of TBranches.
virtual TLeaf * GetLeaf(const char *name) const
Return pointer to the 1st Leaf named name in thisBranch.
virtual const char * GetClassName() const
Return the name of the user class whose content is stored in this branch, if any.
Int_t GetSplitLevel() const
TClass * IsA() const override
TObjArray * GetListOfLeaves()
TBranch * GetMother() const
Get our top-level parent branch in the tree.
TClass instances represent classes, structs and namespaces in the ROOT type system.
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
Int_t GetClassSize() const
An array of clone (identical) objects.
TClass * GetClass() const
Basic data type descriptor (datatype information is obtained from CINT).
TString GetTypeName()
Get basic type of typedef, e,g.: "class TDirectory*" -> "TDirectory".
static TDataType * GetDataType(EDataType type)
Given a EDataType type, get the TDataType* that represents it.
This class defines an abstract interface that must be implemented by all classes that contain diction...
TClass * IsA() const override
static TDictionary * GetDictionary(const char *name)
Retrieve the type (class, fundamental type, typedef etc) named "name".
The TEnum class implements the enum type.
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
virtual Int_t GetLenType() const
virtual const char * GetTypeName() const
virtual Int_t GetLen() const
Return the number of effective elements of this leaf, for the current entry.
virtual TLeaf * GetLeafCount() const
If this leaf stores a variable-sized array or a multi-dimensional array whose last dimension has vari...
TBranch * GetBranch() const
const char * GetName() const override
Returns name of object.
Int_t GetEntries() const override
Return the number of objects in array (i.e.
TObject * At(Int_t idx) const override
TObject * UncheckedAt(Int_t i) const
Regular expression class.
Int_t GetArrayLength() const
const char * GetTypeName() const
TClass * GetClass() const
TClass * IsA() const override
Describes a persistent version of a class.
TStreamerElement * GetElement(Int_t id) const override
TObjArray * GetElements() const override
const char * Data() const
An interface for reading values stored in ROOT columnar datasets.
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
virtual TBranch * GetBranch(const char *name)
Return pointer to the branch with the given name in this tree or its friends.
virtual TTree * GetTree() const
virtual TLeaf * FindLeaf(const char *name)
Find leaf..
Defines a common interface to inspect/change the contents of an object that represents a collection.
virtual void PushProxy(void *objectstart)=0
Set the address of the container being proxied and keep track of the previous one.
virtual EDataType GetType() const =0
If the value type is a fundamental data type, return its type (see enumeration EDataType).
virtual void PopProxy()=0
Reset the address of the container being proxied to the previous container.
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 void * At(UInt_t idx)=0
Return the address of the value at index idx
virtual UInt_t Size() const =0
Return the current number of elements in the container.
virtual Bool_t HasPointers() const =0
Return true if the content is of type 'pointer to'.
void forward(const LAYERDATA &prevLayerData, LAYERDATA &currLayerData)
apply the weights (and functions) in forward direction of the DNN
int IsSTLCont(int testAlloc=0) const
type : type name: vector<list<classA,allocator>,allocator> testAlloc: if true, we test allocator,...
std::vector< std::string > fElements