diff --git a/GPU/GPUTracking/dEdx/GPUdEdx.cxx b/GPU/GPUTracking/dEdx/GPUdEdx.cxx index 340463b9ec7f7..7df2cd90dab1f 100644 --- a/GPU/GPUTracking/dEdx/GPUdEdx.cxx +++ b/GPU/GPUTracking/dEdx/GPUdEdx.cxx @@ -19,6 +19,8 @@ using namespace o2::gpu; +static_assert(GPUdEdx::MAX_NCL <= 255); // Must fit in mNClsROC (uint8_t)! + #ifndef GPUCA_GPUCODE_DEVICE GPUd() void GPUdEdx::clear() { diff --git a/GPU/GPUTracking/dEdx/GPUdEdx.h b/GPU/GPUTracking/dEdx/GPUdEdx.h index b711f1a685a4c..758c2a7eabfca 100644 --- a/GPU/GPUTracking/dEdx/GPUdEdx.h +++ b/GPU/GPUTracking/dEdx/GPUdEdx.h @@ -36,6 +36,8 @@ class GPUdEdx GPUd() void fillSubThreshold(int32_t padRow); GPUd() void computedEdx(GPUdEdxInfo& output, const GPUParam& param); + static constexpr size_t MAX_NCL = GPUCA_ROW_COUNT; + private: GPUd() float GetSortTruncMean(GPUCA_PAR_DEDX_STORAGE_TYPE_A* array, int32_t count, int32_t trunclow, int32_t trunchigh); GPUd() void checkSubThresh(int32_t roc); @@ -60,8 +62,6 @@ class GPUdEdx }; #endif - static constexpr int32_t MAX_NCL = GPUCA_ROW_COUNT; // Must fit in mNClsROC (uint8_t)! - GPUCA_PAR_DEDX_STORAGE_TYPE_A mChargeTot[MAX_NCL]; // No need for default, just some memory GPUCA_PAR_DEDX_STORAGE_TYPE_A mChargeMax[MAX_NCL]; // No need for default, just some memory float mSubThreshMinTot = 0.f; @@ -76,7 +76,7 @@ class GPUdEdx GPUdi() void GPUdEdx::checkSubThresh(int32_t roc) { if (roc != mLastROC) { - if (mNSubThresh && mCount + mNSubThresh <= MAX_NCL) { + if (mNSubThresh && mCount + mNSubThresh < MAX_NCL) { for (int32_t i = 0; i < mNSubThresh; i++) { mChargeTot[mCount] = (GPUCA_PAR_DEDX_STORAGE_TYPE_A)(mSubThreshMinTot * scalingFactor::factor + scalingFactor::round); mChargeMax[mCount++] = (GPUCA_PAR_DEDX_STORAGE_TYPE_A)(mSubThreshMinMax * scalingFactor::factor + scalingFactor::round); @@ -94,16 +94,15 @@ GPUdi() void GPUdEdx::checkSubThresh(int32_t roc) GPUdnii() void GPUdEdx::fillCluster(float qtot, float qmax, int32_t padRow, uint8_t sector, float trackSnp, float trackTgl, const GPUCalibObjectsConst& calib, float z, float pad, float relTime) { - if (mCount >= MAX_NCL) { - return; - } - // container containing all the dE/dx corrections auto calibContainer = calib.dEdxCalibContainer; constexpr GPUTPCGeometry geo; const int32_t roc = geo.GetROC(padRow); checkSubThresh(roc); + if (mCount >= MAX_NCL) { + return; + } float snp2 = trackSnp * trackSnp; if (snp2 > GPUCA_MAX_SIN_PHI_LOW) { snp2 = GPUCA_MAX_SIN_PHI_LOW;