CMS 3D CMS Logo

RootFile.cc
Go to the documentation of this file.
1 /*----------------------------------------------------------------------
2 ----------------------------------------------------------------------*/
3 
4 #include "RootFile.h"
5 #include "DuplicateChecker.h"
6 #include "InputFile.h"
7 #include "ProvenanceAdaptor.h"
8 #include "RunHelper.h"
9 
50 
53 
54 //used for backward compatibility
59 
60 #include "Rtypes.h"
61 #include "TClass.h"
62 #include "TString.h"
63 #include "TTree.h"
64 #include "TTreeCache.h"
65 
66 #include <algorithm>
67 #include <list>
68 
69 namespace edm {
70 
71  // Algorithm classes for making ProvenanceReader:
73  public:
74  std::unique_ptr<ProvenanceReaderBase> makeReader(RootTree& eventTree,
75  DaqProvenanceHelper const* daqProvenanceHelper) const override;
76  };
78  public:
79  MakeOldProvenanceReader(std::unique_ptr<EntryDescriptionMap>&& entryDescriptionMap)
80  : MakeProvenanceReader(), entryDescriptionMap_(std::move(entryDescriptionMap)) {}
81  std::unique_ptr<ProvenanceReaderBase> makeReader(RootTree& eventTree,
82  DaqProvenanceHelper const* daqProvenanceHelper) const override;
83 
84  private:
86  };
88  public:
89  std::unique_ptr<ProvenanceReaderBase> makeReader(RootTree& eventTree,
90  DaqProvenanceHelper const* daqProvenanceHelper) const override;
91  };
93  public:
94  MakeReducedProvenanceReader(std::vector<ParentageID> const& parentageIDLookup)
95  : parentageIDLookup_(parentageIDLookup) {}
96  std::unique_ptr<ProvenanceReaderBase> makeReader(RootTree& eventTree,
97  DaqProvenanceHelper const* daqProvenanceHelper) const override;
98 
99  private:
100  std::vector<ParentageID> const& parentageIDLookup_;
101  };
102 
103  namespace {
104  void checkReleaseVersion(std::vector<ProcessHistory> processHistoryVector, std::string const& fileName) {
105  std::string releaseVersion = getReleaseVersion();
106  releaseversion::DecomposedReleaseVersion currentRelease(releaseVersion);
107  for (auto const& ph : processHistoryVector) {
108  for (auto const& pc : ph) {
109  if (releaseversion::isEarlierRelease(currentRelease, pc.releaseVersion())) {
111  << "The release you are using, " << getReleaseVersion() << " , predates\n"
112  << "a release (" << pc.releaseVersion() << ") used in writing the input file, " << fileName << ".\n"
113  << "Forward compatibility cannot be supported.\n";
114  }
115  }
116  }
117  }
118  } // namespace
119 
120  // This is a helper class for IndexIntoFile.
122  public:
123  explicit RootFileEventFinder(RootTree& eventTree) : eventTree_(eventTree) {}
124  ~RootFileEventFinder() override {}
125 
129  EventAuxiliary eventAux;
130  EventAuxiliary* pEvAux = &eventAux;
132  eventTree_.setEntryNumber(saveEntry);
133  return eventAux.event();
134  }
135 
136  private:
138  };
139 
140  //---------------------------------------------------------------------
142  ProcessConfiguration const& processConfiguration,
143  std::string const& logicalFileName,
144  std::shared_ptr<InputFile> filePtr,
145  std::shared_ptr<EventSkipperByID> eventSkipperByID,
146  bool skipAnyEvents,
147  int remainingEvents,
148  int remainingLumis,
149  unsigned int nStreams,
150  unsigned int treeCacheSize,
151  int treeMaxVirtualSize,
153  RunHelperBase* runHelper,
154  bool noEventSort,
155  ProductSelectorRules const& productSelectorRules,
156  InputType inputType,
157  std::shared_ptr<BranchIDListHelper> branchIDListHelper,
158  std::shared_ptr<ThinnedAssociationsHelper> thinnedAssociationsHelper,
159  std::vector<BranchID> const* associationsFromSecondary,
160  std::shared_ptr<DuplicateChecker> duplicateChecker,
161  bool dropDescendants,
162  ProcessHistoryRegistry& processHistoryRegistry,
163  std::vector<std::shared_ptr<IndexIntoFile>> const& indexesIntoFiles,
164  std::vector<std::shared_ptr<IndexIntoFile>>::size_type currentIndexIntoFile,
165  std::vector<ProcessHistoryID>& orderedProcessHistoryIDs,
166  bool bypassVersionCheck,
167  bool labelRawDataLikeMC,
168  bool usingGoToEvent,
169  bool enablePrefetching,
170  bool enforceGUIDInFileName)
171  : file_(fileName),
172  logicalFile_(logicalFileName),
173  processConfiguration_(processConfiguration),
174  processHistoryRegistry_(&processHistoryRegistry),
175  filePtr_(filePtr),
176  eventSkipperByID_(eventSkipperByID),
177  fileFormatVersion_(),
178  fid_(),
179  indexIntoFileSharedPtr_(new IndexIntoFile),
180  indexIntoFile_(*indexIntoFileSharedPtr_),
181  orderedProcessHistoryIDs_(orderedProcessHistoryIDs),
182  indexIntoFileBegin_(
183  indexIntoFile_.begin(noEventSort ? IndexIntoFile::firstAppearanceOrder : IndexIntoFile::numericalOrder)),
184  indexIntoFileEnd_(indexIntoFileBegin_),
185  indexIntoFileIter_(indexIntoFileBegin_),
186  storedMergeableRunProductMetadata_((inputType == InputType::Primary) ? new StoredMergeableRunProductMetadata
187  : nullptr),
188  eventProcessHistoryIDs_(),
189  eventProcessHistoryIter_(eventProcessHistoryIDs_.begin()),
190  savedRunAuxiliary_(),
191  skipAnyEvents_(skipAnyEvents),
192  noEventSort_(noEventSort),
193  enforceGUIDInFileName_(enforceGUIDInFileName),
194  whyNotFastClonable_(0),
195  hasNewlyDroppedBranch_(),
196  branchListIndexesUnchanged_(false),
197  eventAux_(),
198  eventTree_(filePtr,
199  InEvent,
200  nStreams,
201  treeMaxVirtualSize,
202  treeCacheSize,
203  roottree::defaultLearningEntries,
204  enablePrefetching,
205  inputType),
206  lumiTree_(filePtr,
207  InLumi,
208  1,
209  treeMaxVirtualSize,
210  roottree::defaultNonEventCacheSize,
212  enablePrefetching,
213  inputType),
214  runTree_(filePtr,
215  InRun,
216  1,
217  treeMaxVirtualSize,
218  roottree::defaultNonEventCacheSize,
220  enablePrefetching,
221  inputType),
222  treePointers_(),
223  lastEventEntryNumberRead_(IndexIntoFile::invalidEntry),
224  productRegistry_(),
225  branchIDLists_(),
226  branchIDListHelper_(branchIDListHelper),
227  fileThinnedAssociationsHelper_(),
228  thinnedAssociationsHelper_(thinnedAssociationsHelper),
229  processingMode_(processingMode),
230  runHelper_(runHelper),
231  newBranchToOldBranch_(),
232  eventHistoryTree_(nullptr),
233  eventSelectionIDs_(),
234  branchListIndexes_(),
235  history_(),
236  branchChildren_(new BranchChildren),
237  duplicateChecker_(duplicateChecker),
238  provenanceAdaptor_(),
239  provenanceReaderMaker_(),
240  eventProductProvenanceRetrievers_(),
241  parentageIDLookup_(),
242  daqProvenanceHelper_(),
243  edProductClass_(TypeWithDict::byName("edm::WrapperBase").getClass()),
244  inputType_(inputType) {
245  hasNewlyDroppedBranch_.fill(false);
246 
250  treePointers_[InProcess] = nullptr;
251 
252  // Read the metadata tree.
253  // We use a smart pointer so the tree will be deleted after use, and not kept for the life of the file.
254  std::unique_ptr<TTree> metaDataTree(dynamic_cast<TTree*>(filePtr_->Get(poolNames::metaDataTreeName().c_str())));
255  if (nullptr == metaDataTree.get()) {
257  << "Could not find tree " << poolNames::metaDataTreeName() << " in the input file.\n";
258  }
259 
260  // To keep things simple, we just read in every possible branch that exists.
261  // We don't pay attention to which branches exist in which file format versions
262 
264  if (metaDataTree->FindBranch(poolNames::fileFormatVersionBranchName().c_str()) != nullptr) {
265  TBranch* fft = metaDataTree->GetBranch(poolNames::fileFormatVersionBranchName().c_str());
266  fft->SetAddress(&fftPtr);
267  roottree::getEntry(fft, 0);
268  metaDataTree->SetBranchAddress(poolNames::fileFormatVersionBranchName().c_str(), &fftPtr);
269  }
270 
271  FileID* fidPtr = &fid_;
272  if (metaDataTree->FindBranch(poolNames::fileIdentifierBranchName().c_str()) != nullptr) {
273  metaDataTree->SetBranchAddress(poolNames::fileIdentifierBranchName().c_str(), &fidPtr);
274  }
275 
276  IndexIntoFile* iifPtr = &indexIntoFile_;
277  if (metaDataTree->FindBranch(poolNames::indexIntoFileBranchName().c_str()) != nullptr) {
278  metaDataTree->SetBranchAddress(poolNames::indexIntoFileBranchName().c_str(), &iifPtr);
279  }
280 
281  StoredMergeableRunProductMetadata* smrc = nullptr;
282  if (inputType == InputType::Primary) {
284  if (metaDataTree->FindBranch(poolNames::mergeableRunProductMetadataBranchName().c_str()) != nullptr) {
285  metaDataTree->SetBranchAddress(poolNames::mergeableRunProductMetadataBranchName().c_str(), &smrc);
286  }
287  }
288 
289  // Need to read to a temporary registry so we can do a translation of the BranchKeys.
290  // This preserves backward compatibility against friendly class name algorithm changes.
291  ProductRegistry inputProdDescReg;
292  ProductRegistry* ppReg = &inputProdDescReg;
293  metaDataTree->SetBranchAddress(poolNames::productDescriptionBranchName().c_str(), (&ppReg));
294 
295  typedef std::map<ParameterSetID, ParameterSetBlob> PsetMap;
296  PsetMap psetMap;
297  PsetMap* psetMapPtr = &psetMap;
298  if (metaDataTree->FindBranch(poolNames::parameterSetMapBranchName().c_str()) != nullptr) {
299  //backward compatibility
300  assert(!fileFormatVersion().parameterSetsTree());
301  metaDataTree->SetBranchAddress(poolNames::parameterSetMapBranchName().c_str(), &psetMapPtr);
302  } else {
303  assert(fileFormatVersion().parameterSetsTree());
304  // We use a smart pointer so the tree will be deleted after use, and not kept for the life of the file.
305  std::unique_ptr<TTree> psetTree(dynamic_cast<TTree*>(filePtr_->Get(poolNames::parameterSetsTreeName().c_str())));
306  if (nullptr == psetTree.get()) {
308  << "Could not find tree " << poolNames::parameterSetsTreeName() << " in the input file.\n";
309  }
310 
311  typedef std::pair<ParameterSetID, ParameterSetBlob> IdToBlobs;
312  IdToBlobs idToBlob;
313  IdToBlobs* pIdToBlob = &idToBlob;
314  psetTree->SetBranchAddress(poolNames::idToParameterSetBlobsBranchName().c_str(), &pIdToBlob);
315 
316  std::unique_ptr<TTreeCache> psetTreeCache =
318  psetTreeCache->SetEnablePrefetching(false);
319  filePtr_->SetCacheRead(psetTreeCache.get());
320  for (Long64_t i = 0; i != psetTree->GetEntries(); ++i) {
321  psetTree->GetEntry(i);
322  psetMap.insert(idToBlob);
323  }
324  filePtr_->SetCacheRead(nullptr);
325  }
326 
327  // backward compatibility
329  ProcessHistoryRegistry::collection_type* pHistMapPtr = &pHistMap;
330  if (metaDataTree->FindBranch(poolNames::processHistoryMapBranchName().c_str()) != nullptr) {
331  metaDataTree->SetBranchAddress(poolNames::processHistoryMapBranchName().c_str(), &pHistMapPtr);
332  }
333 
335  ProcessHistoryRegistry::vector_type* pHistVectorPtr = &pHistVector;
336  if (metaDataTree->FindBranch(poolNames::processHistoryBranchName().c_str()) != nullptr) {
337  metaDataTree->SetBranchAddress(poolNames::processHistoryBranchName().c_str(), &pHistVectorPtr);
338  }
339 
340  // backward compatibility
341  ProcessConfigurationVector processConfigurations;
342  ProcessConfigurationVector* procConfigVectorPtr = &processConfigurations;
343  if (metaDataTree->FindBranch(poolNames::processConfigurationBranchName().c_str()) != nullptr) {
344  metaDataTree->SetBranchAddress(poolNames::processConfigurationBranchName().c_str(), &procConfigVectorPtr);
345  }
346 
347  auto branchIDListsAPtr = std::make_unique<BranchIDLists>();
348  BranchIDLists* branchIDListsPtr = branchIDListsAPtr.get();
349  if (metaDataTree->FindBranch(poolNames::branchIDListBranchName().c_str()) != nullptr) {
350  metaDataTree->SetBranchAddress(poolNames::branchIDListBranchName().c_str(), &branchIDListsPtr);
351  }
352 
353  if (inputType != InputType::SecondarySource) {
355  std::make_unique<ThinnedAssociationsHelper>(); // propagate_const<T> has no reset() function
356  ThinnedAssociationsHelper* thinnedAssociationsHelperPtr = fileThinnedAssociationsHelper_.get();
357  if (metaDataTree->FindBranch(poolNames::thinnedAssociationsHelperBranchName().c_str()) != nullptr) {
358  metaDataTree->SetBranchAddress(poolNames::thinnedAssociationsHelperBranchName().c_str(),
359  &thinnedAssociationsHelperPtr);
360  }
361  }
362 
363  BranchChildren* branchChildrenBuffer = branchChildren_.get();
364  if (metaDataTree->FindBranch(poolNames::productDependenciesBranchName().c_str()) != nullptr) {
365  metaDataTree->SetBranchAddress(poolNames::productDependenciesBranchName().c_str(), &branchChildrenBuffer);
366  }
367 
368  // backward compatibility
369  std::vector<EventProcessHistoryID>* eventHistoryIDsPtr = &eventProcessHistoryIDs_;
370  if (metaDataTree->FindBranch(poolNames::eventHistoryBranchName().c_str()) != nullptr) {
371  metaDataTree->SetBranchAddress(poolNames::eventHistoryBranchName().c_str(), &eventHistoryIDsPtr);
372  }
373 
374  if (metaDataTree->FindBranch(poolNames::moduleDescriptionMapBranchName().c_str()) != nullptr) {
375  if (metaDataTree->GetBranch(poolNames::moduleDescriptionMapBranchName().c_str())->GetSplitLevel() != 0) {
376  metaDataTree->SetBranchStatus((poolNames::moduleDescriptionMapBranchName() + ".*").c_str(), false);
377  } else {
378  metaDataTree->SetBranchStatus(poolNames::moduleDescriptionMapBranchName().c_str(), false);
379  }
380  }
381 
382  // Here we read the metadata tree
383  roottree::getEntry(metaDataTree.get(), 0);
384 
386 
387  // Here we read the event history tree, if we have one.
389 
391  if (!fileFormatVersion().triggerPathsTracked()) {
392  ParameterSetConverter converter(psetMap, psetIdConverter, fileFormatVersion().parameterSetsByReference());
393  } else {
394  // Merge into the parameter set registry.
395  pset::Registry& psetRegistry = *pset::Registry::instance();
396  for (auto const& psetEntry : psetMap) {
397  ParameterSet pset(psetEntry.second.pset());
398  pset.setID(psetEntry.first);
399  // For thread safety, don't update global registries when a secondary source opens a file.
400  if (inputType != InputType::SecondarySource) {
401  psetRegistry.insertMapped(pset);
402  }
403  }
404  }
405  if (!fileFormatVersion().splitProductIDs()) {
406  // Old provenance format input file. Create a provenance adaptor.
407  // propagate_const<T> has no reset() function
408  provenanceAdaptor_ = std::make_unique<ProvenanceAdaptor>(
409  inputProdDescReg, pHistMap, pHistVector, processConfigurations, psetIdConverter, true);
410  // Fill in the branchIDLists branch from the provenance adaptor
411  branchIDLists_ = provenanceAdaptor_->branchIDLists();
412  } else {
413  if (!fileFormatVersion().triggerPathsTracked()) {
414  // New provenance format, but change in ParameterSet Format. Create a provenance adaptor.
415  // propagate_const<T> has no reset() function
416  provenanceAdaptor_ = std::make_unique<ProvenanceAdaptor>(
417  inputProdDescReg, pHistMap, pHistVector, processConfigurations, psetIdConverter, false);
418  }
419  // New provenance format input file. The branchIDLists branch was read directly from the input file.
420  if (metaDataTree->FindBranch(poolNames::branchIDListBranchName().c_str()) == nullptr) {
421  throw Exception(errors::EventCorruption) << "Failed to find branchIDLists branch in metaData tree.\n";
422  }
423  branchIDLists_.reset(branchIDListsAPtr.release());
424  }
425 
427  if (metaDataTree->FindBranch(poolNames::thinnedAssociationsHelperBranchName().c_str()) == nullptr) {
429  << "Failed to find thinnedAssociationsHelper branch in metaData tree.\n";
430  }
431  }
432 
433  if (!bypassVersionCheck) {
434  checkReleaseVersion(pHistVector, file());
435  }
436 
437  if (labelRawDataLikeMC) {
438  std::string const rawData("FEDRawDataCollection");
439  std::string const source("source");
440  ProductRegistry::ProductList& pList = inputProdDescReg.productListUpdator();
441  BranchKey finder(rawData, source, "", "");
442  ProductRegistry::ProductList::iterator it = pList.lower_bound(finder);
443  if (it != pList.end() && it->first.friendlyClassName() == rawData && it->first.moduleLabel() == source) {
444  // We found raw data with a module label of source.
445  // We need to change the module label and process name.
446  // Create helper.
447  it->second.init();
448  // propagate_const<T> has no reset() function
449  daqProvenanceHelper_ = std::make_unique<DaqProvenanceHelper>(it->second.unwrappedTypeID());
450  // Create the new branch description
451  BranchDescription const& newBD = daqProvenanceHelper_->branchDescription();
452  // Save info from the old and new branch descriptions
453  daqProvenanceHelper_->saveInfo(it->second, newBD);
454  // Map the new branch name to the old branch name.
455  newBranchToOldBranch_.insert(std::make_pair(newBD.branchName(), it->second.branchName()));
456  // Remove the old branch description from the product Registry.
457  pList.erase(it);
458  // Check that there was only one.
459  it = pList.lower_bound(finder);
460  assert(!(it != pList.end() && it->first.friendlyClassName() == rawData && it->first.moduleLabel() == source));
461  // Insert the new branch description into the product registry.
462  inputProdDescReg.copyProduct(newBD);
463  // Fix up other per file metadata.
464  daqProvenanceHelper_->fixMetaData(processConfigurations, pHistVector);
465  daqProvenanceHelper_->fixMetaData(*branchIDLists_);
466  daqProvenanceHelper_->fixMetaData(*branchChildren_);
467  }
468  }
469 
470  for (auto const& history : pHistVector) {
471  processHistoryRegistry.registerProcessHistory(history);
472  }
473 
475 
476  // Update the branch id info. This has to be done before validateFile since
477  // depending on the file format, the branchIDListHelper_ may have its fixBranchListIndexes call made
478  if (inputType == InputType::Primary) {
480  }
481 
482  validateFile(inputType, usingGoToEvent);
483 
484  // Here, we make the class that will make the ProvenanceReader
485  // It reads whatever trees it needs.
486  // propagate_const<T> has no reset() function
487  provenanceReaderMaker_ = std::unique_ptr<MakeProvenanceReader>(makeProvenanceReaderMaker(inputType).release());
488 
489  // Merge into the hashed registries.
490  if (eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
492  }
493 
494  initializeDuplicateChecker(indexesIntoFiles, currentIndexIntoFile);
501 
502  // Set product presence information in the product registry.
503  ProductRegistry::ProductList& pList = inputProdDescReg.productListUpdator();
504  for (auto& product : pList) {
505  BranchDescription& prod = product.second;
506  prod.init();
507  if (prod.branchType() == InProcess) {
508  // ProcessBlock input not implemented yet
509  continue;
510  }
511  treePointers_[prod.branchType()]->setPresence(prod, newBranchToOldBranch(prod.branchName()));
512  }
513 
514  auto newReg = std::make_unique<ProductRegistry>();
515 
516  // Do the translation from the old registry to the new one
517  {
518  ProductRegistry::ProductList const& prodList = inputProdDescReg.productList();
519  for (auto const& product : prodList) {
520  BranchDescription const& prod = product.second;
521  std::string newFriendlyName = friendlyname::friendlyName(prod.className());
522  if (newFriendlyName == prod.friendlyClassName()) {
523  newReg->copyProduct(prod);
524  } else {
525  if (fileFormatVersion().splitProductIDs()) {
527  << "Cannot change friendly class name algorithm without more development work\n"
528  << "to update BranchIDLists and ThinnedAssociationsHelper. Contact the framework group.\n";
529  }
530  BranchDescription newBD(prod);
531  newBD.updateFriendlyClassName();
532  newReg->copyProduct(newBD);
533  newBranchToOldBranch_.insert(std::make_pair(newBD.branchName(), prod.branchName()));
534  }
535  }
536  dropOnInput(*newReg, productSelectorRules, dropDescendants, inputType);
537  if (inputType == InputType::SecondaryFile) {
538  thinnedAssociationsHelper->updateFromSecondaryInput(*fileThinnedAssociationsHelper_,
539  *associationsFromSecondary);
540  } else if (inputType == InputType::Primary) {
541  thinnedAssociationsHelper->updateFromPrimaryInput(*fileThinnedAssociationsHelper_);
542  }
543 
544  if (inputType == InputType::Primary) {
545  for (auto& product : newReg->productListUpdator()) {
546  setIsMergeable(product.second);
547  }
548  }
549 
550  // freeze the product registry
551  newReg->setFrozen(inputType != InputType::Primary);
552  productRegistry_.reset(newReg.release());
553  }
554 
555  // Set up information from the product registry.
556  ProductRegistry::ProductList const& prodList = productRegistry()->productList();
557 
558  {
559  std::array<size_t, NumBranchTypes> nBranches;
560  nBranches.fill(0);
561  for (auto const& product : prodList) {
562  ++nBranches[product.second.branchType()];
563  }
564 
565  int i = 0;
566  for (auto t : treePointers_) {
567  if (t == nullptr) {
568  // ProcessBlock input not implemented yet
569  continue;
570  }
571  t->numberOfBranchesToAdd(nBranches[i]);
572  ++i;
573  }
574  }
575  for (auto const& product : prodList) {
576  BranchDescription const& prod = product.second;
577  if (prod.branchType() == InProcess) {
578  // ProcessBlock input not implemented yet
579  continue;
580  }
581  treePointers_[prod.branchType()]->addBranch(prod, newBranchToOldBranch(prod.branchName()));
582  }
583 
584  // Determine if this file is fast clonable.
585  setIfFastClonable(remainingEvents, remainingLumis);
586 
587  // We are done with our initial reading of EventAuxiliary.
589 
590  // Tell the event tree to begin training at the next read.
592 
593  // Train the run and lumi trees.
594  runTree_.trainCache("*");
595  lumiTree_.trainCache("*");
596  }
597 
599 
600  void RootFile::readEntryDescriptionTree(EntryDescriptionMap& entryDescriptionMap, InputType inputType) {
601  // Called only for old format files.
602  // We use a smart pointer so the tree will be deleted after use, and not kept for the life of the file.
603  std::unique_ptr<TTree> entryDescriptionTree(
604  dynamic_cast<TTree*>(filePtr_->Get(poolNames::entryDescriptionTreeName().c_str())));
605  if (nullptr == entryDescriptionTree.get()) {
607  << "Could not find tree " << poolNames::entryDescriptionTreeName() << " in the input file.\n";
608  }
609 
610  EntryDescriptionID idBuffer;
611  EntryDescriptionID* pidBuffer = &idBuffer;
612  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionIDBranchName().c_str(), &pidBuffer);
613 
614  EventEntryDescription entryDescriptionBuffer;
615  EventEntryDescription* pEntryDescriptionBuffer = &entryDescriptionBuffer;
616  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionBranchName().c_str(), &pEntryDescriptionBuffer);
617 
618  // Fill in the parentage registry.
620 
621  for (Long64_t i = 0, numEntries = entryDescriptionTree->GetEntries(); i < numEntries; ++i) {
622  roottree::getEntry(entryDescriptionTree.get(), i);
623  if (idBuffer != entryDescriptionBuffer.id()) {
624  throw Exception(errors::EventCorruption) << "Corruption of EntryDescription tree detected.\n";
625  }
626  entryDescriptionMap.insert(std::make_pair(entryDescriptionBuffer.id(), entryDescriptionBuffer));
628  parents.setParents(entryDescriptionBuffer.parents());
629  if (daqProvenanceHelper_) {
630  ParentageID const oldID = parents.id();
631  daqProvenanceHelper_->fixMetaData(parents.parentsForUpdate());
632  ParentageID newID = parents.id();
633  if (newID != oldID) {
634  daqProvenanceHelper_->setOldParentageIDToNew(oldID, newID);
635  }
636  }
637  // For thread safety, don't update global registries when a secondary source opens a file.
638  if (inputType != InputType::SecondarySource) {
639  registry.insertMapped(parents);
640  }
641  }
642  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionIDBranchName().c_str(), nullptr);
643  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionBranchName().c_str(), nullptr);
644  }
645 
647  // New format file
648  // We use a smart pointer so the tree will be deleted after use, and not kept for the life of the file.
649  std::unique_ptr<TTree> parentageTree(dynamic_cast<TTree*>(filePtr_->Get(poolNames::parentageTreeName().c_str())));
650  if (nullptr == parentageTree.get()) {
652  << "Could not find tree " << poolNames::parentageTreeName() << " in the input file.\n";
653  }
654 
656  Parentage* pParentageBuffer = &parents;
657  parentageTree->SetBranchAddress(poolNames::parentageBranchName().c_str(), &pParentageBuffer);
658 
660 
661  parentageIDLookup_.reserve(parentageTree->GetEntries());
662  for (Long64_t i = 0, numEntries = parentageTree->GetEntries(); i < numEntries; ++i) {
663  roottree::getEntry(parentageTree.get(), i);
664  if (daqProvenanceHelper_) {
665  ParentageID const oldID = parents.id();
666  daqProvenanceHelper_->fixMetaData(parents.parentsForUpdate());
667  ParentageID newID = parents.id();
668  if (newID != oldID) {
669  daqProvenanceHelper_->setOldParentageIDToNew(oldID, newID);
670  }
671  }
672  // For thread safety, don't update global registries when a secondary source opens a file.
673  if (inputType != InputType::SecondarySource) {
674  registry.insertMapped(parents);
675  }
676  parentageIDLookup_.push_back(parents.id());
677  }
678  parentageTree->SetBranchAddress(poolNames::parentageBranchName().c_str(), nullptr);
679  }
680 
681  void RootFile::setIfFastClonable(int remainingEvents, int remainingLumis) {
682  if (fileFormatVersion().noMetaDataTrees() and !fileFormatVersion().storedProductProvenanceUsed()) {
683  //we must avoid copying the old branch which stored the per product per event provenance
685  return;
686  }
687  if (!fileFormatVersion().splitProductIDs()) {
689  return;
690  }
693  return;
694  }
695  // Find entry for first event in file
697  while (it != indexIntoFileEnd_ && it.getEntryType() != IndexIntoFile::kEvent) {
698  ++it;
699  }
700  if (it == indexIntoFileEnd_) {
702  return;
703  }
704 
705  // From here on, record all reasons we can't fast clone.
706  IndexIntoFile::SortOrder sortOrder =
710  }
711  if (skipAnyEvents_) {
713  }
714  if (remainingEvents >= 0 && eventTree_.entries() > remainingEvents) {
716  }
717  if (remainingLumis >= 0 && lumiTree_.entries() > remainingLumis) {
719  }
720  if (duplicateChecker_ && !duplicateChecker_->checkDisabled() && !duplicateChecker_->noDuplicatesInFile()) {
722  }
723  }
724 
725  std::unique_ptr<FileBlock> RootFile::createFileBlock() const {
726  return std::make_unique<FileBlock>(fileFormatVersion(),
727  eventTree_.tree(),
729  lumiTree_.tree(),
731  runTree_.tree(),
732  runTree_.metaTree(),
735  file_,
737  modifiedIDs(),
738  branchChildren());
739  }
740 
741  std::string const& RootFile::newBranchToOldBranch(std::string const& newBranch) const {
742  std::map<std::string, std::string>::const_iterator it = newBranchToOldBranch_.find(newBranch);
743  if (it != newBranchToOldBranch_.end()) {
744  return it->second;
745  }
746  return newBranch;
747  }
748 
750 
753  }
754 
755  void RootFile::initAssociationsFromSecondary(std::vector<BranchID> const& associationsFromSecondary) {
756  thinnedAssociationsHelper_->initAssociationsFromSecondary(associationsFromSecondary,
758  }
759 
762  return false;
763  }
764 
765  if (eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
766  // See first if the entire lumi or run is skipped, so we won't have to read the event Auxiliary in that case.
768  return true;
769  }
770 
771  // The Lumi is not skipped. If this is an event, see if the event is skipped.
775  return true;
776  }
777  }
778 
779  // Skip runs with no lumis if either lumisToSkip or lumisToProcess have been set to select lumis
781  // There are no lumis in this run, not even ones we will skip
783  return true;
784  }
785  // If we get here there are lumis in the run, check to see if we are skipping all of them
786  do {
788  return false;
789  }
790  } while (indexIntoFileIter_.skipLumiInRun());
791  return true;
792  }
793  }
794  return false;
795  }
796 
799  if (duplicateChecker_.get() == nullptr) {
800  return false;
801  }
803  return duplicateChecker_->isDuplicateAndCheckActive(indexIntoFileIter_.processHistoryIDIndex(),
806  eventAux_.id().event(),
807  file_);
808  }
809 
812  }
813 
816  EventNumber_t& event) {
817  // First, account for consecutive skipped entries.
818  while (skipThisEntry()) {
823  } else {
825  }
826  }
827  // OK, we have an entry that is not skipped.
829  if (entryType == IndexIntoFile::kEnd) {
830  return IndexIntoFile::kEnd;
831  }
832  if (entryType == IndexIntoFile::kRun) {
834  runHelper_->checkForNewRun(run, indexIntoFileIter_.peekAheadAtLumi());
835  return IndexIntoFile::kRun;
836  } else if (processingMode_ == InputSource::Runs) {
838  return getNextItemType(run, lumi, event);
839  }
840  if (entryType == IndexIntoFile::kLumi) {
843  return IndexIntoFile::kLumi;
846  return getNextItemType(run, lumi, event);
847  }
848  if (isDuplicateEvent()) {
850  return getNextItemType(run, lumi, event);
851  }
855  event = eventAux_.event();
856  return IndexIntoFile::kEvent;
857  }
858 
861  itr.advanceToEvent();
862  return itr.getEntryType() == IndexIntoFile::kEnd;
863  }
864 
867  int phIndex;
870  IndexIntoFile::EntryNumber_t eventEntry;
871  itr.skipEventBackward(phIndex, run, lumi, eventEntry);
872  itr.skipEventBackward(phIndex, run, lumi, eventEntry);
873  return eventEntry == IndexIntoFile::invalidEntry;
874  }
875 
876  namespace {
877  struct RunItem {
878  RunItem(ProcessHistoryID const& phid, RunNumber_t const& run) : phid_(phid), run_(run) {}
879  ProcessHistoryID phid_;
880  RunNumber_t run_;
881  };
882  struct RunItemSortByRun {
883  bool operator()(RunItem const& a, RunItem const& b) const { return a.run_ < b.run_; }
884  };
885  struct RunItemSortByRunPhid {
886  bool operator()(RunItem const& a, RunItem const& b) const {
887  return a.run_ < b.run_ || (!(b.run_ < a.run_) && a.phid_ < b.phid_);
888  }
889  };
890  struct LumiItem {
891  LumiItem(ProcessHistoryID const& phid,
892  RunNumber_t const& run,
895  : phid_(phid),
896  run_(run),
897  lumi_(lumi),
898  firstEventEntry_(entry),
899  lastEventEntry_(entry == IndexIntoFile::invalidEntry ? IndexIntoFile::invalidEntry : entry + 1) {}
900  ProcessHistoryID phid_;
901  RunNumber_t run_;
903  IndexIntoFile::EntryNumber_t firstEventEntry_;
904  IndexIntoFile::EntryNumber_t lastEventEntry_;
905  };
906  struct LumiItemSortByRunLumi {
907  bool operator()(LumiItem const& a, LumiItem const& b) const {
908  return a.run_ < b.run_ || (!(b.run_ < a.run_) && a.lumi_ < b.lumi_);
909  }
910  };
911  struct LumiItemSortByRunLumiPhid {
912  bool operator()(LumiItem const& a, LumiItem const& b) const {
913  if (a.run_ < b.run_)
914  return true;
915  if (b.run_ < a.run_)
916  return false;
917  if (a.lumi_ < b.lumi_)
918  return true;
919  if (b.lumi_ < a.lumi_)
920  return false;
921  return a.phid_ < b.phid_;
922  }
923  };
924  } // namespace
925 
927  // This function is for backward compatibility.
928  // If reading a current format file, indexIntoFile_ is read from the input
929  // file and should always be there. Note that the algorithm below will work
930  // sometimes but often fail with the new format introduced in release 3_8_0.
931  // If it ever becomes necessary to rebuild IndexIntoFile from the new format,
932  // probably a separate function should be written to deal with the task.
933  // This is possible just not implemented yet.
934  assert(!fileFormatVersion().hasIndexIntoFile());
935 
936  typedef std::list<LumiItem> LumiList;
937  LumiList lumis; // (declare 1)
938 
939  typedef std::set<LuminosityBlockID> RunLumiSet;
940  RunLumiSet runLumiSet; // (declare 2)
941 
942  typedef std::list<RunItem> RunList;
943  RunList runs; // (declare 5)
944 
945  typedef std::set<RunNumber_t> RunSet;
946  RunSet runSet; // (declare 4)
947 
948  typedef std::set<RunItem, RunItemSortByRunPhid> RunItemSet;
949  RunItemSet runItemSet; // (declare 3)
950 
951  typedef std::map<RunNumber_t, ProcessHistoryID> PHIDMap;
952  PHIDMap phidMap;
953 
954  RunNumber_t prevRun = 0;
955  LuminosityBlockNumber_t prevLumi = 0;
956  ProcessHistoryID prevPhid;
957  bool iFirst = true;
958 
959  indexIntoFile_.unsortedEventNumbers().clear(); // should already be empty, just being careful
961 
962  // First, loop through the event tree.
963  while (eventTree_.next()) {
964  bool newRun = false;
965  bool newLumi = false;
968 
969  // Save the event numbers as we loop through the event auxiliary to avoid
970  // having to read through the event auxiliary again later. These event numbers
971  // are not actually used in this function, but could be needed elsewhere.
973 
974  ProcessHistoryID reducedPHID = processHistoryRegistry_->reducedProcessHistoryID(eventAux().processHistoryID());
975 
976  if (iFirst || prevPhid != reducedPHID || prevRun != eventAux().run()) {
977  iFirst = false;
978  newRun = newLumi = true;
979  } else if (prevLumi != eventAux().luminosityBlock()) {
980  newLumi = true;
981  }
982  prevPhid = reducedPHID;
983  prevRun = eventAux().run();
984  prevLumi = eventAux().luminosityBlock();
985  if (newLumi) {
986  lumis.emplace_back(
987  reducedPHID, eventAux().run(), eventAux().luminosityBlock(), eventTree_.entryNumber()); // (insert 1)
988  runLumiSet.insert(LuminosityBlockID(eventAux().run(), eventAux().luminosityBlock())); // (insert 2)
989  } else {
990  LumiItem& currentLumi = lumis.back();
991  assert(currentLumi.lastEventEntry_ == eventTree_.entryNumber());
992  ++currentLumi.lastEventEntry_;
993  }
994  if (newRun) {
995  // Insert run in list if it is not already there.
996  RunItem item(reducedPHID, eventAux().run());
997  if (runItemSet.insert(item).second) { // (check 3, insert 3)
998  runs.push_back(std::move(item)); // (insert 5)
999  runSet.insert(eventAux().run()); // (insert 4)
1000  phidMap.insert(std::make_pair(eventAux().run(), reducedPHID));
1001  }
1002  }
1003  }
1004  // now clean up.
1008 
1009  // Loop over run entries and fill information.
1010 
1011  typedef std::map<RunNumber_t, IndexIntoFile::EntryNumber_t> RunMap;
1012  RunMap runMap; // (declare 11)
1013 
1014  typedef std::vector<RunItem> RunVector;
1015  RunVector emptyRuns; // (declare 12)
1016 
1017  if (runTree_.isValid()) {
1018  while (runTree_.next()) {
1019  // Note: adjacent duplicates will be skipped without an explicit check.
1020 
1021  std::shared_ptr<RunAuxiliary> runAux = fillRunAuxiliary();
1022  ProcessHistoryID reducedPHID = processHistoryRegistry_->reducedProcessHistoryID(runAux->processHistoryID());
1023 
1024  if (runSet.insert(runAux->run()).second) { // (check 4, insert 4)
1025  // This run was not associated with any events.
1026  emptyRuns.emplace_back(reducedPHID, runAux->run()); // (insert 12)
1027  }
1028  runMap.insert(std::make_pair(runAux->run(), runTree_.entryNumber())); // (insert 11)
1029  phidMap.insert(std::make_pair(runAux->run(), reducedPHID));
1030  }
1031  // now clean up.
1033  }
1034 
1035  // Insert the ordered empty runs into the run list.
1036  RunItemSortByRun runItemSortByRun;
1037  stable_sort_all(emptyRuns, runItemSortByRun);
1038 
1039  RunList::iterator itRuns = runs.begin(), endRuns = runs.end();
1040  for (auto const& emptyRun : emptyRuns) {
1041  for (; itRuns != endRuns; ++itRuns) {
1042  if (runItemSortByRun(emptyRun, *itRuns)) {
1043  break;
1044  }
1045  }
1046  runs.insert(itRuns, emptyRun);
1047  }
1048 
1049  // Loop over luminosity block entries and fill information.
1050 
1051  typedef std::vector<LumiItem> LumiVector;
1052  LumiVector emptyLumis; // (declare 7)
1053 
1054  typedef std::map<LuminosityBlockID, IndexIntoFile::EntryNumber_t> RunLumiMap;
1055  RunLumiMap runLumiMap; // (declare 6)
1056 
1057  if (lumiTree_.isValid()) {
1058  while (lumiTree_.next()) {
1059  // Note: adjacent duplicates will be skipped without an explicit check.
1060  std::shared_ptr<LuminosityBlockAuxiliary> lumiAux = fillLumiAuxiliary();
1061  LuminosityBlockID lumiID = LuminosityBlockID(lumiAux->run(), lumiAux->luminosityBlock());
1062  if (runLumiSet.insert(lumiID).second) { // (check 2, insert 2)
1063  // This lumi was not associated with any events.
1064  // Use the process history ID from the corresponding run. In cases of practical
1065  // importance, this should be the correct process history ID, but it is possible
1066  // to construct files where this is not the correct process history ID ...
1067  PHIDMap::const_iterator iPhidMap = phidMap.find(lumiAux->run());
1068  assert(iPhidMap != phidMap.end());
1069  emptyLumis.emplace_back(
1070  iPhidMap->second, lumiAux->run(), lumiAux->luminosityBlock(), IndexIntoFile::invalidEntry); // (insert 7)
1071  }
1072  runLumiMap.insert(std::make_pair(lumiID, lumiTree_.entryNumber()));
1073  }
1074  // now clean up.
1076  }
1077 
1078  // Insert the ordered empty lumis into the lumi list.
1079  LumiItemSortByRunLumi lumiItemSortByRunLumi;
1080  stable_sort_all(emptyLumis, lumiItemSortByRunLumi);
1081 
1082  LumiList::iterator itLumis = lumis.begin(), endLumis = lumis.end();
1083  for (auto const& emptyLumi : emptyLumis) {
1084  for (; itLumis != endLumis; ++itLumis) {
1085  if (lumiItemSortByRunLumi(emptyLumi, *itLumis)) {
1086  break;
1087  }
1088  }
1089  lumis.insert(itLumis, emptyLumi);
1090  }
1091 
1092  // Create a map of RunItems that gives the order of first appearance in the list.
1093  // Also fill in the vector of process history IDs
1094  typedef std::map<RunItem, int, RunItemSortByRunPhid> RunCountMap;
1095  RunCountMap runCountMap; // Declare (17)
1096  std::vector<ProcessHistoryID>& phids = indexIntoFile_.setProcessHistoryIDs();
1097  assert(phids.empty());
1098  std::vector<IndexIntoFile::RunOrLumiEntry>& entries = indexIntoFile_.setRunOrLumiEntries();
1099  assert(entries.empty());
1100  int rcount = 0;
1101  for (auto& run : runs) {
1102  RunCountMap::const_iterator countMapItem = runCountMap.find(run);
1103  if (countMapItem == runCountMap.end()) {
1104  countMapItem = runCountMap.insert(std::make_pair(run, rcount)).first; // Insert (17)
1105  assert(countMapItem != runCountMap.end());
1106  ++rcount;
1107  }
1108  std::vector<ProcessHistoryID>::const_iterator phidItem = find_in_all(phids, run.phid_);
1109  if (phidItem == phids.end()) {
1110  phids.push_back(run.phid_);
1111  phidItem = phids.end() - 1;
1112  }
1113  entries.emplace_back(countMapItem->second, // use (17)
1115  runMap[run.run_], // use (11)
1116  phidItem - phids.begin(),
1117  run.run_,
1118  0U,
1121  }
1122 
1123  // Create a map of LumiItems that gives the order of first appearance in the list.
1124  typedef std::map<LumiItem, int, LumiItemSortByRunLumiPhid> LumiCountMap;
1125  LumiCountMap lumiCountMap; // Declare (19)
1126  int lcount = 0;
1127  for (auto& lumi : lumis) {
1128  RunCountMap::const_iterator runCountMapItem = runCountMap.find(RunItem(lumi.phid_, lumi.run_));
1129  assert(runCountMapItem != runCountMap.end());
1130  LumiCountMap::const_iterator countMapItem = lumiCountMap.find(lumi);
1131  if (countMapItem == lumiCountMap.end()) {
1132  countMapItem = lumiCountMap.insert(std::make_pair(lumi, lcount)).first; // Insert (17)
1133  assert(countMapItem != lumiCountMap.end());
1134  ++lcount;
1135  }
1136  std::vector<ProcessHistoryID>::const_iterator phidItem = find_in_all(phids, lumi.phid_);
1137  assert(phidItem != phids.end());
1138  entries.emplace_back(runCountMapItem->second,
1139  countMapItem->second,
1140  runLumiMap[LuminosityBlockID(lumi.run_, lumi.lumi_)],
1141  phidItem - phids.begin(),
1142  lumi.run_,
1143  lumi.lumi_,
1144  lumi.firstEventEntry_,
1145  lumi.lastEventEntry_);
1146  }
1147  stable_sort_all(entries);
1148  }
1149 
1150  void RootFile::validateFile(InputType inputType, bool usingGoToEvent) {
1151  if (!fid_.isValid()) {
1153  }
1154  if (!eventTree_.isValid()) {
1155  throw Exception(errors::EventCorruption) << "'Events' tree is corrupted or not present\n"
1156  << "in the input file.\n";
1157  }
1158  if (enforceGUIDInFileName_) {
1159  auto guidFromName = stemFromPath(file_);
1160  if (guidFromName != fid_.fid()) {
1162  << "GUID " << guidFromName << " extracted from file name " << file_
1163  << " is inconsistent with the GUID read from the file " << fid_.fid();
1164  }
1165  }
1166 
1167  if (fileFormatVersion().hasIndexIntoFile()) {
1168  if (runTree().entries() > 0) {
1170  }
1172  if (daqProvenanceHelper_) {
1173  std::vector<ProcessHistoryID>& phidVec = indexIntoFile_.setProcessHistoryIDs();
1174  for (auto& phid : phidVec) {
1175  phid = daqProvenanceHelper_->mapProcessHistoryID(phid);
1176  }
1177  }
1179  }
1180  } else {
1183  }
1184 
1188  std::shared_ptr<IndexIntoFile::EventFinder>(std::make_shared<RootFileEventFinder>(eventTree_)));
1189  // We fill the event numbers explicitly if we need to find events in closed files,
1190  // such as for secondary files (or secondary sources) or if duplicate checking across files.
1191  bool needEventNumbers = false;
1192  bool needIndexesForDuplicateChecker =
1193  duplicateChecker_ && duplicateChecker_->checkingAllFiles() && !duplicateChecker_->checkDisabled();
1194  if (inputType != InputType::Primary || needIndexesForDuplicateChecker || usingGoToEvent) {
1195  needEventNumbers = true;
1196  }
1197  bool needEventEntries = false;
1198  if (inputType != InputType::Primary || !noEventSort_) {
1199  // We need event entries for sorting or for secondary files or sources.
1200  needEventEntries = true;
1201  }
1202  indexIntoFile_.fillEventNumbersOrEntries(needEventNumbers, needEventEntries);
1203  }
1204 
1205  void RootFile::reportOpened(std::string const& inputType) {
1206  // Report file opened.
1207  std::string const label = "source";
1208  std::string moduleName = "PoolSource";
1209  filePtr_->inputFileOpened(logicalFile_, inputType, moduleName, label, fid_.fid(), eventTree_.branchNames());
1210  }
1211 
1213  // Just to play it safe, zero all pointers to objects in the InputFile to be closed.
1214  eventHistoryTree_ = nullptr;
1215  for (auto& treePointer : treePointers_) {
1216  if (treePointer == nullptr) {
1217  // ProcessBlock input not implemented yet
1218  continue;
1219  }
1220  treePointer->close();
1221  treePointer = nullptr;
1222  }
1223  filePtr_->Close();
1224  filePtr_ = nullptr; // propagate_const<T> has no reset() function
1225  }
1226 
1229  // Already read.
1230  return;
1231  }
1232  if (fileFormatVersion().newAuxiliary()) {
1233  EventAuxiliary* pEvAux = &eventAux_;
1235  } else {
1236  // for backward compatibility.
1238  EventAux* pEvAux = &eventAux;
1239  eventTree_.fillAux<EventAux>(pEvAux);
1241  }
1243  }
1244 
1246  if (!eventTree_.current(entry)) {
1247  return false;
1248  }
1251  return true;
1252  }
1253 
1255  // We could consider doing delayed reading, but because we have to
1256  // store this History object in a different tree than the event
1257  // data tree, this is too hard to do in this first version.
1258 
1259  if (fileFormatVersion().eventHistoryBranch()) {
1260  // Lumi block number was not in EventID for the relevant releases.
1261  EventID id(eventAux().id().run(), 0, eventAux().id().event());
1262  if (eventProcessHistoryIter_->eventID() != id) {
1265  assert(eventProcessHistoryIter_->eventID() == id);
1266  }
1269  } else if (fileFormatVersion().eventHistoryTree()) {
1270  // for backward compatibility.
1271  History* pHistory = history_.get();
1272  TBranch* eventHistoryBranch = eventHistoryTree_->GetBranch(poolNames::eventHistoryBranchName().c_str());
1273  if (!eventHistoryBranch) {
1274  throw Exception(errors::EventCorruption) << "Failed to find history branch in event history tree.\n";
1275  }
1276  eventHistoryBranch->SetAddress(&pHistory);
1278  eventAux_.setProcessHistoryID(history_->processHistoryID());
1279  eventSelectionIDs_.swap(history_->eventSelectionIDs());
1280  branchListIndexes_.swap(history_->branchListIndexes());
1281  } else if (fileFormatVersion().noMetaDataTrees()) {
1282  // Current format
1284  TBranch* eventSelectionIDBranch = eventTree_.tree()->GetBranch(poolNames::eventSelectionsBranchName().c_str());
1285  assert(eventSelectionIDBranch != nullptr);
1286  eventTree_.fillBranchEntry(eventSelectionIDBranch, pESV);
1288  TBranch* branchListIndexesBranch = eventTree_.tree()->GetBranch(poolNames::branchListIndexesBranchName().c_str());
1289  assert(branchListIndexesBranch != nullptr);
1290  eventTree_.fillBranchEntry(branchListIndexesBranch, pBLI);
1291  }
1292  if (provenanceAdaptor_) {
1293  eventAux_.setProcessHistoryID(provenanceAdaptor_->convertID(eventAux().processHistoryID()));
1294  for (auto& esID : eventSelectionIDs_) {
1295  esID = provenanceAdaptor_->convertID(esID);
1296  }
1297  }
1298  if (daqProvenanceHelper_) {
1300  }
1302  // old format. branchListIndexes_ must be filled in from the ProvenanceAdaptor.
1303  provenanceAdaptor_->branchListIndexes(branchListIndexes_);
1304  }
1305  if (branchIDListHelper_) {
1306  branchIDListHelper_->fixBranchListIndexes(branchListIndexes_);
1307  }
1308  }
1309 
1310  std::shared_ptr<LuminosityBlockAuxiliary> RootFile::fillLumiAuxiliary() {
1311  auto lumiAuxiliary = std::make_shared<LuminosityBlockAuxiliary>();
1312  if (fileFormatVersion().newAuxiliary()) {
1313  LuminosityBlockAuxiliary* pLumiAux = lumiAuxiliary.get();
1315  } else {
1316  LuminosityBlockAux lumiAux;
1317  LuminosityBlockAux* pLumiAux = &lumiAux;
1319  conversion(lumiAux, *lumiAuxiliary);
1320  }
1321  if (provenanceAdaptor_) {
1322  lumiAuxiliary->setProcessHistoryID(provenanceAdaptor_->convertID(lumiAuxiliary->processHistoryID()));
1323  }
1324  if (daqProvenanceHelper_) {
1325  lumiAuxiliary->setProcessHistoryID(daqProvenanceHelper_->mapProcessHistoryID(lumiAuxiliary->processHistoryID()));
1326  }
1327  if (lumiAuxiliary->luminosityBlock() == 0 && !fileFormatVersion().runsAndLumis()) {
1328  lumiAuxiliary->id() = LuminosityBlockID(RunNumber_t(1), LuminosityBlockNumber_t(1));
1329  }
1330  return lumiAuxiliary;
1331  }
1332 
1333  std::shared_ptr<RunAuxiliary> RootFile::fillRunAuxiliary() {
1334  auto runAuxiliary = std::make_shared<RunAuxiliary>();
1335  if (fileFormatVersion().newAuxiliary()) {
1336  RunAuxiliary* pRunAux = runAuxiliary.get();
1337  runTree_.fillAux<RunAuxiliary>(pRunAux);
1338  } else {
1339  RunAux runAux;
1340  RunAux* pRunAux = &runAux;
1341  runTree_.fillAux<RunAux>(pRunAux);
1342  conversion(runAux, *runAuxiliary);
1343  }
1344  if (provenanceAdaptor_) {
1345  runAuxiliary->setProcessHistoryID(provenanceAdaptor_->convertID(runAuxiliary->processHistoryID()));
1346  }
1347  if (daqProvenanceHelper_) {
1348  runAuxiliary->setProcessHistoryID(daqProvenanceHelper_->mapProcessHistoryID(runAuxiliary->processHistoryID()));
1349  }
1350  return runAuxiliary;
1351  }
1352 
1354  while (offset > 0 && indexIntoFileIter_ != indexIntoFileEnd_) {
1355  int phIndexOfSkippedEvent = IndexIntoFile::invalidIndex;
1356  RunNumber_t runOfSkippedEvent = IndexIntoFile::invalidRun;
1359 
1361  phIndexOfSkippedEvent, runOfSkippedEvent, lumiOfSkippedEvent, skippedEventEntry);
1362 
1363  // At the end of the file and there were no more events to skip
1364  if (skippedEventEntry == IndexIntoFile::invalidEntry)
1365  break;
1366 
1367  if (eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
1368  fillEventAuxiliary(skippedEventEntry);
1369  if (eventSkipperByID_->skipIt(runOfSkippedEvent, lumiOfSkippedEvent, eventAux_.id().event())) {
1370  continue;
1371  }
1372  }
1373  if (duplicateChecker_ && !duplicateChecker_->checkDisabled() && !duplicateChecker_->noDuplicatesInFile()) {
1374  fillEventAuxiliary(skippedEventEntry);
1375  if (duplicateChecker_->isDuplicateAndCheckActive(
1376  phIndexOfSkippedEvent, runOfSkippedEvent, lumiOfSkippedEvent, eventAux_.id().event(), file_)) {
1377  continue;
1378  }
1379  }
1380  --offset;
1381  }
1382 
1383  while (offset < 0) {
1384  if (duplicateChecker_) {
1385  duplicateChecker_->disable();
1386  }
1387 
1388  int phIndexOfEvent = IndexIntoFile::invalidIndex;
1392 
1393  indexIntoFileIter_.skipEventBackward(phIndexOfEvent, runOfEvent, lumiOfEvent, eventEntry);
1394 
1395  if (eventEntry == IndexIntoFile::invalidEntry)
1396  break;
1397 
1398  if (eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
1399  fillEventAuxiliary(eventEntry);
1400  if (eventSkipperByID_->skipIt(runOfEvent, lumiOfEvent, eventAux_.id().event())) {
1401  continue;
1402  }
1403  }
1404  ++offset;
1405  }
1407  }
1408 
1409  bool RootFile::goToEvent(EventID const& eventID) {
1411 
1412  if (duplicateChecker_) {
1413  duplicateChecker_->disable();
1414  }
1415 
1417  if (noEventSort_)
1419 
1422 
1423  if (iter == indexIntoFile_.end(sortOrder)) {
1424  return false;
1425  }
1426  indexIntoFileIter_ = iter;
1427  return true;
1428  }
1429 
1430  // readEvent() is responsible for creating, and setting up, the
1431  // EventPrincipal.
1432  //
1433  // 1. create an EventPrincipal with a unique EventID
1434  // 2. For each entry in the provenance, put in one ProductResolver,
1435  // holding the Provenance for the corresponding EDProduct.
1436  // 3. set up the the EventPrincipal to know about this ProductResolver.
1437  //
1438  // We do *not* create the EDProduct instance (the equivalent of reading
1439  // the branch containing this EDProduct. That will be done by the Delayed Reader,
1440  // when it is asked to do so.
1441  //
1445  // read the event auxiliary if not alrady read.
1447 
1448  // read the event
1449  readCurrentEvent(principal);
1450 
1451  runHelper_->checkRunConsistency(eventAux().run(), indexIntoFileIter_.run());
1452  runHelper_->checkLumiConsistency(eventAux().luminosityBlock(), indexIntoFileIter_.lumi());
1453 
1454  // If this next assert shows up in performance profiling or significantly affects memory, then these three lines should be deleted.
1455  // The IndexIntoFile should guarantee that it never fails.
1457  ? *daqProvenanceHelper_->oldProcessHistoryID()
1458  : eventAux().processHistoryID());
1459  ProcessHistoryID const& reducedPHID = processHistoryRegistry_->reducedProcessHistoryID(idToCheck);
1461 
1463  }
1464 
1465  // Reads event at the current entry in the event tree
1467  if (!eventTree_.current()) {
1468  return false;
1469  }
1471  if (!fileFormatVersion().lumiInEventID()) {
1472  //ugly, but will disappear when the backward compatibility is done with schema evolution.
1473  const_cast<EventID&>(eventAux_.id()).setLuminosityBlockNumber(eventAux_.oldLuminosityBlock());
1475  }
1476  fillEventHistory();
1477  runHelper_->overrideRunNumber(eventAux_.id(), eventAux().isRealData());
1478 
1479  // We're not done ... so prepare the EventPrincipal
1481  auto history = processHistoryRegistry_->getMapped(eventAux().processHistoryID());
1482  principal.fillEventPrincipal(eventAux(),
1483  history,
1486  *(makeProductProvenanceRetriever(principal.streamID().value())),
1488 
1489  // report event read from file
1490  filePtr_->eventReadFromFile();
1491  return true;
1492  }
1493 
1495 
1496  std::shared_ptr<RunAuxiliary> RootFile::readRunAuxiliary_() {
1497  if (runHelper_->fakeNewRun()) {
1498  auto runAuxiliary = std::make_shared<RunAuxiliary>(*savedRunAuxiliary());
1499  runHelper_->overrideRunNumber(runAuxiliary->id());
1500  return runAuxiliary;
1501  }
1504 
1505  // Begin code for backward compatibility before the existence of run trees.
1506  if (!runTree_.isValid()) {
1507  // prior to the support of run trees.
1508  // RunAuxiliary did not contain a valid timestamp. Take it from the next event.
1510  assert(eventEntry != IndexIntoFile::invalidEntry);
1511  assert(eventTree_.current(eventEntry));
1512  fillEventAuxiliary(eventEntry);
1513 
1515  runHelper_->overrideRunNumber(run);
1516  savedRunAuxiliary_ = std::make_shared<RunAuxiliary>(run.run(), eventAux().time(), Timestamp::invalidTimestamp());
1517  return savedRunAuxiliary();
1518  }
1519  // End code for backward compatibility before the existence of run trees.
1521  std::shared_ptr<RunAuxiliary> runAuxiliary = fillRunAuxiliary();
1522  assert(runAuxiliary->run() == indexIntoFileIter_.run());
1523  runHelper_->overrideRunNumber(runAuxiliary->id());
1524  filePtr_->reportInputRunNumber(runAuxiliary->run());
1525  // If RunAuxiliary did not contain a valid begin timestamp, invalidate any end timestamp.
1526  if (runAuxiliary->beginTime() == Timestamp::invalidTimestamp()) {
1527  runAuxiliary->setEndTime(Timestamp::invalidTimestamp());
1528  }
1529 
1530  // If RunAuxiliary did not contain a valid timestamp, or if this an old format file from
1531  // when the Run's ProcessHistory included only processes where products were added to the Run itself,
1532  // we attempt to read the first event in the run to get appropriate info.
1533  if (runAuxiliary->beginTime() == Timestamp::invalidTimestamp() ||
1536  // If we have a valid event, use its information.
1537  if (eventEntry != IndexIntoFile::invalidEntry) {
1538  assert(eventTree_.current(eventEntry));
1539  fillEventAuxiliary(eventEntry);
1540 
1541  // RunAuxiliary did not contain a valid timestamp. Take it from the next event in this run if there is one.
1542  if (runAuxiliary->beginTime() == Timestamp::invalidTimestamp()) {
1543  runAuxiliary->setBeginTime(eventAux().time());
1544  }
1545 
1546  // For backwards compatibility when the Run's ProcessHistory included only processes where products were added to the
1547  // Run, and then the Run and Event auxiliaries could be different. Use the event ProcessHistoryID if there is one. It should
1548  // almost always be correct by the current definition (processes included if any products are added. This makes the run, lumi,
1549  // and event ProcessHistory's always be the same if no file merging occurs).
1550  if (!fileFormatVersion().processHistorySameWithinRun()) {
1551  fillEventHistory();
1552  runAuxiliary->setProcessHistoryID(eventAux().processHistoryID());
1553  }
1554  }
1555  }
1556  savedRunAuxiliary_ = runAuxiliary;
1557  return runAuxiliary;
1558  }
1559 
1560  void RootFile::readRun_(RunPrincipal& runPrincipal) {
1561  MergeableRunProductMetadata* mergeableRunProductMetadata = nullptr;
1562  if (inputType_ == InputType::Primary) {
1563  mergeableRunProductMetadata = runPrincipal.mergeableRunProductMetadata();
1564  RootTree::EntryNumber const& entryNumber = runTree_.entryNumber();
1565  assert(entryNumber >= 0);
1566  mergeableRunProductMetadata->readRun(
1568  }
1569 
1570  if (!runHelper_->fakeNewRun()) {
1574  }
1575  // Begin code for backward compatibility before the existence of run trees.
1576  if (!runTree_.isValid()) {
1577  return;
1578  }
1579  // End code for backward compatibility before the existence of run trees.
1580  // NOTE: we use 0 for the index since do not do delayed reads for RunPrincipals
1583  // Read in all the products now.
1584  runPrincipal.readAllFromSourceAndMergeImmediately(mergeableRunProductMetadata);
1585  }
1586 
1587  std::shared_ptr<LuminosityBlockAuxiliary> RootFile::readLuminosityBlockAuxiliary_() {
1590  // Begin code for backward compatibility before the existence of lumi trees.
1591  if (!lumiTree_.isValid()) {
1593  assert(eventEntry != IndexIntoFile::invalidEntry);
1594  assert(eventTree_.current(eventEntry));
1595  fillEventAuxiliary(eventEntry);
1596 
1598  runHelper_->overrideRunNumber(lumi);
1599  return std::make_shared<LuminosityBlockAuxiliary>(
1600  lumi.run(), lumi.luminosityBlock(), eventAux().time(), Timestamp::invalidTimestamp());
1601  }
1602  // End code for backward compatibility before the existence of lumi trees.
1604  std::shared_ptr<LuminosityBlockAuxiliary> lumiAuxiliary = fillLumiAuxiliary();
1605  assert(lumiAuxiliary->run() == indexIntoFileIter_.run());
1606  assert(lumiAuxiliary->luminosityBlock() == indexIntoFileIter_.lumi());
1607  runHelper_->overrideRunNumber(lumiAuxiliary->id());
1608  filePtr_->reportInputLumiSection(lumiAuxiliary->run(), lumiAuxiliary->luminosityBlock());
1609  if (lumiAuxiliary->beginTime() == Timestamp::invalidTimestamp()) {
1611  if (eventEntry != IndexIntoFile::invalidEntry) {
1612  assert(eventTree_.current(eventEntry));
1613  fillEventAuxiliary(eventEntry);
1614 
1615  lumiAuxiliary->setBeginTime(eventAux().time());
1616  }
1617  lumiAuxiliary->setEndTime(Timestamp::invalidTimestamp());
1618  }
1619  if (!fileFormatVersion().processHistorySameWithinRun() && savedRunAuxiliary_) {
1620  lumiAuxiliary->setProcessHistoryID(savedRunAuxiliary_->processHistoryID());
1621  }
1622  return lumiAuxiliary;
1623  }
1624 
1628  // Begin code for backward compatibility before the existence of lumi trees.
1629  if (!lumiTree_.isValid()) {
1631  return;
1632  }
1633  // End code for backward compatibility before the existence of lumi trees.
1635  // NOTE: we use 0 for the index since do not do delayed reads for LuminosityBlockPrincipals
1637  auto history = processHistoryRegistry_->getMapped(lumiPrincipal.aux().processHistoryID());
1639  // Read in all the products now.
1640  lumiPrincipal.readAllFromSourceAndMergeImmediately();
1642  }
1643 
1647  return false;
1649  return true;
1650  }
1651 
1655  return false;
1657  return true;
1658  }
1659 
1663  return false;
1665  return true;
1666  }
1667 
1671  }
1674  return false;
1675  if (run != indexIntoFileIter_.run())
1676  return false;
1677  if (lumi != indexIntoFileIter_.lumi())
1678  return false;
1680  return true;
1681  }
1682 
1684  // Read in the event history tree, if we have one...
1685  if (fileFormatVersion().eventHistoryTree()) {
1686  history_ = std::make_unique<History>(); // propagate_const<T> has no reset() function
1687  eventHistoryTree_ = dynamic_cast<TTree*>(filePtr_->Get(poolNames::eventHistoryTreeName().c_str()));
1688  if (!eventHistoryTree_) {
1689  throw Exception(errors::EventCorruption) << "Failed to find the event history tree.\n";
1690  }
1691  }
1692  }
1693 
1695  std::vector<std::shared_ptr<IndexIntoFile>> const& indexesIntoFiles,
1696  std::vector<std::shared_ptr<IndexIntoFile>>::size_type currentIndexIntoFile) {
1697  if (duplicateChecker_ && !duplicateChecker_->checkDisabled()) {
1698  if (eventTree_.next()) {
1700  duplicateChecker_->inputFileOpened(
1701  eventAux().isRealData(), indexIntoFile_, indexesIntoFiles, currentIndexIntoFile);
1702  }
1704  }
1705  }
1706 
1707  void RootFile::markBranchToBeDropped(bool dropDescendants,
1708  BranchDescription const& branch,
1709  std::set<BranchID>& branchesToDrop,
1710  std::map<BranchID, BranchID> const& droppedToKeptAlias) const {
1711  if (dropDescendants) {
1712  branchChildren_->appendToDescendants(branch, branchesToDrop, droppedToKeptAlias);
1713  } else {
1714  branchesToDrop.insert(branch.branchID());
1715  }
1716  }
1717 
1719  ProductSelectorRules const& rules,
1720  bool dropDescendants,
1721  InputType inputType) {
1722  // This is the selector for drop on input.
1723  ProductSelector productSelector;
1724  productSelector.initialize(rules, reg.allBranchDescriptions());
1725 
1726  std::vector<BranchDescription const*> associationDescriptions;
1727 
1729  // Do drop on input. On the first pass, just fill in a set of branches to be dropped.
1730  std::set<BranchID> branchesToDrop;
1731  std::map<BranchID, BranchID> droppedToKeptAlias;
1732  for (auto const& product : prodList) {
1733  BranchDescription const& prod = product.second;
1734  if (prod.branchID() != prod.originalBranchID() && prod.present()) {
1735  droppedToKeptAlias[prod.originalBranchID()] = prod.branchID();
1736  }
1737  }
1738  for (auto const& product : prodList) {
1739  BranchDescription const& prod = product.second;
1740  // Special handling for ThinnedAssociations
1741  if (prod.unwrappedType() == typeid(ThinnedAssociation) && prod.present()) {
1742  if (inputType != InputType::SecondarySource) {
1743  associationDescriptions.push_back(&prod);
1744  } else {
1745  markBranchToBeDropped(dropDescendants, prod, branchesToDrop, droppedToKeptAlias);
1746  }
1747  } else if (!productSelector.selected(prod)) {
1748  markBranchToBeDropped(dropDescendants, prod, branchesToDrop, droppedToKeptAlias);
1749  }
1750  }
1751 
1752  if (inputType != InputType::SecondarySource) {
1753  // Decide whether to keep the thinned associations and corresponding
1754  // entries in the helper. For secondary source they are all dropped,
1755  // but in other cases we look for thinned collections the associations
1756  // redirect a Ref or Ptr to when dereferencing them.
1757 
1758  // Need a list of kept products in order to determine which thinned associations
1759  // are kept.
1760  std::set<BranchID> keptProductsInEvent;
1761  for (auto const& product : prodList) {
1762  BranchDescription const& prod = product.second;
1763  if (branchesToDrop.find(prod.branchID()) == branchesToDrop.end() && prod.present() &&
1764  prod.branchType() == InEvent) {
1765  keptProductsInEvent.insert(prod.branchID());
1766  }
1767  }
1768 
1769  // Decide which ThinnedAssociations to keep and store the decision in keepAssociation
1770  std::map<BranchID, bool> keepAssociation;
1771  fileThinnedAssociationsHelper_->selectAssociationProducts(
1772  associationDescriptions, keptProductsInEvent, keepAssociation);
1773 
1774  for (auto association : associationDescriptions) {
1775  if (!keepAssociation[association->branchID()]) {
1776  markBranchToBeDropped(dropDescendants, *association, branchesToDrop, droppedToKeptAlias);
1777  }
1778  }
1779 
1780  // Also delete the dropped associations from the ThinnedAssociationsHelper
1781  auto temp = std::make_unique<ThinnedAssociationsHelper>();
1782  for (auto const& associationBranches : fileThinnedAssociationsHelper_->data()) {
1783  auto iter = keepAssociation.find(associationBranches.association());
1784  if (iter != keepAssociation.end() && iter->second) {
1785  temp->addAssociation(associationBranches);
1786  }
1787  }
1788  // propagate_const<T> has no reset() function
1789  fileThinnedAssociationsHelper_ = std::unique_ptr<ThinnedAssociationsHelper>(temp.release());
1790  }
1791 
1792  // On this pass, actually drop the branches.
1793  std::set<BranchID>::const_iterator branchesToDropEnd = branchesToDrop.end();
1794  for (ProductRegistry::ProductList::iterator it = prodList.begin(), itEnd = prodList.end(); it != itEnd;) {
1795  BranchDescription const& prod = it->second;
1796  bool drop = branchesToDrop.find(prod.branchID()) != branchesToDropEnd;
1797  if (drop) {
1798  if (!prod.dropped()) {
1799  if (productSelector.selected(prod) && prod.unwrappedType() != typeid(ThinnedAssociation)) {
1800  LogWarning("RootFile") << "Branch '" << prod.branchName() << "' is being dropped from the input\n"
1801  << "of file '" << file_ << "' because it is dependent on a branch\n"
1802  << "that was explicitly dropped.\n";
1803  }
1804  // ProcessBlock input is not implemented yet
1805  if (prod.branchType() != InProcess) {
1806  treePointers_[prod.branchType()]->dropBranch(newBranchToOldBranch(prod.branchName()));
1807  }
1808  hasNewlyDroppedBranch_[prod.branchType()] = true;
1809  }
1810  ProductRegistry::ProductList::iterator icopy = it;
1811  ++it;
1812  prodList.erase(icopy);
1813  } else {
1814  ++it;
1815  }
1816  }
1817 
1818  // Drop on input mergeable run and lumi products, this needs to be invoked for secondary file input
1819  if (inputType == InputType::SecondaryFile) {
1820  TString tString;
1821  for (ProductRegistry::ProductList::iterator it = prodList.begin(), itEnd = prodList.end(); it != itEnd;) {
1822  BranchDescription const& prod = it->second;
1823  if (prod.branchType() != InEvent && prod.branchType() != InProcess) {
1824  TClass* cp = prod.wrappedType().getClass();
1825  void* p = cp->New();
1826  int offset = cp->GetBaseClassOffset(edProductClass_);
1827  std::unique_ptr<WrapperBase> edp = getWrapperBasePtr(p, offset);
1828  if (edp->isMergeable()) {
1829  treePointers_[prod.branchType()]->dropBranch(newBranchToOldBranch(prod.branchName()));
1830  ProductRegistry::ProductList::iterator icopy = it;
1831  ++it;
1832  prodList.erase(icopy);
1833  } else {
1834  ++it;
1835  }
1836  } else
1837  ++it;
1838  }
1839  }
1840  }
1841 
1843  signalslot::Signal<void(StreamContext const&, ModuleCallingContext const&)> const* preEventReadSource,
1844  signalslot::Signal<void(StreamContext const&, ModuleCallingContext const&)> const* postEventReadSource) {
1845  eventTree_.setSignals(preEventReadSource, postEventReadSource);
1846  }
1847 
1848  std::unique_ptr<MakeProvenanceReader> RootFile::makeProvenanceReaderMaker(InputType inputType) {
1850  readParentageTree(inputType);
1851  return std::make_unique<MakeReducedProvenanceReader>(parentageIDLookup_);
1852  } else if (fileFormatVersion_.splitProductIDs()) {
1853  readParentageTree(inputType);
1854  return std::make_unique<MakeFullProvenanceReader>();
1855  } else if (fileFormatVersion_.perEventProductIDs()) {
1856  auto entryDescriptionMap = std::make_unique<EntryDescriptionMap>();
1857  readEntryDescriptionTree(*entryDescriptionMap, inputType);
1858  return std::make_unique<MakeOldProvenanceReader>(std::move(entryDescriptionMap));
1859  } else {
1860  return std::make_unique<MakeDummyProvenanceReader>();
1861  }
1862  }
1863 
1864  std::shared_ptr<ProductProvenanceRetriever> RootFile::makeProductProvenanceRetriever(unsigned int iStreamID) {
1865  if (eventProductProvenanceRetrievers_.size() <= iStreamID) {
1866  eventProductProvenanceRetrievers_.resize(iStreamID + 1);
1867  }
1868  if (!eventProductProvenanceRetrievers_[iStreamID]) {
1869  // propagate_const<T> has no reset() function
1870  eventProductProvenanceRetrievers_[iStreamID] = std::make_shared<ProductProvenanceRetriever>(
1872  }
1873  eventProductProvenanceRetrievers_[iStreamID]->reset();
1874  return eventProductProvenanceRetriever(iStreamID);
1875  }
1876 
1878  public:
1879  ReducedProvenanceReader(RootTree* iRootTree,
1880  std::vector<ParentageID> const& iParentageIDLookup,
1881  DaqProvenanceHelper const* daqProvenanceHelper);
1882 
1883  std::set<ProductProvenance> readProvenance(unsigned int) const override;
1884 
1885  private:
1887  ModuleCallingContext const* moduleCallingContext,
1888  unsigned int transitionIndex,
1889  std::atomic<const std::set<ProductProvenance>*>& writeTo) const override;
1890 
1895  std::vector<ParentageID> const& parentageIDLookup_;
1897  std::shared_ptr<std::recursive_mutex> mutex_;
1899  };
1900 
1902  std::vector<ParentageID> const& iParentageIDLookup,
1903  DaqProvenanceHelper const* daqProvenanceHelper)
1905  rootTree_(iRootTree),
1906  pProvVector_(&provVector_),
1907  parentageIDLookup_(iParentageIDLookup),
1908  daqProvenanceHelper_(daqProvenanceHelper),
1909  mutex_(SharedResourcesRegistry::instance()->createAcquirerForSourceDelayedReader().second),
1910  acquirer_(SharedResourcesRegistry::instance()->createAcquirerForSourceDelayedReader().first) {
1911  provBranch_ =
1912  rootTree_->tree()->GetBranch(BranchTypeToProductProvenanceBranchName(rootTree_->branchType()).c_str());
1913  }
1914 
1915  namespace {
1916  using SignalType = signalslot::Signal<void(StreamContext const&, ModuleCallingContext const&)>;
1917  template <typename R>
1918  void readProvenanceAsyncImpl(R const* iThis,
1920  WaitingTask* task,
1921  unsigned int transitionIndex,
1922  std::atomic<const std::set<ProductProvenance>*>& writeTo,
1923  ModuleCallingContext const* iContext,
1924  SignalType const* pre,
1925  SignalType const* post) {
1926  if (nullptr == writeTo.load()) {
1927  //need to be sure the task isn't run until after the read
1928  WaitingTaskHolder taskHolder{task};
1929  auto pWriteTo = &writeTo;
1930 
1931  auto serviceToken = ServiceRegistry::instance().presentToken();
1932 
1933  chain.push([holder = std::move(taskHolder),
1934  pWriteTo,
1935  iThis,
1936  transitionIndex,
1937  iContext,
1938  pre,
1939  post,
1940  serviceToken]() mutable {
1941  if (nullptr == pWriteTo->load()) {
1942  ServiceRegistry::Operate operate(serviceToken);
1943  std::unique_ptr<const std::set<ProductProvenance>> prov;
1944  try {
1945  if (pre) {
1946  pre->emit(*(iContext->getStreamContext()), *iContext);
1947  }
1948  prov = std::make_unique<const std::set<ProductProvenance>>(iThis->readProvenance(transitionIndex));
1949  if (post) {
1950  post->emit(*(iContext->getStreamContext()), *iContext);
1951  }
1952 
1953  } catch (...) {
1954  if (post) {
1955  post->emit(*(iContext->getStreamContext()), *iContext);
1956  }
1957 
1958  holder.doneWaiting(std::current_exception());
1959  return;
1960  }
1961  const std::set<ProductProvenance>* expected = nullptr;
1962 
1963  if (pWriteTo->compare_exchange_strong(expected, prov.get())) {
1964  prov.release();
1965  }
1966  }
1967  holder.doneWaiting(std::exception_ptr());
1968  });
1969  }
1970  }
1971  } // namespace
1972 
1974  ModuleCallingContext const* moduleCallingContext,
1975  unsigned int transitionIndex,
1976  std::atomic<const std::set<ProductProvenance>*>& writeTo) const {
1977  readProvenanceAsyncImpl(this,
1979  task,
1980  transitionIndex,
1981  writeTo,
1982  moduleCallingContext,
1983  rootTree_->rootDelayedReader()->preEventReadFromSourceSignal(),
1984  rootTree_->rootDelayedReader()->postEventReadFromSourceSignal());
1985  }
1986 
1987  std::set<ProductProvenance> ReducedProvenanceReader::readProvenance(unsigned int transitionIndex) const {
1988  {
1989  std::lock_guard<std::recursive_mutex> guard(*mutex_);
1990  ReducedProvenanceReader* me = const_cast<ReducedProvenanceReader*>(this);
1991  me->rootTree_->fillBranchEntry(
1992  me->provBranch_, me->rootTree_->entryNumberForIndex(transitionIndex), me->pProvVector_);
1993  }
1994  std::set<ProductProvenance> retValue;
1995  if (daqProvenanceHelper_) {
1996  for (auto const& prov : provVector_) {
1997  BranchID bid(prov.branchID_);
1998  retValue.emplace(daqProvenanceHelper_->mapBranchID(BranchID(prov.branchID_)),
1999  daqProvenanceHelper_->mapParentageID(parentageIDLookup_[prov.parentageIDIndex_]));
2000  }
2001  } else {
2002  for (auto const& prov : provVector_) {
2003  if (prov.parentageIDIndex_ >= parentageIDLookup_.size()) {
2005  << "ReducedProvenanceReader::ReadProvenance\n"
2006  << "The parentage ID index value " << prov.parentageIDIndex_
2007  << " is out of bounds. The maximum value is " << parentageIDLookup_.size() - 1 << ".\n"
2008  << "This should never happen.\n"
2009  << "Please report this to the framework hypernews forum 'hn-cms-edmFramework@cern.ch'.\n";
2010  }
2011  retValue.emplace(BranchID(prov.branchID_), parentageIDLookup_[prov.parentageIDIndex_]);
2012  }
2013  }
2014  return retValue;
2015  }
2016 
2018  public:
2019  explicit FullProvenanceReader(RootTree* rootTree, DaqProvenanceHelper const* daqProvenanceHelper);
2021  std::set<ProductProvenance> readProvenance(unsigned int transitionIndex) const override;
2022 
2023  private:
2025  ModuleCallingContext const* moduleCallingContext,
2026  unsigned int transitionIndex,
2027  std::atomic<const std::set<ProductProvenance>*>& writeTo) const override;
2028 
2031  //All access to a ROOT file is serialized
2034  std::shared_ptr<std::recursive_mutex> mutex_;
2036  };
2037 
2040  rootTree_(rootTree),
2041  infoVector_(),
2042  pInfoVector_(&infoVector_),
2043  daqProvenanceHelper_(daqProvenanceHelper),
2044  mutex_(SharedResourcesRegistry::instance()->createAcquirerForSourceDelayedReader().second),
2045  acquirer_(SharedResourcesRegistry::instance()->createAcquirerForSourceDelayedReader().first) {}
2046 
2048  ModuleCallingContext const* moduleCallingContext,
2049  unsigned int transitionIndex,
2050  std::atomic<const std::set<ProductProvenance>*>& writeTo) const {
2051  readProvenanceAsyncImpl(this,
2053  task,
2054  transitionIndex,
2055  writeTo,
2056  moduleCallingContext,
2059  }
2060 
2061  std::set<ProductProvenance> FullProvenanceReader::readProvenance(unsigned int transitionIndex) const {
2062  {
2063  std::lock_guard<std::recursive_mutex> guard(*mutex_);
2066  }
2067  std::set<ProductProvenance> retValue;
2068  if (daqProvenanceHelper_) {
2069  for (auto const& info : infoVector_) {
2070  retValue.emplace(daqProvenanceHelper_->mapBranchID(info.branchID()),
2071  daqProvenanceHelper_->mapParentageID(info.parentageID()));
2072  }
2073  } else {
2074  for (auto const& info : infoVector_) {
2075  retValue.emplace(info);
2076  }
2077  }
2078  return retValue;
2079  }
2080 
2082  public:
2083  explicit OldProvenanceReader(RootTree* rootTree,
2084  EntryDescriptionMap const& theMap,
2085  DaqProvenanceHelper const* daqProvenanceHelper);
2086  ~OldProvenanceReader() override {}
2087  std::set<ProductProvenance> readProvenance(unsigned int transitionIndex) const override;
2088 
2089  private:
2091  ModuleCallingContext const* moduleCallingContext,
2092  unsigned int transitionIndex,
2093  std::atomic<const std::set<ProductProvenance>*>& writeTo) const override;
2094 
2096  std::vector<EventEntryInfo> infoVector_;
2097  //All access to ROOT file are serialized
2098  CMS_SA_ALLOW mutable std::vector<EventEntryInfo>* pInfoVector_;
2101  std::shared_ptr<std::recursive_mutex> mutex_;
2103  };
2104 
2106  EntryDescriptionMap const& theMap,
2107  DaqProvenanceHelper const* daqProvenanceHelper)
2109  rootTree_(rootTree),
2110  infoVector_(),
2111  pInfoVector_(&infoVector_),
2112  entryDescriptionMap_(theMap),
2113  daqProvenanceHelper_(daqProvenanceHelper),
2114  mutex_(SharedResourcesRegistry::instance()->createAcquirerForSourceDelayedReader().second),
2115  acquirer_(SharedResourcesRegistry::instance()->createAcquirerForSourceDelayedReader().first) {}
2116 
2118  ModuleCallingContext const* moduleCallingContext,
2119  unsigned int transitionIndex,
2120  std::atomic<const std::set<ProductProvenance>*>& writeTo) const {
2121  readProvenanceAsyncImpl(this,
2123  task,
2124  transitionIndex,
2125  writeTo,
2126  moduleCallingContext,
2127  rootTree_->rootDelayedReader()->preEventReadFromSourceSignal(),
2128  rootTree_->rootDelayedReader()->postEventReadFromSourceSignal());
2129  }
2130 
2131  std::set<ProductProvenance> OldProvenanceReader::readProvenance(unsigned int transitionIndex) const {
2132  {
2133  std::lock_guard<std::recursive_mutex> guard(*mutex_);
2134  rootTree_->branchEntryInfoBranch()->SetAddress(&pInfoVector_);
2135  roottree::getEntry(rootTree_->branchEntryInfoBranch(), rootTree_->entryNumberForIndex(transitionIndex));
2136  }
2137  std::set<ProductProvenance> retValue;
2138  for (auto const& info : infoVector_) {
2139  EntryDescriptionMap::const_iterator iter = entryDescriptionMap_.find(info.entryDescriptionID());
2140  assert(iter != entryDescriptionMap_.end());
2141  Parentage parentage(iter->second.parents());
2142  if (daqProvenanceHelper_) {
2143  retValue.emplace(daqProvenanceHelper_->mapBranchID(info.branchID()),
2144  daqProvenanceHelper_->mapParentageID(parentage.id()));
2145  } else {
2146  retValue.emplace(info.branchID(), parentage.id());
2147  }
2148  }
2149  return retValue;
2150  }
2151 
2153  public:
2156 
2157  private:
2158  std::set<ProductProvenance> readProvenance(unsigned int) const override;
2160  ModuleCallingContext const* moduleCallingContext,
2161  unsigned int transitionIndex,
2162  std::atomic<const std::set<ProductProvenance>*>& writeTo) const override;
2163  };
2164 
2166 
2167  std::set<ProductProvenance> DummyProvenanceReader::readProvenance(unsigned int) const {
2168  // Not providing parentage!!!
2169  return std::set<ProductProvenance>{};
2170  }
2172  ModuleCallingContext const* moduleCallingContext,
2173  unsigned int transitionIndex,
2174  std::atomic<const std::set<ProductProvenance>*>& writeTo) const {
2175  if (nullptr == writeTo.load()) {
2176  auto emptyProv = std::make_unique<const std::set<ProductProvenance>>();
2177  const std::set<ProductProvenance>* expected = nullptr;
2178  if (writeTo.compare_exchange_strong(expected, emptyProv.get())) {
2179  emptyProv.release();
2180  }
2181  }
2182  }
2183 
2184  std::unique_ptr<ProvenanceReaderBase> MakeDummyProvenanceReader::makeReader(RootTree&,
2185  DaqProvenanceHelper const*) const {
2186  return std::make_unique<DummyProvenanceReader>();
2187  }
2188 
2189  std::unique_ptr<ProvenanceReaderBase> MakeOldProvenanceReader::makeReader(
2190  RootTree& rootTree, DaqProvenanceHelper const* daqProvenanceHelper) const {
2191  return std::make_unique<OldProvenanceReader>(&rootTree, *entryDescriptionMap_, daqProvenanceHelper);
2192  }
2193 
2194  std::unique_ptr<ProvenanceReaderBase> MakeFullProvenanceReader::makeReader(
2195  RootTree& rootTree, DaqProvenanceHelper const* daqProvenanceHelper) const {
2196  return std::make_unique<FullProvenanceReader>(&rootTree, daqProvenanceHelper);
2197  }
2198 
2199  std::unique_ptr<ProvenanceReaderBase> MakeReducedProvenanceReader::makeReader(
2200  RootTree& rootTree, DaqProvenanceHelper const* daqProvenanceHelper) const {
2201  return std::make_unique<ReducedProvenanceReader>(&rootTree, parentageIDLookup_, daqProvenanceHelper);
2202  }
2203 } // namespace edm
edm::poolNames::idToParameterSetBlobsBranchName
std::string const & idToParameterSetBlobsBranchName()
Definition: BranchType.cc:206
edm::SharedResourcesAcquirer::serialQueueChain
SerialTaskQueueChain & serialQueueChain() const
Definition: SharedResourcesAcquirer.h:54
edm::IndexIntoFile::IndexIntoFileItr::copyPosition
void copyPosition(IndexIntoFileItr const &position)
Copy the position without modifying the pointer to the IndexIntoFile or size.
Definition: IndexIntoFile.cc:1760
edm::pset::Registry::instance
static Registry * instance()
Definition: Registry.cc:12
edm::FullProvenanceReader::pInfoVector_
ProductProvenanceVector * pInfoVector_
Definition: RootFile.cc:2032
edm::IndexIntoFile::doneFileInitialization
void doneFileInitialization()
Clears the temporary vector of event numbers to reduce memory usage.
Definition: IndexIntoFile.cc:306
edm::RootTree::tree
TTree const * tree() const
Definition: RootTree.h:182
edm::FileFormatVersion::hasThinnedAssociations
bool hasThinnedAssociations() const
Definition: FileFormatVersion.cc:45
ParameterSetConverter.h
edm::RootFileEventFinder::~RootFileEventFinder
~RootFileEventFinder() override
Definition: RootFile.cc:124
edm::SharedResourcesAcquirer
Definition: SharedResourcesAcquirer.h:34
RunAux.h
edm::IndexIntoFile::IndexIntoFileItr::run
RunNumber_t run() const
Definition: IndexIntoFile.h:702
ThinnedAssociationsHelper.h
edm::RunNumber_t
unsigned int RunNumber_t
Definition: RunLumiEventNumber.h:14
edm::source
static const std::string source("source")
edm::EventAuxiliary::event
EventNumber_t event() const
Definition: EventAuxiliary.h:72
edm::IndexIntoFile::kLumi
Definition: IndexIntoFile.h:238
ProcessHistoryID.h
FriendlyName.h
edm::IndexIntoFile::IndexIntoFileItr::firstEventEntryThisLumi
EntryNumber_t firstEventEntryThisLumi()
Definition: IndexIntoFile.h:720
edm::RootFile::eventSkipperByID_
edm::propagate_const< std::shared_ptr< EventSkipperByID > > eventSkipperByID_
Definition: RootFile.h:318
edm::poolNames::branchIDListBranchName
std::string const & branchIDListBranchName()
Definition: BranchType.cc:176
edm::RootFileEventFinder
Definition: RootFile.cc:121
edm::RootTree::trainCache
void trainCache(char const *branchNames)
Definition: RootTree.cc:461
ModuleCallingContext.h
edm::OldProvenanceReader::readProvenanceAsync
void readProvenanceAsync(WaitingTask *task, ModuleCallingContext const *moduleCallingContext, unsigned int transitionIndex, std::atomic< const std::set< ProductProvenance > * > &writeTo) const override
Definition: RootFile.cc:2117
edm::FileID::isValid
bool isValid() const
Definition: FileID.h:18
RunHelper.h
edm::ProcessHistoryRegistry::registerProcessHistory
bool registerProcessHistory(ProcessHistory const &processHistory)
Definition: ProcessHistoryRegistry.cc:11
benchmark-oval_cfg.noEventSort
noEventSort
Definition: benchmark-oval_cfg.py:19
edm::EventEntryDescription
Definition: EventEntryDescription.h:28
mps_fire.i
i
Definition: mps_fire.py:428
edm::IndexIntoFile::IndexIntoFileItr::lumi
LuminosityBlockNumber_t lumi() const
Definition: IndexIntoFile.h:703
edm::RootTree::setEntryNumber
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:202
edm::RootFile::eventProductProvenanceRetrievers_
std::vector< edm::propagate_const< std::shared_ptr< ProductProvenanceRetriever > > > eventProductProvenanceRetrievers_
Definition: RootFile.h:359
edm::FileFormatVersion::useReducedProcessHistoryID
bool useReducedProcessHistoryID() const
Definition: FileFormatVersion.cc:43
edm::RootTree::rootDelayedReader
DelayedReader * rootDelayedReader() const
Definition: RootTree.cc:128
edm::RootFile::eventProcessHistoryIter_
std::vector< EventProcessHistoryID >::const_iterator eventProcessHistoryIter_
Definition: RootFile.h:329
edm::RootFile::makeProductProvenanceRetriever
std::shared_ptr< ProductProvenanceRetriever > makeProductProvenanceRetriever(unsigned int iStreamIndex)
Definition: RootFile.cc:1864
edm::RootTree::EntryNumber
roottree::EntryNumber EntryNumber
Definition: RootTree.h:106
DuplicateChecker.h
edm::poolNames::fileFormatVersionBranchName
std::string const & fileFormatVersionBranchName()
Definition: BranchType.cc:182
edm::FileFormatVersion::splitProductIDs
bool splitProductIDs() const
Definition: FileFormatVersion.cc:21
ServiceRegistry.h
edm::ReducedProvenanceReader::provBranch_
edm::propagate_const< TBranch * > provBranch_
Definition: RootFile.cc:1892
MessageLogger.h
edm::find_in_all
ForwardSequence::const_iterator find_in_all(ForwardSequence const &s, Datum const &d)
wrappers for std::find
Definition: Algorithms.h:26
funct::false
false
Definition: Factorize.h:29
edm::conversion
void conversion(EventAux const &from, EventAuxiliary &to)
Definition: EventAux.cc:9
edm::roottree::trainCache
std::unique_ptr< TTreeCache > trainCache(TTree *tree, InputFile &file, unsigned int cacheSize, char const *branchNames)
Definition: RootTree.cc:516
edm::getWrapperBasePtr
std::unique_ptr< WrapperBase > getWrapperBasePtr(void *p, int offset)
Definition: getWrapperBasePtr.h:8
edm::roottree::defaultNonEventLearningEntries
unsigned const int defaultNonEventLearningEntries
Definition: RootTree.h:50
edm::IndexIntoFile::iterationWillBeInEntryOrder
bool iterationWillBeInEntryOrder(SortOrder sortOrder) const
Used to determine whether or not to disable fast cloning.
Definition: IndexIntoFile.cc:474
edm::RootFile::productRegistry
std::shared_ptr< ProductRegistry const > productRegistry() const
Definition: RootFile.h:215
edm::DaqProvenanceHelper::mapParentageID
ParentageID const & mapParentageID(ParentageID const &phid) const
Definition: DaqProvenanceHelper.cc:182
edm::ReducedProvenanceReader::provVector_
StoredProductProvenanceVector provVector_
Definition: RootFile.cc:1893
edm::RootFile::lumiTree_
RootTree lumiTree_
Definition: RootFile.h:339
edm::RunID
Definition: RunID.h:28
edm::RootFile::processHistoryRegistry_
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:316
edm::RootFile::indexIntoFileEnd_
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:325
edm::RootFile::daqProvenanceHelper_
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:361
edm::IndexIntoFile::findRunPosition
IndexIntoFileItr findRunPosition(RunNumber_t run) const
Same as findPosition.
Definition: IndexIntoFile.cc:692
edm::RootFile::runHelper_
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:349
LumiList
Definition: LumiList.py:1
edm::RootFile::readParentageTree
void readParentageTree(InputType inputType)
Definition: RootFile.cc:646
getWrapperBasePtr.h
edm::OldProvenanceReader::infoVector_
std::vector< EventEntryInfo > infoVector_
Definition: RootFile.cc:2096
edm::setIsMergeable
void setIsMergeable(BranchDescription &)
Definition: setIsMergeable.cc:15
edm::FullProvenanceReader::daqProvenanceHelper_
DaqProvenanceHelper const * daqProvenanceHelper_
Definition: RootFile.cc:2033
HLT_FULL_cff.finder
finder
Definition: HLT_FULL_cff.py:51987
RunList
Definition: RunList.h:16
edm::RootFile::eventHistoryTree_
edm::propagate_const< TTree * > eventHistoryTree_
Definition: RootFile.h:351
edm::RootFile::reportOpened
void reportOpened(std::string const &inputType)
Definition: RootFile.cc:1205
edm::RootFile::readLuminosityBlock_
void readLuminosityBlock_(LuminosityBlockPrincipal &lumiPrincipal)
Definition: RootFile.cc:1625
edm::errors::LogicError
Definition: EDMException.h:37
edm::FileID::fid
std::string const & fid() const
Definition: FileID.h:19
BranchIDListHelper.h
edm::RootFile::branchListIndexesUnchanged
bool branchListIndexesUnchanged() const
Definition: RootFile.h:227
edm::IndexIntoFile::kEvent
Definition: IndexIntoFile.h:238
converter
Definition: CandidateProducer.h:25
WaitingTaskHolder.h
edm::ProvenanceReaderBase
Definition: ProductProvenanceRetriever.h:45
edm::RootFile::close
void close()
Definition: RootFile.cc:1212
edm::IndexIntoFile::setNumberOfEvents
void setNumberOfEvents(EntryNumber_t nevents)
Definition: IndexIntoFile.h:945
edm::IndexIntoFile::IndexIntoFileItr::peekAheadAtLumi
LuminosityBlockNumber_t peekAheadAtLumi() const
Definition: IndexIntoFile.h:708
edm::IndexIntoFile::numericalOrder
Definition: IndexIntoFile.h:266
MicroEventContent_cff.branch
branch
Definition: MicroEventContent_cff.py:178
edm::RootFile::runTree
RootTree const & runTree() const
Definition: RootFile.h:223
edm
HLT enums.
Definition: AlignableModifier.h:19
edm::FullProvenanceReader::acquirer_
SharedResourcesAcquirer acquirer_
Definition: RootFile.cc:2035
edm::Principal::readAllFromSourceAndMergeImmediately
void readAllFromSourceAndMergeImmediately(MergeableRunProductMetadata const *mergeableRunProductMetadata=nullptr)
Definition: Principal.cc:943
mps_splice.entry
entry
Definition: mps_splice.py:68
edm::RootFileEventFinder::RootFileEventFinder
RootFileEventFinder(RootTree &eventTree)
Definition: RootFile.cc:123
AlCaHLTBitMon_ParallelJobs.p
p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
ParameterSetBlob.h
edm::RootFile::indexIntoFileIter_
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:326
edm::MakeDummyProvenanceReader
Definition: RootFile.cc:72
edm::ProductSelector::initialize
void initialize(ProductSelectorRules const &rules, std::vector< BranchDescription const * > const &branchDescriptions)
Definition: ProductSelector.cc:20
edm::errors::EventCorruption
Definition: EDMException.h:43
edm::ParentageRegistry::instance
static ParentageRegistry * instance()
Definition: ParentageRegistry.cc:4
edm::RootFile::readRunAuxiliary_
std::shared_ptr< RunAuxiliary > readRunAuxiliary_()
Definition: RootFile.cc:1496
edm::IndexIntoFile::invalidEntry
static constexpr EntryNumber_t invalidEntry
Definition: IndexIntoFile.h:236
hgcal::association
std::tuple< layerClusterToCaloParticle, caloParticleToLayerCluster > association
Definition: LayerClusterAssociatorByEnergyScoreImpl.h:44
edm::RootFile::readCurrentEvent
bool readCurrentEvent(EventPrincipal &cache)
Definition: RootFile.cc:1466
l1tstage2_dqm_sourceclient-live_cfg.rawData
rawData
Definition: l1tstage2_dqm_sourceclient-live_cfg.py:162
edm::IndexIntoFile::processHistoryID
ProcessHistoryID const & processHistoryID(int i) const
Definition: IndexIntoFile.cc:55
edm::poolNames::parameterSetsTreeName
std::string const & parameterSetsTreeName()
Definition: BranchType.cc:204
edm::DaqProvenanceHelper
Definition: DaqProvenanceHelper.h:27
edm::EventAuxiliary::oldLuminosityBlock
LuminosityBlockNumber_t oldLuminosityBlock() const
Definition: EventAuxiliary.h:70
edm::FileBlock::NotProcessingEvents
Definition: FileBlock.h:29
writedatasetfile.runs
runs
Definition: writedatasetfile.py:27
edm::RootFile::eventAux_
EventAuxiliary eventAux_
Definition: RootFile.h:337
StoredMergeableRunProductMetadata.h
edm::IndexIntoFile::unsortedEventNumbers
std::vector< EventNumber_t > & unsortedEventNumbers()
Definition: IndexIntoFile.h:994
edm::LuminosityBlockPrincipal
Definition: LuminosityBlockPrincipal.h:31
edm::BranchListIndexes
std::vector< BranchListIndex > BranchListIndexes
Definition: BranchListIndex.h:18
edm::ThinnedAssociation
Definition: ThinnedAssociation.h:15
edm::IndexIntoFile
Definition: IndexIntoFile.h:225
Algorithms.h
cms::cuda::assert
assert(be >=bs)
edm::FileBlock::RunOrLumiNotContiguous
Definition: FileBlock.h:36
edm::RootFile::branchIDListHelper_
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
Definition: RootFile.h:345
edm::second
U second(std::pair< T, U > const &p)
Definition: ParameterSet.cc:222
edm::poolNames::indexIntoFileBranchName
std::string const & indexIntoFileBranchName()
Definition: BranchType.cc:191
edm::InputType::SecondaryFile
edm::RootFile::eventTree_
RootTree eventTree_
Definition: RootFile.h:338
edm::ProductSelector::selected
bool selected(BranchDescription const &desc) const
Definition: ProductSelector.cc:55
info
static const TGPicture * info(bool iBackgroundIsBlack)
Definition: FWCollectionSummaryWidget.cc:153
edm::RootFileEventFinder::eventTree_
RootTree & eventTree_
Definition: RootFile.cc:137
edm::DelayedReader::preEventReadFromSourceSignal
virtual signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const * preEventReadFromSourceSignal() const =0
DelayedReader.h
edm::ParameterSetConverter
Definition: ParameterSetConverter.h:40
edm::stemFromPath
std::string_view stemFromPath(std::string_view path)
Definition: stemFromPath.cc:4
ProcessHistoryRegistry.h
edm::RootFile::readEntryDescriptionTree
void readEntryDescriptionTree(EntryDescriptionMap &entryDescriptionMap, InputType inputType)
Definition: RootFile.cc:600
edm::StreamID::value
unsigned int value() const
Definition: StreamID.h:43
edm::DummyProvenanceReader::readProvenanceAsync
void readProvenanceAsync(WaitingTask *task, ModuleCallingContext const *moduleCallingContext, unsigned int transitionIndex, std::atomic< const std::set< ProductProvenance > * > &writeTo) const override
Definition: RootFile.cc:2171
ProductRegistry.h
edm::RootFile::eventID
EventID const & eventID() const
Definition: RootFile.h:220
MillePedeFileConverter_cfg.fileName
fileName
Definition: MillePedeFileConverter_cfg.py:32
edm::RootFile::isDuplicateEvent
bool isDuplicateEvent()
Definition: RootFile.cc:797
edm::RootFile::enforceGUIDInFileName_
bool enforceGUIDInFileName_
Definition: RootFile.h:333
edm::FullProvenanceReader::FullProvenanceReader
FullProvenanceReader(RootTree *rootTree, DaqProvenanceHelper const *daqProvenanceHelper)
Definition: RootFile.cc:2038
edm::FileBlock::EventsToBeSorted
Definition: FileBlock.h:35
edm::RootFile::skipThisEntry
bool skipThisEntry()
Definition: RootFile.cc:760
edm::IndexIntoFile::findPosition
IndexIntoFileItr findPosition(RunNumber_t run, LuminosityBlockNumber_t lumi=0U, EventNumber_t event=0U) const
Definition: IndexIntoFile.cc:489
edm::EventID::luminosityBlock
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:39
edm::FileID
Definition: FileID.h:14
edm::RootFile::fileFormatVersion
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:224
edm::FileFormatVersion::perEventProductIDs
bool perEventProductIDs() const
Definition: FileFormatVersion.cc:19
groupFilesInBlocks.temp
list temp
Definition: groupFilesInBlocks.py:142
edm::LuminosityBlockNumber_t
unsigned int LuminosityBlockNumber_t
Definition: RunLumiEventNumber.h:13
edm::RootFile::eventProcessHistoryIDs_
std::vector< EventProcessHistoryID > eventProcessHistoryIDs_
Definition: RootFile.h:328
edm::poolNames::branchListIndexesBranchName
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:202
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
edm::InRun
Definition: BranchType.h:11
CMS_SA_ALLOW
#define CMS_SA_ALLOW
Definition: thread_safety_macros.h:5
edm::IndexIntoFileItrHolder
Definition: IndexIntoFile.h:1109
edm::DummyProvenanceReader::DummyProvenanceReader
DummyProvenanceReader()
Definition: RootFile.cc:2165
edm::IndexIntoFile::empty
bool empty() const
True if no runs, lumis, or events are in the file.
Definition: IndexIntoFile.cc:487
edm::InputType
InputType
Definition: InputType.h:5
edm::BranchTypeToAuxiliaryBranchName
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:109
edm::EntryDescriptionMap
std::map< EntryDescriptionID, EventEntryDescription > EntryDescriptionMap
Definition: RootFile.h:52
runTheMatrix.nStreams
nStreams
Definition: runTheMatrix.py:356
EventSkipperByID.h
edm::RootFile::setEntryAtLumi
bool setEntryAtLumi(RunNumber_t run, LuminosityBlockNumber_t lumi)
Definition: RootFile.cc:1652
edm::RootFile::dropOnInput
void dropOnInput(ProductRegistry &reg, ProductSelectorRules const &rules, bool dropDescendants, InputType inputType)
Definition: RootFile.cc:1718
edm::LuminosityBlockPrincipal::aux
LuminosityBlockAuxiliary const & aux() const
Definition: LuminosityBlockPrincipal.h:64
edm::RootFile::file
std::string const & file() const
Definition: RootFile.h:214
edm::ProductRegistry
Definition: ProductRegistry.h:37
edm::MakeOldProvenanceReader::entryDescriptionMap_
edm::propagate_const< std::unique_ptr< EntryDescriptionMap > > entryDescriptionMap_
Definition: RootFile.cc:85
edm::first
T first(std::pair< T, U > const &p)
Definition: ParameterSet.cc:217
edm::ReducedProvenanceReader::readProvenanceAsync
void readProvenanceAsync(WaitingTask *task, ModuleCallingContext const *moduleCallingContext, unsigned int transitionIndex, std::atomic< const std::set< ProductProvenance > * > &writeTo) const override
Definition: RootFile.cc:1973
edm::RootFile::setEntryAtRun
bool setEntryAtRun(RunNumber_t run)
Definition: RootFile.cc:1660
edm::RootTree::resetTraining
void resetTraining()
Definition: RootTree.h:194
edm::LuminosityBlockAuxiliary
Definition: LuminosityBlockAuxiliary.h:15
edm::poolNames::mergeableRunProductMetadataBranchName
std::string const & mergeableRunProductMetadataBranchName()
Definition: BranchType.cc:194
LuminosityBlockAux.h
edm::MakeReducedProvenanceReader::parentageIDLookup_
std::vector< ParentageID > const & parentageIDLookup_
Definition: RootFile.cc:100
EDMException.h
edm::EventAuxiliary::run
RunNumber_t run() const
Definition: EventAuxiliary.h:73
SharedResourcesAcquirer.h
edm::RootFile::inputType_
InputType inputType_
Definition: RootFile.h:363
edm::RootFile::RootFile
RootFile(std::string const &fileName, ProcessConfiguration const &processConfiguration, std::string const &logicalFileName, std::shared_ptr< InputFile > filePtr, std::shared_ptr< EventSkipperByID > eventSkipperByID, bool skipAnyEvents, int remainingEvents, int remainingLumis, unsigned int nStreams, unsigned int treeCacheSize, int treeMaxVirtualSize, InputSource::ProcessingMode processingMode, RunHelperBase *runHelper, bool noEventSort, ProductSelectorRules const &productSelectorRules, InputType inputType, std::shared_ptr< BranchIDListHelper > branchIDListHelper, std::shared_ptr< ThinnedAssociationsHelper > thinnedAssociationsHelper, std::vector< BranchID > const *associationsFromSecondary, std::shared_ptr< DuplicateChecker > duplicateChecker, bool dropDescendantsOfDroppedProducts, ProcessHistoryRegistry &processHistoryRegistry, std::vector< std::shared_ptr< IndexIntoFile >> const &indexesIntoFiles, std::vector< std::shared_ptr< IndexIntoFile >>::size_type currentIndexIntoFile, std::vector< ProcessHistoryID > &orderedProcessHistoryIDs, bool bypassVersionCheck, bool labelRawDataLikeMC, bool usingGoToEvent, bool enablePrefetching, bool enforceGUIDInFileName)
Definition: RootFile.cc:141
edm::InProcess
Definition: BranchType.h:11
edm::MakeFullProvenanceReader::makeReader
std::unique_ptr< ProvenanceReaderBase > makeReader(RootTree &eventTree, DaqProvenanceHelper const *daqProvenanceHelper) const override
Definition: RootFile.cc:2194
edm::RootFile::setAtEventEntry
void setAtEventEntry(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1494
edm::RootFile::fileThinnedAssociationsHelper_
edm::propagate_const< std::unique_ptr< ThinnedAssociationsHelper > > fileThinnedAssociationsHelper_
Definition: RootFile.h:346
BXlumiParameters_cfi.lumi
lumi
Definition: BXlumiParameters_cfi.py:6
edm::FileFormatVersion::noMetaDataTrees
bool noMetaDataTrees() const
Definition: FileFormatVersion.cc:39
ParentageRegistry.h
edm::propagate_const
Definition: propagate_const.h:32
edm::roottree::EntryNumber
IndexIntoFile::EntryNumber_t EntryNumber
Definition: RootTree.h:51
edm::poolNames::parentageBranchName
std::string const & parentageBranchName()
Definition: BranchType.cc:149
edm::IndexIntoFile::IndexIntoFileItr::advanceToNextRun
void advanceToNextRun()
Definition: IndexIntoFile.h:774
trigger::size_type
uint16_t size_type
Definition: TriggerTypeDefs.h:18
edm::EventPrincipal
Definition: EventPrincipal.h:46
edm::RootFile::eventSelectionIDs_
EventSelectionIDVector eventSelectionIDs_
Definition: RootFile.h:352
edm::IndexIntoFile::setEventFinder
void setEventFinder(std::shared_ptr< EventFinder > ptr)
Definition: IndexIntoFile.h:952
edm::FileFormatVersion::runsAndLumis
bool runsAndLumis() const
Definition: FileFormatVersion.cc:13
edm::IndexIntoFile::invalidIndex
static constexpr int invalidIndex
Definition: IndexIntoFile.h:232
edm::EventAuxiliary::resetObsoleteInfo
void resetObsoleteInfo()
Definition: EventAuxiliary.h:71
edm::RootTree::metaTree
TTree const * metaTree() const
Definition: RootTree.h:184
edm::OldProvenanceReader::acquirer_
SharedResourcesAcquirer acquirer_
Definition: RootFile.cc:2102
edm::StreamContext
Definition: StreamContext.h:31
edm::RootFile::provenanceAdaptor_
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
Definition: RootFile.h:357
edm::IndexIntoFile::kRun
Definition: IndexIntoFile.h:238
edm::ProductRegistry::productListUpdator
ProductList & productListUpdator()
Definition: ProductRegistry.h:81
edm::RootTree::entryNumberForIndex
EntryNumber const & entryNumberForIndex(unsigned int index) const
Definition: RootTree.cc:100
edm::FileFormatVersion::eventHistoryTree
bool eventHistoryTree() const
Definition: FileFormatVersion.cc:17
edm::RootFile::skipEvents
bool skipEvents(int &offset)
Definition: RootFile.cc:1353
edm::RootFile::modifiedIDs
bool modifiedIDs() const
Definition: RootFile.h:228
edm::poolNames::processHistoryBranchName
std::string const & processHistoryBranchName()
Definition: BranchType.cc:170
EventPrincipal.h
edm::RootFile::fillRunAuxiliary
std::shared_ptr< RunAuxiliary > fillRunAuxiliary()
Definition: RootFile.cc:1333
edm::RootFile::branchChildren_
edm::propagate_const< std::shared_ptr< BranchChildren > > branchChildren_
Definition: RootFile.h:355
edm::OldProvenanceReader
Definition: RootFile.cc:2081
edm::RootFile::wasLastEventJustRead
bool wasLastEventJustRead() const
Definition: RootFile.cc:859
edm::MakeOldProvenanceReader::MakeOldProvenanceReader
MakeOldProvenanceReader(std::unique_ptr< EntryDescriptionMap > &&entryDescriptionMap)
Definition: RootFile.cc:79
edmLumisInFiles.lumis
lumis
Definition: edmLumisInFiles.py:31
edm::StoredMergeableRunProductMetadata
Definition: StoredMergeableRunProductMetadata.h:57
edm::BranchID
Definition: BranchID.h:14
TrackValidation_cff.task
task
Definition: TrackValidation_cff.py:252
edm::RootFile::fillEventHistory
void fillEventHistory()
Definition: RootFile.cc:1254
edm::FullProvenanceReader::readProvenance
std::set< ProductProvenance > readProvenance(unsigned int transitionIndex) const override
Definition: RootFile.cc:2061
dumpMFGeometry_cfg.prod
prod
Definition: dumpMFGeometry_cfg.py:24
edm::RootTree::fillAux
void fillAux(T *&pAux)
Definition: RootTree.h:144
StoredProductProvenance.h
edm::RootFile::getNextItemType
IndexIntoFile::EntryType getNextItemType(RunNumber_t &run, LuminosityBlockNumber_t &lumi, EventNumber_t &event)
Definition: RootFile.cc:814
edm::MergeableRunProductMetadata
Definition: MergeableRunProductMetadata.h:52
edm::RootFile::branchListIndexes_
BranchListIndexes branchListIndexes_
Definition: RootFile.h:353
edm::EventAuxiliary::id
EventID const & id() const
Definition: EventAuxiliary.h:63
edm::RootTree::fillBranchEntry
void fillBranchEntry(TBranch *branch, T *&pbuf)
Definition: RootTree.h:160
edm::Hash< EntryDescriptionType >
edm::EventProcessHistoryID
Definition: EventProcessHistoryID.h:11
edm::MakeReducedProvenanceReader
Definition: RootFile.cc:92
edm::EventNumber_t
unsigned long long EventNumber_t
Definition: RunLumiEventNumber.h:12
edm::RootFile::savedRunAuxiliary
std::shared_ptr< RunAuxiliary const > savedRunAuxiliary() const
Definition: RootFile.h:300
edm::ProcessHistoryRegistry::vector_type
ProcessHistoryVector vector_type
Definition: ProcessHistoryRegistry.h:22
edm::EventAux
Definition: EventAux.h:15
edm::IndexIntoFile::IndexIntoFileItr::processHistoryIDIndex
int processHistoryIDIndex() const
Definition: IndexIntoFile.h:701
edm::RootFileEventFinder::getEventNumberOfEntry
EventNumber_t getEventNumberOfEntry(roottree::EntryNumber entry) const override
Definition: RootFile.cc:126
edm::InEvent
Definition: BranchType.h:11
edm::poolNames::parameterSetMapBranchName
std::string const & parameterSetMapBranchName()
Definition: BranchType.cc:161
edm::RootFile::whyNotFastClonable_
int whyNotFastClonable_
Definition: RootFile.h:334
edm::RootFile::thinnedAssociationsHelper_
edm::propagate_const< std::shared_ptr< ThinnedAssociationsHelper > > thinnedAssociationsHelper_
Definition: RootFile.h:347
edm::RootFile::setPosition
void setPosition(IndexIntoFile::IndexIntoFileItr const &position)
Definition: RootFile.cc:751
edm::LuminosityBlockID
Definition: LuminosityBlockID.h:31
edm::InputSource::RunsAndLumis
Definition: InputSource.h:80
edm::RootFile::hasNewlyDroppedBranch
std::array< bool, NumBranchTypes > const & hasNewlyDroppedBranch() const
Definition: RootFile.h:226
edm::poolNames::entryDescriptionIDBranchName
std::string const & entryDescriptionIDBranchName()
Definition: BranchType.cc:142
b
double b
Definition: hdecay.h:118
edm::OldProvenanceReader::entryDescriptionMap_
EntryDescriptionMap const & entryDescriptionMap_
Definition: RootFile.cc:2099
edm::RootTree::resetAndGetRootDelayedReader
DelayedReader * resetAndGetRootDelayedReader() const
Definition: RootTree.cc:123
edm::RootFile::fillIndexIntoFile
void fillIndexIntoFile()
Definition: RootFile.cc:926
edm::ReducedProvenanceReader::rootTree_
edm::propagate_const< RootTree * > rootTree_
Definition: RootFile.cc:1891
edm::IndexIntoFile::invalidLumi
static constexpr LuminosityBlockNumber_t invalidLumi
Definition: IndexIntoFile.h:234
edm::poolNames::parentageTreeName
std::string const & parentageTreeName()
Definition: BranchType.cc:147
edm::FileFormatVersion::newAuxiliary
bool newAuxiliary() const
Definition: FileFormatVersion.cc:11
edm::EventID::run
RunNumber_t run() const
Definition: EventID.h:38
edm::BranchIDLists
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
mitigatedMETSequence_cff.U
U
Definition: mitigatedMETSequence_cff.py:36
edm::EventAuxiliary
Definition: EventAuxiliary.h:14
edm::RootFile::treePointers_
RootTreePtrArray treePointers_
Definition: RootFile.h:341
edm::ProductSelector
Definition: ProductSelector.h:26
edm::MakeDummyProvenanceReader::makeReader
std::unique_ptr< ProvenanceReaderBase > makeReader(RootTree &eventTree, DaqProvenanceHelper const *daqProvenanceHelper) const override
Definition: RootFile.cc:2184
edm::RootFile::indexIntoFile_
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:322
edm::ProductSelectorRules
Definition: ProductSelectorRules.h:24
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::RunHelperBase
Definition: RunHelper.h:15
edm::numEntries
Long64_t numEntries(TFile *hdl, std::string const &trname)
Definition: CollUtil.cc:50
edm::Parentage
Definition: Parentage.h:25
edm::RootFile::readEvent
void readEvent(EventPrincipal &cache)
Definition: RootFile.cc:1442
edm::IndexIntoFile::IndexIntoFileItr::skipEventForward
void skipEventForward(int &phIndexOfSkippedEvent, RunNumber_t &runOfSkippedEvent, LuminosityBlockNumber_t &lumiOfSkippedEvent, EntryNumber_t &skippedEventEntry)
Definition: IndexIntoFile.h:745
edm::IndexIntoFile::begin
IndexIntoFileItr begin(SortOrder sortOrder) const
Definition: IndexIntoFile.cc:461
edm::RootFile::newBranchToOldBranch
std::string const & newBranchToOldBranch(std::string const &newBranch) const
Definition: RootFile.cc:741
edm::IndexIntoFile::IndexIntoFileItr::skipLumiInRun
bool skipLumiInRun()
Definition: IndexIntoFile.h:768
edm::RootFile::fid_
FileID fid_
Definition: RootFile.h:320
edm::ProductRegistry::copyProduct
void copyProduct(BranchDescription const &productdesc)
Definition: ProductRegistry.cc:122
edm::RootFile::orderedProcessHistoryIDs_
std::vector< ProcessHistoryID > & orderedProcessHistoryIDs_
Definition: RootFile.h:323
edm::poolNames::eventSelectionsBranchName
std::string const & eventSelectionsBranchName()
Definition: BranchType.cc:200
edm::DelayedReader::postEventReadFromSourceSignal
virtual signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const * postEventReadFromSourceSignal() const =0
edm::InputSource::ProcessingMode
ProcessingMode
Definition: InputSource.h:80
edm::LuminosityBlockAuxiliary::processHistoryID
ProcessHistoryID const & processHistoryID() const
Definition: LuminosityBlockAuxiliary.h:32
edm::ThinnedAssociationsHelper
Definition: ThinnedAssociationsHelper.h:37
ReleaseVersion.h
edm::ProductRegistry::ProductList
std::map< BranchKey, BranchDescription > ProductList
Definition: ProductRegistry.h:39
BranchDescription.h
edm::RootFile::savedRunAuxiliary_
edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:330
edm::TypeWithDict
Definition: TypeWithDict.h:38
edm::ReducedProvenanceReader::parentageIDLookup_
std::vector< ParentageID > const & parentageIDLookup_
Definition: RootFile.cc:1895
edm::ServiceRegistry::Operate
friend class Operate
Definition: ServiceRegistry.h:54
edm::OldProvenanceReader::readProvenance
std::set< ProductProvenance > readProvenance(unsigned int transitionIndex) const override
Definition: RootFile.cc:2131
edm::RootFile::storedMergeableRunProductMetadata_
edm::propagate_const< std::unique_ptr< StoredMergeableRunProductMetadata > > storedMergeableRunProductMetadata_
Definition: RootFile.h:327
edm::DaqProvenanceHelper::mapBranchID
BranchID const & mapBranchID(BranchID const &branchID) const
Definition: DaqProvenanceHelper.cc:191
edm::EventEntryDescription::parents
std::vector< BranchID > const & parents() const
Definition: EventEntryDescription.h:39
edm::ParameterSet
Definition: ParameterSet.h:47
GetReleaseVersion.h
edm::MakeOldProvenanceReader::makeReader
std::unique_ptr< ProvenanceReaderBase > makeReader(RootTree &eventTree, DaqProvenanceHelper const *daqProvenanceHelper) const override
Definition: RootFile.cc:2189
edm::FileFormatVersion
Definition: FileFormatVersion.h:7
edm::RootFile::hasNewlyDroppedBranch_
std::array< bool, NumBranchTypes > hasNewlyDroppedBranch_
Definition: RootFile.h:335
a
double a
Definition: hdecay.h:119
edm::IndexIntoFile::firstAppearanceOrder
Definition: IndexIntoFile.h:266
edm::RootFile::makeProvenanceReaderMaker
std::unique_ptr< MakeProvenanceReader > makeProvenanceReaderMaker(InputType inputType)
Definition: RootFile.cc:1848
fetchall_from_DQM_v2.release
release
Definition: fetchall_from_DQM_v2.py:92
edm::WaitingTaskHolder
Definition: WaitingTaskHolder.h:30
edm::InLumi
Definition: BranchType.h:11
edm::IndexIntoFile::IndexIntoFileItr
Definition: IndexIntoFile.h:681
edm::IndexIntoFile::SortOrder
SortOrder
Definition: IndexIntoFile.h:266
edm::poolNames::productDescriptionBranchName
std::string const & productDescriptionBranchName()
Definition: BranchType.cc:155
edm::RootFile::setEntryAtEvent
bool setEntryAtEvent(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event)
Definition: RootFile.cc:1644
edm::ProductProvenanceVector
std::vector< ProductProvenance > ProductProvenanceVector
Definition: ProductProvenance.h:60
edm::EventAuxiliary::luminosityBlock
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventAuxiliary.h:67
edm::FullProvenanceReader
Definition: RootFile.cc:2017
edm::RootFile::setIfFastClonable
void setIfFastClonable(int remainingEvents, int remainingLumis)
Definition: RootFile.cc:681
edm::RootFile::logicalFile_
const std::string logicalFile_
Definition: RootFile.h:314
edm::errors::FileNameInconsistentWithGUID
Definition: EDMException.h:68
edm::LuminosityBlockPrincipal::fillLuminosityBlockPrincipal
void fillLuminosityBlockPrincipal(ProcessHistory const *processHistory, DelayedReader *reader=nullptr)
Definition: LuminosityBlockPrincipal.cc:16
edm::releaseversion::DecomposedReleaseVersion
Definition: ReleaseVersion.h:9
edm::ServiceRegistry::presentToken
ServiceToken presentToken() const
Definition: ServiceRegistry.cc:63
edm::ParentageRegistry
Definition: ParentageRegistry.h:12
edm::RootFile::initializeDuplicateChecker
void initializeDuplicateChecker(std::vector< std::shared_ptr< IndexIntoFile >> const &indexesIntoFiles, std::vector< std::shared_ptr< IndexIntoFile >>::size_type currentIndexIntoFile)
Definition: RootFile.cc:1694
edm::OldProvenanceReader::rootTree_
edm::propagate_const< RootTree * > rootTree_
Definition: RootFile.cc:2095
edm::RootFile::processingMode_
InputSource::ProcessingMode processingMode_
Definition: RootFile.h:348
edm::ModuleCallingContext::getStreamContext
StreamContext const * getStreamContext() const
Definition: ModuleCallingContext.cc:32
edm::MakeFullProvenanceReader
Definition: RootFile.cc:87
edm::friendlyname::friendlyName
std::string friendlyName(std::string const &iFullName)
Definition: FriendlyName.cc:278
edm::RootFile::validateFile
void validateFile(InputType inputType, bool usingGoToEvent)
Definition: RootFile.cc:1150
thread_safety_macros.h
RunPrincipal.h
edm::RootFile::markBranchToBeDropped
void markBranchToBeDropped(bool dropDescendants, BranchDescription const &branch, std::set< BranchID > &branchesToDrop, std::map< BranchID, BranchID > const &droppedToKeptAlias) const
Definition: RootFile.cc:1707
edm::FileBlock::FileTooOld
Definition: FileBlock.h:33
edm::RootFile::filePtr_
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:317
edmPickEvents.event
event
Definition: edmPickEvents.py:273
ProductSelector.h
EventEntryInfo.h
edm::IndexIntoFile::IndexIntoFileItr::firstEventEntryThisRun
EntryNumber_t firstEventEntryThisRun()
Definition: IndexIntoFile.h:719
position
static int position[264][3]
Definition: ReadPGInfo.cc:289
edm::poolNames::entryDescriptionTreeName
std::string const & entryDescriptionTreeName()
Definition: BranchType.cc:140
GlobalIdentifier.h
edm::IndexIntoFile::findLumiPosition
IndexIntoFileItr findLumiPosition(RunNumber_t run, LuminosityBlockNumber_t lumi) const
Definition: IndexIntoFile.cc:685
edm::ProcessConfigurationVector
std::vector< ProcessConfiguration > ProcessConfigurationVector
Definition: ProcessConfiguration.h:62
edm::FileBlock::EventsOrLumisSelectedByID
Definition: FileBlock.h:37
edm::BranchChildren
Definition: BranchChildren.h:18
edm::ReducedProvenanceReader::readProvenance
std::set< ProductProvenance > readProvenance(unsigned int) const override
Definition: RootFile.cc:1987
edm::RootFile::readLuminosityBlockAuxiliary_
std::shared_ptr< LuminosityBlockAuxiliary > readLuminosityBlockAuxiliary_()
Definition: RootFile.cc:1587
edm::EventID::event
EventNumber_t event() const
Definition: EventID.h:40
edm::createGlobalIdentifier
std::string createGlobalIdentifier(bool binary=false)
Definition: GlobalIdentifier.cc:5
edm::FullProvenanceReader::readProvenanceAsync
void readProvenanceAsync(WaitingTask *task, ModuleCallingContext const *moduleCallingContext, unsigned int transitionIndex, std::atomic< const std::set< ProductProvenance > * > &writeTo) const override
Definition: RootFile.cc:2047
edm::MakeProvenanceReader
Definition: RootFile.h:56
edm::RootFile::branchChildren
std::shared_ptr< BranchChildren const > branchChildren() const
Definition: RootFile.h:303
edm::SharedResourcesRegistry
Definition: SharedResourcesRegistry.h:39
BranchType.h
edm::poolNames::processHistoryMapBranchName
std::string const & processHistoryMapBranchName()
Definition: BranchType.cc:167
edm::FileBlock::NoEventsInFile
Definition: FileBlock.h:34
trackerHitRTTI::vector
Definition: trackerHitRTTI.h:21
edm::RootFile::skipAnyEvents_
bool skipAnyEvents_
Definition: RootFile.h:331
edm::RootFile::fillEventAuxiliary
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1245
edm::roottree::defaultLearningEntries
unsigned const int defaultLearningEntries
Definition: RootTree.h:49
edm::RootFile::edProductClass_
edm::propagate_const< TClass * > edProductClass_
Definition: RootFile.h:362
edm::RootFile::fileFormatVersion_
FileFormatVersion fileFormatVersion_
Definition: RootFile.h:319
edm::ProductRegistry::allBranchDescriptions
std::vector< BranchDescription const * > allBranchDescriptions() const
Definition: ProductRegistry.cc:199
RootFile.h
edm::BranchDescription::branchName
std::string const & branchName() const
Definition: BranchDescription.h:119
edm::EventAuxiliary::time
Timestamp const & time() const
Definition: EventAuxiliary.h:66
B2GTnPMonitor_cfi.item
item
Definition: B2GTnPMonitor_cfi.py:147
edm::IndexIntoFile::end
IndexIntoFileItr end(SortOrder sortOrder) const
Used to end an iteration over the Runs, Lumis, and Events in a file.
Definition: IndexIntoFile.cc:470
edm::EventPrincipal::streamID
StreamID streamID() const
Definition: EventPrincipal.h:106
InputFile.h
edm::FullProvenanceReader::infoVector_
ProductProvenanceVector infoVector_
Definition: RootFile.cc:2030
edm::FileFormatVersion::processHistorySameWithinRun
bool processHistorySameWithinRun() const
Definition: FileFormatVersion.cc:33
edm::RootFile::readEventHistoryTree
void readEventHistoryTree()
Definition: RootFile.cc:1683
edm::OldProvenanceReader::~OldProvenanceReader
~OldProvenanceReader() override
Definition: RootFile.cc:2086
edm::lower_bound_all
ForwardSequence::const_iterator lower_bound_all(ForwardSequence const &s, Datum const &d)
wrappers for std::lower_bound
Definition: Algorithms.h:69
diMuonSkim_cfi.byName
byName
Definition: diMuonSkim_cfi.py:9
itr
std::vector< std::pair< float, float > >::iterator itr
Definition: HGCDigitizer.cc:29
edm::ServiceRegistry::instance
static ServiceRegistry & instance()
Definition: ServiceRegistry.cc:90
edm::RootTree::branchNames
std::vector< std::string > const & branchNames() const
Definition: RootTree.h:140
edm::FullProvenanceReader::rootTree_
RootTree * rootTree_
Definition: RootFile.cc:2029
edm::RootTree::insertEntryForIndex
void insertEntryForIndex(unsigned int index)
Definition: RootTree.cc:105
edm::RunAux
Definition: RunAux.h:14
edm::IndexIntoFile::findEventPosition
IndexIntoFileItr findEventPosition(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
Definition: IndexIntoFile.cc:676
LuminosityBlockPrincipal.h
edm::LuminosityBlockAux
Definition: LuminosityBlockAux.h:13
instance
static PFTauRenderPlugin instance
Definition: PFTauRenderPlugin.cc:70
edm::pset::Registry::insertMapped
bool insertMapped(value_type const &v, bool forceUpdate=false)
Definition: Registry.cc:32
edm::BranchDescription::updateFriendlyClassName
void updateFriendlyClassName()
Definition: BranchDescription.cc:294
edm::FileFormatVersion::storedProductProvenanceUsed
bool storedProductProvenanceUsed() const
Definition: FileFormatVersion.cc:41
FileBlock.h
edm::ReducedProvenanceReader::acquirer_
SharedResourcesAcquirer acquirer_
Definition: RootFile.cc:1898
edm::IndexIntoFile::containsItem
bool containsItem(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
Definition: IndexIntoFile.cc:696
edm::InputSource::Runs
Definition: InputSource.h:80
edm::EventPrincipal::fillEventPrincipal
void fillEventPrincipal(EventAuxiliary const &aux, ProcessHistory const *processHistory, DelayedReader *reader=nullptr)
Definition: EventPrincipal.cc:104
edm::RootFile::initAssociationsFromSecondary
void initAssociationsFromSecondary(std::vector< BranchID > const &)
Definition: RootFile.cc:755
Registry.h
edm::releaseversion::isEarlierRelease
bool isEarlierRelease(std::string const &a, std::string const &b)
Definition: ReleaseVersion.cc:70
edm::IndexIntoFile::IndexIntoFileItr::getEntryType
EntryType getEntryType() const
Definition: IndexIntoFile.h:700
edm::roottree::defaultNonEventCacheSize
unsigned const int defaultNonEventCacheSize
Definition: RootTree.h:48
edm::RootFile::history_
edm::propagate_const< std::unique_ptr< History > > history_
Definition: RootFile.h:354
edm::RunPrincipal::fillRunPrincipal
void fillRunPrincipal(ProcessHistoryRegistry const &processHistoryRegistry, DelayedReader *reader=nullptr)
Definition: RunPrincipal.cc:26
edm::Timestamp::invalidTimestamp
static Timestamp invalidTimestamp()
Definition: Timestamp.h:82
edm::RootFile::noEventSort_
bool noEventSort_
Definition: RootFile.h:332
edm::BranchTypeToProductProvenanceBranchName
std::string const & BranchTypeToProductProvenanceBranchName(BranchType const &BranchType)
Definition: BranchType.cc:132
edm::RootTree::current
bool current() const
Definition: RootTree.h:130
edm::RootTree::isValid
bool isValid() const
Definition: RootTree.cc:110
edm::WaitingTask
Definition: WaitingTask.h:36
edm::ParentageRegistry::insertMapped
bool insertMapped(value_type const &v)
Definition: ParentageRegistry.cc:24
edm::RootFile::createFileBlock
std::unique_ptr< FileBlock > createFileBlock() const
Definition: RootFile.cc:725
edm::RootFile::provenanceReaderMaker_
edm::propagate_const< std::unique_ptr< MakeProvenanceReader > > provenanceReaderMaker_
Definition: RootFile.h:358
eostools.move
def move(src, dest)
Definition: eostools.py:511
edm::RootFile::eventAux
EventAuxiliary const & eventAux() const
Definition: RootFile.h:216
std
Definition: JetResolutionObject.h:76
writedatasetfile.run
run
Definition: writedatasetfile.py:27
edm::RootFile::parentageIDLookup_
std::vector< ParentageID > parentageIDLookup_
Definition: RootFile.h:360
edm::ProductRegistry::productList
ProductList const & productList() const
Definition: ProductRegistry.h:76
edm::RootFile::goToEvent
bool goToEvent(EventID const &eventID)
Definition: RootFile.cc:1409
SharedResourcesRegistry.h
edm::RunPrincipal::mergeableRunProductMetadata
MergeableRunProductMetadata * mergeableRunProductMetadata()
Definition: RunPrincipal.h:79
stemFromPath.h
edm::ProcessHistoryID
Hash< ProcessHistoryType > ProcessHistoryID
Definition: ProcessHistoryID.h:8
edm::ReducedProvenanceReader::daqProvenanceHelper_
DaqProvenanceHelper const * daqProvenanceHelper_
Definition: RootFile.cc:1896
edm::RootTree::entryNumber
EntryNumber const & entryNumber() const
Definition: RootTree.h:135
edm::FullProvenanceReader::~FullProvenanceReader
~FullProvenanceReader() override
Definition: RootFile.cc:2020
edm::RootFile::lastEventEntryNumberRead_
IndexIntoFile::EntryNumber_t lastEventEntryNumberRead_
Definition: RootFile.h:342
edm::RootTree::entries
EntryNumber const & entries() const
Definition: RootTree.h:137
edm::IndexIntoFile::IndexIntoFileItr::advanceToNextLumiOrRun
void advanceToNextLumiOrRun()
Definition: IndexIntoFile.h:775
MergeableRunProductMetadata.h
edm::DummyProvenanceReader::readProvenance
std::set< ProductProvenance > readProvenance(unsigned int) const override
Definition: RootFile.cc:2167
edm::poolNames::metaDataTreeName
std::string const & metaDataTreeName()
Definition: BranchType.cc:152
edm::ProcessHistoryRegistry::collection_type
ProcessHistoryMap collection_type
Definition: ProcessHistoryRegistry.h:21
edm::EventAuxiliary::processHistoryID
ProcessHistoryID const & processHistoryID() const
Definition: EventAuxiliary.h:61
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:31
edm::MakeReducedProvenanceReader::MakeReducedProvenanceReader
MakeReducedProvenanceReader(std::vector< ParentageID > const &parentageIDLookup)
Definition: RootFile.cc:94
setIsMergeable.h
edm::InputType::Primary
edm::getReleaseVersion
std::string getReleaseVersion()
Definition: GetReleaseVersion.cc:7
Exception
Definition: hltDiff.cc:246
edm::IndexIntoFile::fillEventNumbersOrEntries
void fillEventNumbersOrEntries(bool needEventNumbers, bool needEventEntries) const
Definition: IndexIntoFile.cc:202
edm::RootTree::branchEntryInfoBranch
TBranch * branchEntryInfoBranch() const
Definition: RootTree.h:188
edm::ReducedProvenanceReader::pProvVector_
StoredProductProvenanceVector const * pProvVector_
Definition: RootFile.cc:1894
edm::RootFile::containsItem
bool containsItem(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
Definition: RootFile.cc:810
edm::RootFile::productRegistry_
std::shared_ptr< ProductRegistry const > productRegistry_
Definition: RootFile.h:343
edm::RootFile::whyNotFastClonable
int whyNotFastClonable() const
Definition: RootFile.h:225
edm::RootFile::setEntryAtNextEventInLumi
bool setEntryAtNextEventInLumi(RunNumber_t run, LuminosityBlockNumber_t lumi)
Definition: RootFile.cc:1668
edm::IndexIntoFile::reduceProcessHistoryIDs
void reduceProcessHistoryIDs(ProcessHistoryRegistry const &processHistoryRegistry)
Definition: IndexIntoFile.cc:308
edm::InputType::SecondarySource
edm::poolNames::thinnedAssociationsHelperBranchName
std::string const & thinnedAssociationsHelperBranchName()
Definition: BranchType.cc:179
ThinnedAssociation.h
edm::RootFile::setSignals
void setSignals(signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *preEventReadSource, signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *postEventReadSource)
Definition: RootFile.cc:1842
edm::History
Definition: History.h:22
edm::OldProvenanceReader::OldProvenanceReader
OldProvenanceReader(RootTree *rootTree, EntryDescriptionMap const &theMap, DaqProvenanceHelper const *daqProvenanceHelper)
Definition: RootFile.cc:2105
edm::OldProvenanceReader::pInfoVector_
std::vector< EventEntryInfo > * pInfoVector_
Definition: RootFile.cc:2098
ProvenanceAdaptor.h
edm::RootTree::fillBranchEntryMeta
void fillBranchEntryMeta(TBranch *branch, T *&pbuf)
Definition: RootTree.h:149
edm::IndexIntoFile::EntryNumber_t
long long EntryNumber_t
Definition: IndexIntoFile.h:231
edm::ProcessHistoryRegistry
Definition: ProcessHistoryRegistry.h:18
edm::poolNames::productDependenciesBranchName
std::string const & productDependenciesBranchName()
Definition: BranchType.cc:158
funct::void
TEMPL(T2) struct Divides void
Definition: Factorize.h:24
filterCSVwithJSON.target
target
Definition: filterCSVwithJSON.py:32
edm::RootFile::newBranchToOldBranch_
std::map< std::string, std::string > newBranchToOldBranch_
Definition: RootFile.h:350
edm::BranchDescription
Definition: BranchDescription.h:32
edm::poolNames::eventHistoryTreeName
std::string const & eventHistoryTreeName()
Definition: BranchType.cc:212
drop
const int drop
Definition: GenParticlePruner.cc:48
edm::MakeReducedProvenanceReader::makeReader
std::unique_ptr< ProvenanceReaderBase > makeReader(RootTree &eventTree, DaqProvenanceHelper const *daqProvenanceHelper) const override
Definition: RootFile.cc:2199
DTskim_cfg.processingMode
processingMode
Definition: DTskim_cfg.py:82
edm::errors::FormatIncompatibility
Definition: EDMException.h:58
edm::RootTree
Definition: RootTree.h:103
edm::IndexIntoFile::kEnd
Definition: IndexIntoFile.h:238
edm::RootFile::indexIntoFileBegin_
IndexIntoFile::IndexIntoFileItr indexIntoFileBegin_
Definition: RootFile.h:324
edm::roottree::getEntry
Int_t getEntry(TBranch *branch, EntryNumber entryNumber)
Definition: RootTree.cc:496
edm::RootFile::~RootFile
~RootFile()
Definition: RootFile.cc:598
edm::EDProductGetter::transitionIndex
unsigned int transitionIndex() const
Definition: EDProductGetter.h:94
cmsCodeRulesChecker.rules
rules
Definition: cmsCodeRulesChecker.py:152
ParameterSet.h
edm::IndexIntoFile::fixIndexes
void fixIndexes(std::vector< ProcessHistoryID > &processHistoryIDs)
Definition: IndexIntoFile.cc:370
edm::stable_sort_all
void stable_sort_all(RandomAccessSequence &s)
wrappers for std::stable_sort
Definition: Algorithms.h:103
edm::RootFile::readRun_
void readRun_(RunPrincipal &runPrincipal)
Definition: RootFile.cc:1560
edm::EventAuxiliary::isRealData
bool isRealData() const
Definition: EventAuxiliary.h:74
edm::IndexIntoFile::setRunOrLumiEntries
std::vector< RunOrLumiEntry > & setRunOrLumiEntries()
Definition: IndexIntoFile.h:1007
edm::FileBlock::MaxEventsTooSmall
Definition: FileBlock.h:39
edm::RunPrincipal
Definition: RunPrincipal.h:34
edm::poolNames::fileIdentifierBranchName
std::string const & fileIdentifierBranchName()
Definition: BranchType.cc:185
edm::moduleName
std::string moduleName(Provenance const &provenance, ProcessHistory const &history)
Definition: Provenance.cc:27
hlt_dqm_clientPB-live_cfg.me
me
Definition: hlt_dqm_clientPB-live_cfg.py:61
edm::RootFile::branchListIndexesUnchanged_
bool branchListIndexesUnchanged_
Definition: RootFile.h:336
parents
TPRegexp parents
Definition: eve_filter.cc:21
ntuplemaker.time
time
Definition: ntuplemaker.py:310
event
Definition: event.py:1
edm::EventID
Definition: EventID.h:31
edm::RootTree::setSignals
void setSignals(signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *preEventReadSource, signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *postEventReadSource)
Definition: RootTree.cc:489
hltrates_dqm_sourceclient-live_cfg.offset
offset
Definition: hltrates_dqm_sourceclient-live_cfg.py:82
edm::EventEntryDescription::id
EntryDescriptionID id() const
Definition: EventEntryDescription.cc:13
edm::EventSelectionIDVector
std::vector< EventSelectionID > EventSelectionIDVector
Definition: EventSelectionID.h:16
edm::poolNames::entryDescriptionBranchName
std::string const & entryDescriptionBranchName()
Definition: BranchType.cc:144
CommonMethods.cp
def cp(fromDir, toDir, listOfFiles, overwrite=False, smallList=False)
Definition: CommonMethods.py:192
edm::SerialTaskQueueChain
Definition: SerialTaskQueueChain.h:32
submitPVValidationJobs.t
string t
Definition: submitPVValidationJobs.py:644
edm::IndexIntoFile::IndexIntoFileItr::skipEventBackward
void skipEventBackward(int &phIndexOfEvent, RunNumber_t &runOfEvent, LuminosityBlockNumber_t &lumiOfEvent, EntryNumber_t &eventEntry)
Definition: IndexIntoFile.h:759
edm::OldProvenanceReader::daqProvenanceHelper_
DaqProvenanceHelper const * daqProvenanceHelper_
Definition: RootFile.cc:2100
lumi
Definition: LumiSectionData.h:20
edm::ReducedProvenanceReader
Definition: RootFile.cc:1877
edm::MergeableRunProductMetadata::readRun
void readRun(long long inputRunEntry, StoredMergeableRunProductMetadata const &inputStoredMergeableRunProductMetadata, IndexIntoFileItrHolder const &inputIndexIntoFileItr)
Definition: MergeableRunProductMetadata.cc:23
edm::RootFile::runTree_
RootTree runTree_
Definition: RootFile.h:340
edm::errors::FileReadError
Definition: EDMException.h:50
edm::signalslot::Signal
Definition: DelayedReader.h:26
dttmaxenums::R
Definition: DTTMax.h:29
DaqProvenanceHelper.h
edm::DummyProvenanceReader
Definition: RootFile.cc:2152
edm::ReducedProvenanceReader::ReducedProvenanceReader
ReducedProvenanceReader(RootTree *iRootTree, std::vector< ParentageID > const &iParentageIDLookup, DaqProvenanceHelper const *daqProvenanceHelper)
Definition: RootFile.cc:1901
edm::EventAuxiliary::setProcessHistoryID
void setProcessHistoryID(ProcessHistoryID const &phid)
Definition: EventAuxiliary.h:62
edm::poolNames::processConfigurationBranchName
std::string const & processConfigurationBranchName()
Definition: BranchType.cc:173
edm::RootFile::eventProductProvenanceRetriever
std::shared_ptr< ProductProvenanceRetriever const > eventProductProvenanceRetriever(size_t index) const
Definition: RootFile.h:306
EventAux.h
edm::errors::UnimplementedFeature
Definition: EDMException.h:38
RunID.h
edm::FileBlock::MaxLumisTooSmall
Definition: FileBlock.h:40
label
const char * label
Definition: PFTauDecayModeTools.cc:11
do_nothing_deleter.h
chain
Definition: chain.py:1
edm::InputSource::RunsLumisAndEvents
Definition: InputSource.h:80
edm::RootFile::branchIDLists_
std::shared_ptr< BranchIDLists const > branchIDLists_
Definition: RootFile.h:344
edm::IndexIntoFile::EventFinder
Definition: IndexIntoFile.h:902
edm::MakeOldProvenanceReader
Definition: RootFile.cc:77
edm::ProcessConfiguration
Definition: ProcessConfiguration.h:14
edm::StoredProductProvenanceVector
std::vector< StoredProductProvenance > StoredProductProvenanceVector
Definition: StoredProductProvenance.h:34
edm::IndexIntoFile::setProcessHistoryIDs
std::vector< ProcessHistoryID > & setProcessHistoryIDs()
Definition: IndexIntoFile.h:1012
edm::BranchKey
Definition: BranchKey.h:17
edm::pset::Registry
Definition: Registry.h:26
edm::poolNames::moduleDescriptionMapBranchName
std::string const & moduleDescriptionMapBranchName()
Definition: BranchType.cc:164
edm::RootTree::next
bool next()
Definition: RootTree.h:127
edm::RootFile::duplicateChecker_
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:356
edm::DummyProvenanceReader::~DummyProvenanceReader
~DummyProvenanceReader() override
Definition: RootFile.cc:2155
edm::OldProvenanceReader::mutex_
std::shared_ptr< std::recursive_mutex > mutex_
Definition: RootFile.cc:2101
edm::FileBlock::DuplicateEventsRemoved
Definition: FileBlock.h:42
edm::FullProvenanceReader::mutex_
std::shared_ptr< std::recursive_mutex > mutex_
Definition: RootFile.cc:2034
edm::ParameterSetConverter::ParameterSetIdConverter
std::map< ParameterSetID, ParameterSetID > ParameterSetIdConverter
Definition: ParameterSetConverter.h:45
muonDTDigis_cfi.pset
pset
Definition: muonDTDigis_cfi.py:27
edm::RootFile::indexIntoFileIter
IndexIntoFile::IndexIntoFileItr indexIntoFileIter() const
Definition: RootFile.cc:749
edm::RootFile::fillLumiAuxiliary
std::shared_ptr< LuminosityBlockAuxiliary > fillLumiAuxiliary()
Definition: RootFile.cc:1310
edm::IndexIntoFile::IndexIntoFileItr::entry
EntryNumber_t entry() const
Definition: IndexIntoFile.h:704
edm::IndexIntoFile::invalidRun
static constexpr RunNumber_t invalidRun
Definition: IndexIntoFile.h:233
edm::poolNames::eventHistoryBranchName
std::string const & eventHistoryBranchName()
Definition: BranchType.cc:197
edm::RunAuxiliary
Definition: RunAuxiliary.h:15
edm::IndexIntoFile::IndexIntoFileItr::advanceToEvent
void advanceToEvent()
Definition: IndexIntoFile.cc:1748
edm::RootFile::wasFirstEventJustRead
bool wasFirstEventJustRead() const
Definition: RootFile.cc:865
edm::IndexIntoFile::fillEventNumbers
void fillEventNumbers() const
Definition: IndexIntoFile.cc:198
edm::IndexIntoFile::EntryType
EntryType
Definition: IndexIntoFile.h:238
edm::FileBlock::InitialEventsSkipped
Definition: FileBlock.h:38
edm::ModuleCallingContext
Definition: ModuleCallingContext.h:29
edm::RootFile::fillThisEventAuxiliary
void fillThisEventAuxiliary()
Definition: RootFile.cc:1227
edm::ReducedProvenanceReader::mutex_
std::shared_ptr< std::recursive_mutex > mutex_
Definition: RootFile.cc:1897
edm::RootFile::file_
const std::string file_
Definition: RootFile.h:313