diff --git a/GPU/GPUTracking/DataCompression/GPUTPCCompressionKernels.cxx b/GPU/GPUTracking/DataCompression/GPUTPCCompressionKernels.cxx index 8f28cbe5563af..27d7058bd8fc2 100644 --- a/GPU/GPUTracking/DataCompression/GPUTPCCompressionKernels.cxx +++ b/GPU/GPUTracking/DataCompression/GPUTPCCompressionKernels.cxx @@ -69,7 +69,7 @@ GPUdii() void GPUTPCCompressionKernels::Threadclusters[hit.slice][hit.row][hit.num - clusters->clusterOffset[hit.slice][hit.row]]; float x = param.tpcGeometry.Row2X(hit.row); - float y = param.tpcGeometry.LinearPad2Y(hit.slice, hit.row, orgCl.getPad()); + float y = track.LinearPad2Y(hit.slice, orgCl.getPad(), param.tpcGeometry.PadWidth(hit.row), param.tpcGeometry.NPads(hit.row)); float z = param.tpcGeometry.LinearTime2Z(hit.slice, orgCl.getTime()); if (nClustersStored) { if ((hit.slice < GPUCA_NSLICES) ^ (lastSlice < GPUCA_NSLICES)) { @@ -115,7 +115,7 @@ GPUdii() void GPUTPCCompressionKernels::Thread= GPUCA_NSLICES / 2) ? -u : u; + } + + GPUd() float LinearY2Pad(int32_t slice, float y, float padWidth, int8_t npads) const + { + const float u = (slice >= GPUCA_NSLICES / 2) ? -y : y; + return u / padWidth + 0.5f * npads; + } + #endif protected: diff --git a/GPU/GPUTracking/DataCompression/TPCClusterDecompressionCore.inc b/GPU/GPUTracking/DataCompression/TPCClusterDecompressionCore.inc index 73352182328d5..6ec5b6bfdfe6d 100644 --- a/GPU/GPUTracking/DataCompression/TPCClusterDecompressionCore.inc +++ b/GPU/GPUTracking/DataCompression/TPCClusterDecompressionCore.inc @@ -113,7 +113,7 @@ class TPCClusterDecompressionCore timeTmp |= 0xFF000000; } time = timeTmp + ClusterNative::packTime(CAMath::Max(0.f, param.tpcGeometry.LinearZ2Time(slice, track.Z() + zOffset))); - float tmpPad = CAMath::Max(0.f, CAMath::Min((float)param.tpcGeometry.NPads(GPUCA_ROW_COUNT - 1), param.tpcGeometry.LinearY2Pad(slice, row, track.Y()))); + float tmpPad = CAMath::Max(0.f, CAMath::Min((float)param.tpcGeometry.NPads(GPUCA_ROW_COUNT - 1), track.LinearY2Pad(slice, track.Y(), param.tpcGeometry.PadWidth(row), param.tpcGeometry.NPads(row)))); pad = cmprClusters.padResA[clusterOffset - trackIndex - 1] + ClusterNative::packPad(tmpPad); time = time & 0xFFFFFF; pad = (uint16_t)pad; @@ -136,7 +136,7 @@ class TPCClusterDecompressionCore pad = cmprClusters.padA[trackIndex]; } const auto cluster = decompressTrackStore(cmprClusters, clusterOffset, slice, row, pad, time, args...); - float y = param.tpcGeometry.LinearPad2Y(slice, row, cluster.getPad()); + float y = track.LinearPad2Y(slice, cluster.getPad(), param.tpcGeometry.PadWidth(row), param.tpcGeometry.NPads(row)); float z = param.tpcGeometry.LinearTime2Z(slice, cluster.getTime()); if (clusterIndex == 0) { zOffset = z; @@ -187,4 +187,4 @@ class TPCClusterDecompressionCore }; } // namespace GPUCA_NAMESPACE::gpu -#endif \ No newline at end of file +#endif diff --git a/GPU/GPUTracking/DataTypes/GPUTPCGeometry.h b/GPU/GPUTracking/DataTypes/GPUTPCGeometry.h index b77961c11c0d4..5d43667f6e92f 100644 --- a/GPU/GPUTracking/DataTypes/GPUTPCGeometry.h +++ b/GPU/GPUTracking/DataTypes/GPUTPCGeometry.h @@ -114,7 +114,11 @@ class GPUTPCGeometry // TODO: Make values constexpr GPUd() float LinearPad2Y(int32_t slice, int32_t row, float pad) const { +#ifdef GPUCA_TPC_GEOMETRY_O2 + const float u = (pad - 0.5f * (mNPads[row] - 1)) * PadWidth(row); +#else const float u = (pad - 0.5f * mNPads[row]) * PadWidth(row); +#endif return (slice >= GPUCA_NSLICES / 2) ? -u : u; } @@ -127,7 +131,11 @@ class GPUTPCGeometry // TODO: Make values constexpr GPUd() float LinearY2Pad(int32_t slice, int32_t row, float y) const { const float u = (slice >= GPUCA_NSLICES / 2) ? -y : y; +#ifdef GPUCA_TPC_GEOMETRY_O2 + return u / PadWidth(row) + 0.5f * (mNPads[row] - 1); +#else return u / PadWidth(row) + 0.5f * mNPads[row]; +#endif } GPUd() static float LinearZ2Time(int32_t slice, float z)