@@ -61,7 +61,11 @@ float checkResults(o2::utils::TreeStreamRedirector& outs, std::string& treeName,
61
61
<< " genPart=" << genPar << " recPart=" << moth
62
62
<< " genX=" << vgen[0 ] << " genY=" << vgen[1 ] << " genZ=" << vgen[2 ]
63
63
<< " 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 " ;
65
69
}
66
70
return distMin;
67
71
}
@@ -145,10 +149,13 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
145
149
o2::utils::TreeStreamRedirector outStream (" dcafitterNTest.root" );
146
150
147
151
TGenPhaseSpace genPHS;
152
+ constexpr double ele = 0.00051 ;
153
+ constexpr double gamma = 2 * ele + 1e-6 ;
148
154
constexpr double pion = 0.13957 ;
149
155
constexpr double k0 = 0.49761 ;
150
156
constexpr double kch = 0.49368 ;
151
157
constexpr double dch = 1.86965 ;
158
+ std::vector<double > gammadec = {ele, ele};
152
159
std::vector<double > k0dec = {pion, pion};
153
160
std::vector<double > dchdec = {pion, kch, pion};
154
161
std::vector<o2::track::TrackParCov> vctracks;
@@ -233,6 +240,84 @@ BOOST_AUTO_TEST_CASE(DCAFitterNProngs)
233
240
BOOST_CHECK (meanDW < 0.1 );
234
241
}
235
242
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
+
236
321
// 2 prongs vertices with one of charges set to 0: Helix : Line
237
322
{
238
323
std::vector<int > forceQ{1 , 1 };
0 commit comments