1 #ifndef art_root_io_RootDAQOutFile_h
2 #define art_root_io_RootDAQOutFile_h
5 #include "art/Framework/Core/fwd.h"
6 #include "art/Framework/IO/ClosingCriteria.h"
7 #include "art/Framework/Principal/EventPrincipal.h"
8 #include "art/Framework/Principal/fwd.h"
9 #include "art/Framework/Services/System/FileCatalogMetadata.h"
10 #include "art_root_io/DropMetaData.h"
11 #include "art_root_io/DummyProductCache.h"
12 #include "art_root_io/FastCloningEnabled.h"
13 #include "art_root_io/RootOutputTree.h"
14 #include "canvas/Persistency/Provenance/BranchDescription.h"
15 #include "canvas/Persistency/Provenance/BranchType.h"
16 #include "canvas/Persistency/Provenance/FileIndex.h"
17 #include "canvas/Persistency/Provenance/ProductID.h"
18 #include "canvas/Persistency/Provenance/ProductProvenance.h"
19 #include "canvas/Persistency/Provenance/fwd.h"
20 #include "cetlib/sqlite/Connection.h"
34 class FileStatsCollector;
40 explicit OutputItem(BranchDescription
const& bd);
42 BranchDescription
const branchDescription;
43 mutable void const* product;
49 enum class ClosureRequestMode
55 using RootOutputTreePtrArray =
56 std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
60 std::string
const& fileName,
61 ClosingCriteria
const& fileSwitchCriteria,
65 int64_t saveMemoryObjectThreshold,
66 int64_t treeMaxVirtualSize,
69 DropMetaData dropMetaData,
70 bool dropMetaDataForDroppedData);
76 void createDatabaseTables();
78 void writeOne(EventPrincipal
const&);
79 void writeSubRun(SubRunPrincipal
const&);
80 void writeRun(RunPrincipal
const&);
81 void writeFileFormatVersion();
82 void writeFileIndex();
83 void writeProcessConfigurationRegistry();
84 void writeProcessHistoryRegistry();
85 void writeParameterSetRegistry();
86 void writeProductDescriptionRegistry();
87 void writeParentageRegistry();
88 void writeProductDependencies();
89 void writeFileCatalogMetadata(FileStatsCollector
const& stats,
90 FileCatalogMetadata::collection_type
const&,
91 FileCatalogMetadata::collection_type
const&);
92 void writeResults(ResultsPrincipal& resp);
93 void setRunAuxiliaryRangeSetID(RangeSet
const&);
94 void setSubRunAuxiliaryRangeSetID(RangeSet
const&);
95 void beginInputFile(RootFileBlock
const*,
96 FastCloningEnabled fastCloningEnabled);
97 void incrementInputFileNumber();
98 void respondToCloseInputFile(FileBlock
const&);
99 bool requestsToCloseFile();
100 void setFileStatus(OutputFileStatus ofs);
101 void selectProducts();
102 std::string
const& currentFileName()
const;
103 bool maxEventsPerFileReached(
104 FileIndex::EntryNumber_t maxEventsPerFile)
const;
105 bool maxSizeReached(
unsigned maxFileSize)
const;
109 void fillBranches(Principal
const&, std::vector<ProductProvenance>*);
110 template<BranchType BT>
111 EDProduct
const* getProduct(OutputHandle
const&,
112 RangeSet
const& productRS,
113 std::string
const& wrappedName);
115 mutable std::recursive_mutex mutex_{};
116 OutputModule
const* om_;
118 ClosingCriteria fileSwitchCriteria_;
119 OutputFileStatus status_{OutputFileStatus::Closed};
120 int const compressionLevel_;
121 unsigned freePercent_;
123 int64_t
const saveMemoryObjectThreshold_;
124 int64_t
const treeMaxVirtualSize_;
125 int const splitLevel_;
126 int const basketSize_;
127 DropMetaData dropMetaData_;
128 bool dropMetaDataForDroppedData_;
129 bool wasFastCloned_{
false};
130 std::unique_ptr<TFile> filePtr_;
131 FileIndex fileIndex_;
133 TTree* metaDataTree_;
134 TTree* fileIndexTree_;
135 TTree* parentageTree_;
136 EventAuxiliary
const* pEventAux_{
nullptr};
137 SubRunAuxiliary
const* pSubRunAux_{
nullptr};
138 RunAuxiliary
const* pRunAux_{
nullptr};
139 ResultsAuxiliary
const* pResultsAux_{
nullptr};
140 ProductProvenances eventProductProvenanceVector_{};
141 ProductProvenances subRunProductProvenanceVector_{};
142 ProductProvenances runProductProvenanceVector_{};
143 ProductProvenances resultsProductProvenanceVector_{};
144 ProductProvenances* pEventProductProvenanceVector_{
145 &eventProductProvenanceVector_};
146 ProductProvenances* pSubRunProductProvenanceVector_{
147 &subRunProductProvenanceVector_};
148 ProductProvenances* pRunProductProvenanceVector_{
149 &runProductProvenanceVector_};
150 ProductProvenances* pResultsProductProvenanceVector_{
151 &resultsProductProvenanceVector_};
152 RootOutputTreePtrArray treePointers_;
153 bool dataTypeReported_{
false};
154 std::array<ProductDescriptionsByID, NumBranchTypes> descriptionsToPersist_{
156 std::unique_ptr<cet::sqlite::Connection> rootFileDB_;
157 std::array<std::map<ProductID, OutputItem>, NumBranchTypes>
158 selectedOutputItemList_{{}};
159 DummyProductCache dummyProductCache_;
160 unsigned subRunRSID_{-1u};
161 unsigned runRSID_{-1u};
162 std::chrono::steady_clock::time_point beginTime_;