Skip to content

Commit 2fad56c

Browse files
committed
Fix for TPC edge clusters in CTF decoding
1 parent 24c97f2 commit 2fad56c

File tree

4 files changed

+36
-3
lines changed

4 files changed

+36
-3
lines changed

GPU/GPUTracking/DataCompression/GPUTPCDecompressionKernels.cxx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ GPUdii() void GPUTPCDecompressionKernels::Thread<GPUTPCDecompressionKernels::ste
4444
CompressedClusters& GPUrestrict() cmprClusters = decompressor.mInputGPU;
4545
ClusterNative* GPUrestrict() clusterBuffer = decompressor.mNativeClustersBuffer;
4646
const ClusterNativeAccess* outputAccess = decompressor.mClusterNativeAccess;
47+
constexpr GPUTPCGeometry geo;
4748
uint32_t* offsets = decompressor.mUnattachedClustersOffsets;
4849
for (int32_t i = get_global_id(0); i < GPUCA_ROW_COUNT * nSectors; i += get_global_size(0)) {
4950
uint32_t iRow = i % GPUCA_ROW_COUNT;
@@ -57,6 +58,18 @@ GPUdii() void GPUTPCDecompressionKernels::Thread<GPUTPCDecompressionKernels::ste
5758
ClusterNative* clout = buffer + decompressor.mNativeClustersIndex[linearIndex];
5859
uint32_t end = offsets[linearIndex] + ((linearIndex >= decompressor.mInputGPU.nSliceRows) ? 0 : decompressor.mInputGPU.nSliceRowClusters[linearIndex]);
5960
TPCClusterDecompressionCore::decompressHits(cmprClusters, offsets[linearIndex], end, clout);
61+
if (processors.param.rec.tpc.clustersEdgeFixDistance > 0.f) {
62+
for (uint32_t k = 0; k < outputAccess->nClusters[iSector][iRow]; k++) {
63+
auto& cluster = buffer[k];
64+
if (cluster.getFlags() & ClusterNative::flagEdge) {
65+
auto padF = cluster.getPad();
66+
float distEdge = padF < geo.NPads(iRow) / 2 ? padF : geo.NPads(iRow) - 1 - padF;
67+
if (distEdge > processors.param.rec.tpc.clustersEdgeFixDistance) {
68+
cluster.setFlags(cluster.getFlags() ^ ClusterNative::flagEdge);
69+
}
70+
}
71+
}
72+
}
6073
if (processors.param.rec.tpc.clustersShiftTimebins != 0.f) {
6174
for (uint32_t k = 0; k < outputAccess->nClusters[iSector][iRow]; k++) {
6275
auto& cl = buffer[k];

GPU/GPUTracking/DataCompression/TPCClusterDecompressionCore.inc

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,14 @@ class TPCClusterDecompressionCore
137137
time = cmprClusters.timeA[trackIndex];
138138
pad = cmprClusters.padA[trackIndex];
139139
}
140-
const auto cluster = decompressTrackStore(cmprClusters, clusterOffset, slice, row, pad, time, args...);
140+
auto cluster = decompressTrackStore(cmprClusters, clusterOffset, slice, row, pad, time, args...);
141+
if ((cluster.getFlags() & ClusterNative::flagEdge) && param.rec.tpc.clustersShiftTimebins != 0.f) {
142+
auto padF = cluster.getPad();
143+
float distEdge = padF < geo.NPads(row) / 2 ? padF : geo.NPads(row) - 1 - padF;
144+
if (distEdge > param.rec.tpc.clustersShiftTimebins) {
145+
cluster.setFlags(cluster.getFlags() ^ ClusterNative::flagEdge);
146+
}
147+
}
141148
float y = track.LinearPad2Y(slice, cluster.getPad(), geo.PadWidth(row), geo.NPads(row));
142149
float z = geo.LinearTime2Z(slice, cluster.getTime());
143150
if (clusterIndex == 0) {
@@ -152,7 +159,7 @@ class TPCClusterDecompressionCore
152159
clusterOffset += cmprClusters.nTrackClusters[trackIndex] - clusterIndex;
153160
}
154161

155-
GPUdi() static const auto& decompressHitsStore(const CompressedClusters& cmprClusters, uint32_t k, uint32_t time, uint16_t pad, ClusterNative*& clusterBuffer)
162+
GPUdi() static auto& decompressHitsStore(const CompressedClusters& cmprClusters, uint32_t k, uint32_t time, uint16_t pad, ClusterNative*& clusterBuffer)
156163
{
157164
return ((*(clusterBuffer++) = ClusterNative(time, cmprClusters.flagsU[k], pad, cmprClusters.sigmaTimeU[k], cmprClusters.sigmaPadU[k], cmprClusters.qMaxU[k], cmprClusters.qTotU[k])));
158165
}
@@ -183,7 +190,6 @@ class TPCClusterDecompressionCore
183190
time = cmprClusters.timeDiffU[k];
184191
pad = cmprClusters.padDiffU[k];
185192
}
186-
decompressHitsStore(cmprClusters, k, time, pad, args...);
187193
}
188194
}
189195
};

GPU/GPUTracking/DataCompression/TPCClusterDecompressor.cxx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ int32_t TPCClusterDecompressor::decompress(const CompressedClusters* clustersCom
8585
}
8686
clustersNative.clustersLinear = clusterBuffer;
8787
clustersNative.setOffsetPtrs();
88+
constexpr GPUTPCGeometry geo;
8889
tbb::parallel_for<uint32_t>(0, NSECTORS, [&](auto i) {
8990
for (uint32_t j = 0; j < GPUCA_ROW_COUNT; j++) {
9091
ClusterNative* buffer = &clusterBuffer[clustersNative.clusterOffset[i][j]];
@@ -94,6 +95,18 @@ int32_t TPCClusterDecompressor::decompress(const CompressedClusters* clustersCom
9495
ClusterNative* clout = buffer + clusters[i][j].size();
9596
uint32_t end = offsets[i][j] + ((i * GPUCA_ROW_COUNT + j >= clustersCompressed->nSliceRows) ? 0 : clustersCompressed->nSliceRowClusters[i * GPUCA_ROW_COUNT + j]);
9697
TPCClusterDecompressionCore::decompressHits(*clustersCompressed, offsets[i][j], end, clout);
98+
if (param.rec.tpc.clustersEdgeFixDistance > 0.f) {
99+
for (uint32_t k = 0; k < clustersNative.nClusters[i][j]; k++) {
100+
auto& cluster = buffer[k];
101+
if (cluster.getFlags() & ClusterNative::flagEdge) {
102+
auto padF = cluster.getPad();
103+
float distEdge = padF < geo.NPads(j) / 2 ? padF : geo.NPads(j) - 1 - padF;
104+
if (distEdge > param.rec.tpc.clustersEdgeFixDistance) {
105+
cluster.setFlags(cluster.getFlags() ^ ClusterNative::flagEdge);
106+
}
107+
}
108+
}
109+
}
97110
if (param.rec.tpc.clustersShiftTimebins != 0.f) {
98111
for (uint32_t k = 0; k < clustersNative.nClusters[i][j]; k++) {
99112
auto& cl = buffer[k];

GPU/GPUTracking/Definitions/GPUSettingsList.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ AddOptionRTC(tubeChi2, float, 5.f * 5.f, "", 0, "Max chi2 to mark cluster adjace
7272
AddOptionRTC(tubeMaxSize2, float, 2.5f * 2.5f, "", 0, "Square of max tube size (normally derrived from tpcTubeChi2)")
7373
AddOptionRTC(clustersShiftTimebins, float, 0, "", 0, "Shift of TPC clusters (applied during CTF cluster decoding)")
7474
AddOptionRTC(clustersShiftTimebinsClusterizer, float, 0, "", 0, "Shift of TPC clusters (applied during CTF clusterization)")
75+
AddOptionRTC(clustersEdgeFixDistance, float, 0.f, "", 0, "If >0, revert cluster.flag edge bit distance to edge exceeds this parameter (fixed during CTF decoding)")
7576
AddOptionRTC(defaultZOffsetOverR, float, 0.5210953f, "", 0, "Shift of TPC clusters (applied during CTF cluster decoding)")
7677
AddOptionRTC(PID_EKrangeMin, float, 0.47f, "", 0, "min P of electron/K BB bands crossing")
7778
AddOptionRTC(PID_EKrangeMax, float, 0.57f, "", 0, "max P of electron/K BB bands crossing")

0 commit comments

Comments
 (0)