@@ -134,7 +134,7 @@ TLorentzVector generate(Vec3D& vtx, std::vector<o2::track::TrackParCov>& vctr, f
134134 float rad = forceQ[i] == 0 ? 600 . : TMath::Abs (1 . / trc.getCurvature (bz));
135135 if (!trc.propagateTo (trc.getX () + (gRandom ->Rndm () - 0.5 ) * rad * 0.05 , bz) ||
136136 !trc.rotate (trc.getAlpha () + (gRandom ->Rndm () - 0.5 ) * 0.2 )) {
137- printf ( " Failed to randomize " );
137+ LOGP (error, " Failed to randomize " );
138138 trc.print ();
139139 }
140140 }
@@ -143,6 +143,22 @@ TLorentzVector generate(Vec3D& vtx, std::vector<o2::track::TrackParCov>& vctr, f
143143 return parent;
144144}
145145
146+ static constexpr int NFitStatus{14 };
147+ using FitStatusArray = std::array<std::array<int , 3 >, NFitStatus>;
148+ static constexpr const char * FitStatusNames[NFitStatus] = {
149+ " None" , " Converged" , " MaxIter" , " NoCrossing" , " RejRadius" , " RejTrackX" , " RejTrackRoughZ" , " RejChi2Max" ,
150+ " FailProp" , " FailInvConv" , " FailInvWeight" , " FailInv2ndDeriv" , " FailCorrTracks" , " FailCloserAlt" };
151+ inline void printStat (const FitStatusArray& a)
152+ {
153+ LOGP (info, " FitStatus summary : ....A / ..AWD / ...WD (A=abs.dist;AWD=abs.wghPCA.dist;WD=wgh.dist)" );
154+ for (int i{0 }; i < NFitStatus; ++i) {
155+ LOGP (info, " {:2d}={:20s}: {:5d} / {:5d} / {:5d}" , i, FitStatusNames[i], a[i][0 ], a[i][1 ], a[i][2 ]);
156+ }
157+ BOOST_CHECK (a[0 ][0 ] == 0 ); // ensure coverage of all possible states
158+ BOOST_CHECK (a[0 ][1 ] == 0 );
159+ BOOST_CHECK (a[0 ][2 ] == 0 );
160+ }
161+
146162BOOST_AUTO_TEST_CASE (DCAFitterNProngs)
147163{
148164 constexpr int NTest = 10000 ;
@@ -159,13 +175,15 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
159175 std::vector<double > k0dec = {pion, pion};
160176 std::vector<double > dchdec = {pion, kch, pion};
161177 std::vector<o2::track::TrackParCov> vctracks;
178+ FitStatusArray fitstat;
162179 Vec3D vtxGen;
163180
164181 double bz = 5.0 ;
165182 // 2 prongs vertices
166183 {
167184 LOG (info) << " \n\n Processing 2-prong Helix - Helix case" ;
168185 std::vector<int > forceQ{1 , 1 };
186+ std::memset (fitstat.data (), 0 , sizeof (fitstat));
169187
170188 o2::vertexing::DCAFitterN<2 > ft; // 2 prong fitter
171189 ft.setBz (bz);
@@ -196,6 +214,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
196214 meanDA += minD;
197215 nfoundA++;
198216 }
217+ ++fitstat[ft.getFitStatus ()][0 ];
199218
200219 ft.setUseAbsDCA (true );
201220 ft.setWeightedFinalPCA (true );
@@ -208,6 +227,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
208227 meanDAW += minD;
209228 nfoundAW++;
210229 }
230+ ++fitstat[ft.getFitStatus ()][1 ];
211231
212232 ft.setUseAbsDCA (false );
213233 ft.setWeightedFinalPCA (false );
@@ -220,6 +240,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
220240 meanDW += minD;
221241 nfoundW++;
222242 }
243+ ++fitstat[ft.getFitStatus ()][2 ];
223244 }
224245 // ft.print();
225246 meanDA /= nfoundA ? nfoundA : 1 ;
@@ -232,6 +253,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
232253 << " mean.dist to truth: " << meanDAW << " CPU time: " << swAW.CpuTime () * 1000 << " ms" ;
233254 LOG (info) << " 2-prongs with wgh.dist minization: eff= " << float (nfoundW) / NTest
234255 << " mean.dist to truth: " << meanDW << " CPU time: " << swW.CpuTime () * 1000 << " ms" ;
256+ printStat (fitstat);
235257 BOOST_CHECK (nfoundA > 0.99 * NTest);
236258 BOOST_CHECK (nfoundAW > 0.99 * NTest);
237259 BOOST_CHECK (nfoundW > 0.99 * NTest);
@@ -245,6 +267,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
245267 {
246268 LOG (info) << " \n\n Processing 2-prong Helix - Helix case gamma conversion" ;
247269 std::vector<int > forceQ{1 , 1 };
270+ std::memset (fitstat.data (), 0 , sizeof (fitstat));
248271
249272 o2::vertexing::DCAFitterN<2 > ft; // 2 prong fitter
250273 ft.setBz (bz);
@@ -254,6 +277,8 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
254277 ft.setMaxDXYIni (4 ); // do not consider V0 seeds with tracks XY-distance exceeding this. This is default anyway
255278 ft.setMinParamChange (1e-3 ); // stop iterations if max correction is below this value. This is default anyway
256279 ft.setMinRelChi2Change (0.9 ); // stop iterations if chi2 improves by less that this factor
280+ ft.setMaxChi2 ();
281+ ft.setCollinear (true );
257282
258283 std::string treeName2A = " gpr2a" , treeName2AW = " gpr2aw" , treeName2W = " gpr2w" ;
259284 TStopwatch swA, swAW, swW;
@@ -275,6 +300,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
275300 meanDA += minD;
276301 nfoundA++;
277302 }
303+ ++fitstat[ft.getFitStatus ()][0 ];
278304
279305 ft.setUseAbsDCA (true );
280306 ft.setWeightedFinalPCA (true );
@@ -287,6 +313,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
287313 meanDAW += minD;
288314 nfoundAW++;
289315 }
316+ ++fitstat[ft.getFitStatus ()][1 ];
290317
291318 ft.setUseAbsDCA (false );
292319 ft.setWeightedFinalPCA (false );
@@ -299,6 +326,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
299326 meanDW += minD;
300327 nfoundW++;
301328 }
329+ ++fitstat[ft.getFitStatus ()][2 ];
302330 }
303331 // ft.print();
304332 meanDA /= nfoundA ? nfoundA : 1 ;
@@ -311,6 +339,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
311339 << " mean.dist to truth: " << meanDAW << " CPU time: " << swAW.CpuTime () * 1000 << " ms" ;
312340 LOG (info) << " 2-prongs with wgh.dist minization: eff= " << float (nfoundW) / NTest
313341 << " mean.dist to truth: " << meanDW << " CPU time: " << swW.CpuTime () * 1000 << " ms" ;
342+ printStat (fitstat);
314343 BOOST_CHECK (nfoundA > 0.99 * NTest);
315344 BOOST_CHECK (nfoundAW > 0.99 * NTest);
316345 BOOST_CHECK (nfoundW > 0.99 * NTest);
@@ -324,6 +353,8 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
324353 {
325354 std::vector<int > forceQ{1 , 1 };
326355 LOG (info) << " \n\n Processing 2-prong Helix - Line case" ;
356+ std::memset (fitstat.data (), 0 , sizeof (fitstat));
357+
327358 o2::vertexing::DCAFitterN<2 > ft; // 2 prong fitter
328359 ft.setBz (bz);
329360 ft.setPropagateToPCA (true ); // After finding the vertex, propagate tracks to the DCA. This is default anyway
@@ -354,6 +385,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
354385 meanDA += minD;
355386 nfoundA++;
356387 }
388+ ++fitstat[ft.getFitStatus ()][0 ];
357389
358390 ft.setUseAbsDCA (true );
359391 ft.setWeightedFinalPCA (true );
@@ -366,6 +398,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
366398 meanDAW += minD;
367399 nfoundAW++;
368400 }
401+ ++fitstat[ft.getFitStatus ()][1 ];
369402
370403 ft.setUseAbsDCA (false );
371404 ft.setWeightedFinalPCA (false );
@@ -378,6 +411,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
378411 meanDW += minD;
379412 nfoundW++;
380413 }
414+ ++fitstat[ft.getFitStatus ()][2 ];
381415 }
382416 // ft.print();
383417 meanDA /= nfoundA ? nfoundA : 1 ;
@@ -390,6 +424,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
390424 << " mean.dist to truth: " << meanDAW << " CPU time: " << swAW.CpuTime () * 1000 << " ms" ;
391425 LOG (info) << " 2-prongs with wgh.dist minization: eff= " << float (nfoundW) / NTest
392426 << " mean.dist to truth: " << meanDW << " CPU time: " << swW.CpuTime () * 1000 << " ms" ;
427+ printStat (fitstat);
393428 BOOST_CHECK (nfoundA > 0.99 * NTest);
394429 BOOST_CHECK (nfoundAW > 0.99 * NTest);
395430 BOOST_CHECK (nfoundW > 0.99 * NTest);
@@ -403,6 +438,8 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
403438 {
404439 std::vector<int > forceQ{0 , 0 };
405440 LOG (info) << " \n\n Processing 2-prong Line - Line case" ;
441+ std::memset (fitstat.data (), 0 , sizeof (fitstat));
442+
406443 o2::vertexing::DCAFitterN<2 > ft; // 2 prong fitter
407444 ft.setBz (bz);
408445 ft.setPropagateToPCA (true ); // After finding the vertex, propagate tracks to the DCA. This is default anyway
@@ -432,6 +469,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
432469 meanDA += minD;
433470 nfoundA++;
434471 }
472+ ++fitstat[ft.getFitStatus ()][0 ];
435473
436474 ft.setUseAbsDCA (true );
437475 ft.setWeightedFinalPCA (true );
@@ -444,6 +482,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
444482 meanDAW += minD;
445483 nfoundAW++;
446484 }
485+ ++fitstat[ft.getFitStatus ()][1 ];
447486
448487 ft.setUseAbsDCA (false );
449488 ft.setWeightedFinalPCA (false );
@@ -456,6 +495,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
456495 meanDW += minD;
457496 nfoundW++;
458497 }
498+ ++fitstat[ft.getFitStatus ()][2 ];
459499 }
460500 // ft.print();
461501 meanDA /= nfoundA ? nfoundA : 1 ;
@@ -468,6 +508,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
468508 << " mean.dist to truth: " << meanDAW << " CPU time: " << swAW.CpuTime () * 1000 << " ms" ;
469509 LOG (info) << " 2-prongs with wgh.dist minization: eff= " << float (nfoundW) / NTest
470510 << " mean.dist to truth: " << meanDW << " CPU time: " << swW.CpuTime () * 1000 << " ms" ;
511+ printStat (fitstat);
471512 BOOST_CHECK (nfoundA > 0.99 * NTest);
472513 BOOST_CHECK (nfoundAW > 0.99 * NTest);
473514 BOOST_CHECK (nfoundW > 0.99 * NTest);
@@ -481,6 +522,8 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
481522 {
482523 LOG (info) << " \n\n Processing 3-prong vertices" ;
483524 std::vector<int > forceQ{1 , 1 , 1 };
525+ std::memset (fitstat.data (), 0 , sizeof (fitstat));
526+
484527 o2::vertexing::DCAFitterN<3 > ft; // 3 prong fitter
485528 ft.setBz (bz);
486529 ft.setPropagateToPCA (true ); // After finding the vertex, propagate tracks to the DCA. This is default anyway
@@ -509,6 +552,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
509552 meanDA += minD;
510553 nfoundA++;
511554 }
555+ ++fitstat[ft.getFitStatus ()][0 ];
512556
513557 ft.setUseAbsDCA (true );
514558 ft.setWeightedFinalPCA (true );
@@ -521,6 +565,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
521565 meanDAW += minD;
522566 nfoundAW++;
523567 }
568+ ++fitstat[ft.getFitStatus ()][1 ];
524569
525570 ft.setUseAbsDCA (false );
526571 ft.setWeightedFinalPCA (false );
@@ -533,6 +578,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
533578 meanDW += minD;
534579 nfoundW++;
535580 }
581+ ++fitstat[ft.getFitStatus ()][2 ];
536582 }
537583 // ft.print();
538584 meanDA /= nfoundA ? nfoundA : 1 ;
@@ -545,6 +591,7 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
545591 << " mean.dist to truth: " << meanDAW << " CPU time: " << swAW.CpuTime () * 1000 << " ms" ;
546592 LOG (info) << " 3-prongs with wgh.dist minization: eff= " << float (nfoundW) / NTest
547593 << " mean.dist to truth: " << meanDW << " CPU time: " << swW.CpuTime () * 1000 << " ms" ;
594+ printStat (fitstat);
548595 BOOST_CHECK (nfoundA > 0.99 * NTest);
549596 BOOST_CHECK (nfoundAW > 0.99 * NTest);
550597 BOOST_CHECK (nfoundW > 0.99 * NTest);
0 commit comments