4848using namespace o2 ::gpu;
4949using namespace o2 ::tpc;
5050
51- 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)
51+ 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 )
5252{
5353 static constexpr float kDeg2Rad = M_PI / 180 .f ;
5454 CADEBUG (static constexpr float kSectAngle = 2 * M_PI / 18 .f );
@@ -61,7 +61,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
6161 prop.SetMaterialTPC ();
6262 prop.SetPolynomialField (¶m.polynomialField );
6363 prop.SetMaxSinPhi (maxSinPhi);
64- if (param.rec .tpc .mergerInterpolateErrors ) {
64+ if (param.rec .tpc .mergerInterpolateErrors && !rebuilt ) {
6565 for (int32_t i = 0 ; i < N; i++) {
6666 interpolation.hit [i].errorY = -1 ;
6767 }
@@ -71,12 +71,9 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
7171 const int32_t maxN = N;
7272 int32_t ihitStart = 0 ;
7373 float covYYUpd = 0 .f ;
74- float lastUpdateX = -1 .f ;
75- uint8_t lastRow = 255 ;
76- uint8_t lastSector = 255 ;
7774 float deltaZ = 0 .f ;
7875
79- for (int32_t iWay = 0 ; iWay < nWays; iWay++) {
76+ for (int32_t iWay = rebuilt ? nWays - 1 : 0 ; iWay < nWays; iWay++) { // DR: Unrolling has no performance improvement on GPU, why?
8077 int32_t nMissed = 0 , nMissed2 = 0 ;
8178 float sumInvSqrtCharge = 0 .f ;
8279 int32_t nAvgCharge = 0 ;
@@ -96,12 +93,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
9693 prop.SetFitInProjections (true ); // param.rec.fitInProjections == -1 ? (iWay == 0) : param.rec.fitInProjections); // TODO: Reenable once fixed
9794 prop.SetPropagateBzOnly (param.rec .fitPropagateBzOnly == -1 ? !finalFit : param.rec .fitPropagateBzOnly );
9895 prop.SetMatLUT ((param.rec .useMatLUT && finalFit) ? merger->GetConstantMem ()->calibObjects .matLUT : nullptr );
99- prop.SetTrack (this , iWay ? prop.GetAlpha () : Alpha);
96+ prop.SetTrack (this , iWay && !rebuilt ? prop.GetAlpha () : Alpha);
10097 ConstrainSinPhi (iWay == 0 ? 0 .95f : GPUCA_MAX_SIN_PHI_LOW);
10198 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 ()));
10299
103100 N = 0 ;
104- lastUpdateX = -1 ;
101+ uint8_t lastRow = 255 ;
102+ uint8_t lastSector = 255 ;
103+ float lastUpdateX = -1 ;
105104 const bool inFlyDirection = iWay & 1 ;
106105 const int32_t wayDirection = (iWay & 1 ) ? -1 : 1 ;
107106
@@ -111,9 +110,12 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
111110 lastSector = clusters[ihit].sector ;
112111 }
113112
114- if ((param.rec .tpc .trackFitRejectMode > 0 && nMissed >= param.rec .tpc .trackFitRejectMode ) || nMissed2 >= param.rec .tpc .trackFitMaxRowMissedHard || clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject) {
113+ 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)) ) {
115114 CADEBUG (printf (" \t Skipping hit %d, %d hits rejected, flag %X\n " , ihit, nMissed, (int32_t )clusters[ihit].state ));
116- if (finalOutInFit && !(clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject)) {
115+ if (rebuilt && (clusters[ihit].state & GPUTPCGMMergedTrackHit::flagHighIncl)) {
116+ NTolerated++;
117+ }
118+ if (finalOutInFit && !(clusters[ihit].state & (GPUTPCGMMergedTrackHit::flagReject | GPUTPCGMMergedTrackHit::flagHighIncl))) {
117119 clusters[ihit].state |= GPUTPCGMMergedTrackHit::flagRejectErr;
118120 }
119121 continue ;
@@ -328,6 +330,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
328330 } else {
329331 deltaZ = 0 .f ;
330332 }
333+
334+ if (param.rec .tpc .rebuildTrackInFit && iWay == nWays - 2 ) {
335+ Alpha = prop.GetAlpha ();
336+ if (ihitStart != 0 ) {
337+ MarkClusters (clusters, 0 , ihitStart - 1 , 1 , GPUTPCGMMergedTrackHit::flagHighIncl);
338+ }
339+ return true ;
340+ }
331341 }
332342 ConstrainSinPhi ();
333343
@@ -895,7 +905,7 @@ GPUd() bool GPUTPCGMTrackParam::CheckNumericalQuality(float overrideCovYY) const
895905 return ok;
896906}
897907
898- 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.
908+ 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.
899909{
900910 if (!track.OK ()) {
901911 return ;
@@ -909,21 +919,21 @@ GPUdii() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict()
909919 int32_t NTolerated = 0 ; // Clusters not fit but tollerated for track length cut
910920 GPUTPCGMTrackParam t = track.Param ();
911921 float Alpha = track.Alpha ();
912- CADEBUG (int32_t nTrackHitsOld = nTrackHits; float ptOld = t.QPt ());
913- bool ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, GPUCA_MAX_SIN_PHI, track);
914- CADEBUG (printf (" Finished Fit Track %d\n " , iTrk));
915- 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)));
922+ bool ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, GPUCA_MAX_SIN_PHI, track, rebuilt);
923+ 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)));
916924
917925 if (CAMath::Abs (t.QPt ()) < 1 .e -4f ) {
918- t.QPt () = 1 .e -4f ;
926+ t.QPt () = CAMath::Copysign ( 1 .e -4f , t. QPt ()) ;
919927 }
920928
921929 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 ()); });
922930
923931 track.SetOK (ok);
924- track.SetNClustersFitted (nTrackHits);
925932 track.Param () = t;
926933 track.Alpha () = Alpha;
934+ if (!merger->Param ().rec .tpc .rebuildTrackInFit || rebuilt) {
935+ track.SetNClustersFitted (nTrackHits);
936+ }
927937
928938 // if (track.OK()) merger->DebugRefitMergedTrack(track);
929939}
0 commit comments