artdaq  v3_10_03
RootDAQOutFile.h
1 #ifndef art_root_io_RootDAQOutFile_h
2 #define art_root_io_RootDAQOutFile_h
3 // vim: set sw=2 expandtab :
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/Principal/RangeSetsSupported.h"
10 #include "art/Persistency/Provenance/Selections.h"
11 #include "art_root_io/DropMetaData.h"
12 #include "art_root_io/RootOutputTree.h"
13 #if ART_HEX_VERSION < 0x30800
14 #include "art_root_io/detail/DummyProductCache.h"
15 #define DummyProductCache detail::DummyProductCache
16 #else
17 #include "art_root_io/DummyProductCache.h"
18 #endif
19 #include "boost/filesystem.hpp"
20 #include "canvas/Persistency/Provenance/BranchDescription.h"
21 #include "canvas/Persistency/Provenance/BranchType.h"
22 #include "canvas/Persistency/Provenance/FileIndex.h"
23 #include "canvas/Persistency/Provenance/ParameterSetBlob.h"
24 #include "canvas/Persistency/Provenance/ParameterSetMap.h"
25 #include "canvas/Persistency/Provenance/ProductID.h"
26 #include "canvas/Persistency/Provenance/ProductProvenance.h"
27 #include "cetlib/sqlite/Connection.h"
28 #include "hep_concurrency/RecursiveMutex.h"
29 
30 #include <array>
31 #include <map>
32 #include <memory>
33 #include <set>
34 #include <string>
35 #include <vector>
36 
37 #include "TFile.h"
38 #include "TROOT.h"
39 
40 class TTree;
41 
42 namespace art {
43 class ResultsPrincipal;
44 class RootDAQOut;
45 class History;
46 class FileBlock;
47 class EventAuxiliary;
48 class SubRunAuxiliary;
49 class RunAuxiliary;
50 class ResultsAuxiliary;
51 class RootFileBlock;
53 {
54 public: // TYPES
55  enum class ClosureRequestMode
56  {
57  MaxEvents = 0,
58  MaxSize = 1,
59  Unset = 2
60  };
61  using RootOutputTreePtrArray =
62  std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
63  struct OutputItem
64  {
65  public: // MEMBER FUNCTIONS -- Special Member Functions
66  ~OutputItem();
67  explicit OutputItem(BranchDescription bd);
68 
69  public: // MEMBER FUNCTIONS
70  std::string const& branchName() const;
71  bool operator<(OutputItem const& rh) const;
72 
73  public: // MEMBER DATA
74  BranchDescription const branchDescription_;
75  mutable void const* product_;
76 
77  private:
78  OutputItem(OutputItem const&) = delete;
79  OutputItem(OutputItem&&) = delete;
80  OutputItem& operator=(OutputItem const&) = delete;
81  OutputItem& operator=(OutputItem&&) = delete;
82  };
83 
84 public: // MEMBER FUNCTIONS -- Static API
85  static bool shouldFastClone(bool const fastCloningSet,
86  bool const fastCloning,
87  bool const wantAllEvents,
88  ClosingCriteria const& cc);
89 
90 public: // MEMBER FUNCTIONS -- Special Member Functions
91  ~RootDAQOutFile();
92  explicit RootDAQOutFile(OutputModule*,
93  std::string const& fileName,
94  ClosingCriteria const& fileSwitchCriteria,
95  int const compressionLevel,
96  unsigned freePercent,
97  unsigned freeMB,
98  int64_t const saveMemoryObjectThreshold,
99  int64_t const treeMaxVirtualSize,
100  int const splitLevel,
101  int const basketSize,
102  DropMetaData dropMetaData,
103  bool dropMetaDataForDroppedData,
104  bool fastCloningRequested);
105  RootDAQOutFile(RootDAQOutFile const&) = delete;
106  RootDAQOutFile(RootDAQOutFile&&) = delete;
107  RootDAQOutFile& operator=(RootDAQOutFile const&) = delete;
108  RootDAQOutFile& operator=(RootDAQOutFile&&) = delete;
109 
110 public: // MEMBER FUNCTIONS
111  void createDatabaseTables();
112  void writeTTrees();
113  void writeOne(EventPrincipal const&);
114  void writeSubRun(SubRunPrincipal const&);
115  void writeRun(RunPrincipal const&);
116  void writeFileFormatVersion();
117  void writeFileIndex();
118  void writeEventHistory();
119  void writeProcessConfigurationRegistry();
120  void writeProcessHistoryRegistry();
121  void writeParameterSetRegistry();
122  void writeProductDescriptionRegistry();
123  void writeParentageRegistry();
124  void writeProductDependencies();
125  void writeFileCatalogMetadata(FileStatsCollector const& stats,
126  FileCatalogMetadata::collection_type const&,
127  FileCatalogMetadata::collection_type const&);
128  void writeResults(ResultsPrincipal& resp);
129  void setRunAuxiliaryRangeSetID(RangeSet const&);
130  void setSubRunAuxiliaryRangeSetID(RangeSet const&);
131  void beginInputFile(RootFileBlock const*, bool fastClone);
132  void incrementInputFileNumber();
133  void respondToCloseInputFile(FileBlock const&);
134  bool requestsToCloseFile();
135  void setFileStatus(OutputFileStatus const ofs);
136  void selectProducts();
137  std::string const& currentFileName() const;
138  bool maxEventsPerFileReached(
139  FileIndex::EntryNumber_t const maxEventsPerFile) const;
140  bool maxSizeReached(unsigned const maxFileSize) const;
141 
142 private: // MEMBER FUNCTIONS
143  template<BranchType>
144  void fillBranches(Principal const&, std::vector<ProductProvenance>*);
145  template<BranchType BT>
146  EDProduct const* getProduct(OutputHandle const&,
147  RangeSet const& productRS,
148  std::string const& wrappedName);
149 
150 private: // MEMBER DATA
151  mutable hep::concurrency::RecursiveMutex mutex_;
152  OutputModule const* om_;
153  std::string file_;
154  ClosingCriteria fileSwitchCriteria_;
155  OutputFileStatus status_;
156  int const compressionLevel_;
157  unsigned freePercent_;
158  unsigned freeMB_;
159  int64_t const saveMemoryObjectThreshold_;
160  int64_t const treeMaxVirtualSize_;
161  int const splitLevel_;
162  int const basketSize_;
163  DropMetaData dropMetaData_;
164  bool dropMetaDataForDroppedData_;
165  bool fastCloningEnabledAtConstruction_;
166  bool wasFastCloned_;
167  std::unique_ptr<TFile> filePtr_;
168  FileIndex fileIndex_;
169  FileProperties fp_;
170  TTree* metaDataTree_;
171  TTree* fileIndexTree_;
172  TTree* parentageTree_;
173  TTree* eventHistoryTree_;
174  EventAuxiliary const* pEventAux_;
175  SubRunAuxiliary const* pSubRunAux_;
176  RunAuxiliary const* pRunAux_;
177  ResultsAuxiliary const* pResultsAux_;
178  ProductProvenances eventProductProvenanceVector_;
179  ProductProvenances subRunProductProvenanceVector_;
180  ProductProvenances runProductProvenanceVector_;
181  ProductProvenances resultsProductProvenanceVector_;
182  ProductProvenances* pEventProductProvenanceVector_;
183  ProductProvenances* pSubRunProductProvenanceVector_;
184  ProductProvenances* pRunProductProvenanceVector_;
185  ProductProvenances* pResultsProductProvenanceVector_;
186  History const* pHistory_;
187  RootOutputTreePtrArray treePointers_;
188  bool dataTypeReported_;
189  std::array<ProductDescriptionsByID, NumBranchTypes> descriptionsToPersist_;
190  std::unique_ptr<cet::sqlite::Connection> rootFileDB_;
191  std::array<std::set<OutputItem>, NumBranchTypes> selectedOutputItemList_;
192  DummyProductCache dummyProductCache_;
193  unsigned subRunRSID_;
194  unsigned runRSID_;
195  std::chrono::steady_clock::time_point beginTime_;
196 };
197 
198 } // namespace art
199 
200 // Local Variables:
201 // mode: c++
202 // End:
203 #endif /* art_root_io_RootDAQOutFile_h */