20 using namespace ROOT::Experimental;
22 TTreeReaderFast::TTreeReaderFast(TTree* tree):
26 ::Error(
"TTreeReaderFast::TTreeReaderFast",
"TTree is NULL!");
32 TTreeReaderFast::TTreeReaderFast(
const char* keyname, TDirectory* dir ):
35 if (!fDirectory) fDirectory = gDirectory;
36 fDirectory->GetObject(keyname, fTree);
43 TTreeReaderFast::~TTreeReaderFast()
45 for (
auto &reader : fValues) {
46 reader->MarkTreeReaderUnavailable();
53 void TTreeReaderFast::Initialize()
57 fEntryStatus = TTreeReader::kEntryNoTree;
59 fDirector =
new ROOT::Internal::TBranchProxyDirector(fTree, -1);
64 for (
auto &reader : fValues) {
65 reader->CreateProxy();
66 if (reader->GetSetupStatus() != ROOT::Internal::TTreeReaderValueBase::kSetupMatch) {
73 fEntryStatus = TTreeReader::kEntryBadReader;
80 TTreeReader::EEntryStatus
81 TTreeReaderFast::SetEntry(Long64_t entry)
84 fEntryStatus =TTreeReader::kEntryNoTree;
88 TTree* prevTree = fDirector->GetTree();
90 Int_t treeNumInChainBeforeLoad = fTree->GetTreeNumber();
92 TTree* treeToCallLoadOn = fTree->GetTree();
93 Long64_t loadResult = treeToCallLoadOn->LoadTree(entry);
95 if (loadResult == -2) {
96 fEntryStatus = TTreeReader::kEntryNotFound;
100 if (treeNumInChainBeforeLoad != fTree->GetTreeNumber()) {
101 fDirector->SetTree(fTree->GetTree());
104 if (!prevTree || fDirector->GetReadEntry() == -1)
108 for (
auto &reader : fValues) {
109 reader->CreateProxy();
110 if (reader->GetSetupStatus() != ROOT::Internal::TTreeReaderValueBase::kSetupMatch) IsOK =
false;
112 fEntryStatus = IsOK ? TTreeReader::kEntryValid : TTreeReader::kEntryBadReader;
121 void TTreeReaderFast::RegisterValueReader(ROOT::Experimental::Internal::TTreeReaderValueFastBase* reader)
123 fValues.push_back(reader);
129 void TTreeReaderFast::DeregisterValueReader(ROOT::Experimental::Internal::TTreeReaderValueFastBase* reader)
131 auto iReader = std::find(fValues.begin(), fValues.end(), reader);
132 if (iReader == fValues.end()) {
133 Error(
"DeregisterValueReader",
"Cannot find reader of type %s for branch %s", reader->GetTypeName(), reader->fBranchName.c_str());
136 fValues.erase(iReader);
146 TTreeReaderFast::GetNextRange(Int_t eventNum)
148 Int_t remaining = INT_MAX;
149 for (
auto &value : fValues) {
150 Int_t valueRemaining = value->GetEvents(eventNum);
151 if (valueRemaining < remaining) {
152 remaining = valueRemaining;