Skip to content

Commit bd8f5e4

Browse files
committed
MCReader: release early
1 parent 2e1145a commit bd8f5e4

2 files changed

Lines changed: 35 additions & 17 deletions

File tree

Steer/include/Steer/MCKinematicsReader.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ class MCKinematicsReader
7575
/// variant returning all tracks for source and event at once
7676
std::vector<MCTrack> const& getTracks(int source, int event) const;
7777

78+
/// API to ask releasing tracks (freeing memory) for source + event
79+
void releaseTracksForSourceAndEvent(int source, int event);
80+
7881
/// variant returning all tracks for source and event at once
7982
std::vector<MCTrack> const& getTracks(int event) const;
8083

@@ -106,7 +109,8 @@ class MCKinematicsReader
106109
}
107110

108111
private:
109-
void loadTracksForSource(int source) const;
112+
void initTracksForSource(int source) const;
113+
void loadTracksForSourceAndEvent(int source, int eventID) const;
110114
void loadHeadersForSource(int source) const;
111115
void loadTrackRefsForSource(int source) const;
112116
void initIndexedTrackRefs(std::vector<o2::TrackReference>& refs, o2::dataformats::MCTruthContainer<o2::TrackReference>& indexedrefs) const;
@@ -117,7 +121,7 @@ class MCKinematicsReader
117121
std::vector<TChain*> mInputChains;
118122

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

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

135139
inline MCTrack const* MCKinematicsReader::getTrack(int source, int event, int track) const
136140
{
137-
if (mTracks[source].size() == 0) {
138-
loadTracksForSource(source);
139-
}
140-
return &mTracks[source][event][track];
141+
return &getTracks(source, event)[track];
141142
}
142143

143144
inline MCTrack const* MCKinematicsReader::getTrack(int event, int track) const
@@ -148,9 +149,12 @@ inline MCTrack const* MCKinematicsReader::getTrack(int event, int track) const
148149
inline std::vector<MCTrack> const& MCKinematicsReader::getTracks(int source, int event) const
149150
{
150151
if (mTracks[source].size() == 0) {
151-
loadTracksForSource(source);
152+
initTracksForSource(source);
153+
}
154+
if (mTracks[source][event] == nullptr) {
155+
loadTracksForSourceAndEvent(source, event);
152156
}
153-
return mTracks[source][event];
157+
return *mTracks[source][event];
154158
}
155159

156160
inline std::vector<MCTrack> const& MCKinematicsReader::getTracks(int event) const
@@ -195,7 +199,7 @@ inline size_t MCKinematicsReader::getNSources() const
195199
inline size_t MCKinematicsReader::getNEvents(int source) const
196200
{
197201
if (mTracks[source].size() == 0) {
198-
loadTracksForSource(source);
202+
initTracksForSource(source);
199203
}
200204
return mTracks[source].size();
201205
}

Steer/src/MCKinematicsReader.cxx

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,17 @@ void MCKinematicsReader::initIndexedTrackRefs(std::vector<o2::TrackReference>& r
4949
}
5050
}
5151

52-
void MCKinematicsReader::loadTracksForSource(int source) const
52+
void MCKinematicsReader::initTracksForSource(int source) const
53+
{
54+
auto chain = mInputChains[source];
55+
if (chain) {
56+
// todo: get name from NameConfig
57+
auto br = chain->GetBranch("MCTrack");
58+
mTracks[source].resize(br->GetEntries(), nullptr);
59+
}
60+
}
61+
62+
void MCKinematicsReader::loadTracksForSourceAndEvent(int source, int event) const
5363
{
5464
auto chain = mInputChains[source];
5565
if (chain) {
@@ -58,18 +68,22 @@ void MCKinematicsReader::loadTracksForSource(int source) const
5868
if (br) {
5969
std::vector<MCTrack>* loadtracks = nullptr;
6070
br->SetAddress(&loadtracks);
61-
// load all kinematics
62-
mTracks[source].resize(br->GetEntries());
63-
for (int event = 0; event < br->GetEntries(); ++event) {
64-
br->GetEntry(event);
65-
mTracks[source][event] = *loadtracks;
66-
}
71+
br->GetEntry(event);
72+
mTracks[source][event] = new std::vector<o2::MCTrack>;
73+
*mTracks[source][event] = *loadtracks;
6774
delete loadtracks;
68-
loadtracks = nullptr;
6975
}
7076
}
7177
}
7278

79+
void MCKinematicsReader::releaseTracksForSourceAndEvent(int source, int eventID)
80+
{
81+
if (mTracks.at(source).at(eventID) != nullptr) {
82+
delete mTracks[source][eventID];
83+
mTracks[source][eventID] = nullptr;
84+
}
85+
}
86+
7387
void MCKinematicsReader::loadHeadersForSource(int source) const
7488
{
7589
auto chain = mInputChains[source];

0 commit comments

Comments
 (0)