Skip to content

Commit 9403885

Browse files
committed
GPU: Add chi2 output to refit
1 parent c787376 commit 9403885

4 files changed

Lines changed: 55 additions & 36 deletions

File tree

GPU/GPUTracking/Interface/GPUO2InterfaceRefit.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ class GPUTPCO2InterfaceRefit
5050

5151
int RefitTrackAsGPU(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false) { return mRefit.RefitTrackAsGPU(trk, outward, resetCov); }
5252
int RefitTrackAsTrackParCov(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false) { return mRefit.RefitTrackAsTrackParCov(trk, outward, resetCov); }
53-
int RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, bool outward = false, bool resetCov = false) { return mRefit.RefitTrackAsGPU(trk, clusRef, time0, outward, resetCov); }
54-
int RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, bool outward = false, bool resetCov = false) { return mRefit.RefitTrackAsTrackParCov(trk, clusRef, time0, outward, resetCov); }
53+
int RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false) { return mRefit.RefitTrackAsGPU(trk, clusRef, time0, chi2, outward, resetCov); }
54+
int RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false) { return mRefit.RefitTrackAsTrackParCov(trk, clusRef, time0, chi2, outward, resetCov); }
5555
void setGPUTrackFitInProjections(bool v = true);
5656
void setTrackReferenceX(float v);
5757
void setIgnoreErrorsAtTrackEnds(bool v) { mRefit.mIgnoreErrorsOnTrackEnds = v; }

GPU/GPUTracking/Refit/GPUTrackingRefit.cxx

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ void GPUTrackingRefit::initProp<const Propagator*>(const Propagator*& prop)
8989
}
9090

9191
template <class T, class S, class U>
92-
void GPUTrackingRefit::convertTrack(T& trk, const S& trkX, U& prop)
92+
void GPUTrackingRefit::convertTrack(T& trk, const S& trkX, U& prop, float* chi2)
9393
{
9494
trk = trkX;
9595
}
@@ -115,89 +115,103 @@ static void convertTrackParam(TrackParCov& trk, const GPUTPCGMTrackParam& trkX)
115115
}
116116
// Generic
117117
template <>
118-
void GPUTrackingRefit::convertTrack<GPUTPCGMTrackParam, TrackParCov, GPUTPCGMPropagator>(GPUTPCGMTrackParam& trk, const TrackParCov& trkX, GPUTPCGMPropagator& prop)
118+
void GPUTrackingRefit::convertTrack<GPUTPCGMTrackParam, TrackParCov, GPUTPCGMPropagator>(GPUTPCGMTrackParam& trk, const TrackParCov& trkX, GPUTPCGMPropagator& prop, float* chi2)
119119
{
120120
convertTrackParam(trk, trkX);
121121
prop.SetTrack(&trk, trkX.getAlpha());
122122
}
123123
template <>
124-
void GPUTrackingRefit::convertTrack<TrackParCov, GPUTPCGMTrackParam, GPUTPCGMPropagator>(TrackParCov& trk, const GPUTPCGMTrackParam& trkX, GPUTPCGMPropagator& prop)
124+
void GPUTrackingRefit::convertTrack<TrackParCov, GPUTPCGMTrackParam, GPUTPCGMPropagator>(TrackParCov& trk, const GPUTPCGMTrackParam& trkX, GPUTPCGMPropagator& prop, float* chi2)
125125
{
126126
convertTrackParam(trk, trkX);
127127
trk.setAlpha(prop.GetAlpha());
128128
}
129129
// GPUTPCGMMergedTrack input
130130
template <>
131-
void GPUTrackingRefit::convertTrack<TrackParCov, GPUTPCGMMergedTrack, const Propagator*>(TrackParCov& trk, const GPUTPCGMMergedTrack& trkX, const Propagator*& prop)
131+
void GPUTrackingRefit::convertTrack<TrackParCov, GPUTPCGMMergedTrack, const Propagator*>(TrackParCov& trk, const GPUTPCGMMergedTrack& trkX, const Propagator*& prop, float* chi2)
132132
{
133133
initProp(prop);
134134
convertTrackParam(trk, trkX.GetParam());
135135
trk.setAlpha(trkX.GetAlpha());
136+
*chi2 = trkX.GetParam().GetChi2();
136137
}
137138
template <>
138-
void GPUTrackingRefit::convertTrack<GPUTPCGMMergedTrack, TrackParCov, const Propagator*>(GPUTPCGMMergedTrack& trk, const TrackParCov& trkX, const Propagator*& prop)
139+
void GPUTrackingRefit::convertTrack<GPUTPCGMMergedTrack, TrackParCov, const Propagator*>(GPUTPCGMMergedTrack& trk, const TrackParCov& trkX, const Propagator*& prop, float* chi2)
139140
{
140141
convertTrackParam(trk.Param(), trkX);
141142
trk.SetAlpha(trkX.getAlpha());
143+
trk.Param().SetChi2(*chi2);
142144
}
143145
template <>
144-
void GPUTrackingRefit::convertTrack<GPUTPCGMTrackParam, GPUTPCGMMergedTrack, GPUTPCGMPropagator>(GPUTPCGMTrackParam& trk, const GPUTPCGMMergedTrack& trkX, GPUTPCGMPropagator& prop)
146+
void GPUTrackingRefit::convertTrack<GPUTPCGMTrackParam, GPUTPCGMMergedTrack, GPUTPCGMPropagator>(GPUTPCGMTrackParam& trk, const GPUTPCGMMergedTrack& trkX, GPUTPCGMPropagator& prop, float* chi2)
145147
{
146148
initProp(prop);
147149
trk = trkX.GetParam();
148150
prop.SetTrack(&trk, trkX.GetAlpha());
149151
}
150152
template <>
151-
void GPUTrackingRefit::convertTrack<GPUTPCGMMergedTrack, GPUTPCGMTrackParam, GPUTPCGMPropagator>(GPUTPCGMMergedTrack& trk, const GPUTPCGMTrackParam& trkX, GPUTPCGMPropagator& prop)
153+
void GPUTrackingRefit::convertTrack<GPUTPCGMMergedTrack, GPUTPCGMTrackParam, GPUTPCGMPropagator>(GPUTPCGMMergedTrack& trk, const GPUTPCGMTrackParam& trkX, GPUTPCGMPropagator& prop, float* chi2)
152154
{
153155
trk.SetParam(trkX);
154156
trk.SetAlpha(prop.GetAlpha());
155157
}
156158
// TrackTPC input
157159
template <>
158-
void GPUTrackingRefit::convertTrack<TrackParCov, TrackTPC, const Propagator*>(TrackParCov& trk, const TrackTPC& trkX, const Propagator*& prop)
160+
void GPUTrackingRefit::convertTrack<TrackParCov, TrackTPC, const Propagator*>(TrackParCov& trk, const TrackTPC& trkX, const Propagator*& prop, float* chi2)
159161
{
160162
initProp(prop);
161-
convertTrack<TrackParCov, TrackParCov, const Propagator*>(trk, trkX, prop);
163+
convertTrack<TrackParCov, TrackParCov, const Propagator*>(trk, trkX, prop, nullptr);
164+
*chi2 = trkX.getChi2();
162165
}
163166
template <>
164-
void GPUTrackingRefit::convertTrack<TrackTPC, TrackParCov, const Propagator*>(TrackTPC& trk, const TrackParCov& trkX, const Propagator*& prop)
167+
void GPUTrackingRefit::convertTrack<TrackTPC, TrackParCov, const Propagator*>(TrackTPC& trk, const TrackParCov& trkX, const Propagator*& prop, float* chi2)
165168
{
166-
convertTrack<TrackParCov, TrackParCov, const Propagator*>(trk, trkX, prop);
169+
convertTrack<TrackParCov, TrackParCov, const Propagator*>(trk, trkX, prop, nullptr);
170+
trk.setChi2(*chi2);
167171
}
168172
template <>
169-
void GPUTrackingRefit::convertTrack<GPUTPCGMTrackParam, TrackTPC, GPUTPCGMPropagator>(GPUTPCGMTrackParam& trk, const TrackTPC& trkX, GPUTPCGMPropagator& prop)
173+
void GPUTrackingRefit::convertTrack<GPUTPCGMTrackParam, TrackTPC, GPUTPCGMPropagator>(GPUTPCGMTrackParam& trk, const TrackTPC& trkX, GPUTPCGMPropagator& prop, float* chi2)
170174
{
171175
initProp(prop);
172-
convertTrack<GPUTPCGMTrackParam, TrackParCov, GPUTPCGMPropagator>(trk, trkX, prop);
176+
convertTrack<GPUTPCGMTrackParam, TrackParCov, GPUTPCGMPropagator>(trk, trkX, prop, nullptr);
177+
trk.SetChi2(trkX.getChi2());
173178
}
174179
template <>
175-
void GPUTrackingRefit::convertTrack<TrackTPC, GPUTPCGMTrackParam, GPUTPCGMPropagator>(TrackTPC& trk, const GPUTPCGMTrackParam& trkX, GPUTPCGMPropagator& prop)
180+
void GPUTrackingRefit::convertTrack<TrackTPC, GPUTPCGMTrackParam, GPUTPCGMPropagator>(TrackTPC& trk, const GPUTPCGMTrackParam& trkX, GPUTPCGMPropagator& prop, float* chi2)
176181
{
177-
convertTrack<TrackParCov, GPUTPCGMTrackParam, GPUTPCGMPropagator>(trk, trkX, prop);
182+
convertTrack<TrackParCov, GPUTPCGMTrackParam, GPUTPCGMPropagator>(trk, trkX, prop, nullptr);
183+
trk.setChi2(trkX.GetChi2());
178184
}
179185
// TrackParCovWithArgs input
180186
template <>
181-
void GPUTrackingRefit::convertTrack<TrackParCov, GPUTrackingRefit::TrackParCovWithArgs, const Propagator*>(TrackParCov& trk, const GPUTrackingRefit::TrackParCovWithArgs& trkX, const Propagator*& prop)
187+
void GPUTrackingRefit::convertTrack<TrackParCov, GPUTrackingRefit::TrackParCovWithArgs, const Propagator*>(TrackParCov& trk, const GPUTrackingRefit::TrackParCovWithArgs& trkX, const Propagator*& prop, float* chi2)
182188
{
183189
initProp(prop);
184-
convertTrack<TrackParCov, TrackParCov, const Propagator*>(trk, trkX.trk, prop);
190+
convertTrack<TrackParCov, TrackParCov, const Propagator*>(trk, trkX.trk, prop, nullptr);
191+
*chi2 = trkX.chi2 ? *trkX.chi2 : 0.f;
185192
}
186193
template <>
187-
void GPUTrackingRefit::convertTrack<GPUTrackingRefit::TrackParCovWithArgs, TrackParCov, const Propagator*>(GPUTrackingRefit::TrackParCovWithArgs& trk, const TrackParCov& trkX, const Propagator*& prop)
194+
void GPUTrackingRefit::convertTrack<GPUTrackingRefit::TrackParCovWithArgs, TrackParCov, const Propagator*>(GPUTrackingRefit::TrackParCovWithArgs& trk, const TrackParCov& trkX, const Propagator*& prop, float* chi2)
188195
{
189-
convertTrack<TrackParCov, TrackParCov, const Propagator*>(trk.trk, trkX, prop);
196+
convertTrack<TrackParCov, TrackParCov, const Propagator*>(trk.trk, trkX, prop, nullptr);
197+
if (trk.chi2) {
198+
*trk.chi2 = *chi2;
199+
}
190200
}
191201
template <>
192-
void GPUTrackingRefit::convertTrack<GPUTPCGMTrackParam, GPUTrackingRefit::TrackParCovWithArgs, GPUTPCGMPropagator>(GPUTPCGMTrackParam& trk, const GPUTrackingRefit::TrackParCovWithArgs& trkX, GPUTPCGMPropagator& prop)
202+
void GPUTrackingRefit::convertTrack<GPUTPCGMTrackParam, GPUTrackingRefit::TrackParCovWithArgs, GPUTPCGMPropagator>(GPUTPCGMTrackParam& trk, const GPUTrackingRefit::TrackParCovWithArgs& trkX, GPUTPCGMPropagator& prop, float* chi2)
193203
{
194204
initProp(prop);
195-
convertTrack<GPUTPCGMTrackParam, TrackParCov, GPUTPCGMPropagator>(trk, trkX.trk, prop);
205+
convertTrack<GPUTPCGMTrackParam, TrackParCov, GPUTPCGMPropagator>(trk, trkX.trk, prop, nullptr);
206+
trk.SetChi2(trkX.chi2 ? *trkX.chi2 : 0.f);
196207
}
197208
template <>
198-
void GPUTrackingRefit::convertTrack<GPUTrackingRefit::TrackParCovWithArgs, GPUTPCGMTrackParam, GPUTPCGMPropagator>(GPUTrackingRefit::TrackParCovWithArgs& trk, const GPUTPCGMTrackParam& trkX, GPUTPCGMPropagator& prop)
209+
void GPUTrackingRefit::convertTrack<GPUTrackingRefit::TrackParCovWithArgs, GPUTPCGMTrackParam, GPUTPCGMPropagator>(GPUTrackingRefit::TrackParCovWithArgs& trk, const GPUTPCGMTrackParam& trkX, GPUTPCGMPropagator& prop, float* chi2)
199210
{
200-
convertTrack<TrackParCov, GPUTPCGMTrackParam, GPUTPCGMPropagator>(trk.trk, trkX, prop);
211+
convertTrack<TrackParCov, GPUTPCGMTrackParam, GPUTPCGMPropagator>(trk.trk, trkX, prop, chi2);
212+
if (trk.chi2) {
213+
*trk.chi2 = trkX.GetChi2();
214+
}
201215
}
202216

203217
static const float* getPar(const GPUTPCGMTrackParam& trk) { return trk.GetPar(); }
@@ -209,7 +223,8 @@ GPUd() int GPUTrackingRefit::RefitTrack(T& trkX, bool outward, bool resetCov)
209223
CADEBUG(int ii; printf("\nRefitting track\n"));
210224
typename refitTrackTypes<S>::propagator prop;
211225
S trk;
212-
convertTrack(trk, trkX, prop);
226+
float TrackParCovChi2 = 0.f;
227+
convertTrack(trk, trkX, prop, &TrackParCovChi2);
213228
int begin = 0, count;
214229
float tOffset;
215230
if constexpr (std::is_same<T, GPUTPCGMMergedTrack>::value) {
@@ -336,12 +351,14 @@ GPUd() int GPUTrackingRefit::RefitTrack(T& trkX, bool outward, bool resetCov)
336351
}
337352
if (resetCov) {
338353
trk.resetCovariance();
354+
TrackParCovChi2 = 0.f;
339355
}
340356
CADEBUG(printf("\t%21sPropaga Alpha %8.3f , X %8.3f - Y %8.3f, Z %8.3f - QPt %7.2f (%7.2f), SP %5.2f (%5.2f) --- Res %8.3f %8.3f --- Cov sY %8.3f sZ %8.3f sSP %8.3f sPt %8.3f - YPt %8.3f\n", "", trk.getAlpha(), x, trk.getParams()[0], trk.getParams()[1], trk.getParams()[4], trk.getParams()[4], trk.getParams()[2], trk.getParams()[2], trk.getParams()[0] - y, trk.getParams()[1] - z, sqrtf(trk.getCov()[0]), sqrtf(trk.getCov()[2]), sqrtf(trk.getCov()[5]), sqrtf(trk.getCov()[14]), trk.getCov()[10]));
341357
std::array<float, 2> p = {y, z};
342358
std::array<float, 3> c = {0, 0, 0};
343359
mPparam->GetClusterErrors2(currentRow, z, getPar(trk)[2], getPar(trk)[3], c[0], c[2]);
344360
mPparam->UpdateClusterError2ByState(clusterState, c[0], c[2]);
361+
TrackParCovChi2 += trk.getPredictedChi2(p, c);
345362
if (!trk.update(p, c)) {
346363
IgnoreErrors(trk.getSnp());
347364
return -3;
@@ -372,7 +389,7 @@ GPUd() int GPUTrackingRefit::RefitTrack(T& trkX, bool outward, bool resetCov)
372389
static_assert("Invalid template");
373390
}
374391

375-
convertTrack(trkX, trk, prop);
392+
convertTrack(trkX, trk, prop, &TrackParCovChi2);
376393
return nFitted;
377394
}
378395

GPU/GPUTracking/Refit/GPUTrackingRefit.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,16 @@ class GPUTrackingRefit
7272
o2::track::TrackParCov& trk;
7373
const o2::tpc::TrackTPCClusRef& clusRef;
7474
float time0;
75+
float* chi2;
7576
};
76-
GPUd() int RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, bool outward = false, bool resetCov = false)
77+
GPUd() int RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false)
7778
{
78-
TrackParCovWithArgs x{trk, clusRef, time0};
79+
TrackParCovWithArgs x{trk, clusRef, time0, chi2};
7980
return RefitTrack<TrackParCovWithArgs, GPUTPCGMTrackParam>(x, outward, resetCov);
8081
}
81-
GPUd() int RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, bool outward = false, bool resetCov = false)
82+
GPUd() int RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false)
8283
{
83-
TrackParCovWithArgs x{trk, clusRef, time0};
84+
TrackParCovWithArgs x{trk, clusRef, time0, chi2};
8485
return RefitTrack<TrackParCovWithArgs, o2::track::TrackParCov>(x, outward, resetCov);
8586
}
8687

@@ -97,7 +98,7 @@ class GPUTrackingRefit
9798
template <class T, class S>
9899
GPUd() int RefitTrack(T& trk, bool outward, bool resetCov);
99100
template <class T, class S, class U>
100-
void convertTrack(T& trk, const S& trkX, U& prop);
101+
void convertTrack(T& trk, const S& trkX, U& prop, float* chi2);
101102
template <class U>
102103
void initProp(U& prop);
103104
};

macro/runTPCRefit.C

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ int runTPCRefit(TString trackFile = "tpctracks.root", TString clusterFile = "tpc
9494
if (retval < 0) {
9595
std::cout << "Refit as GPU track failed " << retval << "\n";
9696
} else {
97-
std::cout << "Succeeded using " << retval << " hits\n";
97+
std::cout << "Succeeded using " << retval << " hits (chi2 = " << trk.getChi2() << ")\n";
9898
trk.print();
9999
}
100100
trk = (*tracks)[i];
@@ -103,17 +103,18 @@ int runTPCRefit(TString trackFile = "tpctracks.root", TString clusterFile = "tpc
103103
if (retval < 0) {
104104
std::cout << "Refit as TrackParCov track failed " << retval << "\n";
105105
} else {
106-
std::cout << "Succeeded using " << retval << " hits\n";
106+
std::cout << "Succeeded using " << retval << " hits (chi2 = " << trk.getChi2() << ")\n";
107107
trk.print();
108108
}
109109
trk = (*tracks)[i];
110110
TrackParCov trkX = trk;
111+
float chi2 = trk.getChi2();
111112
std::cout << "Refitting as TrackParCov track with TrackParCov input\n";
112-
retval = refit.RefitTrackAsTrackParCov(trkX, trk.getClusterRef(), trk.getTime0(), false, true);
113+
retval = refit.RefitTrackAsTrackParCov(trkX, trk.getClusterRef(), trk.getTime0(), &chi2, false, true);
113114
if (retval < 0) {
114115
std::cout << "Refit as TrackParCov track failed " << retval << "\n";
115116
} else {
116-
std::cout << "Succeeded using " << retval << " hits\n";
117+
std::cout << "Succeeded using " << retval << " hits (chi2 = " << chi2 << ")\n";
117118
trkX.print();
118119
}
119120
}

0 commit comments

Comments
 (0)