2121using namespace o2 ::gpu;
2222using namespace o2 ::gpu::tpccf;
2323
24- GPUd () bool ClusterAccumulator::toNative(const ChargePos& pos, Charge q, tpc::ClusterNative& cn, const GPUParam& param) const
25- {
26- cn.qTot = CAMath::Float2UIntRn (mQtot );
27- if (cn.qTot <= param.rec .tpc .cfQTotCutoff ) {
28- return false ;
29- }
30- cn.qMax = q;
31- if (cn.qMax <= param.rec .tpc .cfQMaxCutoff ) {
32- return false ;
33- }
34- if (mTimeMean < param.rec .tpc .clustersShiftTimebinsClusterizer ) {
35- return false ;
36- }
37- if (q <= param.rec .tpc .cfQMaxCutoffSingleTime && mTimeSigma == 0 ) {
38- return false ;
39- }
40- if (q <= param.rec .tpc .cfQMaxCutoffSinglePad && mPadSigma == 0 ) {
41- return false ;
42- }
43-
44- bool isEdgeCluster = CfUtils::isAtEdge (pos, param.tpcGeometry .NPads (pos.row ()));
45- bool wasSplitInTime = mSplitInTime >= param.rec .tpc .cfMinSplitNum ;
46- bool wasSplitInPad = mSplitInPad >= param.rec .tpc .cfMinSplitNum ;
47- bool isSingleCluster = (mPadSigma == 0 ) || (mTimeSigma == 0 );
48-
49- uint8_t flags = 0 ;
50- flags |= (isEdgeCluster) ? tpc::ClusterNative::flagEdge : 0 ;
51- flags |= (wasSplitInTime) ? tpc::ClusterNative::flagSplitTime : 0 ;
52- flags |= (wasSplitInPad) ? tpc::ClusterNative::flagSplitPad : 0 ;
53- flags |= (isSingleCluster) ? tpc::ClusterNative::flagSingle : 0 ;
54-
55- cn.setTimeFlags (mTimeMean - param.rec .tpc .clustersShiftTimebinsClusterizer , flags);
56- cn.setPad (mPadMean );
57- cn.setSigmaTime (mTimeSigma );
58- cn.setSigmaPad (mPadSigma );
59-
60- return true ;
61- }
62-
6324GPUd () void ClusterAccumulator::update(Charge splitCharge, Delta2 d)
6425{
6526 mQtot += splitCharge;
@@ -97,7 +58,7 @@ GPUd() Charge ClusterAccumulator::updateOuter(PackedCharge charge, Delta2 d)
9758 return q;
9859}
9960
100- GPUd () void ClusterAccumulator::finalize (const ChargePos& pos, Charge q, TPCTime timeOffset , const GPUTPCGeometry& geo, Charge* padBoundaryCharges )
61+ GPUd () bool ClusterAccumulator::toNative (const ChargePos& pos, Charge q, tpc::ClusterNative& cn , const GPUParam& param, TPCTime timeOffset, const Array2D<PackedCharge>& chargeMap )
10162{
10263 mQtot += q;
10364
@@ -113,14 +74,48 @@ GPUd() void ClusterAccumulator::finalize(const ChargePos& pos, Charge q, TPCTime
11374 mPadMean += pad;
11475 mTimeMean += timeOffset + pos.time ();
11576
116- if (CfUtils::isAtEdge (pos, geo.NPads (pos.row ()))) {
77+ bool isEdgeCluster = pos.pad () < 2 || pos.pad () >= param.tpcGeometry .NPads (pos.row ()) - 2 ; // Geometrical edge check, peak within 2 pads of sector edge
78+ if (isEdgeCluster) {
11779 bool leftEdge = (pad < 2 );
118- bool correct = (leftEdge) ? (pad < mPadMean ) : (pad > mPadMean );
119- if (leftEdge && pad == 1 ) { // only check charge at boundary if maximum is at least one pad away from boundary
120- correct = correct && (padBoundaryCharges[0 ] > 0 ); // Only correct if cluster is asymmetric with charge > 0 towards sector boundary, otherwise all charge is found
121- } else if (!leftEdge && pad == (geo.NPads (pos.row ()) - 2 )) {
122- correct = correct && (padBoundaryCharges[1 ] > 0 );
80+ if (leftEdge ? (pad == 1 && chargeMap[pos.delta ({-1 , 0 })].unpack () < 1 ) : (pad == (param.tpcGeometry .NPads (pos.row ()) - 2 ) && chargeMap[pos.delta ({1 , 0 })].unpack () < 1 )) {
81+ isEdgeCluster = false ; // No edge cluster if peak is close to edge but no charge at the edge.
82+ } else if (leftEdge ? (pad < mPadMean ) : (pad > mPadMean )) {
83+ mPadMean = pad; // Correct to peak position if COG is close to middle of pad than peak
12384 }
124- mPadMean = (correct) ? pad : mPadMean ;
12585 }
86+
87+ cn.qTot = CAMath::Float2UIntRn (mQtot );
88+ if (cn.qTot <= param.rec .tpc .cfQTotCutoff ) {
89+ return false ;
90+ }
91+ cn.qMax = q;
92+ if (cn.qMax <= param.rec .tpc .cfQMaxCutoff ) {
93+ return false ;
94+ }
95+ if (mTimeMean < param.rec .tpc .clustersShiftTimebinsClusterizer ) {
96+ return false ;
97+ }
98+ if (q <= param.rec .tpc .cfQMaxCutoffSingleTime && mTimeSigma == 0 ) {
99+ return false ;
100+ }
101+ if (q <= param.rec .tpc .cfQMaxCutoffSinglePad && mPadSigma == 0 ) {
102+ return false ;
103+ }
104+
105+ bool wasSplitInTime = mSplitInTime >= param.rec .tpc .cfMinSplitNum ;
106+ bool wasSplitInPad = mSplitInPad >= param.rec .tpc .cfMinSplitNum ;
107+ bool isSingleCluster = (mPadSigma == 0 ) || (mTimeSigma == 0 );
108+
109+ uint8_t flags = 0 ;
110+ flags |= (isEdgeCluster) ? tpc::ClusterNative::flagEdge : 0 ;
111+ flags |= (wasSplitInTime) ? tpc::ClusterNative::flagSplitTime : 0 ;
112+ flags |= (wasSplitInPad) ? tpc::ClusterNative::flagSplitPad : 0 ;
113+ flags |= (isSingleCluster) ? tpc::ClusterNative::flagSingle : 0 ;
114+
115+ cn.setTimeFlags (mTimeMean - param.rec .tpc .clustersShiftTimebinsClusterizer , flags);
116+ cn.setPad (mPadMean );
117+ cn.setSigmaTime (mTimeSigma );
118+ cn.setSigmaPad (mPadSigma );
119+
120+ return true ;
126121}
0 commit comments