66// geant4
77#include " G4Event.hh"
88
9+ thread_local GParticleEvent GPrimaryGeneratorAction::current_generated_particles;
10+ thread_local GParticleEvent GPrimaryGeneratorAction::current_generated_tracked_particles;
11+ thread_local GParticleRecordEvent GPrimaryGeneratorAction::current_generated_particle_records;
12+ thread_local GParticleRecordEvent GPrimaryGeneratorAction::current_generated_tracked_particle_records;
13+
14+ namespace {
15+ GParticleRecord make_particle_record (const GparticlePtr& particle) {
16+ if (particle == nullptr ) { return {}; }
17+ const auto & vertex = particle->getVertex ();
18+ return {
19+ particle->getName (),
20+ particle->getPid (),
21+ particle->getGeneratorType (),
22+ particle->getMultiplicity (),
23+ particle->getMomentum (),
24+ particle->getTheta (),
25+ particle->getPhi (),
26+ vertex.x (),
27+ vertex.y (),
28+ vertex.z ()
29+ };
30+ }
31+ }
932
1033// Build the primary-generator action, load the configured particle definitions,
1134// and guarantee a valid fallback particle when no explicit configuration is present.
@@ -16,8 +39,9 @@ GPrimaryGeneratorAction::GPrimaryGeneratorAction(std::shared_ptr<GOptions> gopts
1639 // definitions are event records and are selected by Geant4 event id.
1740 gparticles = gparticle::getGParticlesFromOption (gopts, log);
1841 gparticleFileEvents = gparticle::getGParticleEventsFromSources (gopts, log);
42+ allGparticleFileRecordEvents = gparticle::getGParticleRecordEventsFromSources (gopts, log);
1943
20- if (gparticles.empty () && gparticleFileEvents .empty ()) {
44+ if (gparticles.empty () && allGparticleFileRecordEvents .empty ()) {
2145 // Fall back to a default particle definition so the generator remains usable
2246 // even when no explicit particle configuration was provided.
2347 auto default_particle = Gparticle::create_default_gparticle (log);
@@ -30,14 +54,44 @@ GPrimaryGeneratorAction::GPrimaryGeneratorAction(std::shared_ptr<GOptions> gopts
3054// For each configured particle definition, configure the shared particle gun and
3155// inject the corresponding primary information into the current event.
3256void GPrimaryGeneratorAction::GeneratePrimaries (G4Event* anEvent) {
57+ current_generated_particles.clear ();
58+ current_generated_tracked_particles.clear ();
59+ current_generated_particle_records.clear ();
60+ current_generated_tracked_particle_records.clear ();
61+
62+ current_generated_particles.insert (current_generated_particles.end (), gparticles.begin (), gparticles.end ());
63+ current_generated_tracked_particles.insert (current_generated_tracked_particles.end (), gparticles.begin (), gparticles.end ());
64+ current_generated_particle_records.reserve (gparticles.size ());
65+ current_generated_tracked_particle_records.reserve (gparticles.size ());
66+ for (const auto & gparticle : gparticles) {
67+ current_generated_particle_records.emplace_back (make_particle_record (gparticle));
68+ current_generated_tracked_particle_records.emplace_back (make_particle_record (gparticle));
69+ }
70+
71+ const auto event_id = anEvent->GetEventID ();
72+ if (event_id >= 0 && static_cast <size_t >(event_id) < allGparticleFileRecordEvents.size ()) {
73+ const auto & event_particles = allGparticleFileRecordEvents[static_cast <size_t >(event_id)];
74+ current_generated_particle_records.insert (current_generated_particle_records.end (),
75+ event_particles.begin (),
76+ event_particles.end ());
77+ }
78+ if (event_id >= 0 && static_cast <size_t >(event_id) < gparticleFileEvents.size ()) {
79+ const auto & event_particles = gparticleFileEvents[static_cast <size_t >(event_id)];
80+ current_generated_tracked_particles.insert (current_generated_tracked_particles.end (),
81+ event_particles.begin (),
82+ event_particles.end ());
83+ for (const auto & gparticle : event_particles) {
84+ current_generated_tracked_particle_records.emplace_back (make_particle_record (gparticle));
85+ }
86+ }
87+
3388 for (const auto & gparticle : gparticles) {
3489
3590 if (gparticle != nullptr ) {
3691 gparticle->shootParticle (gparticleGun.get (), anEvent);
3792 }
3893 }
3994
40- const auto event_id = anEvent->GetEventID ();
4195 if (event_id >= 0 && static_cast <size_t >(event_id) < gparticleFileEvents.size ()) {
4296 log->info (2 , " Generating gparticlefile event " , event_id,
4397 " with " , gparticleFileEvents[static_cast <size_t >(event_id)].size (),
@@ -50,3 +104,19 @@ void GPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) {
50104 }
51105 }
52106}
107+
108+ const GParticleEvent& GPrimaryGeneratorAction::currentGeneratedParticles () {
109+ return current_generated_particles;
110+ }
111+
112+ const GParticleEvent& GPrimaryGeneratorAction::currentGeneratedTrackedParticles () {
113+ return current_generated_tracked_particles;
114+ }
115+
116+ const GParticleRecordEvent& GPrimaryGeneratorAction::currentGeneratedParticleRecords () {
117+ return current_generated_particle_records;
118+ }
119+
120+ const GParticleRecordEvent& GPrimaryGeneratorAction::currentGeneratedTrackedParticleRecords () {
121+ return current_generated_tracked_particle_records;
122+ }
0 commit comments