11 std::shared_ptr<GLogger>& logger) : log(logger) {
12 log->debug(
CONSTRUCTOR,
"GRootTree",
"ROOT 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());
30 log->info(2,
"Filling header tree for local event n. ", gevent_header->getG4LocalEvn(),
" threadID ",
31 gevent_header->getThreadID());
34 intVarsMap[
"g4localEventNumber"].clear();
35 intVarsMap[
"threadID"].clear();
36 stringVarsMap[
"timeStamp"].clear();
38 intVarsMap[
"g4localEventNumber"].emplace_back(gevent_header->getG4LocalEvn());
39 intVarsMap[
"threadID"].emplace_back(gevent_header->getThreadID());
40 stringVarsMap[
"timeStamp"].emplace_back(gevent_header->getTimeStamp());
49 log->info(2,
"Filling header tree for run n. ",
grun_header->getRunID());
52 intVarsMap[
"runID"].clear();
53 intVarsMap[
"runID"].emplace_back(
grun_header->getRunID());
61 std::shared_ptr<GLogger>& logger) : log(logger) {
62 log->debug(
CONSTRUCTOR,
"GRootTree",
"ROOT tree header");
66 root_tree->SetAutoFlush(20 * 1024 * 1024);
67 root_tree->SetAutoSave(50 * 1024 * 1024);
78 std::shared_ptr<GLogger>& logger) : log(logger) {
79 log->debug(
CONSTRUCTOR,
"GRootTree",
"ROOT tree True Info");
82 root_tree->SetAutoFlush(20 * 1024 * 1024);
83 root_tree->SetAutoSave(50 * 1024 * 1024);
87 for (
auto& [varname, value] : identityMap) { registerVariable(varname, value); }
95 std::shared_ptr<GLogger>& logger) : log(logger) {
96 log->debug(
CONSTRUCTOR,
"GRootTree",
"ROOT tree Generated Particles");
99 root_tree->SetAutoFlush(20 * 1024 * 1024);
100 root_tree->SetAutoSave(50 * 1024 * 1024);
102 registerVariable(
"pid", 0);
103 registerVariable(
"type", 0);
104 registerVariable(
"multiplicity", 0);
105 registerVariable(
"p", 0.0);
106 registerVariable(
"theta", 0.0);
107 registerVariable(
"phi", 0.0);
108 registerVariable(
"vx", 0.0);
109 registerVariable(
"vy", 0.0);
110 registerVariable(
"vz", 0.0);
111 registerVariable(
"name", std::string());
115 std::shared_ptr<GLogger>& logger) : log(logger) {
116 log->debug(
CONSTRUCTOR,
"GRootTree",
"ROOT tree Ancestors");
118 root_tree->SetAutoFlush(20 * 1024 * 1024);
119 root_tree->SetAutoSave(50 * 1024 * 1024);
121 registerVariable(
"pid", 0);
122 registerVariable(
"tid", 0);
123 registerVariable(
"mtid", 0);
124 registerVariable(
"trackE", 0.0);
125 registerVariable(
"px", 0.0);
126 registerVariable(
"py", 0.0);
127 registerVariable(
"pz", 0.0);
128 registerVariable(
"vx", 0.0);
129 registerVariable(
"vy", 0.0);
130 registerVariable(
"vz", 0.0);
139 std::shared_ptr<GLogger>& logger) : log(logger) {
140 log->debug(
CONSTRUCTOR,
"GRootTree",
"ROOT tree Digitized Data");
143 root_tree->SetAutoFlush(20 * 1024 * 1024);
144 root_tree->SetAutoSave(50 * 1024 * 1024);
148 for (
auto& [varname, value] : identityMap) { registerVariable(varname, value,
true); }
151 registerVariable(varname, value);
153 for (
auto& [varname, value] : gdata->
getDblObservablesMap(0)) { registerVariable(varname, value); }
160 for (
auto& [varname, values] : intVarsMap) { values.clear(); }
161 for (
auto& [varname, values] : doubleVarsMap) { values.clear(); }
162 for (
auto& [varname, values] : stringVarsMap) { values.clear(); }
165 for (
auto& dataHits : trueInfoData) {
168 for (
auto& [varname, value] : identityMap) {
169 intVarsMap[varname].push_back(value);
172 for (
auto& [varname, value] : dataHits->getDoubleVariablesMap()) { doubleVarsMap[varname].push_back(value); }
173 for (
auto& [varname, value] : dataHits->getStringVariablesMap()) { stringVarsMap[varname].push_back(value); }
184 for (
auto& [varname, values] : intVarsMap) { values.clear(); }
185 for (
auto& [varname, values] : doubleVarsMap) { values.clear(); }
186 for (
auto& [varname, values] : stringVarsMap) { values.clear(); }
189 for (
auto& dataHits : digitizedData) {
192 for (
auto& [varname, value] : identityMap) {
193 intVarsMap[varname].push_back(value);
197 for (
auto& [varname, value] : dataHits->getIntObservablesMap(0)) { intVarsMap[varname].push_back(value); }
198 for (
auto& [varname, value] : dataHits->getDblObservablesMap(0)) { doubleVarsMap[varname].push_back(value); }
206 for (
auto& [varname, values] : intVarsMap) { values.clear(); }
207 for (
auto& [varname, values] : doubleVarsMap) { values.clear(); }
208 for (
auto& [varname, values] : stringVarsMap) { values.clear(); }
210 for (
const auto& particle : particles) {
211 intVarsMap[
"pid"].push_back(particle.pid);
212 intVarsMap[
"type"].push_back(particle.type);
213 intVarsMap[
"multiplicity"].push_back(particle.multiplicity);
214 doubleVarsMap[
"p"].push_back(particle.p);
215 doubleVarsMap[
"theta"].push_back(particle.theta);
216 doubleVarsMap[
"phi"].push_back(particle.phi);
217 doubleVarsMap[
"vx"].push_back(particle.vx);
218 doubleVarsMap[
"vy"].push_back(particle.vy);
219 doubleVarsMap[
"vz"].push_back(particle.vz);
220 stringVarsMap[
"name"].push_back(particle.name);
228 for (
auto& [varname, values] : intVarsMap) { values.clear(); }
229 for (
auto& [varname, values] : doubleVarsMap) { values.clear(); }
231 for (
const auto& ancestor : ancestors) {
232 intVarsMap[
"pid"].push_back(ancestor.pid);
233 intVarsMap[
"tid"].push_back(ancestor.tid);
234 intVarsMap[
"mtid"].push_back(ancestor.mtid);
235 doubleVarsMap[
"trackE"].push_back(ancestor.trackE);
236 doubleVarsMap[
"px"].push_back(ancestor.px);
237 doubleVarsMap[
"py"].push_back(ancestor.py);
238 doubleVarsMap[
"pz"].push_back(ancestor.pz);
239 doubleVarsMap[
"vx"].push_back(ancestor.vx);
240 doubleVarsMap[
"vy"].push_back(ancestor.vy);
241 doubleVarsMap[
"vz"].push_back(ancestor.vz);
253void GRootTree::registerVariable(
const std::string& varname, [[maybe_unused]]
int value,
254 bool can_ignore_duplicates) {
255 if (can_ignore_duplicates) {
256 root_tree->Branch(varname.c_str(), &intVarsMap[varname]);
259 if (intVarsMap.find(varname) == intVarsMap.end()) {
260 root_tree->Branch(varname.c_str(), &intVarsMap[varname]);
264 "> already registered in the int variable map of tree ", root_tree->GetName());
269void GRootTree::registerVariable(
const std::string& varname, [[maybe_unused]]
double value) {
270 if (doubleVarsMap.find(varname) == doubleVarsMap.end()) {
271 root_tree->Branch(varname.c_str(), &doubleVarsMap[varname]);
275 "> already registered in the double variable map of tree ", root_tree->GetName());
279void GRootTree::registerVariable(
const std::string& varname, [[maybe_unused]]
const std::string& value) {
280 if (stringVarsMap.find(varname) == stringVarsMap.end()) {
281 root_tree->Branch(varname.c_str(), &stringVarsMap[varname]);
285 "> already registered in the string variable map of tree ", 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.