164 constexpr int NTest = 10000;
167 TGenPhaseSpace genPHS;
168 constexpr double ele = 0.00051;
169 constexpr double gamma = 2 * ele + 1e-6;
170 constexpr double pion = 0.13957;
171 constexpr double k0 = 0.49761;
172 constexpr double kch = 0.49368;
173 constexpr double dch = 1.86965;
174 std::vector<double> gammadec = {ele, ele};
175 std::vector<double> k0dec = {pion, pion};
176 std::vector<double> dchdec = {pion, kch, pion};
177 std::vector<o2::track::TrackParCov> vctracks;
184 LOG(info) <<
"\n\nProcessing 2-prong Helix - Helix case";
185 std::vector<int> forceQ{1, 1};
186 std::memset(fitstat.data(), 0,
sizeof(fitstat));
190 ft.setPropagateToPCA(
true);
194 ft.setMinParamChange(1e-3);
195 ft.setMinRelChi2Change(0.9);
197 std::string treeName2A =
"pr2a", treeName2AW =
"pr2aw", treeName2W =
"pr2w";
198 TStopwatch swA, swAW, swW;
199 int nfoundA = 0, nfoundAW = 0, nfoundW = 0;
200 double meanDA = 0, meanDAW = 0, meanDW = 0;
204 for (
int iev = 0; iev < NTest; iev++) {
205 auto genParent =
generate(vtxGen, vctracks, bz, genPHS, k0, k0dec, forceQ);
207 ft.setUseAbsDCA(
true);
209 int ncA = ft.process(vctracks[0], vctracks[1]);
213 auto minD =
checkResults(outStream, treeName2A, ft, vtxGen, genParent, k0dec);
217 ++fitstat[ft.getFitStatus()][0];
219 ft.setUseAbsDCA(
true);
220 ft.setWeightedFinalPCA(
true);
222 int ncAW = ft.process(vctracks[0], vctracks[1]);
226 auto minD =
checkResults(outStream, treeName2AW, ft, vtxGen, genParent, k0dec);
230 ++fitstat[ft.getFitStatus()][1];
232 ft.setUseAbsDCA(
false);
233 ft.setWeightedFinalPCA(
false);
235 int ncW = ft.process(vctracks[0], vctracks[1]);
239 auto minD =
checkResults(outStream, treeName2W, ft, vtxGen, genParent, k0dec);
243 ++fitstat[ft.getFitStatus()][2];
246 meanDA /= nfoundA ? nfoundA : 1;
247 meanDAW /= nfoundAW ? nfoundAW : 1;
248 meanDW /= nfoundW ? nfoundW : 1;
249 LOG(info) <<
"Processed " << NTest <<
" 2-prong vertices Helix : Helix";
250 LOG(info) <<
"2-prongs with abs.dist minization: eff= " << float(nfoundA) / NTest
251 <<
" mean.dist to truth: " << meanDA <<
" CPU time: " << swA.CpuTime() * 1000 <<
" ms";
252 LOG(info) <<
"2-prongs with abs.dist but wghPCA: eff= " << float(nfoundAW) / NTest
253 <<
" mean.dist to truth: " << meanDAW <<
" CPU time: " << swAW.CpuTime() * 1000 <<
" ms";
254 LOG(info) <<
"2-prongs with wgh.dist minization: eff= " << float(nfoundW) / NTest
255 <<
" mean.dist to truth: " << meanDW <<
" CPU time: " << swW.CpuTime() * 1000 <<
" ms";
268 LOG(info) <<
"\n\nProcessing 2-prong Helix - Helix case gamma conversion";
269 std::vector<int> forceQ{1, 1};
270 std::memset(fitstat.data(), 0,
sizeof(fitstat));
274 ft.setPropagateToPCA(
true);
278 ft.setMinParamChange(1e-3);
279 ft.setMinRelChi2Change(0.9);
281 ft.setCollinear(
true);
283 std::string treeName2A =
"gpr2a", treeName2AW =
"gpr2aw", treeName2W =
"gpr2w";
284 TStopwatch swA, swAW, swW;
285 int nfoundA = 0, nfoundAW = 0, nfoundW = 0;
286 double meanDA = 0, meanDAW = 0, meanDW = 0;
290 for (
int iev = 0; iev < NTest; iev++) {
291 auto genParent =
generate(vtxGen, vctracks, bz, genPHS, gamma, gammadec, forceQ);
293 ft.setUseAbsDCA(
true);
295 int ncA = ft.process(vctracks[0], vctracks[1]);
299 auto minD =
checkResults(outStream, treeName2A, ft, vtxGen, genParent, gammadec);
303 ++fitstat[ft.getFitStatus()][0];
305 ft.setUseAbsDCA(
true);
306 ft.setWeightedFinalPCA(
true);
308 int ncAW = ft.process(vctracks[0], vctracks[1]);
312 auto minD =
checkResults(outStream, treeName2AW, ft, vtxGen, genParent, gammadec);
316 ++fitstat[ft.getFitStatus()][1];
318 ft.setUseAbsDCA(
false);
319 ft.setWeightedFinalPCA(
false);
321 int ncW = ft.process(vctracks[0], vctracks[1]);
325 auto minD =
checkResults(outStream, treeName2W, ft, vtxGen, genParent, gammadec);
329 ++fitstat[ft.getFitStatus()][2];
332 meanDA /= nfoundA ? nfoundA : 1;
333 meanDAW /= nfoundAW ? nfoundAW : 1;
334 meanDW /= nfoundW ? nfoundW : 1;
335 LOG(info) <<
"Processed " << NTest <<
" 2-prong vertices Helix : Helix from gamma conversion";
336 LOG(info) <<
"2-prongs with abs.dist minization: eff= " << float(nfoundA) / NTest
337 <<
" mean.dist to truth: " << meanDA <<
" CPU time: " << swA.CpuTime() * 1000 <<
" ms";
338 LOG(info) <<
"2-prongs with abs.dist but wghPCA: eff= " << float(nfoundAW) / NTest
339 <<
" mean.dist to truth: " << meanDAW <<
" CPU time: " << swAW.CpuTime() * 1000 <<
" ms";
340 LOG(info) <<
"2-prongs with wgh.dist minization: eff= " << float(nfoundW) / NTest
341 <<
" mean.dist to truth: " << meanDW <<
" CPU time: " << swW.CpuTime() * 1000 <<
" ms";
354 std::vector<int> forceQ{1, 1};
355 LOG(info) <<
"\n\nProcessing 2-prong Helix - Line case";
356 std::memset(fitstat.data(), 0,
sizeof(fitstat));
360 ft.setPropagateToPCA(
true);
363 ft.setMinParamChange(1e-3);
364 ft.setMinRelChi2Change(0.9);
366 std::string treeName2A =
"pr2aHL", treeName2AW =
"pr2awHL", treeName2W =
"pr2wHL";
367 TStopwatch swA, swAW, swW;
368 int nfoundA = 0, nfoundAW = 0, nfoundW = 0;
369 double meanDA = 0, meanDAW = 0, meanDW = 0;
373 for (
int iev = 0; iev < NTest; iev++) {
375 forceQ[1 - iev % 2] = 0;
376 auto genParent =
generate(vtxGen, vctracks, bz, genPHS, k0, k0dec, forceQ);
378 ft.setUseAbsDCA(
true);
380 int ncA = ft.process(vctracks[0], vctracks[1]);
384 auto minD =
checkResults(outStream, treeName2A, ft, vtxGen, genParent, k0dec);
388 ++fitstat[ft.getFitStatus()][0];
390 ft.setUseAbsDCA(
true);
391 ft.setWeightedFinalPCA(
true);
393 int ncAW = ft.process(vctracks[0], vctracks[1]);
397 auto minD =
checkResults(outStream, treeName2AW, ft, vtxGen, genParent, k0dec);
401 ++fitstat[ft.getFitStatus()][1];
403 ft.setUseAbsDCA(
false);
404 ft.setWeightedFinalPCA(
false);
406 int ncW = ft.process(vctracks[0], vctracks[1]);
410 auto minD =
checkResults(outStream, treeName2W, ft, vtxGen, genParent, k0dec);
414 ++fitstat[ft.getFitStatus()][2];
417 meanDA /= nfoundA ? nfoundA : 1;
418 meanDAW /= nfoundAW ? nfoundAW : 1;
419 meanDW /= nfoundW ? nfoundW : 1;
420 LOG(info) <<
"Processed " << NTest <<
" 2-prong vertices: Helix : Line";
421 LOG(info) <<
"2-prongs with abs.dist minization: eff= " << float(nfoundA) / NTest
422 <<
" mean.dist to truth: " << meanDA <<
" CPU time: " << swA.CpuTime() * 1000 <<
" ms";
423 LOG(info) <<
"2-prongs with abs.dist but wghPCA: eff= " << float(nfoundAW) / NTest
424 <<
" mean.dist to truth: " << meanDAW <<
" CPU time: " << swAW.CpuTime() * 1000 <<
" ms";
425 LOG(info) <<
"2-prongs with wgh.dist minization: eff= " << float(nfoundW) / NTest
426 <<
" mean.dist to truth: " << meanDW <<
" CPU time: " << swW.CpuTime() * 1000 <<
" ms";
439 std::vector<int> forceQ{0, 0};
440 LOG(info) <<
"\n\nProcessing 2-prong Line - Line case";
441 std::memset(fitstat.data(), 0,
sizeof(fitstat));
445 ft.setPropagateToPCA(
true);
448 ft.setMinParamChange(1e-3);
449 ft.setMinRelChi2Change(0.9);
451 std::string treeName2A =
"pr2aLL", treeName2AW =
"pr2awLL", treeName2W =
"pr2wLL";
452 TStopwatch swA, swAW, swW;
453 int nfoundA = 0, nfoundAW = 0, nfoundW = 0;
454 double meanDA = 0, meanDAW = 0, meanDW = 0;
458 for (
int iev = 0; iev < NTest; iev++) {
459 forceQ[0] = forceQ[1] = 0;
460 auto genParent =
generate(vtxGen, vctracks, bz, genPHS, k0, k0dec, forceQ);
462 ft.setUseAbsDCA(
true);
464 int ncA = ft.process(vctracks[0], vctracks[1]);
468 auto minD =
checkResults(outStream, treeName2A, ft, vtxGen, genParent, k0dec);
472 ++fitstat[ft.getFitStatus()][0];
474 ft.setUseAbsDCA(
true);
475 ft.setWeightedFinalPCA(
true);
477 int ncAW = ft.process(vctracks[0], vctracks[1]);
481 auto minD =
checkResults(outStream, treeName2AW, ft, vtxGen, genParent, k0dec);
485 ++fitstat[ft.getFitStatus()][1];
487 ft.setUseAbsDCA(
false);
488 ft.setWeightedFinalPCA(
false);
490 int ncW = ft.process(vctracks[0], vctracks[1]);
494 auto minD =
checkResults(outStream, treeName2W, ft, vtxGen, genParent, k0dec);
498 ++fitstat[ft.getFitStatus()][2];
501 meanDA /= nfoundA ? nfoundA : 1;
502 meanDAW /= nfoundAW ? nfoundAW : 1;
503 meanDW /= nfoundW ? nfoundW : 1;
504 LOG(info) <<
"Processed " << NTest <<
" 2-prong vertices: Line : Line";
505 LOG(info) <<
"2-prongs with abs.dist minization: eff= " << float(nfoundA) / NTest
506 <<
" mean.dist to truth: " << meanDA <<
" CPU time: " << swA.CpuTime() * 1000 <<
" ms";
507 LOG(info) <<
"2-prongs with abs.dist but wghPCA: eff= " << float(nfoundAW) / NTest
508 <<
" mean.dist to truth: " << meanDAW <<
" CPU time: " << swAW.CpuTime() * 1000 <<
" ms";
509 LOG(info) <<
"2-prongs with wgh.dist minization: eff= " << float(nfoundW) / NTest
510 <<
" mean.dist to truth: " << meanDW <<
" CPU time: " << swW.CpuTime() * 1000 <<
" ms";
523 LOG(info) <<
"\n\nProcessing 3-prong vertices";
524 std::vector<int> forceQ{1, 1, 1};
525 std::memset(fitstat.data(), 0,
sizeof(fitstat));
529 ft.setPropagateToPCA(
true);
532 ft.setMinParamChange(1e-3);
533 ft.setMinRelChi2Change(0.9);
535 std::string treeName3A =
"pr3a", treeName3AW =
"pr3aw", treeName3W =
"pr3w";
536 TStopwatch swA, swAW, swW;
537 int nfoundA = 0, nfoundAW = 0, nfoundW = 0;
538 double meanDA = 0, meanDAW = 0, meanDW = 0;
542 for (
int iev = 0; iev < NTest; iev++) {
543 auto genParent =
generate(vtxGen, vctracks, bz, genPHS, dch, dchdec, forceQ);
545 ft.setUseAbsDCA(
true);
547 int ncA = ft.process(vctracks[0], vctracks[1], vctracks[2]);
551 auto minD =
checkResults(outStream, treeName3A, ft, vtxGen, genParent, dchdec);
555 ++fitstat[ft.getFitStatus()][0];
557 ft.setUseAbsDCA(
true);
558 ft.setWeightedFinalPCA(
true);
560 int ncAW = ft.process(vctracks[0], vctracks[1], vctracks[2]);
564 auto minD =
checkResults(outStream, treeName3AW, ft, vtxGen, genParent, dchdec);
568 ++fitstat[ft.getFitStatus()][1];
570 ft.setUseAbsDCA(
false);
571 ft.setWeightedFinalPCA(
false);
573 int ncW = ft.process(vctracks[0], vctracks[1], vctracks[2]);
577 auto minD =
checkResults(outStream, treeName3W, ft, vtxGen, genParent, dchdec);
581 ++fitstat[ft.getFitStatus()][2];
584 meanDA /= nfoundA ? nfoundA : 1;
585 meanDAW /= nfoundAW ? nfoundAW : 1;
586 meanDW /= nfoundW ? nfoundW : 1;
587 LOG(info) <<
"Processed " << NTest <<
" 3-prong vertices";
588 LOG(info) <<
"3-prongs with abs.dist minization: eff= " << float(nfoundA) / NTest
589 <<
" mean.dist to truth: " << meanDA <<
" CPU time: " << swA.CpuTime() * 1000 <<
" ms";
590 LOG(info) <<
"3-prongs with abs.dist but wghPCA: eff= " << float(nfoundAW) / NTest
591 <<
" mean.dist to truth: " << meanDAW <<
" CPU time: " << swAW.CpuTime() * 1000 <<
" ms";
592 LOG(info) <<
"3-prongs with wgh.dist minization: eff= " << float(nfoundW) / NTest
593 <<
" mean.dist to truth: " << meanDW <<
" CPU time: " << swW.CpuTime() * 1000 <<
" ms";