artdaq  v3_02_00
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/RootDAQOutput/detail/DummyProductCache.h"
20 #include "art/Framework/Principal/RangeSetsSupported.h"
21 # include "art/Persistency/Provenance/Selections.h"
22 # include "boost/filesystem.hpp"
23 # include "cetlib/sqlite/Connection.h"
24 #include "canvas/Persistency/Provenance/BranchDescription.h"
25 #include "canvas/Persistency/Provenance/BranchID.h"
26 #include "canvas/Persistency/Provenance/BranchType.h"
27 #include "canvas/Persistency/Provenance/FileIndex.h"
28 #include "canvas/Persistency/Provenance/ParameterSetBlob.h"
29 #include "canvas/Persistency/Provenance/ParameterSetMap.h"
30 #include "canvas/Persistency/Provenance/ProductProvenance.h"
31 #include "art/Persistency/RootDB/SQLite3Wrapper.h"
32 
33 #include <array>
34 #include <map>
35 #include <memory>
36 #include <string>
37 #include <vector>
38 
39 #include "TROOT.h"
40 
41 class TFile;
42 class TTree;
43 
44 namespace art {
45  class ResultsPrincipal;
46  class RootDAQOutFile;
47  class RootOutput;
48  class RootOutputTree;
49  class History;
50  class FileBlock;
51  class EventAuxiliary;
52  class SubRunAuxiliary;
53  class RunAuxiliary;
54  class ResultsAuxiliary;
55 }
56 
61 {
62 public: // TYPES
63 
67  enum class ClosureRequestMode { MaxEvents, MaxSize, Unset };
68  using RootOutputTreePtrArray = std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
69 
70  struct OutputItem
71  {
72 
73  BranchDescription const* branchDescription_{ nullptr };
74  mutable void const* product_{ nullptr };
75 
76  class Sorter
77  {
78  public:
79 
80  explicit Sorter(TTree* tree);
81  bool operator()(OutputItem const& lh, OutputItem const& rh) const;
82 
83  private:
84 
85  // Maps branch name to branch list index.
86  std::map<std::string, int> treeMap_;
87  };
88 
89  ~OutputItem() = default;
90 
91  explicit OutputItem(BranchDescription const* bd)
92  : branchDescription_{ bd }
93  {}
94 
95  BranchID branchID() const
96  {
97  return branchDescription_->branchID();
98  }
99 
100  std::string const& branchName() const
101  {
102  return branchDescription_->branchName();
103  }
104 
105  bool operator<(OutputItem const& rh) const
106  {
107  return *branchDescription_ < *rh.branchDescription_;
108  }
109 
110  };
111 
112  using OutputItemList = std::vector<OutputItem>;
113 
114  using OutputItemListArray = std::array<OutputItemList, NumBranchTypes>;
115 
116 public: // MEMBER FUNCTIONS
117 
118  explicit RootDAQOutFile(OutputModule*,
119  std::string const& fileName,
120  ClosingCriteria const& fileSwitchCriteria,
121  int const compressionLevel,
122  int64_t const saveMemoryObjectThreshold,
123  int64_t const treeMaxVirtualSize,
124  int const splitLevel,
125  int const basketSize,
126  DropMetaData dropMetaData,
127  bool dropMetaDataForDroppedData,
128  bool fastCloning);
129 
130  void writeTTrees();
131  void writeOne(EventPrincipal const&);
132  void writeSubRun(SubRunPrincipal const&);
133  void writeRun(RunPrincipal const&);
134  void writeFileFormatVersion();
135  void writeFileIndex();
136  void writeEventHistory();
137  void writeProcessConfigurationRegistry();
138  void writeProcessHistoryRegistry();
139  void writeParameterSetRegistry();
140  void writeProductDescriptionRegistry();
141  void writeParentageRegistry();
142  void writeBranchIDListRegistry();
143  void writeProductDependencies();
144  void writeFileCatalogMetadata(FileStatsCollector const& stats,
145  FileCatalogMetadata::collection_type const&,
146  FileCatalogMetadata::collection_type const&);
147  void writeResults(ResultsPrincipal & resp);
148  void setRunAuxiliaryRangeSetID(RangeSet const&);
149  void setSubRunAuxiliaryRangeSetID(RangeSet const&);
150  void finishEndFile();
151  void beginInputFile(FileBlock const&, bool fastClone);
152  void incrementInputFileNumber();
153  void respondToCloseInputFile(FileBlock const&);
154  bool requestsToCloseFile();
155  void setFileStatus(OutputFileStatus const ofs) { status_ = ofs; }
156 
157  void selectProducts(FileBlock const&);
158 
159  std::string const& currentFileName() const { return file_; }
160 
161  bool maxEventsPerFileReached(FileIndex::EntryNumber_t const maxEventsPerFile) const;
162  bool maxSizeReached(unsigned const maxFileSize) const;
163 
164 private: // MEMBER FUNCTIONS
165 
166  void createDatabaseTables();
167 
168  template <BranchType>
169  void fillBranches(Principal const&,
170  std::vector<ProductProvenance>*); // Defined in source.
171 
172  template <BranchType BT>
173  std::enable_if_t<!detail::RangeSetsSupported<BT>::value, art::EDProduct const*>
174  getProduct(OutputHandle const&,
175  RangeSet const& productRS,
176  std::string const& wrappedName); // Defined in source.
177 
178  template <BranchType BT>
179  std::enable_if_t<detail::RangeSetsSupported<BT>::value, art::EDProduct const*>
180  getProduct(OutputHandle const&,
181  RangeSet const& productRS,
182  std::string const& wrappedName); // Defined in source.
183 
184 private: // MEMBER DATA
185 
186  OutputModule const* om_;
187  std::string file_;
188  ClosingCriteria fileSwitchCriteria_;
189  OutputFileStatus status_{ OutputFileStatus::Closed };
190  int const compressionLevel_;
191  int64_t const saveMemoryObjectThreshold_;
192  int64_t const treeMaxVirtualSize_;
193  int const splitLevel_;
194  int const basketSize_;
195  DropMetaData dropMetaData_;
196  bool dropMetaDataForDroppedData_;
197  bool fastCloning_;
198  bool currentlyFastCloning_{ true };
199  std::unique_ptr<TFile> filePtr_;
200  FileIndex fileIndex_{};
201  FileProperties fp_{};
202  TTree* metaDataTree_{ nullptr };
203  TTree* fileIndexTree_{ nullptr };
204  TTree* parentageTree_{ nullptr };
205  TTree* eventHistoryTree_{ nullptr };
206  EventAuxiliary const* pEventAux_{ nullptr };
207  SubRunAuxiliary const* pSubRunAux_{ nullptr };
208  RunAuxiliary const* pRunAux_{ nullptr };
209  ResultsAuxiliary const *pResultsAux_{ nullptr };
210  ProductProvenances eventProductProvenanceVector_{};
211  ProductProvenances subRunProductProvenanceVector_{};
212  ProductProvenances runProductProvenanceVector_{};
213  ProductProvenances resultsProductProvenanceVector_{};
214  ProductProvenances* pEventProductProvenanceVector_{ &eventProductProvenanceVector_ };
215  ProductProvenances* pSubRunProductProvenanceVector_{ &subRunProductProvenanceVector_ };
216  ProductProvenances* pRunProductProvenanceVector_{ &runProductProvenanceVector_ };
217  ProductProvenances* pResultsProductProvenanceVector_{ &resultsProductProvenanceVector_ };
218  History const* pHistory_{ nullptr };
219  RootOutputTreePtrArray treePointers_;
220  bool dataTypeReported_{ false };
221  std::set<BranchID> branchesWithStoredHistory_{};
222  cet::sqlite::Connection rootFileDB_;
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_{ std::chrono::steady_clock::now() };
228 };
229 
230 // Local Variables:
231 // mode: c++
232 // End:
233 #endif /* artdaq_ArtModules_RootDAQOutFile_h */
An output module which allows specifying the output filename exactly. Used for testing (file -&gt; /dev/...
ClosureRequestMode
Possible modes for when to close a file