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;
52 enum class ClosureRequestMode { MaxEvents, MaxSize, Unset };
53 using RootOutputTreePtrArray =
54 std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
58 BranchDescription
const* branchDescription_{
nullptr};
59 mutable void const* product_{
nullptr};
61 explicit OutputItem(BranchDescription
const* pd) : branchDescription_{pd} {}
66 return branchDescription_->branchName();
72 return *branchDescription_ < *rh.branchDescription_;
76 using OutputItemList = std::set<OutputItem>;
77 using OutputItemListArray = std::array<OutputItemList, NumBranchTypes>;
81 std::string
const& fileName,
82 ClosingCriteria
const& fileSwitchCriteria,
83 int const compressionLevel,
86 int64_t
const saveMemoryObjectThreshold,
87 int64_t
const treeMaxVirtualSize,
90 DropMetaData dropMetaData,
91 bool dropMetaDataForDroppedData,
92 bool fastCloningRequested,
93 bool const parentageEnabled,
94 bool const rangesEnabled,
95 bool const dbEnabled);
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();
123 setFileStatus(OutputFileStatus
const ofs)
128 void selectProducts();
131 currentFileName()
const
136 bool maxEventsPerFileReached(
137 FileIndex::EntryNumber_t
const maxEventsPerFile)
const;
138 bool maxSizeReached(
unsigned const maxFileSize)
const;
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&);
147 void createDatabaseTables();
149 template <BranchType>
150 void fillBranches(Principal
const&,
151 std::vector<ProductProvenance>*);
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);
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);
165 void insertParents(std::set<ProductProvenance>&,
167 std::vector<ProductID>
const&);
170 OutputModule
const* om_;
172 ClosingCriteria fileSwitchCriteria_;
173 OutputFileStatus status_{OutputFileStatus::Closed};
174 int const compressionLevel_;
175 unsigned freePercent_;
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_;
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_;
216 OutputItemListArray selectedOutputItemList_{{}};
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};