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/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"
45 class ResultsPrincipal;
52 class SubRunAuxiliary;
54 class ResultsAuxiliary;
68 using RootOutputTreePtrArray = std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
73 BranchDescription
const* branchDescription_{
nullptr };
74 mutable void const* product_{
nullptr };
80 explicit Sorter(TTree* tree);
86 std::map<std::string, int> treeMap_;
91 explicit OutputItem(BranchDescription
const* bd)
92 : branchDescription_{ bd }
95 BranchID branchID()
const
97 return branchDescription_->branchID();
100 std::string
const& branchName()
const
102 return branchDescription_->branchName();
105 bool operator<(OutputItem
const& rh)
const
107 return *branchDescription_ < *rh.branchDescription_;
112 using OutputItemList = std::vector<OutputItem>;
114 using OutputItemListArray = std::array<OutputItemList, NumBranchTypes>;
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,
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; }
157 void selectProducts(FileBlock
const&);
159 std::string
const& currentFileName()
const {
return file_; }
161 bool maxEventsPerFileReached(FileIndex::EntryNumber_t
const maxEventsPerFile)
const;
162 bool maxSizeReached(
unsigned const maxFileSize)
const;
166 void createDatabaseTables();
168 template <BranchType>
169 void fillBranches(Principal
const&,
170 std::vector<ProductProvenance>*);
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);
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);
186 OutputModule
const* om_;
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_;
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_{ {} };
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() };
An output module which allows specifying the output filename exactly. Used for testing (file -> /dev/...
ClosureRequestMode
Possible modes for when to close a file