5353using namespace o2 ::gpu;
5454using namespace o2 ::tpc;
5555
56- GPUd () bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict () merger, int32_t iTrk, GPUTPCGMMergedTrackHit* GPUrestrict() clusters, int32_t& GPUrestrict() N, int32_t& GPUrestrict() NTolerated, float& GPUrestrict() Alpha, float maxSinPhi, GPUTPCGMMergedTrack& GPUrestrict() track)
56+ GPUd () bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict () merger, int32_t iTrk, GPUTPCGMMergedTrackHit* GPUrestrict() clusters, int32_t& GPUrestrict() N, int32_t& GPUrestrict() NTolerated, float& GPUrestrict() Alpha, float maxSinPhi, GPUTPCGMMergedTrack& GPUrestrict() track, bool rebuilt )
5757{
5858 static constexpr float kDeg2Rad = M_PI / 180 .f ;
5959 CADEBUG (static constexpr float kSectAngle = 2 * M_PI / 18 .f );
@@ -66,7 +66,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
6666 prop.SetMaterialTPC ();
6767 prop.SetPolynomialField (¶m.polynomialField );
6868 prop.SetMaxSinPhi (maxSinPhi);
69- if (param.rec .tpc .mergerInterpolateErrors ) {
69+ if (param.rec .tpc .mergerInterpolateErrors && !rebuilt ) {
7070 for (int32_t i = 0 ; i < N; i++) {
7171 interpolation.hit [i].errorY = -1 ;
7272 }
@@ -76,12 +76,9 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
7676 const int32_t maxN = N;
7777 int32_t ihitStart = 0 ;
7878 float covYYUpd = 0 .f ;
79- float lastUpdateX = -1 .f ;
80- uint8_t lastRow = 255 ;
81- uint8_t lastSector = 255 ;
8279 float deltaZ = 0 .f ;
8380
84- for (int32_t iWay = 0 ; iWay < nWays; iWay++) {
81+ for (int32_t iWay = rebuilt ? nWays - 1 : 0 ; iWay < nWays; iWay++) { // DR: Unrolling has no performance improvement on GPU, why?
8582 int32_t nMissed = 0 , nMissed2 = 0 ;
8683 float sumInvSqrtCharge = 0 .f ;
8784 int32_t nAvgCharge = 0 ;
@@ -101,12 +98,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
10198 prop.SetFitInProjections (true ); // param.rec.fitInProjections == -1 ? (iWay == 0) : param.rec.fitInProjections); // TODO: Reenable once fixed
10299 prop.SetPropagateBzOnly (param.rec .fitPropagateBzOnly == -1 ? !finalFit : param.rec .fitPropagateBzOnly );
103100 prop.SetMatLUT ((param.rec .useMatLUT && finalFit) ? merger->GetConstantMem ()->calibObjects .matLUT : nullptr );
104- prop.SetTrack (this , iWay ? prop.GetAlpha () : Alpha);
101+ prop.SetTrack (this , iWay && !rebuilt ? prop.GetAlpha () : Alpha);
105102 ConstrainSinPhi (iWay == 0 ? 0 .95f : GPUCA_MAX_SIN_PHI_LOW);
106103 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 ()));
107104
108105 N = 0 ;
109- lastUpdateX = -1 ;
106+ uint8_t lastRow = 255 ;
107+ uint8_t lastSector = 255 ;
108+ float lastUpdateX = -1 ;
110109 const bool inFlyDirection = iWay & 1 ;
111110 const int32_t wayDirection = (iWay & 1 ) ? -1 : 1 ;
112111
@@ -116,9 +115,12 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
116115 lastSector = clusters[ihit].sector ;
117116 }
118117
119- if ((param.rec .tpc .trackFitRejectMode > 0 && nMissed >= param.rec .tpc .trackFitRejectMode ) || nMissed2 >= param.rec .tpc .trackFitMaxRowMissedHard || clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject) {
118+ if ((param.rec .tpc .trackFitRejectMode > 0 && nMissed >= param.rec .tpc .trackFitRejectMode ) || nMissed2 >= param.rec .tpc .trackFitMaxRowMissedHard || ( clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject) || (rebuilt && (clusters[ihit]. state & GPUTPCGMMergedTrackHit::flagHighIncl)) ) {
120119 CADEBUG (printf (" \t Skipping hit %d, %d hits rejected, flag %X\n " , ihit, nMissed, (int32_t )clusters[ihit].state ));
121- if (finalOutInFit && !(clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject)) {
120+ if (rebuilt && (clusters[ihit].state & GPUTPCGMMergedTrackHit::flagHighIncl)) {
121+ NTolerated++;
122+ }
123+ if (finalOutInFit && !(clusters[ihit].state & (GPUTPCGMMergedTrackHit::flagReject | GPUTPCGMMergedTrackHit::flagHighIncl))) {
122124 clusters[ihit].state |= GPUTPCGMMergedTrackHit::flagRejectErr;
123125 }
124126 continue ;
@@ -334,6 +336,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
334336 } else {
335337 deltaZ = 0 .f ;
336338 }
339+
340+ if (param.rec .tpc .rebuildTrackInFit && iWay == nWays - 2 ) {
341+ Alpha = prop.GetAlpha ();
342+ if (ihitStart != 0 ) {
343+ MarkClusters (clusters, 0 , ihitStart - 1 , 1 , GPUTPCGMMergedTrackHit::flagHighIncl);
344+ }
345+ return true ;
346+ }
337347 }
338348 ConstrainSinPhi ();
339349
@@ -885,7 +895,7 @@ GPUd() bool GPUTPCGMTrackParam::CheckNumericalQuality(float overrideCovYY) const
885895 return ok;
886896}
887897
888- GPUdii () void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict () track, int32_t iTrk, GPUTPCGMMerger* GPUrestrict() merger) // VS: GPUd changed to GPUdii. No change in output and no performance penalty.
898+ 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.
889899{
890900 if (!track.OK ()) {
891901 return ;
@@ -899,21 +909,21 @@ GPUdii() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict()
899909 int32_t NTolerated = 0 ; // Clusters not fit but tollerated for track length cut
900910 GPUTPCGMTrackParam t = track.Param ();
901911 float Alpha = track.Alpha ();
902- CADEBUG (int32_t nTrackHitsOld = nTrackHits; float ptOld = t.QPt ());
903- bool ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, GPUCA_MAX_SIN_PHI, track);
904- CADEBUG (printf (" Finished Fit Track %d\n " , iTrk));
905- CADEBUG (printf (" OUTPUT hits %d -> %d+%d = %d, QPt %f -> %f, SP %f, OK %d chi2 %f chi2ndf %f\n " , nTrackHitsOld, nTrackHits, NTolerated, nTrackHits + NTolerated, ptOld, t.QPt (), t.SinPhi (), (int32_t )ok, t.Chi2 (), t.Chi2 () / CAMath::Max (1 , nTrackHits)));
912+ bool ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, GPUCA_MAX_SIN_PHI, track, rebuilt);
913+ 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)));
906914
907915 if (CAMath::Abs (t.QPt ()) < 1 .e -4f ) {
908- t.QPt () = 1 .e -4f ;
916+ t.QPt () = CAMath::Copysign ( 1 .e -4f , t. QPt ()) ;
909917 }
910918
911919 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 ()); });
912920
913921 track.SetOK (ok);
914- track.SetNClustersFitted (nTrackHits);
915922 track.Param () = t;
916923 track.Alpha () = Alpha;
924+ if (!merger->Param ().rec .tpc .rebuildTrackInFit || rebuilt) {
925+ track.SetNClustersFitted (nTrackHits);
926+ }
917927
918928 // if (track.OK()) merger->DebugRefitMergedTrack(track);
919929}
0 commit comments