@@ -73,7 +73,7 @@ void TimeFrame<NLayers>::loadROFrameData(gsl::span<const o2::itsmft::ROFRecord>
7373
7474 // check for missing/empty/unset rofs
7575 // the code requires consistent monotonically increasing input without gaps
76- const auto & timing = mROFOverlapTableView .getLayer (layer);
76+ const auto & timing = mROFOverlapTableView .getLayer (layer >= 0 ? layer : 0 );
7777 if (timing.mNROFsTF != rofs.size ()) {
7878 LOGP (fatal, " Received inconsistent number of rofs on layer:{} expected:{} received:{}" , layer, timing.mNROFsTF , rofs.size ());
7979 }
@@ -103,52 +103,82 @@ void TimeFrame<NLayers>::loadROFrameData(gsl::span<const o2::itsmft::ROFRecord>
103103 locXYZ = dict->getClusterCoordinates (c, patt, false );
104104 clusterSize = patt.getNPixels ();
105105 }
106- mClusterSize [layer][clusterId] = std::clamp (clusterSize, 0u , 255u );
106+ mClusterSize [layer >= 0 ? layer : 0 ][clusterId] = std::clamp (clusterSize, 0u , 255u );
107107 auto sensorID = c.getSensorID ();
108108 // Inverse transformation to the local --> tracking
109109 auto trkXYZ = geom->getMatrixT2L (sensorID) ^ locXYZ;
110110 // Transformation to the local --> global
111111 auto gloXYZ = geom->getMatrixL2G (sensorID) * locXYZ;
112- addTrackingFrameInfoToLayer (layer , gloXYZ.x (), gloXYZ.y (), gloXYZ.z (), trkXYZ.x (), geom->getSensorRefAlpha (sensorID),
112+ addTrackingFrameInfoToLayer (lay , gloXYZ.x (), gloXYZ.y (), gloXYZ.z (), trkXYZ.x (), geom->getSensorRefAlpha (sensorID),
113113 std::array<float , 2 >{trkXYZ.y (), trkXYZ.z ()},
114114 std::array<float , 3 >{sigmaY2, sigmaYZ, sigmaZ2});
115115 // / Rotate to the global frame
116- addClusterToLayer (layer, gloXYZ.x (), gloXYZ.y (), gloXYZ.z (), mUnsortedClusters [layer].size ());
117- addClusterExternalIndexToLayer (layer, clusterId);
116+ addClusterToLayer (lay, gloXYZ.x (), gloXYZ.y (), gloXYZ.z (), mUnsortedClusters [lay].size ());
117+ addClusterExternalIndexToLayer (lay, clusterId);
118+ }
119+ // effectively calculating an exclusive sum
120+ if (layer >= 0 ) {
121+ mROFramesClusters [layer][iRof + 1 ] = mUnsortedClusters [layer].size ();
122+ } else {
123+ for (unsigned int iL{0 }; iL < mUnsortedClusters .size (); ++iL) {
124+ mROFramesClusters [iL][iRof + 1 ] = mUnsortedClusters [iL].size ();
125+ }
118126 }
119- mROFramesClusters [layer][iRof + 1 ] = mUnsortedClusters [layer].size (); // effectively calculating an exclusive sum
120127 }
121128
122- if (layer == 1 ) {
129+ if (layer == 1 || layer == - 1 ) {
123130 for (auto i = 0 ; i < mNTrackletsPerCluster .size (); ++i) {
124131 mNTrackletsPerCluster [i].resize (mUnsortedClusters [1 ].size ());
125132 mNTrackletsPerClusterSum [i].resize (mUnsortedClusters [1 ].size () + 1 );
126133 }
127134 }
128135
129136 if (mcLabels != nullptr ) {
130- mClusterLabels [layer] = mcLabels;
137+ mClusterLabels [layer >= 0 ? layer : 0 ] = mcLabels;
131138 } else {
132- mClusterLabels [layer] = nullptr ;
139+ mClusterLabels [layer >= 0 ? layer : 0 ] = nullptr ;
133140 }
134141}
135142
136143template <int NLayers>
137144void TimeFrame<NLayers>::resetROFrameData(int layer)
138145{
139- deepVectorClear (mUnsortedClusters [layer], getMaybeFrameworkHostResource ());
140- deepVectorClear (mTrackingFrameInfo [layer], getMaybeFrameworkHostResource ());
141- deepVectorClear (mClusterExternalIndices [layer], mMemoryPool .get ());
142- clearResizeBoundedVector (mROFramesClusters [layer], mROFOverlapTableView .getLayer (layer).mNROFsTF + 1 , getMaybeFrameworkHostResource ());
146+ if (layer >= 0 ) {
147+ deepVectorClear (mUnsortedClusters [layer], getMaybeFrameworkHostResource ());
148+ deepVectorClear (mTrackingFrameInfo [layer], getMaybeFrameworkHostResource ());
149+ deepVectorClear (mClusterExternalIndices [layer], mMemoryPool .get ());
150+ clearResizeBoundedVector (mROFramesClusters [layer], mROFOverlapTableView .getLayer (layer).mNROFsTF + 1 , getMaybeFrameworkHostResource ());
151+ } else {
152+ for (int iLayer{0 }; iLayer < NLayers; ++iLayer) {
153+ deepVectorClear (mUnsortedClusters [iLayer], getMaybeFrameworkHostResource ());
154+ deepVectorClear (mTrackingFrameInfo [iLayer], getMaybeFrameworkHostResource ());
155+ deepVectorClear (mClusterExternalIndices [iLayer], mMemoryPool .get ());
156+ clearResizeBoundedVector (mROFramesClusters [iLayer], mROFOverlapTableView .getLayer (iLayer).mNROFsTF + 1 , getMaybeFrameworkHostResource ());
157+ }
158+ }
143159}
144160
145161template <int NLayers>
146162void TimeFrame<NLayers>::prepareROFrameData(gsl::span<const itsmft::CompClusterExt> clusters, int layer)
147163{
148- mUnsortedClusters [layer].reserve (clusters.size ());
149- mTrackingFrameInfo [layer].reserve (clusters.size ());
150- mClusterExternalIndices [layer].reserve (clusters.size ());
151- clearResizeBoundedVector (mClusterSize [layer], clusters.size (), mMemoryPool .get ());
164+ if (layer >= 0 ) {
165+ mUnsortedClusters [layer].reserve (clusters.size ());
166+ mTrackingFrameInfo [layer].reserve (clusters.size ());
167+ mClusterExternalIndices [layer].reserve (clusters.size ());
168+ clearResizeBoundedVector (mClusterSize [layer], clusters.size (), mMemoryPool .get ());
169+ } else {
170+ auto * geom = GeometryTGeo::Instance ();
171+ clearResizeBoundedVector (mClusterSize [0 ], clusters.size (), mMemoryPool .get ());
172+ std::array<size_t , NLayers> clusterCountPerLayer{0 };
173+ for (const auto & cls : clusters) {
174+ ++clusterCountPerLayer[geom->getLayer (cls.getChipID ())];
175+ }
176+ for (int iLayer{0 }; iLayer < NLayers; ++iLayer) {
177+ mUnsortedClusters [iLayer].reserve (clusterCountPerLayer[iLayer]);
178+ mTrackingFrameInfo [iLayer].reserve (clusterCountPerLayer[iLayer]);
179+ mClusterExternalIndices [iLayer].reserve (clusterCountPerLayer[iLayer]);
180+ }
181+ }
152182}
153183
154184template <int NLayers>
0 commit comments