1818
1919#include " PWGHF/Core/HfMlResponse.h"
2020
21+ #include " Common/Core/RecoDecay.h"
2122#include " Tools/ML/MlResponse.h"
2223
2324#include < cstdint>
2627// Fill the map of available input features
2728// the key is the feature's name (std::string)
2829// the value is the corresponding value in EnumInputFeatures
29- #define FILL_MAP_XIC0TOXIPIKF (FEATURE ) \
30- { \
31- #FEATURE , static_cast <uint8_t >(InputFeaturesXic0ToXiPiKf::FEATURE ) \
32- }
30+ #define FILL_MAP_XIC0TOXIPIKF (FEATURE ) \
31+ { \
32+ #FEATURE , static_cast <uint8_t >(InputFeaturesXic0ToXiPiKf::FEATURE )}
3333
3434// Check if the index of mCachedIndices (index associated to a FEATURE)
3535// matches the entry in EnumInputFeatures associated to this FEATURE
3636// if so, the inputFeatures vector is filled with the FEATURE's value
3737// by calling the corresponding GETTER from OBJECT
3838#define CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (OBJECT, FEATURE, GETTER ) \
3939 case static_cast <uint8_t >(InputFeaturesXic0ToXiPiKf::FEATURE ): { \
40- inputFeatures.emplace_back (OBJECT .GETTER ()); \
40+ inputFeatures.emplace_back (( OBJECT ) .GETTER ()); \
4141 break ; \
4242 }
4343
4848 break ; \
4949 }
5050
51+ #define CHECK_AND_FILL_VEC_XIC0TOXIPIKF_VALUE (FEATURE, VALUE ) \
52+ case static_cast <uint8_t >(InputFeaturesXic0ToXiPiKf::FEATURE ): { \
53+ inputFeatures.emplace_back (VALUE ); \
54+ break ; \
55+ }
56+
57+ #define FILL_MAP_XIC0TOXIPIKF_AS (NAME, FEATURE ) \
58+ {NAME , static_cast <uint8_t >(InputFeaturesXic0ToXiPiKf::FEATURE )}
59+
5160namespace o2 ::analysis
5261{
5362
5463enum class InputFeaturesXic0ToXiPiKf : uint8_t {
64+ // Existing feature keys retained for backwards compatibility.
5565 tpcNSigmaPiFromLambda,
5666 tpcNSigmaPiFromCasc,
5767 tpcNSigmaPiFromCharmBaryon,
@@ -65,7 +75,24 @@ enum class InputFeaturesXic0ToXiPiKf : uint8_t {
6575 chi2TopoCascToPv,
6676 chi2TopoCascToXic,
6777 cosPaCascToXic,
68- decayLenXYCasc
78+ decayLenXYCasc,
79+ // Remaining features used by the local PbPb Transformer.
80+ decayLenXYXic,
81+ chi2TopoXicToPv,
82+ chi2TopoPiFromXicToPv,
83+ kfptPiFromXic,
84+ cosPaCascToPv,
85+ dcaXYToPvCascDau,
86+ decayLenXYLambda,
87+ v0Chi2OverNdf,
88+ chi2TopoV0ToPv,
89+ chi2TopoV0ToCasc,
90+ cosPaV0ToPv,
91+ cosPaV0ToCasc,
92+ dcaV0Dau,
93+ dcaXYToPvV0Dau0,
94+ dcaXYToPvV0Dau1,
95+ tpcNSigmaPrFromLambda
6996};
7097
7198template <typename TypeOutputScore = float >
@@ -81,34 +108,50 @@ class HfMlResponseXic0ToXiPiKf : public HfMlResponse<TypeOutputScore>
81108 // / \param candidate is the Xic0 candidate
82109 // / \return inputFeatures vector
83110 template <typename T1 , typename T2 , typename T3 >
84- // std::vector<float> getInputFeatures(T1 const& candidate)
85- std::vector< float > getInputFeatures ( T1 const & candidate, T2 const & lamProngPi, T2 const & cascProngPi, T3 const & charmBaryonProngPi)
111+ std::vector<float > getInputFeatures (T1 const & candidate, T2 const & lamProngPi, T2 const & lamProngPr,
112+ T2 const & cascProngPi, T3 const & charmBaryonProngPi)
86113 {
87114 std::vector<float > inputFeatures;
115+ inputFeatures.reserve (MlResponse<TypeOutputScore>::mCachedIndices .size ());
88116
89117 for (const auto & idx : MlResponse<TypeOutputScore>::mCachedIndices ) {
90118 switch (idx) {
91- // PID variables
92- CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (lamProngPi, tpcNSigmaPiFromLambda, tpcNSigmaPi);
93- CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (cascProngPi, tpcNSigmaPiFromCasc, tpcNSigmaPi);
94- CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (charmBaryonProngPi, tpcNSigmaPiFromCharmBaryon, tpcNSigmaPi);
95- // DCA
96- CHECK_AND_FILL_VEC_XIC0TOXIPIKF (dcaCascDau);
119+ // Xic candidate topology.
120+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (decayLenXYXic);
121+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (xicChi2OverNdf);
122+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (chi2TopoXicToPv);
97123 CHECK_AND_FILL_VEC_XIC0TOXIPIKF (dcaCharmBaryonDau);
124+ // Bachelor pion from Xic.
98125 CHECK_AND_FILL_VEC_XIC0TOXIPIKF (kfDcaXYPiFromXic);
99- CHECK_AND_FILL_VEC_XIC0TOXIPIKF (kfDcaXYCascToPv);
100- // Chi2Geo
126+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (chi2TopoPiFromXicToPv);
127+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF_VALUE (kfptPiFromXic, RecoDecay::sqrtSumOfSquares (candidate.pxBachFromCharmBaryon (), candidate.pyBachFromCharmBaryon ()));
128+ // Cascade.
129+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (decayLenXYCasc);
101130 CHECK_AND_FILL_VEC_XIC0TOXIPIKF (cascChi2OverNdf);
102- CHECK_AND_FILL_VEC_XIC0TOXIPIKF (xicChi2OverNdf);
103- // ldl
104- CHECK_AND_FILL_VEC_XIC0TOXIPIKF (cascldl);
105- // Chi2Topo
106131 CHECK_AND_FILL_VEC_XIC0TOXIPIKF (chi2TopoCascToPv);
107132 CHECK_AND_FILL_VEC_XIC0TOXIPIKF (chi2TopoCascToXic);
108- // CosPa
133+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (candidate, cosPaCascToPv, cosPACasc);
109134 CHECK_AND_FILL_VEC_XIC0TOXIPIKF (cosPaCascToXic);
110- // Decay length
111- CHECK_AND_FILL_VEC_XIC0TOXIPIKF (decayLenXYCasc);
135+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (dcaCascDau);
136+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (kfDcaXYCascToPv);
137+ // Pion from cascade.
138+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (cascProngPi, tpcNSigmaPiFromCasc, tpcNSigmaPi);
139+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (dcaXYToPvCascDau);
140+ // Lambda and its charged daughters. The selector passes sign-corrected prongs.
141+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (decayLenXYLambda);
142+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (v0Chi2OverNdf);
143+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (chi2TopoV0ToPv);
144+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (chi2TopoV0ToCasc);
145+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (candidate, cosPaV0ToPv, cosPAV0);
146+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (cosPaV0ToCasc);
147+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (dcaV0Dau);
148+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (dcaXYToPvV0Dau0);
149+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (dcaXYToPvV0Dau1);
150+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (lamProngPr, tpcNSigmaPrFromLambda, tpcNSigmaPr);
151+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (lamProngPi, tpcNSigmaPiFromLambda, tpcNSigmaPi);
152+ // Legacy features that are not part of the local 28-feature model.
153+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL (charmBaryonProngPi, tpcNSigmaPiFromCharmBaryon, tpcNSigmaPi);
154+ CHECK_AND_FILL_VEC_XIC0TOXIPIKF (cascldl);
112155 }
113156 }
114157
@@ -120,28 +163,58 @@ class HfMlResponseXic0ToXiPiKf : public HfMlResponse<TypeOutputScore>
120163 void setAvailableInputFeatures ()
121164 {
122165 MlResponse<TypeOutputScore>::mAvailableInputFeatures = {
123- FILL_MAP_XIC0TOXIPIKF (tpcNSigmaPiFromLambda ),
124- FILL_MAP_XIC0TOXIPIKF (tpcNSigmaPiFromCasc ),
125- FILL_MAP_XIC0TOXIPIKF (tpcNSigmaPiFromCharmBaryon ),
126- FILL_MAP_XIC0TOXIPIKF (dcaCascDau ),
166+ FILL_MAP_XIC0TOXIPIKF_AS ( " fDecayLenXYXic " , decayLenXYXic ),
167+ FILL_MAP_XIC0TOXIPIKF (xicChi2OverNdf ),
168+ FILL_MAP_XIC0TOXIPIKF_AS ( " fXicChi2OverNdf " , xicChi2OverNdf ),
169+ FILL_MAP_XIC0TOXIPIKF_AS ( " fChi2TopoXicToPv " , chi2TopoXicToPv ),
127170 FILL_MAP_XIC0TOXIPIKF (dcaCharmBaryonDau),
171+ FILL_MAP_XIC0TOXIPIKF_AS (" fDcaCharmBaryonDau" , dcaCharmBaryonDau),
128172 FILL_MAP_XIC0TOXIPIKF (kfDcaXYPiFromXic),
129- FILL_MAP_XIC0TOXIPIKF (kfDcaXYCascToPv),
173+ FILL_MAP_XIC0TOXIPIKF_AS (" fKfDcaXYPiFromXic" , kfDcaXYPiFromXic),
174+ FILL_MAP_XIC0TOXIPIKF_AS (" fChi2TopoPiFromXicToPv" , chi2TopoPiFromXicToPv),
175+ FILL_MAP_XIC0TOXIPIKF_AS (" fKfptPiFromXic" , kfptPiFromXic),
176+ FILL_MAP_XIC0TOXIPIKF (decayLenXYCasc),
177+ FILL_MAP_XIC0TOXIPIKF_AS (" fDecayLenXYCasc" , decayLenXYCasc),
130178 FILL_MAP_XIC0TOXIPIKF (cascChi2OverNdf),
131- FILL_MAP_XIC0TOXIPIKF (xicChi2OverNdf),
132- FILL_MAP_XIC0TOXIPIKF (cascldl),
179+ FILL_MAP_XIC0TOXIPIKF_AS (" fCascChi2OverNdf" , cascChi2OverNdf),
133180 FILL_MAP_XIC0TOXIPIKF (chi2TopoCascToPv),
181+ FILL_MAP_XIC0TOXIPIKF_AS (" fChi2TopoCascToPv" , chi2TopoCascToPv),
134182 FILL_MAP_XIC0TOXIPIKF (chi2TopoCascToXic),
183+ FILL_MAP_XIC0TOXIPIKF_AS (" fChi2TopoCascToXic" , chi2TopoCascToXic),
184+ FILL_MAP_XIC0TOXIPIKF_AS (" fCosPaCascToPv" , cosPaCascToPv),
135185 FILL_MAP_XIC0TOXIPIKF (cosPaCascToXic),
136- FILL_MAP_XIC0TOXIPIKF (decayLenXYCasc),
186+ FILL_MAP_XIC0TOXIPIKF_AS (" fCosPaCascToXic" , cosPaCascToXic),
187+ FILL_MAP_XIC0TOXIPIKF (dcaCascDau),
188+ FILL_MAP_XIC0TOXIPIKF_AS (" fDcaCascDau" , dcaCascDau),
189+ FILL_MAP_XIC0TOXIPIKF (kfDcaXYCascToPv),
190+ FILL_MAP_XIC0TOXIPIKF_AS (" fKfDcaXYCascToPv" , kfDcaXYCascToPv),
191+ FILL_MAP_XIC0TOXIPIKF (tpcNSigmaPiFromCasc),
192+ FILL_MAP_XIC0TOXIPIKF_AS (" fTpcNSigmaPiFromCasc" , tpcNSigmaPiFromCasc),
193+ FILL_MAP_XIC0TOXIPIKF_AS (" fDcaXYToPvCascDau" , dcaXYToPvCascDau),
194+ FILL_MAP_XIC0TOXIPIKF_AS (" fDecayLenXYLambda" , decayLenXYLambda),
195+ FILL_MAP_XIC0TOXIPIKF_AS (" fV0Chi2OverNdf" , v0Chi2OverNdf),
196+ FILL_MAP_XIC0TOXIPIKF_AS (" fChi2TopoV0ToPv" , chi2TopoV0ToPv),
197+ FILL_MAP_XIC0TOXIPIKF_AS (" fChi2TopoV0ToCasc" , chi2TopoV0ToCasc),
198+ FILL_MAP_XIC0TOXIPIKF_AS (" fCosPaV0ToPv" , cosPaV0ToPv),
199+ FILL_MAP_XIC0TOXIPIKF_AS (" fCosPaV0ToCasc" , cosPaV0ToCasc),
200+ FILL_MAP_XIC0TOXIPIKF_AS (" fDcaV0Dau" , dcaV0Dau),
201+ FILL_MAP_XIC0TOXIPIKF_AS (" fDcaXYToPvV0Dau0" , dcaXYToPvV0Dau0),
202+ FILL_MAP_XIC0TOXIPIKF_AS (" fDcaXYToPvV0Dau1" , dcaXYToPvV0Dau1),
203+ FILL_MAP_XIC0TOXIPIKF_AS (" fTpcNSigmaPrFromLambda" , tpcNSigmaPrFromLambda),
204+ FILL_MAP_XIC0TOXIPIKF (tpcNSigmaPiFromLambda),
205+ FILL_MAP_XIC0TOXIPIKF_AS (" fTpcNSigmaPiFromLambda" , tpcNSigmaPiFromLambda),
206+ FILL_MAP_XIC0TOXIPIKF (tpcNSigmaPiFromCharmBaryon),
207+ FILL_MAP_XIC0TOXIPIKF (cascldl),
137208 };
138209 }
139210};
140211
141212} // namespace o2::analysis
142213
143214#undef FILL_MAP_XIC0TOXIPIKF
215+ #undef FILL_MAP_XIC0TOXIPIKF_AS
144216#undef CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL
145217#undef CHECK_AND_FILL_VEC_XIC0TOXIPIKF
218+ #undef CHECK_AND_FILL_VEC_XIC0TOXIPIKF_VALUE
146219
147220#endif // PWGHF_CORE_HFMLRESPONSEXIC0TOXIPIKF_H_
0 commit comments