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, int32_t attempt, float maxSinPhi, gputpcgmmergertypes::GPUTPCOuterParam* GPUrestrict() outerParam, int8_t leg )
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, int32_t attempt, float maxSinPhi, GPUTPCGMMergedTrack& GPUrestrict() track )
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 ((clusters[ 0 ]. sector < 18 ) == (clusters[N - 1 ]. sector < 18 )) {
69+ if (!track. CCE () && !track. Looper ( )) {
7070 ShiftZ2 (clusters, merger, N);
7171 }
7272 if (param.rec .tpc .mergerInterpolateErrors ) {
@@ -88,9 +88,9 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
8888 float sumInvSqrtCharge = 0 .f ;
8989 int32_t nAvgCharge = 0 ;
9090
91- if (iWay && param.rec .tpc .nWaysOuter && outerParam ) {
91+ if (iWay && param.rec .tpc .nWaysOuter ) {
9292 if (iWay == nWays - 1 ) {
93- StoreOuter (outerParam , prop, 0 );
93+ StoreOuter (&track. OuterParam () , prop, 0 );
9494 }
9595 }
9696
@@ -109,7 +109,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
109109
110110 N = 0 ;
111111 lastUpdateX = -1 ;
112- const bool inFlyDirection = (leg & 1 );
112+ const bool inFlyDirection = (track. Leg () & 1 );
113113 const int32_t wayDirection = (iWay & 1 ) ? -1 : 1 ;
114114
115115 bool noFollowCircle = false , noFollowCircle2 = false ;
@@ -173,7 +173,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
173173 } else if (allowModification && lastRow != 255 && CAMath::Abs (cluster.row - lastRow) > 1 ) {
174174 if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR (param.par , dodEdx)) {
175175 bool dodEdx = param.dodEdxEnabled && param.rec .tpc .adddEdxSubThresholdClusters && iWay == nWays - 1 && CAMath::Abs (cluster.row - lastRow) == 2 ;
176- dodEdx = AttachClustersPropagate (merger, cluster.sector , lastRow, cluster.row , iTrk, leg == 0 , prop, inFlyDirection, GPUCA_MAX_SIN_PHI, dodEdx);
176+ dodEdx = AttachClustersPropagate (merger, cluster.sector , lastRow, cluster.row , iTrk, track. Leg () == 0 , prop, inFlyDirection, GPUCA_MAX_SIN_PHI, dodEdx);
177177 if (dodEdx) {
178178 dEdx.fillSubThreshold (lastRow - wayDirection);
179179 if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR (param.rec .tpc , dEdxClusterRejectionFlagMask) != GPUCA_GET_CONSTEXPR (param.rec .tpc , dEdxClusterRejectionFlagMaskAlt)) {
@@ -244,7 +244,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
244244
245245 float uncorrectedY = -1e6f;
246246 if (allowModification) {
247- uncorrectedY = AttachClusters (merger, cluster.sector , cluster.row , iTrk, leg == 0 , prop);
247+ uncorrectedY = AttachClusters (merger, cluster.sector , cluster.row , iTrk, track. Leg () == 0 , prop);
248248 }
249249
250250 const int32_t err2 = mNDF > 0 && CAMath::Abs (prop.GetSinPhi0 ()) >= maxSinForUpdate;
@@ -361,14 +361,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
361361 break ; // bad chi2 for the whole track, stop the fit
362362 }
363363 }
364- if (((nWays - iWay) & 1 ) && (iWay != nWays - 1 ) && (clusters[ 0 ]. sector < 18 ) == (clusters[maxN - 1 ]. sector < 18 )) {
364+ if (((nWays - iWay) & 1 ) && (iWay != nWays - 1 ) && !track. CCE () && !track. Looper ( )) {
365365 ShiftZ2 (clusters, merger, maxN);
366366 }
367367 }
368368 ConstrainSinPhi ();
369369
370370 GPUCA_DEBUG_STREAMER_CHECK (if (o2::utils::DebugStreamer::checkStream (o2::utils::StreamFlags::streamUpdateTrack, iTrk)) {
371- 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 " ;
371+ o2::utils::DebugStreamer::instance ()->getStreamer (" debug_accept_track" , " UPDATE" ) << o2::utils::DebugStreamer::instance ()->getUniqueTreeName (" debug_accept_track" ).data () << " iTrk=" << iTrk << " outerParam=" << track. OuterParam () << " track=" << this << " ihitStart=" << ihitStart << " \n " ;
372372 })
373373
374374 if (!(N + NTolerated >= GPUCA_TRACKLET_SELECTOR_MIN_HITS_B5 (mP [4 ] * param.qptB5Scaler ) && 2 * NTolerated <= CAMath::Max (10 , N) && CheckNumericalQuality (covYYUpd))) {
@@ -862,30 +862,31 @@ GPUd() void GPUTPCGMTrackParam::ShiftZ(const GPUTPCGMMerger* GPUrestrict() merge
862862 if (!merger->Param ().par .continuousTracking ) {
863863 return ;
864864 }
865- const float r1 = CAMath::Max (0 .0001f , CAMath::Abs (mP [4 ] * merger->Param ().polynomialField .GetNominalBz ()));
866-
867- const float dist2 = mX * mX + mP [0 ] * mP [0 ];
868- const float dist1r2 = dist2 * r1 * r1;
869865 float deltaZ = 0 .f ;
870866 bool beamlineReached = false ;
871- if (dist1r2 < 4 ) {
872- const float alpha = CAMath::ACos (1 - 0 .5f * dist1r2); // Angle of a circle, such that |(cosa, sina) - (1,0)| == dist
873- const float beta = CAMath::ATan2 (mP [0 ], mX );
874- const int32_t comp = mP [2 ] > CAMath::Sin (beta);
875- const float sinab = CAMath::Sin ((comp ? 0 .5f : -0 .5f ) * alpha + beta); // Angle of circle through origin and track position, to be compared to Snp
876- const float res = CAMath::Abs (sinab - mP [2 ]);
877-
878- if (res < 0.2 ) {
879- const float r = 1 .f / r1;
880- const float dS = alpha * r;
881- float z0 = dS * mP [3 ];
882- if (CAMath::Abs (z0) > GPUTPCGeometry::TPCLength ()) {
883- z0 = z0 > 0 ? GPUTPCGeometry::TPCLength () : -GPUTPCGeometry::TPCLength ();
884- }
885- deltaZ = mP [1 ] - z0;
886- beamlineReached = true ;
867+ const float r1 = CAMath::Max (0 .0001f , CAMath::Abs (mP [4 ] * merger->Param ().polynomialField .GetNominalBz ()));
868+ if (r1 < 0.01501 ) { // 100 MeV @ 0.5T ~ 0.66m cutof
869+ const float dist2 = mX * mX + mP [0 ] * mP [0 ];
870+ const float dist1r2 = dist2 * r1 * r1;
871+ if (dist1r2 < 4 ) {
872+ const float alpha = CAMath::ACos (1 - 0 .5f * dist1r2); // Angle of a circle, such that |(cosa, sina) - (1,0)| == dist
873+ const float beta = CAMath::ATan2 (mP [0 ], mX );
874+ const int32_t comp = mP [2 ] > CAMath::Sin (beta);
875+ const float sinab = CAMath::Sin ((comp ? 0 .5f : -0 .5f ) * alpha + beta); // Angle of circle through origin and track position, to be compared to Snp
876+ const float res = CAMath::Abs (sinab - mP [2 ]);
877+
878+ if (res < 0.2 ) {
879+ const float r = 1 .f / r1;
880+ const float dS = alpha * r;
881+ float z0 = dS * mP [3 ];
882+ if (CAMath::Abs (z0) > GPUTPCGeometry::TPCLength ()) {
883+ z0 = z0 > 0 ? GPUTPCGeometry::TPCLength () : -GPUTPCGeometry::TPCLength ();
884+ }
885+ deltaZ = mP [1 ] - z0;
886+ beamlineReached = true ;
887887
888- // printf("X %9.3f Y %9.3f QPt %9.3f R %9.3f --> Alpha %9.3f Snp %9.3f Snab %9.3f Res %9.3f dS %9.3f z0 %9.3f\n", mX, mP[0], mP[4], r, alpha / 3.1415 * 180, mP[2], sinab, res, dS, z0);
888+ // printf("X %9.3f Y %9.3f QPt %9.3f R %9.3f --> Alpha %9.3f Snp %9.3f Snab %9.3f Res %9.3f dS %9.3f z0 %9.3f\n", mX, mP[0], mP[4], r, alpha / 3.1415 * 180, mP[2], sinab, res, dS, z0);
889+ }
889890 }
890891 }
891892
@@ -979,7 +980,7 @@ GPUd() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict() tr
979980 GPUTPCGMTrackParam t = track.Param ();
980981 float Alpha = track.Alpha ();
981982 CADEBUG (int32_t nTrackHitsOld = nTrackHits; float ptOld = t.QPt ());
982- bool ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, attempt, GPUCA_MAX_SIN_PHI, & track. OuterParam (), track. Leg () );
983+ bool ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, attempt, GPUCA_MAX_SIN_PHI, track);
983984 CADEBUG (printf (" Finished Fit Track %d\n " , iTrk));
984985 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)));
985986
@@ -993,7 +994,7 @@ GPUd() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict() tr
993994 NTolerated = 0 ; // Clusters not fit but tollerated for track length cut
994995 t = track.Param ();
995996 Alpha = track.Alpha ();
996- ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, 1 , GPUCA_MAX_SIN_PHI, & track. OuterParam (), track. Leg () );
997+ ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, 1 , GPUCA_MAX_SIN_PHI, track);
997998 } else {
998999 uint32_t nRefit = CAMath::AtomicAdd (&merger->Memory ()->nRetryRefit , 1u );
9991000 merger->RetryRefitIds ()[nRefit] = iTrk;
0 commit comments