Skip to content

Commit d1345ff

Browse files
authored
[PWGHF] Add B0 derived-data creator. Add ML in B0 selector (#11163)
1 parent 317e24f commit d1345ff

File tree

7 files changed

+747
-126
lines changed

7 files changed

+747
-126
lines changed

PWGHF/Core/HfMlResponseB0ToDPi.h

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
/// \file HfMlResponseB0ToDPi.h
1313
/// \brief Class to compute the ML response for B0 → D∓ π± analysis selections
1414
/// \author Alexandre Bigot <alexandre.bigot@cern.ch>, IPHC Strasbourg
15+
/// \author Vít Kučera <vit.kucera@cern.ch>, Inha University
1516

1617
#ifndef PWGHF_CORE_HFMLRESPONSEB0TODPI_H_
1718
#define PWGHF_CORE_HFMLRESPONSEB0TODPI_H_
@@ -59,6 +60,14 @@
5960
break; \
6061
}
6162

63+
//
64+
// Make FEATURE from an element of VECTOR at INDEX.
65+
#define CHECK_AND_FILL_VEC_B0_INDEX(FEATURE, VECTOR, INDEX) \
66+
case static_cast<uint8_t>(InputFeaturesB0ToDPi::FEATURE): { \
67+
inputFeatures.emplace_back((VECTOR)[INDEX]); \
68+
break; \
69+
}
70+
6271
namespace o2::analysis
6372
{
6473

@@ -84,7 +93,7 @@ enum class InputFeaturesB0ToDPi : uint8_t {
8493
tpcTofNSigmaPi1
8594
};
8695

87-
template <typename TypeOutputScore = float>
96+
template <typename TypeOutputScore, bool reduced>
8897
class HfMlResponseB0ToDPi : public HfMlResponse<TypeOutputScore>
8998
{
9099
public:
@@ -99,57 +108,50 @@ class HfMlResponseB0ToDPi : public HfMlResponse<TypeOutputScore>
99108
/// \return inputFeatures vector
100109
template <bool withDmesMl, typename T1, typename T2>
101110
std::vector<float> getInputFeatures(T1 const& candidate,
102-
T2 const& prong1)
111+
T2 const& prong1,
112+
const std::vector<float>* mlScoresD = nullptr)
103113
{
104114
std::vector<float> inputFeatures;
105115

106116
for (const auto& idx : MlResponse<TypeOutputScore>::mCachedIndices) {
117+
switch (idx) {
118+
CHECK_AND_FILL_VEC_B0(ptProng0);
119+
CHECK_AND_FILL_VEC_B0(ptProng1);
120+
CHECK_AND_FILL_VEC_B0(impactParameter0);
121+
CHECK_AND_FILL_VEC_B0(impactParameter1);
122+
CHECK_AND_FILL_VEC_B0(impactParameterProduct);
123+
CHECK_AND_FILL_VEC_B0(chi2PCA);
124+
CHECK_AND_FILL_VEC_B0(decayLength);
125+
CHECK_AND_FILL_VEC_B0(decayLengthXY);
126+
CHECK_AND_FILL_VEC_B0(decayLengthNormalised);
127+
CHECK_AND_FILL_VEC_B0(decayLengthXYNormalised);
128+
CHECK_AND_FILL_VEC_B0(cpa);
129+
CHECK_AND_FILL_VEC_B0(cpaXY);
130+
CHECK_AND_FILL_VEC_B0(maxNormalisedDeltaIP);
131+
// TPC PID variable
132+
CHECK_AND_FILL_VEC_B0_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi);
133+
// TOF PID variable
134+
CHECK_AND_FILL_VEC_B0_FULL(prong1, tofNSigmaPi1, tofNSigmaPi);
135+
// Combined PID variables
136+
CHECK_AND_FILL_VEC_B0_FUNC(prong1, tpcTofNSigmaPi1, o2::pid_tpc_tof_utils::getTpcTofNSigmaPi1);
137+
}
107138
if constexpr (withDmesMl) {
108-
switch (idx) {
109-
CHECK_AND_FILL_VEC_B0(ptProng0);
110-
CHECK_AND_FILL_VEC_B0(ptProng1);
111-
CHECK_AND_FILL_VEC_B0(impactParameter0);
112-
CHECK_AND_FILL_VEC_B0(impactParameter1);
113-
CHECK_AND_FILL_VEC_B0(impactParameterProduct);
114-
CHECK_AND_FILL_VEC_B0(chi2PCA);
115-
CHECK_AND_FILL_VEC_B0(decayLength);
116-
CHECK_AND_FILL_VEC_B0(decayLengthXY);
117-
CHECK_AND_FILL_VEC_B0(decayLengthNormalised);
118-
CHECK_AND_FILL_VEC_B0(decayLengthXYNormalised);
119-
CHECK_AND_FILL_VEC_B0(cpa);
120-
CHECK_AND_FILL_VEC_B0(cpaXY);
121-
CHECK_AND_FILL_VEC_B0(maxNormalisedDeltaIP);
122-
CHECK_AND_FILL_VEC_B0(prong0MlScoreBkg);
123-
CHECK_AND_FILL_VEC_B0(prong0MlScorePrompt);
124-
CHECK_AND_FILL_VEC_B0(prong0MlScoreNonprompt);
125-
// TPC PID variable
126-
CHECK_AND_FILL_VEC_B0_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi);
127-
// TOF PID variable
128-
CHECK_AND_FILL_VEC_B0_FULL(prong1, tofNSigmaPi1, tofNSigmaPi);
129-
// Combined PID variables
130-
CHECK_AND_FILL_VEC_B0_FUNC(prong1, tpcTofNSigmaPi1, o2::pid_tpc_tof_utils::getTpcTofNSigmaPi1);
131-
}
132-
} else {
133-
switch (idx) {
134-
CHECK_AND_FILL_VEC_B0(ptProng0);
135-
CHECK_AND_FILL_VEC_B0(ptProng1);
136-
CHECK_AND_FILL_VEC_B0(impactParameter0);
137-
CHECK_AND_FILL_VEC_B0(impactParameter1);
138-
CHECK_AND_FILL_VEC_B0(impactParameterProduct);
139-
CHECK_AND_FILL_VEC_B0(chi2PCA);
140-
CHECK_AND_FILL_VEC_B0(decayLength);
141-
CHECK_AND_FILL_VEC_B0(decayLengthXY);
142-
CHECK_AND_FILL_VEC_B0(decayLengthNormalised);
143-
CHECK_AND_FILL_VEC_B0(decayLengthXYNormalised);
144-
CHECK_AND_FILL_VEC_B0(cpa);
145-
CHECK_AND_FILL_VEC_B0(cpaXY);
146-
CHECK_AND_FILL_VEC_B0(maxNormalisedDeltaIP);
147-
// TPC PID variable
148-
CHECK_AND_FILL_VEC_B0_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi);
149-
// TOF PID variable
150-
CHECK_AND_FILL_VEC_B0_FULL(prong1, tofNSigmaPi1, tofNSigmaPi);
151-
// Combined PID variables
152-
CHECK_AND_FILL_VEC_B0_FUNC(prong1, tpcTofNSigmaPi1, o2::pid_tpc_tof_utils::getTpcTofNSigmaPi1);
139+
if constexpr (reduced) {
140+
switch (idx) {
141+
CHECK_AND_FILL_VEC_B0(prong0MlScoreBkg);
142+
CHECK_AND_FILL_VEC_B0(prong0MlScorePrompt);
143+
CHECK_AND_FILL_VEC_B0(prong0MlScoreNonprompt);
144+
}
145+
} else {
146+
if (mlScoresD) {
147+
switch (idx) {
148+
CHECK_AND_FILL_VEC_B0_INDEX(prong0MlScoreBkg, *mlScoresD, 0);
149+
CHECK_AND_FILL_VEC_B0_INDEX(prong0MlScorePrompt, *mlScoresD, 1);
150+
CHECK_AND_FILL_VEC_B0_INDEX(prong0MlScoreNonprompt, *mlScoresD, 2);
151+
}
152+
} else {
153+
LOG(fatal) << "ML scores of D not provided";
154+
}
153155
}
154156
}
155157
}

PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ struct HfCandidateSelectorB0ToDPiReduced {
7878
// variable that will store the value of selectionFlagD (defined in dataCreatorDplusPiReduced.cxx)
7979
int mySelectionFlagD = -1;
8080

81-
o2::analysis::HfMlResponseB0ToDPi<float> hfMlResponse;
81+
o2::analysis::HfMlResponseB0ToDPi<float, true> hfMlResponse;
8282
float outputMlNotPreselected = -1.;
8383
std::vector<float> outputMl = {};
8484
o2::ccdb::CcdbApi ccdbApi;

PWGHF/DataModel/CandidateReconstructionTables.h

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! Collision
243243
DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, Tracks, "_0"); //! Index to first prong
244244
DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, Tracks, "_1"); //! Index to second prong
245245
DECLARE_SOA_INDEX_COLUMN_FULL(Prong2, prong2, int, Tracks, "_2"); //! Index to third prong
246+
DECLARE_SOA_INDEX_COLUMN_FULL(Prong3, prong3, int, Tracks, "_3"); //! Index to fourth prong
246247
DECLARE_SOA_INDEX_COLUMN(V0, v0); //! Index to V0 prong
247248
DECLARE_SOA_INDEX_COLUMN(Cascade, cascade); //! Index to cascade prong
248249
DECLARE_SOA_COLUMN(HFflag, hfflag, uint8_t); //! Bitmap to store selection results, o2-linter: disable=name/o2-column (written to disk)
@@ -483,28 +484,28 @@ DECLARE_SOA_COLUMN(ImpactParameterZ2, impactParameterZ2, float);
483484
DECLARE_SOA_COLUMN(ErrorImpactParameterZ2, errorImpactParameterZ2, float); //!
484485
DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterZNormalised2, impactParameterZNormalised2, //!
485486
[](float dca, float err) -> float { return dca / err; });
486-
/// prong PID nsigma
487487
DECLARE_SOA_COLUMN(NProngsContributorsPV, nProngsContributorsPV, uint8_t); //! number of prongs contributing to the primary-vertex reconstruction
488488
DECLARE_SOA_COLUMN(BitmapProngsContributorsPV, bitmapProngsContributorsPV, uint8_t); //! bitmap with booleans indicating prongs contributing to the primary-vertex reconstruction
489-
DECLARE_SOA_COLUMN(NSigTpcPi0, nSigTpcPi0, float); //! TPC nSigma for pion hypothesis - prong 0
490-
DECLARE_SOA_COLUMN(NSigTpcPi1, nSigTpcPi1, float); //! TPC nSigma for pion hypothesis - prong 1
491-
DECLARE_SOA_COLUMN(NSigTpcPi2, nSigTpcPi2, float); //! TPC nSigma for pion hypothesis - prong 2
492-
DECLARE_SOA_COLUMN(NSigTpcKa0, nSigTpcKa0, float); //! TPC nSigma for kaon hypothesis - prong 0
493-
DECLARE_SOA_COLUMN(NSigTpcKa1, nSigTpcKa1, float); //! TPC nSigma for kaon hypothesis - prong 1
494-
DECLARE_SOA_COLUMN(NSigTpcKa2, nSigTpcKa2, float); //! TPC nSigma for kaon hypothesis - prong 2
495-
DECLARE_SOA_COLUMN(NSigTpcPr0, nSigTpcPr0, float); //! TPC nSigma for proton hypothesis - prong 0
496-
DECLARE_SOA_COLUMN(NSigTpcPr1, nSigTpcPr1, float); //! TPC nSigma for proton hypothesis - prong 1
497-
DECLARE_SOA_COLUMN(NSigTpcPr2, nSigTpcPr2, float); //! TPC nSigma for proton hypothesis - prong 2
498-
DECLARE_SOA_COLUMN(NSigTofPi0, nSigTofPi0, float); //! TOF nSigma for pion hypothesis - prong 0
499-
DECLARE_SOA_COLUMN(NSigTofPi1, nSigTofPi1, float); //! TOF nSigma for pion hypothesis - prong 1
500-
DECLARE_SOA_COLUMN(NSigTofPi2, nSigTofPi2, float); //! TOF nSigma for pion hypothesis - prong 2
501-
DECLARE_SOA_COLUMN(NSigTofKa0, nSigTofKa0, float); //! TOF nSigma for kaon hypothesis - prong 0
502-
DECLARE_SOA_COLUMN(NSigTofKa1, nSigTofKa1, float); //! TOF nSigma for kaon hypothesis - prong 1
503-
DECLARE_SOA_COLUMN(NSigTofKa2, nSigTofKa2, float); //! TOF nSigma for kaon hypothesis - prong 2
504-
DECLARE_SOA_COLUMN(NSigTofPr0, nSigTofPr0, float); //! TOF nSigma for proton hypothesis - prong 0
505-
DECLARE_SOA_COLUMN(NSigTofPr1, nSigTofPr1, float); //! TOF nSigma for proton hypothesis - prong 1
506-
DECLARE_SOA_COLUMN(NSigTofPr2, nSigTofPr2, float); //! TOF nSigma for proton hypothesis - prong 2
507-
DECLARE_SOA_DYNAMIC_COLUMN(TpcTofNSigmaPi0, tpcTofNSigmaPi0, //! Combined NSigma separation with the TPC & TOF detectors for pion - prong 0
489+
/// prong PID nsigma
490+
DECLARE_SOA_COLUMN(NSigTpcPi0, nSigTpcPi0, float); //! TPC nSigma for pion hypothesis - prong 0
491+
DECLARE_SOA_COLUMN(NSigTpcPi1, nSigTpcPi1, float); //! TPC nSigma for pion hypothesis - prong 1
492+
DECLARE_SOA_COLUMN(NSigTpcPi2, nSigTpcPi2, float); //! TPC nSigma for pion hypothesis - prong 2
493+
DECLARE_SOA_COLUMN(NSigTpcKa0, nSigTpcKa0, float); //! TPC nSigma for kaon hypothesis - prong 0
494+
DECLARE_SOA_COLUMN(NSigTpcKa1, nSigTpcKa1, float); //! TPC nSigma for kaon hypothesis - prong 1
495+
DECLARE_SOA_COLUMN(NSigTpcKa2, nSigTpcKa2, float); //! TPC nSigma for kaon hypothesis - prong 2
496+
DECLARE_SOA_COLUMN(NSigTpcPr0, nSigTpcPr0, float); //! TPC nSigma for proton hypothesis - prong 0
497+
DECLARE_SOA_COLUMN(NSigTpcPr1, nSigTpcPr1, float); //! TPC nSigma for proton hypothesis - prong 1
498+
DECLARE_SOA_COLUMN(NSigTpcPr2, nSigTpcPr2, float); //! TPC nSigma for proton hypothesis - prong 2
499+
DECLARE_SOA_COLUMN(NSigTofPi0, nSigTofPi0, float); //! TOF nSigma for pion hypothesis - prong 0
500+
DECLARE_SOA_COLUMN(NSigTofPi1, nSigTofPi1, float); //! TOF nSigma for pion hypothesis - prong 1
501+
DECLARE_SOA_COLUMN(NSigTofPi2, nSigTofPi2, float); //! TOF nSigma for pion hypothesis - prong 2
502+
DECLARE_SOA_COLUMN(NSigTofKa0, nSigTofKa0, float); //! TOF nSigma for kaon hypothesis - prong 0
503+
DECLARE_SOA_COLUMN(NSigTofKa1, nSigTofKa1, float); //! TOF nSigma for kaon hypothesis - prong 1
504+
DECLARE_SOA_COLUMN(NSigTofKa2, nSigTofKa2, float); //! TOF nSigma for kaon hypothesis - prong 2
505+
DECLARE_SOA_COLUMN(NSigTofPr0, nSigTofPr0, float); //! TOF nSigma for proton hypothesis - prong 0
506+
DECLARE_SOA_COLUMN(NSigTofPr1, nSigTofPr1, float); //! TOF nSigma for proton hypothesis - prong 1
507+
DECLARE_SOA_COLUMN(NSigTofPr2, nSigTofPr2, float); //! TOF nSigma for proton hypothesis - prong 2
508+
DECLARE_SOA_DYNAMIC_COLUMN(TpcTofNSigmaPi0, tpcTofNSigmaPi0, //! Combined NSigma separation with the TPC & TOF detectors for pion - prong 0
508509
[](float tpcNSigmaPi0, float tofNSigmaPi0) -> float { return pid_tpc_tof_utils::combineNSigma<false /*tiny*/>(tpcNSigmaPi0, tofNSigmaPi0); });
509510
DECLARE_SOA_DYNAMIC_COLUMN(TpcTofNSigmaPi1, tpcTofNSigmaPi1, //! Combined NSigma separation with the TPC & TOF detectors for pion - prong 1
510511
[](float tpcNSigmaPi1, float tofNSigmaPi1) -> float { return pid_tpc_tof_utils::combineNSigma<false /*tiny*/>(tpcNSigmaPi1, tofNSigmaPi1); });

0 commit comments

Comments
 (0)