artdaq  v2_03_02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
RootDAQOutFile.h
1 #ifndef artdaq_ArtModules_RootDAQOutFile_h
2 #define artdaq_ArtModules_RootDAQOutFile_h
3 // vim: set sw=2:
4 
5 // FIXME! There is an incestuous relationship between RootOutputFile and
6 // RootOutput that only works because the methods of RootOutput and
7 // OutputItem used by RootOutputFile are all inline. A correct and
8 // robust implementation would have a OutputItem defined in a separate
9 // file and the information (basket size, etc) in a different class in
10 // the main art/Framework/Root library accessed by both RootOutputFile
11 // and RootOutput. This has been entered as issue #2885.
12 
13 #include "art/Framework/Core/Frameworkfwd.h"
14 #include "art/Framework/Core/OutputModule.h"
15 #include "art/Framework/IO/FileStatsCollector.h"
16 #include "art/Framework/IO/Root/DropMetaData.h"
17 #include "art/Framework/IO/Root/RootOutputClosingCriteria.h"
18 #include "art/Framework/IO/Root/RootOutputTree.h"
19 #include "artdaq/ArtModules/detail/DummyProductCache.h"
20 #include "art/Framework/Principal/RangeSetsSupported.h"
21 #if ART_HEX_VERSION >= 0x20703
22 # include "art/Persistency/Provenance/Selections.h"
23 # include "boost/filesystem.hpp"
24 # include "cetlib/sqlite/Connection.h"
25 #else
26 # include "art/Persistency/Provenance/Selections.h"
27 # include "boost/filesystem.hpp"
28 #endif
29 #include "canvas/Persistency/Provenance/BranchDescription.h"
30 #include "canvas/Persistency/Provenance/BranchID.h"
31 #include "canvas/Persistency/Provenance/BranchType.h"
32 #include "canvas/Persistency/Provenance/FileIndex.h"
33 #include "canvas/Persistency/Provenance/ParameterSetBlob.h"
34 #include "canvas/Persistency/Provenance/ParameterSetMap.h"
35 #include "canvas/Persistency/Provenance/ProductProvenance.h"
36 #include "art/Persistency/RootDB/SQLite3Wrapper.h"
37 
38 #include <array>
39 #include <map>
40 #include <memory>
41 #include <string>
42 #include <vector>
43 
44 #include "TROOT.h"
45 
46 class TFile;
47 class TTree;
48 
49 namespace art {
50  class ResultsPrincipal;
51  class RootDAQOutFile;
52  class RootOutput;
53  class RootOutputTree;
54  class History;
55  class FileBlock;
56  class EventAuxiliary;
57  class SubRunAuxiliary;
58  class RunAuxiliary;
59  class ResultsAuxiliary;
60 }
61 
63 public: // TYPES
64 
65  enum class ClosureRequestMode { MaxEvents, MaxSize, Unset };
66  using RootOutputTreePtrArray = std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
67 
68  struct OutputItem {
69 
70  BranchDescription const* branchDescription_ {nullptr};
71  mutable void const* product_ {nullptr};
72 
73  class Sorter {
74  public:
75 
76  explicit Sorter(TTree* tree);
77  bool operator()(OutputItem const& lh, OutputItem const& rh) const;
78 
79  private:
80 
81  // Maps branch name to branch list index.
82  std::map<std::string, int> treeMap_;
83  };
84 
85  ~OutputItem() = default;
86 
87  explicit OutputItem(BranchDescription const* bd)
88  : branchDescription_{bd}
89  {}
90 
91  BranchID branchID() const
92  {
93  return branchDescription_->branchID();
94  }
95 
96  std::string const& branchName() const
97  {
98  return branchDescription_->branchName();
99  }
100 
101  bool operator<(OutputItem const& rh) const
102  {
103  return *branchDescription_ < *rh.branchDescription_;
104  }
105 
106  };
107 
108  using OutputItemList = std::vector<OutputItem>;
109 
110  using OutputItemListArray = std::array<OutputItemList, NumBranchTypes>;
111 
112 public: // MEMBER FUNCTIONS
113 
114  explicit RootDAQOutFile(OutputModule*,
115  std::string const& fileName,
116  ClosingCriteria const& fileSwitchCriteria,
117  int const compressionLevel,
118  int64_t const saveMemoryObjectThreshold,
119  int64_t const treeMaxVirtualSize,
120  int const splitLevel,
121  int const basketSize,
122  DropMetaData dropMetaData,
123  bool dropMetaDataForDroppedData,
124  bool fastCloning);
125 
126 #if ART_HEX_VERSION >= 0x20703
127  void writeTTrees();
128 #endif
129  void writeOne(EventPrincipal const&);
130  void writeSubRun(SubRunPrincipal const&);
131  void writeRun(RunPrincipal const&);
132  void writeFileFormatVersion();
133  void writeFileIndex();
134  void writeEventHistory();
135  void writeProcessConfigurationRegistry();
136  void writeProcessHistoryRegistry();
137  void writeParameterSetRegistry();
138  void writeProductDescriptionRegistry();
139  void writeParentageRegistry();
140  void writeBranchIDListRegistry();
141  void writeProductDependencies();
142  void writeFileCatalogMetadata(FileStatsCollector const& stats,
143  FileCatalogMetadata::collection_type const&,
144  FileCatalogMetadata::collection_type const&);
145  void writeResults(ResultsPrincipal & resp);
146  void setRunAuxiliaryRangeSetID(RangeSet const&);
147  void setSubRunAuxiliaryRangeSetID(RangeSet const&);
148  void finishEndFile();
149  void beginInputFile(FileBlock const&, bool fastClone);
150  void incrementInputFileNumber();
151  void respondToCloseInputFile(FileBlock const&);
152  bool requestsToCloseFile();
153  void setFileStatus(OutputFileStatus const ofs) { status_ = ofs; }
154 
155  void selectProducts(FileBlock const&);
156 
157  std::string const& currentFileName() const { return file_; }
158 
159  bool maxEventsPerFileReached(FileIndex::EntryNumber_t const maxEventsPerFile) const;
160  bool maxSizeReached(unsigned const maxFileSize) const;
161 
162 private: // MEMBER FUNCTIONS
163 
164  void createDatabaseTables();
165 
166  template <BranchType>
167  void fillBranches(Principal const&,
168  std::vector<ProductProvenance>*); // Defined in source.
169 
170  template <BranchType BT>
171  std::enable_if_t<!detail::RangeSetsSupported<BT>::value, art::EDProduct const*>
172  getProduct(OutputHandle const&,
173  RangeSet const& productRS,
174  std::string const& wrappedName); // Defined in source.
175 
176  template <BranchType BT>
177  std::enable_if_t<detail::RangeSetsSupported<BT>::value, art::EDProduct const*>
178  getProduct(OutputHandle const&,
179  RangeSet const& productRS,
180  std::string const& wrappedName); // Defined in source.
181 
182 private: // MEMBER DATA
183 
184  OutputModule const* om_;
185  std::string file_;
186  ClosingCriteria fileSwitchCriteria_;
187  OutputFileStatus status_ {OutputFileStatus::Closed};
188  int const compressionLevel_;
189  int64_t const saveMemoryObjectThreshold_;
190  int64_t const treeMaxVirtualSize_;
191  int const splitLevel_;
192  int const basketSize_;
193  DropMetaData dropMetaData_;
194  bool dropMetaDataForDroppedData_;
195  bool fastCloning_;
196  bool currentlyFastCloning_ {true};
197  std::unique_ptr<TFile> filePtr_;
198  FileIndex fileIndex_ {};
199  FileProperties fp_ {};
200  TTree* metaDataTree_ {nullptr};
201  TTree* fileIndexTree_ {nullptr};
202  TTree* parentageTree_ {nullptr};
203  TTree* eventHistoryTree_ {nullptr};
204  EventAuxiliary const* pEventAux_ {nullptr};
205  SubRunAuxiliary const* pSubRunAux_ {nullptr};
206  RunAuxiliary const* pRunAux_ {nullptr};
207  ResultsAuxiliary const *pResultsAux_ {nullptr};
208  ProductProvenances eventProductProvenanceVector_ {};
209  ProductProvenances subRunProductProvenanceVector_ {};
210  ProductProvenances runProductProvenanceVector_ {};
211  ProductProvenances resultsProductProvenanceVector_ {};
212  ProductProvenances* pEventProductProvenanceVector_ {&eventProductProvenanceVector_};
213  ProductProvenances* pSubRunProductProvenanceVector_ {&subRunProductProvenanceVector_};
214  ProductProvenances* pRunProductProvenanceVector_ {&runProductProvenanceVector_};
215  ProductProvenances* pResultsProductProvenanceVector_ {&resultsProductProvenanceVector_};
216  History const* pHistory_ {nullptr};
217  RootOutputTreePtrArray treePointers_;
218  bool dataTypeReported_ {false};
219  std::set<BranchID> branchesWithStoredHistory_ {};
220 # if ART_HEX_VERSION >= 0x20703
221  cet::sqlite::Connection rootFileDB_;
222 # else
223  SQLite3Wrapper rootFileDB_;
224 # endif
225  OutputItemListArray selectedOutputItemList_ {{}}; // filled by aggregation
226  detail::DummyProductCache dummyProductCache_ {};
227  unsigned subRunRSID_ {-1u};
228  unsigned runRSID_ {-1u};
229  std::chrono::steady_clock::time_point beginTime_ {std::chrono::steady_clock::now()};
230 };
231 
232 // Local Variables:
233 // mode: c++
234 // End:
235 #endif /* artdaq_ArtModules_RootDAQOutFile_h */