4747using namespace o2 ::gpu;
4848using namespace o2 ::tpc;
4949
50- GPUd () bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger& GPUrestrict () merger, int32_t iTrk, int32_t& GPUrestrict() N, int32_t& GPUrestrict() NTolerated, float& GPUrestrict() Alpha, GPUTPCGMMergedTrack& GPUrestrict() track, bool rebuilt)
50+ GPUd () bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger& GPUrestrict () merger, int32_t iTrk, int32_t& GPUrestrict() N, int32_t& GPUrestrict() NTolerated, float& GPUrestrict() Alpha, GPUTPCGMMergedTrack& GPUrestrict() track, bool rebuilt, bool retryAttempt )
5151{
5252 static constexpr float maxSinPhi = constants::MAX_SIN_PHI;
5353
@@ -91,7 +91,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger& GPUrestrict() merger, int32_
9191 const bool finalFit = iWay == nWays - 1 ;
9292
9393 ResetCovariance ();
94- prop.SetSeedingErrors (!(refit));
94+ prop.SetSeedingErrors (!(refit && !retryAttempt ));
9595 prop.SetFitInProjections (true ); // param.rec.fitInProjections == -1 ? (iWay == 0) : param.rec.fitInProjections); // TODO: Reenable once fixed
9696 prop.SetPropagateBzOnly (param.rec .fitPropagateBzOnly == -1 ? !finalFit : param.rec .fitPropagateBzOnly );
9797 prop.SetMatLUT ((param.rec .useMatLUT && finalFit) ? merger.GetConstantMem ()->calibObjects .matLUT : nullptr );
@@ -239,7 +239,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger& GPUrestrict() merger, int32_
239239 continue ;
240240 }
241241
242- int32_t retValHit = FitHit (merger, iTrk, track, xx, yy, zz, clusterState, clAlpha, iWay, inFlyDirection, deltaZ, lastUpdateX, clusters, prop, inter, dEdx, dEdxAlt, sumInvSqrtCharge, nAvgCharge, ihit, ihitMergeFirst, allowChangeClusters, refit, finalFit, nMissed, nMissed2, resetT0, uncorrectedY);
242+ int32_t retValHit = FitHit (merger, iTrk, track, xx, yy, zz, clusterState, clAlpha, iWay, inFlyDirection, deltaZ, lastUpdateX, clusters, prop, inter, dEdx, dEdxAlt, sumInvSqrtCharge, nAvgCharge, ihit, ihitMergeFirst, allowChangeClusters, refit, finalFit, nMissed, nMissed2, resetT0, uncorrectedY, retryAttempt );
243243 if (retValHit == 0 ) {
244244 DodEdx (dEdx, dEdxAlt, merger, finalFit, ihit, ihitMergeFirst, wayDirection, clusters, clusterState, zz, dEdxSubThresholdRow);
245245 ihitStart = ihit;
@@ -256,7 +256,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger& GPUrestrict() merger, int32_
256256 lastUpdateRow = cluster.row ;
257257 assert (!param.rec .tpc .mergerInterpolateErrors || rebuilt || iWay != nWays - 2 || ihit || interpolationIndex == 0 );
258258 }
259- if (finalOutInFit && !(param.rec .tpc .disableRefitAttachment & 4 ) && lastUpdateRow != 255 ) {
259+ if (finalOutInFit && !(param.rec .tpc .disableRefitAttachment & 4 ) && lastUpdateRow != 255 && !retryAttempt ) {
260260 StoreLoopPropagation (merger, lastSector, lastUpdateRow, iTrk, lastUpdateRow > clusters[(iWay & 1 ) ? (maxN - 1 ) : 0 ].row , prop.GetAlpha ());
261261 CADEBUG (printf (" \t\t STORING %d lastUpdateRow %d row %d out %d\n " , iTrk, (int )lastUpdateRow, (int )clusters[(iWay & 1 ) ? (maxN - 1 ) : 0 ].row , lastUpdateRow > clusters[(iWay & 1 ) ? (maxN - 1 ) : 0 ].row ));
262262 }
@@ -347,7 +347,7 @@ GPUdii() void GPUTPCGMTrackParam::HandleCrossCE(const GPUParam& GPUrestrict() pa
347347 }
348348}
349349
350- GPUdii () int32_t GPUTPCGMTrackParam::FitHit(GPUTPCGMMerger& GPUrestrict () merger, const int32_t iTrk, const GPUTPCGMMergedTrack& GPUrestrict() track, const float xx, const float yy, const float zz, const uint8_t clusterState, const float clAlpha, const int32_t iWay, const bool inFlyDirection, float& GPUrestrict() deltaZ, float& GPUrestrict() lastUpdateX, GPUTPCGMMergedTrackHit* GPUrestrict() clusters, GPUTPCGMPropagator& GPUrestrict() prop, gputpcgmmergertypes::InterpolationErrorHit& GPUrestrict() inter, GPUdEdx& GPUrestrict() dEdx, GPUdEdx& GPUrestrict() dEdxAlt, float& GPUrestrict() sumInvSqrtCharge, int32_t& GPUrestrict() nAvgCharge, const int32_t ihit, const int32_t ihitMergeFirst, const bool allowChangeClusters, const bool refit, const bool finalFit, int32_t& GPUrestrict() nMissed, int32_t& GPUrestrict() nMissed2, int32_t& GPUrestrict() resetT0, float uncorrectedY)
350+ GPUdii () int32_t GPUTPCGMTrackParam::FitHit(GPUTPCGMMerger& GPUrestrict () merger, const int32_t iTrk, const GPUTPCGMMergedTrack& GPUrestrict() track, const float xx, const float yy, const float zz, const uint8_t clusterState, const float clAlpha, const int32_t iWay, const bool inFlyDirection, float& GPUrestrict() deltaZ, float& GPUrestrict() lastUpdateX, GPUTPCGMMergedTrackHit* GPUrestrict() clusters, GPUTPCGMPropagator& GPUrestrict() prop, gputpcgmmergertypes::InterpolationErrorHit& GPUrestrict() inter, GPUdEdx& GPUrestrict() dEdx, GPUdEdx& GPUrestrict() dEdxAlt, float& GPUrestrict() sumInvSqrtCharge, int32_t& GPUrestrict() nAvgCharge, const int32_t ihit, const int32_t ihitMergeFirst, const bool allowChangeClusters, const bool refit, const bool finalFit, int32_t& GPUrestrict() nMissed, int32_t& GPUrestrict() nMissed2, int32_t& GPUrestrict() resetT0, float uncorrectedY, bool retryAttempt )
351351{
352352 const GPUParam& GPUrestrict () param = merger.Param ();
353353 const int32_t nWays = param.rec .tpc .nWays ;
@@ -371,23 +371,25 @@ GPUdii() int32_t GPUTPCGMTrackParam::FitHit(GPUTPCGMMerger& GPUrestrict() merger
371371
372372 prop.GetErr2 (err2Y, err2Z, param, zz, cluster.row , clusterState, cluster.sector , time, invAvgCharge, invCharge);
373373
374- bool rejectChi2 = (clusterState & GPUTPCGMMergedTrackHit::flagReject);
375- if (param.rec .tpc .mergerInterpolateErrors ) {
376- if (iWay == nWays - 2 ) {
377- if (!param.rec .tpc .rebuildTrackInFit ) {
378- if (inter.isValid ()) {
379- retValInt = prop.InterpolateReject (param, yy, zz, clusterState, &inter, err2Y, err2Z, deltaZ);
380- } else {
374+ bool rejectChi2 = !retryAttempt && (clusterState & GPUTPCGMMergedTrackHit::flagReject);
375+ if (!retryAttempt) {
376+ if (param.rec .tpc .mergerInterpolateErrors ) {
377+ if (iWay == nWays - 2 ) {
378+ if (!param.rec .tpc .rebuildTrackInFit ) {
379+ if (inter.isValid ()) {
380+ retValInt = prop.InterpolateReject (param, yy, zz, clusterState, &inter, err2Y, err2Z, deltaZ);
381+ } else {
382+ rejectChi2 = true ;
383+ }
384+ }
385+ } else if (iWay == nWays - 1 ) {
386+ if (param.rec .tpc .mergerInterpolateRejectAlsoOnCurrentPosition && GetNDF () > (int32_t )param.rec .tpc .mergerNonInterpolateRejectMinNDF ) {
381387 rejectChi2 = true ;
382388 }
383389 }
384- } else if (iWay == nWays - 1 ) {
385- if (param.rec .tpc .mergerInterpolateRejectAlsoOnCurrentPosition && GetNDF () > (int32_t )param.rec .tpc .mergerNonInterpolateRejectMinNDF ) {
386- rejectChi2 = true ;
387- }
390+ } else {
391+ rejectChi2 = allowChangeClusters;
388392 }
389- } else {
390- rejectChi2 = allowChangeClusters;
391393 }
392394
393395 if (param.rec .tpc .rejectEdgeClustersInTrackFit && uncorrectedY > -1e6f && param.rejectEdgeClusterByY (uncorrectedY, cluster.row , CAMath::Sqrt (mC [0 ]))) {
@@ -893,6 +895,10 @@ GPUdic(0, 1) void GPUTPCGMTrackParam::StoreLoopPropagation(const GPUTPCGMMerger&
893895
894896GPUdii () void GPUTPCGMTrackParam::PropagateLooper(const GPUTPCGMMerger& GPUrestrict () merger, int32_t loopIdx)
895897{
898+ GPUTPCGMLoopData& data = merger.LoopData ()[loopIdx];
899+ if (!merger.MergedTracks ()[data.track ].OK ()) {
900+ return ;
901+ }
896902 GPUTPCGMPropagator prop;
897903 prop.SetMaterialTPC ();
898904 prop.SetPolynomialField (&merger.Param ().polynomialField );
@@ -902,7 +908,6 @@ GPUdii() void GPUTPCGMTrackParam::PropagateLooper(const GPUTPCGMMerger& GPUrestr
902908 prop.SetFitInProjections (true );
903909 prop.SetPropagateBzOnly (false );
904910
905- GPUTPCGMLoopData& data = merger.LoopData ()[loopIdx];
906911 prop.SetTrack (&data.param , data.alpha );
907912 if (merger.Param ().rec .tpc .looperFollowMode == 1 ) {
908913 data.param .AttachClustersLooperFollow (merger, prop, data.sector , data.track , data.outwards );
@@ -1141,7 +1146,7 @@ GPUd() bool GPUTPCGMTrackParam::CheckNumericalQuality(float overrideCovYY) const
11411146 return ok;
11421147}
11431148
1144- GPUdii () void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict () track, int32_t iTrk, GPUTPCGMMerger& GPUrestrict() merger, bool rebuilt) // VS: GPUd changed to GPUdii. No change in output and no performance penalty.
1149+ GPUdii () void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict () track, int32_t iTrk, GPUTPCGMMerger& GPUrestrict() merger, bool rebuilt, bool retryAttempt)
11451150{
11461151 if (!track.OK ()) {
11471152 return ;
@@ -1153,16 +1158,29 @@ GPUdii() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict()
11531158 int32_t NTolerated = 0 ; // Clusters not fit but tollerated for track length cut
11541159 GPUTPCGMTrackParam t = track.Param ();
11551160 float Alpha = track.Alpha ();
1156- bool ok = t.Fit (merger, iTrk, nTrackHits, NTolerated, Alpha, track, rebuilt);
1161+ bool ok = t.Fit (merger, iTrk, nTrackHits, NTolerated, Alpha, track, rebuilt, retryAttempt );
11571162 CADEBUG (if (!merger.Param ().rec .tpc .rebuildTrackInFit || rebuilt) printf (" Finished Fit Track %7d --- OUTPUT hits %d -> %d+%d = %d, QPt %f -> %f, SP %f, OK %d chi2 %f chi2ndf %f\n " , iTrk, track.NClusters (), nTrackHits, NTolerated, nTrackHits + NTolerated, track.GetParam ().GetQPt (), t.QPt (), t.SinPhi (), (int32_t )ok, t.Chi2 (), t.Chi2 () / CAMath::Max (1 , nTrackHits)));
11581163
1164+ if (!ok && (!merger.Param ().rec .tpc .rebuildTrackInFit || rebuilt) && !retryAttempt && merger.Param ().rec .tpc .retryRefit ) {
1165+ for (uint32_t i = 0 ; i < track.NClusters (); i++) {
1166+ merger.Clusters ()[track.FirstClusterRef () + i].state &= GPUTPCGMMergedTrackHit::clustererAndSharedFlags;
1167+ }
1168+ CADEBUG (printf (" Track rejected, marking for retry\n " ));
1169+ uint32_t nRefit = CAMath::AtomicAdd (&merger.Memory ()->nRetryRefit , 1u );
1170+ merger.RetryRefitIds ()[nRefit] = iTrk;
1171+ return ;
1172+ }
1173+ if (retryAttempt && (t.mNDF < 10 || t.mChi2 / t.mNDF >= 6 .f )) {
1174+ ok = false ;
1175+ }
1176+
11591177 if (CAMath::Abs (t.QPt ()) < 1 .e -4f ) {
11601178 t.QPt () = CAMath::Copysign (1 .e -4f , t.QPt ());
11611179 }
11621180
11631181 CADEBUG (if (t.GetX () > 250 ) { printf (" ERROR, Track %d at impossible X %f, Pt %f, Looper %d\n " , iTrk, t.GetX (), CAMath::Abs (1 .f / t.QPt ()), (int32_t )merger.MergedTracks ()[iTrk].Looper ()); });
11641182
1165- track.SetOK (ok); // TODO: Should we recover tracks who failed the fit in iWay0/1 for the rebuild?
1183+ track.SetOK (ok);
11661184 if (t.GetNDF () <= 0 && !rebuilt && merger.Param ().rec .tpc .rebuildTrackInFit ) { // TODO: Better handling of NDF<0 tracks, how do we want to do cluster rejection?
11671185 track.Param ().NDF () = 0 ;
11681186 } else {
0 commit comments