559 const char* nThreadsEnvVarName =
"DCAFITTERGPU_TEST_NTHREADS";
560 const char* nBlocksEnvVarName =
"DCAFITTERGPU_TEST_NBLOCKS";
561 const char* nBatchesEnvVarName =
"DCAFITTERGPU_TEST_NBATCHES";
562 const char* nTestsEnvVarName =
"DCAFITTERGPU_TEST_NTESTS";
563 int nBlocks = std::getenv(nBlocksEnvVarName) ==
nullptr ? 30 : std::stoi(std::getenv(nBlocksEnvVarName));
564 int nThreads = std::getenv(nThreadsEnvVarName) ==
nullptr ? 256 : std::stoi(std::getenv(nThreadsEnvVarName));
565 int nBatches = std::getenv(nBatchesEnvVarName) ==
nullptr ? 8 : std::stoi(std::getenv(nBatchesEnvVarName));
566 int NTest = std::getenv(nTestsEnvVarName) ==
nullptr ? 100001 : std::stoi(std::getenv(nTestsEnvVarName));
570 TGenPhaseSpace genPHS;
571 constexpr double ele = 0.00051;
572 constexpr double gamma = 2 * ele + 1e-6;
573 constexpr double pion = 0.13957;
574 constexpr double k0 = 0.49761;
575 constexpr double kch = 0.49368;
576 constexpr double dch = 1.86965;
577 std::vector<double> gammadec = {ele, ele};
578 std::vector<double> k0dec = {pion, pion};
579 std::vector<double> dchdec = {pion, kch, pion};
580 std::vector<std::vector<o2::track::TrackParCov>> vctracks(3, std::vector<o2::track::TrackParCov>(NTest));
581 std::vector<Vec3D> vtxGen(NTest);
585 LOG(info) <<
"\n\nBulk-processing 2-prong Helix - Helix case";
586 std::vector<int> forceQ{1, 1};
590 ft.setPropagateToPCA(
true);
594 ft.setMinParamChange(1e-3);
595 ft.setMinRelChi2Change(0.9);
597 std::vector<o2::vertexing::DCAFitterN<2>> fitters_host(NTest);
598 std::vector<TLorentzVector> genParents(NTest);
600 std::string treeName2Abulk =
"pr2aBulk", treeName2AWbulk =
"pr2awBulk", treeName2Wbulk =
"pr2wBulk";
601 TStopwatch swAb, swAWb, swWb;
602 int nfoundAb = 0, nfoundAWb = 0, nfoundWb = 0;
603 double meanDAb = 0, meanDAWb = 0, meanDWb = 0;
608 ft.setUseAbsDCA(
true);
609 std::fill(fitters_host.begin(), fitters_host.end(), ft);
610 for (
int iev = 0; iev < NTest; iev++) {
611 std::vector<o2::track::TrackParCov> vc(2);
612 genParents[iev] =
generate(vtxGen[iev], vc, bz, genPHS, k0, k0dec, forceQ);
613 vctracks[0][iev] = vc[0];
614 vctracks[1][iev] = vc[1];
618 std::vector<int> ncAb(NTest, 0);
619 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAb, vctracks[0], vctracks[1]);
622 for (
int iev = 0; iev < NTest; iev++) {
623 LOG(
debug) <<
"fit abs.dist " << iev <<
" NC: " << ncAb[iev] <<
" Chi2: " << (ncAb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
625 auto minDb =
checkResults(outStreamB, treeName2Abulk, fitters_host[iev], vtxGen[iev], genParents[iev], k0dec);
631 ft.setUseAbsDCA(
true);
632 ft.setWeightedFinalPCA(
true);
633 std::fill(fitters_host.begin(), fitters_host.end(), ft);
635 std::vector<int> ncAWb(NTest, 0);
636 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAWb, vctracks[0], vctracks[1]);
639 for (
int iev = 0; iev < NTest; iev++) {
640 LOG(
debug) <<
"fit abs.dist with final weighted DCA " << iev <<
" NC: " << ncAWb[iev] <<
" Chi2: " << (ncAWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
642 auto minDb =
checkResults(outStreamB, treeName2AWbulk, fitters_host[iev], vtxGen[iev], genParents[iev], k0dec);
648 ft.setUseAbsDCA(
false);
649 ft.setWeightedFinalPCA(
false);
650 std::fill(fitters_host.begin(), fitters_host.end(), ft);
652 std::vector<int> ncWb(NTest, 0);
653 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncWb, vctracks[0], vctracks[1]);
656 for (
int iev = 0; iev < NTest; iev++) {
657 LOG(
debug) <<
"fit wgh.dist " << iev <<
" NC: " << ncWb[iev] <<
" Chi2: " << (ncWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
659 auto minDb =
checkResults(outStreamB, treeName2Wbulk, fitters_host[iev], vtxGen[iev], genParents[iev], k0dec);
665 meanDAb /= nfoundAb ? nfoundAb : 1;
666 meanDAWb /= nfoundAWb ? nfoundAWb : 1;
667 meanDWb /= nfoundWb ? nfoundWb : 1;
668 LOGP(info,
"Bulk-processed {} 2-prong vertices Helix : Helix", NTest);
669 LOG(info) <<
"2-prongs with abs.dist minimization: eff = " << float(nfoundAb) / NTest
670 <<
" mean.dist to truth: " << meanDAb <<
" Total time: " << swAb.CpuTime() * 1000 <<
" ms";
671 LOG(info) <<
"2-prongs with abs.dist but wghPCA: eff = " << float(nfoundAWb) / NTest
672 <<
" mean.dist to truth: " << meanDAWb <<
" Total time: " << swAWb.CpuTime() * 1000 <<
" ms";
673 LOG(info) <<
"2-prongs with wgh.dist minimization: eff = " << float(nfoundWb) / NTest
674 <<
" mean.dist to truth: " << meanDWb <<
" Total time: " << swWb.CpuTime() * 1000 <<
" ms";
684 LOG(info) <<
"\n\nBulk-processing 2-prong Helix - Helix case gamma conversion";
685 std::vector<int> forceQ{1, 1};
689 ft.setPropagateToPCA(
true);
693 ft.setMinParamChange(1e-3);
694 ft.setMinRelChi2Change(0.9);
696 std::vector<o2::vertexing::DCAFitterN<2>> fitters_host(NTest);
697 std::vector<TLorentzVector> genParents(NTest);
699 std::string treeName2Abulk =
"gpr2aBulk", treeName2AWbulk =
"gpr2awBulk", treeName2Wbulk =
"gpr2wBulk";
700 TStopwatch swAb, swAWb, swWb;
701 int nfoundAb = 0, nfoundAWb = 0, nfoundWb = 0;
702 double meanDAb = 0, meanDAWb = 0, meanDWb = 0;
707 ft.setUseAbsDCA(
true);
708 std::fill(fitters_host.begin(), fitters_host.end(), ft);
709 for (
int iev = 0; iev < NTest; iev++) {
710 std::vector<o2::track::TrackParCov> vc(2);
711 genParents[iev] =
generate(vtxGen[iev], vc, bz, genPHS, gamma, gammadec, forceQ);
712 vctracks[0][iev] = vc[0];
713 vctracks[1][iev] = vc[1];
717 std::vector<int> ncAb(NTest, 0);
718 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAb, vctracks[0], vctracks[1]);
721 for (
int iev = 0; iev < NTest; iev++) {
722 LOG(
debug) <<
"fit abs.dist " << iev <<
" NC: " << ncAb[iev] <<
" Chi2: " << (ncAb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
724 auto minDb =
checkResults(outStreamB, treeName2Abulk, fitters_host[iev], vtxGen[iev], genParents[iev], gammadec);
730 ft.setUseAbsDCA(
true);
731 ft.setWeightedFinalPCA(
true);
732 std::fill(fitters_host.begin(), fitters_host.end(), ft);
734 std::vector<int> ncAWb(NTest, 0);
735 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAWb, vctracks[0], vctracks[1]);
738 for (
int iev = 0; iev < NTest; iev++) {
739 LOG(
debug) <<
"fit abs.dist with final weighted DCA " << iev <<
" NC: " << ncAWb[iev] <<
" Chi2: " << (ncAWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
741 auto minDb =
checkResults(outStreamB, treeName2AWbulk, fitters_host[iev], vtxGen[iev], genParents[iev], gammadec);
747 ft.setUseAbsDCA(
false);
748 ft.setWeightedFinalPCA(
false);
749 std::fill(fitters_host.begin(), fitters_host.end(), ft);
751 std::vector<int> ncWb(NTest, 0);
752 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncWb, vctracks[0], vctracks[1]);
755 for (
int iev = 0; iev < NTest; iev++) {
756 LOG(
debug) <<
"fit wgh.dist " << iev <<
" NC: " << ncWb[iev] <<
" Chi2: " << (ncWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
758 auto minDb =
checkResults(outStreamB, treeName2Wbulk, fitters_host[iev], vtxGen[iev], genParents[iev], gammadec);
765 meanDAb /= nfoundAb ? nfoundAb : 1;
766 meanDAWb /= nfoundAWb ? nfoundAWb : 1;
767 meanDWb /= nfoundWb ? nfoundWb : 1;
768 LOGP(info,
"Bulk-processed {} 2-prong vertices Helix : Helix from gamma conversion", NTest);
769 LOG(info) <<
"2-prongs with abs.dist minimization: eff = " << float(nfoundAb) / NTest
770 <<
" mean.dist to truth: " << meanDAb <<
" Total time: " << swAb.CpuTime() * 1000 <<
" ms";
771 LOG(info) <<
"2-prongs with abs.dist but wghPCA: eff = " << float(nfoundAWb) / NTest
772 <<
" mean.dist to truth: " << meanDAWb <<
" Total time: " << swAWb.CpuTime() * 1000 <<
" ms";
773 LOG(info) <<
"2-prongs with wgh.dist minimization: eff = " << float(nfoundWb) / NTest
774 <<
" mean.dist to truth: " << meanDWb <<
" Total time: " << swWb.CpuTime() * 1000 <<
" ms";
785 std::vector<int> forceQ{1, 1};
786 LOG(info) <<
"\n\nBulk-processing 2-prong Helix - Line case";
789 ft.setPropagateToPCA(
true);
792 ft.setMinParamChange(1e-3);
793 ft.setMinRelChi2Change(0.9);
795 std::vector<o2::vertexing::DCAFitterN<2>> fitters_host(NTest);
796 std::vector<TLorentzVector> genParents(NTest);
798 std::string treeName2Abulk =
"pr2aHLb", treeName2AWbulk =
"pr2awHLb", treeName2Wbulk =
"pr2wHLb";
799 TStopwatch swAb, swAWb, swWb;
800 int nfoundAb = 0, nfoundAWb = 0, nfoundWb = 0;
801 double meanDAb = 0, meanDAWb = 0, meanDWb = 0;
806 for (
int iev = 0; iev < NTest; iev++) {
808 forceQ[1 - iev % 2] = 0;
809 std::vector<o2::track::TrackParCov> vc(2);
810 genParents[iev] =
generate(vtxGen[iev], vc, bz, genPHS, k0, k0dec, forceQ);
811 vctracks[0][iev] = vc[0];
812 vctracks[1][iev] = vc[1];
814 ft.setUseAbsDCA(
true);
815 std::fill(fitters_host.begin(), fitters_host.end(), ft);
818 std::vector<int> ncAb(NTest, 0);
819 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAb, vctracks[0], vctracks[1]);
822 for (
int iev = 0; iev < NTest; iev++) {
823 LOG(
debug) <<
"fit abs.dist with final weighted DCA " << iev <<
" NC: " << ncAb[iev] <<
" Chi2: " << (ncAb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
825 auto minDb =
checkResults(outStreamB, treeName2Abulk, fitters_host[iev], vtxGen[iev], genParents[iev], k0dec);
831 ft.setUseAbsDCA(
true);
832 ft.setWeightedFinalPCA(
true);
833 std::fill(fitters_host.begin(), fitters_host.end(), ft);
835 std::vector<int> ncAWb(NTest, 0);
836 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAWb, vctracks[0], vctracks[1]);
839 for (
int iev = 0; iev < NTest; iev++) {
840 LOG(
debug) <<
"fit abs.dist " << iev <<
" NC: " << ncAWb[iev] <<
" Chi2: " << (ncAWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
842 auto minDb =
checkResults(outStreamB, treeName2AWbulk, fitters_host[iev], vtxGen[iev], genParents[iev], k0dec);
848 ft.setUseAbsDCA(
false);
849 ft.setWeightedFinalPCA(
false);
850 std::fill(fitters_host.begin(), fitters_host.end(), ft);
852 std::vector<int> ncWb(NTest, 0);
853 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncWb, vctracks[0], vctracks[1]);
856 for (
int iev = 0; iev < NTest; iev++) {
857 LOG(
debug) <<
"fit wgh.dist " << iev <<
" NC: " << ncWb[iev] <<
" Chi2: " << (ncWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
859 auto minDb =
checkResults(outStreamB, treeName2Wbulk, fitters_host[iev], vtxGen[iev], genParents[iev], k0dec);
866 meanDAb /= nfoundAb ? nfoundAb : 1;
867 meanDAWb /= nfoundAWb ? nfoundAWb : 1;
868 meanDWb /= nfoundWb ? nfoundWb : 1;
869 LOG(info) <<
"Bulk-processed " << NTest <<
" 2-prong vertices: Helix : Line";
870 LOG(info) <<
"2-prongs with abs.dist minimization: eff = " << float(nfoundAb) / NTest
871 <<
" mean.dist to truth: " << meanDAb <<
" Total time: " << swAb.CpuTime() * 1000 <<
" ms";
872 LOG(info) <<
"2-prongs with abs.dist but wghPCA: eff = " << float(nfoundAWb) / NTest
873 <<
" mean.dist to truth: " << meanDAWb <<
" Total time: " << swAWb.CpuTime() * 1000 <<
" ms";
874 LOG(info) <<
"2-prongs with wgh.dist minimization: eff = " << float(nfoundWb) / NTest
875 <<
" mean.dist to truth: " << meanDWb <<
" Total time: " << swWb.CpuTime() * 1000 <<
" ms";
886 std::vector<int> forceQ{0, 0};
887 LOG(info) <<
"\n\nBulk-processing 2-prong Line - Line case";
890 ft.setPropagateToPCA(
true);
893 ft.setMinParamChange(1e-3);
894 ft.setMinRelChi2Change(0.9);
896 std::vector<o2::vertexing::DCAFitterN<2>> fitters_host(NTest);
897 std::vector<TLorentzVector> genParents(NTest);
899 std::string treeName2Abulk =
"pr2aLL", treeName2AWbulk =
"pr2awLL", treeName2Wbulk =
"pr2wLL";
900 TStopwatch swAb, swAWb, swWb;
901 int nfoundAb = 0, nfoundAWb = 0, nfoundWb = 0;
902 double meanDAb = 0, meanDAWb = 0, meanDWb = 0;
906 for (
int iev = 0; iev < NTest; iev++) {
907 forceQ[0] = forceQ[1] = 0;
908 std::vector<o2::track::TrackParCov> vc(2);
909 genParents[iev] =
generate(vtxGen[iev], vc, bz, genPHS, k0, k0dec, forceQ);
910 vctracks[0][iev] = vc[0];
911 vctracks[1][iev] = vc[1];
914 ft.setUseAbsDCA(
true);
915 std::fill(fitters_host.begin(), fitters_host.end(), ft);
918 std::vector<int> ncAb(NTest, 0);
919 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAb, vctracks[0], vctracks[1]);
922 for (
int iev = 0; iev < NTest; iev++) {
923 LOG(
debug) <<
"fit abs.dist " << iev <<
" NC: " << ncAb[iev] <<
" Chi2: " << (ncAb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
925 auto minDb =
checkResults(outStreamB, treeName2Abulk, fitters_host[iev], vtxGen[iev], genParents[iev], k0dec);
931 ft.setUseAbsDCA(
true);
932 ft.setWeightedFinalPCA(
true);
933 std::fill(fitters_host.begin(), fitters_host.end(), ft);
935 std::vector<int> ncAWb(NTest, 0);
936 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAWb, vctracks[0], vctracks[1]);
938 for (
int iev = 0; iev < NTest; iev++) {
939 LOG(
debug) <<
"fit abs.dist " << iev <<
" NC: " << ncAWb[iev] <<
" Chi2: " << (ncAWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
941 auto minDb =
checkResults(outStreamB, treeName2AWbulk, fitters_host[iev], vtxGen[iev], genParents[iev], k0dec);
947 ft.setUseAbsDCA(
false);
948 ft.setWeightedFinalPCA(
false);
949 std::fill(fitters_host.begin(), fitters_host.end(), ft);
952 std::vector<int> ncWb(NTest, 0);
953 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncWb, vctracks[0], vctracks[1]);
956 for (
int iev = 0; iev < NTest; iev++) {
957 LOG(
debug) <<
"fit wgh.dist " << iev <<
" NC: " << ncWb[iev] <<
" Chi2: " << (ncWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
959 auto minDb =
checkResults(outStreamB, treeName2Wbulk, fitters_host[iev], vtxGen[iev], genParents[iev], k0dec);
965 meanDAb /= nfoundAb ? nfoundAb : 1;
966 meanDAWb /= nfoundAWb ? nfoundAWb : 1;
967 meanDWb /= nfoundWb ? nfoundWb : 1;
968 LOG(info) <<
"Bulk-processed " << NTest <<
" 2-prong vertices: Line : Line";
969 LOG(info) <<
"2-prongs with abs.dist minimization: eff = " << float(nfoundAb) / NTest
970 <<
" mean.dist to truth: " << meanDAb <<
" Total time: " << swAb.CpuTime() * 1000 <<
" ms";
971 LOG(info) <<
"2-prongs with abs.dist but wghPCA: eff = " << float(nfoundAWb) / NTest
972 <<
" mean.dist to truth: " << meanDAWb <<
" Total time: " << swAWb.CpuTime() * 1000 <<
" ms";
973 LOG(info) <<
"2-prongs with wgh.dist minimization: eff = " << float(nfoundWb) / NTest
974 <<
" mean.dist to truth: " << meanDWb <<
" Total time: " << swWb.CpuTime() * 1000 <<
" ms";
985 LOG(info) <<
"\n\nBulk-processing 3-prongs";
986 std::vector<int> forceQ{1, 1, 1};
990 ft.setPropagateToPCA(
true);
993 ft.setMinParamChange(1e-3);
994 ft.setMinRelChi2Change(0.9);
996 std::vector<o2::vertexing::DCAFitterN<3>> fitters_host(NTest);
997 std::vector<TLorentzVector> genParents(NTest);
999 std::string treeName3Abulk =
"pr3a", treeName3AWbulk =
"pr3aw", treeName3Wbulk =
"pr3w";
1000 TStopwatch swAb, swAWb, swWb;
1001 int nfoundAb = 0, nfoundAWb = 0, nfoundWb = 0;
1002 double meanDAb = 0, meanDAWb = 0, meanDWb = 0;
1006 for (
int iev = 0; iev < NTest; iev++) {
1007 std::vector<o2::track::TrackParCov> vc(3);
1008 genParents[iev] =
generate(vtxGen[iev], vc, bz, genPHS, dch, dchdec, forceQ);
1010 vctracks[0][iev] = vc[0];
1011 vctracks[1][iev] = vc[1];
1012 vctracks[2][iev] = vc[2];
1015 ft.setUseAbsDCA(
true);
1016 std::fill(fitters_host.begin(), fitters_host.end(), ft);
1018 std::vector<int> ncAb(NTest, 0);
1019 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAb, vctracks[0], vctracks[1], vctracks[2]);
1021 for (
int iev = 0; iev < NTest; iev++) {
1022 LOG(
debug) <<
"fit abs.dist " << iev <<
" NC: " << ncAb[iev] <<
" Chi2: " << (ncAb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
1024 auto minDb =
checkResults(outStreamB, treeName3Abulk, fitters_host[iev], vtxGen[iev], genParents[iev], dchdec);
1030 ft.setUseAbsDCA(
true);
1031 ft.setWeightedFinalPCA(
true);
1032 std::fill(fitters_host.begin(), fitters_host.end(), ft);
1035 std::vector<int> ncAWb(NTest, 0);
1036 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncAWb, vctracks[0], vctracks[1], vctracks[2]);
1038 for (
int iev = 0; iev < NTest; iev++) {
1039 LOG(
debug) <<
"fit abs.dist " << iev <<
" NC: " << ncAWb[iev] <<
" Chi2: " << (ncAWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
1041 auto minDb =
checkResults(outStreamB, treeName3AWbulk, fitters_host[iev], vtxGen[iev], genParents[iev], dchdec);
1047 ft.setUseAbsDCA(
false);
1048 ft.setWeightedFinalPCA(
false);
1049 std::fill(fitters_host.begin(), fitters_host.end(), ft);
1052 std::vector<int> ncWb(NTest, 0);
1053 device::processBulk(nBlocks, nThreads, nBatches, fitters_host, ncWb, vctracks[0], vctracks[1], vctracks[2]);
1055 for (
int iev = 0; iev < NTest; iev++) {
1056 LOG(
debug) <<
"fit wgh.dist " << iev <<
" NC: " << ncWb[iev] <<
" Chi2: " << (ncWb[iev] ? fitters_host[iev].getChi2AtPCACandidate(0) : -1);
1058 auto minDb =
checkResults(outStreamB, treeName3Wbulk, fitters_host[iev], vtxGen[iev], genParents[iev], dchdec);
1065 meanDAb /= nfoundAb ? nfoundAb : 1;
1066 meanDAWb /= nfoundAWb ? nfoundAWb : 1;
1067 meanDWb /= nfoundWb ? nfoundWb : 1;
1068 LOG(info) <<
"Bulk-processed " << NTest <<
" 3-prong vertices";
1069 LOG(info) <<
"3-prongs with abs.dist minimization: eff = " << float(nfoundAb) / NTest
1070 <<
" mean.dist to truth: " << meanDAb <<
" Total time: " << swAb.CpuTime() * 1000 <<
" ms";
1071 LOG(info) <<
"3-prongs with abs.dist but wghPCA: eff = " << float(nfoundAWb) / NTest
1072 <<
" mean.dist to truth: " << meanDAWb <<
" Total time: " << swAWb.CpuTime() * 1000 <<
" ms";
1073 LOG(info) <<
"3-prongs with wgh.dist minimization: eff = " << float(nfoundWb) / NTest
1074 <<
" mean.dist to truth: " << meanDWb <<
" Total time: " << swWb.CpuTime() * 1000 <<
" ms";