18 const std::shared_ptr<GLogger>& logger,
19 [[maybe_unused]]
bool propagated_only) {
22 if (!particles.empty()) { events.emplace_back(std::move(particles)); }
27 const std::shared_ptr<GLogger>& logger) {
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({
38 particle->getGeneratorType(),
39 particle->getMultiplicity(),
40 particle->getMomentum(),
48 events.emplace_back(std::move(record_event));
54 if (!h)
return nullptr;
58 auto sym = dlsym(h,
"GParticleReaderFactory");
59 if (!sym)
return nullptr;
61 auto func =
reinterpret_cast<fptr
>(sym);
67 static const std::vector<std::string> formats = {
"lund"};
72 std::vector<GParticleSourceDefinition> sources;
74 if (!gopts->doesOptionExist(
"gparticlefile")) {
return sources; }
76 auto source_node = gopts->getOptionNode(
"gparticlefile");
77 if (!source_node || source_node.IsNull() || !source_node.IsSequence()) {
return sources; }
79 for (
auto source_item : source_node) {
83 gopts->get_variable_in_option<std::string>(source_item,
"filename",
goptions::NODFLT)
91 std::shared_ptr<GLogger>& logger) {
92 std::vector<GparticlePtr> particles;
94 particles.insert(particles.end(),
event.begin(),
event.end());
100 std::shared_ptr<GLogger>& logger,
101 bool propagated_only) {
108 std::shared_ptr<GParticleReader> reader;
111 if (std::find(builtins.begin(), builtins.end(), source.format) != builtins.end()) {
118 if (reader ==
nullptr) {
120 "Could not create gparticle reader for format <", source.format,
">");
124 auto source_events = reader->loadParticleEvents(source, logger, propagated_only);
125 if (source_events.size() > events.size()) { events.resize(source_events.size()); }
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());
138 std::shared_ptr<GLogger>& logger) {
145 std::shared_ptr<GParticleReader> reader;
148 if (std::find(builtins.begin(), builtins.end(), source.format) != builtins.end()) {
155 if (reader ==
nullptr) {
157 "Could not create gparticle reader for format <", source.format,
">");
161 auto source_events = reader->loadParticleRecordEvents(source, logger);
162 if (source_events.size() > events.size()) { events.resize(source_events.size()); }
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());
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.
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::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.