@@ -61,7 +61,11 @@ float checkResults(o2::utils::TreeStreamRedirector& outs, std::string& treeName,
6161 << " genPart=" << genPar << " recPart=" << moth
6262 << " genX=" << vgen[0 ] << " genY=" << vgen[1 ] << " genZ=" << vgen[2 ]
6363 << " dx=" << df[0 ] << " dy=" << df[1 ] << " dz=" << df[2 ] << " dst=" << dst
64- << " useAbsDCA=" << absDCA << " useWghDCA=" << useWghDCA << " parent=" << parentTrack << " \n " ;
64+ << " useAbsDCA=" << absDCA << " useWghDCA=" << useWghDCA << " parent=" << parentTrack;
65+ for (int i = 0 ; i < fitter.getNProngs (); i++) {
66+ outs << treeName.c_str () << fmt::format (" prong{}=" , i).c_str () << fitter.getTrack (i, ic);
67+ }
68+ outs << treeName.c_str () << " \n " ;
6569 }
6670 return distMin;
6771}
@@ -145,10 +149,13 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
145149 o2::utils::TreeStreamRedirector outStream (" dcafitterNTest.root" );
146150
147151 TGenPhaseSpace genPHS;
152+ constexpr double ele = 0.00051 ;
153+ constexpr double gamma = 2 * ele + 1e-6 ;
148154 constexpr double pion = 0.13957 ;
149155 constexpr double k0 = 0.49761 ;
150156 constexpr double kch = 0.49368 ;
151157 constexpr double dch = 1.86965 ;
158+ std::vector<double > gammadec = {ele, ele};
152159 std::vector<double > k0dec = {pion, pion};
153160 std::vector<double > dchdec = {pion, kch, pion};
154161 std::vector<o2::track::TrackParCov> vctracks;
@@ -233,6 +240,84 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
233240 BOOST_CHECK (meanDW < 0.1 );
234241 }
235242
243+ // 2 prongs vertices with collinear tracks (gamma conversion)
244+ {
245+ LOG (info) << " Processing 2-prong Helix - Helix case gamma conversion" ;
246+ std::vector<int > forceQ{1 , 1 };
247+
248+ o2::vertexing::DCAFitterN<2 > ft; // 2 prong fitter
249+ ft.setBz (bz);
250+ ft.setPropagateToPCA (true ); // After finding the vertex, propagate tracks to the DCA. This is default anyway
251+ ft.setMaxR (200 ); // do not consider V0 seeds with 2D circles crossing above this R. This is default anyway
252+ ft.setMaxDZIni (4 ); // do not consider V0 seeds with tracks Z-distance exceeding this. This is default anyway
253+ ft.setMaxDXYIni (4 ); // do not consider V0 seeds with tracks XY-distance exceeding this. This is default anyway
254+ ft.setMinParamChange (1e-3 ); // stop iterations if max correction is below this value. This is default anyway
255+ ft.setMinRelChi2Change (0.9 ); // stop iterations if chi2 improves by less that this factor
256+
257+ std::string treeName2A = " gpr2a" , treeName2AW = " gpr2aw" , treeName2W = " gpr2w" ;
258+ TStopwatch swA, swAW, swW;
259+ int nfoundA = 0 , nfoundAW = 0 , nfoundW = 0 ;
260+ double meanDA = 0 , meanDAW = 0 , meanDW = 0 ;
261+ swA.Stop ();
262+ swAW.Stop ();
263+ swW.Stop ();
264+ for (int iev = 0 ; iev < NTest; iev++) {
265+ auto genParent = generate (vtxGen, vctracks, bz, genPHS, gamma, gammadec, forceQ);
266+
267+ ft.setUseAbsDCA (true );
268+ swA.Start (false );
269+ int ncA = ft.process (vctracks[0 ], vctracks[1 ]); // HERE WE FIT THE VERTICES
270+ swA.Stop ();
271+ LOG (debug) << " fit abs.dist " << iev << " NC: " << ncA << " Chi2: " << (ncA ? ft.getChi2AtPCACandidate (0 ) : -1 );
272+ if (ncA) {
273+ auto minD = checkResults (outStream, treeName2A, ft, vtxGen, genParent, gammadec);
274+ meanDA += minD;
275+ nfoundA++;
276+ }
277+
278+ ft.setUseAbsDCA (true );
279+ ft.setWeightedFinalPCA (true );
280+ swAW.Start (false );
281+ int ncAW = ft.process (vctracks[0 ], vctracks[1 ]); // HERE WE FIT THE VERTICES
282+ swAW.Stop ();
283+ LOG (debug) << " fit abs.dist with final weighted DCA " << iev << " NC: " << ncAW << " Chi2: " << (ncAW ? ft.getChi2AtPCACandidate (0 ) : -1 );
284+ if (ncAW) {
285+ auto minD = checkResults (outStream, treeName2AW, ft, vtxGen, genParent, gammadec);
286+ meanDAW += minD;
287+ nfoundAW++;
288+ }
289+
290+ ft.setUseAbsDCA (false );
291+ ft.setWeightedFinalPCA (false );
292+ swW.Start (false );
293+ int ncW = ft.process (vctracks[0 ], vctracks[1 ]); // HERE WE FIT THE VERTICES
294+ swW.Stop ();
295+ LOG (debug) << " fit wgh.dist " << iev << " NC: " << ncW << " Chi2: " << (ncW ? ft.getChi2AtPCACandidate (0 ) : -1 );
296+ if (ncW) {
297+ auto minD = checkResults (outStream, treeName2W, ft, vtxGen, genParent, gammadec);
298+ meanDW += minD;
299+ nfoundW++;
300+ }
301+ }
302+ ft.print ();
303+ meanDA /= nfoundA ? nfoundA : 1 ;
304+ meanDAW /= nfoundA ? nfoundA : 1 ;
305+ meanDW /= nfoundW ? nfoundW : 1 ;
306+ LOG (info) << " Processed " << NTest << " 2-prong vertices Helix : Helix from gamma conversion" ;
307+ LOG (info) << " 2-prongs with abs.dist minization: eff= " << float (nfoundA) / NTest
308+ << " mean.dist to truth: " << meanDA << " CPU time: " << swA.CpuTime ();
309+ LOG (info) << " 2-prongs with abs.dist but wghPCA: eff= " << float (nfoundAW) / NTest
310+ << " mean.dist to truth: " << meanDAW << " CPU time: " << swAW.CpuTime ();
311+ LOG (info) << " 2-prongs with wgh.dist minization: eff= " << float (nfoundW) / NTest
312+ << " mean.dist to truth: " << meanDW << " CPU time: " << swW.CpuTime ();
313+ BOOST_CHECK (nfoundA > 0.99 * NTest);
314+ BOOST_CHECK (nfoundAW > 0.99 * NTest);
315+ BOOST_CHECK (nfoundW > 0.99 * NTest);
316+ BOOST_CHECK (meanDA < 2.1 );
317+ BOOST_CHECK (meanDAW < 2.1 );
318+ BOOST_CHECK (meanDW < 2.1 );
319+ }
320+
236321 // 2 prongs vertices with one of charges set to 0: Helix : Line
237322 {
238323 std::vector<int > forceQ{1 , 1 };
0 commit comments