1 #ifndef art_root_io_RootDAQOutFile_h
2 #define art_root_io_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/Principal/RangeSetsSupported.h"
10 #include "art/Persistency/Provenance/Selections.h"
11 #include "art_root_io/DropMetaData.h"
12 #include "art_root_io/RootOutputTree.h"
13 #if ART_HEX_VERSION < 0x30800
14 #include "art_root_io/detail/DummyProductCache.h"
15 #define DummyProductCache detail::DummyProductCache
17 #include "art_root_io/DummyProductCache.h"
19 #include "boost/filesystem.hpp"
20 #include "canvas/Persistency/Provenance/BranchDescription.h"
21 #include "canvas/Persistency/Provenance/BranchType.h"
22 #include "canvas/Persistency/Provenance/FileIndex.h"
23 #include "canvas/Persistency/Provenance/ParameterSetBlob.h"
24 #include "canvas/Persistency/Provenance/ParameterSetMap.h"
25 #include "canvas/Persistency/Provenance/ProductID.h"
26 #include "canvas/Persistency/Provenance/ProductProvenance.h"
27 #include "cetlib/sqlite/Connection.h"
28 #include "hep_concurrency/RecursiveMutex.h"
43 class ResultsPrincipal;
48 class SubRunAuxiliary;
50 class ResultsAuxiliary;
55 enum class ClosureRequestMode
61 using RootOutputTreePtrArray =
62 std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
70 std::string
const& branchName()
const;
74 BranchDescription
const branchDescription_;
75 mutable void const* product_;
85 static bool shouldFastClone(
bool const fastCloningSet,
86 bool const fastCloning,
87 bool const wantAllEvents,
88 ClosingCriteria
const& cc);
93 std::string
const& fileName,
94 ClosingCriteria
const& fileSwitchCriteria,
95 int const compressionLevel,
98 int64_t
const saveMemoryObjectThreshold,
99 int64_t
const treeMaxVirtualSize,
100 int const splitLevel,
101 int const basketSize,
102 DropMetaData dropMetaData,
103 bool dropMetaDataForDroppedData,
104 bool fastCloningRequested);
111 void createDatabaseTables();
113 void writeOne(EventPrincipal
const&);
114 void writeSubRun(SubRunPrincipal
const&);
115 void writeRun(RunPrincipal
const&);
116 void writeFileFormatVersion();
117 void writeFileIndex();
118 void writeEventHistory();
119 void writeProcessConfigurationRegistry();
120 void writeProcessHistoryRegistry();
121 void writeParameterSetRegistry();
122 void writeProductDescriptionRegistry();
123 void writeParentageRegistry();
124 void writeProductDependencies();
125 void writeFileCatalogMetadata(FileStatsCollector
const& stats,
126 FileCatalogMetadata::collection_type
const&,
127 FileCatalogMetadata::collection_type
const&);
128 void writeResults(ResultsPrincipal& resp);
129 void setRunAuxiliaryRangeSetID(RangeSet
const&);
130 void setSubRunAuxiliaryRangeSetID(RangeSet
const&);
131 void beginInputFile(RootFileBlock
const*,
bool fastClone);
132 void incrementInputFileNumber();
133 void respondToCloseInputFile(FileBlock
const&);
134 bool requestsToCloseFile();
135 void setFileStatus(OutputFileStatus
const ofs);
136 void selectProducts();
137 std::string
const& currentFileName()
const;
138 bool maxEventsPerFileReached(
139 FileIndex::EntryNumber_t
const maxEventsPerFile)
const;
140 bool maxSizeReached(
unsigned const maxFileSize)
const;
144 void fillBranches(Principal
const&, std::vector<ProductProvenance>*);
145 template<BranchType BT>
146 EDProduct
const* getProduct(OutputHandle
const&,
147 RangeSet
const& productRS,
148 std::string
const& wrappedName);
151 mutable hep::concurrency::RecursiveMutex mutex_;
152 OutputModule
const* om_;
154 ClosingCriteria fileSwitchCriteria_;
155 OutputFileStatus status_;
156 int const compressionLevel_;
157 unsigned freePercent_;
159 int64_t
const saveMemoryObjectThreshold_;
160 int64_t
const treeMaxVirtualSize_;
161 int const splitLevel_;
162 int const basketSize_;
163 DropMetaData dropMetaData_;
164 bool dropMetaDataForDroppedData_;
165 bool fastCloningEnabledAtConstruction_;
167 std::unique_ptr<TFile> filePtr_;
168 FileIndex fileIndex_;
170 TTree* metaDataTree_;
171 TTree* fileIndexTree_;
172 TTree* parentageTree_;
173 TTree* eventHistoryTree_;
174 EventAuxiliary
const* pEventAux_;
175 SubRunAuxiliary
const* pSubRunAux_;
176 RunAuxiliary
const* pRunAux_;
177 ResultsAuxiliary
const* pResultsAux_;
178 ProductProvenances eventProductProvenanceVector_;
179 ProductProvenances subRunProductProvenanceVector_;
180 ProductProvenances runProductProvenanceVector_;
181 ProductProvenances resultsProductProvenanceVector_;
182 ProductProvenances* pEventProductProvenanceVector_;
183 ProductProvenances* pSubRunProductProvenanceVector_;
184 ProductProvenances* pRunProductProvenanceVector_;
185 ProductProvenances* pResultsProductProvenanceVector_;
186 History
const* pHistory_;
187 RootOutputTreePtrArray treePointers_;
188 bool dataTypeReported_;
189 std::array<ProductDescriptionsByID, NumBranchTypes> descriptionsToPersist_;
190 std::unique_ptr<cet::sqlite::Connection> rootFileDB_;
191 std::array<std::set<OutputItem>, NumBranchTypes> selectedOutputItemList_;
192 DummyProductCache dummyProductCache_;
193 unsigned subRunRSID_;
195 std::chrono::steady_clock::time_point beginTime_;