Skip to content

Commit dcb767f

Browse files
committed
GPU TPC: Reject clusters with too small radius during refit instead of giving them IFC mask errors
1 parent 1fbc2d0 commit dcb767f

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

GPU/GPUTracking/Definitions/GPUSettingsList.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ AddOptionRTC(cfNoiseSuppressionEpsilonRelative, uint8_t, 76, "", 0, "Cluster Fin
131131
AddOptionRTC(nWays, uint8_t, 3, "", 0, "Do N fit passes in final fit of merger")
132132
AddOptionRTC(nWaysOuter, int8_t, 0, "", 0, "Store outer param")
133133
AddOptionRTC(trackFitRejectMode, int8_t, 5, "", 0, "0: no limit on rejection or missed hits, >0: break after n rejected hits, <0: reject at max -n hits")
134+
AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 0, "", 0, "Reject clusters that get the IFC mask error during refit")
134135
AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128")
135136
AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128")
136137
AddOptionRTC(globalTracking, int8_t, 1, "", 0, "Enable Global Tracking (prolong tracks to adjacent sectors to find short segments)")

GPU/GPUTracking/Merger/GPUTPCGMTrackParam.cxx

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
6868
GPUTPCGMPropagator prop;
6969
gputpcgmmergertypes::InterpolationErrors interpolation;
7070
prop.SetMaterialTPC();
71-
prop.SetPolynomialField(&merger->Param().polynomialField);
71+
prop.SetPolynomialField(&param.polynomialField);
7272
prop.SetMaxSinPhi(maxSinPhi);
7373
prop.SetToyMCEventsFlag(param.par.toyMCEventsFlag);
7474
if ((clusters[0].slice < 18) == (clusters[N - 1].slice < 18)) {
@@ -157,7 +157,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
157157
uint8_t clusterState = clusters[ihit].state;
158158
const float clAlpha = param.Alpha(clusters[ihit].slice);
159159
float xx, yy, zz;
160-
if (merger->Param().par.earlyTpcTransform) {
160+
if (param.par.earlyTpcTransform) {
161161
const float zOffset = (clusters[ihit].slice < 18) == (clusters[0].slice < 18) ? mTZOffset : -mTZOffset;
162162
xx = clustersXYZ[ihit].x;
163163
yy = clustersXYZ[ihit].y;
@@ -177,6 +177,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
177177
continue;
178178
}
179179

180+
if (param.rec.tpc.rejectIFCLowRadiusCluster) {
181+
const float r2 = xx * xx + yy * yy;
182+
const float rmax = (83.5f + param.rec.tpc.sysClusErrorMinDist);
183+
if (r2 < rmax * rmax) {
184+
MarkClusters(clusters, ihitMergeFirst, ihit, wayDirection, GPUTPCGMMergedTrackHit::flagRejectErr);
185+
}
186+
}
187+
180188
const auto& cluster = clusters[ihit];
181189

182190
bool changeDirection = (cluster.leg - lastLeg) & 1;
@@ -212,7 +220,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
212220
continue;
213221
}
214222
} else if (allowModification && lastRow != 255 && CAMath::Abs(cluster.row - lastRow) > 1) {
215-
bool dodEdx = merger->Param().par.dodEdx && merger->Param().dodEdxDownscaled && merger->Param().rec.tpc.adddEdxSubThresholdClusters && iWay == nWays - 1 && CAMath::Abs(cluster.row - lastRow) == 2 && cluster.leg == clusters[maxN - 1].leg;
223+
bool dodEdx = param.par.dodEdx && param.dodEdxDownscaled && param.rec.tpc.adddEdxSubThresholdClusters && iWay == nWays - 1 && CAMath::Abs(cluster.row - lastRow) == 2 && cluster.leg == clusters[maxN - 1].leg;
216224
dodEdx = AttachClustersPropagate(merger, cluster.slice, lastRow, cluster.row, iTrk, cluster.leg == clusters[maxN - 1].leg, prop, inFlyDirection, GPUCA_MAX_SIN_PHI, dodEdx);
217225
if (dodEdx) {
218226
dEdx.fillSubThreshold(lastRow - 1, param);
@@ -323,7 +331,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
323331
}
324332
#endif
325333
GPUCA_DEBUG_STREAMER_CHECK(GPUTPCGMPropagator::DebugStreamerVals debugVals;);
326-
if (merger->Param().rec.tpc.rejectEdgeClustersInTrackFit && uncorrectedY > -1e6f && merger->Param().rejectEdgeClusterByY(uncorrectedY, cluster.row, CAMath::Sqrt(mC[0]))) { // uncorrectedY > -1e6f implies allowModification
334+
if (param.rec.tpc.rejectEdgeClustersInTrackFit && uncorrectedY > -1e6f && param.rejectEdgeClusterByY(uncorrectedY, cluster.row, CAMath::Sqrt(mC[0]))) { // uncorrectedY > -1e6f implies allowModification
327335
retVal = GPUTPCGMPropagator::updateErrorEdgeCluster;
328336
} else {
329337
const float time = merger->GetConstantMem()->ioPtrs.clustersNative ? merger->GetConstantMem()->ioPtrs.clustersNative->clustersLinear[cluster.num].getTime() : -1.f;
@@ -358,11 +366,11 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
358366
ihitStart = ihit;
359367
float dy = mP[0] - prop.Model().Y();
360368
float dz = mP[1] - prop.Model().Z();
361-
if (CAMath::Abs(mP[4]) * merger->Param().qptB5Scaler > 10 && --resetT0 <= 0 && CAMath::Abs(mP[2]) < 0.15f && dy * dy + dz * dz > 1) {
369+
if (CAMath::Abs(mP[4]) * param.qptB5Scaler > 10 && --resetT0 <= 0 && CAMath::Abs(mP[2]) < 0.15f && dy * dy + dz * dz > 1) {
362370
CADEBUG(printf("Reinit linearization\n"));
363371
prop.SetTrack(this, prop.GetAlpha());
364372
}
365-
if (merger->Param().par.dodEdx && merger->Param().dodEdxDownscaled && iWay == nWays - 1 && cluster.leg == clusters[maxN - 1].leg && !(clusterState & GPUTPCGMMergedTrackHit::flagEdge)) {
373+
if (param.par.dodEdx && param.dodEdxDownscaled && iWay == nWays - 1 && cluster.leg == clusters[maxN - 1].leg && !(clusterState & GPUTPCGMMergedTrackHit::flagEdge)) {
366374
float qtot = 0, qmax = 0, pad = 0, relTime = 0;
367375
const int32_t clusterCount = (ihit - ihitMergeFirst) * wayDirection + 1;
368376
for (int32_t iTmp = ihitMergeFirst; iTmp != ihit + wayDirection; iTmp += wayDirection) {
@@ -404,16 +412,16 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
404412
o2::utils::DebugStreamer::instance()->getStreamer("debug_accept_track", "UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName("debug_accept_track").data() << "iTrk=" << iTrk << "outerParam=" << *outerParam << "track=" << this << "ihitStart=" << ihitStart << "\n";
405413
})
406414

407-
if (!(N + NTolerated >= GPUCA_TRACKLET_SELECTOR_MIN_HITS_B5(mP[4] * merger->Param().qptB5Scaler) && 2 * NTolerated <= CAMath::Max(10, N) && CheckNumericalQuality(covYYUpd))) {
415+
if (!(N + NTolerated >= GPUCA_TRACKLET_SELECTOR_MIN_HITS_B5(mP[4] * param.qptB5Scaler) && 2 * NTolerated <= CAMath::Max(10, N) && CheckNumericalQuality(covYYUpd))) {
408416
return false; // TODO: NTolerated should never become that large, check what is going wrong!
409417
}
410-
if (merger->Param().rec.tpc.minNClustersFinalTrack != -1 && N + NTolerated < merger->Param().rec.tpc.minNClustersFinalTrack) {
418+
if (param.rec.tpc.minNClustersFinalTrack != -1 && N + NTolerated < param.rec.tpc.minNClustersFinalTrack) {
411419
return false;
412420
}
413421

414422
// TODO: we have looping tracks here with 0 accepted clusters in the primary leg. In that case we should refit the track using only the primary leg.
415423

416-
if (merger->Param().par.dodEdx && merger->Param().dodEdxDownscaled) {
424+
if (param.par.dodEdx && param.dodEdxDownscaled) {
417425
dEdx.computedEdx(merger->OutputTracksdEdx()[iTrk], param);
418426
}
419427
Alpha = prop.GetAlpha();

0 commit comments

Comments
 (0)