@@ -112,21 +112,24 @@ void ResidualsContainer::fill(const o2::dataformats::TFIDInfo& ti, const gsl::sp
112112 auto & residVecOut = residuals[sec];
113113 auto & statVecOut = stats[sec];
114114 std::array<unsigned char , TrackResiduals::VoxDim> bvox;
115+ float xPos = param::RowX[residIn.row ];
115116 float yPos = residIn.y * param::MaxY / 0x7fff ;
116117 float zPos = residIn.z * param::MaxZ / 0x7fff ;
117- if (!trackResiduals->findVoxelBin (sec, param::RowX[residIn. row ] , yPos, zPos, bvox)) {
118+ if (!trackResiduals->findVoxelBin (sec, xPos , yPos, zPos, bvox)) {
118119 // we are not inside any voxel
119- LOGF (debug, " Dropping residual in sec(%i), x(%f), y(%f), z(%f)" , sec, param::RowX[residIn. row ] , yPos, zPos);
120+ LOGF (debug, " Dropping residual in sec(%i), x(%f), y(%f), z(%f)" , sec, xPos , yPos, zPos);
120121 continue ;
121122 }
122123 residVecOut.emplace_back (residIn.dy , residIn.dz , residIn.tgSlp , bvox);
123124 auto & stat = statVecOut[trackResiduals->getGlbVoxBin (bvox)];
124125 float & binEntries = stat.nEntries ;
125126 float oldEntries = binEntries++;
126127 float norm = 1 .f / binEntries;
127- // update COG for voxel bvox (don't need to update X here, it stays at the pad row radius)
128- stat.meanPos [TrackResiduals::VoxF] = (stat.meanPos [TrackResiduals::VoxF] * oldEntries + yPos / param::RowX[residIn.row ]) * norm;
129- stat.meanPos [TrackResiduals::VoxZ] = (stat.meanPos [TrackResiduals::VoxZ] * oldEntries + zPos / param::RowX[residIn.row ]) * norm;
128+ // update COG for voxel bvox (update for X only needed in case binning is not per pad row)
129+ float xPosInv = 1 .f / xPos;
130+ stat.meanPos [TrackResiduals::VoxX] = (stat.meanPos [TrackResiduals::VoxX] * oldEntries + xPos) * norm;
131+ stat.meanPos [TrackResiduals::VoxF] = (stat.meanPos [TrackResiduals::VoxF] * oldEntries + yPos * xPosInv) * norm;
132+ stat.meanPos [TrackResiduals::VoxZ] = (stat.meanPos [TrackResiduals::VoxZ] * oldEntries + zPos * xPosInv) * norm;
130133 ++nResidualsTotal;
131134 ++nResidualsInTF;
132135 }
@@ -155,6 +158,7 @@ void ResidualsContainer::merge(ResidualsContainer* prev)
155158 // if there is at least a single entry in either of the containers we need the proper norm
156159 norm /= (statPrev.nEntries + stat.nEntries );
157160 }
161+ stat.meanPos [TrackResiduals::VoxX] = (stat.meanPos [TrackResiduals::VoxX] * stat.nEntries + statPrev.meanPos [TrackResiduals::VoxX] * statPrev.nEntries ) * norm;
158162 stat.meanPos [TrackResiduals::VoxF] = (stat.meanPos [TrackResiduals::VoxF] * stat.nEntries + statPrev.meanPos [TrackResiduals::VoxF] * statPrev.nEntries ) * norm;
159163 stat.meanPos [TrackResiduals::VoxZ] = (stat.meanPos [TrackResiduals::VoxZ] * stat.nEntries + statPrev.meanPos [TrackResiduals::VoxZ] * statPrev.nEntries ) * norm;
160164 stat.nEntries += statPrev.nEntries ;
0 commit comments