@@ -33,116 +33,84 @@ using IndexedBuilder = awkward::LayoutBuilder::IndexedOption<PRIMITIVE, BUILDER>
33
33
template <class PRIMITIVE >
34
34
using NumpyBuilder = awkward::LayoutBuilder::Numpy<PRIMITIVE>;
35
35
36
- enum Field : std::size_t {
37
- runId,
38
- eventId,
36
+ template <class T >
37
+ using TrackFieldBuilder = ListOffsetBuilder<unsigned int , NumpyBuilder<T>>;
38
+
39
+ template <class PRIMITIVE >
40
+ class StringBuilder : public ListOffsetBuilder <PRIMITIVE, NumpyBuilder<uint8_t >> {
41
+ public:
42
+ StringBuilder () : ListOffsetBuilder<PRIMITIVE, NumpyBuilder<uint8_t >>() {
43
+ this ->set_parameters (R"""( "__array__": "string")""" );
44
+ this ->content ().set_parameters (R"""( "__array__": "char")""" );
45
+ }
46
+
47
+ void append_string (const std::string& value) {
48
+ this ->begin_list ();
49
+ for (const auto c: value) {
50
+ this ->content ().append (c);
51
+ }
52
+ this ->end_list ();
53
+ }
54
+ };
55
+
56
+ template <class T >
57
+ using StepFieldBuilder = ListOffsetBuilder<unsigned int , ListOffsetBuilder<unsigned int , NumpyBuilder<T>>>;
58
+
59
+ using TrackStringBuilder = ListOffsetBuilder<unsigned int , StringBuilder<unsigned int >>;
60
+ using StepStringBuilder = ListOffsetBuilder<unsigned int , ListOffsetBuilder<unsigned int , StringBuilder<unsigned int >>>;
61
+
62
+ struct Builders {
63
+ std::unordered_set<std::string> fields;
64
+ NumpyBuilder<unsigned int > run;
65
+ NumpyBuilder<unsigned int > id;
39
66
//
40
- trackId,
41
- trackParentId,
42
- trackParticle,
43
- // trackParticleType,
44
- trackInitialEnergy,
45
- trackInitialTime,
46
- // trackCreatorProcess,
47
- // trackCreatorProcessType,
48
- trackInitialPositionX,
49
- trackInitialPositionY,
50
- trackInitialPositionZ,
51
- trackInitialMomentumX,
52
- trackInitialMomentumY,
53
- trackInitialMomentumZ,
54
- trackWeight,
67
+ TrackFieldBuilder<unsigned int > track_id;
68
+ TrackFieldBuilder<unsigned int > track_parent_id;
69
+ TrackFieldBuilder<double > track_initial_energy;
70
+ TrackFieldBuilder<double > track_initial_time;
71
+ TrackFieldBuilder<double > track_initial_position_x;
72
+ TrackFieldBuilder<double > track_initial_position_y;
73
+ TrackFieldBuilder<double > track_initial_position_z;
74
+ TrackFieldBuilder<double > track_initial_momentum_x;
75
+ TrackFieldBuilder<double > track_initial_momentum_y;
76
+ TrackFieldBuilder<double > track_initial_momentum_z;
77
+ StepFieldBuilder<unsigned int > track_children_ids;// this is a track field, but it has the same structure of a step field
78
+ TrackStringBuilder track_particle;
79
+ TrackStringBuilder track_particle_type;
80
+ TrackStringBuilder track_creator_process;
81
+ TrackStringBuilder track_creator_process_type;
82
+ TrackFieldBuilder<double > track_weight;
55
83
//
56
- stepEnergy,
57
- stepTime,
58
- // stepProcess,
59
- // stepProcessType,
60
- // stepVolume,
61
- stepPositionX,
62
- stepPositionY,
63
- stepPositionZ,
64
- stepTrackKineticEnergy,
84
+ StepFieldBuilder<double > step_energy;
85
+ StepFieldBuilder<double > step_time;
86
+ StepFieldBuilder<double > step_track_kinetic_energy;
87
+ StepStringBuilder step_process;
88
+ StepStringBuilder step_process_type;
89
+ StepStringBuilder step_volume;
90
+ StepStringBuilder step_volume_post;
91
+ StepStringBuilder step_nucleus;
92
+ StepFieldBuilder<double > step_position_x;
93
+ StepFieldBuilder<double > step_position_y;
94
+ StepFieldBuilder<double > step_position_z;
95
+ StepFieldBuilder<double > step_momentum_x;
96
+ StepFieldBuilder<double > step_momentum_y;
97
+ StepFieldBuilder<double > step_momentum_z;
98
+
99
+ Builders (const std::unordered_set<std::string>& fields) : fields(fields){};
65
100
};
66
101
67
- inline static const UserDefinedMap fieldToNameEvent = {
68
- {Field::runId, " run_id" },
69
- {Field::eventId, " event_id" },
70
- };
71
102
72
- inline static const UserDefinedMap fieldToNameTrack = {
73
- {Field::trackId, " track.id" },
74
- {Field::trackParentId, " track.parent_id" },
75
- {Field::trackParticle, " track.particle" },
76
- // {Field::trackParticleType, "track.particle_type"},
77
- {Field::trackInitialEnergy, " track.energy" },
78
- {Field::trackInitialTime, " track.time" },
79
- {Field::trackInitialPositionX, " track.position.x" },
80
- {Field::trackInitialPositionY, " track.position.y" },
81
- {Field::trackInitialPositionZ, " track.position.z" },
82
- {Field::trackInitialMomentumX, " track.momentum.x" },
83
- {Field::trackInitialMomentumY, " track.momentum.y" },
84
- {Field::trackInitialMomentumZ, " track.momentum.z" },
85
- {Field::trackWeight, " track.weight" },
86
- };
103
+ void InsertEventBegin (const G4Event* event, Builders& builder);
104
+ void InsertEventEnd (const G4Event* event, Builders& builder);
87
105
88
- inline static const UserDefinedMap fieldToNameStep = {
89
- {Field::stepEnergy, " track.step.energy" },
90
- {Field::stepTime, " track.step.time" },
91
- {Field::stepPositionX, " track.step.position.x" },
92
- {Field::stepPositionY, " track.step.position.y" },
93
- {Field::stepPositionZ, " track.step.position.z" },
94
- {Field::stepTrackKineticEnergy, " track.step.track_kinetic_energy" },
95
-
96
- // {Field::stepProcess, "track.step.process"}},
97
- // {Field::stepProcessType, "track.step.process_type"}},
98
- // {Field::stepVolume, "track.step.volume"}},
99
- };
106
+ void InsertTrackBegin (const G4Track* track, Builders& builder);
107
+ void InsertTrackEnd (const G4Track* track, Builders& builder);
108
+
109
+ void InsertEvent (const G4Event* event, Builders& builder);
110
+ void InsertTrack (const G4Track* track, Builders& builder);
111
+ void InsertStep (const G4Step* step, Builders& builder);
100
112
101
- typedef unsigned int id;
102
- using Builder = RecordBuilder<
103
- RecordField<Field::runId, NumpyBuilder<id>>,
104
- RecordField<Field::eventId, NumpyBuilder<id>>,
105
- //
106
- RecordField<Field::trackId, ListOffsetBuilder<id, NumpyBuilder<id>>>,
107
- RecordField<Field::trackParentId, ListOffsetBuilder<id, NumpyBuilder<id>>>,
108
- RecordField<Field::trackParticle, ListOffsetBuilder<id, NumpyBuilder<bool >>>,// this should be a string
109
- // RecordField<Field::trackParticleType,ListOffsetBuilder<id, NumpyBuilder<std::string>>>,
110
- RecordField<Field::trackInitialEnergy, ListOffsetBuilder<id, NumpyBuilder<float >>>,
111
- RecordField<Field::trackInitialTime, ListOffsetBuilder<id, NumpyBuilder<float >>>,
112
- // RecordField<Field::trackCreatorProcess,ListOffsetBuilder<id, NumpyBuilder<std::string>>>,
113
- RecordField<Field::trackInitialPositionX, ListOffsetBuilder<id, NumpyBuilder<float >>>,
114
- RecordField<Field::trackInitialPositionY, ListOffsetBuilder<id, NumpyBuilder<float >>>,
115
- RecordField<Field::trackInitialPositionZ, ListOffsetBuilder<id, NumpyBuilder<float >>>,
116
- RecordField<Field::trackInitialMomentumX, ListOffsetBuilder<id, NumpyBuilder<float >>>,
117
- RecordField<Field::trackInitialMomentumY, ListOffsetBuilder<id, NumpyBuilder<float >>>,
118
- RecordField<Field::trackInitialMomentumZ, ListOffsetBuilder<id, NumpyBuilder<float >>>,
119
- RecordField<Field::trackWeight, ListOffsetBuilder<id, NumpyBuilder<float >>>,
120
- //
121
- RecordField<Field::stepEnergy, ListOffsetBuilder<id, ListOffsetBuilder<id, NumpyBuilder<float >>>>,
122
- RecordField<Field::stepTime, ListOffsetBuilder<id, ListOffsetBuilder<id, NumpyBuilder<float >>>>,
123
- // RecordField<Field::stepVolume,ListOffsetBuilder<id, ListOffsetBuilder<id, NumpyBuilder<std::string>>>>
124
- // RecordField<Field::stepProcess,ListOffsetBuilder<id, ListOffsetBuilder<id, NumpyBuilder<std::string>>>>
125
- // RecordField<Field::stepProcessType,ListOffsetBuilder<id, ListOffsetBuilder<id, NumpyBuilder<std::string>>>>
126
- RecordField<Field::stepPositionX, ListOffsetBuilder<id, ListOffsetBuilder<id, NumpyBuilder<float >>>>,
127
- RecordField<Field::stepPositionY, ListOffsetBuilder<id, ListOffsetBuilder<id, NumpyBuilder<float >>>>,
128
- RecordField<Field::stepPositionZ, ListOffsetBuilder<id, ListOffsetBuilder<id, NumpyBuilder<float >>>>,
129
- RecordField<Field::stepTrackKineticEnergy, ListOffsetBuilder<id, ListOffsetBuilder<id, NumpyBuilder<float >>>>
130
- //
131
- >;
132
-
133
- Builder MakeBuilder ();
134
-
135
- void InsertEventBegin (const G4Event* event, Builder& builder);
136
- void InsertEventEnd (const G4Event* event, Builder& builder);
137
-
138
- void InsertTrackBegin (const G4Track* track, Builder& builder);
139
- void InsertTrackEnd (const G4Track* track, Builder& builder);
140
-
141
- void InsertEvent (const G4Event* event, Builder& builder);
142
- void InsertTrack (const G4Track* track, Builder& builder);
143
- void InsertStep (const G4Step* step, Builder& builder);
144
-
145
- py::object SnapshotBuilder (Builder& builder);
113
+ py::object SnapshotBuilder (Builders& builder);
146
114
147
115
namespace units {
148
116
static constexpr auto energy = CLHEP::keV;
0 commit comments