@@ -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
135139inline 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
143144inline MCTrack const * MCKinematicsReader::getTrack (int event, int track) const
@@ -148,9 +149,12 @@ inline MCTrack const* MCKinematicsReader::getTrack(int event, int track) const
148149inline 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
156160inline std::vector<MCTrack> const & MCKinematicsReader::getTracks (int event) const
@@ -195,7 +199,7 @@ inline size_t MCKinematicsReader::getNSources() const
195199inline 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}
0 commit comments