CMS 3D CMS Logo

BranchMapReader.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: FWLite
4 // Class : BranchMapReader
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Dan Riley
10 // Created: Tue May 20 10:31:32 EDT 2008
11 //
12 
13 // system include files
14 
15 // user include files
17 
30 
31 #include "TBranch.h"
32 #include "TFile.h"
33 #include "TTree.h"
34 
35 #include <cassert>
36 
37 namespace fwlite {
38  namespace internal {
39 
41 
42  BMRStrategy::BMRStrategy(TFile* file, int fileVersion)
43  : currentFile_(file), eventTree_(nullptr), luminosityBlockTree_(nullptr), runTree_(nullptr),
44  eventEntry_(-1), luminosityBlockEntry_(-1), runEntry_(-1), fileVersion_(fileVersion) {
45  // do in derived obects
46  // updateFile(file);
47  }
48 
50  }
51 
52  class Strategy : public BMRStrategy {
53  public:
54  typedef std::map<edm::BranchID, edm::BranchDescription> bidToDesc;
55 
56  Strategy(TFile* file, int fileVersion);
57  ~Strategy() override;
58  bool updateFile(TFile* file) override;
59  bool updateEvent(Long_t eventEntry) override { eventEntry_ = eventEntry; return true; }
60  bool updateLuminosityBlock(Long_t luminosityBlockEntry) override {
61  luminosityBlockEntry_ = luminosityBlockEntry;
62  return true;
63  }
64  bool updateRun(Long_t runEntry) override {
65  runEntry_ = runEntry;
66  return true;
67  }
68  bool updateMap() override { return true; }
70  edm::BranchDescription const& productToBranch(edm::ProductID const& pid) override;
71  edm::BranchDescription const& branchIDToBranch(edm::BranchID const& bid) const override;
72  std::vector<edm::BranchDescription> const& getBranchDescriptions() override;
73  edm::ThinnedAssociationsHelper const& thinnedAssociationsHelper() const override { return *thinnedAssociationsHelper_; }
74 
75  TBranch* getBranchRegistry(edm::ProductRegistry** pReg);
76 
78  std::vector<edm::BranchDescription> bDesc_;
81  };
82 
83  Strategy::Strategy(TFile* file, int fileVersion)
84  : BMRStrategy(file, fileVersion), mapperFilled_(false), thinnedAssociationsHelper_(new edm::ThinnedAssociationsHelper) {
85  // do in derived obects
86  // updateFile(file);
87  }
88 
90  // probably need to clean up something here...
91  }
92 
93  bool Strategy::updateFile(TFile* file) {
95  eventTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::eventTreeName().c_str()));
96  luminosityBlockTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::luminosityBlockTreeName().c_str()));
97  runTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::runTreeName().c_str()));
98  fileUUID_ = currentFile_->GetUUID();
99  branchDescriptionMap_.clear();
100  bDesc_.clear();
101  return nullptr != eventTree_;
102  }
103 
105  TBranch* bReg(nullptr);
106 
107  TTree* metaDataTree = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::metaDataTreeName().c_str()));
108  if(nullptr != metaDataTree) {
109  bReg = metaDataTree->GetBranch(edm::poolNames::productDescriptionBranchName().c_str());
110  bReg->SetAddress(ppReg);
111  bReg->GetEntry(0);
112  }
113  return bReg;
114  }
115 
116  std::vector<edm::BranchDescription> const&
118  if(bDesc_.empty()) {
119  for(auto const& item : branchDescriptionMap_) {
120  bDesc_.push_back(item.second);
121  }
122  }
123  return bDesc_;
124  }
125 
128  throw edm::Exception(edm::errors::UnimplementedFeature) << "Unsupported EDM file version";
129  }
130 
131  edm::BranchDescription const &
133  edm::BranchID bid = productToBranchID(pid);
134  bidToDesc::const_iterator bdi = branchDescriptionMap_.find(bid);
135  if(branchDescriptionMap_.end() == bdi) {
137  }
138  return bdi->second;
139  }
140 
141  edm::BranchDescription const &
143  bidToDesc::const_iterator bdi = branchDescriptionMap_.find(bid);
144  if(branchDescriptionMap_.end() == bdi) {
146  }
147  return bdi->second;
148  }
149 
151  public:
152  BranchMapReaderStrategyV1(TFile* file, int fileVersion);
153  bool updateFile(TFile* file) override;
154  bool updateMap() override;
155  edm::BranchListIndexes const& branchListIndexes() const override {return dummyBranchListIndexes_;}
156  private:
158  };
159 
161  : Strategy(file, fileVersion) {
162  updateFile(file);
163  }
164 
166  if(Strategy::updateFile(file)) {
167  mapperFilled_ = false;
168  return true;
169  }
170  return false;
171  }
172 
174  if(mapperFilled_) {
175  return true;
176  }
177 
178  branchDescriptionMap_.clear();
179  bDesc_.clear();
180 
182  edm::ProductRegistry* pReg = &reg;
183  TBranch* br = getBranchRegistry(&pReg);
184 
185  if(nullptr != br) {
187 
188  for(auto& item : prodList) {
189  edm::BranchDescription& prod = item.second;
190  if(edm::InEvent == prod.branchType()) {
191  // call to regenerate branchName
192  prod.init();
194  }
195  }
196  mapperFilled_ = true;
197  }
198  reg.setFrozen(false);
199  return nullptr != br;
200  }
201 
202  // v7 has differences in product status that are not implemented in BranchMapReader yet
204  public:
205  BranchMapReaderStrategyV7(TFile* file, int fileVersion);
207  private:
209  };
210 
212  : BranchMapReaderStrategyV1(file, fileVersion) {
213  updateFile(file);
214  }
215 
217  public:
218  BranchMapReaderStrategyV8(TFile* file, int fileVersion);
219  bool updateFile(TFile* file) override;
220  bool updateEvent(Long_t eventEntry) override;
221  bool updateLuminosityBlock(Long_t luminosityBlockEntry) override;
222  bool updateRun(Long_t runEntry) override;
223  bool updateMap() override;
225  private:
230  };
231 
233  : Strategy(file, fileVersion),
234  eventEntryInfoVector_(), pEventEntryInfoVector_(&eventEntryInfoVector_) {
235  updateFile(file);
236  }
237 
239  // std::cout << "v8 updateevent " << newevent << std::endl;
240  if(newevent != eventEntry_) {
241  eventEntry_ = newevent;
242  mapperFilled_ = false;
243  }
244  return true;
245  }
246 
248  if(newLumi != luminosityBlockEntry_) {
249  luminosityBlockEntry_ = newLumi;
250  mapperFilled_ = false;
251  }
252  return true;
253  }
254 
256  if(newRun != runEntry_) {
257  runEntry_ = newRun;
258  mapperFilled_ = false;
259  }
260  return true;
261  }
262 
264  Strategy::updateFile(file);
265  mapperFilled_ = false;
266  entryInfoBranch_ = nullptr;
267  TTree* metaDataTree = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::eventMetaDataTreeName().c_str()));
268  if(nullptr != metaDataTree) {
269  entryInfoBranch_ = metaDataTree->GetBranch(BranchTypeToBranchEntryInfoBranchName(edm::InEvent).c_str());
270 // std::cout << "entryInfoBranch for " << BranchTypeToBranchEntryInfoBranchName(edm::InEvent) << " " << entryInfoBranch_ << std::endl;
271  } else {
272  return false;
273  }
276 
277  branchDescriptionMap_.clear();
278  bDesc_.clear();
279 
281  edm::ProductRegistry* pReg = &reg;
282  TBranch *br = getBranchRegistry(&pReg);
283 
284  if(nullptr != br) {
286 
287  for(auto& item : prodList) {
288  edm::BranchDescription& prod = item.second;
289  if(edm::InEvent == prod.branchType()) {
290  // call to regenerate branchName
291  prod.init();
293  }
294  }
295  }
296  reg.setFrozen(false);
297  return nullptr != br;
298  }
299 
301  if(mapperFilled_) {
302  return true;
303  }
304 
305  assert(entryInfoBranch_);
306 
307  entryInfoBranch_->GetEntry(eventEntry_);
308 
309 // for(auto const& item : *pEventEntryInfoVector_) {
310 // eventInfoMap_.insert(item);
311 // }
312  mapperFilled_ = true;
313  return true;
314  }
315 
317  public:
318  BranchMapReaderStrategyV11(TFile* file, int fileVersion);
319  bool updateFile(TFile* file) override;
320  bool updateEvent(Long_t eventEntry) override;
321  bool updateLuminosityBlock(Long_t luminosityBlockEntry) override;
322  bool updateRun(Long_t runEntry) override;
323  bool updateMap() override;
325  edm::BranchListIndexes const& branchListIndexes() const override {return history_.branchListIndexes();}
326  private:
331  };
332 
334  : Strategy(file, fileVersion), eventHistoryTree_(nullptr), pHistory_(&history_) {
335  updateFile(file);
336  }
337 
339 // std::cout << "v11 updateevent " << newevent << std::endl;
340  if(newevent != eventEntry_) {
341  eventEntry_ = newevent;
342  mapperFilled_ = false;
343  }
344  return true;
345  }
346 
348  if(newlumi != luminosityBlockEntry_) {
349  luminosityBlockEntry_ = newlumi;
350  mapperFilled_ = false;
351  }
352  return true;
353  }
354 
356  if(newRun != runEntry_) {
357  runEntry_ = newRun;
358  mapperFilled_ = false;
359  }
360  return true;
361  }
362 
364  Strategy::updateFile(file);
365  mapperFilled_ = false;
366  TTree* metaDataTree = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::metaDataTreeName().c_str()));
367 
368  if(nullptr == metaDataTree) {
370  <<"No "<<edm::poolNames::metaDataTreeName()<<" TTree in file";
371  }
372  branchIDLists_ = std::make_unique<edm::BranchIDLists>();
373  edm::BranchIDLists* branchIDListsPtr = branchIDLists_.get();
374  if(metaDataTree->FindBranch(edm::poolNames::branchIDListBranchName().c_str()) != nullptr) {
375  TBranch* b = metaDataTree->GetBranch(edm::poolNames::branchIDListBranchName().c_str());
376  b->SetAddress(&branchIDListsPtr);
377  b->GetEntry(0);
378 // std::cout << "--> " << branchIDLists_->size() << std::endl;
379  } else {
381  << "FindBranch of branchIDList failed";
382  return false;
383  }
384 
385  eventHistoryTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::eventHistoryTreeName().c_str()));
386 
387  branchDescriptionMap_.clear();
388  bDesc_.clear();
389 
391  edm::ProductRegistry* pReg = &reg;
392  TBranch *br = getBranchRegistry(&pReg);
393 
394  if(nullptr != br) {
396 
397  for(auto& item : prodList) {
398  edm::BranchDescription& prod = item.second;
399  if(edm::InEvent == prod.branchType()) {
400  // call to regenerate branchName
401  prod.init();
403 // std::cout << "v11 updatefile " << prod.branchID() << std::endl;
404  }
405  }
406  }
407  reg.setFrozen(false);
408  return nullptr != br;
409  }
410 
412  if(!mapperFilled_) {
413  TBranch* eventHistoryBranch = eventHistoryTree_->GetBranch(edm::poolNames::eventHistoryBranchName().c_str());
414  if(!eventHistoryBranch) {
416  << "Failed to find history branch in event history tree";
417  return false;
418  }
419  // yes, SetAddress really does need to be called every time...
420  eventHistoryBranch->SetAddress(&pHistory_);
421  eventHistoryTree_->GetEntry(eventEntry_);
422  mapperFilled_ = true;
423  }
424  return true;
425  }
426 
429  updateMap();
431  }
432 
434  public:
435  BranchMapReaderStrategyV17(TFile* file, int fileVersion);
436  bool updateFile(TFile* file) override;
437  bool updateEvent(Long_t eventEntry) override;
438  bool updateLuminosityBlock(Long_t luminosityBlockEntry) override;
439  bool updateRun(Long_t runEntry) override;
440  bool updateMap() override;
442  edm::BranchListIndexes const& branchListIndexes() const override {return branchListIndexes_;}
443  private:
448  };
449 
451  : Strategy(file, fileVersion), eventsTree_(nullptr), pBranchListIndexes_(&branchListIndexes_) {
452  updateFile(file);
453  }
454 
456 // std::cout << "v11 updateevent " << newevent << std::endl;
457  if(newevent != eventEntry_) {
458  eventEntry_ = newevent;
459  mapperFilled_ = false;
460  }
461  return true;
462  }
463 
465  if(newlumi != luminosityBlockEntry_) {
466  luminosityBlockEntry_ = newlumi;
467  mapperFilled_ = false;
468  }
469  return true;
470  }
471 
473  if(newRun != runEntry_) {
474  runEntry_ = newRun;
475  mapperFilled_ = false;
476  }
477  return true;
478  }
479 
481  Strategy::updateFile(file);
482  mapperFilled_ = false;
483  TTree* metaDataTree = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::metaDataTreeName().c_str()));
484  if(nullptr == metaDataTree) {
486  }
487 
488  thinnedAssociationsHelper_ = std::make_unique<edm::ThinnedAssociationsHelper>();
489  edm::ThinnedAssociationsHelper* thinnedAssociationsHelperPtr = thinnedAssociationsHelper_.get();
490  if(metaDataTree->FindBranch(edm::poolNames::thinnedAssociationsHelperBranchName().c_str()) != nullptr) {
491  TBranch* b = metaDataTree->GetBranch(edm::poolNames::thinnedAssociationsHelperBranchName().c_str());
492  b->SetAddress(&thinnedAssociationsHelperPtr);
493  b->GetEntry(0);
494  }
495 
496  branchIDLists_ = std::make_unique<edm::BranchIDLists>();
497  edm::BranchIDLists* branchIDListsPtr = branchIDLists_.get();
498  if(metaDataTree->FindBranch(edm::poolNames::branchIDListBranchName().c_str()) != nullptr) {
499  TBranch* b = metaDataTree->GetBranch(edm::poolNames::branchIDListBranchName().c_str());
500  b->SetAddress(&branchIDListsPtr);
501  b->GetEntry(0);
502 // std::cout << "--> " << branchIDLists_->size() << std::endl;
503  } else {
505  << "FindBranch of branchIDList failed";
506  return false;
507  }
508 
509  eventsTree_ = dynamic_cast<TTree*>(currentFile_->Get(edm::poolNames::eventTreeName().c_str()));
510 
511  branchDescriptionMap_.clear();
512  bDesc_.clear();
513 
515  edm::ProductRegistry* pReg = &reg;
516  TBranch *br = getBranchRegistry(&pReg);
517 
518  if(nullptr != br) {
520 
521  for(auto& item : prodList) {
522  edm::BranchDescription& prod = item.second;
523  if(edm::InEvent == prod.branchType()) {
524  // call to regenerate branchName
525  prod.init();
527 // std::cout << "v11 updatefile " << prod.branchID() << std::endl;
528  }
529  }
530  }
531  reg.setFrozen(false);
532  return nullptr != br;
533  }
534 
536  if(!mapperFilled_) {
537  TBranch* branchListIndexesBranch = eventsTree_->GetBranch(edm::poolNames::branchListIndexesBranchName().c_str());
538  if(!branchListIndexesBranch) {
540  << "Failed to find branch list indexes branch in event tree";
541  return false;
542  }
543  // yes, SetAddress really does need to be called every time...
544  branchListIndexesBranch->SetAddress(&pBranchListIndexes_);
545  branchListIndexesBranch->GetEntry(eventEntry_);
546  mapperFilled_ = true;
547  }
548  return true;
549  }
550 
553  updateMap();
555  }
556  }
557 
558 //
559 // constants, enums and typedefs
560 //
561 
562 //
563 // static data member definitions
564 //
565 
566 //
567 // constructors and destructor
568 //
569 
571  fileVersion_(-1) {
572  if(nullptr == file) {
573  throw cms::Exception("NoFile")<<"The TFile pointer is null";
574  }
575  strategy_ = newStrategy(file, getFileVersion(file));
576 }
577 
578 //
579 // member functions
580 //
581 
583  TTree* metaDataTree = dynamic_cast<TTree*>(file->Get(edm::poolNames::metaDataTreeName().c_str()));
584  if(nullptr == metaDataTree) {
585  return 0;
586  }
587 
590  TBranch* bVer = metaDataTree->GetBranch(edm::poolNames::fileFormatVersionBranchName().c_str());
591  bVer->SetAddress(&pV);
592  bVer->GetEntry(0);
593  fileVersion_ = v.value();
594  return v.value();
595 }
596 
597 bool BranchMapReader::updateEvent(Long_t newevent) {
598  return strategy_->updateEvent(newevent);
599 }
600 
602  return strategy_->updateLuminosityBlock(newlumi);
603 }
604 
605 bool BranchMapReader::updateRun(Long_t newRun) {
606  return strategy_->updateRun(newRun);
607 }
608 
610  if(nullptr == strategy_.get()) {
611  strategy_ = newStrategy(file, getFileVersion(file));
612  return true;
613  }
614 
615  TFile* currentFile(strategy_->currentFile_);
616  bool isNew(file != currentFile);
617 
618  if(!isNew) {
619  //could still have a new TFile which just happens to share the same memory address as the previous file
620  //will assume that if the Event tree's address and UUID are the same as before then we do not have
621  // to treat this like a new file
622  TTree* eventTreeTemp = dynamic_cast<TTree*>(currentFile->Get(edm::poolNames::eventTreeName().c_str()));
623  isNew = eventTreeTemp != strategy_->eventTree_ || strategy_->fileUUID_ != currentFile->GetUUID();
624  }
625  if(isNew) {
626  int fileVersion = getFileVersion(file);
627  if(fileVersion != strategy_->fileVersion_) {
628  strategy_ = newStrategy(file, fileVersion);
629  } else {
630  strategy_->updateFile(file);
631  }
632  }
633  return isNew;
634 }
635 
638  return strategy_->productToBranch(pid);
639 }
640 
641 std::vector<edm::BranchDescription> const&
643  return strategy_->getBranchDescriptions();
644 }
645 
646 
647 std::unique_ptr<internal::BMRStrategy>
648 BranchMapReader::newStrategy(TFile* file, int fileVersion) {
649  std::unique_ptr<internal::BMRStrategy> s;
650 
651  if(fileVersion >= 17) {
652  s = std::make_unique<internal::BranchMapReaderStrategyV17>(file, fileVersion);
653  } else if(fileVersion >= 11) {
654  s = std::make_unique<internal::BranchMapReaderStrategyV11>(file, fileVersion);
655  } else if(fileVersion >= 8) {
656  s = std::make_unique<internal::BranchMapReaderStrategyV8>(file, fileVersion);
657  } else if(fileVersion >= 7) {
658  s = std::make_unique<internal::BranchMapReaderStrategyV7>(file, fileVersion);
659  } else {
660  s = std::make_unique<internal::BranchMapReaderStrategyV1>(file, fileVersion);
661  }
662  return s;
663 }
664 }
virtual bool updateFile(TFile *file)=0
BranchType const & branchType() const
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
bool updateEvent(Long_t eventEntry) override
std::unique_ptr< internal::BMRStrategy > newStrategy(TFile *file, int fileVersion)
virtual const std::vector< edm::BranchDescription > & getBranchDescriptions()=0
edm::propagate_const< TFile * > currentFile_
BMRStrategy(TFile *file, int fileVersion)
std::unique_ptr< internal::BMRStrategy > strategy_
bool updateEvent(Long_t eventEntry)
std::map< BranchKey, BranchDescription > ProductList
edm::EventEntryInfoVector const * pEventEntryInfoVector_
bool updateFile(TFile *file)
bool updateFile(TFile *file) override
bool updateRun(Long_t runEntry) override
std::string const & fileFormatVersionBranchName()
Definition: BranchType.cc:219
BranchMapReaderStrategyV7(TFile *file, int fileVersion)
std::vector< EventEntryInfo > EventEntryInfoVector
edm::propagate_const< std::unique_ptr< edm::BranchIDLists > > branchIDLists_
std::vector< edm::BranchDescription > const & getBranchDescriptions() override
#define nullptr
std::string const & luminosityBlockTreeName()
Definition: BranchType.cc:277
virtual const edm::BranchDescription & branchIDToBranch(const edm::BranchID &bid) const =0
edm::BranchListIndexes const & branchListIndexes() const override
std::vector< edm::BranchDescription > bDesc_
bool updateLuminosityBlock(Long_t luminosityBlockEntry)
edm::propagate_const< TTree * > eventTree_
std::vector< BranchListIndex > BranchListIndexes
edm::EventEntryInfoVector eventEntryInfoVector_
BranchID productIDToBranchID(ProductID const &pid, BranchIDLists const &lists, BranchListIndexes const &indexes)
Strategy(TFile *file, int fileVersion)
std::string const & eventHistoryBranchName()
Definition: BranchType.cc:244
edm::propagate_const< edm::BranchListIndexes * > pBranchListIndexes_
edm::propagate_const< TTree * > eventHistoryTree_
bool updateEvent(Long_t eventEntry) override
edm::BranchID productToBranchID(edm::ProductID const &pid) override
edm::BranchListIndexes const & branchListIndexes() const override
bool updateRun(Long_t runEntry) override
TBranch * getBranchRegistry(edm::ProductRegistry **pReg)
const edm::BranchDescription & productToBranch(const edm::ProductID &pid)
edm::propagate_const< TTree * > luminosityBlockTree_
bool updateLuminosityBlock(Long_t luminosityBlockEntry) override
std::string const & BranchTypeToBranchEntryInfoBranchName(BranchType const &branchType)
Definition: BranchType.cc:128
BranchID const & branchID() const
std::string const & metaDataTreeName()
Definition: BranchType.cc:169
void setFrozen(bool initializeLookupInfo=true)
std::string const & runTreeName()
Definition: BranchType.cc:280
BranchListIndexes const & branchListIndexes() const
Definition: History.h:50
element_type const * get() const
edm::BranchListIndexes const & branchListIndexes() const override
virtual const edm::BranchDescription & productToBranch(const edm::ProductID &pid)=0
BranchMapReaderStrategyV1(TFile *file, int fileVersion)
virtual edm::BranchID productToBranchID(const edm::ProductID &pid)=0
edm::BranchID productToBranchID(edm::ProductID const &pid) override
std::string const & eventMetaDataTreeName()
Definition: BranchType.cc:270
static const edm::BranchDescription kDefaultBranchDescription
bool updateEvent(Long_t eventEntry) override
double b
Definition: hdecay.h:120
edm::BranchListIndexes const & branchListIndexes() const override
ProductList & productListUpdator()
edm::propagate_const< TTree * > runTree_
edm::propagate_const< std::unique_ptr< edm::BranchIDLists > > branchIDLists_
std::string const & productDescriptionBranchName()
Definition: BranchType.cc:174
edm::propagate_const< std::unique_ptr< edm::ThinnedAssociationsHelper > > thinnedAssociationsHelper_
BranchMapReaderStrategyV8(TFile *file, int fileVersion)
BranchMapReaderStrategyV17(TFile *file, int fileVersion)
edm::propagate_const< TTree * > eventsTree_
bool updateEvent(Long_t eventEntry) override
HLT enums.
bool updateLuminosityBlock(Long_t luminosityBlockEntry) override
BranchMapReaderStrategyV11(TFile *file, int fileVersion)
std::string const & thinnedAssociationsHelperBranchName()
Definition: BranchType.cc:214
std::string const & eventTreeName()
Definition: BranchType.cc:266
bool updateRun(Long_t runEntry)
std::string const & branchIDListBranchName()
Definition: BranchType.cc:209
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:253
std::map< edm::BranchID, edm::BranchDescription > bidToDesc
bool updateRun(Long_t runEntry) override
edm::propagate_const< TBranch * > entryInfoBranch_
bool updateLuminosityBlock(Long_t luminosityBlockEntry) override
std::string const & eventHistoryTreeName()
Definition: BranchType.cc:274
edm::BranchID productToBranchID(edm::ProductID const &pid) override
edm::BranchDescription const & branchIDToBranch(edm::BranchID const &bid) const override
edm::BranchListIndexes const & branchListIndexes() const override
edm::BranchDescription const & productToBranch(edm::ProductID const &pid) override
bool updateLuminosityBlock(Long_t luminosityBlockEntry) override
const std::vector< edm::BranchDescription > & getBranchDescriptions()
edm::ThinnedAssociationsHelper const & thinnedAssociationsHelper() const override
bool updateRun(Long_t runEntry) override