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