11 std::shared_ptr<GLogger>& logger) : log(logger) {
12 log->debug(
CONSTRUCTOR,
"GRootTreeROOT tree header");
18 root_tree->SetAutoFlush(20 * 1024 * 1024);
21 root_tree->SetAutoSave(50 * 1024 * 1024);
23 registerVariable(
"g4localEventNumber", gevent_header->getG4LocalEvn());
24 registerVariable(
"threadID", gevent_header->getThreadID());
25 registerVariable(
"timeStamp", gevent_header->getTimeStamp());
31 2,
"Filling header tree for local event n. %1 threadID %2", gevent_header->getG4LocalEvn(),
32 gevent_header->getThreadID());
35 intVarsMap[
"g4localEventNumber"].clear();
36 intVarsMap[
"threadID"].clear();
37 stringVarsMap[
"timeStamp"].clear();
39 intVarsMap[
"g4localEventNumber"].emplace_back(gevent_header->getG4LocalEvn());
40 intVarsMap[
"threadID"].emplace_back(gevent_header->getThreadID());
41 stringVarsMap[
"timeStamp"].emplace_back(gevent_header->getTimeStamp());
50 log->info(2,
"Filling header tree for run n. %1",
grun_header->getRunID());
53 intVarsMap[
"runID"].clear();
54 intVarsMap[
"runID"].emplace_back(
grun_header->getRunID());
62 std::shared_ptr<GLogger>& logger) : log(logger) {
63 log->debug(
CONSTRUCTOR,
"GRootTreeROOT tree header");
67 root_tree->SetAutoFlush(20 * 1024 * 1024);
68 root_tree->SetAutoSave(50 * 1024 * 1024);
79 std::shared_ptr<GLogger>& logger) : log(logger) {
80 log->debug(
CONSTRUCTOR,
"GRootTreeROOT tree True Info");
83 root_tree->SetAutoFlush(20 * 1024 * 1024);
84 root_tree->SetAutoSave(50 * 1024 * 1024);
88 for (
auto& [varname, value] : identityMap) { registerVariable(varname, value); }
96 std::shared_ptr<GLogger>& logger) : log(logger) {
97 log->debug(
CONSTRUCTOR,
"GRootTreeROOT tree Generated Particles");
100 root_tree->SetAutoFlush(20 * 1024 * 1024);
101 root_tree->SetAutoSave(50 * 1024 * 1024);
103 registerVariable(
"pid", 0);
104 registerVariable(
"type", 0);
105 registerVariable(
"multiplicity", 0);
106 registerVariable(
"p", 0.0);
107 registerVariable(
"theta", 0.0);
108 registerVariable(
"phi", 0.0);
109 registerVariable(
"vx", 0.0);
110 registerVariable(
"vy", 0.0);
111 registerVariable(
"vz", 0.0);
112 registerVariable(
"name", std::string());
116 std::shared_ptr<GLogger>& logger) : log(logger) {
117 log->debug(
CONSTRUCTOR,
"GRootTreeROOT tree Ancestors");
119 root_tree->SetAutoFlush(20 * 1024 * 1024);
120 root_tree->SetAutoSave(50 * 1024 * 1024);
122 registerVariable(
"pid", 0);
123 registerVariable(
"tid", 0);
124 registerVariable(
"mtid", 0);
125 registerVariable(
"trackE", 0.0);
126 registerVariable(
"px", 0.0);
127 registerVariable(
"py", 0.0);
128 registerVariable(
"pz", 0.0);
129 registerVariable(
"vx", 0.0);
130 registerVariable(
"vy", 0.0);
131 registerVariable(
"vz", 0.0);
140 std::shared_ptr<GLogger>& logger) : log(logger) {
141 log->debug(
CONSTRUCTOR,
"GRootTreeROOT tree Digitized Data");
144 root_tree->SetAutoFlush(20 * 1024 * 1024);
145 root_tree->SetAutoSave(50 * 1024 * 1024);
149 for (
auto& [varname, value] : identityMap) { registerVariable(varname, value,
true); }
152 registerVariable(varname, value);
154 for (
auto& [varname, value] : gdata->
getDblObservablesMap(0)) { registerVariable(varname, value); }
161 for (
auto& [varname, values] : intVarsMap) { values.clear(); }
162 for (
auto& [varname, values] : doubleVarsMap) { values.clear(); }
163 for (
auto& [varname, values] : stringVarsMap) { values.clear(); }
166 for (
auto& dataHits : trueInfoData) {
169 for (
auto& [varname, value] : identityMap) {
170 intVarsMap[varname].push_back(value);
173 for (
auto& [varname, value] : dataHits->getDoubleVariablesMap()) { doubleVarsMap[varname].push_back(value); }
174 for (
auto& [varname, value] : dataHits->getStringVariablesMap()) { stringVarsMap[varname].push_back(value); }
185 for (
auto& [varname, values] : intVarsMap) { values.clear(); }
186 for (
auto& [varname, values] : doubleVarsMap) { values.clear(); }
187 for (
auto& [varname, values] : stringVarsMap) { values.clear(); }
190 for (
auto& dataHits : digitizedData) {
193 for (
auto& [varname, value] : identityMap) {
194 intVarsMap[varname].push_back(value);
198 for (
auto& [varname, value] : dataHits->getIntObservablesMap(0)) { intVarsMap[varname].push_back(value); }
199 for (
auto& [varname, value] : dataHits->getDblObservablesMap(0)) { doubleVarsMap[varname].push_back(value); }
207 for (
auto& [varname, values] : intVarsMap) { values.clear(); }
208 for (
auto& [varname, values] : doubleVarsMap) { values.clear(); }
209 for (
auto& [varname, values] : stringVarsMap) { values.clear(); }
211 for (
const auto& particle : particles) {
212 intVarsMap[
"pid"].push_back(particle.pid);
213 intVarsMap[
"type"].push_back(particle.type);
214 intVarsMap[
"multiplicity"].push_back(particle.multiplicity);
215 doubleVarsMap[
"p"].push_back(particle.p);
216 doubleVarsMap[
"theta"].push_back(particle.theta);
217 doubleVarsMap[
"phi"].push_back(particle.phi);
218 doubleVarsMap[
"vx"].push_back(particle.vx);
219 doubleVarsMap[
"vy"].push_back(particle.vy);
220 doubleVarsMap[
"vz"].push_back(particle.vz);
221 stringVarsMap[
"name"].push_back(particle.name);
229 for (
auto& [varname, values] : intVarsMap) { values.clear(); }
230 for (
auto& [varname, values] : doubleVarsMap) { values.clear(); }
232 for (
const auto& ancestor : ancestors) {
233 intVarsMap[
"pid"].push_back(ancestor.pid);
234 intVarsMap[
"tid"].push_back(ancestor.tid);
235 intVarsMap[
"mtid"].push_back(ancestor.mtid);
236 doubleVarsMap[
"trackE"].push_back(ancestor.trackE);
237 doubleVarsMap[
"px"].push_back(ancestor.px);
238 doubleVarsMap[
"py"].push_back(ancestor.py);
239 doubleVarsMap[
"pz"].push_back(ancestor.pz);
240 doubleVarsMap[
"vx"].push_back(ancestor.vx);
241 doubleVarsMap[
"vy"].push_back(ancestor.vy);
242 doubleVarsMap[
"vz"].push_back(ancestor.vz);
254void GRootTree::registerVariable(
const std::string& varname, [[maybe_unused]]
int value,
255 bool can_ignore_duplicates) {
256 if (can_ignore_duplicates) {
257 root_tree->Branch(varname.c_str(), &intVarsMap[varname]);
260 if (!intVarsMap.contains(varname)) {
261 root_tree->Branch(varname.c_str(), &intVarsMap[varname]);
266 "variable <%1> already registered in the int variable map of tree %2", varname,
267 root_tree->GetName());
272void GRootTree::registerVariable(
const std::string& varname, [[maybe_unused]]
double value) {
273 if (!doubleVarsMap.contains(varname)) {
274 root_tree->Branch(varname.c_str(), &doubleVarsMap[varname]);
279 "variable <%1> already registered in the double variable map of tree %2", varname,
280 root_tree->GetName());
284void GRootTree::registerVariable(
const std::string& varname, [[maybe_unused]]
const std::string& value) {
285 if (!stringVarsMap.contains(varname)) {
286 root_tree->Branch(varname.c_str(), &stringVarsMap[varname]);
291 "variable <%1> already registered in the string variable map of tree %2", varname,
292 root_tree->GetName());
const std::vector< GIdentifier > & getIdentity() const
std::map< std::string, int > getIntObservablesMap(int which) const
std::map< std::string, double > getDblObservablesMap(int which) const
GRootTree(const std::unique_ptr< GEventHeader > &gevent_header, std::shared_ptr< GLogger > &log)
Construct an event-header tree and register its branches.
bool fillTree(const std::unique_ptr< GEventHeader > &gevent_header)
Fill the event-header tree with one event header entry.
std::map< std::string, double > getDoubleVariablesMap() const
const std::vector< GIdentifier > & getIdentity() const
std::map< std::string, std::string > getStringVariablesMap() const
std::vector< GAncestorData > GAncestorBank
std::vector< GGeneratedParticleData > GGeneratedParticleBank
ROOT tree adapter used internally by the ROOT gstreamer plugin.
std::map< std::string, int > getIdentityMap(std::vector< GIdentifier > gidentity)
Shared constants and error codes for the gstreamer module.
constexpr char RUNHEADERTREENAMEDESC[]
constexpr char GENERATEDTREENAMEDESC[]
constexpr char RUNHEADERTREENAME[]
constexpr char EVENTHEADERTREENAME[]
constexpr char ANCESTORTREENAMEDESC[]
constexpr char EVENTHEADERTREENAMEDESC[]
constexpr char TRUEINFOTREENAMEDESC[]
constexpr char ANCESTORTREENAME[]
constexpr char DIGITIZEDTREENAMEDESC[]
constexpr int ERR_GSTREAMERVARIABLEEXISTS
Duplicate variable registration was attempted in a streamer-specific schema.