From cf1958a196ec23d19a45f9a1a4365c1023c8e7b6 Mon Sep 17 00:00:00 2001 From: shahoian Date: Tue, 21 Jan 2025 16:04:28 +0100 Subject: [PATCH] Fix GPUTPCGeometry LinearPad2Y/Y2Pad methods, define biased ones in GPUTPCCompressionTrackModel --- .../DataCompression/GPUTPCCompressionKernels.cxx | 4 ++-- .../DataCompression/GPUTPCCompressionTrackModel.h | 12 ++++++++++++ .../DataCompression/TPCClusterDecompressionCore.inc | 6 +++--- GPU/GPUTracking/DataTypes/GPUTPCGeometry.h | 8 ++++++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/GPU/GPUTracking/DataCompression/GPUTPCCompressionKernels.cxx b/GPU/GPUTracking/DataCompression/GPUTPCCompressionKernels.cxx index 15888e14eec04..d76b509c67518 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 fcafa34547828..e24aa2e236731 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)