Skip to content

Commit 9f30127

Browse files
committed
Add TF support to TRD tracker
1 parent 4cbc1eb commit 9f30127

4 files changed

Lines changed: 130 additions & 52 deletions

File tree

GPU/GPUTracking/TRDTracking/GPUTRDInterfaces.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class trackInterface<AliExternalTrackParam> : public AliExternalTrackParam
8080

8181
const My_Float* getPar() const { return GetParameter(); }
8282
const My_Float* getCov() const { return GetCovariance(); }
83+
float getTime() const { return -1.f; }
8384
bool CheckNumericalQuality() const { return true; }
8485

8586
// parameter manipulation
@@ -179,11 +180,16 @@ class trackInterface<o2::dataformats::TrackTPCITS> : public o2::dataformats::Tra
179180
}
180181
}
181182

182-
const float* getPar() { return getParams(); }
183+
const float* getPar() const { return getParams(); }
184+
float getTime() const { return mTime; }
185+
void setTime(float t) { mTime = t; }
183186

184187
bool CheckNumericalQuality() const { return true; }
185188

186189
typedef o2::dataformats::TrackTPCITS baseClass;
190+
191+
private:
192+
float mTime;
187193
};
188194

189195
template <>
@@ -294,6 +300,7 @@ class trackInterface<GPUTPCGMTrackParam> : public GPUTPCGMTrackParam
294300

295301
GPUd() const float* getPar() const { return GetPar(); }
296302
GPUd() const float* getCov() const { return GetCov(); }
303+
GPUd() float getTime() const { return -1.f; }
297304

298305
GPUd() void setAlpha(float alpha) { mAlpha = alpha; }
299306
GPUd() void set(float x, float alpha, const float param[5], const float cov[15])
@@ -338,7 +345,6 @@ class propagatorInterface<GPUTPCGMPropagator> : public GPUTPCGMPropagator
338345
{
339346
//bool ok = PropagateToXAlpha(x, GetAlpha(), true) == 0 ? true : false;
340347
int retVal = PropagateToXAlpha(x, GetAlpha(), true);
341-
printf("Return value of PropagateToXAlpha: %i\n", retVal);
342348
bool ok = (retVal == 0) ? true : false;
343349
ok = mTrack->CheckNumericalQuality();
344350
return ok;

GPU/GPUTracking/TRDTracking/GPUTRDTracker.cxx

Lines changed: 66 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

107107
template <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+
451473
template <class TRDTRK, class PROP>
452474
GPUd() 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

465496
template <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

525557
template <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);

GPU/GPUTracking/TRDTracking/GPUTRDTracker.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,10 @@ class GPUTRDTracker_t : public GPUProcessor
145145
mNTracks++;
146146
return (0);
147147
}
148+
GPUd() int GetCollisionID(float trkTime) const;
148149
GPUd() void DoTrackingThread(int iTrk, int threadId = 0);
149-
GPUd() bool CalculateSpacePoints();
150-
GPUd() bool FollowProlongation(PROP* prop, TRDTRK* t, int threadId);
150+
GPUd() bool CalculateSpacePoints(int iCollision = 0);
151+
GPUd() bool FollowProlongation(PROP* prop, TRDTRK* t, int threadId, int collisionId);
151152
GPUd() float GetPredictedChi2(const My_Float* pTRD, const My_Float* covTRD, const My_Float* pTrk, const My_Float* covTrk) const;
152153
GPUd() int GetDetectorNumber(const float zPos, const float alpha, const int layer) const;
153154
GPUd() bool AdjustSector(PROP* prop, TRDTRK* t, const int layer) const;
@@ -166,7 +167,14 @@ class GPUTRDTracker_t : public GPUProcessor
166167
GPUd() void Quicksort(const int left, const int right, const int size);
167168
GPUd() void InsertHypothesis(Hypothesis hypo, int& nCurrHypothesis, int idxOffset);
168169

170+
// input from TRD trigger record
171+
GPUd() void SetNMaxCollisions(int nColl) { mNMaxCollisions = nColl; } // can this be fixed to a sufficiently large value?
172+
GPUd() void SetNCollisions(int nColl) { mNCollisions = nColl; }
173+
GPUd() void SetTriggerRecordIndices(int* indices) { mTriggerRecordIndices = indices; }
174+
GPUd() void SetTriggerRecordTimes(float* times) { mTriggerRecordTimes = times; }
175+
169176
// settings
177+
GPUd() void SetProcessPerTimeFrame() { mProcessPerTimeFrame = true; }
170178
GPUd() void SetMCEvent(AliMCEvent* mc) { mMCEvent = mc; }
171179
GPUd() void EnableDebugOutput() { mDebugOutput = true; }
172180
GPUd() void SetPtThreshold(float minPt) { mMinPt = minPt; }
@@ -199,15 +207,20 @@ class GPUTRDTracker_t : public GPUProcessor
199207
protected:
200208
float* mR; // radial position of each TRD chamber, alignment taken into account, radial spread within chambers < 7mm
201209
bool mIsInitialized; // flag is set upon initialization
210+
bool mProcessPerTimeFrame; // if true, tracking is done per time frame instead of on a single events basis //FIXME is this needed??
202211
short mMemoryPermanent; // size of permanent memory for the tracker
203212
short mMemoryTracklets; // size of memory for TRD tracklets
204213
short mMemoryTracks; // size of memory for tracks (used for i/o)
214+
int mNMaxCollisions; // max number of collisions to process (per time frame)
205215
int mNMaxTracks; // max number of tracks the tracker can handle (per event)
206216
int mNMaxSpacePoints; // max number of space points hold by the tracker (per event)
207217
TRDTRK* mTracks; // array of trd-updated tracks
208218
int mNCandidates; // max. track hypothesis per layer
219+
int mNCollisions; // number of collisions with TRD tracklet data
209220
int mNTracks; // number of TPC tracks to be matched
210221
int mNEvents; // number of processed events
222+
int* mTriggerRecordIndices; // index of first tracklet for each collision
223+
float* mTriggerRecordTimes; // time in us for each collision
211224
GPUTRDTrackletWord* mTracklets; // array of all tracklets, later sorted by HCId
212225
int mMaxThreads; // maximum number of supported threads
213226
int mNTracklets; // total number of tracklets in event
@@ -229,6 +242,7 @@ class GPUTRDTracker_t : public GPUProcessor
229242
float mAngleToDyC; // parameterization for conversion track angle -> tracklet deflection
230243
/// ---- end error parametrization ----
231244
bool mDebugOutput; // store debug output
245+
float mTimeWindow; // max. deviation of the ITS-TPC track time w.r.t. TRD trigger record time stamp (in us, default is 100 ns)
232246
float mRadialOffset; // due to mis-calibration of t0
233247
float mMinPt; // min pt of TPC tracks for tracking
234248
float mMaxEta; // TPC tracks with higher eta are ignored

0 commit comments

Comments
 (0)