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