CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
edm::RootFile Class Reference

#include <RootFile.h>

Public Types

typedef std::array< RootTree *, NumBranchTypesRootTreePtrArray
 

Public Member Functions

std::shared_ptr< BranchIDListHelper const > branchIDListHelper () const
 
std::shared_ptr< BranchIDListHelper > & branchIDListHelper ()
 
bool branchListIndexesUnchanged () const
 
void close ()
 
bool containsItem (RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
 
std::unique_ptr< FileBlockcreateFileBlock () const
 
EventAuxiliary const & eventAux () const
 
EventID const & eventID () const
 
RootTree const & eventTree () const
 
std::string const & file () const
 
FileFormatVersion fileFormatVersion () const
 
IndexIntoFile::EntryType getNextItemType (RunNumber_t &run, LuminosityBlockNumber_t &lumi, EventNumber_t &event)
 
bool goToEvent (EventID const &eventID)
 
std::array< bool, NumBranchTypes > const & hasNewlyDroppedBranch () const
 
IndexIntoFile::IndexIntoFileItr indexIntoFileIter () const
 
std::shared_ptr< IndexIntoFile const > indexIntoFileSharedPtr () const
 
std::shared_ptr< IndexIntoFile > & indexIntoFileSharedPtr ()
 
void initAssociationsFromSecondary (std::vector< BranchID > const &)
 
RootTree const & lumiTree () const
 
bool modifiedIDs () const
 
bool nextEventEntry ()
 
RootFileoperator= (RootFile const &)=delete
 
std::shared_ptr< ProductRegistry const > productRegistry () const
 
bool readCurrentEvent (EventPrincipal &cache)
 
void readEvent (EventPrincipal &cache)
 
void readFakeRun_ (RunPrincipal &runPrincipal)
 
std::shared_ptr< RunAuxiliaryreadFakeRunAuxiliary_ ()
 
void readLuminosityBlock_ (LuminosityBlockPrincipal &lumiPrincipal)
 
std::shared_ptr< LuminosityBlockAuxiliaryreadLuminosityBlockAuxiliary_ ()
 
void readRun_ (RunPrincipal &runPrincipal)
 
std::shared_ptr< RunAuxiliaryreadRunAuxiliary_ ()
 
void reportOpened (std::string const &inputType)
 
void rewind ()
 
 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)
 
 RootFile (std::string const &fileName, ProcessConfiguration const &processConfiguration, std::string const &logicalFileName, std::shared_ptr< InputFile > filePtr, unsigned int nStreams, int treeMaxVirtualSize, InputSource::ProcessingMode processingMode, RunHelperBase *runHelper, ProductSelectorRules const &productSelectorRules, InputType inputType, std::shared_ptr< BranchIDListHelper > branchIDListHelper, std::shared_ptr< ThinnedAssociationsHelper > thinnedAssociationsHelper, std::vector< BranchID > const *associationsFromSecondary, 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 enablePrefetching)
 
 RootFile (std::string const &fileName, ProcessConfiguration const &processConfiguration, std::string const &logicalFileName, std::shared_ptr< InputFile > filePtr, unsigned int nStreams, unsigned int treeCacheSize, int treeMaxVirtualSize, RunHelperBase *runHelper, ProductSelectorRules const &productSelectorRules, InputType inputType, 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 enablePrefetching)
 
 RootFile (RootFile const &)=delete
 
RootTree const & runTree () const
 
void setAtEventEntry (IndexIntoFile::EntryNumber_t entry)
 
bool setEntryAtEvent (RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event)
 
bool setEntryAtItem (RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event)
 
bool setEntryAtLumi (RunNumber_t run, LuminosityBlockNumber_t lumi)
 
bool setEntryAtNextEventInLumi (RunNumber_t run, LuminosityBlockNumber_t lumi)
 
bool setEntryAtRun (RunNumber_t run)
 
void setPosition (IndexIntoFile::IndexIntoFileItr const &position)
 
void setSignals (signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *preEventReadSource, signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *postEventReadSource)
 
void setToLastEntry ()
 
bool skipEntries (unsigned int &offset)
 
bool skipEvents (int &offset)
 
bool wasFirstEventJustRead () const
 
bool wasLastEventJustRead () const
 
int whyNotFastClonable () const
 
 ~RootFile ()
 

Private Member Functions

std::shared_ptr< BranchChildren const > branchChildren () const
 
std::shared_ptr< BranchChildren > & branchChildren ()
 
void dropOnInput (ProductRegistry &reg, ProductSelectorRules const &rules, bool dropDescendants, InputType inputType)
 
std::shared_ptr< ProductProvenanceRetriever const > eventProductProvenanceRetriever (size_t index) const
 
std::shared_ptr< ProductProvenanceRetriever > & eventProductProvenanceRetriever (size_t index)
 
bool fillEventAuxiliary (IndexIntoFile::EntryNumber_t entry)
 
void fillEventHistory ()
 
void fillIndexIntoFile ()
 
std::shared_ptr< LuminosityBlockAuxiliaryfillLumiAuxiliary ()
 
std::shared_ptr< RunAuxiliaryfillRunAuxiliary ()
 
void fillThisEventAuxiliary ()
 
void initializeDuplicateChecker (std::vector< std::shared_ptr< IndexIntoFile > > const &indexesIntoFiles, std::vector< std::shared_ptr< IndexIntoFile > >::size_type currentIndexIntoFile)
 
bool isDuplicateEvent ()
 
std::shared_ptr< ProductProvenanceRetrievermakeProductProvenanceRetriever (unsigned int iStreamIndex)
 
std::unique_ptr< MakeProvenanceReadermakeProvenanceReaderMaker (InputType inputType)
 
void markBranchToBeDropped (bool dropDescendants, BranchDescription const &branch, std::set< BranchID > &branchesToDrop, std::map< BranchID, BranchID > const &droppedToKeptAlias) const
 
std::string const & newBranchToOldBranch (std::string const &newBranch) const
 
void readEntryDescriptionTree (EntryDescriptionMap &entryDescriptionMap, InputType inputType)
 
void readEventHistoryTree ()
 
void readParentageTree (InputType inputType)
 
std::shared_ptr< RunAuxiliary const > savedRunAuxiliary () const
 
std::shared_ptr< RunAuxiliary > & savedRunAuxiliary ()
 
void setIfFastClonable (int remainingEvents, int remainingLumis)
 
bool skipThisEntry ()
 
RootTreePtrArraytreePointers ()
 
void validateFile (InputType inputType, bool usingGoToEvent)
 

Private Attributes

edm::propagate_const< std::shared_ptr< BranchChildren > > branchChildren_
 
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
 
std::shared_ptr< BranchIDLists const > branchIDLists_
 
BranchListIndexes branchListIndexes_
 
bool branchListIndexesUnchanged_
 
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
 
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
 
edm::propagate_const< TClass * > edProductClass_
 
EventAuxiliary eventAux_
 
edm::propagate_const< TTree * > eventHistoryTree_
 
std::vector< EventProcessHistoryIDeventProcessHistoryIDs_
 
std::vector< EventProcessHistoryID >::const_iterator eventProcessHistoryIter_
 
std::vector< edm::propagate_const< std::shared_ptr< ProductProvenanceRetriever > > > eventProductProvenanceRetrievers_
 
EventSelectionIDVector eventSelectionIDs_
 
edm::propagate_const< std::shared_ptr< EventSkipperByID > > eventSkipperByID_
 
RootTree eventTree_
 
FileID fid_
 
std::string const file_
 
FileFormatVersion fileFormatVersion_
 
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
 
edm::propagate_const< std::unique_ptr< ThinnedAssociationsHelper > > fileThinnedAssociationsHelper_
 
std::array< bool, NumBranchTypeshasNewlyDroppedBranch_
 
edm::propagate_const< std::unique_ptr< History > > history_
 
IndexIntoFileindexIntoFile_
 
IndexIntoFile::IndexIntoFileItr indexIntoFileBegin_
 
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
 
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
 
edm::propagate_const< std::shared_ptr< IndexIntoFile > > indexIntoFileSharedPtr_
 
IndexIntoFile::EntryNumber_t lastEventEntryNumberRead_
 
std::string const logicalFile_
 
RootTree lumiTree_
 
std::map< std::string, std::string > newBranchToOldBranch_
 
bool noEventSort_
 
std::vector< ProcessHistoryID > & orderedProcessHistoryIDs_
 
std::vector< ParentageIDparentageIDLookup_
 
ProcessConfiguration const & processConfiguration_
 
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
 
InputSource::ProcessingMode processingMode_
 
std::shared_ptr< ProductRegistry const > productRegistry_
 
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
 
edm::propagate_const< std::unique_ptr< MakeProvenanceReader > > provenanceReaderMaker_
 
edm::propagate_const< RunHelperBase * > runHelper_
 
RootTree runTree_
 
edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
 
bool skipAnyEvents_
 
edm::propagate_const< std::shared_ptr< ThinnedAssociationsHelper > > thinnedAssociationsHelper_
 
RootTreePtrArray treePointers_
 
int whyNotFastClonable_
 

Detailed Description

Definition at line 61 of file RootFile.h.

Member Typedef Documentation

Definition at line 63 of file RootFile.h.

Constructor & Destructor Documentation

edm::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 
)

Definition at line 130 of file RootFile.cc.

References edm::IndexIntoFile::begin(), branchChildren_, edm::poolNames::branchIDListBranchName(), branchIDListHelper_, branchIDLists_, branchListIndexesUnchanged_, edm::BranchDescription::branchName(), edm::BranchDescription::branchType(), edm::BranchTypeToAuxiliaryBranchName(), edm::BranchDescription::className(), edm::ProductRegistry::copyProduct(), daqProvenanceHelper_, edm::roottree::defaultNonEventCacheSize, edm::IndexIntoFile::doneFileInitialization(), dropOnInput(), edm::IndexIntoFile::end(), edm::errors::EventCorruption, edm::poolNames::eventHistoryBranchName(), eventProcessHistoryIDs_, eventProcessHistoryIter_, eventSkipperByID_, edm::FileBlock::EventsOrLumisSelectedByID, eventTree_, Exception, fid_, file(), fileFormatVersion(), fileFormatVersion_, edm::poolNames::fileFormatVersionBranchName(), edm::poolNames::fileIdentifierBranchName(), filePtr_, edm::errors::FileReadError, fileThinnedAssociationsHelper_, ghostTrackVertexReco_cff::finder, edm::IndexIntoFile::firstAppearanceOrder, edm::BranchDescription::friendlyClassName(), edm::friendlyname::friendlyName(), edm::roottree::getEntry(), hasNewlyDroppedBranch_, edm::FileFormatVersion::hasThinnedAssociations(), mps_fire::i, edm::poolNames::idToParameterSetBlobsBranchName(), indexIntoFile_, indexIntoFileBegin_, edm::poolNames::indexIntoFileBranchName(), indexIntoFileEnd_, indexIntoFileIter_, edm::InEvent, edm::BranchDescription::init(), initializeDuplicateChecker(), edm::InLumi, edm::InRun, edm::pset::Registry::insertMapped(), edm::pset::Registry::instance(), lumiTree_, makeProvenanceReaderMaker(), edm::poolNames::metaDataTreeName(), edm::poolNames::moduleDescriptionMapBranchName(), newBranchToOldBranch(), newBranchToOldBranch_, edm::IndexIntoFile::numericalOrder, edm::poolNames::parameterSetMapBranchName(), edm::poolNames::parameterSetsTreeName(), edm::Primary, edm::poolNames::processConfigurationBranchName(), edm::poolNames::processHistoryBranchName(), edm::poolNames::processHistoryMapBranchName(), parseEventContent::prod, edm::poolNames::productDependenciesBranchName(), edm::poolNames::productDescriptionBranchName(), edm::ProductRegistry::productList(), edm::ProductRegistry::productListUpdator(), productRegistry(), productRegistry_, provenanceAdaptor_, provenanceReaderMaker_, muonDTDigis_cfi::pset, readEventHistoryTree(), edm::ProcessHistoryRegistry::registerProcessHistory(), edm::RootTree::resetTraining(), edm::IndexIntoFile::IndexIntoFileItr::run(), runHelper_, runTree_, edm::SecondaryFile, edm::SecondarySource, setIfFastClonable(), edm::setRefCoreStreamer(), edm::source(), AlCaHLTBitMon_QueryRunRegistry::string, edm::poolNames::thinnedAssociationsHelperBranchName(), edm::RootTree::trainCache(), edm::roottree::trainCache(), treePointers_, edm::errors::UnimplementedFeature, edm::BranchDescription::updateFriendlyClassName(), validateFile(), and whyNotFastClonable_.

158  :
159  file_(fileName),
160  logicalFile_(logicalFileName),
161  processConfiguration_(processConfiguration),
162  processHistoryRegistry_(&processHistoryRegistry),
163  filePtr_(filePtr),
164  eventSkipperByID_(eventSkipperByID),
166  fid_(),
167  indexIntoFileSharedPtr_(new IndexIntoFile),
169  orderedProcessHistoryIDs_(orderedProcessHistoryIDs),
176  skipAnyEvents_(skipAnyEvents),
181  eventAux_(),
182  eventTree_(filePtr, InEvent, nStreams, treeMaxVirtualSize, treeCacheSize, roottree::defaultLearningEntries, enablePrefetching, inputType),
183  lumiTree_(filePtr, InLumi, 1, treeMaxVirtualSize, roottree::defaultNonEventCacheSize, roottree::defaultNonEventLearningEntries, enablePrefetching, inputType),
184  runTree_(filePtr, InRun, 1, treeMaxVirtualSize, roottree::defaultNonEventCacheSize, roottree::defaultNonEventLearningEntries, enablePrefetching, inputType),
185  treePointers_(),
188  branchIDLists_(),
191  thinnedAssociationsHelper_(thinnedAssociationsHelper),
192  processingMode_(processingMode),
193  runHelper_(runHelper),
195  eventHistoryTree_(nullptr),
198  history_(),
199  branchChildren_(new BranchChildren),
200  duplicateChecker_(duplicateChecker),
206  edProductClass_(TClass::GetClass("edm::WrapperBase")) {
207 
208  hasNewlyDroppedBranch_.fill(false);
209 
213 
214  // Read the metadata tree.
215  // We use a smart pointer so the tree will be deleted after use, and not kept for the life of the file.
216  std::unique_ptr<TTree> metaDataTree(dynamic_cast<TTree *>(filePtr_->Get(poolNames::metaDataTreeName().c_str())));
217  if(nullptr == metaDataTree.get()) {
218  throw Exception(errors::FileReadError) << "Could not find tree " << poolNames::metaDataTreeName()
219  << " in the input file.\n";
220  }
221 
222  // To keep things simple, we just read in every possible branch that exists.
223  // We don't pay attention to which branches exist in which file format versions
224 
225  FileFormatVersion *fftPtr = &fileFormatVersion_;
226  if(metaDataTree->FindBranch(poolNames::fileFormatVersionBranchName().c_str()) != nullptr) {
227  TBranch *fft = metaDataTree->GetBranch(poolNames::fileFormatVersionBranchName().c_str());
228  fft->SetAddress(&fftPtr);
229  roottree::getEntry(fft, 0);
230  metaDataTree->SetBranchAddress(poolNames::fileFormatVersionBranchName().c_str(), &fftPtr);
231  }
232 
233  FileID *fidPtr = &fid_;
234  if(metaDataTree->FindBranch(poolNames::fileIdentifierBranchName().c_str()) != nullptr) {
235  metaDataTree->SetBranchAddress(poolNames::fileIdentifierBranchName().c_str(), &fidPtr);
236  }
237 
238  IndexIntoFile *iifPtr = &indexIntoFile_;
239  if(metaDataTree->FindBranch(poolNames::indexIntoFileBranchName().c_str()) != nullptr) {
240  metaDataTree->SetBranchAddress(poolNames::indexIntoFileBranchName().c_str(), &iifPtr);
241  }
242 
243  // Need to read to a temporary registry so we can do a translation of the BranchKeys.
244  // This preserves backward compatibility against friendly class name algorithm changes.
245  ProductRegistry inputProdDescReg;
246  ProductRegistry *ppReg = &inputProdDescReg;
247  metaDataTree->SetBranchAddress(poolNames::productDescriptionBranchName().c_str(), (&ppReg));
248 
249  typedef std::map<ParameterSetID, ParameterSetBlob> PsetMap;
250  PsetMap psetMap;
251  PsetMap *psetMapPtr = &psetMap;
252  if(metaDataTree->FindBranch(poolNames::parameterSetMapBranchName().c_str()) != nullptr) {
253  //backward compatibility
254  assert(!fileFormatVersion().parameterSetsTree());
255  metaDataTree->SetBranchAddress(poolNames::parameterSetMapBranchName().c_str(), &psetMapPtr);
256  } else {
257  assert(fileFormatVersion().parameterSetsTree());
258  // We use a smart pointer so the tree will be deleted after use, and not kept for the life of the file.
259  std::unique_ptr<TTree> psetTree(dynamic_cast<TTree *>(filePtr_->Get(poolNames::parameterSetsTreeName().c_str())));
260  if(nullptr == psetTree.get()) {
261  throw Exception(errors::FileReadError) << "Could not find tree " << poolNames::parameterSetsTreeName()
262  << " in the input file.\n";
263  }
264 
265  typedef std::pair<ParameterSetID, ParameterSetBlob> IdToBlobs;
266  IdToBlobs idToBlob;
267  IdToBlobs* pIdToBlob = &idToBlob;
268  psetTree->SetBranchAddress(poolNames::idToParameterSetBlobsBranchName().c_str(), &pIdToBlob);
269 
270  std::unique_ptr<TTreeCache> psetTreeCache = roottree::trainCache(psetTree.get(), *filePtr_, roottree::defaultNonEventCacheSize, "*");
271  psetTreeCache->SetEnablePrefetching(false);
272  filePtr_->SetCacheRead(psetTreeCache.get());
273  for(Long64_t i = 0; i != psetTree->GetEntries(); ++i) {
274  psetTree->GetEntry(i);
275  psetMap.insert(idToBlob);
276  }
277  filePtr_->SetCacheRead(0);
278  }
279 
280  // backward compatibility
282  ProcessHistoryRegistry::collection_type *pHistMapPtr = &pHistMap;
283  if(metaDataTree->FindBranch(poolNames::processHistoryMapBranchName().c_str()) != nullptr) {
284  metaDataTree->SetBranchAddress(poolNames::processHistoryMapBranchName().c_str(), &pHistMapPtr);
285  }
286 
288  ProcessHistoryRegistry::vector_type *pHistVectorPtr = &pHistVector;
289  if(metaDataTree->FindBranch(poolNames::processHistoryBranchName().c_str()) != nullptr) {
290  metaDataTree->SetBranchAddress(poolNames::processHistoryBranchName().c_str(), &pHistVectorPtr);
291  }
292 
293  // backward compatibility
294  ProcessConfigurationVector processConfigurations;
295  ProcessConfigurationVector* procConfigVectorPtr = &processConfigurations;
296  if(metaDataTree->FindBranch(poolNames::processConfigurationBranchName().c_str()) != nullptr) {
297  metaDataTree->SetBranchAddress(poolNames::processConfigurationBranchName().c_str(), &procConfigVectorPtr);
298  }
299 
300  auto branchIDListsAPtr = std::make_unique<BranchIDLists>();
301  BranchIDLists* branchIDListsPtr = branchIDListsAPtr.get();
302  if(metaDataTree->FindBranch(poolNames::branchIDListBranchName().c_str()) != nullptr) {
303  metaDataTree->SetBranchAddress(poolNames::branchIDListBranchName().c_str(), &branchIDListsPtr);
304  }
305 
306  if(inputType != InputType::SecondarySource) {
307  fileThinnedAssociationsHelper_ = std::make_unique<ThinnedAssociationsHelper>(); // propagate_const<T> has no reset() function
308  ThinnedAssociationsHelper* thinnedAssociationsHelperPtr = fileThinnedAssociationsHelper_.get();
309  if(metaDataTree->FindBranch(poolNames::thinnedAssociationsHelperBranchName().c_str()) != nullptr) {
310  metaDataTree->SetBranchAddress(poolNames::thinnedAssociationsHelperBranchName().c_str(), &thinnedAssociationsHelperPtr);
311  }
312  }
313 
314  BranchChildren* branchChildrenBuffer = branchChildren_.get();
315  if(metaDataTree->FindBranch(poolNames::productDependenciesBranchName().c_str()) != nullptr) {
316  metaDataTree->SetBranchAddress(poolNames::productDependenciesBranchName().c_str(), &branchChildrenBuffer);
317  }
318 
319  // backward compatibility
320  std::vector<EventProcessHistoryID> *eventHistoryIDsPtr = &eventProcessHistoryIDs_;
321  if(metaDataTree->FindBranch(poolNames::eventHistoryBranchName().c_str()) != nullptr) {
322  metaDataTree->SetBranchAddress(poolNames::eventHistoryBranchName().c_str(), &eventHistoryIDsPtr);
323  }
324 
325  if(metaDataTree->FindBranch(poolNames::moduleDescriptionMapBranchName().c_str()) != nullptr) {
326  if(metaDataTree->GetBranch(poolNames::moduleDescriptionMapBranchName().c_str())->GetSplitLevel() != 0) {
327  metaDataTree->SetBranchStatus((poolNames::moduleDescriptionMapBranchName() + ".*").c_str(), 0);
328  } else {
329  metaDataTree->SetBranchStatus(poolNames::moduleDescriptionMapBranchName().c_str(), 0);
330  }
331  }
332 
333  // Here we read the metadata tree
334  roottree::getEntry(metaDataTree.get(), 0);
335 
337 
338  // Here we read the event history tree, if we have one.
340 
342  if(!fileFormatVersion().triggerPathsTracked()) {
343  ParameterSetConverter converter(psetMap, psetIdConverter, fileFormatVersion().parameterSetsByReference());
344  } else {
345  // Merge into the parameter set registry.
346  pset::Registry& psetRegistry = *pset::Registry::instance();
347  for(auto const& psetEntry : psetMap) {
348  ParameterSet pset(psetEntry.second.pset());
349  pset.setID(psetEntry.first);
350  // For thread safety, don't update global registries when a secondary source opens a file.
351  if(inputType != InputType::SecondarySource) {
352  psetRegistry.insertMapped(pset);
353  }
354  }
355  }
356  if(!fileFormatVersion().splitProductIDs()) {
357  // Old provenance format input file. Create a provenance adaptor.
358  // propagate_const<T> has no reset() function
359  provenanceAdaptor_ = std::make_unique<ProvenanceAdaptor>(
360  inputProdDescReg, pHistMap, pHistVector, processConfigurations, psetIdConverter, true);
361  // Fill in the branchIDLists branch from the provenance adaptor
362  branchIDLists_ = provenanceAdaptor_->branchIDLists();
363  } else {
364  if(!fileFormatVersion().triggerPathsTracked()) {
365  // New provenance format, but change in ParameterSet Format. Create a provenance adaptor.
366  // propagate_const<T> has no reset() function
367  provenanceAdaptor_ = std::make_unique<ProvenanceAdaptor>(
368  inputProdDescReg, pHistMap, pHistVector, processConfigurations, psetIdConverter, false);
369  }
370  // New provenance format input file. The branchIDLists branch was read directly from the input file.
371  if(metaDataTree->FindBranch(poolNames::branchIDListBranchName().c_str()) == nullptr) {
373  << "Failed to find branchIDLists branch in metaData tree.\n";
374  }
375  branchIDLists_.reset(branchIDListsAPtr.release());
376  }
377 
379  if(metaDataTree->FindBranch(poolNames::thinnedAssociationsHelperBranchName().c_str()) == nullptr) {
381  << "Failed to find thinnedAssociationsHelper branch in metaData tree.\n";
382  }
383  }
384 
385  if(!bypassVersionCheck) {
386  checkReleaseVersion(pHistVector, file());
387  }
388 
389  if(labelRawDataLikeMC) {
390  std::string const rawData("FEDRawDataCollection");
391  std::string const source("source");
392  ProductRegistry::ProductList& pList = inputProdDescReg.productListUpdator();
393  BranchKey finder(rawData, source, "", "");
394  ProductRegistry::ProductList::iterator it = pList.lower_bound(finder);
395  if(it != pList.end() && it->first.friendlyClassName() == rawData && it->first.moduleLabel() == source) {
396  // We found raw data with a module label of source.
397  // We need to change the module label and process name.
398  // Create helper.
399  it->second.init();
400  // propagate_const<T> has no reset() function
401  daqProvenanceHelper_ = std::make_unique<DaqProvenanceHelper>(it->second.unwrappedTypeID());
402  // Create the new branch description
403  BranchDescription const& newBD = daqProvenanceHelper_->branchDescription();
404  // Save info from the old and new branch descriptions
405  daqProvenanceHelper_->saveInfo(it->second, newBD);
406  // Map the new branch name to the old branch name.
407  newBranchToOldBranch_.insert(std::make_pair(newBD.branchName(), it->second.branchName()));
408  // Remove the old branch description from the product Registry.
409  pList.erase(it);
410  // Check that there was only one.
411  it = pList.lower_bound(finder);
412  assert(!(it != pList.end() && it->first.friendlyClassName() == rawData && it->first.moduleLabel() == source));
413  // Insert the new branch description into the product registry.
414  inputProdDescReg.copyProduct(newBD);
415  // Fix up other per file metadata.
416  daqProvenanceHelper_->fixMetaData(processConfigurations, pHistVector);
417  daqProvenanceHelper_->fixMetaData(*branchIDLists_);
418  daqProvenanceHelper_->fixMetaData(*branchChildren_);
419  }
420  }
421 
422  for(auto const& history : pHistVector) {
423  processHistoryRegistry.registerProcessHistory(history);
424  }
425 
427 
428  // Update the branch id info. This has to be done before validateFile since
429  // depending on the file format, the branchIDListHelper_ may have its fixBranchListIndexes call made
430  if(inputType == InputType::Primary) {
431  branchListIndexesUnchanged_ = branchIDListHelper_->updateFromInput(*branchIDLists_);
432  }
433 
434  validateFile(inputType, usingGoToEvent);
435 
436  // Here, we make the class that will make the ProvenanceReader
437  // It reads whatever trees it needs.
438  // propagate_const<T> has no reset() function
439  provenanceReaderMaker_ = std::unique_ptr<MakeProvenanceReader>(makeProvenanceReaderMaker(inputType).release());
440 
441  // Merge into the hashed registries.
442  if(eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
444  }
445 
446  initializeDuplicateChecker(indexesIntoFiles, currentIndexIntoFile);
450  eventProcessHistoryIter_ = eventProcessHistoryIDs_.begin();
451 
452  // Set product presence information in the product registry.
453  ProductRegistry::ProductList& pList = inputProdDescReg.productListUpdator();
454  for(auto& product : pList) {
455  BranchDescription& prod = product.second;
456  prod.init();
457  treePointers_[prod.branchType()]->setPresence(prod, newBranchToOldBranch(prod.branchName()));
458  }
459 
460  auto newReg = std::make_unique<ProductRegistry>();
461 
462  // Do the translation from the old registry to the new one
463  {
464  ProductRegistry::ProductList const& prodList = inputProdDescReg.productList();
465  for(auto const& product : prodList) {
466  BranchDescription const& prod = product.second;
467  std::string newFriendlyName = friendlyname::friendlyName(prod.className());
468  if(newFriendlyName == prod.friendlyClassName()) {
469  newReg->copyProduct(prod);
470  } else {
471  if(fileFormatVersion().splitProductIDs()) {
473  << "Cannot change friendly class name algorithm without more development work\n"
474  << "to update BranchIDLists and ThinnedAssociationsHelper. Contact the framework group.\n";
475  }
476  BranchDescription newBD(prod);
477  newBD.updateFriendlyClassName();
478  newReg->copyProduct(newBD);
479  newBranchToOldBranch_.insert(std::make_pair(newBD.branchName(), prod.branchName()));
480  }
481  }
482  dropOnInput(*newReg, productSelectorRules, dropDescendants, inputType);
483  if(inputType == InputType::SecondaryFile) {
484  thinnedAssociationsHelper->updateFromSecondaryInput(*fileThinnedAssociationsHelper_,
485  *associationsFromSecondary);
486  } else if (inputType == InputType::Primary) {
487  thinnedAssociationsHelper->updateFromPrimaryInput(*fileThinnedAssociationsHelper_);
488  }
489  // freeze the product registry
490  newReg->setFrozen(inputType != InputType::Primary);
491  productRegistry_.reset(newReg.release());
492  }
493 
494  // Set up information from the product registry.
495  ProductRegistry::ProductList const& prodList = productRegistry()->productList();
496  for(auto const& product : prodList) {
497  BranchDescription const& prod = product.second;
498  treePointers_[prod.branchType()]->addBranch(product.first, prod,
499  newBranchToOldBranch(prod.branchName()));
500  }
501 
502  // Determine if this file is fast clonable.
503  setIfFastClonable(remainingEvents, remainingLumis);
504 
505  setRefCoreStreamer(true); // backward compatibility
506 
507  // We are done with our initial reading of EventAuxiliary.
509 
510  // Tell the event tree to begin training at the next read.
512 
513  // Train the run and lumi trees.
514  runTree_.trainCache("*");
515  lumiTree_.trainCache("*");
516  }
void dropOnInput(ProductRegistry &reg, ProductSelectorRules const &rules, bool dropDescendants, InputType inputType)
Definition: RootFile.cc:1672
Int_t getEntry(TBranch *branch, EntryNumber entryNumber)
Definition: RootTree.cc:471
std::string const & idToParameterSetBlobsBranchName()
Definition: BranchType.cc:255
edm::propagate_const< std::unique_ptr< ThinnedAssociationsHelper > > fileThinnedAssociationsHelper_
Definition: RootFile.h:284
std::vector< ProcessConfiguration > ProcessConfigurationVector
std::string const & BranchTypeToAuxiliaryBranchName(BranchType const &branchType)
Definition: BranchType.cc:115
unsigned int const defaultNonEventLearningEntries
Definition: RootTree.h:48
void doneFileInitialization() const
Clears the temporary vector of event numbers to reduce memory usage.
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
std::shared_ptr< BranchIDLists const > branchIDLists_
Definition: RootFile.h:282
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:294
std::shared_ptr< BranchIDListHelper const > branchIDListHelper() const
Definition: RootFile.h:207
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
static std::string const source("source")
int whyNotFastClonable_
Definition: RootFile.h:272
edm::propagate_const< std::shared_ptr< EventSkipperByID > > eventSkipperByID_
Definition: RootFile.h:258
edm::propagate_const< std::shared_ptr< ThinnedAssociationsHelper > > thinnedAssociationsHelper_
Definition: RootFile.h:285
std::map< std::string, std::string > newBranchToOldBranch_
Definition: RootFile.h:288
std::map< BranchKey, BranchDescription > ProductList
edm::propagate_const< std::shared_ptr< IndexIntoFile > > indexIntoFileSharedPtr_
Definition: RootFile.h:261
RootTree lumiTree_
Definition: RootFile.h:277
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:256
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:269
void setRefCoreStreamer(bool resetAll=false)
std::string const & fileFormatVersionBranchName()
Definition: BranchType.cc:218
IndexIntoFileItr begin(SortOrder sortOrder) const
InputSource::ProcessingMode processingMode_
Definition: RootFile.h:286
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
void trainCache(char const *branchNames)
Definition: RootTree.cc:432
std::shared_ptr< ProductRegistry const > productRegistry() const
Definition: RootFile.h:167
edm::propagate_const< TClass * > edProductClass_
Definition: RootFile.h:300
FileFormatVersion fileFormatVersion_
Definition: RootFile.h:259
std::string const & parameterSetsTreeName()
Definition: BranchType.cc:251
std::vector< edm::propagate_const< std::shared_ptr< ProductProvenanceRetriever > > > eventProductProvenanceRetrievers_
Definition: RootFile.h:297
std::vector< EventProcessHistoryID >::const_iterator eventProcessHistoryIter_
Definition: RootFile.h:268
FileID fid_
Definition: RootFile.h:260
std::string const logicalFile_
Definition: RootFile.h:254
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
std::string const & processHistoryMapBranchName()
Definition: BranchType.cc:193
bool noEventSort_
Definition: RootFile.h:271
std::string friendlyName(std::string const &iFullName)
IndexIntoFile::EntryNumber_t lastEventEntryNumberRead_
Definition: RootFile.h:280
std::string const & indexIntoFileBranchName()
Definition: BranchType.cc:233
IndexIntoFileItr end(SortOrder sortOrder) const
Used to end an iteration over the Runs, Lumis, and Events in a file.
std::string const & eventHistoryBranchName()
Definition: BranchType.cc:238
EventSelectionIDVector eventSelectionIDs_
Definition: RootFile.h:290
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
Definition: RootFile.h:295
bool skipAnyEvents_
Definition: RootFile.h:270
RootTree eventTree_
Definition: RootFile.h:276
std::map< ParameterSetID, ParameterSetID > ParameterSetIdConverter
BranchListIndexes branchListIndexes_
Definition: RootFile.h:291
std::string const & metaDataTreeName()
Definition: BranchType.cc:168
std::string const & parameterSetMapBranchName()
Definition: BranchType.cc:183
edm::propagate_const< std::unique_ptr< History > > history_
Definition: RootFile.h:292
std::string const & processHistoryBranchName()
Definition: BranchType.cc:198
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
RootTree runTree_
Definition: RootFile.h:278
edm::propagate_const< std::unique_ptr< MakeProvenanceReader > > provenanceReaderMaker_
Definition: RootFile.h:296
std::array< bool, NumBranchTypes > hasNewlyDroppedBranch_
Definition: RootFile.h:273
static EntryNumber_t const invalidEntry
ProcessConfiguration const & processConfiguration_
Definition: RootFile.h:255
std::shared_ptr< ProductRegistry const > productRegistry_
Definition: RootFile.h:281
void setIfFastClonable(int remainingEvents, int remainingLumis)
Definition: RootFile.cc:604
edm::propagate_const< std::shared_ptr< BranchChildren > > branchChildren_
Definition: RootFile.h:293
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:257
std::string const & file() const
Definition: RootFile.h:166
std::string const & productDescriptionBranchName()
Definition: BranchType.cc:173
std::string const & processConfigurationBranchName()
Definition: BranchType.cc:203
IndexIntoFile::IndexIntoFileItr indexIntoFileBegin_
Definition: RootFile.h:264
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:287
bool branchListIndexesUnchanged_
Definition: RootFile.h:274
edm::propagate_const< TTree * > eventHistoryTree_
Definition: RootFile.h:289
unsigned int const defaultNonEventCacheSize
Definition: RootTree.h:46
RootTreePtrArray treePointers_
Definition: RootFile.h:279
void initializeDuplicateChecker(std::vector< std::shared_ptr< IndexIntoFile > > const &indexesIntoFiles, std::vector< std::shared_ptr< IndexIntoFile > >::size_type currentIndexIntoFile)
Definition: RootFile.cc:1646
std::vector< ProcessHistoryID > & orderedProcessHistoryIDs_
Definition: RootFile.h:263
std::string const & productDependenciesBranchName()
Definition: BranchType.cc:178
std::string const & thinnedAssociationsHelperBranchName()
Definition: BranchType.cc:213
std::unique_ptr< MakeProvenanceReader > makeProvenanceReaderMaker(InputType inputType)
Definition: RootFile.cc:1803
std::string const & branchIDListBranchName()
Definition: BranchType.cc:208
std::vector< ParentageID > parentageIDLookup_
Definition: RootFile.h:298
EventAuxiliary eventAux_
Definition: RootFile.h:275
void resetTraining()
Definition: RootTree.h:161
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
Definition: RootFile.h:283
void validateFile(InputType inputType, bool usingGoToEvent)
Definition: RootFile.cc:1092
std::string const & newBranchToOldBranch(std::string const &newBranch) const
Definition: RootFile.cc:667
std::unique_ptr< TTreeCache > trainCache(TTree *tree, InputFile &file, unsigned int cacheSize, char const *branchNames)
Definition: RootTree.cc:495
unsigned int const defaultLearningEntries
Definition: RootTree.h:47
bool hasThinnedAssociations() const
std::string const & fileIdentifierBranchName()
Definition: BranchType.cc:223
std::string const & moduleDescriptionMapBranchName()
Definition: BranchType.cc:188
std::string const file_
Definition: RootFile.h:253
std::vector< EventProcessHistoryID > eventProcessHistoryIDs_
Definition: RootFile.h:267
static Registry * instance()
Definition: Registry.cc:12
void readEventHistoryTree()
Definition: RootFile.cc:1633
edm::RootFile::RootFile ( std::string const &  fileName,
ProcessConfiguration const &  processConfiguration,
std::string const &  logicalFileName,
std::shared_ptr< InputFile filePtr,
unsigned int  nStreams,
int  treeMaxVirtualSize,
InputSource::ProcessingMode  processingMode,
RunHelperBase runHelper,
ProductSelectorRules const &  productSelectorRules,
InputType  inputType,
std::shared_ptr< BranchIDListHelper branchIDListHelper,
std::shared_ptr< ThinnedAssociationsHelper thinnedAssociationsHelper,
std::vector< BranchID > const *  associationsFromSecondary,
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  enablePrefetching 
)
inline

Definition at line 94 of file RootFile.h.

114  : RootFile(
115  fileName, processConfiguration, logicalFileName, filePtr,
116  nullptr, false, -1, -1, nStreams, 0U, treeMaxVirtualSize,
117  processingMode, runHelper,
118  false, productSelectorRules, inputType, branchIDListHelper,
119  thinnedAssociationsHelper, associationsFromSecondary,
120  nullptr, dropDescendantsOfDroppedProducts, processHistoryRegistry,
121  indexesIntoFiles, currentIndexIntoFile, orderedProcessHistoryIDs,
122  bypassVersionCheck, labelRawDataLikeMC,
123  false, enablePrefetching) {}
std::shared_ptr< BranchIDListHelper const > branchIDListHelper() const
Definition: RootFile.h:207
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)
Definition: RootFile.cc:130
edm::RootFile::RootFile ( std::string const &  fileName,
ProcessConfiguration const &  processConfiguration,
std::string const &  logicalFileName,
std::shared_ptr< InputFile filePtr,
unsigned int  nStreams,
unsigned int  treeCacheSize,
int  treeMaxVirtualSize,
RunHelperBase runHelper,
ProductSelectorRules const &  productSelectorRules,
InputType  inputType,
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  enablePrefetching 
)
inline

Definition at line 125 of file RootFile.h.

References helperFunctions::cache(), and AlCaHLTBitMon_QueryRunRegistry::string.

140  : RootFile(
141  fileName, processConfiguration, logicalFileName, filePtr,
142  nullptr, false, -1, -1, nStreams, treeCacheSize, treeMaxVirtualSize,
144  false, productSelectorRules, inputType, nullptr, nullptr,
145  nullptr, nullptr, false, processHistoryRegistry,
146  indexesIntoFiles, currentIndexIntoFile, orderedProcessHistoryIDs,
147  bypassVersionCheck, false,
148  false, enablePrefetching) {}
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)
Definition: RootFile.cc:130
edm::RootFile::~RootFile ( )

Definition at line 518 of file RootFile.cc.

518  {
519  }
edm::RootFile::RootFile ( RootFile const &  )
delete

Member Function Documentation

std::shared_ptr<BranchChildren const> edm::RootFile::branchChildren ( ) const
inlineprivate

Definition at line 247 of file RootFile.h.

References edm::get_underlying_safe().

Referenced by createFileBlock().

std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< std::shared_ptr< BranchChildren > > branchChildren_
Definition: RootFile.h:293
std::shared_ptr<BranchChildren>& edm::RootFile::branchChildren ( )
inlineprivate

Definition at line 248 of file RootFile.h.

References edm::get_underlying_safe().

std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< std::shared_ptr< BranchChildren > > branchChildren_
Definition: RootFile.h:293
std::shared_ptr<BranchIDListHelper const> edm::RootFile::branchIDListHelper ( ) const
inline

Definition at line 207 of file RootFile.h.

References edm::get_underlying_safe().

std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
Definition: RootFile.h:283
std::shared_ptr<BranchIDListHelper>& edm::RootFile::branchIDListHelper ( )
inline

Definition at line 208 of file RootFile.h.

References edm::get_underlying_safe().

std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
Definition: RootFile.h:283
bool edm::RootFile::branchListIndexesUnchanged ( ) const
inline

Definition at line 179 of file RootFile.h.

Referenced by createFileBlock().

bool branchListIndexesUnchanged_
Definition: RootFile.h:274
void edm::RootFile::close ( void  )

Definition at line 1153 of file RootFile.cc.

References eventHistoryTree_, filePtr_, and treePointers_.

Referenced by lumiQTWidget.ApplicationWindow::fileQuit(), esMonitoring.AsyncLineReaderMixin::handle_close(), esMonitoring.FDJsonServer::handle_close(), Vispa.Gui.BoxContentDialog.BoxContentDialog::keyPressEvent(), and Vispa.Gui.FindDialog.FindDialog::keyPressEvent().

1153  {
1154  // Just to play it safe, zero all pointers to objects in the InputFile to be closed.
1155  eventHistoryTree_ = nullptr;
1156  for(auto& treePointer : treePointers_) {
1157  treePointer->close();
1158  treePointer = nullptr;
1159  }
1160  filePtr_->Close();
1161  filePtr_ = nullptr; // propagate_const<T> has no reset() function
1162  }
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:257
edm::propagate_const< TTree * > eventHistoryTree_
Definition: RootFile.h:289
RootTreePtrArray treePointers_
Definition: RootFile.h:279
bool edm::RootFile::containsItem ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi,
EventNumber_t  event 
) const

Definition at line 746 of file RootFile.cc.

References edm::IndexIntoFile::containsItem(), and indexIntoFile_.

746  {
748  }
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
bool containsItem(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
Definition: event.py:1
std::unique_ptr< FileBlock > edm::RootFile::createFileBlock ( ) const

Definition at line 650 of file RootFile.cc.

References branchChildren(), branchListIndexesUnchanged(), eventTree_, file_, fileFormatVersion(), hasNewlyDroppedBranch(), lumiTree_, edm::RootTree::metaTree(), modifiedIDs(), runTree_, AlCaHLTBitMon_QueryRunRegistry::string, edm::RootTree::tree(), and whyNotFastClonable().

650  {
651  return std::make_unique<FileBlock>(fileFormatVersion(),
652  eventTree_.tree(),
654  lumiTree_.tree(),
656  runTree_.tree(),
657  runTree_.metaTree(),
660  file_,
662  modifiedIDs(),
663  branchChildren());
664  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
bool branchListIndexesUnchanged() const
Definition: RootFile.h:179
RootTree lumiTree_
Definition: RootFile.h:277
TTree const * metaTree() const
Definition: RootTree.h:151
TTree const * tree() const
Definition: RootTree.h:149
bool modifiedIDs() const
Definition: RootFile.h:180
int whyNotFastClonable() const
Definition: RootFile.h:177
RootTree eventTree_
Definition: RootFile.h:276
std::array< bool, NumBranchTypes > const & hasNewlyDroppedBranch() const
Definition: RootFile.h:178
RootTree runTree_
Definition: RootFile.h:278
std::shared_ptr< BranchChildren const > branchChildren() const
Definition: RootFile.h:247
std::string const file_
Definition: RootFile.h:253
void edm::RootFile::dropOnInput ( ProductRegistry reg,
ProductSelectorRules const &  rules,
bool  dropDescendants,
InputType  inputType 
)
private

Definition at line 1672 of file RootFile.cc.

References edm::ProductRegistry::allBranchDescriptions(), TrackValidation_cff::association, edm::BranchDescription::branchID(), edm::BranchDescription::branchName(), edm::BranchDescription::branchType(), SimDataFormats::CaloAnalysis::cp, drop, edm::BranchDescription::dropped(), edProductClass_, file_, fileThinnedAssociationsHelper_, edm::getWrapperBasePtr(), hasNewlyDroppedBranch_, edm::InEvent, edm::ProductSelector::initialize(), markBranchToBeDropped(), newBranchToOldBranch(), PFRecoTauDiscriminationByIsolation_cfi::offset, edm::BranchDescription::originalBranchID(), AlCaHLTBitMon_ParallelJobs::p, edm::BranchDescription::present(), parseEventContent::prod, edm::ProductRegistry::productListUpdator(), edm::SecondaryFile, edm::SecondarySource, edm::ProductSelector::selected(), groupFilesInBlocks::temp, treePointers_, edm::BranchDescription::unwrappedType(), and edm::BranchDescription::wrappedName().

Referenced by RootFile().

1672  {
1673 
1674  // This is the selector for drop on input.
1675  ProductSelector productSelector;
1676  productSelector.initialize(rules, reg.allBranchDescriptions());
1677 
1678  std::vector<BranchDescription const*> associationDescriptions;
1679 
1680  ProductRegistry::ProductList& prodList = reg.productListUpdator();
1681  // Do drop on input. On the first pass, just fill in a set of branches to be dropped.
1682  std::set<BranchID> branchesToDrop;
1683  std::map<BranchID, BranchID> droppedToKeptAlias;
1684  for(auto const& product : prodList) {
1685  BranchDescription const& prod = product.second;
1686  if (prod.branchID() != prod.originalBranchID() && prod.present()) {
1687  droppedToKeptAlias[prod.originalBranchID()] = prod.branchID();
1688  }
1689  }
1690  for(auto const& product : prodList) {
1691  BranchDescription const& prod = product.second;
1692  // Special handling for ThinnedAssociations
1693  if(prod.unwrappedType() == typeid(ThinnedAssociation) && prod.present()) {
1694  if(inputType != InputType::SecondarySource) {
1695  associationDescriptions.push_back(&prod);
1696  } else {
1697  markBranchToBeDropped(dropDescendants, prod, branchesToDrop, droppedToKeptAlias);
1698  }
1699  } else if(!productSelector.selected(prod)) {
1700  markBranchToBeDropped(dropDescendants, prod, branchesToDrop, droppedToKeptAlias);
1701  }
1702  }
1703 
1704  if(inputType != InputType::SecondarySource) {
1705 
1706  // Decide whether to keep the thinned associations and corresponding
1707  // entries in the helper. For secondary source they are all dropped,
1708  // but in other cases we look for thinned collections the associations
1709  // redirect a Ref or Ptr to when dereferencing them.
1710 
1711  // Need a list of kept products in order to determine which thinned associations
1712  // are kept.
1713  std::set<BranchID> keptProductsInEvent;
1714  for(auto const& product : prodList) {
1715  BranchDescription const& prod = product.second;
1716  if( branchesToDrop.find(prod.branchID()) == branchesToDrop.end() &&
1717  prod.present() &&
1718  prod.branchType() == InEvent) {
1719  keptProductsInEvent.insert(prod.branchID());
1720  }
1721  }
1722 
1723  // Decide which ThinnedAssociations to keep and store the decision in keepAssociation
1724  std::map<BranchID, bool> keepAssociation;
1725  fileThinnedAssociationsHelper_->selectAssociationProducts(associationDescriptions,
1726  keptProductsInEvent,
1727  keepAssociation);
1728 
1729  for(auto association : associationDescriptions) {
1730  if(!keepAssociation[association->branchID()]) {
1731  markBranchToBeDropped(dropDescendants, *association, branchesToDrop, droppedToKeptAlias);
1732  }
1733  }
1734 
1735  // Also delete the dropped associations from the ThinnedAssociationsHelper
1736  auto temp = std::make_unique<ThinnedAssociationsHelper>();
1737  for(auto const& associationBranches : fileThinnedAssociationsHelper_->data()) {
1738  auto iter = keepAssociation.find(associationBranches.association());
1739  if(iter != keepAssociation.end() && iter->second) {
1740  temp->addAssociation(associationBranches);
1741  }
1742  }
1743  // propagate_const<T> has no reset() function
1744  fileThinnedAssociationsHelper_ = std::unique_ptr<ThinnedAssociationsHelper>(temp.release());
1745  }
1746 
1747  // On this pass, actually drop the branches.
1748  std::set<BranchID>::const_iterator branchesToDropEnd = branchesToDrop.end();
1749  for(ProductRegistry::ProductList::iterator it = prodList.begin(), itEnd = prodList.end(); it != itEnd;) {
1750  BranchDescription const& prod = it->second;
1751  bool drop = branchesToDrop.find(prod.branchID()) != branchesToDropEnd;
1752  if(drop) {
1753  if(!prod.dropped()) {
1754  if(productSelector.selected(prod) && prod.unwrappedType() != typeid(ThinnedAssociation)) {
1755  LogWarning("RootFile")
1756  << "Branch '" << prod.branchName() << "' is being dropped from the input\n"
1757  << "of file '" << file_ << "' because it is dependent on a branch\n"
1758  << "that was explicitly dropped.\n";
1759  }
1760  treePointers_[prod.branchType()]->dropBranch(newBranchToOldBranch(prod.branchName()));
1761  hasNewlyDroppedBranch_[prod.branchType()] = true;
1762  }
1763  ProductRegistry::ProductList::iterator icopy = it;
1764  ++it;
1765  prodList.erase(icopy);
1766  } else {
1767  ++it;
1768  }
1769  }
1770 
1771  // Drop on input mergeable run and lumi products, this needs to be invoked for secondary file input
1772  if(inputType == InputType::SecondaryFile) {
1773  TString tString;
1774  for(ProductRegistry::ProductList::iterator it = prodList.begin(), itEnd = prodList.end(); it != itEnd;) {
1775  BranchDescription const& prod = it->second;
1776  if(prod.branchType() != InEvent) {
1777  TClass* cp = TClass::GetClass(prod.wrappedName().c_str());
1778  void* p = cp->New();
1779  int offset = cp->GetBaseClassOffset(edProductClass_);
1780  std::unique_ptr<WrapperBase> edp = getWrapperBasePtr(p, offset);
1781  if(edp->isMergeable()) {
1782  treePointers_[prod.branchType()]->dropBranch(newBranchToOldBranch(prod.branchName()));
1783  ProductRegistry::ProductList::iterator icopy = it;
1784  ++it;
1785  prodList.erase(icopy);
1786  } else {
1787  ++it;
1788  }
1789  }
1790  else ++it;
1791  }
1792  }
1793  }
edm::propagate_const< std::unique_ptr< ThinnedAssociationsHelper > > fileThinnedAssociationsHelper_
Definition: RootFile.h:284
std::map< BranchKey, BranchDescription > ProductList
edm::propagate_const< TClass * > edProductClass_
Definition: RootFile.h:300
const int drop
std::array< bool, NumBranchTypes > hasNewlyDroppedBranch_
Definition: RootFile.h:273
RootTreePtrArray treePointers_
Definition: RootFile.h:279
std::unique_ptr< WrapperBase > getWrapperBasePtr(void *p, int offset)
std::string const & newBranchToOldBranch(std::string const &newBranch) const
Definition: RootFile.cc:667
void markBranchToBeDropped(bool dropDescendants, BranchDescription const &branch, std::set< BranchID > &branchesToDrop, std::map< BranchID, BranchID > const &droppedToKeptAlias) const
Definition: RootFile.cc:1662
std::string const file_
Definition: RootFile.h:253
EventAuxiliary const& edm::RootFile::eventAux ( ) const
inline
EventID const& edm::RootFile::eventID ( ) const
inline

Definition at line 172 of file RootFile.h.

172 {return eventAux().id();}
EventAuxiliary const & eventAux() const
Definition: RootFile.h:168
EventID const & id() const
std::shared_ptr<ProductProvenanceRetriever const> edm::RootFile::eventProductProvenanceRetriever ( size_t  index) const
inlineprivate

Definition at line 250 of file RootFile.h.

References edm::get_underlying_safe().

Referenced by makeProductProvenanceRetriever().

std::vector< edm::propagate_const< std::shared_ptr< ProductProvenanceRetriever > > > eventProductProvenanceRetrievers_
Definition: RootFile.h:297
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
std::shared_ptr<ProductProvenanceRetriever>& edm::RootFile::eventProductProvenanceRetriever ( size_t  index)
inlineprivate

Definition at line 251 of file RootFile.h.

References edm::get_underlying_safe().

std::vector< edm::propagate_const< std::shared_ptr< ProductProvenanceRetriever > > > eventProductProvenanceRetrievers_
Definition: RootFile.h:297
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
RootTree const& edm::RootFile::eventTree ( ) const
inline

Definition at line 173 of file RootFile.h.

173 {return eventTree_;}
RootTree eventTree_
Definition: RootFile.h:276
std::string const& edm::RootFile::file ( ) const
inline

Definition at line 166 of file RootFile.h.

Referenced by RootFile().

166 {return file_;}
std::string const file_
Definition: RootFile.h:253
FileFormatVersion edm::RootFile::fileFormatVersion ( ) const
inline
bool edm::RootFile::fillEventAuxiliary ( IndexIntoFile::EntryNumber_t  entry)
private

Definition at line 1184 of file RootFile.cc.

References edm::RootTree::current(), eventTree_, fillThisEventAuxiliary(), and edm::RootTree::setEntryNumber().

Referenced by getNextItemType(), isDuplicateEvent(), readEvent(), readLuminosityBlockAuxiliary_(), readRunAuxiliary_(), setEntryAtNextEventInLumi(), skipEvents(), and skipThisEntry().

1184  {
1185  if(!eventTree_.current(entry)) {
1186  return false;
1187  }
1190  return true;
1191  }
bool current() const
Definition: RootTree.h:97
RootTree eventTree_
Definition: RootFile.h:276
void fillThisEventAuxiliary()
Definition: RootFile.cc:1165
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
void edm::RootFile::fillEventHistory ( )
private

Definition at line 1194 of file RootFile.cc.

References branchIDListHelper_, branchListIndexes_, edm::poolNames::branchListIndexesBranchName(), daqProvenanceHelper_, edm::RootTree::entryNumber(), event(), eventAux(), eventAux_, edm::errors::EventCorruption, edm::poolNames::eventHistoryBranchName(), edm::FileFormatVersion::eventHistoryTree(), eventHistoryTree_, eventProcessHistoryIDs_, eventProcessHistoryIter_, eventSelectionIDs_, edm::poolNames::eventSelectionsBranchName(), eventTree_, Exception, fileFormatVersion(), edm::RootTree::fillBranchEntry(), edm::roottree::getEntry(), history_, hcalTTPDigis_cfi::id, edm::lower_bound_all(), edm::FileFormatVersion::noMetaDataTrees(), edm::EventAuxiliary::processHistoryID(), provenanceAdaptor_, findQualityFiles::run, edm::EventAuxiliary::setProcessHistoryID(), edm::FileFormatVersion::splitProductIDs(), edmPickEvents::target, and edm::RootTree::tree().

Referenced by fillIndexIntoFile(), readCurrentEvent(), and readRunAuxiliary_().

1194  {
1195  // We could consider doing delayed reading, but because we have to
1196  // store this History object in a different tree than the event
1197  // data tree, this is too hard to do in this first version.
1198 
1199  if(fileFormatVersion().eventHistoryBranch()) {
1200  // Lumi block number was not in EventID for the relevant releases.
1201  EventID id(eventAux().id().run(), 0, eventAux().id().event());
1202  if(eventProcessHistoryIter_->eventID() != id) {
1203  EventProcessHistoryID target(id, ProcessHistoryID());
1205  assert(eventProcessHistoryIter_->eventID() == id);
1206  }
1209  } else if(fileFormatVersion().eventHistoryTree()) {
1210  // for backward compatibility.
1211  History* pHistory = history_.get();
1212  TBranch* eventHistoryBranch = eventHistoryTree_->GetBranch(poolNames::eventHistoryBranchName().c_str());
1213  if(!eventHistoryBranch) {
1215  << "Failed to find history branch in event history tree.\n";
1216  }
1217  eventHistoryBranch->SetAddress(&pHistory);
1219  eventAux_.setProcessHistoryID(history_->processHistoryID());
1220  eventSelectionIDs_.swap(history_->eventSelectionIDs());
1221  branchListIndexes_.swap(history_->branchListIndexes());
1222  } else if(fileFormatVersion().noMetaDataTrees()) {
1223  // Current format
1225  TBranch* eventSelectionIDBranch = eventTree_.tree()->GetBranch(poolNames::eventSelectionsBranchName().c_str());
1226  assert(eventSelectionIDBranch != nullptr);
1227  eventTree_.fillBranchEntry(eventSelectionIDBranch, pESV);
1229  TBranch* branchListIndexesBranch = eventTree_.tree()->GetBranch(poolNames::branchListIndexesBranchName().c_str());
1230  assert(branchListIndexesBranch != nullptr);
1231  eventTree_.fillBranchEntry(branchListIndexesBranch, pBLI);
1232  }
1233  if(provenanceAdaptor_) {
1234  eventAux_.setProcessHistoryID(provenanceAdaptor_->convertID(eventAux().processHistoryID()));
1235  for(auto& esID : eventSelectionIDs_) {
1236  esID = provenanceAdaptor_->convertID(esID);
1237  }
1238  }
1239  if(daqProvenanceHelper_) {
1241  }
1243  // old format. branchListIndexes_ must be filled in from the ProvenanceAdaptor.
1244  provenanceAdaptor_->branchListIndexes(branchListIndexes_);
1245  }
1246  if(branchIDListHelper_) {
1247  branchIDListHelper_->fixBranchListIndexes(branchListIndexes_);
1248  }
1249  }
Int_t getEntry(TBranch *branch, EntryNumber entryNumber)
Definition: RootTree.cc:471
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
ForwardSequence::const_iterator lower_bound_all(ForwardSequence const &s, Datum const &d)
wrappers for std::lower_bound
Definition: Algorithms.h:91
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
std::string const & eventSelectionsBranchName()
Definition: BranchType.cc:243
std::vector< EventSelectionID > EventSelectionIDVector
std::vector< EventProcessHistoryID >::const_iterator eventProcessHistoryIter_
Definition: RootFile.h:268
TTree const * tree() const
Definition: RootTree.h:149
std::vector< BranchListIndex > BranchListIndexes
std::string const & eventHistoryBranchName()
Definition: BranchType.cc:238
EventAuxiliary const & eventAux() const
Definition: RootFile.h:168
EventSelectionIDVector eventSelectionIDs_
Definition: RootFile.h:290
bool eventHistoryTree() const
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
Definition: RootFile.h:295
RootTree eventTree_
Definition: RootFile.h:276
BranchListIndexes branchListIndexes_
Definition: RootFile.h:291
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
Hash< ProcessHistoryType > ProcessHistoryID
edm::propagate_const< std::unique_ptr< History > > history_
Definition: RootFile.h:292
EntryNumber const & entryNumber() const
Definition: RootTree.h:102
void fillBranchEntry(TBranch *branch, T *&pbuf)
Definition: RootTree.h:127
void setProcessHistoryID(ProcessHistoryID const &phid)
ProcessHistoryID const & processHistoryID() const
edm::propagate_const< TTree * > eventHistoryTree_
Definition: RootFile.h:289
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:247
EventAuxiliary eventAux_
Definition: RootFile.h:275
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
Definition: RootFile.h:283
std::vector< EventProcessHistoryID > eventProcessHistoryIDs_
Definition: RootFile.h:267
void edm::RootFile::fillIndexIntoFile ( )
private

Definition at line 866 of file RootFile.cc.

References edm::RootTree::entries(), edm::RootTree::entryNumber(), event(), eventAux(), eventAux_, eventTree_, fileFormatVersion(), fillEventHistory(), fillLumiAuxiliary(), fillRunAuxiliary(), fillThisEventAuxiliary(), edm::find_in_all(), indexIntoFile_, edm::IndexIntoFile::invalidEntry, edm::RootTree::isValid(), lastEventEntryNumberRead_, summaryLumi::lcount, edm::EventAuxiliary::luminosityBlock(), heppy_report::lumis, lumiTree_, eostools::move(), edm::RootTree::next(), processHistoryRegistry_, edm::EventAuxiliary::run(), findQualityFiles::run, gather_cfg::runs, runTree_, edm::second(), edm::RootTree::setEntryNumber(), edm::IndexIntoFile::setProcessHistoryIDs(), edm::IndexIntoFile::setRunOrLumiEntries(), edm::stable_sort_all(), mitigatedMETSequence_cff::U, and edm::IndexIntoFile::unsortedEventNumbers().

Referenced by validateFile().

866  {
867  // This function is for backward compatibility.
868  // If reading a current format file, indexIntoFile_ is read from the input
869  // file and should always be there. Note that the algorithm below will work
870  // sometimes but often fail with the new format introduced in release 3_8_0.
871  // If it ever becomes necessary to rebuild IndexIntoFile from the new format,
872  // probably a separate function should be written to deal with the task.
873  // This is possible just not implemented yet.
874  assert(!fileFormatVersion().hasIndexIntoFile());
875 
876  typedef std::list<LumiItem> LumiList;
877  LumiList lumis; // (declare 1)
878 
879  typedef std::set<LuminosityBlockID> RunLumiSet;
880  RunLumiSet runLumiSet; // (declare 2)
881 
882  typedef std::list<RunItem> RunList;
883  RunList runs; // (declare 5)
884 
885  typedef std::set<RunNumber_t> RunSet;
886  RunSet runSet; // (declare 4)
887 
888  typedef std::set<RunItem, RunItemSortByRunPhid> RunItemSet;
889  RunItemSet runItemSet; // (declare 3)
890 
891  typedef std::map<RunNumber_t, ProcessHistoryID> PHIDMap;
892  PHIDMap phidMap;
893 
894  RunNumber_t prevRun = 0;
895  LuminosityBlockNumber_t prevLumi = 0;
896  ProcessHistoryID prevPhid;
897  bool iFirst = true;
898 
899  indexIntoFile_.unsortedEventNumbers().clear(); // should already be empty, just being careful
901 
902  // First, loop through the event tree.
903  while(eventTree_.next()) {
904  bool newRun = false;
905  bool newLumi = false;
908 
909  // Save the event numbers as we loop through the event auxiliary to avoid
910  // having to read through the event auxiliary again later. These event numbers
911  // are not actually used in this function, but could be needed elsewhere.
913 
914  ProcessHistoryID reducedPHID = processHistoryRegistry_->reducedProcessHistoryID(eventAux().processHistoryID());
915 
916  if(iFirst || prevPhid != reducedPHID || prevRun != eventAux().run()) {
917  iFirst = false;
918  newRun = newLumi = true;
919  } else if(prevLumi != eventAux().luminosityBlock()) {
920  newLumi = true;
921  }
922  prevPhid = reducedPHID;
923  prevRun = eventAux().run();
924  prevLumi = eventAux().luminosityBlock();
925  if(newLumi) {
926  lumis.emplace_back(reducedPHID,
927  eventAux().run(), eventAux().luminosityBlock(), eventTree_.entryNumber()); // (insert 1)
928  runLumiSet.insert(LuminosityBlockID(eventAux().run(), eventAux().luminosityBlock())); // (insert 2)
929  } else {
930  LumiItem& currentLumi = lumis.back();
931  assert(currentLumi.lastEventEntry_ == eventTree_.entryNumber());
932  ++currentLumi.lastEventEntry_;
933  }
934  if(newRun) {
935  // Insert run in list if it is not already there.
936  RunItem item(reducedPHID, eventAux().run());
937  if(runItemSet.insert(item).second) { // (check 3, insert 3)
938  runs.push_back(std::move(item)); // (insert 5)
939  runSet.insert(eventAux().run()); // (insert 4)
940  phidMap.insert(std::make_pair(eventAux().run(), reducedPHID));
941  }
942  }
943  }
944  // now clean up.
946  eventAux_ = EventAuxiliary();
948 
949  // Loop over run entries and fill information.
950 
951  typedef std::map<RunNumber_t, IndexIntoFile::EntryNumber_t> RunMap;
952  RunMap runMap; // (declare 11)
953 
954  typedef std::vector<RunItem> RunVector;
955  RunVector emptyRuns; // (declare 12)
956 
957  if(runTree_.isValid()) {
958  while(runTree_.next()) {
959  // Note: adjacent duplicates will be skipped without an explicit check.
960 
961  std::shared_ptr<RunAuxiliary> runAux = fillRunAuxiliary();
962  ProcessHistoryID reducedPHID = processHistoryRegistry_->reducedProcessHistoryID(runAux->processHistoryID());
963 
964  if(runSet.insert(runAux->run()).second) { // (check 4, insert 4)
965  // This run was not associated with any events.
966  emptyRuns.emplace_back(reducedPHID, runAux->run()); // (insert 12)
967  }
968  runMap.insert(std::make_pair(runAux->run(), runTree_.entryNumber())); // (insert 11)
969  phidMap.insert(std::make_pair(runAux->run(), reducedPHID));
970  }
971  // now clean up.
973  }
974 
975  // Insert the ordered empty runs into the run list.
976  RunItemSortByRun runItemSortByRun;
977  stable_sort_all(emptyRuns, runItemSortByRun);
978 
979  RunList::iterator itRuns = runs.begin(), endRuns = runs.end();
980  for(auto const& emptyRun : emptyRuns) {
981  for(; itRuns != endRuns; ++itRuns) {
982  if(runItemSortByRun(emptyRun, *itRuns)) {
983  break;
984  }
985  }
986  runs.insert(itRuns, emptyRun);
987  }
988 
989  // Loop over luminosity block entries and fill information.
990 
991  typedef std::vector<LumiItem> LumiVector;
992  LumiVector emptyLumis; // (declare 7)
993 
994  typedef std::map<LuminosityBlockID, IndexIntoFile::EntryNumber_t> RunLumiMap;
995  RunLumiMap runLumiMap; // (declare 6)
996 
997  if(lumiTree_.isValid()) {
998  while(lumiTree_.next()) {
999  // Note: adjacent duplicates will be skipped without an explicit check.
1000  std::shared_ptr<LuminosityBlockAuxiliary> lumiAux = fillLumiAuxiliary();
1001  LuminosityBlockID lumiID = LuminosityBlockID(lumiAux->run(), lumiAux->luminosityBlock());
1002  if(runLumiSet.insert(lumiID).second) { // (check 2, insert 2)
1003  // This lumi was not associated with any events.
1004  // Use the process history ID from the corresponding run. In cases of practical
1005  // importance, this should be the correct process history ID, but it is possible
1006  // to construct files where this is not the correct process history ID ...
1007  PHIDMap::const_iterator iPhidMap = phidMap.find(lumiAux->run());
1008  assert(iPhidMap != phidMap.end());
1009  emptyLumis.emplace_back(iPhidMap->second, lumiAux->run(), lumiAux->luminosityBlock(), IndexIntoFile::invalidEntry); // (insert 7)
1010  }
1011  runLumiMap.insert(std::make_pair(lumiID, lumiTree_.entryNumber()));
1012  }
1013  // now clean up.
1015  }
1016 
1017  // Insert the ordered empty lumis into the lumi list.
1018  LumiItemSortByRunLumi lumiItemSortByRunLumi;
1019  stable_sort_all(emptyLumis, lumiItemSortByRunLumi);
1020 
1021  LumiList::iterator itLumis = lumis.begin(), endLumis = lumis.end();
1022  for(auto const& emptyLumi : emptyLumis) {
1023  for(; itLumis != endLumis; ++itLumis) {
1024  if(lumiItemSortByRunLumi(emptyLumi, *itLumis)) {
1025  break;
1026  }
1027  }
1028  lumis.insert(itLumis, emptyLumi);
1029  }
1030 
1031  // Create a map of RunItems that gives the order of first appearance in the list.
1032  // Also fill in the vector of process history IDs
1033  typedef std::map<RunItem, int, RunItemSortByRunPhid> RunCountMap;
1034  RunCountMap runCountMap; // Declare (17)
1035  std::vector<ProcessHistoryID>& phids = indexIntoFile_.setProcessHistoryIDs();
1036  assert(phids.empty());
1037  std::vector<IndexIntoFile::RunOrLumiEntry>& entries = indexIntoFile_.setRunOrLumiEntries();
1038  assert(entries.empty());
1039  int rcount = 0;
1040  for(auto& run : runs) {
1041  RunCountMap::const_iterator countMapItem = runCountMap.find(run);
1042  if(countMapItem == runCountMap.end()) {
1043  countMapItem = runCountMap.insert(std::make_pair(run, rcount)).first; // Insert (17)
1044  assert(countMapItem != runCountMap.end());
1045  ++rcount;
1046  }
1047  std::vector<ProcessHistoryID>::const_iterator phidItem = find_in_all(phids, run.phid_);
1048  if(phidItem == phids.end()) {
1049  phids.push_back(run.phid_);
1050  phidItem = phids.end() - 1;
1051  }
1052  entries.emplace_back(
1053  countMapItem->second, // use (17)
1055  runMap[run.run_], // use (11)
1056  phidItem - phids.begin(),
1057  run.run_,
1058  0U,
1061  }
1062 
1063  // Create a map of LumiItems that gives the order of first appearance in the list.
1064  typedef std::map<LumiItem, int, LumiItemSortByRunLumiPhid> LumiCountMap;
1065  LumiCountMap lumiCountMap; // Declare (19)
1066  int lcount = 0;
1067  for(auto& lumi : lumis) {
1068  RunCountMap::const_iterator runCountMapItem = runCountMap.find(RunItem(lumi.phid_, lumi.run_));
1069  assert(runCountMapItem != runCountMap.end());
1070  LumiCountMap::const_iterator countMapItem = lumiCountMap.find(lumi);
1071  if(countMapItem == lumiCountMap.end()) {
1072  countMapItem = lumiCountMap.insert(std::make_pair(lumi, lcount)).first; // Insert (17)
1073  assert(countMapItem != lumiCountMap.end());
1074  ++lcount;
1075  }
1076  std::vector<ProcessHistoryID>::const_iterator phidItem = find_in_all(phids, lumi.phid_);
1077  assert(phidItem != phids.end());
1078  entries.emplace_back(
1079  runCountMapItem->second,
1080  countMapItem->second,
1081  runLumiMap[LuminosityBlockID(lumi.run_, lumi.lumi_)],
1082  phidItem - phids.begin(),
1083  lumi.run_,
1084  lumi.lumi_,
1085  lumi.firstEventEntry_,
1086  lumi.lastEventEntry_);
1087  }
1088  stable_sort_all(entries);
1089  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
std::shared_ptr< LuminosityBlockAuxiliary > fillLumiAuxiliary()
Definition: RootFile.cc:1252
RootTree lumiTree_
Definition: RootFile.h:277
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:256
EntryNumber const & entries() const
Definition: RootTree.h:104
RunNumber_t run() const
void stable_sort_all(RandomAccessSequence &s)
wrappers for std::stable_sort
Definition: Algorithms.h:135
unsigned int LuminosityBlockNumber_t
LuminosityBlockNumber_t luminosityBlock() const
U second(std::pair< T, U > const &p)
std::vector< ProcessHistoryID > & setProcessHistoryIDs()
bool next()
Definition: RootTree.h:95
IndexIntoFile::EntryNumber_t lastEventEntryNumberRead_
Definition: RootFile.h:280
EventAuxiliary const & eventAux() const
Definition: RootFile.h:168
std::shared_ptr< RunAuxiliary > fillRunAuxiliary()
Definition: RootFile.cc:1276
RootTree eventTree_
Definition: RootFile.h:276
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
Hash< ProcessHistoryType > ProcessHistoryID
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
RootTree runTree_
Definition: RootFile.h:278
EntryNumber const & entryNumber() const
Definition: RootTree.h:102
std::vector< RunOrLumiEntry > & setRunOrLumiEntries()
std::vector< EventNumber_t > & unsortedEventNumbers() const
static EntryNumber_t const invalidEntry
ForwardSequence::const_iterator find_in_all(ForwardSequence const &s, Datum const &d)
wrappers for std::find
Definition: Algorithms.h:32
void fillEventHistory()
Definition: RootFile.cc:1194
bool isValid() const
Definition: RootTree.cc:105
unsigned int RunNumber_t
EventAuxiliary eventAux_
Definition: RootFile.h:275
void fillThisEventAuxiliary()
Definition: RootFile.cc:1165
def move(src, dest)
Definition: eostools.py:510
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
std::shared_ptr< LuminosityBlockAuxiliary > edm::RootFile::fillLumiAuxiliary ( )
private

Definition at line 1252 of file RootFile.cc.

References edm::conversion(), daqProvenanceHelper_, fileFormatVersion(), edm::RootTree::fillAux(), lumiTree_, edm::FileFormatVersion::newAuxiliary(), provenanceAdaptor_, and edm::FileFormatVersion::runsAndLumis().

Referenced by fillIndexIntoFile(), and readLuminosityBlockAuxiliary_().

1252  {
1253  auto lumiAuxiliary = std::make_shared<LuminosityBlockAuxiliary>();
1255  LuminosityBlockAuxiliary *pLumiAux = lumiAuxiliary.get();
1256  lumiTree_.fillAux<LuminosityBlockAuxiliary>(pLumiAux);
1257  } else {
1258  LuminosityBlockAux lumiAux;
1259  LuminosityBlockAux *pLumiAux = &lumiAux;
1260  lumiTree_.fillAux<LuminosityBlockAux>(pLumiAux);
1261  conversion(lumiAux, *lumiAuxiliary);
1262  }
1263  if(provenanceAdaptor_) {
1264  lumiAuxiliary->setProcessHistoryID(provenanceAdaptor_->convertID(lumiAuxiliary->processHistoryID()));
1265  }
1266  if(daqProvenanceHelper_) {
1267  lumiAuxiliary->setProcessHistoryID(daqProvenanceHelper_->mapProcessHistoryID(lumiAuxiliary->processHistoryID()));
1268  }
1269  if(lumiAuxiliary->luminosityBlock() == 0 && !fileFormatVersion().runsAndLumis()) {
1270  lumiAuxiliary->id() = LuminosityBlockID(RunNumber_t(1), LuminosityBlockNumber_t(1));
1271  }
1272  return lumiAuxiliary;
1273  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
RootTree lumiTree_
Definition: RootFile.h:277
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
unsigned int LuminosityBlockNumber_t
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
Definition: RootFile.h:295
void conversion(EventAux const &from, EventAuxiliary &to)
Definition: EventAux.cc:9
unsigned int RunNumber_t
void fillAux(T *&pAux)
Definition: RootTree.h:111
std::shared_ptr< RunAuxiliary > edm::RootFile::fillRunAuxiliary ( )
private

Definition at line 1276 of file RootFile.cc.

References edm::conversion(), daqProvenanceHelper_, fileFormatVersion(), edm::RootTree::fillAux(), edm::FileFormatVersion::newAuxiliary(), provenanceAdaptor_, and runTree_.

Referenced by fillIndexIntoFile(), and readRunAuxiliary_().

1276  {
1277  auto runAuxiliary = std::make_shared<RunAuxiliary>();
1279  RunAuxiliary *pRunAux = runAuxiliary.get();
1280  runTree_.fillAux<RunAuxiliary>(pRunAux);
1281  } else {
1282  RunAux runAux;
1283  RunAux *pRunAux = &runAux;
1284  runTree_.fillAux<RunAux>(pRunAux);
1285  conversion(runAux, *runAuxiliary);
1286  }
1287  if(provenanceAdaptor_) {
1288  runAuxiliary->setProcessHistoryID(provenanceAdaptor_->convertID(runAuxiliary->processHistoryID()));
1289  }
1290  if(daqProvenanceHelper_) {
1291  runAuxiliary->setProcessHistoryID(daqProvenanceHelper_->mapProcessHistoryID(runAuxiliary->processHistoryID()));
1292  }
1293  return runAuxiliary;
1294  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
Definition: RootFile.h:295
RootTree runTree_
Definition: RootFile.h:278
void conversion(EventAux const &from, EventAuxiliary &to)
Definition: EventAux.cc:9
void fillAux(T *&pAux)
Definition: RootTree.h:111
void edm::RootFile::fillThisEventAuxiliary ( )
private

Definition at line 1165 of file RootFile.cc.

References edm::conversion(), edm::RootTree::entryNumber(), eventAux(), eventAux_, eventTree_, fileFormatVersion(), edm::RootTree::fillAux(), lastEventEntryNumberRead_, and edm::FileFormatVersion::newAuxiliary().

Referenced by fillEventAuxiliary(), fillIndexIntoFile(), initializeDuplicateChecker(), and readCurrentEvent().

1165  {
1167  // Already read.
1168  return;
1169  }
1171  EventAuxiliary *pEvAux = &eventAux_;
1172  eventTree_.fillAux<EventAuxiliary>(pEvAux);
1173  } else {
1174  // for backward compatibility.
1175  EventAux eventAux;
1176  EventAux *pEvAux = &eventAux;
1177  eventTree_.fillAux<EventAux>(pEvAux);
1178  conversion(eventAux, eventAux_);
1179  }
1181  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
IndexIntoFile::EntryNumber_t lastEventEntryNumberRead_
Definition: RootFile.h:280
EventAuxiliary const & eventAux() const
Definition: RootFile.h:168
RootTree eventTree_
Definition: RootFile.h:276
EntryNumber const & entryNumber() const
Definition: RootTree.h:102
void conversion(EventAux const &from, EventAuxiliary &to)
Definition: EventAux.cc:9
EventAuxiliary eventAux_
Definition: RootFile.h:275
void fillAux(T *&pAux)
Definition: RootTree.h:111
IndexIntoFile::EntryType edm::RootFile::getNextItemType ( RunNumber_t run,
LuminosityBlockNumber_t lumi,
EventNumber_t event 
)

Definition at line 751 of file RootFile.cc.

References edm::IndexIntoFile::IndexIntoFileItr::advanceToNextLumiOrRun(), edm::IndexIntoFile::IndexIntoFileItr::advanceToNextRun(), edm::IndexIntoFile::IndexIntoFileItr::entry(), edm::EventAuxiliary::event(), eventAux_, fillEventAuxiliary(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), indexIntoFileIter_, isDuplicateEvent(), edm::IndexIntoFile::kEnd, edm::IndexIntoFile::kEvent, edm::IndexIntoFile::kLumi, edm::IndexIntoFile::kRun, edm::IndexIntoFile::IndexIntoFileItr::lumi(), processingMode_, edm::IndexIntoFile::IndexIntoFileItr::run(), runHelper_, edm::InputSource::Runs, edm::InputSource::RunsAndLumis, and skipThisEntry().

751  {
752  // First, account for consecutive skipped entries.
753  while(skipThisEntry()) {
756  }
759  }
760  else {
762  }
763  }
764  // OK, we have an entry that is not skipped.
766  if(entryType == IndexIntoFile::kEnd) {
767  return IndexIntoFile::kEnd;
768  }
769  if(entryType == IndexIntoFile::kRun) {
771  runHelper_->checkForNewRun(run);
772  return IndexIntoFile::kRun;
773  } else if(processingMode_ == InputSource::Runs) {
775  return getNextItemType(run, lumi, event);
776  }
777  if(entryType == IndexIntoFile::kLumi) {
780  return IndexIntoFile::kLumi;
783  return getNextItemType(run, lumi, event);
784  }
785  if(isDuplicateEvent()) {
787  return getNextItemType(run, lumi, event);
788  }
792  event = eventAux_.event();
793  return IndexIntoFile::kEvent;
794  }
InputSource::ProcessingMode processingMode_
Definition: RootFile.h:286
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
LuminosityBlockNumber_t lumi() const
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1184
bool skipThisEntry()
Definition: RootFile.cc:691
IndexIntoFile::EntryType getNextItemType(RunNumber_t &run, LuminosityBlockNumber_t &lumi, EventNumber_t &event)
Definition: RootFile.cc:751
bool isDuplicateEvent()
Definition: RootFile.cc:735
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:287
EventAuxiliary eventAux_
Definition: RootFile.h:275
EventNumber_t event() const
Definition: event.py:1
bool edm::RootFile::goToEvent ( EventID const &  eventID)

Definition at line 1365 of file RootFile.cc.

References duplicateChecker_, edm::IndexIntoFile::end(), edm::EventID::event(), edm::IndexIntoFile::fillEventNumbers(), edm::IndexIntoFile::findPosition(), edm::IndexIntoFile::firstAppearanceOrder, indexIntoFile_, indexIntoFileIter_, edm::EventID::luminosityBlock(), noEventSort_, edm::IndexIntoFile::numericalOrder, and edm::EventID::run().

1365  {
1366 
1368 
1369  if(duplicateChecker_) {
1370  duplicateChecker_->disable();
1371  }
1372 
1375 
1376  IndexIntoFile::IndexIntoFileItr iter =
1378 
1379  if(iter == indexIntoFile_.end(sortOrder)) {
1380  return false;
1381  }
1382  indexIntoFileIter_ = iter;
1383  return true;
1384  }
RunNumber_t run() const
Definition: EventID.h:39
EventID const & eventID() const
Definition: RootFile.h:172
EventNumber_t event() const
Definition: EventID.h:41
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:294
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:40
IndexIntoFileItr findPosition(RunNumber_t run, LuminosityBlockNumber_t lumi=0U, EventNumber_t event=0U) const
bool noEventSort_
Definition: RootFile.h:271
IndexIntoFileItr end(SortOrder sortOrder) const
Used to end an iteration over the Runs, Lumis, and Events in a file.
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
void fillEventNumbers() const
std::array<bool, NumBranchTypes> const& edm::RootFile::hasNewlyDroppedBranch ( ) const
inline

Definition at line 178 of file RootFile.h.

Referenced by createFileBlock().

178 {return hasNewlyDroppedBranch_;}
std::array< bool, NumBranchTypes > hasNewlyDroppedBranch_
Definition: RootFile.h:273
IndexIntoFile::IndexIntoFileItr edm::RootFile::indexIntoFileIter ( ) const

Definition at line 676 of file RootFile.cc.

References indexIntoFileIter_.

676  {
677  return indexIntoFileIter_;
678  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
std::shared_ptr<IndexIntoFile const> edm::RootFile::indexIntoFileSharedPtr ( ) const
inline

Definition at line 209 of file RootFile.h.

References edm::get_underlying_safe().

edm::propagate_const< std::shared_ptr< IndexIntoFile > > indexIntoFileSharedPtr_
Definition: RootFile.h:261
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
std::shared_ptr<IndexIntoFile>& edm::RootFile::indexIntoFileSharedPtr ( )
inline

Definition at line 210 of file RootFile.h.

References edm::get_underlying_safe(), and position.

edm::propagate_const< std::shared_ptr< IndexIntoFile > > indexIntoFileSharedPtr_
Definition: RootFile.h:261
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
void edm::RootFile::initAssociationsFromSecondary ( std::vector< BranchID > const &  associationsFromSecondary)

Definition at line 686 of file RootFile.cc.

References fileThinnedAssociationsHelper_, and thinnedAssociationsHelper_.

686  {
687  thinnedAssociationsHelper_->initAssociationsFromSecondary(associationsFromSecondary, *fileThinnedAssociationsHelper_);
688  }
edm::propagate_const< std::unique_ptr< ThinnedAssociationsHelper > > fileThinnedAssociationsHelper_
Definition: RootFile.h:284
edm::propagate_const< std::shared_ptr< ThinnedAssociationsHelper > > thinnedAssociationsHelper_
Definition: RootFile.h:285
void edm::RootFile::initializeDuplicateChecker ( std::vector< std::shared_ptr< IndexIntoFile > > const &  indexesIntoFiles,
std::vector< std::shared_ptr< IndexIntoFile > >::size_type  currentIndexIntoFile 
)
private

Definition at line 1646 of file RootFile.cc.

References duplicateChecker_, eventAux(), eventTree_, fillThisEventAuxiliary(), indexIntoFile_, edm::IndexIntoFile::invalidEntry, edm::RootTree::next(), and edm::RootTree::setEntryNumber().

Referenced by RootFile().

1648  {
1649  if(duplicateChecker_) {
1650  if(eventTree_.next()) {
1652  duplicateChecker_->inputFileOpened(eventAux().isRealData(),
1654  indexesIntoFiles,
1655  currentIndexIntoFile);
1656  }
1658  }
1659  }
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:294
bool next()
Definition: RootTree.h:95
EventAuxiliary const & eventAux() const
Definition: RootFile.h:168
RootTree eventTree_
Definition: RootFile.h:276
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
static EntryNumber_t const invalidEntry
void fillThisEventAuxiliary()
Definition: RootFile.cc:1165
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
bool edm::RootFile::isDuplicateEvent ( )
private

Definition at line 735 of file RootFile.cc.

References duplicateChecker_, edm::IndexIntoFile::IndexIntoFileItr::entry(), edm::EventID::event(), eventAux_, file_, fillEventAuxiliary(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), edm::EventAuxiliary::id(), indexIntoFileIter_, edm::IndexIntoFile::kEvent, edm::IndexIntoFile::IndexIntoFileItr::lumi(), edm::IndexIntoFile::IndexIntoFileItr::processHistoryIDIndex(), and edm::IndexIntoFile::IndexIntoFileItr::run().

Referenced by getNextItemType().

735  {
737  if(duplicateChecker_.get() == nullptr) {
738  return false;
739  }
741  return duplicateChecker_->isDuplicateAndCheckActive(indexIntoFileIter_.processHistoryIDIndex(),
743  }
EventNumber_t event() const
Definition: EventID.h:41
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:294
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
LuminosityBlockNumber_t lumi() const
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1184
EventID const & id() const
EventAuxiliary eventAux_
Definition: RootFile.h:275
std::string const file_
Definition: RootFile.h:253
RootTree const& edm::RootFile::lumiTree ( ) const
inline

Definition at line 174 of file RootFile.h.

174 {return lumiTree_;}
RootTree lumiTree_
Definition: RootFile.h:277
std::shared_ptr< ProductProvenanceRetriever > edm::RootFile::makeProductProvenanceRetriever ( unsigned int  iStreamIndex)
private

Definition at line 1820 of file RootFile.cc.

References daqProvenanceHelper_, eventProductProvenanceRetriever(), eventProductProvenanceRetrievers_, eventTree_, and provenanceReaderMaker_.

Referenced by readCurrentEvent().

1820  {
1821  if(eventProductProvenanceRetrievers_.size()<=iStreamID) {
1822  eventProductProvenanceRetrievers_.resize(iStreamID+1);
1823  }
1824  if(!eventProductProvenanceRetrievers_[iStreamID]) {
1825  // propagate_const<T> has no reset() function
1826  eventProductProvenanceRetrievers_[iStreamID] = std::make_shared<ProductProvenanceRetriever>(provenanceReaderMaker_->makeReader(eventTree_, daqProvenanceHelper_.get()));
1827  }
1828  eventProductProvenanceRetrievers_[iStreamID]->reset();
1829  return eventProductProvenanceRetriever(iStreamID);
1830  }
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
std::shared_ptr< ProductProvenanceRetriever const > eventProductProvenanceRetriever(size_t index) const
Definition: RootFile.h:250
std::vector< edm::propagate_const< std::shared_ptr< ProductProvenanceRetriever > > > eventProductProvenanceRetrievers_
Definition: RootFile.h:297
RootTree eventTree_
Definition: RootFile.h:276
edm::propagate_const< std::unique_ptr< MakeProvenanceReader > > provenanceReaderMaker_
Definition: RootFile.h:296
std::unique_ptr< MakeProvenanceReader > edm::RootFile::makeProvenanceReaderMaker ( InputType  inputType)
private

Definition at line 1803 of file RootFile.cc.

References fileFormatVersion_, eostools::move(), parentageIDLookup_, edm::FileFormatVersion::perEventProductIDs(), readEntryDescriptionTree(), readParentageTree(), edm::FileFormatVersion::splitProductIDs(), and edm::FileFormatVersion::storedProductProvenanceUsed().

Referenced by RootFile().

1803  {
1805  readParentageTree(inputType);
1806  return std::make_unique<MakeReducedProvenanceReader>(parentageIDLookup_);
1807  } else if(fileFormatVersion_.splitProductIDs()) {
1808  readParentageTree(inputType);
1809  return std::make_unique<MakeFullProvenanceReader>();
1810  } else if(fileFormatVersion_.perEventProductIDs()) {
1811  auto entryDescriptionMap = std::make_unique<EntryDescriptionMap>();
1812  readEntryDescriptionTree(*entryDescriptionMap, inputType);
1813  return std::make_unique<MakeOldProvenanceReader>(std::move(entryDescriptionMap));
1814  } else {
1815  return std::make_unique<MakeDummyProvenanceReader>();
1816  }
1817  }
void readEntryDescriptionTree(EntryDescriptionMap &entryDescriptionMap, InputType inputType)
Definition: RootFile.cc:522
FileFormatVersion fileFormatVersion_
Definition: RootFile.h:259
void readParentageTree(InputType inputType)
Definition: RootFile.cc:568
bool storedProductProvenanceUsed() const
bool perEventProductIDs() const
std::vector< ParentageID > parentageIDLookup_
Definition: RootFile.h:298
def move(src, dest)
Definition: eostools.py:510
void edm::RootFile::markBranchToBeDropped ( bool  dropDescendants,
BranchDescription const &  branch,
std::set< BranchID > &  branchesToDrop,
std::map< BranchID, BranchID > const &  droppedToKeptAlias 
) const
private

Definition at line 1662 of file RootFile.cc.

References branchChildren_, and edm::BranchDescription::branchID().

Referenced by dropOnInput().

1663  {
1664  if(dropDescendants) {
1665  branchChildren_->appendToDescendants(branch, branchesToDrop, droppedToKeptAlias);
1666  } else {
1667  branchesToDrop.insert(branch.branchID());
1668  }
1669  }
edm::propagate_const< std::shared_ptr< BranchChildren > > branchChildren_
Definition: RootFile.h:293
bool edm::RootFile::modifiedIDs ( ) const
inline

Definition at line 180 of file RootFile.h.

Referenced by createFileBlock().

180 {return daqProvenanceHelper_.get() != 0;}
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
std::string const & edm::RootFile::newBranchToOldBranch ( std::string const &  newBranch) const
private

Definition at line 667 of file RootFile.cc.

References newBranchToOldBranch_.

Referenced by dropOnInput(), and RootFile().

667  {
668  std::map<std::string, std::string>::const_iterator it = newBranchToOldBranch_.find(newBranch);
669  if(it != newBranchToOldBranch_.end()) {
670  return it->second;
671  }
672  return newBranch;
673  }
std::map< std::string, std::string > newBranchToOldBranch_
Definition: RootFile.h:288
bool edm::RootFile::nextEventEntry ( )
inline

Definition at line 205 of file RootFile.h.

205 {return eventTree_.next();}
bool next()
Definition: RootTree.h:95
RootTree eventTree_
Definition: RootFile.h:276
RootFile& edm::RootFile::operator= ( RootFile const &  )
delete
std::shared_ptr<ProductRegistry const> edm::RootFile::productRegistry ( ) const
inline

Definition at line 167 of file RootFile.h.

Referenced by RootFile().

167 {return productRegistry_;}
std::shared_ptr< ProductRegistry const > productRegistry_
Definition: RootFile.h:281
bool edm::RootFile::readCurrentEvent ( EventPrincipal cache)

Definition at line 1422 of file RootFile.cc.

References branchListIndexes_, edm::RootTree::current(), eventAux(), eventAux_, eventSelectionIDs_, eventTree_, fileFormatVersion(), filePtr_, fillEventHistory(), edm::EventPrincipal::fillEventPrincipal(), fillThisEventAuxiliary(), edm::EventAuxiliary::id(), edm::RootTree::insertEntryForIndex(), edm::EventAuxiliary::isRealData(), makeProductProvenanceRetriever(), eostools::move(), edm::EventAuxiliary::oldLuminosityBlock(), processHistoryRegistry_, edm::RootTree::resetAndGetRootDelayedReader(), edm::EventAuxiliary::resetObsoleteInfo(), runHelper_, edm::EventPrincipal::streamID(), edm::EDProductGetter::transitionIndex(), and edm::StreamID::value().

Referenced by readEvent().

1422  {
1423  if(!eventTree_.current()) {
1424  return false;
1425  }
1427  if(!fileFormatVersion().lumiInEventID()) {
1428  //ugly, but will disappear when the backward compatibility is done with schema evolution.
1429  const_cast<EventID&>(eventAux_.id()).setLuminosityBlockNumber(eventAux_.oldLuminosityBlock());
1431  }
1432  fillEventHistory();
1433  runHelper_->overrideRunNumber(eventAux_.id(), eventAux().isRealData());
1434 
1435  // We're not done ... so prepare the EventPrincipal
1436  eventTree_.insertEntryForIndex(principal.transitionIndex());
1437  principal.fillEventPrincipal(eventAux(),
1441  *(makeProductProvenanceRetriever(principal.streamID().value())),
1443 
1444  // report event read from file
1445  filePtr_->eventReadFromFile();
1446  return true;
1447  }
bool isRealData() const
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:256
bool current() const
Definition: RootTree.h:97
def principal(options)
void insertEntryForIndex(unsigned int index)
Definition: RootTree.cc:99
DelayedReader * resetAndGetRootDelayedReader() const
Definition: RootTree.cc:117
EventAuxiliary const & eventAux() const
Definition: RootFile.h:168
EventSelectionIDVector eventSelectionIDs_
Definition: RootFile.h:290
RootTree eventTree_
Definition: RootFile.h:276
BranchListIndexes branchListIndexes_
Definition: RootFile.h:291
LuminosityBlockNumber_t oldLuminosityBlock() const
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:257
void fillEventHistory()
Definition: RootFile.cc:1194
std::shared_ptr< ProductProvenanceRetriever > makeProductProvenanceRetriever(unsigned int iStreamIndex)
Definition: RootFile.cc:1820
EventID const & id() const
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:287
EventAuxiliary eventAux_
Definition: RootFile.h:275
void fillThisEventAuxiliary()
Definition: RootFile.cc:1165
def move(src, dest)
Definition: eostools.py:510
void edm::RootFile::readEntryDescriptionTree ( EntryDescriptionMap entryDescriptionMap,
InputType  inputType 
)
private

Definition at line 522 of file RootFile.cc.

References daqProvenanceHelper_, edm::poolNames::entryDescriptionBranchName(), edm::poolNames::entryDescriptionIDBranchName(), edm::poolNames::entryDescriptionTreeName(), edm::errors::EventCorruption, Exception, filePtr_, edm::errors::FileReadError, edm::roottree::getEntry(), mps_fire::i, edm::EventEntryDescription::id(), edm::Parentage::id(), edm::ParentageRegistry::insertMapped(), edm::ParentageRegistry::instance(), edm::numEntries(), parents, edm::EventEntryDescription::parents(), edm::Parentage::parentsForUpdate(), PhysicsTools::registry, edm::SecondarySource, and edm::Parentage::setParents().

Referenced by makeProvenanceReaderMaker().

522  {
523  // Called only for old format files.
524  // We use a smart pointer so the tree will be deleted after use, and not kept for the life of the file.
525  std::unique_ptr<TTree> entryDescriptionTree(dynamic_cast<TTree*>(filePtr_->Get(poolNames::entryDescriptionTreeName().c_str())));
526  if(nullptr == entryDescriptionTree.get()) {
527  throw Exception(errors::FileReadError) << "Could not find tree " << poolNames::entryDescriptionTreeName()
528  << " in the input file.\n";
529  }
530 
531  EntryDescriptionID idBuffer;
532  EntryDescriptionID* pidBuffer = &idBuffer;
533  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionIDBranchName().c_str(), &pidBuffer);
534 
535  EventEntryDescription entryDescriptionBuffer;
536  EventEntryDescription *pEntryDescriptionBuffer = &entryDescriptionBuffer;
537  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionBranchName().c_str(), &pEntryDescriptionBuffer);
538 
539  // Fill in the parentage registry.
540  ParentageRegistry& registry = *ParentageRegistry::instance();
541 
542  for(Long64_t i = 0, numEntries = entryDescriptionTree->GetEntries(); i < numEntries; ++i) {
543  roottree::getEntry(entryDescriptionTree.get(), i);
544  if(idBuffer != entryDescriptionBuffer.id()) {
545  throw Exception(errors::EventCorruption) << "Corruption of EntryDescription tree detected.\n";
546  }
547  entryDescriptionMap.insert(std::make_pair(entryDescriptionBuffer.id(),entryDescriptionBuffer));
548  Parentage parents;
549  parents.setParents(entryDescriptionBuffer.parents());
551  ParentageID const oldID = parents.id();
552  daqProvenanceHelper_->fixMetaData(parents.parentsForUpdate());
553  ParentageID newID = parents.id();
554  if(newID != oldID) {
555  daqProvenanceHelper_->setOldParentageIDToNew(oldID,newID);
556  }
557  }
558  // For thread safety, don't update global registries when a secondary source opens a file.
559  if(inputType != InputType::SecondarySource) {
560  registry.insertMapped(parents);
561  }
562  }
563  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionIDBranchName().c_str(), nullptr);
564  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionBranchName().c_str(), nullptr);
565  }
Int_t getEntry(TBranch *branch, EntryNumber entryNumber)
Definition: RootTree.cc:471
TPRegexp parents
Definition: eve_filter.cc:21
std::string const & entryDescriptionBranchName()
Definition: BranchType.cc:154
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
Hash< EntryDescriptionType > EntryDescriptionID
std::string const & entryDescriptionTreeName()
Definition: BranchType.cc:146
Long64_t numEntries(TFile *hdl, std::string const &trname)
Definition: CollUtil.cc:50
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:257
std::string const & entryDescriptionIDBranchName()
Definition: BranchType.cc:150
static Interceptor::Registry registry("Interceptor")
static ParentageRegistry * instance()
Hash< ParentageType > ParentageID
Definition: ParentageID.h:9
void edm::RootFile::readEvent ( EventPrincipal cache)

Definition at line 1399 of file RootFile.cc.

References daqProvenanceHelper_, edm::IndexIntoFile::IndexIntoFileItr::entry(), eventAux(), fileFormatVersion(), fillEventAuxiliary(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), indexIntoFile_, indexIntoFileEnd_, indexIntoFileIter_, edm::IndexIntoFile::kEvent, edm::IndexIntoFile::IndexIntoFileItr::lumi(), edm::EventAuxiliary::processHistoryID(), edm::IndexIntoFile::processHistoryID(), edm::IndexIntoFile::IndexIntoFileItr::processHistoryIDIndex(), processHistoryRegistry_, readCurrentEvent(), findQualityFiles::run, edm::IndexIntoFile::IndexIntoFileItr::run(), runHelper_, and edm::FileFormatVersion::useReducedProcessHistoryID().

1399  {
1402  // read the event auxiliary if not alrady read.
1404 
1405  // read the event
1407 
1408  runHelper_->checkRunConsistency(eventAux().run(), indexIntoFileIter_.run());
1409  runHelper_->checkLumiConsistency(eventAux().luminosityBlock(), indexIntoFileIter_.lumi());
1410 
1411  // If this next assert shows up in performance profiling or significantly affects memory, then these three lines should be deleted.
1412  // The IndexIntoFile should guarantee that it never fails.
1414  ProcessHistoryID const& reducedPHID = processHistoryRegistry_->reducedProcessHistoryID(idToCheck);
1416 
1418  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:256
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
LuminosityBlockNumber_t lumi() const
bool readCurrentEvent(EventPrincipal &cache)
Definition: RootFile.cc:1422
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1184
def principal(options)
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
EventAuxiliary const & eventAux() const
Definition: RootFile.h:168
Hash< ProcessHistoryType > ProcessHistoryID
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
ProcessHistoryID const & processHistoryID(int i) const
ProcessHistoryID const & processHistoryID() const
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:287
bool useReducedProcessHistoryID() const
void edm::RootFile::readEventHistoryTree ( )
private

Definition at line 1633 of file RootFile.cc.

References edm::errors::EventCorruption, eventHistoryTree_, edm::poolNames::eventHistoryTreeName(), Exception, fileFormatVersion(), filePtr_, and history_.

Referenced by RootFile().

1633  {
1634  // Read in the event history tree, if we have one...
1635  if(fileFormatVersion().eventHistoryTree()) {
1636  history_ = std::make_unique<History>(); // propagate_const<T> has no reset() function
1637  eventHistoryTree_ = dynamic_cast<TTree*>(filePtr_->Get(poolNames::eventHistoryTreeName().c_str()));
1638  if(!eventHistoryTree_) {
1640  << "Failed to find the event history tree.\n";
1641  }
1642  }
1643  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
edm::propagate_const< std::unique_ptr< History > > history_
Definition: RootFile.h:292
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:257
edm::propagate_const< TTree * > eventHistoryTree_
Definition: RootFile.h:289
std::string const & eventHistoryTreeName()
Definition: BranchType.cc:268
void edm::RootFile::readFakeRun_ ( RunPrincipal runPrincipal)
std::shared_ptr<RunAuxiliary> edm::RootFile::readFakeRunAuxiliary_ ( )
void edm::RootFile::readLuminosityBlock_ ( LuminosityBlockPrincipal lumiPrincipal)

Definition at line 1578 of file RootFile.cc.

References edm::IndexIntoFile::IndexIntoFileItr::entry(), edm::LuminosityBlockPrincipal::fillLuminosityBlockPrincipal(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), indexIntoFileEnd_, indexIntoFileIter_, edm::RootTree::insertEntryForIndex(), edm::RootTree::isValid(), edm::IndexIntoFile::kLumi, lumiTree_, processHistoryRegistry_, edm::Principal::readAllFromSourceAndMergeImmediately(), edm::RootTree::resetAndGetRootDelayedReader(), edm::RootTree::setEntryNumber(), and edm::EDProductGetter::transitionIndex().

1578  {
1581  // Begin code for backward compatibility before the existence of lumi trees.
1582  if(!lumiTree_.isValid()) {
1584  return;
1585  }
1586  // End code for backward compatibility before the existence of lumi trees.
1588  lumiTree_.insertEntryForIndex(lumiPrincipal.transitionIndex());
1589  lumiPrincipal.fillLuminosityBlockPrincipal(*processHistoryRegistry_, lumiTree_.resetAndGetRootDelayedReader());
1590  // Read in all the products now.
1591  lumiPrincipal.readAllFromSourceAndMergeImmediately();
1593  }
RootTree lumiTree_
Definition: RootFile.h:277
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:256
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
void insertEntryForIndex(unsigned int index)
Definition: RootTree.cc:99
DelayedReader * resetAndGetRootDelayedReader() const
Definition: RootTree.cc:117
bool isValid() const
Definition: RootTree.cc:105
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
std::shared_ptr< LuminosityBlockAuxiliary > edm::RootFile::readLuminosityBlockAuxiliary_ ( )

Definition at line 1540 of file RootFile.cc.

References edm::RootTree::current(), edm::IndexIntoFile::IndexIntoFileItr::entry(), eventAux(), eventTree_, fileFormatVersion(), filePtr_, fillEventAuxiliary(), fillLumiAuxiliary(), edm::IndexIntoFile::IndexIntoFileItr::firstEventEntryThisLumi(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), indexIntoFileEnd_, indexIntoFileIter_, edm::IndexIntoFile::invalidEntry, edm::Timestamp::invalidTimestamp(), edm::RootTree::isValid(), edm::IndexIntoFile::kLumi, edm::IndexIntoFile::IndexIntoFileItr::lumi(), edm::LuminosityBlockID::luminosityBlock(), lumiTree_, edm::LuminosityBlockID::run(), edm::IndexIntoFile::IndexIntoFileItr::run(), runHelper_, savedRunAuxiliary_, edm::RootTree::setEntryNumber(), edm::EventAuxiliary::time(), and ntuplemaker::time.

1540  {
1543  // Begin code for backward compatibility before the existence of lumi trees.
1544  if(!lumiTree_.isValid()) {
1546  assert(eventEntry != IndexIntoFile::invalidEntry);
1547  assert(eventTree_.current(eventEntry));
1548  fillEventAuxiliary(eventEntry);
1549 
1550  LuminosityBlockID lumi = LuminosityBlockID(indexIntoFileIter_.run(), indexIntoFileIter_.lumi());
1551  runHelper_->overrideRunNumber(lumi);
1552  return std::make_shared<LuminosityBlockAuxiliary>(lumi.run(), lumi.luminosityBlock(), eventAux().time(), Timestamp::invalidTimestamp());
1553  }
1554  // End code for backward compatibility before the existence of lumi trees.
1556  std::shared_ptr<LuminosityBlockAuxiliary> lumiAuxiliary = fillLumiAuxiliary();
1557  assert(lumiAuxiliary->run() == indexIntoFileIter_.run());
1558  assert(lumiAuxiliary->luminosityBlock() == indexIntoFileIter_.lumi());
1559  runHelper_->overrideRunNumber(lumiAuxiliary->id());
1560  filePtr_->reportInputLumiSection(lumiAuxiliary->run(), lumiAuxiliary->luminosityBlock());
1561  if(lumiAuxiliary->beginTime() == Timestamp::invalidTimestamp()) {
1563  if(eventEntry != IndexIntoFile::invalidEntry) {
1564  assert(eventTree_.current(eventEntry));
1565  fillEventAuxiliary(eventEntry);
1566 
1567  lumiAuxiliary->setBeginTime(eventAux().time());
1568  }
1569  lumiAuxiliary->setEndTime(Timestamp::invalidTimestamp());
1570  }
1571  if(!fileFormatVersion().processHistorySameWithinRun() && savedRunAuxiliary_) {
1572  lumiAuxiliary->setProcessHistoryID(savedRunAuxiliary_->processHistoryID());
1573  }
1574  return lumiAuxiliary;
1575  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
std::shared_ptr< LuminosityBlockAuxiliary > fillLumiAuxiliary()
Definition: RootFile.cc:1252
static Timestamp invalidTimestamp()
Definition: Timestamp.h:101
RootTree lumiTree_
Definition: RootFile.h:277
Timestamp const & time() const
edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:269
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
bool current() const
Definition: RootTree.h:97
LuminosityBlockNumber_t lumi() const
long long EntryNumber_t
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1184
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
EventAuxiliary const & eventAux() const
Definition: RootFile.h:168
RootTree eventTree_
Definition: RootFile.h:276
static EntryNumber_t const invalidEntry
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:257
bool isValid() const
Definition: RootTree.cc:105
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:287
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
void edm::RootFile::readParentageTree ( InputType  inputType)
private

Definition at line 568 of file RootFile.cc.

References daqProvenanceHelper_, Exception, filePtr_, edm::errors::FileReadError, edm::roottree::getEntry(), mps_fire::i, edm::Parentage::id(), edm::ParentageRegistry::insertMapped(), edm::ParentageRegistry::instance(), edm::numEntries(), edm::poolNames::parentageBranchName(), parentageIDLookup_, edm::poolNames::parentageTreeName(), parents, edm::Parentage::parentsForUpdate(), PhysicsTools::registry, and edm::SecondarySource.

Referenced by makeProvenanceReaderMaker().

568  {
569  // New format file
570  // We use a smart pointer so the tree will be deleted after use, and not kept for the life of the file.
571  std::unique_ptr<TTree> parentageTree(dynamic_cast<TTree*>(filePtr_->Get(poolNames::parentageTreeName().c_str())));
572  if(nullptr == parentageTree.get()) {
573  throw Exception(errors::FileReadError) << "Could not find tree " << poolNames::parentageTreeName()
574  << " in the input file.\n";
575  }
576 
577  Parentage parents;
578  Parentage *pParentageBuffer = &parents;
579  parentageTree->SetBranchAddress(poolNames::parentageBranchName().c_str(), &pParentageBuffer);
580 
581  ParentageRegistry& registry = *ParentageRegistry::instance();
582 
583  parentageIDLookup_.reserve(parentageTree->GetEntries());
584  for(Long64_t i = 0, numEntries = parentageTree->GetEntries(); i < numEntries; ++i) {
585  roottree::getEntry(parentageTree.get(), i);
587  ParentageID const oldID = parents.id();
588  daqProvenanceHelper_->fixMetaData(parents.parentsForUpdate());
589  ParentageID newID = parents.id();
590  if(newID != oldID) {
591  daqProvenanceHelper_->setOldParentageIDToNew(oldID,newID);
592  }
593  }
594  // For thread safety, don't update global registries when a secondary source opens a file.
595  if(inputType != InputType::SecondarySource) {
596  registry.insertMapped(parents);
597  }
598  parentageIDLookup_.push_back(parents.id());
599  }
600  parentageTree->SetBranchAddress(poolNames::parentageBranchName().c_str(), nullptr);
601  }
Int_t getEntry(TBranch *branch, EntryNumber entryNumber)
Definition: RootTree.cc:471
TPRegexp parents
Definition: eve_filter.cc:21
std::string const & parentageTreeName()
Definition: BranchType.cc:159
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
Long64_t numEntries(TFile *hdl, std::string const &trname)
Definition: CollUtil.cc:50
std::string const & parentageBranchName()
Definition: BranchType.cc:163
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:257
std::vector< ParentageID > parentageIDLookup_
Definition: RootFile.h:298
static Interceptor::Registry registry("Interceptor")
static ParentageRegistry * instance()
Hash< ParentageType > ParentageID
Definition: ParentageID.h:9
void edm::RootFile::readRun_ ( RunPrincipal runPrincipal)

Definition at line 1521 of file RootFile.cc.

References edm::RunPrincipal::fillRunPrincipal(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), indexIntoFileEnd_, indexIntoFileIter_, edm::RootTree::insertEntryForIndex(), edm::RootTree::isValid(), edm::IndexIntoFile::kRun, processHistoryRegistry_, edm::Principal::readAllFromSourceAndMergeImmediately(), edm::RootTree::resetAndGetRootDelayedReader(), runHelper_, runTree_, and edm::EDProductGetter::transitionIndex().

1521  {
1522  if(!runHelper_->fakeNewRun()) {
1526  }
1527  // Begin code for backward compatibility before the existence of run trees.
1528  if(!runTree_.isValid()) {
1529  return;
1530  }
1531  // End code for backward compatibility before the existence of run trees.
1532  runTree_.insertEntryForIndex(runPrincipal.transitionIndex());
1533  runPrincipal.fillRunPrincipal(*processHistoryRegistry_, runTree_.resetAndGetRootDelayedReader());
1534  // Read in all the products now.
1535  runPrincipal.readAllFromSourceAndMergeImmediately();
1536  }
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:256
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
void insertEntryForIndex(unsigned int index)
Definition: RootTree.cc:99
DelayedReader * resetAndGetRootDelayedReader() const
Definition: RootTree.cc:117
RootTree runTree_
Definition: RootFile.h:278
bool isValid() const
Definition: RootTree.cc:105
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:287
std::shared_ptr< RunAuxiliary > edm::RootFile::readRunAuxiliary_ ( )

Definition at line 1455 of file RootFile.cc.

References edm::RootTree::current(), edm::IndexIntoFile::IndexIntoFileItr::entry(), eventAux(), eventTree_, fileFormatVersion(), filePtr_, fillEventAuxiliary(), fillEventHistory(), fillRunAuxiliary(), edm::IndexIntoFile::IndexIntoFileItr::firstEventEntryThisRun(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), indexIntoFileEnd_, indexIntoFileIter_, edm::IndexIntoFile::invalidEntry, edm::Timestamp::invalidTimestamp(), edm::RootTree::isValid(), edm::IndexIntoFile::kRun, edm::FileFormatVersion::processHistorySameWithinRun(), edm::RunID::run(), findQualityFiles::run, edm::IndexIntoFile::IndexIntoFileItr::run(), runHelper_, runTree_, savedRunAuxiliary(), savedRunAuxiliary_, edm::RootTree::setEntryNumber(), edm::EventAuxiliary::time(), and ntuplemaker::time.

1455  {
1456  if(runHelper_->fakeNewRun()) {
1457  runHelper_->overrideRunNumber(savedRunAuxiliary_->id());
1458  return savedRunAuxiliary();
1459  }
1462 
1463  // Begin code for backward compatibility before the existence of run trees.
1464  if(!runTree_.isValid()) {
1465 
1466  // prior to the support of run trees.
1467  // RunAuxiliary did not contain a valid timestamp. Take it from the next event.
1469  assert(eventEntry != IndexIntoFile::invalidEntry);
1470  assert(eventTree_.current(eventEntry));
1471  fillEventAuxiliary(eventEntry);
1472 
1473  RunID run = RunID(indexIntoFileIter_.run());
1474  runHelper_->overrideRunNumber(run);
1475  savedRunAuxiliary_ = std::make_shared<RunAuxiliary>(run.run(), eventAux().time(), Timestamp::invalidTimestamp());
1476  return savedRunAuxiliary();
1477  }
1478  // End code for backward compatibility before the existence of run trees.
1480  std::shared_ptr<RunAuxiliary> runAuxiliary = fillRunAuxiliary();
1481  assert(runAuxiliary->run() == indexIntoFileIter_.run());
1482  runHelper_->overrideRunNumber(runAuxiliary->id());
1483  filePtr_->reportInputRunNumber(runAuxiliary->run());
1484  // If RunAuxiliary did not contain a valid begin timestamp, invalidate any end timestamp.
1485  if(runAuxiliary->beginTime() == Timestamp::invalidTimestamp()) {
1486  runAuxiliary->setEndTime(Timestamp::invalidTimestamp());
1487  }
1488 
1489  // If RunAuxiliary did not contain a valid timestamp, or if this an old format file from
1490  // when the Run's ProcessHistory included only processes where products were added to the Run itself,
1491  // we attempt to read the first event in the run to get appropriate info.
1492  if(runAuxiliary->beginTime() == Timestamp::invalidTimestamp() ||
1494 
1496  // If we have a valid event, use its information.
1497  if(eventEntry != IndexIntoFile::invalidEntry) {
1498  assert(eventTree_.current(eventEntry));
1499  fillEventAuxiliary(eventEntry);
1500 
1501  // RunAuxiliary did not contain a valid timestamp. Take it from the next event in this run if there is one.
1502  if(runAuxiliary->beginTime() == Timestamp::invalidTimestamp()) {
1503  runAuxiliary->setBeginTime(eventAux().time());
1504  }
1505 
1506  // For backwards compatibility when the Run's ProcessHistory included only processes where products were added to the
1507  // Run, and then the Run and Event auxiliaries could be different. Use the event ProcessHistoryID if there is one. It should
1508  // almost always be correct by the current definition (processes included if any products are added. This makes the run, lumi,
1509  // and event ProcessHistory's always be the same if no file merging occurs).
1510  if(!fileFormatVersion().processHistorySameWithinRun()) {
1511  fillEventHistory();
1512  runAuxiliary->setProcessHistoryID(eventAux().processHistoryID());
1513  }
1514  }
1515  }
1516  savedRunAuxiliary_ = runAuxiliary;
1517  return runAuxiliary;
1518  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
static Timestamp invalidTimestamp()
Definition: Timestamp.h:101
Timestamp const & time() const
edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:269
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
bool current() const
Definition: RootTree.h:97
long long EntryNumber_t
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1184
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
EventAuxiliary const & eventAux() const
Definition: RootFile.h:168
std::shared_ptr< RunAuxiliary > fillRunAuxiliary()
Definition: RootFile.cc:1276
RootTree eventTree_
Definition: RootFile.h:276
RootTree runTree_
Definition: RootFile.h:278
std::shared_ptr< RunAuxiliary const > savedRunAuxiliary() const
Definition: RootFile.h:244
static EntryNumber_t const invalidEntry
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:257
bool processHistorySameWithinRun() const
void fillEventHistory()
Definition: RootFile.cc:1194
bool isValid() const
Definition: RootTree.cc:105
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:287
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
void edm::RootFile::reportOpened ( std::string const &  inputType)

Definition at line 1139 of file RootFile.cc.

References edm::RootTree::branchNames(), eventTree_, edm::FileID::fid(), fid_, filePtr_, diffTwoXMLs::label, logicalFile_, edm::moduleName(), and AlCaHLTBitMon_QueryRunRegistry::string.

1139  {
1140  // Report file opened.
1141  std::string const label = "source";
1142  std::string moduleName = "PoolSource";
1143  filePtr_->inputFileOpened(
1144  logicalFile_,
1145  inputType,
1146  moduleName,
1147  label,
1148  fid_.fid(),
1150  }
std::vector< std::string > const & branchNames() const
Definition: RootTree.h:107
FileID fid_
Definition: RootFile.h:260
std::string const logicalFile_
Definition: RootFile.h:254
std::string moduleName(Provenance const &provenance)
Definition: Provenance.cc:27
std::string const & fid() const
Definition: FileID.h:19
RootTree eventTree_
Definition: RootFile.h:276
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:257
void edm::RootFile::rewind ( )
inline

Definition at line 192 of file RootFile.h.

192  {
194  eventTree_.rewind();
195  lumiTree_.rewind();
196  runTree_.rewind();
197  }
RootTree lumiTree_
Definition: RootFile.h:277
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
RootTree eventTree_
Definition: RootFile.h:276
RootTree runTree_
Definition: RootFile.h:278
IndexIntoFile::IndexIntoFileItr indexIntoFileBegin_
Definition: RootFile.h:264
void rewind()
Definition: RootTree.h:99
RootTree const& edm::RootFile::runTree ( ) const
inline

Definition at line 175 of file RootFile.h.

Referenced by validateFile().

175 {return runTree_;}
RootTree runTree_
Definition: RootFile.h:278
std::shared_ptr<RunAuxiliary const> edm::RootFile::savedRunAuxiliary ( ) const
inlineprivate

Definition at line 244 of file RootFile.h.

References edm::get_underlying_safe().

Referenced by readRunAuxiliary_().

edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:269
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
std::shared_ptr<RunAuxiliary>& edm::RootFile::savedRunAuxiliary ( )
inlineprivate

Definition at line 245 of file RootFile.h.

References edm::get_underlying_safe().

edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:269
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
void edm::RootFile::setAtEventEntry ( IndexIntoFile::EntryNumber_t  entry)

Definition at line 1450 of file RootFile.cc.

References eventTree_, and edm::RootTree::setEntryNumber().

1450  {
1452  }
RootTree eventTree_
Definition: RootFile.h:276
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
bool edm::RootFile::setEntryAtEvent ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi,
EventNumber_t  event 
)

Definition at line 1596 of file RootFile.cc.

References edm::IndexIntoFile::IndexIntoFileItr::entry(), eventTree_, edm::IndexIntoFile::findEventPosition(), indexIntoFile_, indexIntoFileEnd_, indexIntoFileIter_, and edm::RootTree::setEntryNumber().

1596  {
1598  if(indexIntoFileIter_ == indexIntoFileEnd_) return false;
1600  return true;
1601  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
RootTree eventTree_
Definition: RootFile.h:276
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
IndexIntoFileItr findEventPosition(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
Definition: event.py:1
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
bool edm::RootFile::setEntryAtItem ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi,
EventNumber_t  event 
)
inline

Definition at line 182 of file RootFile.h.

References mps_splice::entry, and findQualityFiles::run.

182  {
184  }
bool setEntryAtRun(RunNumber_t run)
Definition: RootFile.cc:1612
bool setEntryAtLumi(RunNumber_t run, LuminosityBlockNumber_t lumi)
Definition: RootFile.cc:1604
bool setEntryAtEvent(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event)
Definition: RootFile.cc:1596
Definition: event.py:1
bool edm::RootFile::setEntryAtLumi ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi 
)

Definition at line 1604 of file RootFile.cc.

References edm::IndexIntoFile::IndexIntoFileItr::entry(), edm::IndexIntoFile::findLumiPosition(), indexIntoFile_, indexIntoFileEnd_, indexIntoFileIter_, lumiTree_, and edm::RootTree::setEntryNumber().

1604  {
1606  if(indexIntoFileIter_ == indexIntoFileEnd_) return false;
1608  return true;
1609  }
RootTree lumiTree_
Definition: RootFile.h:277
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
IndexIntoFileItr findLumiPosition(RunNumber_t run, LuminosityBlockNumber_t lumi) const
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
bool edm::RootFile::setEntryAtNextEventInLumi ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi 
)

Definition at line 1620 of file RootFile.cc.

References edm::IndexIntoFile::IndexIntoFileItr::advanceToEvent(), edm::IndexIntoFile::IndexIntoFileItr::entry(), fillEventAuxiliary(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), indexIntoFileIter_, edm::IndexIntoFile::kEvent, edm::IndexIntoFile::IndexIntoFileItr::lumi(), and edm::IndexIntoFile::IndexIntoFileItr::run().

1620  {
1623  }
1626  if(run != indexIntoFileIter_.run()) return false;
1627  if(lumi != indexIntoFileIter_.lumi()) return false;
1629  return true;
1630  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
LuminosityBlockNumber_t lumi() const
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1184
bool edm::RootFile::setEntryAtRun ( RunNumber_t  run)

Definition at line 1612 of file RootFile.cc.

References edm::IndexIntoFile::IndexIntoFileItr::entry(), edm::IndexIntoFile::findRunPosition(), indexIntoFile_, indexIntoFileEnd_, indexIntoFileIter_, runTree_, and edm::RootTree::setEntryNumber().

1612  {
1614  if(indexIntoFileIter_ == indexIntoFileEnd_) return false;
1616  return true;
1617  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
IndexIntoFileItr findRunPosition(RunNumber_t run) const
Same as findPosition.
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
RootTree runTree_
Definition: RootFile.h:278
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:196
void edm::RootFile::setIfFastClonable ( int  remainingEvents,
int  remainingLumis 
)
private

Definition at line 604 of file RootFile.cc.

References duplicateChecker_, edm::FileBlock::DuplicateEventsRemoved, edm::RootTree::entries(), edm::FileBlock::EventsToBeSorted, eventTree_, fileFormatVersion(), edm::FileBlock::FileTooOld, edm::IndexIntoFile::firstAppearanceOrder, edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), indexIntoFile_, indexIntoFileBegin_, indexIntoFileEnd_, edm::FileBlock::InitialEventsSkipped, edm::IndexIntoFile::iterationWillBeInEntryOrder(), edm::IndexIntoFile::kEvent, lumiTree_, edm::FileBlock::MaxEventsTooSmall, edm::FileBlock::MaxLumisTooSmall, edm::FileBlock::NoEventsInFile, noEventSort_, edm::FileBlock::NotProcessingEvents, edm::IndexIntoFile::numericalOrder, processingMode_, edm::FileBlock::RunOrLumiNotContiguous, edm::InputSource::RunsLumisAndEvents, skipAnyEvents_, and whyNotFastClonable_.

Referenced by RootFile().

604  {
605  if(fileFormatVersion().noMetaDataTrees() and !fileFormatVersion().storedProductProvenanceUsed()) {
606  //we must avoid copying the old branch which stored the per product per event provenance
608  return;
609  }
610  if(!fileFormatVersion().splitProductIDs()) {
612  return;
613  }
616  return;
617  }
618  // Find entry for first event in file
619  IndexIntoFile::IndexIntoFileItr it = indexIntoFileBegin_;
620  while(it != indexIntoFileEnd_ && it.getEntryType() != IndexIntoFile::kEvent) {
621  ++it;
622  }
623  if(it == indexIntoFileEnd_) {
625  return;
626  }
627 
628  // From here on, record all reasons we can't fast clone.
632  }
633  if(skipAnyEvents_) {
635  }
636  if(remainingEvents >= 0 && eventTree_.entries() > remainingEvents) {
638  }
639  if(remainingLumis >= 0 && lumiTree_.entries() > remainingLumis) {
641  }
642  if(duplicateChecker_ &&
643  !duplicateChecker_->checkDisabled() &&
644  !duplicateChecker_->noDuplicatesInFile()) {
646  }
647  }
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:294
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
int whyNotFastClonable_
Definition: RootFile.h:272
RootTree lumiTree_
Definition: RootFile.h:277
EntryNumber const & entries() const
Definition: RootTree.h:104
InputSource::ProcessingMode processingMode_
Definition: RootFile.h:286
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
bool noEventSort_
Definition: RootFile.h:271
bool skipAnyEvents_
Definition: RootFile.h:270
RootTree eventTree_
Definition: RootFile.h:276
bool iterationWillBeInEntryOrder(SortOrder sortOrder) const
Used to determine whether or not to disable fast cloning.
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
IndexIntoFile::IndexIntoFileItr indexIntoFileBegin_
Definition: RootFile.h:264
void edm::RootFile::setPosition ( IndexIntoFile::IndexIntoFileItr const &  position)

Definition at line 681 of file RootFile.cc.

References edm::IndexIntoFile::IndexIntoFileItr::copyPosition(), and indexIntoFileIter_.

681  {
683  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
void copyPosition(IndexIntoFileItr const &position)
Copy the position without modifying the pointer to the IndexIntoFile or size.
static int position[264][3]
Definition: ReadPGInfo.cc:509
void edm::RootFile::setSignals ( signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *  preEventReadSource,
signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *  postEventReadSource 
)

Definition at line 1796 of file RootFile.cc.

References eventTree_, and edm::RootTree::setSignals().

1797  {
1798  eventTree_.setSignals(preEventReadSource,postEventReadSource);
1799  }
void setSignals(signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *preEventReadSource, signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *postEventReadSource)
Definition: RootTree.cc:462
RootTree eventTree_
Definition: RootFile.h:276
void edm::RootFile::setToLastEntry ( )
inline

Definition at line 198 of file RootFile.h.

198  {
200  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
bool edm::RootFile::skipEntries ( unsigned int &  offset)
inline
bool edm::RootFile::skipEvents ( int &  offset)

Definition at line 1297 of file RootFile.cc.

References duplicateChecker_, edm::EventID::event(), eventAux_, eventSkipperByID_, file_, fillEventAuxiliary(), edm::EventAuxiliary::id(), indexIntoFileEnd_, indexIntoFileIter_, edm::IndexIntoFile::invalidEntry, edm::IndexIntoFile::invalidIndex, edm::IndexIntoFile::invalidLumi, edm::IndexIntoFile::invalidRun, PFRecoTauDiscriminationByIsolation_cfi::offset, edm::IndexIntoFile::IndexIntoFileItr::skipEventBackward(), and edm::IndexIntoFile::IndexIntoFileItr::skipEventForward().

1297  {
1298  while(offset > 0 && indexIntoFileIter_ != indexIntoFileEnd_) {
1299 
1300  int phIndexOfSkippedEvent = IndexIntoFile::invalidIndex;
1301  RunNumber_t runOfSkippedEvent = IndexIntoFile::invalidRun;
1304 
1305  indexIntoFileIter_.skipEventForward(phIndexOfSkippedEvent,
1306  runOfSkippedEvent,
1307  lumiOfSkippedEvent,
1308  skippedEventEntry);
1309 
1310  // At the end of the file and there were no more events to skip
1311  if(skippedEventEntry == IndexIntoFile::invalidEntry) break;
1312 
1313  if(eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
1314  fillEventAuxiliary(skippedEventEntry);
1315  if(eventSkipperByID_->skipIt(runOfSkippedEvent, lumiOfSkippedEvent, eventAux_.id().event())) {
1316  continue;
1317  }
1318  }
1319  if(duplicateChecker_ &&
1320  !duplicateChecker_->checkDisabled() &&
1321  !duplicateChecker_->noDuplicatesInFile()) {
1322 
1323  fillEventAuxiliary(skippedEventEntry);
1324  if(duplicateChecker_->isDuplicateAndCheckActive(phIndexOfSkippedEvent,
1325  runOfSkippedEvent,
1326  lumiOfSkippedEvent,
1327  eventAux_.id().event(),
1328  file_)) {
1329  continue;
1330  }
1331  }
1332  --offset;
1333  }
1334 
1335  while(offset < 0) {
1336 
1337  if(duplicateChecker_) {
1338  duplicateChecker_->disable();
1339  }
1340 
1341  int phIndexOfEvent = IndexIntoFile::invalidIndex;
1345 
1346  indexIntoFileIter_.skipEventBackward(phIndexOfEvent,
1347  runOfEvent,
1348  lumiOfEvent,
1349  eventEntry);
1350 
1351  if(eventEntry == IndexIntoFile::invalidEntry) break;
1352 
1353  if(eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
1354  fillEventAuxiliary(eventEntry);
1355  if(eventSkipperByID_->skipIt(runOfEvent, lumiOfEvent, eventAux_.id().event())) {
1356  continue;
1357  }
1358  }
1359  ++offset;
1360  }
1362  }
EventNumber_t event() const
Definition: EventID.h:41
static int const invalidIndex
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:294
edm::propagate_const< std::shared_ptr< EventSkipperByID > > eventSkipperByID_
Definition: RootFile.h:258
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
unsigned int LuminosityBlockNumber_t
long long EntryNumber_t
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1184
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
static RunNumber_t const invalidRun
void skipEventBackward(int &phIndexOfEvent, RunNumber_t &runOfEvent, LuminosityBlockNumber_t &lumiOfEvent, EntryNumber_t &eventEntry)
static EntryNumber_t const invalidEntry
static LuminosityBlockNumber_t const invalidLumi
EventID const & id() const
unsigned int RunNumber_t
EventAuxiliary eventAux_
Definition: RootFile.h:275
std::string const file_
Definition: RootFile.h:253
void skipEventForward(int &phIndexOfSkippedEvent, RunNumber_t &runOfSkippedEvent, LuminosityBlockNumber_t &lumiOfSkippedEvent, EntryNumber_t &skippedEventEntry)
bool edm::RootFile::skipThisEntry ( )
private

Definition at line 691 of file RootFile.cc.

References edm::IndexIntoFile::IndexIntoFileItr::entry(), edm::EventID::event(), eventAux_, eventSkipperByID_, fillEventAuxiliary(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), edm::EventAuxiliary::id(), indexIntoFileEnd_, indexIntoFileIter_, edm::IndexIntoFile::invalidLumi, edm::IndexIntoFile::kEvent, edm::IndexIntoFile::kRun, edm::IndexIntoFile::IndexIntoFileItr::lumi(), edm::IndexIntoFile::IndexIntoFileItr::peekAheadAtLumi(), edm::IndexIntoFile::IndexIntoFileItr::run(), edm::IndexIntoFile::IndexIntoFileItr::skipLumiInRun(), and mitigatedMETSequence_cff::U.

Referenced by getNextItemType().

691  {
693  return false;
694  }
695  if(eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
696 
697  // See first if the entire lumi or run is skipped, so we won't have to read the event Auxiliary in that case.
699  return true;
700  }
701 
702  // The Lumi is not skipped. If this is an event, see if the event is skipped.
707  eventAux_.id().event())) {
708  return true;
709  }
710  }
711 
712  // Skip runs with no lumis if either lumisToSkip or lumisToProcess have been set to select lumis
714  eventSkipperByID_->skippingLumis()) {
715  IndexIntoFile::IndexIntoFileItr iterLumi = indexIntoFileIter_;
716 
717  // There are no lumis in this run, not even ones we will skip
718  if(iterLumi.peekAheadAtLumi() == IndexIntoFile::invalidLumi) {
719  return true;
720  }
721  // If we get here there are lumis in the run, check to see if we are skipping all of them
722  do {
723  if(!eventSkipperByID_->skipIt(iterLumi.run(), iterLumi.peekAheadAtLumi(), 0U)) {
724  return false;
725  }
726  }
727  while(iterLumi.skipLumiInRun());
728  return true;
729  }
730  }
731  return false;
732  }
EventNumber_t event() const
Definition: EventID.h:41
edm::propagate_const< std::shared_ptr< EventSkipperByID > > eventSkipperByID_
Definition: RootFile.h:258
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
LuminosityBlockNumber_t lumi() const
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1184
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:265
static LuminosityBlockNumber_t const invalidLumi
EventID const & id() const
EventAuxiliary eventAux_
Definition: RootFile.h:275
RootTreePtrArray& edm::RootFile::treePointers ( )
inlineprivate

Definition at line 220 of file RootFile.h.

References MicroEventContent_cff::branch, cmsCodeRulesChecker::rules, and AlCaHLTBitMon_QueryRunRegistry::string.

220 {return treePointers_;}
RootTreePtrArray treePointers_
Definition: RootFile.h:279
void edm::RootFile::validateFile ( InputType  inputType,
bool  usingGoToEvent 
)
private

Definition at line 1092 of file RootFile.cc.

References edm::createGlobalIdentifier(), daqProvenanceHelper_, duplicateChecker_, edm::IndexIntoFile::empty(), edm::RootTree::entries(), edm::errors::EventCorruption, eventTree_, Exception, fid_, fileFormatVersion(), edm::IndexIntoFile::fillEventNumbersOrEntries(), fillIndexIntoFile(), edm::IndexIntoFile::fixIndexes(), indexIntoFile_, edm::FileID::isValid(), edm::RootTree::isValid(), noEventSort_, orderedProcessHistoryIDs_, edm::Primary, processHistoryRegistry_, edm::IndexIntoFile::reduceProcessHistoryIDs(), runTree(), edm::IndexIntoFile::setEventFinder(), edm::IndexIntoFile::setNumberOfEvents(), edm::IndexIntoFile::setProcessHistoryIDs(), and edm::FileFormatVersion::useReducedProcessHistoryID().

Referenced by RootFile().

1092  {
1093  if(!fid_.isValid()) {
1094  fid_ = FileID(createGlobalIdentifier());
1095  }
1096  if(!eventTree_.isValid()) {
1098  "'Events' tree is corrupted or not present\n" << "in the input file.\n";
1099  }
1100 
1101  if(fileFormatVersion().hasIndexIntoFile()) {
1102  if(runTree().entries() > 0) {
1103  assert(!indexIntoFile_.empty());
1104  }
1106  if(daqProvenanceHelper_) {
1107  std::vector<ProcessHistoryID>& phidVec = indexIntoFile_.setProcessHistoryIDs();
1108  for(auto& phid : phidVec) {
1109  phid = daqProvenanceHelper_->mapProcessHistoryID(phid);
1110  }
1111  }
1113  }
1114  }
1115  else {
1116  assert(indexIntoFile_.empty());
1118  }
1119 
1122  indexIntoFile_.setEventFinder(std::shared_ptr<IndexIntoFile::EventFinder>(std::make_shared<RootFileEventFinder>(eventTree_)));
1123  // We fill the event numbers explicitly if we need to find events in closed files,
1124  // such as for secondary files (or secondary sources) or if duplicate checking across files.
1125  bool needEventNumbers = false;
1126  bool needIndexesForDuplicateChecker = duplicateChecker_ && duplicateChecker_->checkingAllFiles() && !duplicateChecker_->checkDisabled();
1127  if(inputType != InputType::Primary || needIndexesForDuplicateChecker || usingGoToEvent) {
1128  needEventNumbers = true;
1129  }
1130  bool needEventEntries = false;
1131  if(inputType != InputType::Primary || !noEventSort_) {
1132  // We need event entries for sorting or for secondary files or sources.
1133  needEventEntries = true;
1134  }
1135  indexIntoFile_.fillEventNumbersOrEntries(needEventNumbers, needEventEntries);
1136  }
void fillEventNumbersOrEntries(bool needEventNumbers, bool needEventEntries) const
void setEventFinder(std::shared_ptr< EventFinder > ptr) const
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:294
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:176
bool empty() const
True if no runs, lumis, or events are in the file.
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:256
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:299
EntryNumber const & entries() const
Definition: RootTree.h:104
void reduceProcessHistoryIDs(ProcessHistoryRegistry const &processHistoryRegistry)
FileID fid_
Definition: RootFile.h:260
std::vector< ProcessHistoryID > & setProcessHistoryIDs()
bool noEventSort_
Definition: RootFile.h:271
RootTree const & runTree() const
Definition: RootFile.h:175
RootTree eventTree_
Definition: RootFile.h:276
bool isValid() const
Definition: FileID.h:18
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:262
void fixIndexes(std::vector< ProcessHistoryID > &processHistoryIDs)
bool isValid() const
Definition: RootTree.cc:105
void fillIndexIntoFile()
Definition: RootFile.cc:866
std::vector< ProcessHistoryID > & orderedProcessHistoryIDs_
Definition: RootFile.h:263
void setNumberOfEvents(EntryNumber_t nevents) const
bool useReducedProcessHistoryID() const
std::string createGlobalIdentifier()
bool edm::RootFile::wasFirstEventJustRead ( ) const

Definition at line 804 of file RootFile.cc.

References a, b, mps_splice::entry, indexIntoFileIter_, edm::IndexIntoFile::invalidEntry, csvLumiCalc::lumi, findQualityFiles::run, and edm::IndexIntoFile::IndexIntoFileItr::skipEventBackward().

804  {
805  IndexIntoFile::IndexIntoFileItr itr(indexIntoFileIter_);
806  int phIndex;
809  IndexIntoFile::EntryNumber_t eventEntry;
810  itr.skipEventBackward(phIndex,
811  run,
812  lumi,
813  eventEntry);
814  itr.skipEventBackward(phIndex,
815  run,
816  lumi,
817  eventEntry);
818  return eventEntry == IndexIntoFile::invalidEntry;
819  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
unsigned int LuminosityBlockNumber_t
long long EntryNumber_t
static EntryNumber_t const invalidEntry
unsigned int RunNumber_t
bool edm::RootFile::wasLastEventJustRead ( ) const

Definition at line 797 of file RootFile.cc.

References edm::IndexIntoFile::IndexIntoFileItr::advanceToEvent(), edm::IndexIntoFile::IndexIntoFileItr::getEntryType(), indexIntoFileIter_, and edm::IndexIntoFile::kEnd.

797  {
798  IndexIntoFile::IndexIntoFileItr itr(indexIntoFileIter_);
799  itr.advanceToEvent();
800  return itr.getEntryType() == IndexIntoFile::kEnd;
801  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:266
int edm::RootFile::whyNotFastClonable ( ) const
inline

Definition at line 177 of file RootFile.h.

Referenced by createFileBlock().

177 {return whyNotFastClonable_;}
int whyNotFastClonable_
Definition: RootFile.h:272

Member Data Documentation

edm::propagate_const<std::shared_ptr<BranchChildren> > edm::RootFile::branchChildren_
private

Definition at line 293 of file RootFile.h.

Referenced by markBranchToBeDropped(), and RootFile().

edm::propagate_const<std::shared_ptr<BranchIDListHelper> > edm::RootFile::branchIDListHelper_
private

Definition at line 283 of file RootFile.h.

Referenced by fillEventHistory(), and RootFile().

std::shared_ptr<BranchIDLists const> edm::RootFile::branchIDLists_
private

Definition at line 282 of file RootFile.h.

Referenced by RootFile().

BranchListIndexes edm::RootFile::branchListIndexes_
private

Definition at line 291 of file RootFile.h.

Referenced by fillEventHistory(), and readCurrentEvent().

bool edm::RootFile::branchListIndexesUnchanged_
private

Definition at line 274 of file RootFile.h.

Referenced by RootFile().

edm::propagate_const<std::unique_ptr<DaqProvenanceHelper> > edm::RootFile::daqProvenanceHelper_
private
edm::propagate_const<std::shared_ptr<DuplicateChecker> > edm::RootFile::duplicateChecker_
private
edm::propagate_const<TClass*> edm::RootFile::edProductClass_
private

Definition at line 300 of file RootFile.h.

Referenced by dropOnInput().

EventAuxiliary edm::RootFile::eventAux_
private
edm::propagate_const<TTree*> edm::RootFile::eventHistoryTree_
private

Definition at line 289 of file RootFile.h.

Referenced by close(), fillEventHistory(), and readEventHistoryTree().

std::vector<EventProcessHistoryID> edm::RootFile::eventProcessHistoryIDs_
private

Definition at line 267 of file RootFile.h.

Referenced by fillEventHistory(), and RootFile().

std::vector<EventProcessHistoryID>::const_iterator edm::RootFile::eventProcessHistoryIter_
private

Definition at line 268 of file RootFile.h.

Referenced by fillEventHistory(), and RootFile().

std::vector<edm::propagate_const<std::shared_ptr<ProductProvenanceRetriever> > > edm::RootFile::eventProductProvenanceRetrievers_
private

Definition at line 297 of file RootFile.h.

Referenced by makeProductProvenanceRetriever().

EventSelectionIDVector edm::RootFile::eventSelectionIDs_
private

Definition at line 290 of file RootFile.h.

Referenced by fillEventHistory(), and readCurrentEvent().

edm::propagate_const<std::shared_ptr<EventSkipperByID> > edm::RootFile::eventSkipperByID_
private

Definition at line 258 of file RootFile.h.

Referenced by RootFile(), skipEvents(), and skipThisEntry().

RootTree edm::RootFile::eventTree_
private
FileID edm::RootFile::fid_
private

Definition at line 260 of file RootFile.h.

Referenced by reportOpened(), RootFile(), and validateFile().

std::string const edm::RootFile::file_
private

Definition at line 253 of file RootFile.h.

Referenced by createFileBlock(), dropOnInput(), isDuplicateEvent(), and skipEvents().

FileFormatVersion edm::RootFile::fileFormatVersion_
private

Definition at line 259 of file RootFile.h.

Referenced by makeProvenanceReaderMaker(), and RootFile().

edm::propagate_const<std::shared_ptr<InputFile> > edm::RootFile::filePtr_
private
edm::propagate_const<std::unique_ptr<ThinnedAssociationsHelper> > edm::RootFile::fileThinnedAssociationsHelper_
private

Definition at line 284 of file RootFile.h.

Referenced by dropOnInput(), initAssociationsFromSecondary(), and RootFile().

std::array<bool, NumBranchTypes> edm::RootFile::hasNewlyDroppedBranch_
private

Definition at line 273 of file RootFile.h.

Referenced by dropOnInput(), and RootFile().

edm::propagate_const<std::unique_ptr<History> > edm::RootFile::history_
private

Definition at line 292 of file RootFile.h.

Referenced by fillEventHistory(), and readEventHistoryTree().

IndexIntoFile& edm::RootFile::indexIntoFile_
private
IndexIntoFile::IndexIntoFileItr edm::RootFile::indexIntoFileBegin_
private

Definition at line 264 of file RootFile.h.

Referenced by RootFile(), and setIfFastClonable().

IndexIntoFile::IndexIntoFileItr edm::RootFile::indexIntoFileEnd_
private
IndexIntoFile::IndexIntoFileItr edm::RootFile::indexIntoFileIter_
private
edm::propagate_const<std::shared_ptr<IndexIntoFile> > edm::RootFile::indexIntoFileSharedPtr_
private

Definition at line 261 of file RootFile.h.

IndexIntoFile::EntryNumber_t edm::RootFile::lastEventEntryNumberRead_
private

Definition at line 280 of file RootFile.h.

Referenced by fillIndexIntoFile(), and fillThisEventAuxiliary().

std::string const edm::RootFile::logicalFile_
private

Definition at line 254 of file RootFile.h.

Referenced by reportOpened().

RootTree edm::RootFile::lumiTree_
private
std::map<std::string, std::string> edm::RootFile::newBranchToOldBranch_
private

Definition at line 288 of file RootFile.h.

Referenced by newBranchToOldBranch(), and RootFile().

bool edm::RootFile::noEventSort_
private

Definition at line 271 of file RootFile.h.

Referenced by goToEvent(), setIfFastClonable(), and validateFile().

std::vector<ProcessHistoryID>& edm::RootFile::orderedProcessHistoryIDs_
private

Definition at line 263 of file RootFile.h.

Referenced by validateFile().

std::vector<ParentageID> edm::RootFile::parentageIDLookup_
private

Definition at line 298 of file RootFile.h.

Referenced by makeProvenanceReaderMaker(), and readParentageTree().

ProcessConfiguration const& edm::RootFile::processConfiguration_
private

Definition at line 255 of file RootFile.h.

edm::propagate_const<ProcessHistoryRegistry*> edm::RootFile::processHistoryRegistry_
private
InputSource::ProcessingMode edm::RootFile::processingMode_
private

Definition at line 286 of file RootFile.h.

Referenced by getNextItemType(), and setIfFastClonable().

std::shared_ptr<ProductRegistry const> edm::RootFile::productRegistry_
private

Definition at line 281 of file RootFile.h.

Referenced by RootFile().

edm::propagate_const<std::unique_ptr<ProvenanceAdaptor> > edm::RootFile::provenanceAdaptor_
private

Definition at line 295 of file RootFile.h.

Referenced by fillEventHistory(), fillLumiAuxiliary(), fillRunAuxiliary(), and RootFile().

edm::propagate_const<std::unique_ptr<MakeProvenanceReader> > edm::RootFile::provenanceReaderMaker_
private

Definition at line 296 of file RootFile.h.

Referenced by makeProductProvenanceRetriever(), and RootFile().

edm::propagate_const<RunHelperBase*> edm::RootFile::runHelper_
private
RootTree edm::RootFile::runTree_
private
edm::propagate_const<std::shared_ptr<RunAuxiliary> > edm::RootFile::savedRunAuxiliary_
private

Definition at line 269 of file RootFile.h.

Referenced by readLuminosityBlockAuxiliary_(), and readRunAuxiliary_().

bool edm::RootFile::skipAnyEvents_
private

Definition at line 270 of file RootFile.h.

Referenced by setIfFastClonable().

edm::propagate_const<std::shared_ptr<ThinnedAssociationsHelper> > edm::RootFile::thinnedAssociationsHelper_
private

Definition at line 285 of file RootFile.h.

Referenced by initAssociationsFromSecondary().

RootTreePtrArray edm::RootFile::treePointers_
private

Definition at line 279 of file RootFile.h.

Referenced by close(), dropOnInput(), and RootFile().

int edm::RootFile::whyNotFastClonable_
private

Definition at line 272 of file RootFile.h.

Referenced by RootFile(), and setIfFastClonable().