artdaq  v3_06_02
RootDAQOutFile.h
1 #ifndef art_Framework_IO_Root_RootDAQOutFile_h
2 #define art_Framework_IO_Root_RootDAQOutFile_h
3 // vim: set sw=2:
4 
5 #include "art/Framework/Core/Frameworkfwd.h"
6 #include "art/Framework/Core/OutputModule.h"
7 #include "art/Framework/IO/ClosingCriteria.h"
8 #include "art/Framework/IO/FileStatsCollector.h"
9 #include "art/Framework/IO/Root/DropMetaData.h"
10 #include "art/Framework/IO/Root/RootOutputTree.h"
11 #include "art/Framework/IO/Root/detail/DummyProductCache.h"
12 #include "art/Framework/Principal/RangeSetsSupported.h"
13 #include "art/Persistency/Provenance/Selections.h"
14 #include "boost/filesystem.hpp"
15 #include "canvas/Persistency/Provenance/BranchDescription.h"
16 #include "canvas/Persistency/Provenance/BranchType.h"
17 #include "canvas/Persistency/Provenance/FileIndex.h"
18 #include "canvas/Persistency/Provenance/ParameterSetBlob.h"
19 #include "canvas/Persistency/Provenance/ParameterSetMap.h"
20 #include "canvas/Persistency/Provenance/ProductID.h"
21 #include "canvas/Persistency/Provenance/ProductProvenance.h"
22 #include "cetlib/sqlite/Connection.h"
23 
24 #include <array>
25 #include <map>
26 #include <memory>
27 #include <set>
28 #include <string>
29 #include <vector>
30 
31 #include "TFile.h"
32 #include "TROOT.h"
33 
34 class TTree;
35 
36 namespace art {
37 class RootDAQOutFile;
38 
39 class ResultsPrincipal;
40 class RootOutput;
41 class History;
42 class FileBlock;
43 class EventAuxiliary;
44 class SubRunAuxiliary;
45 class RunAuxiliary;
46 class ResultsAuxiliary;
47 class RootFileBlock;
48 } // namespace art
49 
51 {
52 public: // TYPES
53  enum class ClosureRequestMode
54  {
55  MaxEvents,
56  MaxSize,
57  Unset
58  };
59  using RootOutputTreePtrArray =
60  std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
61 
62  struct OutputItem
63  {
64  BranchDescription const* branchDescription_{nullptr};
65  mutable void const* product_{nullptr};
66 
67  explicit OutputItem(BranchDescription const* pd)
68  : branchDescription_{pd} {}
69 
70  std::string const&
71  branchName() const
72  {
73  return branchDescription_->branchName();
74  }
75 
76  bool
77  operator<(OutputItem const& rh) const
78  {
79  return *branchDescription_ < *rh.branchDescription_;
80  }
81  };
82 
83  using OutputItemList = std::set<OutputItem>;
84  using OutputItemListArray = std::array<OutputItemList, NumBranchTypes>;
85 
86 public: // MEMBER FUNCTIONS
87  explicit RootDAQOutFile(OutputModule*,
88  std::string const& fileName,
89  ClosingCriteria const& fileSwitchCriteria,
90  int const compressionLevel,
91  unsigned freePercent,
92  unsigned freeMB,
93  int64_t const saveMemoryObjectThreshold,
94  int64_t const treeMaxVirtualSize,
95  int const splitLevel,
96  int const basketSize,
97  DropMetaData dropMetaData,
98  bool dropMetaDataForDroppedData,
99  bool fastCloningRequested,
100  bool const parentageEnabled,
101  bool const rangesEnabled,
102  bool const dbEnabled);
103  ~RootDAQOutFile();
104 
105  void writeTTrees();
106 
107  void writeOne(EventPrincipal const&);
108  void writeSubRun(SubRunPrincipal const&);
109  void writeRun(RunPrincipal const&);
110  void writeFileFormatVersion();
111  void writeFileIndex();
112  void writeEventHistory();
113  void writeProcessConfigurationRegistry();
114  void writeProcessHistoryRegistry();
115  void writeParameterSetRegistry();
116  void writeProductDescriptionRegistry();
117  void writeParentageRegistry();
118  void writeProductDependencies();
119  void writeFileCatalogMetadata(FileStatsCollector const& stats,
120  FileCatalogMetadata::collection_type const&,
121  FileCatalogMetadata::collection_type const&);
122  void writeResults(ResultsPrincipal& resp);
123  void setRunAuxiliaryRangeSetID(RangeSet const&);
124  void setSubRunAuxiliaryRangeSetID(RangeSet const&);
125  void beginInputFile(RootFileBlock const*, bool fastClone);
126  void incrementInputFileNumber();
127  void respondToCloseInputFile(FileBlock const&);
128  bool requestsToCloseFile();
129  void
130  setFileStatus(OutputFileStatus const ofs)
131  {
132  status_ = ofs;
133  }
134 
135  void selectProducts();
136 
137  std::string const&
138  currentFileName() const
139  {
140  return file_;
141  }
142 
143  bool maxEventsPerFileReached(
144  FileIndex::EntryNumber_t const maxEventsPerFile) const;
145  bool maxSizeReached(unsigned const maxFileSize) const;
146 
147 private: // MEMBER FUNCTIONS
148  void writeRun_FileIndexPart(RunPrincipal const&);
149  void writeSubRun_FileIndexPart(SubRunPrincipal const&);
150  void writeOneEvent_EventPart(EventPrincipal const&);
151  void writeOneEvent_HistoryPart(EventPrincipal const&);
152  void writeOneEvent_FileIndexPart(EventPrincipal const&);
153 
154  void createDatabaseTables();
155 
156  template<BranchType>
157  void fillBranches(Principal const&,
158  std::vector<ProductProvenance>*); // Defined in source.
159 
160  template<BranchType BT>
161  std::enable_if_t<!detail::RangeSetsSupported<BT>::value,
162  art::EDProduct const*>
163  getProduct(OutputHandle const&,
164  RangeSet const& productRS,
165  std::string const& wrappedName); // Defined in source.
166 
167  template<BranchType BT>
168  std::enable_if_t<detail::RangeSetsSupported<BT>::value, art::EDProduct const*>
169  getProduct(OutputHandle const&,
170  RangeSet const& productRS,
171  std::string const& wrappedName); // Defined in source.
172  void insertParents(std::set<ProductProvenance>&,
173  Principal const&,
174  std::vector<ProductID> const&);
175 
176 private: // MEMBER DATA
177  OutputModule const* om_;
178  std::string file_;
179  ClosingCriteria fileSwitchCriteria_;
180  OutputFileStatus status_{OutputFileStatus::Closed};
181  int const compressionLevel_;
182  unsigned freePercent_;
183  unsigned freeMB_;
184  int64_t const saveMemoryObjectThreshold_;
185  int64_t const treeMaxVirtualSize_;
186  int const splitLevel_;
187  int const basketSize_;
188  DropMetaData dropMetaData_;
189  bool dropMetaDataForDroppedData_;
190  bool fastCloningEnabledAtConstruction_;
191  bool wasFastCloned_{false};
192  std::unique_ptr<TFile> filePtr_; // File closed when d'tor called
193  FileIndex fileIndex_{};
194  FileProperties fp_{};
195  TTree* metaDataTree_{nullptr};
196  TTree* fileIndexTree_{nullptr};
197  TTree* parentageTree_{nullptr};
198  TTree* eventHistoryTree_{nullptr};
199  EventAuxiliary const* pEventAux_{nullptr};
200  SubRunAuxiliary const* pSubRunAux_{nullptr};
201  RunAuxiliary const* pRunAux_{nullptr};
202  ResultsAuxiliary const* pResultsAux_{nullptr};
203  ProductProvenances eventProductProvenanceVector_{};
204  ProductProvenances subRunProductProvenanceVector_{};
205  ProductProvenances runProductProvenanceVector_{};
206  ProductProvenances resultsProductProvenanceVector_{};
207  ProductProvenances* pEventProductProvenanceVector_{
208  &eventProductProvenanceVector_};
209  ProductProvenances* pSubRunProductProvenanceVector_{
210  &subRunProductProvenanceVector_};
211  ProductProvenances* pRunProductProvenanceVector_{
212  &runProductProvenanceVector_};
213  ProductProvenances* pResultsProductProvenanceVector_{
214  &resultsProductProvenanceVector_};
215  History const* pHistory_{nullptr};
216  RootOutputTreePtrArray treePointers_;
217  bool dataTypeReported_{false};
218  std::set<ProductID> branchesWithStoredHistory_{};
219  cet::sqlite::Connection rootFileDB_; // Connection closed when d'tor
220  // called. DB written to file
221  // when sqlite3_close is
222  // called.
223  OutputItemListArray selectedOutputItemList_{{}}; // filled by aggregation
224  detail::DummyProductCache dummyProductCache_{};
225  unsigned subRunRSID_{-1u};
226  unsigned runRSID_{-1u};
227  std::chrono::steady_clock::time_point beginTime_{
228  std::chrono::steady_clock::now()};
229  bool const parentageEnabled_{true};
230  bool const rangesEnabled_{true};
231  bool const dbEnabled_{true};
232 };
233 
234 // Local Variables:
235 // mode: c++
236 // End:
237 #endif /* art_Framework_IO_Root_RootDAQOutFile_h */