1 #ifndef art_Framework_IO_Root_RootDAQOutFile_h
2 #define art_Framework_IO_Root_RootDAQOutFile_h
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"
39 class ResultsPrincipal;
44 class SubRunAuxiliary;
46 class ResultsAuxiliary;
53 enum class ClosureRequestMode
59 using RootOutputTreePtrArray =
60 std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
64 BranchDescription
const* branchDescription_{
nullptr};
65 mutable void const* product_{
nullptr};
67 explicit OutputItem(BranchDescription
const* pd)
68 : branchDescription_{pd} {}
73 return branchDescription_->branchName();
79 return *branchDescription_ < *rh.branchDescription_;
83 using OutputItemList = std::set<OutputItem>;
84 using OutputItemListArray = std::array<OutputItemList, NumBranchTypes>;
88 std::string
const& fileName,
89 ClosingCriteria
const& fileSwitchCriteria,
90 int const compressionLevel,
93 int64_t
const saveMemoryObjectThreshold,
94 int64_t
const treeMaxVirtualSize,
97 DropMetaData dropMetaData,
98 bool dropMetaDataForDroppedData,
99 bool fastCloningRequested,
100 bool const parentageEnabled,
101 bool const rangesEnabled,
102 bool const dbEnabled);
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();
130 setFileStatus(OutputFileStatus
const ofs)
135 void selectProducts();
138 currentFileName()
const
143 bool maxEventsPerFileReached(
144 FileIndex::EntryNumber_t
const maxEventsPerFile)
const;
145 bool maxSizeReached(
unsigned const maxFileSize)
const;
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&);
154 void createDatabaseTables();
157 void fillBranches(Principal
const&,
158 std::vector<ProductProvenance>*);
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);
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);
172 void insertParents(std::set<ProductProvenance>&,
174 std::vector<ProductID>
const&);
177 OutputModule
const* om_;
179 ClosingCriteria fileSwitchCriteria_;
180 OutputFileStatus status_{OutputFileStatus::Closed};
181 int const compressionLevel_;
182 unsigned freePercent_;
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_;
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_;
223 OutputItemListArray selectedOutputItemList_{{}};
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};