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, bool enforceGUIDInFileName)
 
 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, bool enforceGUIDInFileName)
 
 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, bool enforceGUIDInFileName)
 
 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_
 
bool enforceGUIDInFileName_
 
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,
bool  enforceGUIDInFileName 
)

Definition at line 131 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_.

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

Definition at line 95 of file RootFile.h.

116  : RootFile(
117  fileName, processConfiguration, logicalFileName, filePtr,
118  nullptr, false, -1, -1, nStreams, 0U, treeMaxVirtualSize,
119  processingMode, runHelper,
120  false, productSelectorRules, inputType, branchIDListHelper,
121  thinnedAssociationsHelper, associationsFromSecondary,
122  nullptr, dropDescendantsOfDroppedProducts, processHistoryRegistry,
123  indexesIntoFiles, currentIndexIntoFile, orderedProcessHistoryIDs,
124  bypassVersionCheck, labelRawDataLikeMC,
125  false, enablePrefetching, enforceGUIDInFileName) {}
std::shared_ptr< BranchIDListHelper const > branchIDListHelper() const
Definition: RootFile.h:210
RootFile(std::string const &fileName, ProcessConfiguration const &processConfiguration, std::string const &logicalFileName, std::shared_ptr< InputFile > filePtr, std::shared_ptr< EventSkipperByID > eventSkipperByID, bool skipAnyEvents, int remainingEvents, int remainingLumis, unsigned int nStreams, unsigned int treeCacheSize, int treeMaxVirtualSize, InputSource::ProcessingMode processingMode, RunHelperBase *runHelper, bool noEventSort, ProductSelectorRules const &productSelectorRules, InputType inputType, std::shared_ptr< BranchIDListHelper > branchIDListHelper, std::shared_ptr< ThinnedAssociationsHelper > thinnedAssociationsHelper, std::vector< BranchID > const *associationsFromSecondary, std::shared_ptr< DuplicateChecker > duplicateChecker, bool dropDescendantsOfDroppedProducts, ProcessHistoryRegistry &processHistoryRegistry, std::vector< std::shared_ptr< IndexIntoFile > > const &indexesIntoFiles, std::vector< std::shared_ptr< IndexIntoFile > >::size_type currentIndexIntoFile, std::vector< ProcessHistoryID > &orderedProcessHistoryIDs, bool bypassVersionCheck, bool labelRawDataLikeMC, bool usingGoToEvent, bool enablePrefetching, bool enforceGUIDInFileName)
Definition: RootFile.cc:131
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,
bool  enforceGUIDInFileName 
)
inline

Definition at line 127 of file RootFile.h.

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

143  : RootFile(
144  fileName, processConfiguration, logicalFileName, filePtr,
145  nullptr, false, -1, -1, nStreams, treeCacheSize, treeMaxVirtualSize,
147  false, productSelectorRules, inputType, nullptr, nullptr,
148  nullptr, nullptr, false, processHistoryRegistry,
149  indexesIntoFiles, currentIndexIntoFile, orderedProcessHistoryIDs,
150  bypassVersionCheck, false,
151  false, enablePrefetching, enforceGUIDInFileName) {}
RootFile(std::string const &fileName, ProcessConfiguration const &processConfiguration, std::string const &logicalFileName, std::shared_ptr< InputFile > filePtr, std::shared_ptr< EventSkipperByID > eventSkipperByID, bool skipAnyEvents, int remainingEvents, int remainingLumis, unsigned int nStreams, unsigned int treeCacheSize, int treeMaxVirtualSize, InputSource::ProcessingMode processingMode, RunHelperBase *runHelper, bool noEventSort, ProductSelectorRules const &productSelectorRules, InputType inputType, std::shared_ptr< BranchIDListHelper > branchIDListHelper, std::shared_ptr< ThinnedAssociationsHelper > thinnedAssociationsHelper, std::vector< BranchID > const *associationsFromSecondary, std::shared_ptr< DuplicateChecker > duplicateChecker, bool dropDescendantsOfDroppedProducts, ProcessHistoryRegistry &processHistoryRegistry, std::vector< std::shared_ptr< IndexIntoFile > > const &indexesIntoFiles, std::vector< std::shared_ptr< IndexIntoFile > >::size_type currentIndexIntoFile, std::vector< ProcessHistoryID > &orderedProcessHistoryIDs, bool bypassVersionCheck, bool labelRawDataLikeMC, bool usingGoToEvent, bool enablePrefetching, bool enforceGUIDInFileName)
Definition: RootFile.cc:131
edm::RootFile::~RootFile ( )

Definition at line 521 of file RootFile.cc.

521  {
522  }
edm::RootFile::RootFile ( RootFile const &  )
delete

Member Function Documentation

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

Definition at line 250 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:297
std::shared_ptr<BranchChildren>& edm::RootFile::branchChildren ( )
inlineprivate

Definition at line 251 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:297
std::shared_ptr<BranchIDListHelper const> edm::RootFile::branchIDListHelper ( ) const
inline

Definition at line 210 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:287
std::shared_ptr<BranchIDListHelper>& edm::RootFile::branchIDListHelper ( )
inline

Definition at line 211 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:287
bool edm::RootFile::branchListIndexesUnchanged ( ) const
inline

Definition at line 182 of file RootFile.h.

Referenced by createFileBlock().

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

Definition at line 1164 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().

1164  {
1165  // Just to play it safe, zero all pointers to objects in the InputFile to be closed.
1166  eventHistoryTree_ = nullptr;
1167  for(auto& treePointer : treePointers_) {
1168  treePointer->close();
1169  treePointer = nullptr;
1170  }
1171  filePtr_->Close();
1172  filePtr_ = nullptr; // propagate_const<T> has no reset() function
1173  }
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:260
edm::propagate_const< TTree * > eventHistoryTree_
Definition: RootFile.h:293
RootTreePtrArray treePointers_
Definition: RootFile.h:283
bool edm::RootFile::containsItem ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi,
EventNumber_t  event 
) const

Definition at line 749 of file RootFile.cc.

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

749  {
751  }
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:265
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 653 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().

653  {
654  return std::make_unique<FileBlock>(fileFormatVersion(),
655  eventTree_.tree(),
657  lumiTree_.tree(),
659  runTree_.tree(),
660  runTree_.metaTree(),
663  file_,
665  modifiedIDs(),
666  branchChildren());
667  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
bool branchListIndexesUnchanged() const
Definition: RootFile.h:182
RootTree lumiTree_
Definition: RootFile.h:281
TTree const * metaTree() const
Definition: RootTree.h:152
TTree const * tree() const
Definition: RootTree.h:150
bool modifiedIDs() const
Definition: RootFile.h:183
int whyNotFastClonable() const
Definition: RootFile.h:180
RootTree eventTree_
Definition: RootFile.h:280
std::array< bool, NumBranchTypes > const & hasNewlyDroppedBranch() const
Definition: RootFile.h:181
RootTree runTree_
Definition: RootFile.h:282
std::shared_ptr< BranchChildren const > branchChildren() const
Definition: RootFile.h:250
std::string const file_
Definition: RootFile.h:256
void edm::RootFile::dropOnInput ( ProductRegistry reg,
ProductSelectorRules const &  rules,
bool  dropDescendants,
InputType  inputType 
)
private

Definition at line 1683 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().

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

Definition at line 175 of file RootFile.h.

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

Definition at line 253 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:301
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 254 of file RootFile.h.

References edm::get_underlying_safe().

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

Definition at line 176 of file RootFile.h.

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

Definition at line 169 of file RootFile.h.

Referenced by RootFile().

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

Definition at line 1195 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().

1195  {
1196  if(!eventTree_.current(entry)) {
1197  return false;
1198  }
1201  return true;
1202  }
bool current() const
Definition: RootTree.h:98
RootTree eventTree_
Definition: RootFile.h:280
void fillThisEventAuxiliary()
Definition: RootFile.cc:1176
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:205
void edm::RootFile::fillEventHistory ( )
private

Definition at line 1205 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_, triggerObjects_cff::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_().

1205  {
1206  // We could consider doing delayed reading, but because we have to
1207  // store this History object in a different tree than the event
1208  // data tree, this is too hard to do in this first version.
1209 
1210  if(fileFormatVersion().eventHistoryBranch()) {
1211  // Lumi block number was not in EventID for the relevant releases.
1212  EventID id(eventAux().id().run(), 0, eventAux().id().event());
1213  if(eventProcessHistoryIter_->eventID() != id) {
1214  EventProcessHistoryID target(id, ProcessHistoryID());
1216  assert(eventProcessHistoryIter_->eventID() == id);
1217  }
1220  } else if(fileFormatVersion().eventHistoryTree()) {
1221  // for backward compatibility.
1222  History* pHistory = history_.get();
1223  TBranch* eventHistoryBranch = eventHistoryTree_->GetBranch(poolNames::eventHistoryBranchName().c_str());
1224  if(!eventHistoryBranch) {
1226  << "Failed to find history branch in event history tree.\n";
1227  }
1228  eventHistoryBranch->SetAddress(&pHistory);
1230  eventAux_.setProcessHistoryID(history_->processHistoryID());
1231  eventSelectionIDs_.swap(history_->eventSelectionIDs());
1232  branchListIndexes_.swap(history_->branchListIndexes());
1233  } else if(fileFormatVersion().noMetaDataTrees()) {
1234  // Current format
1236  TBranch* eventSelectionIDBranch = eventTree_.tree()->GetBranch(poolNames::eventSelectionsBranchName().c_str());
1237  assert(eventSelectionIDBranch != nullptr);
1238  eventTree_.fillBranchEntry(eventSelectionIDBranch, pESV);
1240  TBranch* branchListIndexesBranch = eventTree_.tree()->GetBranch(poolNames::branchListIndexesBranchName().c_str());
1241  assert(branchListIndexesBranch != nullptr);
1242  eventTree_.fillBranchEntry(branchListIndexesBranch, pBLI);
1243  }
1244  if(provenanceAdaptor_) {
1245  eventAux_.setProcessHistoryID(provenanceAdaptor_->convertID(eventAux().processHistoryID()));
1246  for(auto& esID : eventSelectionIDs_) {
1247  esID = provenanceAdaptor_->convertID(esID);
1248  }
1249  }
1250  if(daqProvenanceHelper_) {
1252  }
1254  // old format. branchListIndexes_ must be filled in from the ProvenanceAdaptor.
1255  provenanceAdaptor_->branchListIndexes(branchListIndexes_);
1256  }
1257  if(branchIDListHelper_) {
1258  branchIDListHelper_->fixBranchListIndexes(branchListIndexes_);
1259  }
1260  }
Int_t getEntry(TBranch *branch, EntryNumber entryNumber)
Definition: RootTree.cc:497
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
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:303
std::string const & eventSelectionsBranchName()
Definition: BranchType.cc:243
std::vector< EventSelectionID > EventSelectionIDVector
std::vector< EventProcessHistoryID >::const_iterator eventProcessHistoryIter_
Definition: RootFile.h:271
TTree const * tree() const
Definition: RootTree.h:150
std::vector< BranchListIndex > BranchListIndexes
std::string const & eventHistoryBranchName()
Definition: BranchType.cc:238
EventAuxiliary const & eventAux() const
Definition: RootFile.h:171
EventSelectionIDVector eventSelectionIDs_
Definition: RootFile.h:294
bool eventHistoryTree() const
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
Definition: RootFile.h:299
RootTree eventTree_
Definition: RootFile.h:280
BranchListIndexes branchListIndexes_
Definition: RootFile.h:295
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:296
EntryNumber const & entryNumber() const
Definition: RootTree.h:103
void fillBranchEntry(TBranch *branch, T *&pbuf)
Definition: RootTree.h:128
void setProcessHistoryID(ProcessHistoryID const &phid)
ProcessHistoryID const & processHistoryID() const
edm::propagate_const< TTree * > eventHistoryTree_
Definition: RootFile.h:293
std::string const & branchListIndexesBranchName()
Definition: BranchType.cc:247
EventAuxiliary eventAux_
Definition: RootFile.h:279
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
Definition: RootFile.h:287
std::vector< EventProcessHistoryID > eventProcessHistoryIDs_
Definition: RootFile.h:270
void edm::RootFile::fillIndexIntoFile ( )
private

Definition at line 869 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().

869  {
870  // This function is for backward compatibility.
871  // If reading a current format file, indexIntoFile_ is read from the input
872  // file and should always be there. Note that the algorithm below will work
873  // sometimes but often fail with the new format introduced in release 3_8_0.
874  // If it ever becomes necessary to rebuild IndexIntoFile from the new format,
875  // probably a separate function should be written to deal with the task.
876  // This is possible just not implemented yet.
877  assert(!fileFormatVersion().hasIndexIntoFile());
878 
879  typedef std::list<LumiItem> LumiList;
880  LumiList lumis; // (declare 1)
881 
882  typedef std::set<LuminosityBlockID> RunLumiSet;
883  RunLumiSet runLumiSet; // (declare 2)
884 
885  typedef std::list<RunItem> RunList;
886  RunList runs; // (declare 5)
887 
888  typedef std::set<RunNumber_t> RunSet;
889  RunSet runSet; // (declare 4)
890 
891  typedef std::set<RunItem, RunItemSortByRunPhid> RunItemSet;
892  RunItemSet runItemSet; // (declare 3)
893 
894  typedef std::map<RunNumber_t, ProcessHistoryID> PHIDMap;
895  PHIDMap phidMap;
896 
897  RunNumber_t prevRun = 0;
898  LuminosityBlockNumber_t prevLumi = 0;
899  ProcessHistoryID prevPhid;
900  bool iFirst = true;
901 
902  indexIntoFile_.unsortedEventNumbers().clear(); // should already be empty, just being careful
904 
905  // First, loop through the event tree.
906  while(eventTree_.next()) {
907  bool newRun = false;
908  bool newLumi = false;
911 
912  // Save the event numbers as we loop through the event auxiliary to avoid
913  // having to read through the event auxiliary again later. These event numbers
914  // are not actually used in this function, but could be needed elsewhere.
916 
917  ProcessHistoryID reducedPHID = processHistoryRegistry_->reducedProcessHistoryID(eventAux().processHistoryID());
918 
919  if(iFirst || prevPhid != reducedPHID || prevRun != eventAux().run()) {
920  iFirst = false;
921  newRun = newLumi = true;
922  } else if(prevLumi != eventAux().luminosityBlock()) {
923  newLumi = true;
924  }
925  prevPhid = reducedPHID;
926  prevRun = eventAux().run();
927  prevLumi = eventAux().luminosityBlock();
928  if(newLumi) {
929  lumis.emplace_back(reducedPHID,
930  eventAux().run(), eventAux().luminosityBlock(), eventTree_.entryNumber()); // (insert 1)
931  runLumiSet.insert(LuminosityBlockID(eventAux().run(), eventAux().luminosityBlock())); // (insert 2)
932  } else {
933  LumiItem& currentLumi = lumis.back();
934  assert(currentLumi.lastEventEntry_ == eventTree_.entryNumber());
935  ++currentLumi.lastEventEntry_;
936  }
937  if(newRun) {
938  // Insert run in list if it is not already there.
939  RunItem item(reducedPHID, eventAux().run());
940  if(runItemSet.insert(item).second) { // (check 3, insert 3)
941  runs.push_back(std::move(item)); // (insert 5)
942  runSet.insert(eventAux().run()); // (insert 4)
943  phidMap.insert(std::make_pair(eventAux().run(), reducedPHID));
944  }
945  }
946  }
947  // now clean up.
949  eventAux_ = EventAuxiliary();
951 
952  // Loop over run entries and fill information.
953 
954  typedef std::map<RunNumber_t, IndexIntoFile::EntryNumber_t> RunMap;
955  RunMap runMap; // (declare 11)
956 
957  typedef std::vector<RunItem> RunVector;
958  RunVector emptyRuns; // (declare 12)
959 
960  if(runTree_.isValid()) {
961  while(runTree_.next()) {
962  // Note: adjacent duplicates will be skipped without an explicit check.
963 
964  std::shared_ptr<RunAuxiliary> runAux = fillRunAuxiliary();
965  ProcessHistoryID reducedPHID = processHistoryRegistry_->reducedProcessHistoryID(runAux->processHistoryID());
966 
967  if(runSet.insert(runAux->run()).second) { // (check 4, insert 4)
968  // This run was not associated with any events.
969  emptyRuns.emplace_back(reducedPHID, runAux->run()); // (insert 12)
970  }
971  runMap.insert(std::make_pair(runAux->run(), runTree_.entryNumber())); // (insert 11)
972  phidMap.insert(std::make_pair(runAux->run(), reducedPHID));
973  }
974  // now clean up.
976  }
977 
978  // Insert the ordered empty runs into the run list.
979  RunItemSortByRun runItemSortByRun;
980  stable_sort_all(emptyRuns, runItemSortByRun);
981 
982  RunList::iterator itRuns = runs.begin(), endRuns = runs.end();
983  for(auto const& emptyRun : emptyRuns) {
984  for(; itRuns != endRuns; ++itRuns) {
985  if(runItemSortByRun(emptyRun, *itRuns)) {
986  break;
987  }
988  }
989  runs.insert(itRuns, emptyRun);
990  }
991 
992  // Loop over luminosity block entries and fill information.
993 
994  typedef std::vector<LumiItem> LumiVector;
995  LumiVector emptyLumis; // (declare 7)
996 
997  typedef std::map<LuminosityBlockID, IndexIntoFile::EntryNumber_t> RunLumiMap;
998  RunLumiMap runLumiMap; // (declare 6)
999 
1000  if(lumiTree_.isValid()) {
1001  while(lumiTree_.next()) {
1002  // Note: adjacent duplicates will be skipped without an explicit check.
1003  std::shared_ptr<LuminosityBlockAuxiliary> lumiAux = fillLumiAuxiliary();
1004  LuminosityBlockID lumiID = LuminosityBlockID(lumiAux->run(), lumiAux->luminosityBlock());
1005  if(runLumiSet.insert(lumiID).second) { // (check 2, insert 2)
1006  // This lumi was not associated with any events.
1007  // Use the process history ID from the corresponding run. In cases of practical
1008  // importance, this should be the correct process history ID, but it is possible
1009  // to construct files where this is not the correct process history ID ...
1010  PHIDMap::const_iterator iPhidMap = phidMap.find(lumiAux->run());
1011  assert(iPhidMap != phidMap.end());
1012  emptyLumis.emplace_back(iPhidMap->second, lumiAux->run(), lumiAux->luminosityBlock(), IndexIntoFile::invalidEntry); // (insert 7)
1013  }
1014  runLumiMap.insert(std::make_pair(lumiID, lumiTree_.entryNumber()));
1015  }
1016  // now clean up.
1018  }
1019 
1020  // Insert the ordered empty lumis into the lumi list.
1021  LumiItemSortByRunLumi lumiItemSortByRunLumi;
1022  stable_sort_all(emptyLumis, lumiItemSortByRunLumi);
1023 
1024  LumiList::iterator itLumis = lumis.begin(), endLumis = lumis.end();
1025  for(auto const& emptyLumi : emptyLumis) {
1026  for(; itLumis != endLumis; ++itLumis) {
1027  if(lumiItemSortByRunLumi(emptyLumi, *itLumis)) {
1028  break;
1029  }
1030  }
1031  lumis.insert(itLumis, emptyLumi);
1032  }
1033 
1034  // Create a map of RunItems that gives the order of first appearance in the list.
1035  // Also fill in the vector of process history IDs
1036  typedef std::map<RunItem, int, RunItemSortByRunPhid> RunCountMap;
1037  RunCountMap runCountMap; // Declare (17)
1038  std::vector<ProcessHistoryID>& phids = indexIntoFile_.setProcessHistoryIDs();
1039  assert(phids.empty());
1040  std::vector<IndexIntoFile::RunOrLumiEntry>& entries = indexIntoFile_.setRunOrLumiEntries();
1041  assert(entries.empty());
1042  int rcount = 0;
1043  for(auto& run : runs) {
1044  RunCountMap::const_iterator countMapItem = runCountMap.find(run);
1045  if(countMapItem == runCountMap.end()) {
1046  countMapItem = runCountMap.insert(std::make_pair(run, rcount)).first; // Insert (17)
1047  assert(countMapItem != runCountMap.end());
1048  ++rcount;
1049  }
1050  std::vector<ProcessHistoryID>::const_iterator phidItem = find_in_all(phids, run.phid_);
1051  if(phidItem == phids.end()) {
1052  phids.push_back(run.phid_);
1053  phidItem = phids.end() - 1;
1054  }
1055  entries.emplace_back(
1056  countMapItem->second, // use (17)
1058  runMap[run.run_], // use (11)
1059  phidItem - phids.begin(),
1060  run.run_,
1061  0U,
1064  }
1065 
1066  // Create a map of LumiItems that gives the order of first appearance in the list.
1067  typedef std::map<LumiItem, int, LumiItemSortByRunLumiPhid> LumiCountMap;
1068  LumiCountMap lumiCountMap; // Declare (19)
1069  int lcount = 0;
1070  for(auto& lumi : lumis) {
1071  RunCountMap::const_iterator runCountMapItem = runCountMap.find(RunItem(lumi.phid_, lumi.run_));
1072  assert(runCountMapItem != runCountMap.end());
1073  LumiCountMap::const_iterator countMapItem = lumiCountMap.find(lumi);
1074  if(countMapItem == lumiCountMap.end()) {
1075  countMapItem = lumiCountMap.insert(std::make_pair(lumi, lcount)).first; // Insert (17)
1076  assert(countMapItem != lumiCountMap.end());
1077  ++lcount;
1078  }
1079  std::vector<ProcessHistoryID>::const_iterator phidItem = find_in_all(phids, lumi.phid_);
1080  assert(phidItem != phids.end());
1081  entries.emplace_back(
1082  runCountMapItem->second,
1083  countMapItem->second,
1084  runLumiMap[LuminosityBlockID(lumi.run_, lumi.lumi_)],
1085  phidItem - phids.begin(),
1086  lumi.run_,
1087  lumi.lumi_,
1088  lumi.firstEventEntry_,
1089  lumi.lastEventEntry_);
1090  }
1091  stable_sort_all(entries);
1092  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
std::shared_ptr< LuminosityBlockAuxiliary > fillLumiAuxiliary()
Definition: RootFile.cc:1263
RootTree lumiTree_
Definition: RootFile.h:281
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:259
EntryNumber const & entries() const
Definition: RootTree.h:105
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:284
EventAuxiliary const & eventAux() const
Definition: RootFile.h:171
std::shared_ptr< RunAuxiliary > fillRunAuxiliary()
Definition: RootFile.cc:1287
RootTree eventTree_
Definition: RootFile.h:280
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:265
RootTree runTree_
Definition: RootFile.h:282
EntryNumber const & entryNumber() const
Definition: RootTree.h:103
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:1205
bool isValid() const
Definition: RootTree.cc:105
unsigned int RunNumber_t
EventAuxiliary eventAux_
Definition: RootFile.h:279
void fillThisEventAuxiliary()
Definition: RootFile.cc:1176
def move(src, dest)
Definition: eostools.py:510
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:205
std::shared_ptr< LuminosityBlockAuxiliary > edm::RootFile::fillLumiAuxiliary ( )
private

Definition at line 1263 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_().

1263  {
1264  auto lumiAuxiliary = std::make_shared<LuminosityBlockAuxiliary>();
1266  LuminosityBlockAuxiliary *pLumiAux = lumiAuxiliary.get();
1267  lumiTree_.fillAux<LuminosityBlockAuxiliary>(pLumiAux);
1268  } else {
1269  LuminosityBlockAux lumiAux;
1270  LuminosityBlockAux *pLumiAux = &lumiAux;
1271  lumiTree_.fillAux<LuminosityBlockAux>(pLumiAux);
1272  conversion(lumiAux, *lumiAuxiliary);
1273  }
1274  if(provenanceAdaptor_) {
1275  lumiAuxiliary->setProcessHistoryID(provenanceAdaptor_->convertID(lumiAuxiliary->processHistoryID()));
1276  }
1277  if(daqProvenanceHelper_) {
1278  lumiAuxiliary->setProcessHistoryID(daqProvenanceHelper_->mapProcessHistoryID(lumiAuxiliary->processHistoryID()));
1279  }
1280  if(lumiAuxiliary->luminosityBlock() == 0 && !fileFormatVersion().runsAndLumis()) {
1281  lumiAuxiliary->id() = LuminosityBlockID(RunNumber_t(1), LuminosityBlockNumber_t(1));
1282  }
1283  return lumiAuxiliary;
1284  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
RootTree lumiTree_
Definition: RootFile.h:281
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:303
unsigned int LuminosityBlockNumber_t
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
Definition: RootFile.h:299
void conversion(EventAux const &from, EventAuxiliary &to)
Definition: EventAux.cc:9
unsigned int RunNumber_t
void fillAux(T *&pAux)
Definition: RootTree.h:112
std::shared_ptr< RunAuxiliary > edm::RootFile::fillRunAuxiliary ( )
private

Definition at line 1287 of file RootFile.cc.

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

Referenced by fillIndexIntoFile(), and readRunAuxiliary_().

1287  {
1288  auto runAuxiliary = std::make_shared<RunAuxiliary>();
1290  RunAuxiliary *pRunAux = runAuxiliary.get();
1291  runTree_.fillAux<RunAuxiliary>(pRunAux);
1292  } else {
1293  RunAux runAux;
1294  RunAux *pRunAux = &runAux;
1295  runTree_.fillAux<RunAux>(pRunAux);
1296  conversion(runAux, *runAuxiliary);
1297  }
1298  if(provenanceAdaptor_) {
1299  runAuxiliary->setProcessHistoryID(provenanceAdaptor_->convertID(runAuxiliary->processHistoryID()));
1300  }
1301  if(daqProvenanceHelper_) {
1302  runAuxiliary->setProcessHistoryID(daqProvenanceHelper_->mapProcessHistoryID(runAuxiliary->processHistoryID()));
1303  }
1304  return runAuxiliary;
1305  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:303
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
Definition: RootFile.h:299
RootTree runTree_
Definition: RootFile.h:282
void conversion(EventAux const &from, EventAuxiliary &to)
Definition: EventAux.cc:9
void fillAux(T *&pAux)
Definition: RootTree.h:112
void edm::RootFile::fillThisEventAuxiliary ( )
private

Definition at line 1176 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().

1176  {
1178  // Already read.
1179  return;
1180  }
1182  EventAuxiliary *pEvAux = &eventAux_;
1183  eventTree_.fillAux<EventAuxiliary>(pEvAux);
1184  } else {
1185  // for backward compatibility.
1186  EventAux eventAux;
1187  EventAux *pEvAux = &eventAux;
1188  eventTree_.fillAux<EventAux>(pEvAux);
1189  conversion(eventAux, eventAux_);
1190  }
1192  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
IndexIntoFile::EntryNumber_t lastEventEntryNumberRead_
Definition: RootFile.h:284
EventAuxiliary const & eventAux() const
Definition: RootFile.h:171
RootTree eventTree_
Definition: RootFile.h:280
EntryNumber const & entryNumber() const
Definition: RootTree.h:103
void conversion(EventAux const &from, EventAuxiliary &to)
Definition: EventAux.cc:9
EventAuxiliary eventAux_
Definition: RootFile.h:279
void fillAux(T *&pAux)
Definition: RootTree.h:112
IndexIntoFile::EntryType edm::RootFile::getNextItemType ( RunNumber_t run,
LuminosityBlockNumber_t lumi,
EventNumber_t event 
)

Definition at line 754 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().

754  {
755  // First, account for consecutive skipped entries.
756  while(skipThisEntry()) {
759  }
762  }
763  else {
765  }
766  }
767  // OK, we have an entry that is not skipped.
769  if(entryType == IndexIntoFile::kEnd) {
770  return IndexIntoFile::kEnd;
771  }
772  if(entryType == IndexIntoFile::kRun) {
774  runHelper_->checkForNewRun(run);
775  return IndexIntoFile::kRun;
776  } else if(processingMode_ == InputSource::Runs) {
778  return getNextItemType(run, lumi, event);
779  }
780  if(entryType == IndexIntoFile::kLumi) {
783  return IndexIntoFile::kLumi;
786  return getNextItemType(run, lumi, event);
787  }
788  if(isDuplicateEvent()) {
790  return getNextItemType(run, lumi, event);
791  }
795  event = eventAux_.event();
796  return IndexIntoFile::kEvent;
797  }
InputSource::ProcessingMode processingMode_
Definition: RootFile.h:290
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
LuminosityBlockNumber_t lumi() const
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1195
bool skipThisEntry()
Definition: RootFile.cc:694
IndexIntoFile::EntryType getNextItemType(RunNumber_t &run, LuminosityBlockNumber_t &lumi, EventNumber_t &event)
Definition: RootFile.cc:754
bool isDuplicateEvent()
Definition: RootFile.cc:738
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:291
EventAuxiliary eventAux_
Definition: RootFile.h:279
EventNumber_t event() const
Definition: event.py:1
bool edm::RootFile::goToEvent ( EventID const &  eventID)

Definition at line 1376 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().

1376  {
1377 
1379 
1380  if(duplicateChecker_) {
1381  duplicateChecker_->disable();
1382  }
1383 
1386 
1387  IndexIntoFile::IndexIntoFileItr iter =
1389 
1390  if(iter == indexIntoFile_.end(sortOrder)) {
1391  return false;
1392  }
1393  indexIntoFileIter_ = iter;
1394  return true;
1395  }
RunNumber_t run() const
Definition: EventID.h:39
EventID const & eventID() const
Definition: RootFile.h:175
EventNumber_t event() const
Definition: EventID.h:41
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:298
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
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:274
IndexIntoFileItr end(SortOrder sortOrder) const
Used to end an iteration over the Runs, Lumis, and Events in a file.
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:265
void fillEventNumbers() const
std::array<bool, NumBranchTypes> const& edm::RootFile::hasNewlyDroppedBranch ( ) const
inline

Definition at line 181 of file RootFile.h.

Referenced by createFileBlock().

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

Definition at line 679 of file RootFile.cc.

References indexIntoFileIter_.

679  {
680  return indexIntoFileIter_;
681  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
std::shared_ptr<IndexIntoFile const> edm::RootFile::indexIntoFileSharedPtr ( ) const
inline

Definition at line 212 of file RootFile.h.

References edm::get_underlying_safe().

edm::propagate_const< std::shared_ptr< IndexIntoFile > > indexIntoFileSharedPtr_
Definition: RootFile.h:264
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 213 of file RootFile.h.

References edm::get_underlying_safe(), and position.

edm::propagate_const< std::shared_ptr< IndexIntoFile > > indexIntoFileSharedPtr_
Definition: RootFile.h:264
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 689 of file RootFile.cc.

References fileThinnedAssociationsHelper_, and thinnedAssociationsHelper_.

689  {
690  thinnedAssociationsHelper_->initAssociationsFromSecondary(associationsFromSecondary, *fileThinnedAssociationsHelper_);
691  }
edm::propagate_const< std::unique_ptr< ThinnedAssociationsHelper > > fileThinnedAssociationsHelper_
Definition: RootFile.h:288
edm::propagate_const< std::shared_ptr< ThinnedAssociationsHelper > > thinnedAssociationsHelper_
Definition: RootFile.h:289
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 1657 of file RootFile.cc.

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

Referenced by RootFile().

1659  {
1660  if(duplicateChecker_) {
1661  if(eventTree_.next()) {
1663  duplicateChecker_->inputFileOpened(eventAux().isRealData(),
1665  indexesIntoFiles,
1666  currentIndexIntoFile);
1667  }
1669  }
1670  }
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:298
bool next()
Definition: RootTree.h:95
EventAuxiliary const & eventAux() const
Definition: RootFile.h:171
RootTree eventTree_
Definition: RootFile.h:280
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:265
static EntryNumber_t const invalidEntry
void fillThisEventAuxiliary()
Definition: RootFile.cc:1176
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:205
bool edm::RootFile::isDuplicateEvent ( )
private

Definition at line 738 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().

738  {
740  if(duplicateChecker_.get() == nullptr) {
741  return false;
742  }
744  return duplicateChecker_->isDuplicateAndCheckActive(indexIntoFileIter_.processHistoryIDIndex(),
746  }
EventNumber_t event() const
Definition: EventID.h:41
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:298
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
LuminosityBlockNumber_t lumi() const
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1195
EventID const & id() const
EventAuxiliary eventAux_
Definition: RootFile.h:279
std::string const file_
Definition: RootFile.h:256
RootTree const& edm::RootFile::lumiTree ( ) const
inline

Definition at line 177 of file RootFile.h.

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

Definition at line 1831 of file RootFile.cc.

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

Referenced by readCurrentEvent().

1831  {
1832  if(eventProductProvenanceRetrievers_.size()<=iStreamID) {
1833  eventProductProvenanceRetrievers_.resize(iStreamID+1);
1834  }
1835  if(!eventProductProvenanceRetrievers_[iStreamID]) {
1836  // propagate_const<T> has no reset() function
1837  eventProductProvenanceRetrievers_[iStreamID] = std::make_shared<ProductProvenanceRetriever>(provenanceReaderMaker_->makeReader(eventTree_, daqProvenanceHelper_.get()));
1838  }
1839  eventProductProvenanceRetrievers_[iStreamID]->reset();
1840  return eventProductProvenanceRetriever(iStreamID);
1841  }
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:303
std::shared_ptr< ProductProvenanceRetriever const > eventProductProvenanceRetriever(size_t index) const
Definition: RootFile.h:253
std::vector< edm::propagate_const< std::shared_ptr< ProductProvenanceRetriever > > > eventProductProvenanceRetrievers_
Definition: RootFile.h:301
RootTree eventTree_
Definition: RootFile.h:280
edm::propagate_const< std::unique_ptr< MakeProvenanceReader > > provenanceReaderMaker_
Definition: RootFile.h:300
std::unique_ptr< MakeProvenanceReader > edm::RootFile::makeProvenanceReaderMaker ( InputType  inputType)
private

Definition at line 1814 of file RootFile.cc.

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

Referenced by RootFile().

1814  {
1816  readParentageTree(inputType);
1817  return std::make_unique<MakeReducedProvenanceReader>(parentageIDLookup_);
1818  } else if(fileFormatVersion_.splitProductIDs()) {
1819  readParentageTree(inputType);
1820  return std::make_unique<MakeFullProvenanceReader>();
1821  } else if(fileFormatVersion_.perEventProductIDs()) {
1822  auto entryDescriptionMap = std::make_unique<EntryDescriptionMap>();
1823  readEntryDescriptionTree(*entryDescriptionMap, inputType);
1824  return std::make_unique<MakeOldProvenanceReader>(std::move(entryDescriptionMap));
1825  } else {
1826  return std::make_unique<MakeDummyProvenanceReader>();
1827  }
1828  }
void readEntryDescriptionTree(EntryDescriptionMap &entryDescriptionMap, InputType inputType)
Definition: RootFile.cc:525
FileFormatVersion fileFormatVersion_
Definition: RootFile.h:262
void readParentageTree(InputType inputType)
Definition: RootFile.cc:571
bool storedProductProvenanceUsed() const
bool perEventProductIDs() const
std::vector< ParentageID > parentageIDLookup_
Definition: RootFile.h:302
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 1673 of file RootFile.cc.

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

Referenced by dropOnInput().

1674  {
1675  if(dropDescendants) {
1676  branchChildren_->appendToDescendants(branch, branchesToDrop, droppedToKeptAlias);
1677  } else {
1678  branchesToDrop.insert(branch.branchID());
1679  }
1680  }
edm::propagate_const< std::shared_ptr< BranchChildren > > branchChildren_
Definition: RootFile.h:297
bool edm::RootFile::modifiedIDs ( ) const
inline

Definition at line 183 of file RootFile.h.

Referenced by createFileBlock().

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

Definition at line 670 of file RootFile.cc.

References newBranchToOldBranch_.

Referenced by dropOnInput(), and RootFile().

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

Definition at line 208 of file RootFile.h.

208 {return eventTree_.nextWithCache();}
RootTree eventTree_
Definition: RootFile.h:280
bool nextWithCache()
Definition: RootTree.cc:196
RootFile& edm::RootFile::operator= ( RootFile const &  )
delete
std::shared_ptr<ProductRegistry const> edm::RootFile::productRegistry ( ) const
inline

Definition at line 170 of file RootFile.h.

Referenced by RootFile().

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

Definition at line 1433 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().

1433  {
1434  if(!eventTree_.current()) {
1435  return false;
1436  }
1438  if(!fileFormatVersion().lumiInEventID()) {
1439  //ugly, but will disappear when the backward compatibility is done with schema evolution.
1440  const_cast<EventID&>(eventAux_.id()).setLuminosityBlockNumber(eventAux_.oldLuminosityBlock());
1442  }
1443  fillEventHistory();
1444  runHelper_->overrideRunNumber(eventAux_.id(), eventAux().isRealData());
1445 
1446  // We're not done ... so prepare the EventPrincipal
1447  eventTree_.insertEntryForIndex(principal.transitionIndex());
1448  principal.fillEventPrincipal(eventAux(),
1452  *(makeProductProvenanceRetriever(principal.streamID().value())),
1454 
1455  // report event read from file
1456  filePtr_->eventReadFromFile();
1457  return true;
1458  }
bool isRealData() const
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:259
bool current() const
Definition: RootTree.h:98
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:171
EventSelectionIDVector eventSelectionIDs_
Definition: RootFile.h:294
RootTree eventTree_
Definition: RootFile.h:280
BranchListIndexes branchListIndexes_
Definition: RootFile.h:295
LuminosityBlockNumber_t oldLuminosityBlock() const
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:260
void fillEventHistory()
Definition: RootFile.cc:1205
std::shared_ptr< ProductProvenanceRetriever > makeProductProvenanceRetriever(unsigned int iStreamIndex)
Definition: RootFile.cc:1831
EventID const & id() const
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:291
EventAuxiliary eventAux_
Definition: RootFile.h:279
void fillThisEventAuxiliary()
Definition: RootFile.cc:1176
def move(src, dest)
Definition: eostools.py:510
void edm::RootFile::readEntryDescriptionTree ( EntryDescriptionMap entryDescriptionMap,
InputType  inputType 
)
private

Definition at line 525 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().

525  {
526  // Called only for old format files.
527  // We use a smart pointer so the tree will be deleted after use, and not kept for the life of the file.
528  std::unique_ptr<TTree> entryDescriptionTree(dynamic_cast<TTree*>(filePtr_->Get(poolNames::entryDescriptionTreeName().c_str())));
529  if(nullptr == entryDescriptionTree.get()) {
530  throw Exception(errors::FileReadError) << "Could not find tree " << poolNames::entryDescriptionTreeName()
531  << " in the input file.\n";
532  }
533 
534  EntryDescriptionID idBuffer;
535  EntryDescriptionID* pidBuffer = &idBuffer;
536  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionIDBranchName().c_str(), &pidBuffer);
537 
538  EventEntryDescription entryDescriptionBuffer;
539  EventEntryDescription *pEntryDescriptionBuffer = &entryDescriptionBuffer;
540  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionBranchName().c_str(), &pEntryDescriptionBuffer);
541 
542  // Fill in the parentage registry.
543  ParentageRegistry& registry = *ParentageRegistry::instance();
544 
545  for(Long64_t i = 0, numEntries = entryDescriptionTree->GetEntries(); i < numEntries; ++i) {
546  roottree::getEntry(entryDescriptionTree.get(), i);
547  if(idBuffer != entryDescriptionBuffer.id()) {
548  throw Exception(errors::EventCorruption) << "Corruption of EntryDescription tree detected.\n";
549  }
550  entryDescriptionMap.insert(std::make_pair(entryDescriptionBuffer.id(),entryDescriptionBuffer));
551  Parentage parents;
552  parents.setParents(entryDescriptionBuffer.parents());
554  ParentageID const oldID = parents.id();
555  daqProvenanceHelper_->fixMetaData(parents.parentsForUpdate());
556  ParentageID newID = parents.id();
557  if(newID != oldID) {
558  daqProvenanceHelper_->setOldParentageIDToNew(oldID,newID);
559  }
560  }
561  // For thread safety, don't update global registries when a secondary source opens a file.
562  if(inputType != InputType::SecondarySource) {
563  registry.insertMapped(parents);
564  }
565  }
566  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionIDBranchName().c_str(), nullptr);
567  entryDescriptionTree->SetBranchAddress(poolNames::entryDescriptionBranchName().c_str(), nullptr);
568  }
Int_t getEntry(TBranch *branch, EntryNumber entryNumber)
Definition: RootTree.cc:497
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:303
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:260
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 1410 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().

1410  {
1413  // read the event auxiliary if not alrady read.
1415 
1416  // read the event
1418 
1419  runHelper_->checkRunConsistency(eventAux().run(), indexIntoFileIter_.run());
1420  runHelper_->checkLumiConsistency(eventAux().luminosityBlock(), indexIntoFileIter_.lumi());
1421 
1422  // If this next assert shows up in performance profiling or significantly affects memory, then these three lines should be deleted.
1423  // The IndexIntoFile should guarantee that it never fails.
1425  ProcessHistoryID const& reducedPHID = processHistoryRegistry_->reducedProcessHistoryID(idToCheck);
1427 
1429  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:259
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:303
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
LuminosityBlockNumber_t lumi() const
bool readCurrentEvent(EventPrincipal &cache)
Definition: RootFile.cc:1433
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1195
def principal(options)
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
EventAuxiliary const & eventAux() const
Definition: RootFile.h:171
Hash< ProcessHistoryType > ProcessHistoryID
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:265
ProcessHistoryID const & processHistoryID(int i) const
ProcessHistoryID const & processHistoryID() const
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:291
bool useReducedProcessHistoryID() const
void edm::RootFile::readEventHistoryTree ( )
private

Definition at line 1644 of file RootFile.cc.

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

Referenced by RootFile().

1644  {
1645  // Read in the event history tree, if we have one...
1646  if(fileFormatVersion().eventHistoryTree()) {
1647  history_ = std::make_unique<History>(); // propagate_const<T> has no reset() function
1648  eventHistoryTree_ = dynamic_cast<TTree*>(filePtr_->Get(poolNames::eventHistoryTreeName().c_str()));
1649  if(!eventHistoryTree_) {
1651  << "Failed to find the event history tree.\n";
1652  }
1653  }
1654  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
edm::propagate_const< std::unique_ptr< History > > history_
Definition: RootFile.h:296
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:260
edm::propagate_const< TTree * > eventHistoryTree_
Definition: RootFile.h:293
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 1589 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().

1589  {
1592  // Begin code for backward compatibility before the existence of lumi trees.
1593  if(!lumiTree_.isValid()) {
1595  return;
1596  }
1597  // End code for backward compatibility before the existence of lumi trees.
1599  lumiTree_.insertEntryForIndex(lumiPrincipal.transitionIndex());
1600  lumiPrincipal.fillLuminosityBlockPrincipal(*processHistoryRegistry_, lumiTree_.resetAndGetRootDelayedReader());
1601  // Read in all the products now.
1602  lumiPrincipal.readAllFromSourceAndMergeImmediately();
1604  }
RootTree lumiTree_
Definition: RootFile.h:281
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:259
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
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:205
std::shared_ptr< LuminosityBlockAuxiliary > edm::RootFile::readLuminosityBlockAuxiliary_ ( )

Definition at line 1551 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.

1551  {
1554  // Begin code for backward compatibility before the existence of lumi trees.
1555  if(!lumiTree_.isValid()) {
1557  assert(eventEntry != IndexIntoFile::invalidEntry);
1558  assert(eventTree_.current(eventEntry));
1559  fillEventAuxiliary(eventEntry);
1560 
1561  LuminosityBlockID lumi = LuminosityBlockID(indexIntoFileIter_.run(), indexIntoFileIter_.lumi());
1562  runHelper_->overrideRunNumber(lumi);
1563  return std::make_shared<LuminosityBlockAuxiliary>(lumi.run(), lumi.luminosityBlock(), eventAux().time(), Timestamp::invalidTimestamp());
1564  }
1565  // End code for backward compatibility before the existence of lumi trees.
1567  std::shared_ptr<LuminosityBlockAuxiliary> lumiAuxiliary = fillLumiAuxiliary();
1568  assert(lumiAuxiliary->run() == indexIntoFileIter_.run());
1569  assert(lumiAuxiliary->luminosityBlock() == indexIntoFileIter_.lumi());
1570  runHelper_->overrideRunNumber(lumiAuxiliary->id());
1571  filePtr_->reportInputLumiSection(lumiAuxiliary->run(), lumiAuxiliary->luminosityBlock());
1572  if(lumiAuxiliary->beginTime() == Timestamp::invalidTimestamp()) {
1574  if(eventEntry != IndexIntoFile::invalidEntry) {
1575  assert(eventTree_.current(eventEntry));
1576  fillEventAuxiliary(eventEntry);
1577 
1578  lumiAuxiliary->setBeginTime(eventAux().time());
1579  }
1580  lumiAuxiliary->setEndTime(Timestamp::invalidTimestamp());
1581  }
1582  if(!fileFormatVersion().processHistorySameWithinRun() && savedRunAuxiliary_) {
1583  lumiAuxiliary->setProcessHistoryID(savedRunAuxiliary_->processHistoryID());
1584  }
1585  return lumiAuxiliary;
1586  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
std::shared_ptr< LuminosityBlockAuxiliary > fillLumiAuxiliary()
Definition: RootFile.cc:1263
static Timestamp invalidTimestamp()
Definition: Timestamp.h:101
RootTree lumiTree_
Definition: RootFile.h:281
Timestamp const & time() const
edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:272
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
bool current() const
Definition: RootTree.h:98
LuminosityBlockNumber_t lumi() const
long long EntryNumber_t
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1195
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
EventAuxiliary const & eventAux() const
Definition: RootFile.h:171
RootTree eventTree_
Definition: RootFile.h:280
static EntryNumber_t const invalidEntry
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:260
bool isValid() const
Definition: RootTree.cc:105
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:291
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:205
void edm::RootFile::readParentageTree ( InputType  inputType)
private

Definition at line 571 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().

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

Definition at line 1532 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().

1532  {
1533  if(!runHelper_->fakeNewRun()) {
1537  }
1538  // Begin code for backward compatibility before the existence of run trees.
1539  if(!runTree_.isValid()) {
1540  return;
1541  }
1542  // End code for backward compatibility before the existence of run trees.
1543  runTree_.insertEntryForIndex(runPrincipal.transitionIndex());
1544  runPrincipal.fillRunPrincipal(*processHistoryRegistry_, runTree_.resetAndGetRootDelayedReader());
1545  // Read in all the products now.
1546  runPrincipal.readAllFromSourceAndMergeImmediately();
1547  }
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:259
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
void insertEntryForIndex(unsigned int index)
Definition: RootTree.cc:99
DelayedReader * resetAndGetRootDelayedReader() const
Definition: RootTree.cc:117
RootTree runTree_
Definition: RootFile.h:282
bool isValid() const
Definition: RootTree.cc:105
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:291
std::shared_ptr< RunAuxiliary > edm::RootFile::readRunAuxiliary_ ( )

Definition at line 1466 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.

1466  {
1467  if(runHelper_->fakeNewRun()) {
1468  runHelper_->overrideRunNumber(savedRunAuxiliary_->id());
1469  return savedRunAuxiliary();
1470  }
1473 
1474  // Begin code for backward compatibility before the existence of run trees.
1475  if(!runTree_.isValid()) {
1476 
1477  // prior to the support of run trees.
1478  // RunAuxiliary did not contain a valid timestamp. Take it from the next event.
1480  assert(eventEntry != IndexIntoFile::invalidEntry);
1481  assert(eventTree_.current(eventEntry));
1482  fillEventAuxiliary(eventEntry);
1483 
1484  RunID run = RunID(indexIntoFileIter_.run());
1485  runHelper_->overrideRunNumber(run);
1486  savedRunAuxiliary_ = std::make_shared<RunAuxiliary>(run.run(), eventAux().time(), Timestamp::invalidTimestamp());
1487  return savedRunAuxiliary();
1488  }
1489  // End code for backward compatibility before the existence of run trees.
1491  std::shared_ptr<RunAuxiliary> runAuxiliary = fillRunAuxiliary();
1492  assert(runAuxiliary->run() == indexIntoFileIter_.run());
1493  runHelper_->overrideRunNumber(runAuxiliary->id());
1494  filePtr_->reportInputRunNumber(runAuxiliary->run());
1495  // If RunAuxiliary did not contain a valid begin timestamp, invalidate any end timestamp.
1496  if(runAuxiliary->beginTime() == Timestamp::invalidTimestamp()) {
1497  runAuxiliary->setEndTime(Timestamp::invalidTimestamp());
1498  }
1499 
1500  // If RunAuxiliary did not contain a valid timestamp, or if this an old format file from
1501  // when the Run's ProcessHistory included only processes where products were added to the Run itself,
1502  // we attempt to read the first event in the run to get appropriate info.
1503  if(runAuxiliary->beginTime() == Timestamp::invalidTimestamp() ||
1505 
1507  // If we have a valid event, use its information.
1508  if(eventEntry != IndexIntoFile::invalidEntry) {
1509  assert(eventTree_.current(eventEntry));
1510  fillEventAuxiliary(eventEntry);
1511 
1512  // RunAuxiliary did not contain a valid timestamp. Take it from the next event in this run if there is one.
1513  if(runAuxiliary->beginTime() == Timestamp::invalidTimestamp()) {
1514  runAuxiliary->setBeginTime(eventAux().time());
1515  }
1516 
1517  // For backwards compatibility when the Run's ProcessHistory included only processes where products were added to the
1518  // Run, and then the Run and Event auxiliaries could be different. Use the event ProcessHistoryID if there is one. It should
1519  // almost always be correct by the current definition (processes included if any products are added. This makes the run, lumi,
1520  // and event ProcessHistory's always be the same if no file merging occurs).
1521  if(!fileFormatVersion().processHistorySameWithinRun()) {
1522  fillEventHistory();
1523  runAuxiliary->setProcessHistoryID(eventAux().processHistoryID());
1524  }
1525  }
1526  }
1527  savedRunAuxiliary_ = runAuxiliary;
1528  return runAuxiliary;
1529  }
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
static Timestamp invalidTimestamp()
Definition: Timestamp.h:101
Timestamp const & time() const
edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:272
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
bool current() const
Definition: RootTree.h:98
long long EntryNumber_t
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1195
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
EventAuxiliary const & eventAux() const
Definition: RootFile.h:171
std::shared_ptr< RunAuxiliary > fillRunAuxiliary()
Definition: RootFile.cc:1287
RootTree eventTree_
Definition: RootFile.h:280
RootTree runTree_
Definition: RootFile.h:282
std::shared_ptr< RunAuxiliary const > savedRunAuxiliary() const
Definition: RootFile.h:247
static EntryNumber_t const invalidEntry
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:260
bool processHistorySameWithinRun() const
void fillEventHistory()
Definition: RootFile.cc:1205
bool isValid() const
Definition: RootTree.cc:105
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:291
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:205
void edm::RootFile::reportOpened ( std::string const &  inputType)

Definition at line 1150 of file RootFile.cc.

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

1150  {
1151  // Report file opened.
1152  std::string const label = "source";
1153  std::string moduleName = "PoolSource";
1154  filePtr_->inputFileOpened(
1155  logicalFile_,
1156  inputType,
1157  moduleName,
1158  label,
1159  fid_.fid(),
1161  }
std::vector< std::string > const & branchNames() const
Definition: RootTree.h:108
FileID fid_
Definition: RootFile.h:263
std::string const logicalFile_
Definition: RootFile.h:257
std::string moduleName(Provenance const &provenance)
Definition: Provenance.cc:27
std::string const & fid() const
Definition: FileID.h:19
RootTree eventTree_
Definition: RootFile.h:280
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:260
void edm::RootFile::rewind ( )
inline

Definition at line 195 of file RootFile.h.

195  {
197  eventTree_.rewind();
198  lumiTree_.rewind();
199  runTree_.rewind();
200  }
RootTree lumiTree_
Definition: RootFile.h:281
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
RootTree eventTree_
Definition: RootFile.h:280
RootTree runTree_
Definition: RootFile.h:282
IndexIntoFile::IndexIntoFileItr indexIntoFileBegin_
Definition: RootFile.h:267
void rewind()
Definition: RootTree.h:100
RootTree const& edm::RootFile::runTree ( ) const
inline

Definition at line 178 of file RootFile.h.

Referenced by validateFile().

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

Definition at line 247 of file RootFile.h.

References edm::get_underlying_safe().

Referenced by readRunAuxiliary_().

edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:272
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 248 of file RootFile.h.

References edm::get_underlying_safe().

edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:272
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 1461 of file RootFile.cc.

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

1461  {
1463  }
RootTree eventTree_
Definition: RootFile.h:280
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:205
bool edm::RootFile::setEntryAtEvent ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi,
EventNumber_t  event 
)

Definition at line 1607 of file RootFile.cc.

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

1607  {
1609  if(indexIntoFileIter_ == indexIntoFileEnd_) return false;
1611  return true;
1612  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
RootTree eventTree_
Definition: RootFile.h:280
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:265
IndexIntoFileItr findEventPosition(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
Definition: event.py:1
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:205
bool edm::RootFile::setEntryAtItem ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi,
EventNumber_t  event 
)
inline

Definition at line 185 of file RootFile.h.

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

185  {
187  }
bool setEntryAtRun(RunNumber_t run)
Definition: RootFile.cc:1623
bool setEntryAtLumi(RunNumber_t run, LuminosityBlockNumber_t lumi)
Definition: RootFile.cc:1615
bool setEntryAtEvent(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event)
Definition: RootFile.cc:1607
Definition: event.py:1
bool edm::RootFile::setEntryAtLumi ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi 
)

Definition at line 1615 of file RootFile.cc.

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

1615  {
1617  if(indexIntoFileIter_ == indexIntoFileEnd_) return false;
1619  return true;
1620  }
RootTree lumiTree_
Definition: RootFile.h:281
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:265
IndexIntoFileItr findLumiPosition(RunNumber_t run, LuminosityBlockNumber_t lumi) const
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:205
bool edm::RootFile::setEntryAtNextEventInLumi ( RunNumber_t  run,
LuminosityBlockNumber_t  lumi 
)

Definition at line 1631 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().

1631  {
1634  }
1637  if(run != indexIntoFileIter_.run()) return false;
1638  if(lumi != indexIntoFileIter_.lumi()) return false;
1640  return true;
1641  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
LuminosityBlockNumber_t lumi() const
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1195
bool edm::RootFile::setEntryAtRun ( RunNumber_t  run)

Definition at line 1623 of file RootFile.cc.

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

1623  {
1625  if(indexIntoFileIter_ == indexIntoFileEnd_) return false;
1627  return true;
1628  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
IndexIntoFileItr findRunPosition(RunNumber_t run) const
Same as findPosition.
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:265
RootTree runTree_
Definition: RootFile.h:282
void setEntryNumber(EntryNumber theEntryNumber)
Definition: RootTree.cc:205
void edm::RootFile::setIfFastClonable ( int  remainingEvents,
int  remainingLumis 
)
private

Definition at line 607 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().

607  {
608  if(fileFormatVersion().noMetaDataTrees() and !fileFormatVersion().storedProductProvenanceUsed()) {
609  //we must avoid copying the old branch which stored the per product per event provenance
611  return;
612  }
613  if(!fileFormatVersion().splitProductIDs()) {
615  return;
616  }
619  return;
620  }
621  // Find entry for first event in file
622  IndexIntoFile::IndexIntoFileItr it = indexIntoFileBegin_;
623  while(it != indexIntoFileEnd_ && it.getEntryType() != IndexIntoFile::kEvent) {
624  ++it;
625  }
626  if(it == indexIntoFileEnd_) {
628  return;
629  }
630 
631  // From here on, record all reasons we can't fast clone.
635  }
636  if(skipAnyEvents_) {
638  }
639  if(remainingEvents >= 0 && eventTree_.entries() > remainingEvents) {
641  }
642  if(remainingLumis >= 0 && lumiTree_.entries() > remainingLumis) {
644  }
645  if(duplicateChecker_ &&
646  !duplicateChecker_->checkDisabled() &&
647  !duplicateChecker_->noDuplicatesInFile()) {
649  }
650  }
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:298
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
int whyNotFastClonable_
Definition: RootFile.h:276
RootTree lumiTree_
Definition: RootFile.h:281
EntryNumber const & entries() const
Definition: RootTree.h:105
InputSource::ProcessingMode processingMode_
Definition: RootFile.h:290
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
bool noEventSort_
Definition: RootFile.h:274
bool skipAnyEvents_
Definition: RootFile.h:273
RootTree eventTree_
Definition: RootFile.h:280
bool iterationWillBeInEntryOrder(SortOrder sortOrder) const
Used to determine whether or not to disable fast cloning.
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:265
IndexIntoFile::IndexIntoFileItr indexIntoFileBegin_
Definition: RootFile.h:267
void edm::RootFile::setPosition ( IndexIntoFile::IndexIntoFileItr const &  position)

Definition at line 684 of file RootFile.cc.

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

684  {
686  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
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 1807 of file RootFile.cc.

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

1808  {
1809  eventTree_.setSignals(preEventReadSource,postEventReadSource);
1810  }
void setSignals(signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *preEventReadSource, signalslot::Signal< void(StreamContext const &, ModuleCallingContext const &)> const *postEventReadSource)
Definition: RootTree.cc:488
RootTree eventTree_
Definition: RootFile.h:280
void edm::RootFile::setToLastEntry ( )
inline

Definition at line 201 of file RootFile.h.

201  {
203  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
bool edm::RootFile::skipEntries ( unsigned int &  offset)
inline
bool edm::RootFile::skipEvents ( int &  offset)

Definition at line 1308 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().

1308  {
1309  while(offset > 0 && indexIntoFileIter_ != indexIntoFileEnd_) {
1310 
1311  int phIndexOfSkippedEvent = IndexIntoFile::invalidIndex;
1312  RunNumber_t runOfSkippedEvent = IndexIntoFile::invalidRun;
1315 
1316  indexIntoFileIter_.skipEventForward(phIndexOfSkippedEvent,
1317  runOfSkippedEvent,
1318  lumiOfSkippedEvent,
1319  skippedEventEntry);
1320 
1321  // At the end of the file and there were no more events to skip
1322  if(skippedEventEntry == IndexIntoFile::invalidEntry) break;
1323 
1324  if(eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
1325  fillEventAuxiliary(skippedEventEntry);
1326  if(eventSkipperByID_->skipIt(runOfSkippedEvent, lumiOfSkippedEvent, eventAux_.id().event())) {
1327  continue;
1328  }
1329  }
1330  if(duplicateChecker_ &&
1331  !duplicateChecker_->checkDisabled() &&
1332  !duplicateChecker_->noDuplicatesInFile()) {
1333 
1334  fillEventAuxiliary(skippedEventEntry);
1335  if(duplicateChecker_->isDuplicateAndCheckActive(phIndexOfSkippedEvent,
1336  runOfSkippedEvent,
1337  lumiOfSkippedEvent,
1338  eventAux_.id().event(),
1339  file_)) {
1340  continue;
1341  }
1342  }
1343  --offset;
1344  }
1345 
1346  while(offset < 0) {
1347 
1348  if(duplicateChecker_) {
1349  duplicateChecker_->disable();
1350  }
1351 
1352  int phIndexOfEvent = IndexIntoFile::invalidIndex;
1356 
1357  indexIntoFileIter_.skipEventBackward(phIndexOfEvent,
1358  runOfEvent,
1359  lumiOfEvent,
1360  eventEntry);
1361 
1362  if(eventEntry == IndexIntoFile::invalidEntry) break;
1363 
1364  if(eventSkipperByID_ && eventSkipperByID_->somethingToSkip()) {
1365  fillEventAuxiliary(eventEntry);
1366  if(eventSkipperByID_->skipIt(runOfEvent, lumiOfEvent, eventAux_.id().event())) {
1367  continue;
1368  }
1369  }
1370  ++offset;
1371  }
1373  }
EventNumber_t event() const
Definition: EventID.h:41
static int const invalidIndex
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:298
edm::propagate_const< std::shared_ptr< EventSkipperByID > > eventSkipperByID_
Definition: RootFile.h:261
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
unsigned int LuminosityBlockNumber_t
long long EntryNumber_t
bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry)
Definition: RootFile.cc:1195
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:268
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:279
std::string const file_
Definition: RootFile.h:256
void skipEventForward(int &phIndexOfSkippedEvent, RunNumber_t &runOfSkippedEvent, LuminosityBlockNumber_t &lumiOfSkippedEvent, EntryNumber_t &skippedEventEntry)
bool edm::RootFile::skipThisEntry ( )
private

Definition at line 694 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().

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

Definition at line 223 of file RootFile.h.

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

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

Definition at line 1095 of file RootFile.cc.

References edm::createGlobalIdentifier(), daqProvenanceHelper_, duplicateChecker_, edm::IndexIntoFile::empty(), enforceGUIDInFileName_, edm::RootTree::entries(), edm::errors::EventCorruption, eventTree_, Exception, edm::FileID::fid(), fid_, file_, fileFormatVersion(), edm::errors::FileNameInconsistentWithGUID, 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(), edm::stemFromPath(), and edm::FileFormatVersion::useReducedProcessHistoryID().

Referenced by RootFile().

1095  {
1096  if(!fid_.isValid()) {
1097  fid_ = FileID(createGlobalIdentifier());
1098  }
1099  if(!eventTree_.isValid()) {
1101  "'Events' tree is corrupted or not present\n" << "in the input file.\n";
1102  }
1103  if (enforceGUIDInFileName_) {
1104  auto guidFromName = stemFromPath(file_);
1105  if (guidFromName != fid_.fid()) {
1107  << "GUID " << guidFromName << " extracted from file name " << file_
1108  << " is inconsistent with the GUID read from the file " << fid_.fid();
1109  }
1110  }
1111 
1112  if(fileFormatVersion().hasIndexIntoFile()) {
1113  if(runTree().entries() > 0) {
1114  assert(!indexIntoFile_.empty());
1115  }
1117  if(daqProvenanceHelper_) {
1118  std::vector<ProcessHistoryID>& phidVec = indexIntoFile_.setProcessHistoryIDs();
1119  for(auto& phid : phidVec) {
1120  phid = daqProvenanceHelper_->mapProcessHistoryID(phid);
1121  }
1122  }
1124  }
1125  }
1126  else {
1127  assert(indexIntoFile_.empty());
1129  }
1130 
1133  indexIntoFile_.setEventFinder(std::shared_ptr<IndexIntoFile::EventFinder>(std::make_shared<RootFileEventFinder>(eventTree_)));
1134  // We fill the event numbers explicitly if we need to find events in closed files,
1135  // such as for secondary files (or secondary sources) or if duplicate checking across files.
1136  bool needEventNumbers = false;
1137  bool needIndexesForDuplicateChecker = duplicateChecker_ && duplicateChecker_->checkingAllFiles() && !duplicateChecker_->checkDisabled();
1138  if(inputType != InputType::Primary || needIndexesForDuplicateChecker || usingGoToEvent) {
1139  needEventNumbers = true;
1140  }
1141  bool needEventEntries = false;
1142  if(inputType != InputType::Primary || !noEventSort_) {
1143  // We need event entries for sorting or for secondary files or sources.
1144  needEventEntries = true;
1145  }
1146  indexIntoFile_.fillEventNumbersOrEntries(needEventNumbers, needEventEntries);
1147  }
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:298
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:179
bool enforceGUIDInFileName_
Definition: RootFile.h:275
bool empty() const
True if no runs, lumis, or events are in the file.
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:259
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:303
EntryNumber const & entries() const
Definition: RootTree.h:105
void reduceProcessHistoryIDs(ProcessHistoryRegistry const &processHistoryRegistry)
FileID fid_
Definition: RootFile.h:263
std::vector< ProcessHistoryID > & setProcessHistoryIDs()
bool noEventSort_
Definition: RootFile.h:274
std::string const & fid() const
Definition: FileID.h:19
RootTree const & runTree() const
Definition: RootFile.h:178
RootTree eventTree_
Definition: RootFile.h:280
bool isValid() const
Definition: FileID.h:18
std::string stemFromPath(const std::string &path)
Definition: stemFromPath.cc:4
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:265
void fixIndexes(std::vector< ProcessHistoryID > &processHistoryIDs)
bool isValid() const
Definition: RootTree.cc:105
void fillIndexIntoFile()
Definition: RootFile.cc:869
std::vector< ProcessHistoryID > & orderedProcessHistoryIDs_
Definition: RootFile.h:266
void setNumberOfEvents(EntryNumber_t nevents) const
bool useReducedProcessHistoryID() const
std::string const file_
Definition: RootFile.h:256
std::string createGlobalIdentifier()
bool edm::RootFile::wasFirstEventJustRead ( ) const

Definition at line 807 of file RootFile.cc.

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

807  {
808  IndexIntoFile::IndexIntoFileItr itr(indexIntoFileIter_);
809  int phIndex;
812  IndexIntoFile::EntryNumber_t eventEntry;
813  itr.skipEventBackward(phIndex,
814  run,
815  lumi,
816  eventEntry);
817  itr.skipEventBackward(phIndex,
818  run,
819  lumi,
820  eventEntry);
821  return eventEntry == IndexIntoFile::invalidEntry;
822  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
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 800 of file RootFile.cc.

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

800  {
801  IndexIntoFile::IndexIntoFileItr itr(indexIntoFileIter_);
802  itr.advanceToEvent();
803  return itr.getEntryType() == IndexIntoFile::kEnd;
804  }
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:269
int edm::RootFile::whyNotFastClonable ( ) const
inline

Definition at line 180 of file RootFile.h.

Referenced by createFileBlock().

180 {return whyNotFastClonable_;}
int whyNotFastClonable_
Definition: RootFile.h:276

Member Data Documentation

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

Definition at line 297 of file RootFile.h.

Referenced by markBranchToBeDropped(), and RootFile().

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

Definition at line 287 of file RootFile.h.

Referenced by fillEventHistory(), and RootFile().

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

Definition at line 286 of file RootFile.h.

Referenced by RootFile().

BranchListIndexes edm::RootFile::branchListIndexes_
private

Definition at line 295 of file RootFile.h.

Referenced by fillEventHistory(), and readCurrentEvent().

bool edm::RootFile::branchListIndexesUnchanged_
private

Definition at line 278 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 304 of file RootFile.h.

Referenced by dropOnInput().

bool edm::RootFile::enforceGUIDInFileName_
private

Definition at line 275 of file RootFile.h.

Referenced by validateFile().

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

Definition at line 293 of file RootFile.h.

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

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

Definition at line 270 of file RootFile.h.

Referenced by fillEventHistory(), and RootFile().

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

Definition at line 271 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 301 of file RootFile.h.

Referenced by makeProductProvenanceRetriever().

EventSelectionIDVector edm::RootFile::eventSelectionIDs_
private

Definition at line 294 of file RootFile.h.

Referenced by fillEventHistory(), and readCurrentEvent().

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

Definition at line 261 of file RootFile.h.

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

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

Definition at line 263 of file RootFile.h.

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

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

Definition at line 256 of file RootFile.h.

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

FileFormatVersion edm::RootFile::fileFormatVersion_
private

Definition at line 262 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 288 of file RootFile.h.

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

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

Definition at line 277 of file RootFile.h.

Referenced by dropOnInput(), and RootFile().

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

Definition at line 296 of file RootFile.h.

Referenced by fillEventHistory(), and readEventHistoryTree().

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

Definition at line 267 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 264 of file RootFile.h.

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

Definition at line 284 of file RootFile.h.

Referenced by fillIndexIntoFile(), and fillThisEventAuxiliary().

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

Definition at line 257 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 292 of file RootFile.h.

Referenced by newBranchToOldBranch(), and RootFile().

bool edm::RootFile::noEventSort_
private

Definition at line 274 of file RootFile.h.

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

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

Definition at line 266 of file RootFile.h.

Referenced by validateFile().

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

Definition at line 302 of file RootFile.h.

Referenced by makeProvenanceReaderMaker(), and readParentageTree().

ProcessConfiguration const& edm::RootFile::processConfiguration_
private

Definition at line 258 of file RootFile.h.

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

Definition at line 290 of file RootFile.h.

Referenced by getNextItemType(), and setIfFastClonable().

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

Definition at line 285 of file RootFile.h.

Referenced by RootFile().

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

Definition at line 299 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 300 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 272 of file RootFile.h.

Referenced by readLuminosityBlockAuxiliary_(), and readRunAuxiliary_().

bool edm::RootFile::skipAnyEvents_
private

Definition at line 273 of file RootFile.h.

Referenced by setIfFastClonable().

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

Definition at line 289 of file RootFile.h.

Referenced by initAssociationsFromSecondary().

RootTreePtrArray edm::RootFile::treePointers_
private

Definition at line 283 of file RootFile.h.

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

int edm::RootFile::whyNotFastClonable_
private

Definition at line 276 of file RootFile.h.

Referenced by RootFile(), and setIfFastClonable().