gparticle
Loading...
Searching...
No Matches
gparticle_reader.cc
Go to the documentation of this file.
1// gparticle
2#include "gparticle_reader.h"
4#include "gparticle_options.h"
6
7// gemc
8#include "gfactory.h"
9#include "gutilities.h"
10
11// c++
12#include <algorithm>
13
14GParticleReader::GParticleReader(const std::shared_ptr<GOptions>& gopts) : GBase(gopts, GPARTICLE_LOGGER) {
15}
16
18 const std::shared_ptr<GLogger>& logger,
19 [[maybe_unused]] bool propagated_only) {
20 GParticleEvents events;
21 auto particles = loadParticles(source, logger);
22 if (!particles.empty()) { events.emplace_back(std::move(particles)); }
23 return events;
24}
25
27 const std::shared_ptr<GLogger>& logger) {
29 for (const auto& event : loadParticleEvents(source, logger)) {
30 GParticleRecordEvent record_event;
31 record_event.reserve(event.size());
32 for (const auto& particle : event) {
33 if (particle == nullptr) { continue; }
34 const auto& vertex = particle->getVertex();
35 record_event.push_back({
36 particle->getName(),
37 particle->getPid(),
38 particle->getGeneratorType(),
39 particle->getMultiplicity(),
40 particle->getMomentum(),
41 particle->getTheta(),
42 particle->getPhi(),
43 vertex.x(),
44 vertex.y(),
45 vertex.z()
46 });
47 }
48 events.emplace_back(std::move(record_event));
49 }
50 return events;
51}
52
53GParticleReader* GParticleReader::instantiate(dlhandle h, std::shared_ptr<GOptions> gopts) {
54 if (!h) return nullptr;
55
56 using fptr = GParticleReader* (*)(std::shared_ptr<GOptions>);
57
58 auto sym = dlsym(h, "GParticleReaderFactory");
59 if (!sym) return nullptr;
60
61 auto func = reinterpret_cast<fptr>(sym);
62 return func(gopts);
63}
64
65namespace gparticle {
66const std::vector<std::string>& supported_static_reader_formats() {
67 static const std::vector<std::string> formats = {"lund"};
68 return formats;
69}
70
71std::vector<GParticleSourceDefinition> getGParticleSourceDefinitions(const std::shared_ptr<GOptions>& gopts) {
72 std::vector<GParticleSourceDefinition> sources;
73
74 if (!gopts->doesOptionExist("gparticlefile")) { return sources; }
75
76 auto source_node = gopts->getOptionNode("gparticlefile");
77 if (!source_node || source_node.IsNull() || !source_node.IsSequence()) { return sources; }
78
79 for (auto source_item : source_node) {
80 sources.emplace_back(
81 gutilities::convertToLowercase(gopts->get_variable_in_option<std::string>(
82 source_item, "format", goptions::NODFLT)),
83 gopts->get_variable_in_option<std::string>(source_item, "filename", goptions::NODFLT)
84 );
85 }
86
87 return sources;
88}
89
90std::vector<GparticlePtr> getGParticlesFromSources(const std::shared_ptr<GOptions>& gopts,
91 std::shared_ptr<GLogger>& logger) {
92 std::vector<GparticlePtr> particles;
93 for (const auto& event : getGParticleEventsFromSources(gopts, logger)) {
94 particles.insert(particles.end(), event.begin(), event.end());
95 }
96 return particles;
97}
98
99GParticleEvents getGParticleEventsFromSources(const std::shared_ptr<GOptions>& gopts,
100 std::shared_ptr<GLogger>& logger,
101 bool propagated_only) {
102 GParticleEvents events;
103 GManager manager(gopts);
104
105 manager.RegisterObjectFactory<GParticleLundReader>("lund", gopts);
106
107 for (const auto& source : getGParticleSourceDefinitions(gopts)) {
108 std::shared_ptr<GParticleReader> reader;
109
110 const auto& builtins = supported_static_reader_formats();
111 if (std::find(builtins.begin(), builtins.end(), source.format) != builtins.end()) {
112 reader = std::shared_ptr<GParticleReader>(manager.CreateObject<GParticleReader>(source.format));
113 }
114 else {
115 reader = manager.LoadAndRegisterObjectFromLibrary<GParticleReader>(source.gparticlePluginName(), gopts);
116 }
117
118 if (reader == nullptr) {
119 logger->error(ERR_GPARTICLEREADERNOTFOUND,
120 "Could not create gparticle reader for format <", source.format, ">");
121 continue;
122 }
123
124 auto source_events = reader->loadParticleEvents(source, logger, propagated_only);
125 if (source_events.size() > events.size()) { events.resize(source_events.size()); }
126
127 for (size_t event_index = 0; event_index < source_events.size(); event_index++) {
128 events[event_index].insert(events[event_index].end(),
129 source_events[event_index].begin(),
130 source_events[event_index].end());
131 }
132 }
133
134 return events;
135}
136
137GParticleRecordEvents getGParticleRecordEventsFromSources(const std::shared_ptr<GOptions>& gopts,
138 std::shared_ptr<GLogger>& logger) {
140 GManager manager(gopts);
141
142 manager.RegisterObjectFactory<GParticleLundReader>("lund", gopts);
143
144 for (const auto& source : getGParticleSourceDefinitions(gopts)) {
145 std::shared_ptr<GParticleReader> reader;
147 const auto& builtins = supported_static_reader_formats();
148 if (std::find(builtins.begin(), builtins.end(), source.format) != builtins.end()) {
149 reader = std::shared_ptr<GParticleReader>(manager.CreateObject<GParticleReader>(source.format));
150 }
151 else {
152 reader = manager.LoadAndRegisterObjectFromLibrary<GParticleReader>(source.gparticlePluginName(), gopts);
153 }
154
155 if (reader == nullptr) {
156 logger->error(ERR_GPARTICLEREADERNOTFOUND,
157 "Could not create gparticle reader for format <", source.format, ">");
158 continue;
159 }
160
161 auto source_events = reader->loadParticleRecordEvents(source, logger);
162 if (source_events.size() > events.size()) { events.resize(source_events.size()); }
163
164 for (size_t event_index = 0; event_index < source_events.size(); event_index++) {
165 events[event_index].insert(events[event_index].end(),
166 source_events[event_index].begin(),
167 source_events[event_index].end());
168 }
169 }
170
171 return events;
172}
173}
std::shared_ptr< T > LoadAndRegisterObjectFromLibrary(std::string_view name, const std::shared_ptr< GOptions > &gopts)
Base * CreateObject(std::string_view name) const
void RegisterObjectFactory(std::string_view name)
Built-in reader for Lund generated-particle files.
Abstract base class for gparticle file readers.
virtual GParticleRecordEvents loadParticleRecordEvents(const GParticleSourceDefinition &source, const std::shared_ptr< GLogger > &logger)
Loads file-backed events as output-bank records.
virtual GParticleEvents loadParticleEvents(const GParticleSourceDefinition &source, const std::shared_ptr< GLogger > &logger, bool propagated_only=true)
Loads file-backed events as Gparticle objects.
virtual std::vector< GparticlePtr > loadParticles(const GParticleSourceDefinition &source, const std::shared_ptr< GLogger > &logger)=0
Loads all propagated particles as one flattened list.
GParticleReader(const std::shared_ptr< GOptions > &gopts)
Constructs a reader with the shared options container.
static GParticleReader * instantiate(dlhandle h, std::shared_ptr< GOptions > gopts)
Instantiates a dynamic reader plugin from a library handle.
void * dlhandle
event
Conventions and error codes for the gparticle module.
#define ERR_GPARTICLEREADERNOTFOUND
Particle reader factory could not be found or instantiated.
Public API for defining and parsing gparticle-related options.
constexpr const char * GPARTICLE_LOGGER
std::vector< GParticleEvent > GParticleEvents
Sequence of file-backed generated-particle events.
std::vector< GParticleRecordEvent > GParticleRecordEvents
Sequence of generated-particle record events indexed by event number.
std::vector< GParticleRecord > GParticleRecordEvent
Event-local list of generated-particle records for output.
const std::string NODFLT
const std::vector< std::string > & supported_static_reader_formats()
Returns built-in file-reader format tokens.
std::vector< GparticlePtr > getGParticlesFromSources(const std::shared_ptr< GOptions > &gopts, std::shared_ptr< GLogger > &logger)
Loads propagated particles from all configured file sources.
GParticleRecordEvents getGParticleRecordEventsFromSources(const std::shared_ptr< GOptions > &gopts, std::shared_ptr< GLogger > &logger)
Loads event-indexed generated-particle records from all configured file sources.
GParticleEvents getGParticleEventsFromSources(const std::shared_ptr< GOptions > &gopts, std::shared_ptr< GLogger > &logger, bool propagated_only)
Loads event-indexed propagated particles from all configured file sources.
std::vector< GParticleSourceDefinition > getGParticleSourceDefinitions(const std::shared_ptr< GOptions > &gopts)
Parses all configured -gparticlefile entries.
string convertToLowercase(const string &str)
One configured -gparticlefile source.