test
CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RootTree.cc
Go to the documentation of this file.
1 #include "RootTree.h"
2 #include "RootDelayedReader.h"
6 #include "InputFile.h"
7 #include "TTree.h"
8 #include "TTreeIndex.h"
9 #include "TTreeCache.h"
10 
11 #include <cassert>
12 #include <iostream>
13 
14 namespace edm {
15  namespace {
16  TBranch* getAuxiliaryBranch(TTree* tree, BranchType const& branchType) {
17  TBranch* branch = tree->GetBranch(BranchTypeToAuxiliaryBranchName(branchType).c_str());
18  if (branch == nullptr) {
19  branch = tree->GetBranch(BranchTypeToAuxBranchName(branchType).c_str());
20  }
21  return branch;
22  }
23  TBranch* getProductProvenanceBranch(TTree* tree, BranchType const& branchType) {
24  TBranch* branch = tree->GetBranch(BranchTypeToBranchEntryInfoBranchName(branchType).c_str());
25  return branch;
26  }
27  }
28  RootTree::RootTree(std::shared_ptr<InputFile> filePtr,
29  BranchType const& branchType,
30  unsigned int nIndexes,
31  unsigned int maxVirtualSize,
32  unsigned int cacheSize,
33  unsigned int learningEntries,
34  bool enablePrefetching,
35  InputType inputType) :
36  filePtr_(filePtr),
37  tree_(dynamic_cast<TTree*>(filePtr_.get() != nullptr ? filePtr_->Get(BranchTypeToProductTreeName(branchType).c_str()) : nullptr)),
38  metaTree_(dynamic_cast<TTree*>(filePtr_.get() != nullptr ? filePtr_->Get(BranchTypeToMetaDataTreeName(branchType).c_str()) : nullptr)),
39  branchType_(branchType),
40  auxBranch_(tree_ ? getAuxiliaryBranch(tree_, branchType_) : nullptr),
41  treeCache_(),
42  rawTreeCache_(),
43  triggerTreeCache_(),
44  rawTriggerTreeCache_(),
45  trainedSet_(),
46  triggerSet_(),
47  entries_(tree_ ? tree_->GetEntries() : 0),
48  entryNumber_(-1),
49  entryNumberForIndex_(new std::vector<EntryNumber>(nIndexes, IndexIntoFile::invalidEntry)),
50  branchNames_(),
51  branches_(new BranchMap),
52  trainNow_(false),
53  switchOverEntry_(-1),
54  rawTriggerSwitchOverEntry_(-1),
55  learningEntries_(learningEntries),
56  cacheSize_(cacheSize),
57  treeAutoFlush_(0),
58  enablePrefetching_(enablePrefetching),
59  //enableTriggerCache_(branchType_ == InEvent),
60  enableTriggerCache_(false), // Disable, for now. Using the trigger cache in the multithreaded environment causes the assert on line 331 to fire occasionally.
61  rootDelayedReader_(new RootDelayedReader(*this, filePtr, inputType)),
62  branchEntryInfoBranch_(metaTree_ ? getProductProvenanceBranch(metaTree_, branchType_) : (tree_ ? getProductProvenanceBranch(tree_, branchType_) : 0)),
63  infoTree_(dynamic_cast<TTree*>(filePtr_.get() != nullptr ? filePtr->Get(BranchTypeToInfoTreeName(branchType).c_str()) : nullptr)) // backward compatibility
64  {
65  if(not tree_) {
66  throw cms::Exception("WrongFileFormat")<< "The ROOT file does not contain a TTree named "<<BranchTypeToProductTreeName(branchType)<<"\n This is either not an edm ROOT file or is one that has been corrupted.";
67  }
68  // On merged files in older releases of ROOT, the autoFlush setting is always negative; we must guess.
69  // TODO: On newer merged files, we should be able to get this from the cluster iterator.
70  long treeAutoFlush = (tree_ ? tree_->GetAutoFlush() : 0);
71  if (treeAutoFlush < 0) {
72  // The "+1" is here to avoid divide-by-zero in degenerate cases.
73  Long64_t averageEventSizeBytes = tree_->GetZipBytes() / (tree_->GetEntries()+1) + 1;
74  treeAutoFlush_ = cacheSize_/averageEventSizeBytes+1;
75  } else {
76  treeAutoFlush_ = treeAutoFlush;
77  }
80  }
81  setTreeMaxVirtualSize(maxVirtualSize);
82  setCacheSize(cacheSize);
83  if (tree_) {
84  Int_t branchCount = tree_->GetListOfBranches()->GetEntriesFast();
85  trainedSet_.reserve(branchCount);
86  triggerSet_.reserve(branchCount);
87  }
88  }
89 
91  }
92 
94  RootTree::entryNumberForIndex(unsigned int index) const {
95  assert(index < entryNumberForIndex_->size());
96  return (*entryNumberForIndex_)[index];
97  }
98 
99  void
101  assert(index < entryNumberForIndex_->size());
102  (*entryNumberForIndex_)[index] = entryNumber();
103  }
104 
105  bool
107  if (metaTree_ == nullptr || metaTree_->GetNbranches() == 0) {
108  return tree_ != nullptr && auxBranch_ != nullptr;
109  }
110  if (tree_ != nullptr && auxBranch_ != nullptr && metaTree_ != nullptr) { // backward compatibility
111  if (branchEntryInfoBranch_ != nullptr || infoTree_ != nullptr) return true; // backward compatibility
112  return (entries_ == metaTree_->GetEntries() && tree_->GetNbranches() <= metaTree_->GetNbranches() + 1); // backward compatibility
113  } // backward compatibility
114  return false;
115  }
116 
119  rootDelayedReader_->reset();
120  return rootDelayedReader_.get();
121  }
122 
123  void
125  assert(isValid());
126  if(tree_->GetBranch(oldBranchName.c_str()) == nullptr){
127  prod.setDropped(true);
128  }
129  }
130 
131  void
133  BranchDescription const& prod,
134  std::string const& oldBranchName) {
135  assert(isValid());
136  //use the translated branch name
137  TBranch* branch = tree_->GetBranch(oldBranchName.c_str());
139  info.productBranch_ = nullptr;
140  if (prod.present()) {
141  info.productBranch_ = branch;
142  //we want the new branch name for the JobReport
143  branchNames_.push_back(prod.branchName());
144  }
145  TTree* provTree = (metaTree_ != nullptr ? metaTree_ : tree_);
146  info.provenanceBranch_ = provTree->GetBranch(oldBranchName.c_str());
147  branches_->insert(std::make_pair(key, info));
148  }
149 
150  void
151  RootTree::dropBranch(std::string const& oldBranchName) {
152  //use the translated branch name
153  TBranch* branch = tree_->GetBranch(oldBranchName.c_str());
154  if (branch != nullptr) {
155  TObjArray* leaves = tree_->GetListOfLeaves();
156  int entries = leaves->GetEntries();
157  for (int i = 0; i < entries; ++i) {
158  TLeaf* leaf = (TLeaf*)(*leaves)[i];
159  if (leaf == nullptr) continue;
160  TBranch* br = leaf->GetBranch();
161  if (br == nullptr) continue;
162  if (br->GetMother() == branch) {
163  leaves->Remove(leaf);
164  }
165  }
166  leaves->Compress();
167  tree_->GetListOfBranches()->Remove(branch);
168  tree_->GetListOfBranches()->Compress();
169  delete branch;
170  }
171  }
172 
173  roottree::BranchMap const&
174  RootTree::branches() const {return *branches_;}
175 
176  void
177  RootTree::setCacheSize(unsigned int cacheSize) {
178  cacheSize_ = cacheSize;
179  tree_->SetCacheSize(static_cast<Long64_t>(cacheSize));
180  treeCache_.reset(dynamic_cast<TTreeCache*>(filePtr_->GetCacheRead()));
181  if(treeCache_) treeCache_->SetEnablePrefetching(enablePrefetching_);
182  filePtr_->SetCacheRead(0);
183  rawTreeCache_.reset();
184  }
185 
186  void
187  RootTree::setTreeMaxVirtualSize(int treeMaxVirtualSize) {
188  if (treeMaxVirtualSize >= 0) tree_->SetMaxVirtualSize(static_cast<Long64_t>(treeMaxVirtualSize));
189  }
190 
191  void
193  filePtr_->SetCacheRead(treeCache_.get());
194 
195  // Detect a backward skip. If the skip is sufficiently large, we roll the dice and reset the treeCache.
196  // This will cause some amount of over-reading: we pre-fetch all the events in some prior cluster.
197  // However, because reading one event in the cluster is supposed to be equivalent to reading all events in the cluster,
198  // we're not incurring additional over-reading - we're just doing it more efficiently.
199  // NOTE: Constructor guarantees treeAutoFlush_ is positive, even if TTree->GetAutoFlush() is negative.
200  if ((theEntryNumber < static_cast<EntryNumber>(entryNumber_-treeAutoFlush_)) &&
201  (treeCache_) && (!treeCache_->IsLearning()) && (entries_ > 0) && (switchOverEntry_ >= 0)) {
202  treeCache_->SetEntryRange(theEntryNumber, entries_);
203  treeCache_->FillBuffer();
204  }
205 
206  entryNumber_ = theEntryNumber;
207  tree_->LoadTree(entryNumber_);
208  filePtr_->SetCacheRead(0);
209  if(treeCache_ && trainNow_ && entryNumber_ >= 0) {
210  startTraining();
211  trainNow_ = false;
212  trainedSet_.clear();
213  triggerSet_.clear();
215  }
216  if (treeCache_ && treeCache_->IsLearning() && switchOverEntry_ >= 0 && entryNumber_ >= switchOverEntry_) {
217  stopTraining();
218  }
219  }
220 
221  // The actual implementation is done below; it's split in this strange
222  // manner in order to keep a by-definition-rare code path out of the instruction cache.
223  inline TTreeCache*
224  RootTree::checkTriggerCache(TBranch* branch, EntryNumber entryNumber) const {
225  if (!treeCache_->IsAsyncReading() && enableTriggerCache_ && (trainedSet_.find(branch) == trainedSet_.end())) {
226  return checkTriggerCacheImpl(branch, entryNumber);
227  } else {
228  return NULL;
229  }
230  }
231 
232  // See comments in the header. If this function is called, we already know
233  // the trigger cache is active and it was a cache miss for the regular cache.
234  TTreeCache*
235  RootTree::checkTriggerCacheImpl(TBranch* branch, EntryNumber entryNumber) const {
236  // This branch is not going to be in the cache.
237  // Assume this is a "trigger pattern".
238  // Always make sure the branch is added to the trigger set.
239  if (triggerSet_.find(branch) == triggerSet_.end()) {
240  triggerSet_.insert(branch);
241  if (triggerTreeCache_.get()) { triggerTreeCache_->AddBranch(branch, kTRUE); }
242  }
243 
244  if (rawTriggerSwitchOverEntry_ < 0) {
245  // The trigger has never fired before. Take everything not in the
246  // trainedSet and load it from disk
247 
248  // Calculate the end of the next cluster; triggers in the next cluster
249  // will use the triggerCache, not the rawTriggerCache.
250  TTree::TClusterIterator clusterIter = tree_->GetClusterIterator(entryNumber);
251  while (rawTriggerSwitchOverEntry_ < entryNumber) {
252  rawTriggerSwitchOverEntry_ = clusterIter();
253  }
254 
255  // ROOT will automatically expand the cache to fit one cluster; hence, we use
256  // 5 MB as the cache size below
257  tree_->SetCacheSize(static_cast<Long64_t>(5*1024*1024));
258  rawTriggerTreeCache_.reset(dynamic_cast<TTreeCache*>(filePtr_->GetCacheRead()));
259  if(rawTriggerTreeCache_) rawTriggerTreeCache_->SetEnablePrefetching(false);
260  TObjArray *branches = tree_->GetListOfBranches();
261  int branchCount = branches->GetEntriesFast();
262 
263  // Train the rawTriggerCache to have everything not in the regular cache.
264  rawTriggerTreeCache_->SetLearnEntries(0);
265  rawTriggerTreeCache_->SetEntryRange(entryNumber, rawTriggerSwitchOverEntry_);
266  for (int i=0;i<branchCount;i++) {
267  TBranch *tmp_branch = (TBranch*)branches->UncheckedAt(i);
268  if (trainedSet_.find(tmp_branch) != trainedSet_.end()) {
269  continue;
270  }
271  rawTriggerTreeCache_->AddBranch(tmp_branch, kTRUE);
272  }
273  performedSwitchOver_ = false;
274  rawTriggerTreeCache_->StopLearningPhase();
275  filePtr_->SetCacheRead(0);
276 
277  return rawTriggerTreeCache_.get();
279  // The raw trigger has fired and it contents are valid.
280  return rawTriggerTreeCache_.get();
281  } else if (rawTriggerSwitchOverEntry_ > 0) {
282  // The raw trigger has fired, but we are out of the cache. Use the
283  // triggerCache instead.
284  if (!performedSwitchOver_) {
285  rawTriggerTreeCache_.reset();
286  performedSwitchOver_ = true;
287 
288  // Train the triggerCache
289  tree_->SetCacheSize(static_cast<Long64_t>(5*1024*1024));
290  triggerTreeCache_.reset(dynamic_cast<TTreeCache*>(filePtr_->GetCacheRead()));
291  triggerTreeCache_->SetEnablePrefetching(false);
292  triggerTreeCache_->SetLearnEntries(0);
293  triggerTreeCache_->SetEntryRange(entryNumber, tree_->GetEntries());
294  for(std::unordered_set<TBranch*>::const_iterator it = triggerSet_.begin(), itEnd = triggerSet_.end();
295  it != itEnd;
296  it++)
297  {
298  triggerTreeCache_->AddBranch(*it, kTRUE);
299  }
300  triggerTreeCache_->StopLearningPhase();
301  filePtr_->SetCacheRead(0);
302  }
303  return triggerTreeCache_.get();
305  // The raw trigger has fired and it contents are valid.
306  return rawTriggerTreeCache_.get();
307  } else if (rawTriggerSwitchOverEntry_ > 0) {
308  // The raw trigger has fired, but we are out of the cache. Use the
309  // triggerCache instead.
310  if (!performedSwitchOver_) {
311  rawTriggerTreeCache_.reset();
312  performedSwitchOver_ = true;
313 
314  // Train the triggerCache
315  tree_->SetCacheSize(static_cast<Long64_t>(5*1024*1024));
316  triggerTreeCache_.reset(dynamic_cast<TTreeCache*>(filePtr_->GetCacheRead()));
317  triggerTreeCache_->SetEnablePrefetching(false);
318  triggerTreeCache_->SetLearnEntries(0);
319  triggerTreeCache_->SetEntryRange(entryNumber, tree_->GetEntries());
320  for(std::unordered_set<TBranch*>::const_iterator it = triggerSet_.begin(), itEnd = triggerSet_.end();
321  it != itEnd;
322  it++)
323  {
324  triggerTreeCache_->AddBranch(*it, kTRUE);
325  }
326  triggerTreeCache_->StopLearningPhase();
327  filePtr_->SetCacheRead(0);
328  }
329  return triggerTreeCache_.get();
330  }
331 
332  // By construction, this case should be impossible.
333  assert (false);
334  return NULL;
335  }
336 
337  inline TTreeCache*
338  RootTree::selectCache(TBranch* branch, EntryNumber entryNumber) const {
339  TTreeCache *triggerCache = NULL;
340  if (!treeCache_) {
341  return NULL;
342  } else if (treeCache_->IsLearning() && rawTreeCache_) {
343  treeCache_->AddBranch(branch, kTRUE);
344  trainedSet_.insert(branch);
345  return rawTreeCache_.get();
346  } else if ((triggerCache = checkTriggerCache(branch, entryNumber))) {
347  // A NULL return value from checkTriggerCache indicates the trigger cache case
348  // does not apply, and we should continue below.
349  return triggerCache;
350  } else {
351  // The "normal" TTreeCache case.
352  return treeCache_.get();
353  }
354  }
355 
356  void
357  RootTree::getEntry(TBranch* branch, EntryNumber entryNumber) const {
358  try {
359  TTreeCache * cache = selectCache(branch, entryNumber);
360  filePtr_->SetCacheRead(cache);
361  branch->GetEntry(entryNumber);
362  filePtr_->SetCacheRead(0);
363  } catch(cms::Exception const& e) {
364  // We make sure the treeCache_ is detached from the file,
365  // so that ROOT does not also delete it.
366  filePtr_->SetCacheRead(0);
368  t.addContext(std::string("Reading branch ")+branch->GetName());
369  throw t;
370  }
371  }
372 
373  bool
374  RootTree::skipEntries(unsigned int& offset) {
375  entryNumber_ += offset;
376  bool retval = (entryNumber_ < entries_);
377  if(retval) {
378  offset = 0;
379  } else {
380  // Not enough entries in the file to skip.
381  // The +1 is needed because entryNumber_ is -1 at the initialization of the tree, not 0.
382  long long overshoot = entryNumber_ + 1 - entries_;
384  offset = overshoot;
385  }
386  return retval;
387  }
388 
389  void
391  if (cacheSize_ == 0) {
392  return;
393  }
397  treeCache_->SetLearnEntries(learningEntries_);
398  tree_->SetCacheSize(static_cast<Long64_t>(cacheSize_));
399  rawTreeCache_.reset(dynamic_cast<TTreeCache *>(filePtr_->GetCacheRead()));
400  rawTreeCache_->SetEnablePrefetching(false);
401  filePtr_->SetCacheRead(0);
402  rawTreeCache_->SetLearnEntries(0);
404  rawTreeCache_->StartLearningPhase();
406  rawTreeCache_->AddBranch("*", kTRUE);
407  rawTreeCache_->StopLearningPhase();
408  treeCache_->StartLearningPhase();
409  treeCache_->SetEntryRange(switchOverEntry_, tree_->GetEntries());
410  // Make sure that 'branchListIndexes' branch exist in input file
411  if (filePtr_->Get(poolNames::branchListIndexesBranchName().c_str()) != nullptr) {
412  treeCache_->AddBranch(poolNames::branchListIndexesBranchName().c_str(), kTRUE);
413  }
414  treeCache_->AddBranch(BranchTypeToAuxiliaryBranchName(branchType_).c_str(), kTRUE);
415  trainedSet_.clear();
416  triggerSet_.clear();
417  assert(treeCache_->GetTree() == tree_);
418  }
419 
420  void
422  filePtr_->SetCacheRead(treeCache_.get());
423  treeCache_->StopLearningPhase();
424  filePtr_->SetCacheRead(0);
425  rawTreeCache_.reset();
426  }
427 
428  void
430  // The TFile is about to be closed, and destructed.
431  // Just to play it safe, zero all pointers to quantities that are owned by the TFile.
433  tree_ = metaTree_ = infoTree_ = nullptr;
434  // We own the treeCache_.
435  // We make sure the treeCache_ is detached from the file,
436  // so that ROOT does not also delete it.
437  filePtr_->SetCacheRead(0);
438  // We *must* delete the TTreeCache here because the TFilePrefetch object
439  // references the TFile. If TFile is closed, before the TTreeCache is
440  // deleted, the TFilePrefetch may continue to do TFile operations, causing
441  // deadlocks or exceptions.
442  treeCache_.reset();
443  rawTreeCache_.reset();
444  triggerTreeCache_.reset();
445  rawTriggerTreeCache_.reset();
446  // We give up our shared ownership of the TFile itself.
447  filePtr_.reset();
448  }
449 
450  void
451  RootTree::trainCache(char const* branchNames) {
452  if (cacheSize_ == 0) {
453  return;
454  }
455  tree_->LoadTree(0);
457  filePtr_->SetCacheRead(treeCache_.get());
458  treeCache_->StartLearningPhase();
459  treeCache_->SetEntryRange(0, tree_->GetEntries());
460  treeCache_->AddBranch(branchNames, kTRUE);
461  treeCache_->StopLearningPhase();
462  assert(treeCache_->GetTree() == tree_);
463  // We own the treeCache_.
464  // We make sure the treeCache_ is detached from the file,
465  // so that ROOT does not also delete it.
466  filePtr_->SetCacheRead(0);
467 
468  // Must also manually add things to the trained set.
469  TObjArray *branches = tree_->GetListOfBranches();
470  int branchCount = branches->GetEntriesFast();
471  for (int i=0;i<branchCount;i++) {
472  TBranch *branch = (TBranch*)branches->UncheckedAt(i);
473  if ((branchNames[0] == '*') || (strcmp(branchNames, branch->GetName()) == 0)) {
474  trainedSet_.insert(branch);
475  }
476  }
477 
478  }
479 
480  void
481  RootTree::setSignals(signalslot::Signal<void(StreamContext const&, ModuleCallingContext const&)> const* preEventReadSource,
482  signalslot::Signal<void(StreamContext const&, ModuleCallingContext const&)> const* postEventReadSource) {
483  rootDelayedReader_->setSignals(preEventReadSource,
484  postEventReadSource);
485  }
486 
487 
488  namespace roottree {
489  Int_t
490  getEntry(TBranch* branch, EntryNumber entryNumber) {
491  Int_t n = 0;
492  try {
493  n = branch->GetEntry(entryNumber);
494  }
495  catch(cms::Exception const& e) {
496  throw Exception(errors::FileReadError, "", e);
497  }
498  return n;
499  }
500 
501  Int_t
502  getEntry(TTree* tree, EntryNumber entryNumber) {
503  Int_t n = 0;
504  try {
505  n = tree->GetEntry(entryNumber);
506  }
507  catch(cms::Exception const& e) {
508  throw Exception (errors::FileReadError, "", e);
509  }
510  return n;
511  }
512 
513  std::unique_ptr<TTreeCache>
514  trainCache(TTree* tree, InputFile& file, unsigned int cacheSize, char const* branchNames) {
515  tree->LoadTree(0);
516  tree->SetCacheSize(cacheSize);
517  std::unique_ptr<TTreeCache> treeCache(dynamic_cast<TTreeCache*>(file.GetCacheRead()));
518  if (nullptr != treeCache.get()) {
519  treeCache->StartLearningPhase();
520  treeCache->SetEntryRange(0, tree->GetEntries());
521  treeCache->AddBranch(branchNames, kTRUE);
522  treeCache->StopLearningPhase();
523  }
524  // We own the treeCache_.
525  // We make sure the treeCache_ is detached from the file,
526  // so that ROOT does not also delete it.
527  file.SetCacheRead(0);
528  return treeCache;
529  }
530  }
531 }
EntryNumber entryNumber_
Definition: RootTree.h:191
Int_t getEntry(TBranch *branch, EntryNumber entryNumber)
Definition: RootTree.cc:490
int i
Definition: DBlmapReader.cc:9
std::string const & branchName() const
std::string const & BranchTypeToMetaDataTreeName(BranchType const &branchType)
Definition: BranchType.cc:107
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:115
unsigned int learningEntries_
Definition: RootTree.h:199
InputType
Definition: InputType.h:5
static const TGPicture * info(bool iBackgroundIsBlack)
TTreeCache * checkTriggerCache(TBranch *branch, EntryNumber entryNumber) const
Definition: RootTree.cc:224
void addBranch(BranchKey const &key, BranchDescription const &prod, std::string const &oldBranchName)
Definition: RootTree.cc:132
std::shared_ptr< TTreeCache > rawTriggerTreeCache_
Definition: RootTree.h:187
void dropBranch(std::string const &oldBranchName)
Definition: RootTree.cc:151
std::vector< std::string > branchNames_
Definition: RootTree.h:193
std::shared_ptr< TTreeCache > treeCache_
Definition: RootTree.h:184
TTree * tree_
Definition: RootTree.h:177
bool trainNow_
Definition: RootTree.h:195
std::shared_ptr< BranchMap > branches_
Definition: RootTree.h:194
EntryNumber rawTriggerSwitchOverEntry_
Definition: RootTree.h:197
TFileCacheRead * GetCacheRead() const
Definition: InputFile.h:47
assert(m_qm.get())
roottree::BranchMap BranchMap
Definition: RootTree.h:71
EntryNumber const & entries() const
Definition: RootTree.h:104
void setSignals(signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *preEventReadSource, signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *postEventReadSource)
Definition: RootTree.cc:481
TTree * metaTree_
Definition: RootTree.h:178
std::unordered_set< TBranch * > trainedSet_
Definition: RootTree.h:188
#define NULL
Definition: scimark2.h:8
void stopTraining()
Definition: RootTree.cc:421
TBranch * branchEntryInfoBranch_
Definition: RootTree.h:208
void setPresence(BranchDescription &prod, std::string const &oldBranchName)
Definition: RootTree.cc:124
EntryNumber entries_
Definition: RootTree.h:190
#define nullptr
bool enablePrefetching_
Definition: RootTree.h:204
void trainCache(char const *branchNames)
Definition: RootTree.cc:451
std::unique_ptr< RootDelayedReader > rootDelayedReader_
Definition: RootTree.h:206
void setTreeMaxVirtualSize(int treeMaxVirtualSize)
Definition: RootTree.cc:187
std::map< BranchKey const, BranchInfo > BranchMap
Definition: RootTree.h:63
BranchType
Definition: BranchType.h:11
void insertEntryForIndex(unsigned int index)
Definition: RootTree.cc:100
TTreeCache * selectCache(TBranch *branch, EntryNumber entryNumber) const
Definition: RootTree.cc:338
unsigned long treeAutoFlush_
Definition: RootTree.h:201
std::string const & BranchTypeToBranchEntryInfoBranchName(BranchType const &branchType)
Definition: BranchType.cc:127
void setDropped(bool isDropped)
std::string const & BranchTypeToProductTreeName(BranchType const &branchType)
Definition: BranchType.cc:103
IndexIntoFile::EntryNumber_t EntryNumber
Definition: RootTree.h:49
TTreeCache * checkTriggerCacheImpl(TBranch *branch, EntryNumber entryNumber) const
Definition: RootTree.cc:235
string key
FastSim: produces sample of signal events, overlayed with premixed minbias events.
TBranch * auxBranch_
Definition: RootTree.h:180
EntryNumber const & entryNumber() const
Definition: RootTree.h:102
std::string const & BranchTypeToInfoTreeName(BranchType const &branchType)
Definition: BranchType.cc:111
TBranch * provenanceBranch_
Definition: RootTree.h:59
bool enableTriggerCache_
Definition: RootTree.h:205
DelayedReader * rootDelayedReader() const
Definition: RootTree.cc:118
EntryNumber const & entryNumberForIndex(unsigned int index) const
Definition: RootTree.cc:94
std::shared_ptr< TTreeCache > rawTreeCache_
Definition: RootTree.h:185
void close()
Definition: RootTree.cc:429
void getEntry(TBranch *branch, EntryNumber entry) const
Definition: RootTree.cc:357
void startTraining()
Definition: RootTree.cc:390
void addContext(std::string const &context)
Definition: Exception.cc:227
bool isValid() const
Definition: RootTree.cc:106
std::shared_ptr< InputFile > filePtr_
Definition: RootTree.h:173
TBranch * productBranch_
Definition: RootTree.h:58
void setCacheSize(unsigned int cacheSize)
Definition: RootTree.cc:177
bool performedSwitchOver_
Definition: RootTree.h:198
std::unique_ptr< std::vector< EntryNumber > > entryNumberForIndex_
Definition: RootTree.h:192
unsigned int cacheSize_
Definition: RootTree.h:200
bool skipEntries(unsigned int &offset)
Definition: RootTree.cc:374
std::unordered_set< TBranch * > triggerSet_
Definition: RootTree.h:189
RootTree(std::shared_ptr< InputFile > filePtr, BranchType const &branchType, unsigned int nIndexes, unsigned int maxVirtualSize, unsigned int cacheSize, unsigned int learningEntries, bool enablePrefetching, InputType inputType)
Definition: RootTree.cc:28
std::string const & BranchTypeToAuxBranchName(BranchType const &branchType)
Definition: BranchType.cc:119
BranchMap const & branches() const
Definition: RootTree.cc:174
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:247
volatile std::atomic< bool > shutdown_flag false
std::unique_ptr< TTreeCache > trainCache(TTree *tree, InputFile &file, unsigned int cacheSize, char const *branchNames)
Definition: RootTree.cc:514
void SetCacheRead(TFileCacheRead *tfcr)
Definition: InputFile.h:48
EntryNumber switchOverEntry_
Definition: RootTree.h:196
std::shared_ptr< TTreeCache > triggerTreeCache_
Definition: RootTree.h:186
tuple size
Write out results.
T get(const Candidate &c)
Definition: component.h:55
BranchType branchType_
Definition: RootTree.h:179
TTree * infoTree_
Definition: RootTree.h:210
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:192
roottree::EntryNumber EntryNumber
Definition: RootTree.h:72