From 29796fd436a01a0144aa2f70b0abe9ca17a239ae Mon Sep 17 00:00:00 2001 From: shahoian Date: Thu, 10 Apr 2025 10:59:24 +0200 Subject: [PATCH] Fix for TPC edge clusters in CTF decoding --- .../DataCompression/GPUTPCDecompressionKernels.cxx | 13 +++++++++++++ .../DataCompression/TPCClusterDecompressor.cxx | 13 +++++++++++++ GPU/GPUTracking/Definitions/GPUSettingsList.h | 1 + 3 files changed, 27 insertions(+) diff --git a/GPU/GPUTracking/DataCompression/GPUTPCDecompressionKernels.cxx b/GPU/GPUTracking/DataCompression/GPUTPCDecompressionKernels.cxx index ee1a9c97cc30b..68e45f0c08c32 100644 --- a/GPU/GPUTracking/DataCompression/GPUTPCDecompressionKernels.cxx +++ b/GPU/GPUTracking/DataCompression/GPUTPCDecompressionKernels.cxx @@ -57,6 +57,19 @@ GPUdii() void GPUTPCDecompressionKernels::Thread= decompressor.mInputGPU.nSliceRows) ? 0 : decompressor.mInputGPU.nSliceRowClusters[linearIndex]); TPCClusterDecompressionCore::decompressHits(cmprClusters, offsets[linearIndex], end, clout); + if (processors.param.rec.tpc.clustersEdgeFixDistance > 0.f) { + constexpr GPUTPCGeometry geo; + for (uint32_t k = 0; k < outputAccess->nClusters[iSector][iRow]; k++) { + auto& cluster = buffer[k]; + if (cluster.getFlags() & ClusterNative::flagEdge) { + auto padF = cluster.getPad(); + float distEdge = padF < geo.NPads(iRow) / 2 ? padF : geo.NPads(iRow) - 1 - padF; + if (distEdge > processors.param.rec.tpc.clustersEdgeFixDistance) { + cluster.setFlags(cluster.getFlags() ^ ClusterNative::flagEdge); + } + } + } + } if (processors.param.rec.tpc.clustersShiftTimebins != 0.f) { for (uint32_t k = 0; k < outputAccess->nClusters[iSector][iRow]; k++) { auto& cl = buffer[k]; diff --git a/GPU/GPUTracking/DataCompression/TPCClusterDecompressor.cxx b/GPU/GPUTracking/DataCompression/TPCClusterDecompressor.cxx index 296a203cf070b..cd1717faf178d 100644 --- a/GPU/GPUTracking/DataCompression/TPCClusterDecompressor.cxx +++ b/GPU/GPUTracking/DataCompression/TPCClusterDecompressor.cxx @@ -94,6 +94,19 @@ int32_t TPCClusterDecompressor::decompress(const CompressedClusters* clustersCom ClusterNative* clout = buffer + clusters[i][j].size(); uint32_t end = offsets[i][j] + ((i * GPUCA_ROW_COUNT + j >= clustersCompressed->nSliceRows) ? 0 : clustersCompressed->nSliceRowClusters[i * GPUCA_ROW_COUNT + j]); TPCClusterDecompressionCore::decompressHits(*clustersCompressed, offsets[i][j], end, clout); + if (param.rec.tpc.clustersEdgeFixDistance > 0.f) { + constexpr GPUTPCGeometry geo; + for (uint32_t k = 0; k < clustersNative.nClusters[i][j]; k++) { + auto& cluster = buffer[k]; + if (cluster.getFlags() & ClusterNative::flagEdge) { + auto padF = cluster.getPad(); + float distEdge = padF < geo.NPads(j) / 2 ? padF : geo.NPads(j) - 1 - padF; + if (distEdge > param.rec.tpc.clustersEdgeFixDistance) { + cluster.setFlags(cluster.getFlags() ^ ClusterNative::flagEdge); + } + } + } + } if (param.rec.tpc.clustersShiftTimebins != 0.f) { for (uint32_t k = 0; k < clustersNative.nClusters[i][j]; k++) { auto& cl = buffer[k]; diff --git a/GPU/GPUTracking/Definitions/GPUSettingsList.h b/GPU/GPUTracking/Definitions/GPUSettingsList.h index 34fac6514851c..176fc57df1c90 100644 --- a/GPU/GPUTracking/Definitions/GPUSettingsList.h +++ b/GPU/GPUTracking/Definitions/GPUSettingsList.h @@ -72,6 +72,7 @@ AddOptionRTC(tubeChi2, float, 5.f * 5.f, "", 0, "Max chi2 to mark cluster adjace AddOptionRTC(tubeMaxSize2, float, 2.5f * 2.5f, "", 0, "Square of max tube size (normally derrived from tpcTubeChi2)") AddOptionRTC(clustersShiftTimebins, float, 0, "", 0, "Shift of TPC clusters (applied during CTF cluster decoding)") AddOptionRTC(clustersShiftTimebinsClusterizer, float, 0, "", 0, "Shift of TPC clusters (applied during CTF clusterization)") +AddOptionRTC(clustersEdgeFixDistance, float, 0.f, "", 0, "If >0, revert cluster.flag edge bit distance to edge exceeds this parameter (fixed during CTF decoding)") AddOptionRTC(defaultZOffsetOverR, float, 0.5210953f, "", 0, "Shift of TPC clusters (applied during CTF cluster decoding)") AddOptionRTC(PID_EKrangeMin, float, 0.47f, "", 0, "min P of electron/K BB bands crossing") AddOptionRTC(PID_EKrangeMax, float, 0.57f, "", 0, "max P of electron/K BB bands crossing")