diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h
index 009735144a7..5cdfbca4a00 100644
--- a/PWGHF/DataModel/CandidateReconstructionTables.h
+++ b/PWGHF/DataModel/CandidateReconstructionTables.h
@@ -484,26 +484,27 @@ DECLARE_SOA_COLUMN(ErrorImpactParameterZ2, errorImpactParameterZ2, float);
DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterZNormalised2, impactParameterZNormalised2, //!
[](float dca, float err) -> float { return dca / err; });
/// prong PID nsigma
-DECLARE_SOA_COLUMN(NProngsContributorsPV, nProngsContributorsPV, uint8_t); //! number of prongs contributing to the primary-vertex reconstruction
-DECLARE_SOA_COLUMN(NSigTpcPi0, nSigTpcPi0, float); //! TPC nSigma for pion hypothesis - prong 0
-DECLARE_SOA_COLUMN(NSigTpcPi1, nSigTpcPi1, float); //! TPC nSigma for pion hypothesis - prong 1
-DECLARE_SOA_COLUMN(NSigTpcPi2, nSigTpcPi2, float); //! TPC nSigma for pion hypothesis - prong 2
-DECLARE_SOA_COLUMN(NSigTpcKa0, nSigTpcKa0, float); //! TPC nSigma for kaon hypothesis - prong 0
-DECLARE_SOA_COLUMN(NSigTpcKa1, nSigTpcKa1, float); //! TPC nSigma for kaon hypothesis - prong 1
-DECLARE_SOA_COLUMN(NSigTpcKa2, nSigTpcKa2, float); //! TPC nSigma for kaon hypothesis - prong 2
-DECLARE_SOA_COLUMN(NSigTpcPr0, nSigTpcPr0, float); //! TPC nSigma for proton hypothesis - prong 0
-DECLARE_SOA_COLUMN(NSigTpcPr1, nSigTpcPr1, float); //! TPC nSigma for proton hypothesis - prong 1
-DECLARE_SOA_COLUMN(NSigTpcPr2, nSigTpcPr2, float); //! TPC nSigma for proton hypothesis - prong 2
-DECLARE_SOA_COLUMN(NSigTofPi0, nSigTofPi0, float); //! TOF nSigma for pion hypothesis - prong 0
-DECLARE_SOA_COLUMN(NSigTofPi1, nSigTofPi1, float); //! TOF nSigma for pion hypothesis - prong 1
-DECLARE_SOA_COLUMN(NSigTofPi2, nSigTofPi2, float); //! TOF nSigma for pion hypothesis - prong 2
-DECLARE_SOA_COLUMN(NSigTofKa0, nSigTofKa0, float); //! TOF nSigma for kaon hypothesis - prong 0
-DECLARE_SOA_COLUMN(NSigTofKa1, nSigTofKa1, float); //! TOF nSigma for kaon hypothesis - prong 1
-DECLARE_SOA_COLUMN(NSigTofKa2, nSigTofKa2, float); //! TOF nSigma for kaon hypothesis - prong 2
-DECLARE_SOA_COLUMN(NSigTofPr0, nSigTofPr0, float); //! TOF nSigma for proton hypothesis - prong 0
-DECLARE_SOA_COLUMN(NSigTofPr1, nSigTofPr1, float); //! TOF nSigma for proton hypothesis - prong 1
-DECLARE_SOA_COLUMN(NSigTofPr2, nSigTofPr2, float); //! TOF nSigma for proton hypothesis - prong 2
-DECLARE_SOA_DYNAMIC_COLUMN(TpcTofNSigmaPi0, tpcTofNSigmaPi0, //! Combined NSigma separation with the TPC & TOF detectors for pion - prong 0
+DECLARE_SOA_COLUMN(NProngsContributorsPV, nProngsContributorsPV, uint8_t); //! number of prongs contributing to the primary-vertex reconstruction
+DECLARE_SOA_COLUMN(BitmapProngsContributorsPV, bitmapProngsContributorsPV, uint8_t); //! bitmap with booleans indicating prongs contributing to the primary-vertex reconstruction
+DECLARE_SOA_COLUMN(NSigTpcPi0, nSigTpcPi0, float); //! TPC nSigma for pion hypothesis - prong 0
+DECLARE_SOA_COLUMN(NSigTpcPi1, nSigTpcPi1, float); //! TPC nSigma for pion hypothesis - prong 1
+DECLARE_SOA_COLUMN(NSigTpcPi2, nSigTpcPi2, float); //! TPC nSigma for pion hypothesis - prong 2
+DECLARE_SOA_COLUMN(NSigTpcKa0, nSigTpcKa0, float); //! TPC nSigma for kaon hypothesis - prong 0
+DECLARE_SOA_COLUMN(NSigTpcKa1, nSigTpcKa1, float); //! TPC nSigma for kaon hypothesis - prong 1
+DECLARE_SOA_COLUMN(NSigTpcKa2, nSigTpcKa2, float); //! TPC nSigma for kaon hypothesis - prong 2
+DECLARE_SOA_COLUMN(NSigTpcPr0, nSigTpcPr0, float); //! TPC nSigma for proton hypothesis - prong 0
+DECLARE_SOA_COLUMN(NSigTpcPr1, nSigTpcPr1, float); //! TPC nSigma for proton hypothesis - prong 1
+DECLARE_SOA_COLUMN(NSigTpcPr2, nSigTpcPr2, float); //! TPC nSigma for proton hypothesis - prong 2
+DECLARE_SOA_COLUMN(NSigTofPi0, nSigTofPi0, float); //! TOF nSigma for pion hypothesis - prong 0
+DECLARE_SOA_COLUMN(NSigTofPi1, nSigTofPi1, float); //! TOF nSigma for pion hypothesis - prong 1
+DECLARE_SOA_COLUMN(NSigTofPi2, nSigTofPi2, float); //! TOF nSigma for pion hypothesis - prong 2
+DECLARE_SOA_COLUMN(NSigTofKa0, nSigTofKa0, float); //! TOF nSigma for kaon hypothesis - prong 0
+DECLARE_SOA_COLUMN(NSigTofKa1, nSigTofKa1, float); //! TOF nSigma for kaon hypothesis - prong 1
+DECLARE_SOA_COLUMN(NSigTofKa2, nSigTofKa2, float); //! TOF nSigma for kaon hypothesis - prong 2
+DECLARE_SOA_COLUMN(NSigTofPr0, nSigTofPr0, float); //! TOF nSigma for proton hypothesis - prong 0
+DECLARE_SOA_COLUMN(NSigTofPr1, nSigTofPr1, float); //! TOF nSigma for proton hypothesis - prong 1
+DECLARE_SOA_COLUMN(NSigTofPr2, nSigTofPr2, float); //! TOF nSigma for proton hypothesis - prong 2
+DECLARE_SOA_DYNAMIC_COLUMN(TpcTofNSigmaPi0, tpcTofNSigmaPi0, //! Combined NSigma separation with the TPC & TOF detectors for pion - prong 0
[](float tpcNSigmaPi0, float tofNSigmaPi0) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi0, tofNSigmaPi0); });
DECLARE_SOA_DYNAMIC_COLUMN(TpcTofNSigmaPi1, tpcTofNSigmaPi1, //! Combined NSigma separation with the TPC & TOF detectors for pion - prong 1
[](float tpcNSigmaPi1, float tofNSigmaPi1) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi1, tofNSigmaPi1); });
@@ -664,7 +665,7 @@ DECLARE_SOA_TABLE(HfCand2ProngBase, "AOD", "HFCAND2PBASE", //!
hf_cand::ErrorImpactParameter0, hf_cand::ErrorImpactParameter1,
hf_cand::ImpactParameterZ0, hf_cand::ImpactParameterZ1,
hf_cand::ErrorImpactParameterZ0, hf_cand::ErrorImpactParameterZ1,
- hf_track_index::Prong0Id, hf_track_index::Prong1Id, hf_cand::NProngsContributorsPV,
+ hf_track_index::Prong0Id, hf_track_index::Prong1Id, hf_cand::NProngsContributorsPV, hf_cand::BitmapProngsContributorsPV,
hf_track_index::HFflag,
/* dynamic columns */
hf_cand_2prong::M,
@@ -970,7 +971,7 @@ DECLARE_SOA_TABLE(HfCand3ProngBase, "AOD", "HFCAND3PBASE", //!
hf_cand::ErrorImpactParameter0, hf_cand::ErrorImpactParameter1, hf_cand::ErrorImpactParameter2,
hf_cand::ImpactParameterZ0, hf_cand::ImpactParameterZ1, hf_cand::ImpactParameterZ2,
hf_cand::ErrorImpactParameterZ0, hf_cand::ErrorImpactParameterZ1, hf_cand::ErrorImpactParameterZ2,
- hf_track_index::Prong0Id, hf_track_index::Prong1Id, hf_track_index::Prong2Id, hf_cand::NProngsContributorsPV,
+ hf_track_index::Prong0Id, hf_track_index::Prong1Id, hf_track_index::Prong2Id, hf_cand::NProngsContributorsPV, hf_cand::BitmapProngsContributorsPV,
hf_track_index::HFflag,
/* dynamic columns */
hf_cand_3prong::M,
diff --git a/PWGHF/TableProducer/candidateCreator2Prong.cxx b/PWGHF/TableProducer/candidateCreator2Prong.cxx
index 8b464257ce6..1b05c6d463d 100644
--- a/PWGHF/TableProducer/candidateCreator2Prong.cxx
+++ b/PWGHF/TableProducer/candidateCreator2Prong.cxx
@@ -281,13 +281,14 @@ struct HfCandidateCreator2Prong {
auto errorDecayLengthXY = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, 0.) + getRotatedCovMatrixXX(covMatrixPCA, phi, 0.));
auto indexCollision = collision.globalIndex();
- uint8_t nProngsContributorsPV = 0;
+ uint8_t bitmapProngsContributorsPV = 0;
if (indexCollision == track0.collisionId() && track0.isPVContributor()) {
- nProngsContributorsPV += 1;
+ SETBIT(bitmapProngsContributorsPV, 0);
}
if (indexCollision == track1.collisionId() && track1.isPVContributor()) {
- nProngsContributorsPV += 1;
+ SETBIT(bitmapProngsContributorsPV, 1);
}
+ uint8_t nProngsContributorsPV = hf_trkcandsel::countOnesInBinary(bitmapProngsContributorsPV);
// fill candidate table rows
rowCandidateBase(indexCollision,
@@ -301,7 +302,7 @@ struct HfCandidateCreator2Prong {
std::sqrt(impactParameter0.getSigmaY2()), std::sqrt(impactParameter1.getSigmaY2()),
impactParameter0.getZ(), impactParameter1.getZ(),
std::sqrt(impactParameter0.getSigmaZ2()), std::sqrt(impactParameter1.getSigmaZ2()),
- rowTrackIndexProng2.prong0Id(), rowTrackIndexProng2.prong1Id(), nProngsContributorsPV,
+ rowTrackIndexProng2.prong0Id(), rowTrackIndexProng2.prong1Id(), nProngsContributorsPV, bitmapProngsContributorsPV,
rowTrackIndexProng2.hfflag());
// fill candidate prong PID rows
@@ -432,13 +433,14 @@ struct HfCandidateCreator2Prong {
}
auto indexCollision = collision.globalIndex();
- uint8_t nProngsContributorsPV = 0;
+ uint8_t bitmapProngsContributorsPV = 0;
if (indexCollision == track0.collisionId() && track0.isPVContributor()) {
- nProngsContributorsPV += 1;
+ SETBIT(bitmapProngsContributorsPV, 0);
}
if (indexCollision == track1.collisionId() && track1.isPVContributor()) {
- nProngsContributorsPV += 1;
+ SETBIT(bitmapProngsContributorsPV, 1);
}
+ uint8_t nProngsContributorsPV = hf_trkcandsel::countOnesInBinary(bitmapProngsContributorsPV);
// fill candidate table rows
rowCandidateBase(indexCollision,
@@ -452,7 +454,7 @@ struct HfCandidateCreator2Prong {
errImpactParameter0XY, errImpactParameter1XY,
0.f, 0.f,
0.f, 0.f,
- rowTrackIndexProng2.prong0Id(), rowTrackIndexProng2.prong1Id(), nProngsContributorsPV,
+ rowTrackIndexProng2.prong0Id(), rowTrackIndexProng2.prong1Id(), nProngsContributorsPV, bitmapProngsContributorsPV,
rowTrackIndexProng2.hfflag());
// fill candidate prong PID rows
diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx
index e7c464efa72..1361eed0b13 100644
--- a/PWGHF/TableProducer/candidateCreator3Prong.cxx
+++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx
@@ -275,16 +275,17 @@ struct HfCandidateCreator3Prong {
auto errorDecayLengthXY = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, 0.) + getRotatedCovMatrixXX(covMatrixPCA, phi, 0.));
auto indexCollision = collision.globalIndex();
- uint8_t nProngsContributorsPV = 0;
+ uint8_t bitmapProngsContributorsPV = 0;
if (indexCollision == track0.collisionId() && track0.isPVContributor()) {
- nProngsContributorsPV += 1;
+ SETBIT(bitmapProngsContributorsPV, 0);
}
if (indexCollision == track1.collisionId() && track1.isPVContributor()) {
- nProngsContributorsPV += 1;
+ SETBIT(bitmapProngsContributorsPV, 1);
}
if (indexCollision == track2.collisionId() && track2.isPVContributor()) {
- nProngsContributorsPV += 1;
+ SETBIT(bitmapProngsContributorsPV, 2);
}
+ uint8_t nProngsContributorsPV = hf_trkcandsel::countOnesInBinary(bitmapProngsContributorsPV);
// fill candidate table rows
rowCandidateBase(indexCollision,
@@ -299,7 +300,7 @@ struct HfCandidateCreator3Prong {
std::sqrt(impactParameter0.getSigmaY2()), std::sqrt(impactParameter1.getSigmaY2()), std::sqrt(impactParameter2.getSigmaY2()),
impactParameter0.getZ(), impactParameter1.getZ(), impactParameter2.getZ(),
std::sqrt(impactParameter0.getSigmaZ2()), std::sqrt(impactParameter1.getSigmaZ2()), std::sqrt(impactParameter2.getSigmaZ2()),
- rowTrackIndexProng3.prong0Id(), rowTrackIndexProng3.prong1Id(), rowTrackIndexProng3.prong2Id(), nProngsContributorsPV,
+ rowTrackIndexProng3.prong0Id(), rowTrackIndexProng3.prong1Id(), rowTrackIndexProng3.prong2Id(), nProngsContributorsPV, bitmapProngsContributorsPV,
rowTrackIndexProng3.hfflag());
// fill histograms
diff --git a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx
index f0c1c1503c2..07f869382a1 100644
--- a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx
+++ b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx
@@ -101,6 +101,7 @@ DECLARE_SOA_TABLE(HfCandLcLites, "AOD", "HFCANDLCLITE",
collision::PosY,
collision::PosZ,
hf_cand::NProngsContributorsPV,
+ hf_cand::BitmapProngsContributorsPV,
// hf_cand::ErrorDecayLength,
// hf_cand::ErrorDecayLengthXY,
hf_cand::Chi2PCA,
@@ -159,6 +160,7 @@ DECLARE_SOA_TABLE(HfCandLcFulls, "AOD", "HFCANDLCFULL",
collision::PosY,
collision::PosZ,
hf_cand::NProngsContributorsPV,
+ hf_cand::BitmapProngsContributorsPV,
hf_cand::XSecondaryVertex,
hf_cand::YSecondaryVertex,
hf_cand::ZSecondaryVertex,
@@ -357,6 +359,7 @@ struct HfTreeCreatorLcToPKPi {
candidate.posY(),
candidate.posZ(),
candidate.nProngsContributorsPV(),
+ candidate.bitmapProngsContributorsPV(),
// candidate.errorDecayLength(),
// candidate.errorDecayLengthXY(),
candidate.chi2PCA(),
@@ -419,6 +422,7 @@ struct HfTreeCreatorLcToPKPi {
candidate.posY(),
candidate.posZ(),
candidate.nProngsContributorsPV(),
+ candidate.bitmapProngsContributorsPV(),
candidate.xSecondaryVertex(),
candidate.ySecondaryVertex(),
candidate.zSecondaryVertex(),
@@ -614,6 +618,7 @@ struct HfTreeCreatorLcToPKPi {
candidate.posY(),
candidate.posZ(),
candidate.nProngsContributorsPV(),
+ candidate.bitmapProngsContributorsPV(),
// candidate.errorDecayLength(),
// candidate.errorDecayLengthXY(),
candidate.chi2PCA(),
@@ -676,6 +681,7 @@ struct HfTreeCreatorLcToPKPi {
candidate.posY(),
candidate.posZ(),
candidate.nProngsContributorsPV(),
+ candidate.bitmapProngsContributorsPV(),
candidate.xSecondaryVertex(),
candidate.ySecondaryVertex(),
candidate.zSecondaryVertex(),
diff --git a/PWGHF/Utils/utilsTrkCandHf.h b/PWGHF/Utils/utilsTrkCandHf.h
index 073e416236d..a1d1b41c10f 100644
--- a/PWGHF/Utils/utilsTrkCandHf.h
+++ b/PWGHF/Utils/utilsTrkCandHf.h
@@ -41,6 +41,19 @@ void setLabelHistoCands(Histo& hCandidates)
hCandidates->GetXaxis()->SetBinLabel(SVFitting::Fail + 1, "Run-time error in secondary vertexing");
}
+/// @brief Function to evaluate number of ones in a binary representation of the argument
+/// \param num is the input argument
+int countOnesInBinary(uint8_t num)
+{
+ int count = 0;
+
+ for (int iBit = 0; iBit < 8; iBit++) {
+ count += TESTBIT(num, iBit);
+ }
+
+ return count;
+}
+
} // namespace o2::hf_trkcandsel
#endif // PWGHF_UTILS_UTILSTRKCANDHF_H_