12#ifndef MC_KINEMATICS_READER_H
13#define MC_KINEMATICS_READER_H
120 return mDigitizationContext;
125 void ensureTracksForSourceAndEvent(
int source,
int event)
const;
126 [[noreturn]]
static void reportMissingSource(
int source,
size_t available);
127 [[noreturn]]
static void reportMissingEvent(
const char* what,
int source,
int event,
size_t available);
129 void initTracksForSource(
int source)
const;
130 void loadTracksForSourceAndEvent(
int source,
int eventID)
const;
131 void loadHeadersForSource(
int source)
const;
132 void loadTrackRefsForSource(
int source)
const;
136 bool mOwningDigiContext =
false;
139 std::vector<TChain*> mInputChains;
142 mutable std::vector<std::vector<std::vector<o2::MCTrack>*>> mTracks;
143 mutable std::vector<std::vector<o2::dataformats::MCEventHeader>> mHeaders;
144 mutable std::vector<std::vector<o2::dataformats::MCTruthContainer<o2::TrackReference>>> mIndexedTrackRefs;
146 bool mInitialized =
false;
152 const auto event =
label.getEventID();
153 const auto track =
label.getTrackID();
161 return static_cast<size_t>(track) < tracks.size() ? &tracks[track] :
nullptr;
171 if (
static_cast<size_t>(
source) >= mTracks.size()) {
172 reportMissingSource(
source, mTracks.size());
174 auto& perEvent = mTracks[
source];
175 if (perEvent.size() == 0) {
176 initTracksForSource(
source);
179 if (
static_cast<size_t>(
event) >= perEvent.size() || perEvent[
event] ==
nullptr) {
182 return *perEvent[
event];
192 auto const& headers = mHeaders.at(
source);
193 if (headers.size() == 0) {
194 loadHeadersForSource(
source);
196 if (
static_cast<size_t>(
event) >= headers.size()) {
197 reportMissingEvent(
"event headers",
source,
event, headers.size());
199 return headers[
event];
204 if (
static_cast<size_t>(
source) >= mIndexedTrackRefs.size()) {
207 auto& perEvent = mIndexedTrackRefs[
source];
208 if (perEvent.size() == 0) {
209 loadTrackRefsForSource(
source);
211 if (
static_cast<size_t>(
event) >= perEvent.size()) {
214 return perEvent[
event].getLabels(track);
219 auto const& perEvent = mIndexedTrackRefs.at(
source);
220 if (perEvent.size() == 0) {
221 loadTrackRefsForSource(
source);
223 if (
static_cast<size_t>(
event) >= perEvent.size()) {
224 reportMissingEvent(
"events of track references",
source,
event, perEvent.size());
226 return perEvent[
event].getTruthArray();
236 return mTracks.size();
242 initTracksForSource(
source);
244 return mTracks[
source].size();
Definition of the MCTrack class.
Definition of a container to keep Monte Carlo truth external to simulation objects.
bool initFromKinematics(std::string_view filename)
inits the reader from a simple kinematics file
bool isInitialized() const
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()
destructor
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
void releaseTracksForSourceAndEvent(int source, int event)
API to ask releasing tracks (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(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
GLuint const GLchar * name
GLsizei GLsizei GLchar * source
GLuint GLsizei const GLchar * label
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...