@@ -75,7 +75,7 @@ void* GPUTRDTracker_t<TRDTRK, PROP>::SetPointersBase(void* base)
7575 // --------------------------------------------------------------------
7676 mMaxThreads = mRec ->GetMaxThreads ();
7777 computePointerWithAlignment (base, mR , kNChambers );
78- computePointerWithAlignment (base, mTrackletIndexArray , kNChambers + 1 );
78+ computePointerWithAlignment (base, mTrackletIndexArray , ( kNChambers + 1 ) * mNMaxCollisions );
7979 computePointerWithAlignment (base, mHypothesis , mNCandidates * mMaxThreads );
8080 computePointerWithAlignment (base, mCandidates , mNCandidates * 2 * mMaxThreads );
8181 return base;
@@ -88,9 +88,9 @@ void* GPUTRDTracker_t<TRDTRK, PROP>::SetPointersTracklets(void* base)
8888 // Allocate memory for tracklets and space points
8989 // (size might change for different events)
9090 // --------------------------------------------------------------------
91- computePointerWithAlignment (base, mTracklets , mNMaxSpacePoints );
92- computePointerWithAlignment (base, mSpacePoints , mNMaxSpacePoints );
93- computePointerWithAlignment (base, mTrackletLabels , 3 * mNMaxSpacePoints );
91+ computePointerWithAlignment (base, mTracklets , mNMaxSpacePoints * mNMaxCollisions );
92+ computePointerWithAlignment (base, mSpacePoints , mNMaxSpacePoints * mNMaxCollisions );
93+ computePointerWithAlignment (base, mTrackletLabels , 3 * mNMaxSpacePoints * mNMaxCollisions );
9494 return base;
9595}
9696
@@ -105,7 +105,7 @@ void* GPUTRDTracker_t<TRDTRK, PROP>::SetPointersTracks(void* base)
105105}
106106
107107template <class TRDTRK , class PROP >
108- GPUTRDTracker_t<TRDTRK , PROP >::GPUTRDTracker_t() : mR (nullptr ), mIsInitialized (false ), mMemoryPermanent (-1 ), mMemoryTracklets (-1 ), mMemoryTracks (-1 ), mNMaxTracks (0 ), mNMaxSpacePoints (0 ), mTracks (nullptr ), mNCandidates (1 ), mNTracks (0 ), mNEvents (0 ), mTracklets (nullptr ), mMaxThreads (100 ), mNTracklets (0 ), mTrackletIndexArray (nullptr ), mHypothesis (nullptr ), mCandidates (nullptr ), mSpacePoints (nullptr ), mTrackletLabels (nullptr ), mGeo (nullptr ), mRPhiA2 (0 ), mRPhiB (0 ), mRPhiC2 (0 ), mDyA2 (0 ), mDyB (0 ), mDyC2 (0 ), mAngleToDyA (0 ), mAngleToDyB (0 ), mAngleToDyC (0 ), mDebugOutput (false ), mRadialOffset (-0.1 ), mMinPt (2 .f), mMaxEta (0 .84f ), mExtraRoadY (2 .f), mRoadZ (18 .f), mMaxChi2 (15 .0f ), mMaxMissingLy (6 ), mChi2Penalty (12 .0f ), mZCorrCoefNRC (1 .4f ), mMCEvent (nullptr ), mDebug (new GPUTRDTrackerDebug<TRDTRK >())
108+ GPUTRDTracker_t<TRDTRK , PROP >::GPUTRDTracker_t() : mR (nullptr ), mIsInitialized (false ), mProcessPerTimeFrame ( false ), mMemoryPermanent (-1 ), mMemoryTracklets (-1 ), mMemoryTracks (-1 ), mNMaxCollisions ( 1 ), mNMaxTracks (0 ), mNMaxSpacePoints (0 ), mTracks (nullptr ), mNCandidates (1 ), mNCollisions ( 1 ), mNTracks (0 ), mNEvents (0 ), mTriggerRecordIndices ( nullptr ), mTriggerRecordTimes ( nullptr ), mTracklets (nullptr ), mMaxThreads (100 ), mNTracklets (0 ), mTrackletIndexArray (nullptr ), mHypothesis (nullptr ), mCandidates (nullptr ), mSpacePoints (nullptr ), mTrackletLabels (nullptr ), mGeo (nullptr ), mRPhiA2 (0 ), mRPhiB (0 ), mRPhiC2 (0 ), mDyA2 (0 ), mDyB (0 ), mDyC2 (0 ), mAngleToDyA (0 ), mAngleToDyB (0 ), mAngleToDyC (0 ), mDebugOutput (false ), mTimeWindow (. 1f ), mRadialOffset (-0.1 ), mMinPt (2 .f), mMaxEta (0 .84f ), mExtraRoadY (2 .f), mRoadZ (18 .f), mMaxChi2 (15 .0f ), mMaxMissingLy (6 ), mChi2Penalty (12 .0f ), mZCorrCoefNRC (1 .4f ), mMCEvent (nullptr ), mDebug (new GPUTRDTrackerDebug<TRDTRK >())
109109{
110110 // --------------------------------------------------------------------
111111 // Default constructor
@@ -208,28 +208,38 @@ void GPUTRDTracker_t<TRDTRK, PROP>::DoTracking(GPUChainTracking* chainTracking)
208208 // --------------------------------------------------------------------
209209
210210 // sort tracklets and fill index array
211- CAAlgo::sort (mTracklets , mTracklets + mNTracklets ); // tracklets are sorted by HCId
212- int * trkltIndexArray = &mTrackletIndexArray [1 ];
213- trkltIndexArray[-1 ] = 0 ;
214- int currDet = 0 ;
215- int nextDet = 0 ;
216- int trkltCounter = 0 ;
217- for (int iTrklt = 0 ; iTrklt < mNTracklets ; ++iTrklt) {
218- if (mTracklets [iTrklt].GetDetector () > currDet) {
219- nextDet = mTracklets [iTrklt].GetDetector ();
220- for (int iDet = currDet; iDet < nextDet; ++iDet) {
221- trkltIndexArray[iDet] = trkltCounter;
211+ for (int iColl = 0 ; iColl < mNCollisions ; ++iColl) {
212+ int nTrklts = 0 ;
213+ if (mProcessPerTimeFrame ) {
214+ // FIXME maybe two nested if statements are not so good in terms of performance?
215+ nTrklts = (iColl < mNCollisions - 1 ) ? mTriggerRecordIndices [iColl + 1 ] - mTriggerRecordIndices [iColl] : mNTracklets - mTriggerRecordIndices [iColl];
216+ } else {
217+ nTrklts = mNTracklets ;
218+ }
219+ GPUTRDTrackletWord* tracklets = (mProcessPerTimeFrame ) ? &(mTracklets [mTriggerRecordIndices [iColl]]) : mTracklets ;
220+ CAAlgo::sort (tracklets, tracklets + nTrklts); // tracklets are sorted by HCId
221+ int * trkltIndexArray = &mTrackletIndexArray [iColl * (kNChambers + 1 ) + 1 ];
222+ trkltIndexArray[-1 ] = 0 ;
223+ int currDet = 0 ;
224+ int nextDet = 0 ;
225+ int trkltCounter = 0 ;
226+ for (int iTrklt = 0 ; iTrklt < nTrklts; ++iTrklt) {
227+ if (tracklets[iTrklt].GetDetector () > currDet) {
228+ nextDet = tracklets[iTrklt].GetDetector ();
229+ for (int iDet = currDet; iDet < nextDet; ++iDet) {
230+ trkltIndexArray[iDet] = trkltCounter;
231+ }
232+ currDet = nextDet;
222233 }
223- currDet = nextDet;
234+ ++trkltCounter;
235+ }
236+ for (int iDet = currDet; iDet <= kNChambers ; ++iDet) {
237+ trkltIndexArray[iDet] = trkltCounter;
224238 }
225- ++trkltCounter;
226- }
227- for (int iDet = currDet; iDet <= kNChambers ; ++iDet) {
228- trkltIndexArray[iDet] = trkltCounter;
229- }
230239
231- if (!CalculateSpacePoints ()) {
232- Error (" DoTracking" , " Space points for at least one chamber could not be calculated" );
240+ if (!CalculateSpacePoints (iColl)) {
241+ GPUError (" Space points for at least one chamber could not be calculated" );
242+ }
233243 }
234244
235245 auto timeStart = std::chrono::high_resolution_clock::now ();
@@ -241,7 +251,7 @@ void GPUTRDTracker_t<TRDTRK, PROP>::DoTracking(GPUChainTracking* chainTracking)
241251#pragma omp parallel for
242252 for (int iTrk = 0 ; iTrk < mNTracks ; ++iTrk) {
243253 if (omp_get_num_threads () > mMaxThreads ) {
244- Error ( " DoTracking " , " number of parallel threads too high, aborting tracking" );
254+ GPUError ( " Number of parallel threads too high, aborting tracking" );
245255 // break statement not possible in OpenMP for loop
246256 iTrk = mNTracks ;
247257 continue ;
@@ -422,7 +432,7 @@ GPUd() int GPUTRDTracker_t<TRDTRK, PROP>::LoadTracklet(const GPUTRDTrackletWord&
422432 // --------------------------------------------------------------------
423433 // Add single tracklet to tracker
424434 // --------------------------------------------------------------------
425- if (mNTracklets >= mNMaxSpacePoints ) {
435+ if (mNTracklets >= mNMaxSpacePoints * mNMaxCollisions ) {
426436 Error (" LoadTracklet" , " Running out of memory for tracklets, skipping tracklet(s). This should actually never happen." );
427437 return 1 ;
428438 }
@@ -448,33 +458,55 @@ GPUd() void GPUTRDTracker_t<TRDTRK, PROP>::DumpTracks()
448458 }
449459}
450460
461+ template <class TRDTRK , class PROP >
462+ GPUd () int GPUTRDTracker_t<TRDTRK, PROP>::GetCollisionID(float trkTime) const
463+ {
464+ for (int iColl = 0 ; iColl < mNCollisions ; ++iColl) {
465+ if (CAMath::Abs (trkTime - mTriggerRecordTimes [iColl]) < mTimeWindow ) {
466+ GPUInfo (" TRD info found from interaction %i at %f for track with time %f" , iColl, mTriggerRecordTimes [iColl], trkTime);
467+ return iColl;
468+ }
469+ }
470+ return -1 ;
471+ }
472+
451473template <class TRDTRK , class PROP >
452474GPUd () void GPUTRDTracker_t<TRDTRK, PROP>::DoTrackingThread(int iTrk, int threadId)
453475{
454476 // --------------------------------------------------------------------
455477 // perform the tracking for one track (must be threadsafe)
456478 // --------------------------------------------------------------------
479+ int collisionId = 0 ;
480+ if (mProcessPerTimeFrame ) {
481+ collisionId = GetCollisionID (mTracks [iTrk].getTime ());
482+ if (collisionId < 0 ) {
483+ GPUInfo (" Did not find TRD data for track with t=%f" , mTracks [iTrk].getTime ());
484+ // no TRD data available for the bunch crossing this track originates from
485+ return ;
486+ }
487+ }
457488 PROP prop (&Param ().polynomialField );
458489 auto trkCopy = mTracks [iTrk];
459490 prop.setTrack (&trkCopy);
460491 prop.setFitInProjections (true );
461- FollowProlongation (&prop, &trkCopy, threadId);
492+ FollowProlongation (&prop, &trkCopy, threadId, collisionId );
462493 mTracks [iTrk] = trkCopy; // copy back the resulting track
463494}
464495
465496template <class TRDTRK , class PROP >
466- GPUd () bool GPUTRDTracker_t<TRDTRK, PROP>::CalculateSpacePoints()
497+ GPUd () bool GPUTRDTracker_t<TRDTRK, PROP>::CalculateSpacePoints(int iCollision )
467498{
468499 // --------------------------------------------------------------------
469500 // Calculates TRD space points in sector tracking coordinates
470501 // from online tracklets
471502 // --------------------------------------------------------------------
472503
473504 bool result = true ;
505+ int idxOffset = iCollision * (kNChambers + 1 );
474506
475507 for (int iDet = 0 ; iDet < kNChambers ; ++iDet) {
476508
477- int nTracklets = mTrackletIndexArray [iDet + 1 ] - mTrackletIndexArray [iDet];
509+ int nTracklets = mTrackletIndexArray [idxOffset + iDet + 1 ] - mTrackletIndexArray [idxOffset + iDet];
478510 if (nTracklets == 0 ) {
479511 continue ;
480512 }
@@ -491,7 +523,7 @@ GPUd() bool GPUTRDTracker_t<TRDTRK, PROP>::CalculateSpacePoints()
491523 float c2 = 1 .f / (1 .f + t2); // cos^2 (tilt)
492524 float sy2 = 0 .1f * 0 .1f ; // sigma_rphi^2, currently assume sigma_rphi = 1 mm
493525
494- for (int trkltIdx = mTrackletIndexArray [iDet]; trkltIdx < mTrackletIndexArray [iDet + 1 ]; ++trkltIdx) {
526+ for (int trkltIdx = mTrackletIndexArray [idxOffset + iDet]; trkltIdx < mTrackletIndexArray [idxOffset + iDet + 1 ]; ++trkltIdx) {
495527 int trkltZbin = mTracklets [trkltIdx].GetZbin ();
496528 float sz2 = pp->GetRowSize (trkltZbin) * pp->GetRowSize (trkltZbin) / 12 .f ; // sigma_z = l_pad/sqrt(12) TODO try a larger z error
497529 My_Float xTrkltDet[3 ] = {0 .f }; // trklt position in chamber coordinates
@@ -523,7 +555,7 @@ GPUd() bool GPUTRDTracker_t<TRDTRK, PROP>::CalculateSpacePoints()
523555}
524556
525557template <class TRDTRK , class PROP >
526- GPUd () bool GPUTRDTracker_t<TRDTRK, PROP>::FollowProlongation(PROP * prop, TRDTRK * t, int threadId)
558+ GPUd () bool GPUTRDTracker_t<TRDTRK, PROP>::FollowProlongation(PROP * prop, TRDTRK * t, int threadId, int collisionId )
527559{
528560 // --------------------------------------------------------------------
529561 // Propagate TPC track layerwise through TRD and pick up closest
@@ -556,6 +588,7 @@ GPUd() bool GPUTRDTracker_t<TRDTRK, PROP>::FollowProlongation(PROP* prop, TRDTRK
556588
557589 int candidateIdxOffset = threadId * 2 * mNCandidates ;
558590 int hypothesisIdxOffset = threadId * mNCandidates ;
591+ int trkltIdxOffset = collisionId * (kNChambers + 1 );
559592
560593 auto trkWork = t;
561594 if (mNCandidates > 1 ) {
@@ -671,7 +704,7 @@ GPUd() bool GPUTRDTracker_t<TRDTRK, PROP>::FollowProlongation(PROP* prop, TRDTRK
671704 }
672705 }
673706 // first propagate track to x of tracklet
674- for (int trkltIdx = mTrackletIndexArray [currDet]; trkltIdx < mTrackletIndexArray [currDet + 1 ]; ++trkltIdx) {
707+ for (int trkltIdx = mTrackletIndexArray [trkltIdxOffset + currDet]; trkltIdx < mTrackletIndexArray [trkltIdxOffset + currDet + 1 ]; ++trkltIdx) {
675708 if (CAMath::Abs (trkWork->getY () - mSpacePoints [trkltIdx].mX [0 ]) > roadY || CAMath::Abs (trkWork->getZ () - mSpacePoints [trkltIdx].mX [1 ]) > roadZ) {
676709 // skip tracklets which are too far away
677710 // although the radii of space points and tracks may differ by ~ few mm the roads are large enough to allow no efficiency loss by this cut
@@ -712,7 +745,7 @@ GPUd() bool GPUTRDTracker_t<TRDTRK, PROP>::FollowProlongation(PROP* prop, TRDTRK
712745 } // end candidate loop
713746
714747#ifdef ENABLE_GPUMC
715- // in case matching tracklet exists in this layer -> store position information for debugging
748+ // in case matching tracklet exists in this layer -> store position information for debugging FIXME: does not yet work for time frames in o2, but here we anyway do not yet have MC labels...
716749 if (matchAvailableAll[iLayer].size () > 0 && mDebugOutput ) {
717750 mDebug ->SetNmatchAvail (matchAvailableAll[iLayer].size (), iLayer);
718751 int realTrkltId = matchAvailableAll[iLayer].at (0 );
0 commit comments