12#ifndef MC_KINEMATICS_READER_H
13#define MC_KINEMATICS_READER_H
124 return mDigitizationContext;
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);
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;
141 bool mOwningDigiContext =
false;
144 std::vector<TChain*> mInputChains;
147 mutable std::vector<std::vector<std::vector<o2::MCTrack>*>> mTracks;
148 mutable std::vector<std::vector<o2::dataformats::MCEventHeader>> mHeaders;
149 mutable std::vector<std::vector<o2::dataformats::MCTruthContainer<o2::TrackReference>>> mIndexedTrackRefs;
150 mutable std::vector<std::vector<bool>> mTrackRefsLoaded;
152 bool mInitialized =
false;
158 const auto event =
label.getEventID();
159 const auto track =
label.getTrackID();
167 return static_cast<size_t>(track) <
tracks.size() ? &
tracks[track] :
nullptr;
177 if (
static_cast<size_t>(
source) >= mTracks.size()) {
178 reportMissingSource(
source, mTracks.size());
180 auto& perEvent = mTracks[
source];
181 if (perEvent.size() == 0) {
182 initTracksForSource(
source);
185 if (
static_cast<size_t>(
event) >= perEvent.size() || perEvent[
event] ==
nullptr) {
188 return *perEvent[
event];
198 auto const& headers = mHeaders.at(
source);
199 if (headers.size() == 0) {
200 loadHeadersForSource(
source);
202 if (
static_cast<size_t>(
event) >= headers.size()) {
203 reportMissingEvent(
"event headers",
source,
event, headers.size());
205 return headers[
event];
210 if (
static_cast<size_t>(
source) >= mIndexedTrackRefs.size()) {
213 auto& perEvent = mIndexedTrackRefs[
source];
214 if (perEvent.size() == 0) {
215 initTrackRefsForSource(
source);
217 if (
static_cast<size_t>(
event) >= perEvent.size()) {
223 return perEvent[
event].getLabels(track);
228 auto const& perEvent = mIndexedTrackRefs.at(
source);
229 if (perEvent.size() == 0) {
230 initTrackRefsForSource(
source);
232 if (
static_cast<size_t>(
event) >= perEvent.size()) {
233 reportMissingEvent(
"events of track references",
source,
event, perEvent.size());
238 return perEvent[
event].getTruthArray();
248 return mTracks.size();
254 initTracksForSource(
source);
256 return mTracks[
source].size();
std::vector< o2::its::TrackITS > tracks
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
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
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 ...