gstreamer
Loading...
Searching...
No Matches
gRootTree.cc
Go to the documentation of this file.
1#include "gRootTree.h"
3
4using std::vector;
5
6
7// Return Header Tree with initialized leafs
8GRootTree::GRootTree([[maybe_unused]] const std::unique_ptr<GEventHeader>& gevent_header,
9 std::shared_ptr<GLogger>& logger) : log(logger) {
10 log->debug(CONSTRUCTOR, "GRootTree", "ROOT tree header");
11
12 // With AUTO FLUSH AND AUTOSAVE
13 root_tree = std::make_unique<TTree>(HEADERTREENAME, HEADERTREENAMEDESC);
14 root_tree->SetAutoFlush(20 * 1024 * 1024);
15 // write root data buffers to disk automatically once their in-memory size exceeds 20 MB
16 root_tree->SetAutoSave(50 * 1024 * 1024);
17 // save a snapshot of the entire tree (including metadata), useful for recovery after a crash
18
19 registerVariable("g4localEventNumber", gevent_header->getG4LocalEvn());
20 registerVariable("threadID", gevent_header->getThreadID());
21 registerVariable("timeStamp", gevent_header->getTimeStamp());
22}
23
24
25// Return True Info Tree with initialized leafs
26GRootTree::GRootTree(const std::string& detectorName,
27 const GTrueInfoData* gdata,
28 std::shared_ptr<GLogger>& logger) : log(logger) {
29 log->debug(CONSTRUCTOR, "GRootTree", "ROOT tree True Info");
30
31 // With AUTO FLUSH AND AUTOSAVE
32 root_tree = std::make_unique<TTree>(detectorName.c_str(), TRUEINFOTREENAMEDESC);
33 root_tree->SetAutoFlush(20 * 1024 * 1024);
34 // write root data buffers to disk automatically once their in-memory size exceeds 20 MB
35 root_tree->SetAutoSave(50 * 1024 * 1024);
36 // save a snapshot of the entire tree (including metadata), useful for recovery after a crash
37
38 for (auto& [varname, value] : gdata->getDoubleVariablesMap()) { registerVariable(varname, value); }
39 for (auto& [varname, value] : gdata->getStringVariablesMap()) { registerVariable(varname, value); }
40}
41
42
43// Return Digitized Data Tree with initialized leafs
44GRootTree::GRootTree(const std::string& detectorName,
45 const GDigitizedData* gdata,
46 std::shared_ptr<GLogger>& logger) : log(logger) {
47 log->debug(CONSTRUCTOR, "GRootTree", "ROOT tree Digitized Data");
48
49 // With AUTO FLUSH AND AUTOSAVE
50 root_tree = std::make_unique<TTree>(detectorName.c_str(), DIGITIZEDTREENAMEDESC);
51 root_tree->SetAutoFlush(20 * 1024 * 1024);
52 // write root data buffers to disk automatically once their in-memory size exceeds 20 MB
53 root_tree->SetAutoSave(50 * 1024 * 1024);
54 // save a snapshot of the entire tree (including metadata), useful for recovery after a crash
55
56 for (auto& [varname, value] : gdata->getIntObservablesMap(0)) { registerVariable(varname, value); }
57 for (auto& [varname, value] : gdata->getDblObservablesMap(0)) { registerVariable(varname, value); }
58}
59
60// fill the header tree
61bool GRootTree::fillTree(const std::unique_ptr<GEventHeader>& gevent_header) {
62 log->info(0, "Filling header tree for local event n. ", gevent_header->getG4LocalEvn(), " threadID ",
63 gevent_header->getThreadID());
64
65 // clearing previous header info
66 intVarsMap["g4localEventNumber"].clear();
67 intVarsMap["threadID"].clear();
68 stringVarsMap["timeStamp"].clear();
69
70 intVarsMap["g4localEventNumber"].emplace_back(gevent_header->getG4LocalEvn());
71 intVarsMap["threadID"].emplace_back(gevent_header->getThreadID());
72 stringVarsMap["timeStamp"].emplace_back(gevent_header->getTimeStamp());
73
74 root_tree->Fill();
75
76 return true;
77}
78
79// fill the True Info Tree
80bool GRootTree::fillTree(const vector<const GTrueInfoData*>& trueInfoData) {
81 // clearing previous true info
82 for (auto& [varname, values] : doubleVarsMap) { values.clear(); }
83 for (auto& [varname, values] : stringVarsMap) { values.clear(); }
84
85
86 for (auto& dataHits : trueInfoData) {
87 // double true info
88 for (auto& [varname, value] : dataHits->getDoubleVariablesMap()) { doubleVarsMap[varname].push_back(value); }
89
90 // string true info
91 for (auto& [varname, value] : dataHits->getStringVariablesMap()) { stringVarsMap[varname].push_back(value); }
92 }
93
94 root_tree->Fill();
95
96 return true;
97}
98
99// fill the Digitized Data Tree
100bool GRootTree::fillTree(const vector<const GDigitizedData*>& digitizedData) {
101 // clearing previous digitized data
102 for (auto& [varname, values] : intVarsMap) { values.clear(); }
103 for (auto& [varname, values] : doubleVarsMap) { values.clear(); }
104
105 for (auto& dataHits : digitizedData) {
106 // int digitized data
107 for (auto& [varname, value] : dataHits->getIntObservablesMap(0)) { intVarsMap[varname].push_back(value); }
108
109 // double digitized data
110 for (auto& [varname, value] : dataHits->getDblObservablesMap(0)) { doubleVarsMap[varname].push_back(value); }
111 }
112 root_tree->Fill();
113
114 return true;
115}
116
117
118// instantiate new map entry with its proper type vector and assign it to the root tree branch
119// the second argument is needed to select proper overloaded function
120
121void GRootTree::registerVariable(const std::string& varname, [[maybe_unused]] int value) {
122 if (intVarsMap.find(varname) == intVarsMap.end()) { root_tree->Branch(varname.c_str(), &intVarsMap[varname]); }
123 else {
124 log->error(ERR_GSTREAMERVARIABLEEXISTS, "variable < ", varname,
125 "< already exist in the int variable map of tree ", root_tree->GetName());
126 }
127}
128
129void GRootTree::registerVariable(const std::string& varname, [[maybe_unused]] double value) {
130 if (doubleVarsMap.find(varname) == doubleVarsMap.end()) {
131 root_tree->Branch(varname.c_str(), &doubleVarsMap[varname]);
132 }
133 else {
134 log->error(ERR_GSTREAMERVARIABLEEXISTS, "variable < ", varname,
135 "< already exist in the int variable map of tree ", root_tree->GetName());
136 }
137}
138
139void GRootTree::registerVariable(const std::string& varname, [[maybe_unused]] const std::string& value) {
140 if (stringVarsMap.find(varname) == stringVarsMap.end()) {
141 root_tree->Branch(varname.c_str(), &stringVarsMap[varname]);
142 }
143 else {
144 log->error(ERR_GSTREAMERVARIABLEEXISTS, "variable < ", varname,
145 "< already exist in the int variable map of tree ", root_tree->GetName());
146 }
147}
std::map< std::string, int > getIntObservablesMap(int which) const
std::map< std::string, double > getDblObservablesMap(int which) const
void debug(debug_type type, Args &&... args) const
void info(int level, Args &&... args) const
void error(int exit_code, Args &&... args) const
GRootTree(const std::unique_ptr< GEventHeader > &gevent_header, std::shared_ptr< GLogger > &log)
Construct a header tree and register header branches.
Definition gRootTree.cc:8
bool fillTree(const std::unique_ptr< GEventHeader > &gevent_header)
Fill the header tree for one event.
Definition gRootTree.cc:61
std::map< std::string, double > getDoubleVariablesMap() const
std::map< std::string, std::string > getStringVariablesMap() const
ROOT tree adapter used by the ROOT gstreamer plugin.
#define DIGITIZEDTREENAMEDESC
Definition gRootTree.h:23
#define TRUEINFOTREENAMEDESC
Definition gRootTree.h:22
#define HEADERTREENAMEDESC
Definition gRootTree.h:21
#define HEADERTREENAME
Definition gRootTree.h:15
CONSTRUCTOR
Shared constants and error codes for the gstreamer module.
#define ERR_GSTREAMERVARIABLEEXISTS
Attempt to register the same output variable twice (ROOT tree branch conflict).