@@ -85,26 +85,28 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
8585 float sumInvSqrtCharge = 0 .f ;
8686 int32_t nAvgCharge = 0 ;
8787
88- if (iWay && ((nWays - iWay) & 1 ) == 1 ) {
88+ if (iWay && (iWay & 1 ) == 0 ) {
8989 StoreOuter (&track.OuterParam (), prop.GetAlpha ());
9090 }
9191
9292 int32_t resetT0 = initResetT0 ();
9393 const bool refit = (nWays == 1 || iWay >= 1 );
94+ const bool finalOutInFit = iWay + 2 >= nWays;
95+ const bool finalFit = iWay == nWays - 1 ;
9496 const float maxSinForUpdate = CAMath::Sin (70 .f * kDeg2Rad );
9597
9698 ResetCovariance ();
9799 prop.SetSeedingErrors (!(refit && attempt == 0 ));
98100 prop.SetFitInProjections (true ); // param.rec.fitInProjections == -1 ? (iWay == 0) : param.rec.fitInProjections); // TODO: Reenable once fixed
99- prop.SetPropagateBzOnly (iWay < param.rec .fitPropagateBzOnly );
100- prop.SetMatLUT ((param.rec .useMatLUT && iWay == nWays - 1 ) ? merger->GetConstantMem ()->calibObjects .matLUT : nullptr );
101+ prop.SetPropagateBzOnly (param. rec . fitPropagateBzOnly == - 1 ? !finalFit : param.rec .fitPropagateBzOnly );
102+ prop.SetMatLUT ((param.rec .useMatLUT && finalFit ) ? merger->GetConstantMem ()->calibObjects .matLUT : nullptr );
101103 prop.SetTrack (this , iWay ? prop.GetAlpha () : Alpha);
102104 ConstrainSinPhi (iWay == 0 ? 0 .95f : GPUCA_MAX_SIN_PHI_LOW);
103105 CADEBUG (printf (" Fitting track %d way %d (sector %d, alpha %f) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n " , iTrk, iWay, CAMath::Float2IntRn (prop.GetAlpha () / kSectAngle ) + (mP [1 ] < 0 ? 18 : 0 ), prop.GetAlpha ()));
104106
105107 N = 0 ;
106108 lastUpdateX = -1 ;
107- const bool inFlyDirection = !(( iWay ^ nWays) & 1 ) ;
109+ const bool inFlyDirection = iWay & 1 ;
108110 const int32_t wayDirection = (iWay & 1 ) ? -1 : 1 ;
109111
110112 int32_t goodRows = 0 ;
@@ -116,13 +118,13 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
116118
117119 if ((param.rec .tpc .trackFitRejectMode > 0 && nMissed >= param.rec .tpc .trackFitRejectMode ) || nMissed2 >= param.rec .tpc .trackFitMaxRowMissedHard || clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject) {
118120 CADEBUG (printf (" \t Skipping hit, %d hits rejected, flag %X\n " , nMissed, (int32_t )clusters[ihit].state ));
119- if (iWay + 2 >= nWays && !(clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject)) {
121+ if (finalOutInFit && !(clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject)) {
120122 clusters[ihit].state |= GPUTPCGMMergedTrackHit::flagRejectErr;
121123 }
122124 continue ;
123125 }
124126
125- const bool allowModification = refit && (iWay == 0 || (((nWays - iWay) & 1 ) ? (ihit > = CAMath::Min (maxN / 2 , 30 )) : (ihit < = CAMath::Max (maxN / 2 , maxN - 30 ))));
127+ const bool allowChangeClusters = finalOutInFit && (nWays == 1 || ((iWay & 1 ) ? (ihit < = CAMath::Max (maxN / 2 , maxN - 30 )) : (ihit > = CAMath::Min (maxN / 2 , 30 ))));
126128
127129 int32_t ihitMergeFirst = ihit;
128130 uint8_t clusterState = clusters[ihit].state ;
@@ -137,7 +139,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
137139 // CADEBUG(if ((uint32_t)merger->GetTrackingChain()->mIOPtrs.nMCLabelsTPC > clusters[ihit].num))
138140 // CADEBUG({printf(" MC:"); for (int32_t i = 0; i < 3; i++) {int32_t mcId = merger->GetTrackingChain()->mIOPtrs.mcLabelsTPC[clusters[ihit].num].fClusterID[i].fMCID; if (mcId >= 0) printf(" %d", mcId); } } printf("\n"));
139141 // clang-format on
140- if (MergeDoubleRowClusters (ihit, wayDirection, clusters, merger, prop, xx, yy, zz, maxN, clAlpha, clusterState, allowModification ) == -1 ) {
142+ if (MergeDoubleRowClusters (ihit, wayDirection, clusters, merger, prop, xx, yy, zz, maxN, clAlpha, clusterState, allowChangeClusters ) == -1 ) {
141143 nMissed++;
142144 nMissed2++;
143145 continue ;
@@ -156,9 +158,9 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
156158 // clang-format off
157159 CADEBUG (printf (" \t Sector %2d %11sTrack Alpha %8.3f %s, X %8.3f - Y %8.3f, Z %8.3f - QPt %7.2f (%7.2f), SP %5.2f (%5.2f) %28s --- Cov sY %8.3f sZ %8.3f sSP %8.3f sPt %8.3f - YPt %8.3f\n " , (int32_t )cluster.sector , " " , prop.GetAlpha (), (CAMath::Abs (prop.GetAlpha () - clAlpha) < 0.01 ? " " : " R!" ), mX , mP [0 ], mP [1 ], mP [4 ], prop.GetQPt0 (), mP [2 ], prop.GetSinPhi0 (), " " , sqrtf (mC [0 ]), sqrtf (mC [2 ]), sqrtf (mC [5 ]), sqrtf (mC [14 ]), mC [10 ]));
158160 // clang-format on
159- if (allowModification && lastRow != 255 && CAMath::Abs (cluster.row - lastRow) > 1 ) {
161+ if (allowChangeClusters && lastRow != 255 && CAMath::Abs (cluster.row - lastRow) > 1 ) {
160162 if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR (param.par , dodEdx)) {
161- bool dodEdx = param.dodEdxEnabled && param.rec .tpc .adddEdxSubThresholdClusters && iWay == nWays - 1 && CAMath::Abs (cluster.row - lastRow) == 2 ;
163+ bool dodEdx = param.dodEdxEnabled && param.rec .tpc .adddEdxSubThresholdClusters && finalFit && CAMath::Abs (cluster.row - lastRow) == 2 ;
162164 dodEdx = AttachClustersPropagate (merger, cluster.sector , lastRow, cluster.row , iTrk, track.Leg () == 0 , prop, inFlyDirection, GPUCA_MAX_SIN_PHI, dodEdx);
163165 if (dodEdx) {
164166 dEdx.fillSubThreshold (lastRow - wayDirection);
@@ -206,7 +208,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
206208 }
207209
208210 float uncorrectedY = -1e6f;
209- if (allowModification ) {
211+ if (allowChangeClusters ) {
210212 uncorrectedY = AttachClusters (merger, cluster.sector , cluster.row , iTrk, track.Leg () == 0 , prop);
211213 }
212214
@@ -228,7 +230,9 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
228230 if (mNDF > (int32_t )param.rec .tpc .mergerNonInterpolateRejectMinNDF && (CAMath::Abs (yy - mP [0 ]) > threshold || CAMath::Abs (zz - mP [1 ]) > threshold)) {
229231 retValUpd = GPUTPCGMPropagator::updateErrorClusterRejectedDistance;
230232 } else {
231- int8_t rejectChi2 = attempt ? 0 : ((param.rec .tpc .mergerInterpolateErrors && CAMath::Abs (ihit - ihitMergeFirst) <= 1 ) ? (refit ? (GPUTPCGMPropagator::rejectInterFill + ((nWays - iWay) & 1 )) : 0 ) : (allowModification && goodRows > 5 ));
233+ int8_t rejectChi2 = attempt ? 0 // In second attempt, we do not reject
234+ : (param.rec .tpc .mergerInterpolateErrors && CAMath::Abs (ihit - ihitMergeFirst) <= 1 ) ? (finalOutInFit ? (GPUTPCGMPropagator::rejectInterFill + !(iWay & 1 )) : 0 ) // reject via interpolation
235+ : (allowChangeClusters && goodRows > 5 ); // normal rejection during the fit
232236
233237 float err2Y, err2Z;
234238 const float time = merger->GetConstantMem ()->ioPtrs .clustersNative ? merger->GetConstantMem ()->ioPtrs .clustersNative ->clustersLinear [cluster.num ].getTime () : -1 .f ;
@@ -250,7 +254,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
250254
251255 if (retValInt) {
252256 retValUpd = retValInt;
253- } else if (param.rec .tpc .rejectEdgeClustersInTrackFit && uncorrectedY > -1e6f && param.rejectEdgeClusterByY (uncorrectedY, cluster.row , CAMath::Sqrt (mC [0 ]))) { // uncorrectedY > -1e6f implies allowModification
257+ } else if (param.rec .tpc .rejectEdgeClustersInTrackFit && uncorrectedY > -1e6f && param.rejectEdgeClusterByY (uncorrectedY, cluster.row , CAMath::Sqrt (mC [0 ]))) { // uncorrectedY > -1e6f implies allowChangeClusters
254258 retValUpd = GPUTPCGMPropagator::updateErrorClusterRejectedEdge;
255259 } else {
256260 retValUpd = prop.Update (yy, zz, cluster.row , param, clusterState, rejectChi2, refit, err2Y, err2Z);
@@ -280,7 +284,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
280284 prop.SetTrack (this , prop.GetAlpha ());
281285 }
282286 if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR (param.par , dodEdx)) {
283- if (param.dodEdxEnabled && iWay == nWays - 1 ) { // TODO: Costimize flag to remove, and option to remove double-clusters
287+ if (param.dodEdxEnabled && finalFit ) { // TODO: Costimize flag to remove, and option to remove double-clusters
284288 bool acc = (clusterState & param.rec .tpc .dEdxClusterRejectionFlagMask ) == 0 , accAlt = (clusterState & param.rec .tpc .dEdxClusterRejectionFlagMaskAlt ) == 0 ;
285289 if (acc || accAlt) {
286290 float qtot = 0 , qmax = 0 , pad = 0 , relTime = 0 ;
@@ -308,9 +312,9 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
308312 }
309313 }
310314 } else if (retValUpd >= GPUTPCGMPropagator::updateErrorClusterRejected) { // cluster far away form the track
311- if (allowModification ) {
315+ if (allowChangeClusters ) {
312316 MarkClusters (clusters, ihitMergeFirst, ihit, wayDirection, GPUTPCGMMergedTrackHit::flagRejectDistance);
313- } else if (iWay == nWays - 1 ) {
317+ } else if (finalFit ) {
314318 MarkClusters (clusters, ihitMergeFirst, ihit, wayDirection, GPUTPCGMMergedTrackHit::flagRejectErr);
315319 }
316320 nMissed++;
@@ -319,11 +323,11 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
319323 break ; // bad chi2 for the whole track, stop the fit
320324 }
321325 }
322- if (nWays - iWay <= 2 && !(merger->Param ().rec .tpc .disableRefitAttachment & 4 )) {
326+ if (finalOutInFit && !(merger->Param ().rec .tpc .disableRefitAttachment & 4 )) {
323327 StoreLoopPropagation (merger, lastSector, lastRow, iTrk, lastRow > clusters[(iWay & 1 ) ? (maxN - 1 ) : 0 ].row , prop.GetAlpha ());
324328 CADEBUG (printf (" \t\t STORING %d lastRow %d row %d out %d\n " , iTrk, (int )lastRow, (int )clusters[(iWay & 1 ) ? (maxN - 1 ) : 0 ].row , lastRow > clusters[(iWay & 1 ) ? (maxN - 1 ) : 0 ].row ));
325329 }
326- if (((nWays - iWay) & 1 ) && (iWay != nWays - 1 ) && !track.CCE () && !track.Looper ()) {
330+ if (!( iWay & 1 ) && !finalFit && !track.CCE () && !track.Looper ()) {
327331 ShiftZ (clusters, merger, maxN);
328332 }
329333 }
@@ -340,8 +344,6 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
340344 return false ;
341345 }
342346
343- // 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.
344-
345347 if (param.par .dodEdx && param.dodEdxEnabled ) {
346348 dEdx.computedEdx (merger->MergedTracksdEdx ()[iTrk], param);
347349 if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR (param.rec .tpc , dEdxClusterRejectionFlagMask) != GPUCA_GET_CONSTEXPR (param.rec .tpc , dEdxClusterRejectionFlagMaskAlt)) {
0 commit comments