@@ -89,7 +89,7 @@ void GPUTrackingRefit::initProp<const Propagator*>(const Propagator*& prop)
8989}
9090
9191template <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
117117template <>
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}
123123template <>
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
130130template <>
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}
137138template <>
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}
143145template <>
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}
150152template <>
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
157159template <>
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}
163166template <>
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}
168172template <>
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}
174179template <>
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
180186template <>
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}
186193template <>
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}
191201template <>
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}
197208template <>
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
203217static 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 (" \n Refitting 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
0 commit comments