Logo ROOT   6.18/05
Reference Guide
TTreeReader.cxx
Go to the documentation of this file.
1// @(#)root/treeplayer:$Id$
2// Author: Axel Naumann, 2011-09-21
3
4/*************************************************************************
5 * Copyright (C) 1995-2013, Rene Brun and 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#include "TTreeReader.h"
13
14#include "TChain.h"
15#include "TDirectory.h"
16#include "TEntryList.h"
17#include "TTreeCache.h"
18#include "TTreeReaderValue.h"
19#include "TFriendProxy.h"
20
21
22// clang-format off
23/**
24 \class TTreeReader
25 \ingroup treeplayer
26 \brief A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree, TChain or TNtuple
27
28 TTreeReader is associated to TTreeReaderValue and TTreeReaderArray which are handles to concretely
29 access the information in the dataset.
30
31 Example code can be found in
32 - tutorials/tree/hsimpleReader.C
33 - tutorials/tree/h1analysisTreeReader.C
34 - <a href="http://root.cern.ch/gitweb?p=roottest.git;a=tree;f=root/tree/reader;hb=HEAD">This example</a>
35
36 You can generate a skeleton of `TTreeReaderValue<T>` and `TTreeReaderArray<T>` declarations
37 for all of a tree's branches using `TTree::MakeSelector()`.
38
39 Roottest contains an
40 <a href="http://root.cern.ch/gitweb?p=roottest.git;a=tree;f=root/tree/reader;hb=HEAD">example</a>
41 showing the full power.
42
43A simpler analysis example can be found below: it histograms a function of the px and py branches.
44
45~~~{.cpp}
46// A simple TTreeReader use: read data from hsimple.root (written by hsimple.C)
47
48#include "TFile.h
49#include "TH1F.h
50#include "TTreeReader.h
51#include "TTreeReaderValue.h
52
53void hsimpleReader() {
54 // Create a histogram for the values we read.
55 TH1F("h1", "ntuple", 100, -4, 4);
56
57 // Open the file containing the tree.
58 TFile *myFile = TFile::Open("$ROOTSYS/tutorials/hsimple.root");
59
60 // Create a TTreeReader for the tree, for instance by passing the
61 // TTree's name and the TDirectory / TFile it is in.
62 TTreeReader myReader("ntuple", myFile);
63
64 // The branch "px" contains floats; access them as myPx.
65 TTreeReaderValue<Float_t> myPx(myReader, "px");
66 // The branch "py" contains floats, too; access those as myPy.
67 TTreeReaderValue<Float_t> myPy(myReader, "py");
68
69 // Loop over all entries of the TTree or TChain.
70 while (myReader.Next()) {
71 // Just access the data as if myPx and myPy were iterators (note the '*'
72 // in front of them):
73 myHist->Fill(*myPx + *myPy);
74 }
75
76 myHist->Draw();
77}
78~~~
79
80A more complete example including error handling and a few combinations of
81TTreeReaderValue and TTreeReaderArray would look like this:
82
83~~~{.cpp}
84#include <TFile.h>
85#include <TH1.h>
86#include <TTreeReader.h>
87#include <TTreeReaderValue.h>
88#include <TTreeReaderArray.h>
89
90#include "TriggerInfo.h"
91#include "Muon.h"
92#include "Tau.h"
93
94#include <vector>
95#include <iostream>
96
97bool CheckValue(ROOT::Internal::TTreeReaderValueBase& value) {
98 if (value->GetSetupStatus() < 0) {
99 std::cerr << "Error " << value->GetSetupStatus()
100 << "setting up reader for " << value->GetBranchName() << '\n';
101 return false;
102 }
103 return true;
104}
105
106
107// Analyze the tree "MyTree" in the file passed into the function.
108// Returns false in case of errors.
109bool analyze(TFile* file) {
110 // Create a TTreeReader named "MyTree" from the given TDirectory.
111 // The TTreeReader gives access to the TTree to the TTreeReaderValue and
112 // TTreeReaderArray objects. It knows the current entry number and knows
113 // how to iterate through the TTree.
114 TTreeReader reader("MyTree", file);
115
116 // Read a single float value in each tree entries:
117 TTreeReaderValue<float> weight(reader, "event.weight");
118
119 // Read a TriggerInfo object from the tree entries:
120 TTreeReaderValue<TriggerInfo> triggerInfo(reader, "triggerInfo");
121
122 //Read a vector of Muon objects from the tree entries:
123 TTreeReaderValue<std::vector<Muon>> muons(reader, "muons");
124
125 //Read the pT for all jets in the tree entry:
126 TTreeReaderArray<double> jetPt(reader, "jets.pT");
127
128 // Read the taus in the tree entry:
129 TTreeReaderArray<Tau> taus(reader, "taus");
130
131
132 // Now iterate through the TTree entries and fill a histogram.
133
134 TH1F("hist", "TTreeReader example histogram", 10, 0., 100.);
135
136 while (reader.Next()) {
137 if (!CheckValue(weight)) return false;
138 if (!CheckValue(triggerInfo)) return false;
139 if (!CheckValue(muons)) return false;
140 if (!CheckValue(jetPt)) return false;
141 if (!CheckValue(taus)) return false;
142
143 // Access the TriggerInfo object as if it's a pointer.
144 if (!triggerInfo->hasMuonL1())
145 continue;
146
147 // Ditto for the vector<Muon>.
148 if (!muons->size())
149 continue;
150
151 // Access the jetPt as an array, whether the TTree stores this as
152 // a std::vector, std::list, TClonesArray or Jet* C-style array, with
153 // fixed or variable array size.
154 if (jetPt.GetSize() < 2 || jetPt[0] < 100)
155 continue;
156
157 // Access the array of taus.
158 if (!taus.IsEmpty()) {
159 // Access a float value - need to dereference as TTreeReaderValue
160 // behaves like an iterator
161 float currentWeight = *weight;
162 for (const Tau& tau: taus) {
163 hist->Fill(tau.eta(), currentWeight);
164 }
165 }
166 } // TTree entry / event loop
167}
168~~~
169*/
170// clang-format on
171
173
174using namespace ROOT::Internal;
175
176// Provide some storage for the poor little symbol.
177constexpr const char * const TTreeReader::fgEntryStatusText[TTreeReader::kEntryBeyondEnd + 1];
178
179////////////////////////////////////////////////////////////////////////////////
180/// Default constructor. Call SetTree to connect to a TTree.
181
182TTreeReader::TTreeReader() : fNotify(this) {}
183
184////////////////////////////////////////////////////////////////////////////////
185/// Access data from tree.
186
187TTreeReader::TTreeReader(TTree* tree, TEntryList* entryList /*= nullptr*/):
188 fTree(tree),
189 fEntryList(entryList),
190 fNotify(this)
191{
192 if (!fTree) {
193 ::Error("TTreeReader::TTreeReader", "TTree is NULL!");
194 } else {
195 Initialize();
196 }
197}
198
199////////////////////////////////////////////////////////////////////////////////
200/// Access data from the tree called keyname in the directory (e.g. TFile)
201/// dir, or the current directory if dir is NULL. If keyname cannot be
202/// found, or if it is not a TTree, IsInvalid() will return true.
203
204TTreeReader::TTreeReader(const char* keyname, TDirectory* dir, TEntryList* entryList /*= nullptr*/):
205 fEntryList(entryList),
206 fNotify(this)
207{
208 if (!dir) dir = gDirectory;
209 dir->GetObject(keyname, fTree);
210 if (!fTree) {
211 std::string msg = "No TTree called ";
212 msg += keyname;
213 msg += " was found in the selected TDirectory.";
214 Error("TTreeReader", "%s", msg.c_str());
215 }
216 Initialize();
217}
218
219////////////////////////////////////////////////////////////////////////////////
220/// Tell all value readers that the tree reader does not exist anymore.
221
223{
224 for (std::deque<ROOT::Internal::TTreeReaderValueBase*>::const_iterator
225 i = fValues.begin(), e = fValues.end(); i != e; ++i) {
226 (*i)->MarkTreeReaderUnavailable();
227 }
228 if (fTree && fNotify.IsLinked())
230
231 // Need to clear the map of proxies before deleting the director otherwise
232 // they will have a dangling pointer.
233 fProxies.clear();
234
235 for (auto feproxy: fFriendProxies) {
236 delete feproxy;
237 }
238 fFriendProxies.clear();
239
240 delete fDirector;
241}
242
243////////////////////////////////////////////////////////////////////////////////
244/// Initialization of the director.
245
247{
248 fEntry = -1;
249 if (!fTree) {
252 return;
253 }
254
258 }
259
261
262 if (!fNotify.IsLinked()) {
264
265 if (fTree->GetTree()) {
266 // The current TTree is already available.
268 Notify();
270 }
271 }
272}
273
274////////////////////////////////////////////////////////////////////////////////
275/// Callback from TChain and TTree's LoadTree.
276
278{
279
282 // This can happen if someone switched trees behind us.
283 // Likely cause: a TChain::LoadTree() e.g. from TTree::Process().
284 // This means that "local" should be set!
285 // There are two entities switching trees which is bad.
286 Warning("SetEntryBase()",
287 "The current tree in the TChain %s has changed (e.g. by TTree::Process) "
288 "even though TTreeReader::SetEntry() was called, which switched the tree "
289 "again. Did you mean to call TTreeReader::SetLocalEntry()?",
290 fTree->GetName());
291 }
293 } else {
295 }
296
298 Warning("SetEntryBase()",
299 "The TTree / TChain has an associated TEntryList. "
300 "TTreeReader ignores TEntryLists unless you construct the TTreeReader passing a TEntryList.");
302 }
303
304 if (!fDirector->Notify()) {
305 Error("SetEntryBase()", "There was an error while notifying the proxies.");
306 return false;
307 }
308
309 if (fProxiesSet) {
310 for (auto value: fValues) {
311 value->NotifyNewTree(fTree->GetTree());
312 }
313 }
314
315 return kTRUE;
316}
317
318////////////////////////////////////////////////////////////////////////////////
319/// Tell readers we now have a tree.
320/// fValues gets insertions during this loop (when parameterized arrays are read),
321/// invalidating iterators. Use old-school counting instead.
322
324
325 for (size_t i = 0; i < fValues.size(); ++i) {
327 reader->CreateProxy();
328 if (!reader->GetProxy()){
329 return kFALSE;
330 }
331
332 }
333 // If at least one proxy was there and no error occurred, we assume the proxies to be set.
334 fProxiesSet = !fValues.empty();
335
336 // Now we need to properly set the TTreeCache. We do this in steps:
337 // 1. We set the entry range according to the entry range of the TTreeReader
338 // 2. We add to the cache the branches identifying them by the name the user provided
339 // upon creation of the TTreeReader{Value, Array}s
340 // 3. We stop the learning phase.
341 // Operations 1, 2 and 3 need to happen in this order. See: https://sft.its.cern.ch/jira/browse/ROOT-9773?focusedCommentId=87837
342 if (fProxiesSet) {
343 const auto curFile = fTree->GetCurrentFile();
344 if (curFile && fTree->GetTree()->GetReadCache(curFile, true)) {
345 if (!(-1LL == fEndEntry && 0ULL == fBeginEntry)) {
346 // We need to avoid to pass -1 as end entry to the SetCacheEntryRange method
347 const auto lastEntry = (-1LL == fEndEntry) ? fTree->GetEntriesFast() : fEndEntry;
349 }
350 for (auto value: fValues) {
351 fTree->AddBranchToCache(value->GetProxy()->GetBranchName(), true);
352 }
354 }
355 }
356
357 return kTRUE;
358}
359
360////////////////////////////////////////////////////////////////////////////////
361/// Set the range of entries to be loaded by `Next()`; end will not be loaded.
362///
363/// If end <= begin, `end` is ignored (set to `-1`) and only `begin` is used.
364/// Example:
365///
366/// ~~~ {.cpp}
367/// reader.SetEntriesRange(3, 5);
368/// while (reader.Next()) {
369/// // Will load entries 3 and 4.
370/// }
371/// ~~~
372///
373/// \param beginEntry The first entry to be loaded by `Next()`.
374/// \param endEntry The entry where `Next()` will return kFALSE, not loading it.
375
377{
378 if (beginEntry < 0)
379 return kEntryNotFound;
380 // Complain if the entries number is larger than the tree's / chain's / entry
381 // list's number of entries, unless it's a TChain and "max entries" is
382 // uninitialized (i.e. TTree::kMaxEntries).
383 if (beginEntry >= GetEntries(false) && !(IsChain() && GetEntries(false) == TTree::kMaxEntries)) {
384 Error("SetEntriesRange()", "first entry out of range 0..%lld", GetEntries(false));
385 return kEntryNotFound;
386 }
387
388 if (endEntry > beginEntry)
389 fEndEntry = endEntry;
390 else
391 fEndEntry = -1;
392 if (beginEntry - 1 < 0)
393 Restart();
394 else {
395 EEntryStatus es = SetEntry(beginEntry - 1);
396 if (es != kEntryValid) {
397 Error("SetEntriesRange()", "Error setting first entry %lld: %s",
398 beginEntry, fgEntryStatusText[(int)es]);
399 return es;
400 }
401 }
402
403 fBeginEntry = beginEntry;
404
405 return kEntryValid;
406}
407
410 fProxiesSet = false; // we might get more value readers, meaning new proxies.
411 fEntry = -1;
412 if (const auto curFile = fTree->GetCurrentFile()) {
413 if (auto tc = fTree->GetTree()->GetReadCache(curFile, true)) {
414 tc->DropBranch("*", true);
415 tc->ResetCache();
416 }
417 }
418}
419
420////////////////////////////////////////////////////////////////////////////////
421/// Returns the number of entries of the TEntryList if one is provided, else
422/// of the TTree / TChain, independent of a range set by SetEntriesRange()
423/// by calling TTree/TChain::GetEntriesFast.
424
425
427 if (fEntryList)
428 return fEntryList->GetN();
429 if (!fTree)
430 return -1;
431 return fTree->GetEntriesFast();
432}
433
434
435////////////////////////////////////////////////////////////////////////////////
436/// Returns the number of entries of the TEntryList if one is provided, else
437/// of the TTree / TChain, independent of a range set by SetEntriesRange().
438///
439/// \param force If `IsChain()` and `force`, determines whether all TFiles of
440/// this TChain should be opened to determine the exact number of entries
441/// of the TChain. If `!IsChain()`, `force` is ignored.
442
444 if (fEntryList)
445 return fEntryList->GetN();
446 if (!fTree)
447 return -1;
448 if (force) {
450 auto res = fTree->GetEntries();
451 // Go back to where we were:
454 return res;
455 }
456 return fTree->GetEntriesFast();
457}
458
459
460
461////////////////////////////////////////////////////////////////////////////////
462/// Load an entry into the tree, return the status of the read.
463/// For chains, entry is the global (i.e. not tree-local) entry number, unless
464/// `local` is `true`, in which case `entry` specifies the entry number within
465/// the current tree. This is needed for instance for TSelector::Process().
466
468{
469 if (IsInvalid()) {
471 fEntry = -1;
472 return fEntryStatus;
473 }
474
475 fEntry = entry;
476
477 Long64_t entryAfterList = entry;
478 if (fEntryList) {
479 if (entry >= fEntryList->GetN()) {
480 // Passed the end of the chain, Restart() was not called:
481 // don't try to load entries anymore. Can happen in these cases:
482 // while (tr.Next()) {something()};
483 // while (tr.Next()) {somethingelse()}; // should not be calling somethingelse().
485 return fEntryStatus;
486 }
487 if (entry >= 0) entryAfterList = fEntryList->GetEntry(entry);
488 if (local && IsChain()) {
489 // Must translate the entry list's entry to the current TTree's entry number.
490 local = kFALSE;
491 }
492 }
493
494 TTree* treeToCallLoadOn = local ? fTree->GetTree() : fTree;
495
497 const Long64_t loadResult = treeToCallLoadOn->LoadTree(entryAfterList);
499
500 if (loadResult < 0) {
501 // ROOT-9628 We cover here the case when:
502 // - We deal with a TChain
503 // - The last file is opened
504 // - The TTree is not correctly loaded
505 // The system is robust against issues with TTrees associated to the chain
506 // when they are not at the end of it.
507 if (loadResult == -3 && TestBit(kBitIsChain) && !fTree->GetTree()) {
508 fDirector->Notify();
509 if (fProxiesSet) {
510 for (auto value: fValues) {
511 value->NotifyNewTree(fTree->GetTree());
512 }
513 }
514 Warning("SetEntryBase()",
515 "There was an issue opening the last file associated to the TChain "
516 "being processed.");
518 return fEntryStatus;
519 }
520
521 if (loadResult == -2) {
522 fDirector->Notify();
523 if (fProxiesSet) {
524 for (auto value: fValues) {
525 value->NotifyNewTree(fTree->GetTree());
526 }
527 }
529 return fEntryStatus;
530 }
531
532 if (loadResult == -1) {
533 // The chain is empty
535 return fEntryStatus;
536 }
537
538 if (loadResult == -4) {
539 // The TChainElement corresponding to the entry is missing or
540 // the TTree is missing from the file.
541 fDirector->Notify();
542 if (fProxiesSet) {
543 for (auto value: fValues) {
544 value->NotifyNewTree(fTree->GetTree());
545 }
546 }
548 return fEntryStatus;
549 }
550
551 Warning("SetEntryBase()",
552 "Unexpected error '%lld' in %s::LoadTree", loadResult,
553 treeToCallLoadOn->IsA()->GetName());
554
556 return fEntryStatus;
557 }
558
559 if (!fProxiesSet) {
560 if (!SetProxies()) {
562 return fEntryStatus;
563 }
564 }
565
566 if (fEndEntry >= 0 && entry >= fEndEntry) {
568 return fEntryStatus;
569 }
570 fDirector->SetReadEntry(loadResult);
572 return fEntryStatus;
573}
574
575////////////////////////////////////////////////////////////////////////////////
576/// Set (or update) the which tree to read from. `tree` can be
577/// a TTree or a TChain.
578
579void TTreeReader::SetTree(TTree* tree, TEntryList* entryList /*= nullptr*/)
580{
581 fTree = tree;
582 fEntryList = entryList;
583 fEntry = -1;
584
585 if (fTree) {
588 } else {
590 }
591
592 if (!fDirector) {
593 Initialize();
594 }
595 else {
598 }
599}
600
601////////////////////////////////////////////////////////////////////////////////
602/// Set (or update) the which tree to read from, passing the name of a tree in a
603/// directory.
604///
605/// \param keyname - name of the tree in `dir`
606/// \param dir - the `TDirectory` to load `keyname` from (or gDirectory if `nullptr`)
607/// \param entryList - the `TEntryList` to attach to the `TTreeReader`.
608
609void TTreeReader::SetTree(const char* keyname, TDirectory* dir, TEntryList* entryList /*= nullptr*/)
610{
611 TTree* tree = nullptr;
612 if (!dir)
613 dir = gDirectory;
614 dir->GetObject(keyname, tree);
615 SetTree(tree, entryList);
616}
617
618////////////////////////////////////////////////////////////////////////////////
619/// Add a value reader for this tree.
620
622{
623 if (fProxiesSet) {
624 Error("RegisterValueReader",
625 "Error registering reader for %s: TTreeReaderValue/Array objects must be created before the call to Next() / SetEntry() / SetLocalEntry(), or after TTreeReader::Restart()!",
626 reader->GetBranchName());
627 return false;
628 }
629 fValues.push_back(reader);
630 return true;
631}
632
633////////////////////////////////////////////////////////////////////////////////
634/// Remove a value reader for this tree.
635
637{
638 std::deque<ROOT::Internal::TTreeReaderValueBase*>::iterator iReader
639 = std::find(fValues.begin(), fValues.end(), reader);
640 if (iReader == fValues.end()) {
641 Error("DeregisterValueReader", "Cannot find reader of type %s for branch %s", reader->GetDerivedTypeName(), reader->fBranchName.Data());
642 return;
643 }
644 fValues.erase(iReader);
645}
void Class()
Definition: Class.C:29
#define e(i)
Definition: RSha256.hxx:103
const Bool_t kFALSE
Definition: RtypesCore.h:88
bool Bool_t
Definition: RtypesCore.h:59
long long Long64_t
Definition: RtypesCore.h:69
const Bool_t kTRUE
Definition: RtypesCore.h:87
#define ClassImp(name)
Definition: Rtypes.h:365
#define gDirectory
Definition: TDirectory.h:218
void SetReadEntry(Long64_t entry)
Move to a new entry to read entry is the 'local' entry number; i.e.
Base class of TTreeReaderValue.
Detail::TBranchProxy * GetProxy() const
virtual const char * GetDerivedTypeName() const =0
virtual void CreateProxy()
Create the proxy object for our branch.
Describe directory structure in memory.
Definition: TDirectory.h:34
void GetObject(const char *namecycle, T *&ptr)
Definition: TDirectory.h:144
A List of entry numbers in a TTree or TChain.
Definition: TEntryList.h:26
virtual Long64_t GetEntry(Int_t index)
Return the number of the entry #index of this TEntryList in the TTree or TChain See also Next().
Definition: TEntryList.cxx:655
virtual Long64_t GetN() const
Definition: TEntryList.h:75
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
void RemoveLink(Notifier &notifier)
Definition: TNotifyLink.h:66
void PrependLink(Notifier &notifier)
Definition: TNotifyLink.h:55
Bool_t IsLinked()
Definition: TNotifyLink.h:82
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition: TObject.h:172
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition: TObject.cxx:866
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition: TObject.cxx:694
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition: TObject.cxx:443
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:880
const char * Data() const
Definition: TString.h:364
A simple, robust and fast interface to read values from ROOT columnar datasets such as TTree,...
Definition: TTreeReader.h:44
TTreeReader()
Default constructor. Call SetTree to connect to a TTree.
Bool_t fProxiesSet
True if the proxies have been set, false otherwise.
Definition: TTreeReader.h:305
ELoadTreeStatus fLoadTreeStatus
Indicator on how LoadTree was called 'last' time.
Definition: TTreeReader.h:291
Long64_t GetEntries() const
Returns the number of entries of the TEntryList if one is provided, else of the TTree / TChain,...
EEntryStatus fEntryStatus
status of most recent read request
Definition: TTreeReader.h:290
void SetTree(TTree *tree, TEntryList *entryList=nullptr)
Set (or update) the which tree to read from.
TNotifyLink< TTreeReader > fNotify
Definition: TTreeReader.h:292
Bool_t SetProxies()
Tell readers we now have a tree.
Bool_t IsChain() const
Definition: TTreeReader.h:170
@ kEntryNotFound
the tree entry number does not exist
Definition: TTreeReader.h:129
@ kEntryUnknownError
LoadTree return less than -4, likely a 'newer' error code.
Definition: TTreeReader.h:135
@ kEntryDictionaryError
problem reading dictionary info from tree
Definition: TTreeReader.h:132
@ kEntryBeyondEnd
last entry loop has reached its end
Definition: TTreeReader.h:133
@ kEntryChainFileError
problem in opening a chain's file
Definition: TTreeReader.h:131
@ kEntryNoTree
the tree does not exist
Definition: TTreeReader.h:128
@ kEntryValid
data read okay
Definition: TTreeReader.h:126
std::deque< ROOT::Internal::TTreeReaderValueBase * > fValues
readers that use our director
Definition: TTreeReader.h:295
Bool_t Notify()
Callback from TChain and TTree's LoadTree.
TTree * fTree
tree that's read
Definition: TTreeReader.h:288
ROOT::Internal::TBranchProxyDirector * fDirector
proxying director, owned
Definition: TTreeReader.h:293
~TTreeReader()
Tell all value readers that the tree reader does not exist anymore.
EEntryStatus SetEntriesRange(Long64_t beginEntry, Long64_t endEntry)
Set the begin and end entry numbers.
std::deque< ROOT::Internal::TFriendProxy * > fFriendProxies
proxying for friend TTrees, owned
Definition: TTreeReader.h:294
Bool_t fSetEntryBaseCallingLoadTree
True if during the LoadTree execution triggered by SetEntryBase.
Definition: TTreeReader.h:306
@ kInternalLoadTree
Notify/LoadTree was last called from SetEntryBase.
Definition: TTreeReader.h:141
@ kNoTree
default state, no TTree is connected (formerly 'Zombie' state)
Definition: TTreeReader.h:139
@ kExternalLoadTree
User code called LoadTree directly.
Definition: TTreeReader.h:142
@ kLoadTreeNone
Notify has not been called yet.
Definition: TTreeReader.h:140
static constexpr const char *const fgEntryStatusText[kEntryBeyondEnd+1]
Definition: TTreeReader.h:145
void Initialize()
Initialization of the director.
void Restart()
Restart a Next() loop from entry 0 (of TEntryList index 0 of fEntryList is set).
EEntryStatus SetEntryBase(Long64_t entry, Bool_t local)
Load an entry into the tree, return the status of the read.
TEntryList * fEntryList
entry list to be used
Definition: TTreeReader.h:289
Long64_t fEntry
Current (non-local) entry of fTree or of fEntryList if set.
Definition: TTreeReader.h:298
Bool_t RegisterValueReader(ROOT::Internal::TTreeReaderValueBase *reader)
Add a value reader for this tree.
Long64_t fBeginEntry
This allows us to propagate the range to the TTreeCache.
Definition: TTreeReader.h:304
void DeregisterValueReader(ROOT::Internal::TTreeReaderValueBase *reader)
Remove a value reader for this tree.
@ kBitHaveWarnedAboutEntryListAttachedToTTree
the tree had a TEntryList and we have warned about that
Definition: TTreeReader.h:284
@ kBitIsChain
our tree is a chain
Definition: TTreeReader.h:283
NamedProxies_t fProxies
attached ROOT::TNamedBranchProxies; owned
Definition: TTreeReader.h:296
Bool_t IsInvalid() const
Definition: TTreeReader.h:172
Long64_t fEndEntry
The end of the entry loop.
Definition: TTreeReader.h:303
EEntryStatus SetEntry(Long64_t entry)
Set the next entry (or index of the TEntryList if that is set).
Definition: TTreeReader.h:192
Long64_t GetCurrentEntry() const
Returns the index of the current entry being read.
Definition: TTreeReader.h:233
A TTree represents a columnar dataset.
Definition: TTree.h:71
virtual Int_t AddBranchToCache(const char *bname, Bool_t subbranches=kFALSE)
Add branch with name bname to the Tree cache.
Definition: TTree.cxx:1026
virtual Int_t StopCacheLearningPhase()
Stop the cache learning phase.
Definition: TTree.cxx:9070
TFile * GetCurrentFile() const
Return pointer to the current file.
Definition: TTree.cxx:5263
TTreeCache * GetReadCache(TFile *file) const
Find and return the TTreeCache registered with the file and which may contain branches for us.
Definition: TTree.cxx:6096
virtual TEntryList * GetEntryList()
Returns the entry list assigned to this tree.
Definition: TTree.cxx:5639
virtual Long64_t GetEntries() const
Definition: TTree.h:402
virtual TTree * GetTree() const
Definition: TTree.h:456
virtual Long64_t LoadTree(Long64_t entry)
Set current entry.
Definition: TTree.cxx:6251
virtual Long64_t GetEntriesFast() const
Definition: TTree.h:404
virtual Int_t SetCacheEntryRange(Long64_t first, Long64_t last)
interface to TTreeCache to set the cache entry range
Definition: TTree.cxx:8487
static constexpr Long64_t kMaxEntries
Definition: TTree.h:215
Definition: tree.py:1