Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions Steer/include/Steer/MCKinematicsReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ class MCKinematicsReader
/// variant returning all tracks for source and event at once
std::vector<MCTrack> const& getTracks(int source, int event) const;

/// API to ask releasing tracks (freeing memory) for source + event
void releaseTracksForSourceAndEvent(int source, int event);

/// variant returning all tracks for source and event at once
std::vector<MCTrack> const& getTracks(int event) const;

Expand Down Expand Up @@ -106,7 +109,8 @@ class MCKinematicsReader
}

private:
void loadTracksForSource(int source) const;
void initTracksForSource(int source) const;
void loadTracksForSourceAndEvent(int source, int eventID) const;
void loadHeadersForSource(int source) const;
void loadTrackRefsForSource(int source) const;
void initIndexedTrackRefs(std::vector<o2::TrackReference>& refs, o2::dataformats::MCTruthContainer<o2::TrackReference>& indexedrefs) const;
Expand All @@ -117,7 +121,7 @@ class MCKinematicsReader
std::vector<TChain*> mInputChains;

// a vector of tracks foreach source and each collision
mutable std::vector<std::vector<std::vector<o2::MCTrack>>> mTracks; // the in-memory track container
mutable std::vector<std::vector<std::vector<o2::MCTrack>*>> mTracks; // the in-memory track container
mutable std::vector<std::vector<o2::dataformats::MCEventHeader>> mHeaders; // the in-memory header container
mutable std::vector<std::vector<o2::dataformats::MCTruthContainer<o2::TrackReference>>> mIndexedTrackRefs; // the in-memory track ref container

Expand All @@ -134,10 +138,7 @@ inline MCTrack const* MCKinematicsReader::getTrack(o2::MCCompLabel const& label)

inline MCTrack const* MCKinematicsReader::getTrack(int source, int event, int track) const
{
if (mTracks[source].size() == 0) {
loadTracksForSource(source);
}
return &mTracks[source][event][track];
return &getTracks(source, event)[track];
}

inline MCTrack const* MCKinematicsReader::getTrack(int event, int track) const
Expand All @@ -148,9 +149,12 @@ inline MCTrack const* MCKinematicsReader::getTrack(int event, int track) const
inline std::vector<MCTrack> const& MCKinematicsReader::getTracks(int source, int event) const
{
if (mTracks[source].size() == 0) {
loadTracksForSource(source);
initTracksForSource(source);
}
if (mTracks[source][event] == nullptr) {
loadTracksForSourceAndEvent(source, event);
}
return mTracks[source][event];
return *mTracks[source][event];
}

inline std::vector<MCTrack> const& MCKinematicsReader::getTracks(int event) const
Expand Down Expand Up @@ -195,7 +199,7 @@ inline size_t MCKinematicsReader::getNSources() const
inline size_t MCKinematicsReader::getNEvents(int source) const
{
if (mTracks[source].size() == 0) {
loadTracksForSource(source);
initTracksForSource(source);
}
return mTracks[source].size();
}
Expand Down
30 changes: 22 additions & 8 deletions Steer/src/MCKinematicsReader.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,17 @@ void MCKinematicsReader::initIndexedTrackRefs(std::vector<o2::TrackReference>& r
}
}

void MCKinematicsReader::loadTracksForSource(int source) const
void MCKinematicsReader::initTracksForSource(int source) const
{
auto chain = mInputChains[source];
if (chain) {
// todo: get name from NameConfig
auto br = chain->GetBranch("MCTrack");
mTracks[source].resize(br->GetEntries(), nullptr);
}
}

void MCKinematicsReader::loadTracksForSourceAndEvent(int source, int event) const
{
auto chain = mInputChains[source];
if (chain) {
Expand All @@ -58,18 +68,22 @@ void MCKinematicsReader::loadTracksForSource(int source) const
if (br) {
std::vector<MCTrack>* loadtracks = nullptr;
br->SetAddress(&loadtracks);
// load all kinematics
mTracks[source].resize(br->GetEntries());
for (int event = 0; event < br->GetEntries(); ++event) {
br->GetEntry(event);
mTracks[source][event] = *loadtracks;
}
br->GetEntry(event);
mTracks[source][event] = new std::vector<o2::MCTrack>;
*mTracks[source][event] = *loadtracks;
delete loadtracks;
loadtracks = nullptr;
}
}
}

void MCKinematicsReader::releaseTracksForSourceAndEvent(int source, int eventID)
{
if (mTracks.at(source).at(eventID) != nullptr) {
delete mTracks[source][eventID];
mTracks[source][eventID] = nullptr;
}
}

void MCKinematicsReader::loadHeadersForSource(int source) const
{
auto chain = mInputChains[source];
Expand Down