12 #ifndef ROOT_TTreeReaderGenerator
13 #define ROOT_TTreeReaderGenerator
37 enum ELocation { kOut=0, kClones, kSTL };
39 class TTreeReaderDescriptor :
public TObject {
41 enum ReaderType { kValue, kArray };
47 TTreeReaderDescriptor(ReaderType type, TString dataType, TString name, TString branchName) :
51 fBranchName(branchName) { }
54 class TBranchDescriptor :
public TNamed {
57 TString fContainerName;
59 TString fSubBranchPrefix;
60 TVirtualStreamerInfo *fInfo;
61 TBranchDescriptor *fParent;
63 TBranchDescriptor(
const char *type, TVirtualStreamerInfo *info,
64 const char *branchname,
const char *subBranchPrefix, ELocation isclones,
65 const TString &containerName, TBranchDescriptor *parent = 0) :
68 fContainerName(containerName),
69 fBranchName(branchname),
70 fSubBranchPrefix(subBranchPrefix),
74 if (fSubBranchPrefix.Length() && fSubBranchPrefix[fSubBranchPrefix.Length() - 1] ==
'.') {
75 fSubBranchPrefix.Remove(fSubBranchPrefix.Length()-1);
79 Bool_t IsClones()
const {
return fIsClones == kClones; }
81 Bool_t IsSTL()
const {
return fIsClones == kSTL; }
84 class TTreeReaderGenerator :
public TTreeGeneratorBase
88 Bool_t fIncludeAllLeaves;
89 Bool_t fIncludeAllTopmost;
90 std::vector<TString> fIncludeLeaves;
91 std::vector<TString> fIncludeStruct;
93 void AddReader(TTreeReaderDescriptor::ReaderType type, TString dataType, TString name,
94 TString branchName, TBranchDescriptor *parent = 0, Bool_t isLeaf = kTRUE);
95 UInt_t AnalyzeBranches(TBranchDescriptor *desc, TBranchElement *branch, TVirtualStreamerInfo *info);
96 UInt_t AnalyzeBranches(TBranchDescriptor *desc, TIter &branches, TVirtualStreamerInfo *info);
97 UInt_t AnalyzeOldBranch(TBranch *branch);
98 UInt_t AnalyzeOldLeaf(TLeaf *leaf, Int_t nleaves);
99 Bool_t BranchNeedsReader(TString branchName, TBranchDescriptor *parent, Bool_t isLeaf);
102 void AnalyzeTree(TTree *tree);
103 void WriteSelector();
106 TTreeReaderGenerator(TTree* tree,
const char *classname, Option_t *option);