00001 #ifndef artdaq_ArtModules_RootDAQOutFile_h
00002 #define artdaq_ArtModules_RootDAQOutFile_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "art/Framework/Core/Frameworkfwd.h"
00014 #include "art/Framework/Core/OutputModule.h"
00015 #include "art/Framework/IO/FileStatsCollector.h"
00016 #include "art/Framework/IO/Root/DropMetaData.h"
00017 #include "art/Framework/IO/Root/RootOutputClosingCriteria.h"
00018 #include "art/Framework/IO/Root/RootOutputTree.h"
00019 #include "artdaq/ArtModules/RootDAQOutput/detail/DummyProductCache.h"
00020 #include "art/Framework/Principal/RangeSetsSupported.h"
00021 # include "art/Persistency/Provenance/Selections.h"
00022 # include "boost/filesystem.hpp"
00023 # include "cetlib/sqlite/Connection.h"
00024 #include "canvas/Persistency/Provenance/BranchDescription.h"
00025 #include "canvas/Persistency/Provenance/BranchID.h"
00026 #include "canvas/Persistency/Provenance/BranchType.h"
00027 #include "canvas/Persistency/Provenance/FileIndex.h"
00028 #include "canvas/Persistency/Provenance/ParameterSetBlob.h"
00029 #include "canvas/Persistency/Provenance/ParameterSetMap.h"
00030 #include "canvas/Persistency/Provenance/ProductProvenance.h"
00031 #include "art/Persistency/RootDB/SQLite3Wrapper.h"
00032
00033 #include <array>
00034 #include <map>
00035 #include <memory>
00036 #include <string>
00037 #include <vector>
00038
00039 #include "TROOT.h"
00040
00041 class TFile;
00042 class TTree;
00043
00044 namespace art {
00045 class ResultsPrincipal;
00046 class RootDAQOutFile;
00047 class RootOutput;
00048 class RootOutputTree;
00049 class History;
00050 class FileBlock;
00051 class EventAuxiliary;
00052 class SubRunAuxiliary;
00053 class RunAuxiliary;
00054 class ResultsAuxiliary;
00055 }
00056
00060 class art::RootDAQOutFile
00061 {
00062 public:
00063
00067 enum class ClosureRequestMode { MaxEvents, MaxSize, Unset };
00068 using RootOutputTreePtrArray = std::array<std::unique_ptr<RootOutputTree>, NumBranchTypes>;
00069
00070 struct OutputItem
00071 {
00072
00073 BranchDescription const* branchDescription_{ nullptr };
00074 mutable void const* product_{ nullptr };
00075
00076 class Sorter
00077 {
00078 public:
00079
00080 explicit Sorter(TTree* tree);
00081 bool operator()(OutputItem const& lh, OutputItem const& rh) const;
00082
00083 private:
00084
00085
00086 std::map<std::string, int> treeMap_;
00087 };
00088
00089 ~OutputItem() = default;
00090
00091 explicit OutputItem(BranchDescription const* bd)
00092 : branchDescription_{ bd }
00093 {}
00094
00095 BranchID branchID() const
00096 {
00097 return branchDescription_->branchID();
00098 }
00099
00100 std::string const& branchName() const
00101 {
00102 return branchDescription_->branchName();
00103 }
00104
00105 bool operator<(OutputItem const& rh) const
00106 {
00107 return *branchDescription_ < *rh.branchDescription_;
00108 }
00109
00110 };
00111
00112 using OutputItemList = std::vector<OutputItem>;
00113
00114 using OutputItemListArray = std::array<OutputItemList, NumBranchTypes>;
00115
00116 public:
00117
00118 explicit RootDAQOutFile(OutputModule*,
00119 std::string const& fileName,
00120 ClosingCriteria const& fileSwitchCriteria,
00121 int const compressionLevel,
00122 int64_t const saveMemoryObjectThreshold,
00123 int64_t const treeMaxVirtualSize,
00124 int const splitLevel,
00125 int const basketSize,
00126 DropMetaData dropMetaData,
00127 bool dropMetaDataForDroppedData,
00128 bool fastCloning);
00129
00130 void writeTTrees();
00131 void writeOne(EventPrincipal const&);
00132 void writeSubRun(SubRunPrincipal const&);
00133 void writeRun(RunPrincipal const&);
00134 void writeFileFormatVersion();
00135 void writeFileIndex();
00136 void writeEventHistory();
00137 void writeProcessConfigurationRegistry();
00138 void writeProcessHistoryRegistry();
00139 void writeParameterSetRegistry();
00140 void writeProductDescriptionRegistry();
00141 void writeParentageRegistry();
00142 void writeBranchIDListRegistry();
00143 void writeProductDependencies();
00144 void writeFileCatalogMetadata(FileStatsCollector const& stats,
00145 FileCatalogMetadata::collection_type const&,
00146 FileCatalogMetadata::collection_type const&);
00147 void writeResults(ResultsPrincipal & resp);
00148 void setRunAuxiliaryRangeSetID(RangeSet const&);
00149 void setSubRunAuxiliaryRangeSetID(RangeSet const&);
00150 void finishEndFile();
00151 void beginInputFile(FileBlock const&, bool fastClone);
00152 void incrementInputFileNumber();
00153 void respondToCloseInputFile(FileBlock const&);
00154 bool requestsToCloseFile();
00155 void setFileStatus(OutputFileStatus const ofs) { status_ = ofs; }
00156
00157 void selectProducts(FileBlock const&);
00158
00159 std::string const& currentFileName() const { return file_; }
00160
00161 bool maxEventsPerFileReached(FileIndex::EntryNumber_t const maxEventsPerFile) const;
00162 bool maxSizeReached(unsigned const maxFileSize) const;
00163
00164 private:
00165
00166 void createDatabaseTables();
00167
00168 template <BranchType>
00169 void fillBranches(Principal const&,
00170 std::vector<ProductProvenance>*);
00171
00172 template <BranchType BT>
00173 std::enable_if_t<!detail::RangeSetsSupported<BT>::value, art::EDProduct const*>
00174 getProduct(OutputHandle const&,
00175 RangeSet const& productRS,
00176 std::string const& wrappedName);
00177
00178 template <BranchType BT>
00179 std::enable_if_t<detail::RangeSetsSupported<BT>::value, art::EDProduct const*>
00180 getProduct(OutputHandle const&,
00181 RangeSet const& productRS,
00182 std::string const& wrappedName);
00183
00184 private:
00185
00186 OutputModule const* om_;
00187 std::string file_;
00188 ClosingCriteria fileSwitchCriteria_;
00189 OutputFileStatus status_{ OutputFileStatus::Closed };
00190 int const compressionLevel_;
00191 int64_t const saveMemoryObjectThreshold_;
00192 int64_t const treeMaxVirtualSize_;
00193 int const splitLevel_;
00194 int const basketSize_;
00195 DropMetaData dropMetaData_;
00196 bool dropMetaDataForDroppedData_;
00197 bool fastCloning_;
00198 bool currentlyFastCloning_{ true };
00199 std::unique_ptr<TFile> filePtr_;
00200 FileIndex fileIndex_{};
00201 FileProperties fp_{};
00202 TTree* metaDataTree_{ nullptr };
00203 TTree* fileIndexTree_{ nullptr };
00204 TTree* parentageTree_{ nullptr };
00205 TTree* eventHistoryTree_{ nullptr };
00206 EventAuxiliary const* pEventAux_{ nullptr };
00207 SubRunAuxiliary const* pSubRunAux_{ nullptr };
00208 RunAuxiliary const* pRunAux_{ nullptr };
00209 ResultsAuxiliary const *pResultsAux_{ nullptr };
00210 ProductProvenances eventProductProvenanceVector_{};
00211 ProductProvenances subRunProductProvenanceVector_{};
00212 ProductProvenances runProductProvenanceVector_{};
00213 ProductProvenances resultsProductProvenanceVector_{};
00214 ProductProvenances* pEventProductProvenanceVector_{ &eventProductProvenanceVector_ };
00215 ProductProvenances* pSubRunProductProvenanceVector_{ &subRunProductProvenanceVector_ };
00216 ProductProvenances* pRunProductProvenanceVector_{ &runProductProvenanceVector_ };
00217 ProductProvenances* pResultsProductProvenanceVector_{ &resultsProductProvenanceVector_ };
00218 History const* pHistory_{ nullptr };
00219 RootOutputTreePtrArray treePointers_;
00220 bool dataTypeReported_{ false };
00221 std::set<BranchID> branchesWithStoredHistory_{};
00222 cet::sqlite::Connection rootFileDB_;
00223 OutputItemListArray selectedOutputItemList_{ {} };
00224 detail::DummyProductCache dummyProductCache_{};
00225 unsigned subRunRSID_{ -1u };
00226 unsigned runRSID_{ -1u };
00227 std::chrono::steady_clock::time_point beginTime_{ std::chrono::steady_clock::now() };
00228 };
00229
00230
00231
00232
00233 #endif