CMS 3D CMS Logo

RootFile.h
Go to the documentation of this file.
1 #ifndef IOPool_Input_RootFile_h
2 #define IOPool_Input_RootFile_h
3 
4 /*----------------------------------------------------------------------
5 
6 RootFile.h // used by ROOT input sources
7 
8 ----------------------------------------------------------------------*/
9 
10 #include "RootTree.h"
14 #include "DataFormats/Provenance/interface/EntryDescriptionID.h" // backward compatibility
16 #include "DataFormats/Provenance/interface/EventEntryDescription.h" // backward compatibility
17 #include "DataFormats/Provenance/interface/EventProcessHistoryID.h" // backward compatibility
27 
28 #include <array>
29 #include <map>
30 #include <memory>
31 #include <string>
32 #include <vector>
33 
34 namespace edm {
35 
36  //------------------------------------------------------------
37  // Class RootFile: supports file reading.
38 
39  class BranchID;
40  class BranchIDListHelper;
41  class ProductProvenanceRetriever;
42  struct DaqProvenanceHelper;
43  class DuplicateChecker;
44  class EventSkipperByID;
45  class ProcessHistoryRegistry;
46  class ProductSelectorRules;
47  class InputFile;
48  class ProvenanceReaderBase;
49  class ProvenanceAdaptor;
50  class StoredMergeableRunProductMetadata;
51  class RunHelperBase;
53 
54  typedef std::map<EntryDescriptionID, EventEntryDescription> EntryDescriptionMap;
55 
57  public:
58  virtual std::unique_ptr<ProvenanceReaderBase> makeReader(RootTree& eventTree, DaqProvenanceHelper const* daqProvenanceHelper) const = 0;
59  virtual ~MakeProvenanceReader() = default;
60  };
61 
62  class RootFile {
63  public:
64  typedef std::array<RootTree*, NumBranchTypes> RootTreePtrArray;
66  ProcessConfiguration const& processConfiguration,
67  std::string const& logicalFileName,
68  std::shared_ptr<InputFile> filePtr,
69  std::shared_ptr<EventSkipperByID> eventSkipperByID,
70  bool skipAnyEvents,
71  int remainingEvents,
72  int remainingLumis,
73  unsigned int nStreams,
74  unsigned int treeCacheSize,
75  int treeMaxVirtualSize,
76  InputSource::ProcessingMode processingMode,
77  RunHelperBase* runHelper,
78  bool noEventSort,
79  ProductSelectorRules const& productSelectorRules,
80  InputType inputType,
81  std::shared_ptr<BranchIDListHelper> branchIDListHelper,
82  std::shared_ptr<ThinnedAssociationsHelper> thinnedAssociationsHelper,
83  std::vector<BranchID> const* associationsFromSecondary,
84  std::shared_ptr<DuplicateChecker> duplicateChecker,
85  bool dropDescendantsOfDroppedProducts,
86  ProcessHistoryRegistry& processHistoryRegistry,
87  std::vector<std::shared_ptr<IndexIntoFile> > const& indexesIntoFiles,
88  std::vector<std::shared_ptr<IndexIntoFile> >::size_type currentIndexIntoFile,
89  std::vector<ProcessHistoryID>& orderedProcessHistoryIDs,
90  bool bypassVersionCheck,
91  bool labelRawDataLikeMC,
92  bool usingGoToEvent,
93  bool enablePrefetching);
94 
96  ProcessConfiguration const& processConfiguration,
97  std::string const& logicalFileName,
98  std::shared_ptr<InputFile> filePtr,
99  unsigned int nStreams,
100  int treeMaxVirtualSize,
101  InputSource::ProcessingMode processingMode,
102  RunHelperBase* runHelper,
103  ProductSelectorRules const& productSelectorRules,
104  InputType inputType,
105  std::shared_ptr<BranchIDListHelper> branchIDListHelper,
106  std::shared_ptr<ThinnedAssociationsHelper> thinnedAssociationsHelper,
107  std::vector<BranchID> const* associationsFromSecondary,
108  bool dropDescendantsOfDroppedProducts,
109  ProcessHistoryRegistry& processHistoryRegistry,
110  std::vector<std::shared_ptr<IndexIntoFile> > const& indexesIntoFiles,
111  std::vector<std::shared_ptr<IndexIntoFile> >::size_type currentIndexIntoFile,
112  std::vector<ProcessHistoryID>& orderedProcessHistoryIDs,
113  bool bypassVersionCheck,
114  bool labelRawDataLikeMC,
115  bool enablePrefetching) : RootFile(
116  fileName, processConfiguration, logicalFileName, filePtr,
117  nullptr, false, -1, -1, nStreams, 0U, treeMaxVirtualSize,
118  processingMode, runHelper,
119  false, productSelectorRules, inputType, branchIDListHelper,
120  thinnedAssociationsHelper, associationsFromSecondary,
121  nullptr, dropDescendantsOfDroppedProducts, processHistoryRegistry,
122  indexesIntoFiles, currentIndexIntoFile, orderedProcessHistoryIDs,
123  bypassVersionCheck, labelRawDataLikeMC,
124  false, enablePrefetching) {}
125 
127  ProcessConfiguration const& processConfiguration,
128  std::string const& logicalFileName,
129  std::shared_ptr<InputFile> filePtr,
130  unsigned int nStreams,
131  unsigned int treeCacheSize,
132  int treeMaxVirtualSize,
133  RunHelperBase* runHelper,
134  ProductSelectorRules const& productSelectorRules,
135  InputType inputType,
136  ProcessHistoryRegistry& processHistoryRegistry,
137  std::vector<std::shared_ptr<IndexIntoFile> > const& indexesIntoFiles,
138  std::vector<std::shared_ptr<IndexIntoFile> >::size_type currentIndexIntoFile,
139  std::vector<ProcessHistoryID>& orderedProcessHistoryIDs,
140  bool bypassVersionCheck,
141  bool enablePrefetching) : RootFile(
142  fileName, processConfiguration, logicalFileName, filePtr,
143  nullptr, false, -1, -1, nStreams, treeCacheSize, treeMaxVirtualSize,
144  InputSource::RunsLumisAndEvents, runHelper,
145  false, productSelectorRules, inputType, nullptr, nullptr,
146  nullptr, nullptr, false, processHistoryRegistry,
147  indexesIntoFiles, currentIndexIntoFile, orderedProcessHistoryIDs,
148  bypassVersionCheck, false,
149  false, enablePrefetching) {}
150 
151  ~RootFile();
152 
153  RootFile(RootFile const&) = delete; // Disallow copying and moving
154  RootFile& operator=(RootFile const&) = delete; // Disallow copying and moving
155 
156  void reportOpened(std::string const& inputType);
157  void close();
158  bool readCurrentEvent(EventPrincipal& cache);
159  void readEvent(EventPrincipal& cache);
160 
161  std::shared_ptr<LuminosityBlockAuxiliary> readLuminosityBlockAuxiliary_();
162  std::shared_ptr<RunAuxiliary> readRunAuxiliary_();
163  std::shared_ptr<RunAuxiliary> readFakeRunAuxiliary_();
164  void readRun_(RunPrincipal& runPrincipal);
165  void readFakeRun_(RunPrincipal& runPrincipal);
166  void readLuminosityBlock_(LuminosityBlockPrincipal& lumiPrincipal);
167  std::string const& file() const {return file_;}
168  std::shared_ptr<ProductRegistry const> productRegistry() const {return productRegistry_;}
169  EventAuxiliary const& eventAux() const {return eventAux_;}
170  // IndexIntoFile::EntryNumber_t const& entryNumber() const {return indexIntoFileIter().entry();}
171  // LuminosityBlockNumber_t const& luminosityBlockNumber() const {return indexIntoFileIter().lumi();}
172  // RunNumber_t const& runNumber() const {return indexIntoFileIter().run();}
173  EventID const& eventID() const {return eventAux().id();}
174  RootTree const& eventTree() const {return eventTree_;}
175  RootTree const& lumiTree() const {return lumiTree_;}
176  RootTree const& runTree() const {return runTree_;}
177  FileFormatVersion fileFormatVersion() const {return fileFormatVersion_;}
178  int whyNotFastClonable() const {return whyNotFastClonable_;}
179  std::array<bool, NumBranchTypes> const& hasNewlyDroppedBranch() const {return hasNewlyDroppedBranch_;}
180  bool branchListIndexesUnchanged() const {return branchListIndexesUnchanged_;}
181  bool modifiedIDs() const {return daqProvenanceHelper_.get() != nullptr;}
182  std::unique_ptr<FileBlock> createFileBlock() const;
184  return (event != 0) ? setEntryAtEvent(run, lumi, event) : (lumi ? setEntryAtLumi(run, lumi) : setEntryAtRun(run));
185  }
186  bool containsItem(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const;
187  bool setEntryAtEvent(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event);
188  bool setEntryAtLumi(RunNumber_t run, LuminosityBlockNumber_t lumi);
189  bool setEntryAtRun(RunNumber_t run);
190  bool setEntryAtNextEventInLumi(RunNumber_t run, LuminosityBlockNumber_t lumi);
191  void setAtEventEntry(IndexIntoFile::EntryNumber_t entry);
192 
193  void rewind() {
194  indexIntoFileIter_ = indexIntoFileBegin_;
195  eventTree_.rewind();
196  lumiTree_.rewind();
197  runTree_.rewind();
198  }
199  void setToLastEntry() {
200  indexIntoFileIter_ = indexIntoFileEnd_;
201  }
202 
203  bool skipEntries(unsigned int& offset) {return eventTree_.skipEntries(offset);}
204  bool skipEvents(int& offset);
205  bool goToEvent(EventID const& eventID);
206  bool nextEventEntry() {return eventTree_.nextWithCache();}
207  IndexIntoFile::EntryType getNextItemType(RunNumber_t& run, LuminosityBlockNumber_t& lumi, EventNumber_t& event);
208  std::shared_ptr<BranchIDListHelper const> branchIDListHelper() const {return get_underlying_safe(branchIDListHelper_);}
209  std::shared_ptr<BranchIDListHelper>& branchIDListHelper() {return get_underlying_safe(branchIDListHelper_);}
210  std::shared_ptr<IndexIntoFile const> indexIntoFileSharedPtr() const {return get_underlying_safe(indexIntoFileSharedPtr_);}
211  std::shared_ptr<IndexIntoFile>& indexIntoFileSharedPtr() {return get_underlying_safe(indexIntoFileSharedPtr_);}
212  bool wasLastEventJustRead() const;
213  bool wasFirstEventJustRead() const;
214  IndexIntoFile::IndexIntoFileItr indexIntoFileIter() const;
215  void setPosition(IndexIntoFile::IndexIntoFileItr const& position);
216  void initAssociationsFromSecondary(std::vector<BranchID> const&);
217 
218  void setSignals(signalslot::Signal<void(StreamContext const&, ModuleCallingContext const&)> const* preEventReadSource,
219  signalslot::Signal<void(StreamContext const&, ModuleCallingContext const&)> const* postEventReadSource);
220  private:
221  RootTreePtrArray& treePointers() {return treePointers_;}
222  bool skipThisEntry();
223  void setIfFastClonable(int remainingEvents, int remainingLumis);
224  void validateFile(InputType inputType, bool usingGoToEvent);
225  void fillIndexIntoFile();
226  bool fillEventAuxiliary(IndexIntoFile::EntryNumber_t entry);
227  void fillThisEventAuxiliary();
228  void fillEventHistory();
229  std::shared_ptr<LuminosityBlockAuxiliary> fillLumiAuxiliary();
230  std::shared_ptr<RunAuxiliary> fillRunAuxiliary();
231  std::string const& newBranchToOldBranch(std::string const& newBranch) const;
232  void markBranchToBeDropped(bool dropDescendants, BranchDescription const& branch, std::set<BranchID>& branchesToDrop, std::map<BranchID, BranchID> const& droppedToKeptAlias) const;
233  void dropOnInput(ProductRegistry& reg, ProductSelectorRules const& rules, bool dropDescendants, InputType inputType);
234  void readParentageTree(InputType inputType);
235  void readEntryDescriptionTree(EntryDescriptionMap& entryDescriptionMap, InputType inputType); // backward compatibility
236  void readEventHistoryTree();
237  bool isDuplicateEvent();
238 
239  void initializeDuplicateChecker(std::vector<std::shared_ptr<IndexIntoFile> > const& indexesIntoFiles,
240  std::vector<std::shared_ptr<IndexIntoFile> >::size_type currentIndexIntoFile);
241 
242  std::unique_ptr<MakeProvenanceReader> makeProvenanceReaderMaker(InputType inputType);
243  std::shared_ptr<ProductProvenanceRetriever> makeProductProvenanceRetriever(unsigned int iStreamIndex);
244 
245  std::shared_ptr<RunAuxiliary const> savedRunAuxiliary() const {return get_underlying_safe(savedRunAuxiliary_);}
246  std::shared_ptr<RunAuxiliary>& savedRunAuxiliary() {return get_underlying_safe(savedRunAuxiliary_);}
247 
248  std::shared_ptr<BranchChildren const> branchChildren() const {return get_underlying_safe(branchChildren_);}
249  std::shared_ptr<BranchChildren>& branchChildren() {return get_underlying_safe(branchChildren_);}
250 
251  std::shared_ptr<ProductProvenanceRetriever const> eventProductProvenanceRetriever(size_t index) const {return get_underlying_safe(eventProductProvenanceRetrievers_[index]);}
252  std::shared_ptr<ProductProvenanceRetriever>& eventProductProvenanceRetriever(size_t index) {return get_underlying_safe(eventProductProvenanceRetrievers_[index]);}
253 
264  std::vector<ProcessHistoryID>& orderedProcessHistoryIDs_;
269  std::vector<EventProcessHistoryID> eventProcessHistoryIDs_; // backward compatibility
270  std::vector<EventProcessHistoryID>::const_iterator eventProcessHistoryIter_; // backward compatibility
275  std::array<bool, NumBranchTypes> hasNewlyDroppedBranch_;
281  RootTreePtrArray treePointers_;
283  std::shared_ptr<ProductRegistry const> productRegistry_;
284  std::shared_ptr<BranchIDLists const> branchIDLists_;
290  std::map<std::string, std::string> newBranchToOldBranch_;
299  std::vector<edm::propagate_const<std::shared_ptr<ProductProvenanceRetriever>>> eventProductProvenanceRetrievers_;
300  std::vector<ParentageID> parentageIDLookup_;
304  }; // class RootFile
305 
306 }
307 #endif
EventID const & eventID() const
Definition: RootFile.h:173
bool setEntryAtItem(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event)
Definition: RootFile.h:183
edm::propagate_const< std::unique_ptr< ThinnedAssociationsHelper > > fileThinnedAssociationsHelper_
Definition: RootFile.h:286
InputType
Definition: InputType.h:5
RootTree const & lumiTree() const
Definition: RootFile.h:175
std::shared_ptr< BranchIDLists const > branchIDLists_
Definition: RootFile.h:284
edm::propagate_const< std::shared_ptr< DuplicateChecker > > duplicateChecker_
Definition: RootFile.h:296
std::shared_ptr< BranchIDListHelper const > branchIDListHelper() const
Definition: RootFile.h:208
FileFormatVersion fileFormatVersion() const
Definition: RootFile.h:177
virtual ~MakeProvenanceReader()=default
bool branchListIndexesUnchanged() const
Definition: RootFile.h:180
bool nextEventEntry()
Definition: RootFile.h:206
int whyNotFastClonable_
Definition: RootFile.h:274
edm::propagate_const< std::shared_ptr< EventSkipperByID > > eventSkipperByID_
Definition: RootFile.h:259
edm::propagate_const< std::shared_ptr< ThinnedAssociationsHelper > > thinnedAssociationsHelper_
Definition: RootFile.h:287
std::map< std::string, std::string > newBranchToOldBranch_
Definition: RootFile.h:290
edm::propagate_const< std::shared_ptr< IndexIntoFile > > indexIntoFileSharedPtr_
Definition: RootFile.h:262
RootTree lumiTree_
Definition: RootFile.h:279
InputType inputType_
Definition: RootFile.h:303
edm::propagate_const< ProcessHistoryRegistry * > processHistoryRegistry_
Definition: RootFile.h:257
edm::propagate_const< std::unique_ptr< DaqProvenanceHelper > > daqProvenanceHelper_
Definition: RootFile.h:301
edm::propagate_const< std::shared_ptr< RunAuxiliary > > savedRunAuxiliary_
Definition: RootFile.h:271
unsigned long long EventNumber_t
InputSource::ProcessingMode processingMode_
Definition: RootFile.h:288
IndexIntoFile::IndexIntoFileItr indexIntoFileIter_
Definition: RootFile.h:267
std::shared_ptr< ProductProvenanceRetriever const > eventProductProvenanceRetriever(size_t index) const
Definition: RootFile.h:251
bool skipEntries(unsigned int &offset)
Definition: RootFile.h:203
#define nullptr
std::shared_ptr< IndexIntoFile > & indexIntoFileSharedPtr()
Definition: RootFile.h:211
std::shared_ptr< ProductRegistry const > productRegistry() const
Definition: RootFile.h:168
uint16_t size_type
unsigned int LuminosityBlockNumber_t
std::vector< EventSelectionID > EventSelectionIDVector
edm::propagate_const< TClass * > edProductClass_
Definition: RootFile.h:302
FileFormatVersion fileFormatVersion_
Definition: RootFile.h:260
void rewind()
Definition: RootFile.h:193
std::vector< edm::propagate_const< std::shared_ptr< ProductProvenanceRetriever > > > eventProductProvenanceRetrievers_
Definition: RootFile.h:299
std::vector< EventProcessHistoryID >::const_iterator eventProcessHistoryIter_
Definition: RootFile.h:270
void setToLastEntry()
Definition: RootFile.h:199
FileID fid_
Definition: RootFile.h:261
long long EntryNumber_t
std::string const logicalFile_
Definition: RootFile.h:255
std::vector< BranchListIndex > BranchListIndexes
IndexIntoFile::IndexIntoFileItr indexIntoFileEnd_
Definition: RootFile.h:266
edm::propagate_const< std::unique_ptr< StoredMergeableRunProductMetadata > > storedMergeableRunProductMetadata_
Definition: RootFile.h:268
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)
Definition: RootFile.h:95
bool noEventSort_
Definition: RootFile.h:273
RootTree const & runTree() const
Definition: RootFile.h:176
bool modifiedIDs() const
Definition: RootFile.h:181
IndexIntoFile::EntryNumber_t lastEventEntryNumberRead_
Definition: RootFile.h:282
EventAuxiliary const & eventAux() const
Definition: RootFile.h:169
EventSelectionIDVector eventSelectionIDs_
Definition: RootFile.h:292
int whyNotFastClonable() const
Definition: RootFile.h:178
edm::propagate_const< std::unique_ptr< ProvenanceAdaptor > > provenanceAdaptor_
Definition: RootFile.h:297
std::shared_ptr< ProductProvenanceRetriever > & eventProductProvenanceRetriever(size_t index)
Definition: RootFile.h:252
bool skipAnyEvents_
Definition: RootFile.h:272
RootTree eventTree_
Definition: RootFile.h:278
std::array< bool, NumBranchTypes > const & hasNewlyDroppedBranch() const
Definition: RootFile.h:179
BranchListIndexes branchListIndexes_
Definition: RootFile.h:293
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
def cache(function)
edm::propagate_const< std::unique_ptr< History > > history_
Definition: RootFile.h:294
IndexIntoFile & indexIntoFile_
Definition: RootFile.h:263
std::shared_ptr< BranchIDListHelper > & branchIDListHelper()
Definition: RootFile.h:209
RootTree runTree_
Definition: RootFile.h:280
edm::propagate_const< std::unique_ptr< MakeProvenanceReader > > provenanceReaderMaker_
Definition: RootFile.h:298
std::shared_ptr< RunAuxiliary const > savedRunAuxiliary() const
Definition: RootFile.h:245
std::array< bool, NumBranchTypes > hasNewlyDroppedBranch_
Definition: RootFile.h:275
std::shared_ptr< RunAuxiliary > & savedRunAuxiliary()
Definition: RootFile.h:246
ProcessConfiguration const & processConfiguration_
Definition: RootFile.h:256
std::shared_ptr< ProductRegistry const > productRegistry_
Definition: RootFile.h:283
std::map< EntryDescriptionID, EventEntryDescription > EntryDescriptionMap
Definition: RootFile.h:52
edm::propagate_const< std::shared_ptr< BranchChildren > > branchChildren_
Definition: RootFile.h:295
edm::propagate_const< std::shared_ptr< InputFile > > filePtr_
Definition: RootFile.h:258
std::shared_ptr< BranchChildren const > branchChildren() const
Definition: RootFile.h:248
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)
Definition: RootFile.h:126
std::shared_ptr< BranchChildren > & branchChildren()
Definition: RootFile.h:249
std::string const & file() const
Definition: RootFile.h:167
IndexIntoFile::IndexIntoFileItr indexIntoFileBegin_
Definition: RootFile.h:265
std::array< RootTree *, NumBranchTypes > RootTreePtrArray
Definition: RootFile.h:64
edm::propagate_const< RunHelperBase * > runHelper_
Definition: RootFile.h:289
bool branchListIndexesUnchanged_
Definition: RootFile.h:276
HLT enums.
edm::propagate_const< TTree * > eventHistoryTree_
Definition: RootFile.h:291
RootTreePtrArray treePointers_
Definition: RootFile.h:281
static int position[264][3]
Definition: ReadPGInfo.cc:509
std::vector< ProcessHistoryID > & orderedProcessHistoryIDs_
Definition: RootFile.h:264
RootTreePtrArray & treePointers()
Definition: RootFile.h:221
std::shared_ptr< IndexIntoFile const > indexIntoFileSharedPtr() const
Definition: RootFile.h:210
unsigned int RunNumber_t
std::vector< ParentageID > parentageIDLookup_
Definition: RootFile.h:300
EventAuxiliary eventAux_
Definition: RootFile.h:277
RootTree const & eventTree() const
Definition: RootFile.h:174
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
Definition: RootFile.h:285
virtual std::unique_ptr< ProvenanceReaderBase > makeReader(RootTree &eventTree, DaqProvenanceHelper const *daqProvenanceHelper) const =0
std::string const file_
Definition: RootFile.h:254
std::vector< EventProcessHistoryID > eventProcessHistoryIDs_
Definition: RootFile.h:269
Definition: event.py:1