Project
Loading...
Searching...
No Matches
GPUTPCCFPeakFinder.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#include "GPUTPCCFPeakFinder.h"
16
17#include "Array2D.h"
18#include "CfUtils.h"
19#include "PackedCharge.h"
20#include "TPCPadGainCalib.h"
21
22using namespace o2::gpu;
23using namespace o2::gpu::tpccf;
24
25template <>
26GPUdii() void GPUTPCCFPeakFinder::Thread<0>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUSharedMemory& smem, processorType& clusterer)
27{
28 Array2D<PackedCharge> chargeMap(reinterpret_cast<PackedCharge*>(clusterer.mPchargeMap));
29 Array2D<uint8_t> isPeakMap(clusterer.mPpeakMap);
30 findPeaksImpl(get_num_groups(0), get_local_size(0), get_group_id(0), get_local_id(0), smem, chargeMap, clusterer.mPpadIsNoisy, clusterer.mPpositions, clusterer.mPmemory->counters.nPositions, clusterer.Param().rec, *clusterer.GetConstantMem()->calibObjects.tpcPadGain, clusterer.mPisPeak, isPeakMap);
31}
32
33GPUdii() bool GPUTPCCFPeakFinder::isPeak(
34 GPUSharedMemory& smem,
35 Charge q,
36 const ChargePos& pos,
37 uint16_t N,
38 const Array2D<PackedCharge>& chargeMap,
39 const GPUSettingsRec& calib,
40 ChargePos* posBcast,
42{
43 uint16_t ll = get_local_id(0);
44
45 bool belowThreshold = (q <= calib.tpc.cfQMaxCutoff);
46
47 uint16_t lookForPeaks;
48 uint16_t partId = CfUtils::partition<SCRATCH_PAD_WORK_GROUP_SIZE>(
49 smem,
50 ll,
51 belowThreshold,
52 SCRATCH_PAD_WORK_GROUP_SIZE,
53 &lookForPeaks);
54
55 if (partId < lookForPeaks) {
56 posBcast[partId] = pos;
57 }
58 GPUbarrier();
59
60 CfUtils::blockLoad<PackedCharge>(
61 chargeMap,
62 lookForPeaks,
63 SCRATCH_PAD_WORK_GROUP_SIZE,
64 ll,
65 0,
66 N,
67 cfconsts::InnerNeighbors,
68 posBcast,
69 buf);
70
71 if (belowThreshold) {
72 return false;
73 }
74
75 // Ensure q has the same float->int32_t->float conversion error
76 // as values in chargeMap, so identical charges are actually identical
77 q = PackedCharge(q).unpack();
78
79 int32_t idx = N * partId;
80 bool peak = true;
81 peak = peak && buf[idx + 0].unpack() <= q;
82 peak = peak && buf[idx + 1].unpack() <= q;
83 peak = peak && buf[idx + 2].unpack() <= q;
84 peak = peak && buf[idx + 3].unpack() <= q;
85 peak = peak && buf[idx + 4].unpack() < q;
86 peak = peak && buf[idx + 5].unpack() < q;
87 peak = peak && buf[idx + 6].unpack() < q;
88 peak = peak && buf[idx + 7].unpack() < q;
89
90 return peak;
91}
92
93GPUd() void GPUTPCCFPeakFinder::findPeaksImpl(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUSharedMemory& smem,
94 const Array2D<PackedCharge>& chargeMap,
95 const uint8_t* padHasLostBaseline,
96 const ChargePos* positions,
97 SizeT digitnum,
98 const GPUSettingsRec& calib,
99 const TPCPadGainCalib& gainCorrection, // Only used for globalPad() function
100 uint8_t* isPeakPredicate,
101 Array2D<uint8_t>& peakMap)
102{
103 SizeT idx = get_global_id(0);
104
105 // For certain configurations dummy work items are added, so the total
106 // number of work items is dividable by 64.
107 // These dummy items also compute the last digit but discard the result.
108 ChargePos pos = positions[CAMath::Min(idx, (SizeT)(digitnum - 1))];
109 Charge charge = pos.valid() ? chargeMap[pos].unpack() : Charge(0);
110
111 bool hasLostBaseline = padHasLostBaseline[gainCorrection.globalPad(pos.row(), pos.pad())];
112 charge = (hasLostBaseline) ? 0.f : charge;
113
114 uint8_t peak = isPeak(smem, charge, pos, SCRATCH_PAD_SEARCH_N, chargeMap, calib, smem.posBcast, smem.buf);
115
116 // Exit early if dummy. See comment above.
117 bool iamDummy = (idx >= digitnum);
118 if (iamDummy) {
119 return;
120 }
121
122 isPeakPredicate[idx] = peak;
123
124 if (pos.valid()) {
125 peakMap[pos] = (uint8_t(charge > calib.tpc.cfInnerThreshold) << 1) | peak;
126 }
127}
int16_t charge
Definition RawEventData.h:5
#define get_local_size(dim)
#define get_local_id(dim)
#define get_num_groups(dim)
#define GPUbarrier()
#define get_global_id(dim)
#define get_group_id(dim)
GPUdii() void GPUTPCCFPeakFinder
GPUd() void GPUTPCCFPeakFinder
uint16_t pos
Definition RawData.h:3
#define SCRATCH_PAD_SEARCH_N
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition glcorearb.h:2514