actions
Loading...
Searching...
No Matches
gTrackProvenance.cc
Go to the documentation of this file.
1#include "gTrackProvenance.h"
2
3// Geant4
4#include "G4ParticleDefinition.hh"
5#include "G4Track.hh"
6
7// C++
8#include <cstddef>
9
10GTrackProvenance::GTrackProvenance(bool save_ancestors) : save_ancestor_records(save_ancestors) {
11 clear();
12}
13
15 original_track_ids.assign(1, 0);
16 original_track_pids.assign(1, 0);
17 original_track_momenta.assign(1, G4ThreeVector());
18 track_records.clear();
19 if (save_ancestor_records) { track_records.resize(1); }
20}
21
22void GTrackProvenance::ensureCapacity(int track_id) {
23 if (track_id < 0) { return; }
24 const auto required_size = static_cast<std::size_t>(track_id) + 1;
25 if (original_track_ids.size() < required_size) { original_track_ids.resize(required_size, 0); }
26 if (original_track_pids.size() < required_size) { original_track_pids.resize(required_size, 0); }
27 if (original_track_momenta.size() < required_size) {
28 original_track_momenta.resize(required_size, G4ThreeVector());
29 }
30 if (save_ancestor_records && track_records.size() < required_size) {
31 track_records.resize(required_size);
32 }
33}
34
35void GTrackProvenance::record(const G4Track& track) {
36 record(track.GetParticleDefinition()->GetPDGEncoding(), track.GetTrackID(), track.GetParentID(),
37 track.GetKineticEnergy(), track.GetMomentum(), track.GetVertexPosition());
38}
39
40void GTrackProvenance::record(int pid, int track_id, int parent_id, double kinetic_energy,
41 const G4ThreeVector& momentum, const G4ThreeVector& vertex) {
42 if (track_id <= 0) { return; }
43
44 ensureCapacity(track_id);
45
46 const int original_id = parent_id == 0 ? track_id : originalTrackId(parent_id);
47 const int original_pid = parent_id == 0 ? pid : originalTrackPid(parent_id);
48 const G4ThreeVector original_momentum = parent_id == 0 ? momentum : originalTrackMomentum(parent_id);
49 original_track_ids[track_id] = original_id;
50 original_track_pids[track_id] = original_pid;
51 original_track_momenta[track_id] = original_momentum;
52
53 if (!save_ancestor_records) { return; }
54
55 track_records[track_id] = {
56 pid,
57 track_id,
58 parent_id,
59 original_id,
60 kinetic_energy,
61 momentum,
62 vertex
63 };
64}
65
66int GTrackProvenance::originalTrackId(int track_id) const {
67 if (track_id <= 0 || static_cast<std::size_t>(track_id) >= original_track_ids.size()) { return 0; }
68 return original_track_ids[track_id];
69}
70
71int GTrackProvenance::originalTrackPid(int track_id) const {
72 if (track_id <= 0 || static_cast<std::size_t>(track_id) >= original_track_pids.size()) { return 0; }
73 return original_track_pids[track_id];
74}
75
76G4ThreeVector GTrackProvenance::originalTrackMomentum(int track_id) const {
77 if (track_id <= 0 || static_cast<std::size_t>(track_id) >= original_track_momenta.size()) {
78 return G4ThreeVector();
79 }
80 return original_track_momenta[track_id];
81}
82
83std::vector<GTrackRecord> GTrackProvenance::ancestorsForTracks(
84 const std::unordered_set<int>& track_ids) const {
85 std::vector<GTrackRecord> ancestors;
86 if (!save_ancestor_records) { return ancestors; }
87
88 std::vector<bool> selected(track_records.size(), false);
89 std::size_t selected_count = 0;
90 for (int track_id : track_ids) {
91 while (track_id > 0 && static_cast<std::size_t>(track_id) < track_records.size() && !selected[track_id]) {
92 const auto& record = track_records[track_id];
93 if (record.tid == 0) { break; }
94 selected[track_id] = true;
95 ++selected_count;
96 track_id = record.mtid;
97 }
98 }
99
100 ancestors.reserve(selected_count);
101 for (std::size_t track_id = 1; track_id < track_records.size(); ++track_id) {
102 if (selected[track_id]) { ancestors.push_back(track_records[track_id]); }
103 }
104 return ancestors;
105}
GTrackProvenance(bool save_ancestors)
void record(const G4Track &track)
int originalTrackId(int track_id) const
G4ThreeVector originalTrackMomentum(int track_id) const
std::vector< GTrackRecord > ancestorsForTracks(const std::unordered_set< int > &track_ids) const
int originalTrackPid(int track_id) const