@@ -65,7 +65,7 @@ GPUdii() void GPUTPCGMO2Output::Thread<GPUTPCGMO2Output::prepare>(int32_t nBlock
6565 if (!tracks[i].OK ()) {
6666 continue ;
6767 }
68- if (merger. Param (). rec . tpc . dropSecondaryLegsInOutput && tracks[i].MergedLooper ()) {
68+ if (tracks[i].MergedLooper ()) {
6969 continue ;
7070 }
7171
@@ -127,22 +127,23 @@ GPUdii() void GPUTPCGMO2Output::Thread<GPUTPCGMO2Output::output>(int32_t nBlocks
127127 for (int32_t iTmp = get_global_id (0 ); iTmp < nTracks; iTmp += get_global_size (0 )) {
128128 TrackTPC oTrack;
129129 const int32_t i = trackSort[iTmp].x ;
130- auto snpIn = tracks[i].GetParam ().GetSinPhi ();
130+ const auto & track = tracks[i];
131+ auto snpIn = track.GetParam ().GetSinPhi ();
131132 if (snpIn > SNPThresh) {
132133 snpIn = SNPThresh;
133134 } else if (snpIn < -SNPThresh) {
134135 snpIn = -SNPThresh;
135136 }
136- oTrack.set (tracks[i] .GetParam ().GetX (), tracks[i] .GetAlpha (),
137- {tracks[i] .GetParam ().GetY (), tracks[i] .GetParam ().GetZ (), snpIn, tracks[i] .GetParam ().GetDzDs (), tracks[i] .GetParam ().GetQPt ()},
138- {tracks[i] .GetParam ().GetCov (0 ),
139- tracks[i] .GetParam ().GetCov (1 ), tracks[i] .GetParam ().GetCov (2 ),
140- tracks[i] .GetParam ().GetCov (3 ), tracks[i] .GetParam ().GetCov (4 ), tracks[i] .GetParam ().GetCov (5 ),
141- tracks[i] .GetParam ().GetCov (6 ), tracks[i] .GetParam ().GetCov (7 ), tracks[i] .GetParam ().GetCov (8 ), tracks[i] .GetParam ().GetCov (9 ),
142- tracks[i] .GetParam ().GetCov (10 ), tracks[i] .GetParam ().GetCov (11 ), tracks[i] .GetParam ().GetCov (12 ), tracks[i] .GetParam ().GetCov (13 ), tracks[i] .GetParam ().GetCov (14 )});
137+ oTrack.set (track .GetParam ().GetX (), track .GetAlpha (),
138+ {track .GetParam ().GetY (), track .GetParam ().GetZ (), snpIn, track .GetParam ().GetDzDs (), track .GetParam ().GetQPt ()},
139+ {track .GetParam ().GetCov (0 ),
140+ track .GetParam ().GetCov (1 ), track .GetParam ().GetCov (2 ),
141+ track .GetParam ().GetCov (3 ), track .GetParam ().GetCov (4 ), track .GetParam ().GetCov (5 ),
142+ track .GetParam ().GetCov (6 ), track .GetParam ().GetCov (7 ), track .GetParam ().GetCov (8 ), track .GetParam ().GetCov (9 ),
143+ track .GetParam ().GetCov (10 ), track .GetParam ().GetCov (11 ), track .GetParam ().GetCov (12 ), track .GetParam ().GetCov (13 ), track .GetParam ().GetCov (14 )});
143144
144- oTrack.setChi2 (tracks[i] .GetParam ().GetChi2 ());
145- auto & outerPar = tracks[i] .OuterParam ();
145+ oTrack.setChi2 (track .GetParam ().GetChi2 ());
146+ auto & outerPar = track .OuterParam ();
146147 if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR (param.par , dodEdx)) {
147148 if (param.dodEdxEnabled ) {
148149 oTrack.setdEdx (tracksdEdx[i]);
@@ -189,13 +190,13 @@ GPUdii() void GPUTPCGMO2Output::Thread<GPUTPCGMO2Output::output>(int32_t nBlocks
189190 float t1 = 0 , t2 = 0 ;
190191 int32_t sector1 = 0 , sector2 = 0 ;
191192 const o2::tpc::ClusterNativeAccess* GPUrestrict () clusters = merger.GetConstantMem ()->ioPtrs .clustersNative ;
192- for (uint32_t j = 0 ; j < tracks[i] .NClusters (); j++) {
193- if ((trackClusters[tracks[i] .FirstClusterRef () + j].state & flagsReject) || (merger.ClusterAttachment ()[trackClusters[tracks[i] .FirstClusterRef () + j].num ] & flagsRequired) != flagsRequired) {
193+ for (uint32_t j = 0 ; j < track .NClusters (); j++) {
194+ if ((trackClusters[track .FirstClusterRef () + j].state & flagsReject) || (merger.ClusterAttachment ()[trackClusters[track .FirstClusterRef () + j].num ] & flagsRequired) != flagsRequired) {
194195 continue ;
195196 }
196- int32_t clusterIdGlobal = trackClusters[tracks[i] .FirstClusterRef () + j].num ;
197- int32_t sector = trackClusters[tracks[i] .FirstClusterRef () + j].sector ;
198- int32_t globalRow = trackClusters[tracks[i] .FirstClusterRef () + j].row ;
197+ int32_t clusterIdGlobal = trackClusters[track .FirstClusterRef () + j].num ;
198+ int32_t sector = trackClusters[track .FirstClusterRef () + j].sector ;
199+ int32_t globalRow = trackClusters[track .FirstClusterRef () + j].row ;
199200 int32_t clusterIdInRow = clusterIdGlobal - clusters->clusterOffset [sector][globalRow];
200201 clIndArr[nOutCl2] = clusterIdInRow;
201202 sectorIndexArr[nOutCl2] = sector;
@@ -210,25 +211,35 @@ GPUdii() void GPUTPCGMO2Output::Thread<GPUTPCGMO2Output::output>(int32_t nBlocks
210211 }
211212 }
212213
213- bool cce = tracks[i].CCE () && ((sector1 < MAXSECTOR / 2 ) ^ (sector2 < MAXSECTOR / 2 ));
214+ if (track.PrevSegment () >= 0 ) {
215+ const GPUTPCGMMergedTrack* chkTrk = &tracks[track.PrevSegment ()];
216+ while (chkTrk->PrevSegment () >= 0 ) {
217+ chkTrk = &tracks[chkTrk->PrevSegment ()];
218+ }
219+ const auto & firstPrevCluster = trackClusters[chkTrk->FirstClusterRef ()];
220+ t1 = clusters->clustersLinear [firstPrevCluster.num ].getTime ();
221+ sector1 = firstPrevCluster.sector ;
222+ }
223+
224+ bool cce = track.CCE () && ((sector1 < MAXSECTOR / 2 ) ^ (sector2 < MAXSECTOR / 2 ));
214225 float time0 = 0 .f , tFwd = 0 .f , tBwd = 0 .f ;
215226 if (merger.Param ().par .continuousTracking ) {
216- time0 = tracks[i] .GetParam ().GetTZOffset ();
227+ time0 = track .GetParam ().GetTZOffset ();
217228 if (cce) {
218- bool lastSide = trackClusters[tracks[i] .FirstClusterRef ()].sector < MAXSECTOR / 2 ;
229+ bool lastSide = trackClusters[track .FirstClusterRef ()].sector < MAXSECTOR / 2 ;
219230 float delta = 0 .f ;
220- for (uint32_t iCl = 1 ; iCl < tracks[i] .NClusters (); iCl++) {
221- auto & cacl1 = trackClusters[tracks[i] .FirstClusterRef () + iCl];
231+ for (uint32_t iCl = 1 ; iCl < track .NClusters (); iCl++) {
232+ auto & cacl1 = trackClusters[track .FirstClusterRef () + iCl];
222233 if (lastSide ^ (cacl1.sector < MAXSECTOR / 2 )) {
223234 auto & cl1 = clusters->clustersLinear [cacl1.num ];
224- auto & cl2 = clusters->clustersLinear [trackClusters[tracks[i] .FirstClusterRef () + iCl - 1 ].num ];
235+ auto & cl2 = clusters->clustersLinear [trackClusters[track .FirstClusterRef () + iCl - 1 ].num ];
225236 delta = CAMath::Abs (cl1.getTime () - cl2.getTime ()) * 0 .5f ;
226- if (delta < MinDelta) {
227- delta = MinDelta;
228- }
229237 break ;
230238 }
231239 }
240+ if (delta < MinDelta) {
241+ delta = MinDelta;
242+ }
232243 tFwd = tBwd = delta;
233244 } else {
234245 // estimate max/min time increments which still keep track in the physical limits of the TPC
@@ -261,7 +272,7 @@ GPUdii() void GPUTPCGMO2Output::Thread<GPUTPCGMO2Output::output>(int32_t nBlocks
261272 if (cce) {
262273 oTrack.setHasCSideClusters ();
263274 oTrack.setHasASideClusters ();
264- } else if (tracks[i] .CSide ()) {
275+ } else if (track .CSide ()) {
265276 oTrack.setHasCSideClusters ();
266277 } else {
267278 oTrack.setHasASideClusters ();
0 commit comments