1 #ifndef artdaq_ArtModules_RootDAQOutFile_h
2 #define artdaq_ArtModules_RootDAQOutFile_h
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"
26 # include "art/Persistency/Provenance/Selections.h"
27 # include "boost/filesystem.hpp"
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"
50 class ResultsPrincipal;
57 class SubRunAuxiliary;
59 class ResultsAuxiliary;
65 enum class ClosureRequestMode { MaxEvents, MaxSize, Unset };
66 using RootOutputTreePtrArray = std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
70 BranchDescription
const* branchDescription_ {
nullptr};
71 mutable void const* product_ {
nullptr};
76 explicit Sorter(TTree* tree);
82 std::map<std::string, int> treeMap_;
87 explicit OutputItem(BranchDescription
const* bd)
88 : branchDescription_{bd}
91 BranchID branchID()
const
93 return branchDescription_->branchID();
96 std::string
const& branchName()
const
98 return branchDescription_->branchName();
101 bool operator<(OutputItem
const& rh)
const
103 return *branchDescription_ < *rh.branchDescription_;
108 using OutputItemList = std::vector<OutputItem>;
110 using OutputItemListArray = std::array<OutputItemList, NumBranchTypes>;
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,
126 #if ART_HEX_VERSION >= 0x20703
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; }
155 void selectProducts(FileBlock
const&);
157 std::string
const& currentFileName()
const {
return file_; }
159 bool maxEventsPerFileReached(FileIndex::EntryNumber_t
const maxEventsPerFile)
const;
160 bool maxSizeReached(
unsigned const maxFileSize)
const;
164 void createDatabaseTables();
166 template <BranchType>
167 void fillBranches(Principal
const&,
168 std::vector<ProductProvenance>*);
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);
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);
184 OutputModule
const* om_;
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_;
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_;
223 SQLite3Wrapper rootFileDB_;
225 OutputItemListArray selectedOutputItemList_ {{}};
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()};