Project
Loading...
Searching...
No Matches
MCKinematicsReader.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef MC_KINEMATICS_READER_H
13#define MC_KINEMATICS_READER_H
14
21#include <vector>
22
23class TChain;
24
25namespace o2
26{
27
28namespace steer
29{
30
32{
33 public:
34 enum class Mode {
37 };
38
40 MCKinematicsReader() = default;
41
44
48
54 {
55 if (mode == Mode::kMCKine) {
57 } else if (mode == Mode::kDigiContext) {
59 }
60 }
61
67
70 bool initFromDigitContext(std::string_view filename);
71
73
75 bool initFromKinematics(std::string_view filename);
76
77 bool isInitialized() const { return mInitialized; }
78
81 MCTrack const* getTrack(o2::MCCompLabel const&) const;
82
85 MCTrack const* getTrack(int source, int event, int track) const;
86
89 MCTrack const* getTrack(int event, int track) const;
90
92 std::vector<MCTrack> const& getTracks(int source, int event) const;
93
96
98 std::vector<MCTrack> const& getTracks(int event) const;
99
101
103
105
107 gsl::span<o2::TrackReference> getTrackRefs(int source, int event, int track) const;
109 const std::vector<o2::TrackReference>& getTrackRefsByEvent(int source, int event) const;
111 gsl::span<o2::TrackReference> getTrackRefs(int event, int track) const;
112
115
117 size_t getNSources() const;
118
120 size_t getNEvents(int source) const;
121
123 {
124 return mDigitizationContext;
125 }
126
127 private:
129 void ensureTracksForSourceAndEvent(int source, int event) const;
130 [[noreturn]] static void reportMissingSource(int source, size_t available);
131 [[noreturn]] static void reportMissingEvent(const char* what, int source, int event, size_t available);
132
133 void initTracksForSource(int source) const;
134 void loadTracksForSourceAndEvent(int source, int eventID) const;
135 void loadHeadersForSource(int source) const;
136 void initTrackRefsForSource(int source) const;
137 void loadTrackRefsForSourceAndEvent(int source, int event) const;
138 void initIndexedTrackRefs(std::vector<o2::TrackReference>& refs, o2::dataformats::MCTruthContainer<o2::TrackReference>& indexedrefs) const;
139
140 DigitizationContext const* mDigitizationContext = nullptr;
141 bool mOwningDigiContext = false;
142
143 // chains for each source
144 std::vector<TChain*> mInputChains;
145
146 // a vector of tracks foreach source and each collision
147 mutable std::vector<std::vector<std::vector<o2::MCTrack>*>> mTracks; // the in-memory track container
148 mutable std::vector<std::vector<o2::dataformats::MCEventHeader>> mHeaders; // the in-memory header container
149 mutable std::vector<std::vector<o2::dataformats::MCTruthContainer<o2::TrackReference>>> mIndexedTrackRefs; // the in-memory track ref container
150 mutable std::vector<std::vector<bool>> mTrackRefsLoaded; // whether the track refs of a source/event are in memory
151
152 bool mInitialized = false; // whether initialized
153};
154
156{
157 const auto source = label.getSourceID();
158 const auto event = label.getEventID();
159 const auto track = label.getTrackID();
160 return getTrack(source, event, track);
161}
162
163inline MCTrack const* MCKinematicsReader::getTrack(int source, int event, int track) const
164{
165 auto const& tracks = getTracks(source, event);
166 // one comparison, and it covers the negative track ID of a hit whose track was not kept
167 return static_cast<size_t>(track) < tracks.size() ? &tracks[track] : nullptr;
168}
169
170inline MCTrack const* MCKinematicsReader::getTrack(int event, int track) const
171{
172 return getTrack(0, event, track);
173}
174
175inline std::vector<MCTrack> const& MCKinematicsReader::getTracks(int source, int event) const
176{
177 if (static_cast<size_t>(source) >= mTracks.size()) {
178 reportMissingSource(source, mTracks.size());
179 }
180 auto& perEvent = mTracks[source];
181 if (perEvent.size() == 0) {
182 initTracksForSource(source);
183 }
184 // the event range shares the branch of the lazy load, so the fast path grows by one comparison
185 if (static_cast<size_t>(event) >= perEvent.size() || perEvent[event] == nullptr) {
186 ensureTracksForSourceAndEvent(source, event);
187 }
188 return *perEvent[event];
189}
190
191inline std::vector<MCTrack> const& MCKinematicsReader::getTracks(int event) const
192{
193 return getTracks(0, event);
194}
195
197{
198 auto const& headers = mHeaders.at(source);
199 if (headers.size() == 0) {
200 loadHeadersForSource(source);
201 }
202 if (static_cast<size_t>(event) >= headers.size()) {
203 reportMissingEvent("event headers", source, event, headers.size());
204 }
205 return headers[event];
206}
207
208inline gsl::span<o2::TrackReference> MCKinematicsReader::getTrackRefs(int source, int event, int track) const
209{
210 if (static_cast<size_t>(source) >= mIndexedTrackRefs.size()) {
211 return {};
212 }
213 auto& perEvent = mIndexedTrackRefs[source];
214 if (perEvent.size() == 0) {
215 initTrackRefsForSource(source);
216 }
217 if (static_cast<size_t>(event) >= perEvent.size()) {
218 return {};
219 }
220 if (!mTrackRefsLoaded[source][event]) {
221 loadTrackRefsForSourceAndEvent(source, event);
222 }
223 return perEvent[event].getLabels(track);
224}
225
226inline const std::vector<o2::TrackReference>& MCKinematicsReader::getTrackRefsByEvent(int source, int event) const
227{
228 auto const& perEvent = mIndexedTrackRefs.at(source);
229 if (perEvent.size() == 0) {
230 initTrackRefsForSource(source);
231 }
232 if (static_cast<size_t>(event) >= perEvent.size()) {
233 reportMissingEvent("events of track references", source, event, perEvent.size());
234 }
235 if (!mTrackRefsLoaded[source][event]) {
236 loadTrackRefsForSourceAndEvent(source, event);
237 }
238 return perEvent[event].getTruthArray();
239}
240
241inline gsl::span<o2::TrackReference> MCKinematicsReader::getTrackRefs(int event, int track) const
242{
243 return getTrackRefs(0, event, track);
244}
245
247{
248 return mTracks.size();
249}
250
252{
253 if (mTracks[source].size() == 0) {
254 initTracksForSource(source);
255 }
256 return mTracks[source].size();
257}
258
259} // namespace steer
260} // namespace o2
261
262#endif
std::vector< o2::its::TrackITS > tracks
Definition of the MCTrack class.
Definition of a container to keep Monte Carlo truth external to simulation objects.
A container to hold and manage MC truth information/labels.
bool initFromKinematics(std::string_view filename)
inits the reader from a simple kinematics file
bool initFromDigitContext(std::string_view filename)
DigitizationContext const * getDigitizationContext() const
MCKinematicsReader()=default
default constructor
MCTrack const * getTrack(o2::MCCompLabel const &) const
size_t getNEvents(int source) const
Get number of events.
MCKinematicsReader(std::string_view name, Mode mode=Mode::kDigiContext)
o2::dataformats::MCEventHeader const & getMCEventHeader(int source, int event) const
retrieves the MCEventHeader for a given eventID and sourceID
MCKinematicsReader(const MCKinematicsReader &)=delete
the reader owns cached track vectors, so it must not be copied
void releaseTracksForSourceAndEvent(int source, int event)
API to ask releasing tracks and track references (freeing memory) for source + event.
size_t getNSources() const
Get number of sources.
const std::vector< o2::TrackReference > & getTrackRefsByEvent(int source, int event) const
return all track references associated to a source/event
MCKinematicsReader & operator=(const MCKinematicsReader &)=delete
MCKinematicsReader(o2::steer::DigitizationContext const *context)
constructing directly from a digitization context
gsl::span< o2::TrackReference > getTrackRefs(int source, int event, int track) const
get all primaries for a certain event
std::vector< MCTrack > const & getTracks(int source, int event) const
variant returning all tracks for source and event at once
struct _cl_event * event
Definition glcorearb.h:2982
GLenum mode
Definition glcorearb.h:266
GLsizeiptr size
Definition glcorearb.h:659
GLuint const GLchar * name
Definition glcorearb.h:781
GLsizei GLsizei GLchar * source
Definition glcorearb.h:798
GLuint GLsizei const GLchar * label
Definition glcorearb.h:2519
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string filename()