@@ -199,7 +199,12 @@ struct EmcalCorrectionTask {
199199 int runNumber{0 };
200200
201201 static constexpr float TrackNotOnEMCal = -900 .f;
202- static constexpr int kMaxMatchesPerCluster = 20 ; // Maximum number of tracks to match per cluster
202+ static constexpr int MaxMatchesPerCluster = 20 ; // Maximum number of tracks to match per cluster
203+
204+ static constexpr uint MaxClusterPerDFPerClusterizer = 200'000 ; // memory footprint: 13 MB per clusterizer
205+ static constexpr uint MaxAmbClusterPerDFPerClusterizer = 300'000 ; // memory footprint: 19.5 MB per clusterizer
206+ static constexpr uint MaxCellsPerClusterPerDFPerClusterizer = 300'000 ; // memory footprint: 4.8 MB per clusterizer
207+ static constexpr uint MaxCellsPerAmbClusterPerDFPerClusterizer = 450'000 ; // memory footprint: 7.2 MB per clusterizer
203208
204209 // cluster size
205210 size_t nCluster = 0 ;
@@ -414,6 +419,10 @@ struct EmcalCorrectionTask {
414419 void processFull (BcEvSels const & bcs, CollEventSels const & collisions, MyGlobTracks const & tracks, FilteredCells const & cells)
415420 {
416421 LOG (debug) << " Starting process full." ;
422+ clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
423+ clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
424+ clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
425+ clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
417426
418427 int previousCollisionId = 0 ; // Collision ID of the last unique BC. Needed to skip unordered collisions to ensure ordered collisionIds in the cluster table
419428 int nBCsProcessed = 0 ;
@@ -570,6 +579,11 @@ struct EmcalCorrectionTask {
570579 {
571580 LOG (debug) << " Starting process full." ;
572581
582+ clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
583+ clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
584+ clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
585+ clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
586+
573587 int previousCollisionId = 0 ; // Collision ID of the last unique BC. Needed to skip unordered collisions to ensure ordered collisionIds in the cluster table
574588 int nBCsProcessed = 0 ;
575589 int nCellsProcessed = 0 ;
@@ -730,6 +744,13 @@ struct EmcalCorrectionTask {
730744 {
731745 LOG (debug) << " Starting processMCFull." ;
732746
747+ clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
748+ mcclusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
749+ clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
750+ mcclustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
751+ clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
752+ clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
753+
733754 int previousCollisionId = 0 ; // Collision ID of the last unique BC. Needed to skip unordered collisions to ensure ordered collisionIds in the cluster table
734755 int nBCsProcessed = 0 ;
735756 int nCellsProcessed = 0 ;
@@ -918,6 +939,13 @@ struct EmcalCorrectionTask {
918939 {
919940 LOG (debug) << " Starting processMCWithSecondaries." ;
920941
942+ clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
943+ mcclusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
944+ clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
945+ mcclustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
946+ clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
947+ clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
948+
921949 int previousCollisionId = 0 ; // Collision ID of the last unique BC. Needed to skip unordered collisions to ensure ordered collisionIds in the cluster table
922950 int nBCsProcessed = 0 ;
923951 int nCellsProcessed = 0 ;
@@ -1107,6 +1135,12 @@ struct EmcalCorrectionTask {
11071135 void processStandalone (BcEvSels const & bcs, aod::Collisions const & collisions, FilteredCells const & cells)
11081136 {
11091137 LOG (debug) << " Starting process standalone." ;
1138+
1139+ clusters.reserve (MaxClusterPerDFPerClusterizer * mClusterizers .size ());
1140+ clustersAmbiguous.reserve (MaxAmbClusterPerDFPerClusterizer * mClusterizers .size ());
1141+ clustercells.reserve (MaxCellsPerClusterPerDFPerClusterizer * mClusterizers .size ());
1142+ clustercellsambiguous.reserve (MaxCellsPerAmbClusterPerDFPerClusterizer * mClusterizers .size ());
1143+
11101144 int previousCollisionId = 0 ; // Collision ID of the last unique BC. Needed to skip unordered collisions to ensure ordered collisionIds in the cluster table
11111145 int nBCsProcessed = 0 ;
11121146 int nCellsProcessed = 0 ;
@@ -1270,16 +1304,6 @@ struct EmcalCorrectionTask {
12701304 template <typename Collision>
12711305 void fillClusterTable (Collision const & col, math_utils::Point3D<float > const & vertexPos, size_t iClusterizer, const gsl::span<int64_t > cellIndicesBC, MatchResult* indexMapPair = nullptr , const std::vector<int64_t >* trackGlobalIndex = nullptr , MatchResult* indexMapPairSecondaries = nullptr , const std::vector<int64_t >* secondariesGlobalIndex = nullptr )
12721306 {
1273- // average number of cells per cluster, only used the reseve a reasonable amount for the clustercells table
1274- // const size_t nAvgNcells = 3;
1275- // we found a collision, put the clusters into the none ambiguous table
1276- clusters.reserve (nCluster + mAnalysisClusters .size ());
1277- if (!mClusterLabels .empty ()) {
1278- mcclusters.reserve (nCluster + mClusterLabels .size ());
1279- }
1280- // Since reserve triggers a fatal when its too small, it is not save for cells to use it unless we use a really large buffer...
1281- // clustercells.reserve(mAnalysisClusters.size() * nAvgNcells);
1282-
12831307 // get the clusterType once
12841308 const auto clusterType = static_cast <int >(mClusterDefinitions [iClusterizer]);
12851309
@@ -1368,14 +1392,7 @@ struct EmcalCorrectionTask {
13681392 template <typename BC >
13691393 void fillAmbigousClusterTable (BC const & bc, size_t iClusterizer, const gsl::span<int64_t > cellIndicesBC, bool hasCollision)
13701394 {
1371- // average number of cells per cluster, only used the reseve a reasonable amount for the clustercells table
1372- // const size_t nAvgNcells = 3;
13731395 int cellindex = -1 ;
1374- clustersAmbiguous.reserve (mAnalysisClusters .size () + nClusterAmb);
1375- if (mClusterLabels .size () > 0 ) {
1376- mcclustersAmbiguous.reserve (mClusterLabels .size () + nClusterAmb);
1377- }
1378- // clustercellsambiguous.reserve(mAnalysisClusters.size() * nAvgNcells);
13791396 unsigned int iCluster = 0 ;
13801397 float energy = 0 .f ;
13811398 for (const auto & cluster : mAnalysisClusters ) {
@@ -1433,7 +1450,7 @@ struct EmcalCorrectionTask {
14331450 trackGlobalIndex.reserve (nTracksInCol);
14341451 fillTrackInfo<decltype (groupedTracks)>(groupedTracks, trackPhi, trackEta, trackGlobalIndex);
14351452
1436- indexMapPair = matchTracksToCluster (mClusterPhi , mClusterEta , trackPhi, trackEta, maxMatchingDistance, kMaxMatchesPerCluster );
1453+ indexMapPair = matchTracksToCluster (mClusterPhi , mClusterEta , trackPhi, trackEta, maxMatchingDistance, MaxMatchesPerCluster );
14371454 }
14381455
14391456 template <typename Collision>
@@ -1469,7 +1486,7 @@ struct EmcalCorrectionTask {
14691486 trackEta.emplace_back (trackEtaEmcal);
14701487 trackGlobalIndex.emplace_back (track.globalIndex ());
14711488 }
1472- indexMapPair = matchTracksToCluster (mClusterPhi , mClusterEta , trackPhi, trackEta, maxMatchingDistance, kMaxMatchesPerCluster );
1489+ indexMapPair = matchTracksToCluster (mClusterPhi , mClusterEta , trackPhi, trackEta, maxMatchingDistance, MaxMatchesPerCluster );
14731490 }
14741491
14751492 template <typename Tracks>
0 commit comments