Skip to content

Commit 2d35d9c

Browse files
gluparelalibuild
andauthored
Add ML inference class for Lc->PKPi and related modifications to the selector (#4319)
* Add ML inference class for Lc->PKPi and related modifications to the selector * clang format * MegaLinter fixes * Implement corrections * correct clang-format --------- Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent c33b3fe commit 2d35d9c

File tree

4 files changed

+351
-5
lines changed

4 files changed

+351
-5
lines changed

PWGHF/Core/HfMlResponseLcToPKPi.h

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
/// \file HfMlResponseLcToPKPi.h
13+
/// \brief Class to compute the ML response for Lc+ → p K- π+ analysis selections
14+
/// \author Grazia Luparello <grazia.luparello@cern.ch>
15+
16+
#ifndef PWGHF_CORE_HFMLRESPONSELCTOPKPI_H_
17+
#define PWGHF_CORE_HFMLRESPONSELCTOPKPI_H_
18+
19+
#include <vector>
20+
21+
#include "PWGHF/Core/HfMlResponse.h"
22+
23+
// Fill the map of available input features
24+
// the key is the feature's name (std::string)
25+
// the value is the corresponding value in EnumInputFeatures
26+
#define FILL_MAP_LCTOPKPI(FEATURE) \
27+
{ \
28+
#FEATURE, static_cast < uint8_t>(InputFeaturesLcToPKPi::FEATURE) \
29+
}
30+
31+
// Check if the index of mCachedIndices (index associated to a FEATURE)
32+
// matches the entry in EnumInputFeatures associated to this FEATURE
33+
// if so, the inputFeatures vector is filled with the FEATURE's value
34+
// by calling the corresponding GETTER from OBJECT
35+
#define CHECK_AND_FILL_VEC_LCTOPKPI_FULL(OBJECT, FEATURE, GETTER) \
36+
case static_cast<uint8_t>(InputFeaturesLcToPKPi::FEATURE): { \
37+
inputFeatures.emplace_back(OBJECT.GETTER()); \
38+
break; \
39+
}
40+
41+
// Specific case of CHECK_AND_FILL_VEC_LCTOPKPI_FULL(OBJECT, FEATURE, GETTER)
42+
// where OBJECT is named candidate and FEATURE = GETTER
43+
#define CHECK_AND_FILL_VEC_LCTOPKPI(GETTER) \
44+
case static_cast<uint8_t>(InputFeaturesLcToPKPi::GETTER): { \
45+
inputFeatures.emplace_back(candidate.GETTER()); \
46+
break; \
47+
}
48+
49+
// Variation of CHECK_AND_FILL_VEC_LCTOPKPI_FULL(OBJECT, FEATURE, GETTER)
50+
// where GETTER is a method of hfHelper
51+
#define CHECK_AND_FILL_VEC_LCTOPKPI_HFHELPER(OBJECT, FEATURE, GETTER) \
52+
case static_cast<uint8_t>(InputFeaturesLcToPKPi::FEATURE): { \
53+
inputFeatures.emplace_back(hfHelper.GETTER(OBJECT)); \
54+
break; \
55+
}
56+
57+
namespace o2::analysis
58+
{
59+
enum class InputFeaturesLcToPKPi : uint8_t {
60+
ptProng0 = 0,
61+
ptProng1,
62+
ptProng2,
63+
impactParameterXY0,
64+
impactParameterXY1,
65+
impactParameterXY2,
66+
decayLength,
67+
decayLengthXY,
68+
decayLengthXYNormalised,
69+
cpa,
70+
cpaXY,
71+
tpcNSigmaP0, // 0
72+
tpcNSigmaKa0, // 0
73+
tpcNSigmaPi0, // 0
74+
tpcNSigmaP1, // 1
75+
tpcNSigmaKa1, // 1
76+
tpcNSigmaPi1, // 1
77+
tpcNSigmaP2, // 2
78+
tpcNSigmaKa2, // 2
79+
tpcNSigmaPi2, // 2
80+
tofNSigmaP0, //
81+
tofNSigmaKa0, //
82+
tofNSigmaPi0, //
83+
tofNSigmaP1,
84+
tofNSigmaKa1,
85+
tofNSigmaPi1,
86+
tofNSigmaP2,
87+
tofNSigmaKa2,
88+
tofNSigmaPi2,
89+
tpcTofNSigmaPi0,
90+
tpcTofNSigmaPi1,
91+
tpcTofNSigmaPi2,
92+
tpcTofNSigmaKa0,
93+
tpcTofNSigmaKa1,
94+
tpcTofNSigmaKa2,
95+
tpcTofNSigmaPr0,
96+
tpcTofNSigmaPr1,
97+
tpcTofNSigmaPr2
98+
};
99+
100+
template <typename TypeOutputScore = float>
101+
class HfMlResponseLcToPKPi : public HfMlResponse<TypeOutputScore>
102+
{
103+
public:
104+
/// Default constructor
105+
HfMlResponseLcToPKPi() = default;
106+
/// Default destructor
107+
virtual ~HfMlResponseLcToPKPi() = default;
108+
109+
/// Method to get the input features vector needed for ML inference
110+
/// \param candidate is the Lc candidate
111+
/// \param prong0 is the candidate's prong0
112+
/// \param prong1 is the candidate's prong1
113+
/// \param prong2 is the candidate's prong2
114+
/// \return inputFeatures vector
115+
template <typename T1, typename T2>
116+
std::vector<float> getInputFeatures(T1 const& candidate,
117+
T2 const& prong0, T2 const& prong1, T2 const& prong2)
118+
{
119+
std::vector<float> inputFeatures;
120+
121+
for (const auto& idx : MlResponse<TypeOutputScore>::mCachedIndices) {
122+
switch (idx) {
123+
CHECK_AND_FILL_VEC_LCTOPKPI(ptProng0);
124+
CHECK_AND_FILL_VEC_LCTOPKPI(ptProng1);
125+
CHECK_AND_FILL_VEC_LCTOPKPI(ptProng2);
126+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, impactParameterXY0, impactParameter0);
127+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, impactParameterXY1, impactParameter1);
128+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, impactParameterXY2, impactParameter2);
129+
CHECK_AND_FILL_VEC_LCTOPKPI(decayLength);
130+
CHECK_AND_FILL_VEC_LCTOPKPI(decayLengthXY);
131+
CHECK_AND_FILL_VEC_LCTOPKPI(decayLengthXYNormalised);
132+
CHECK_AND_FILL_VEC_LCTOPKPI(cpa);
133+
CHECK_AND_FILL_VEC_LCTOPKPI(cpaXY);
134+
// TPC PID variables
135+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcNSigmaP0, tpcNSigmaPr);
136+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcNSigmaKa0, tpcNSigmaKa);
137+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcNSigmaPi0, tpcNSigmaPi);
138+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcNSigmaP1, tpcNSigmaPr);
139+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcNSigmaKa1, tpcNSigmaKa);
140+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi);
141+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcNSigmaP2, tpcNSigmaPr);
142+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcNSigmaKa2, tpcNSigmaKa);
143+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcNSigmaPi2, tpcNSigmaPi);
144+
// TOF PID variables
145+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tofNSigmaP0, tofNSigmaPr);
146+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tofNSigmaKa0, tofNSigmaKa);
147+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tofNSigmaPi0, tofNSigmaPi);
148+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tofNSigmaP1, tofNSigmaPr);
149+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tofNSigmaKa1, tofNSigmaKa);
150+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tofNSigmaPi1, tofNSigmaPi);
151+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tofNSigmaP2, tofNSigmaPr);
152+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tofNSigmaKa2, tofNSigmaKa);
153+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tofNSigmaPi2, tofNSigmaPi);
154+
// Combined PID variables
155+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcTofNSigmaPi0, tpcTofNSigmaPi);
156+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcTofNSigmaPi1, tpcTofNSigmaPi);
157+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcTofNSigmaPi2, tpcTofNSigmaPi);
158+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcTofNSigmaKa0, tpcTofNSigmaKa);
159+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcTofNSigmaKa1, tpcTofNSigmaKa);
160+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcTofNSigmaKa2, tpcTofNSigmaKa);
161+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcTofNSigmaPr0, tpcTofNSigmaPr);
162+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcTofNSigmaPr1, tpcTofNSigmaPr);
163+
CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcTofNSigmaPr2, tpcTofNSigmaPr);
164+
}
165+
}
166+
167+
return inputFeatures;
168+
}
169+
170+
protected:
171+
/// Method to fill the map of available input features
172+
void setAvailableInputFeatures()
173+
{
174+
MlResponse<TypeOutputScore>::mAvailableInputFeatures = {
175+
FILL_MAP_LCTOPKPI(ptProng0),
176+
FILL_MAP_LCTOPKPI(ptProng1),
177+
FILL_MAP_LCTOPKPI(ptProng2),
178+
FILL_MAP_LCTOPKPI(impactParameterXY0),
179+
FILL_MAP_LCTOPKPI(impactParameterXY1),
180+
FILL_MAP_LCTOPKPI(impactParameterXY2),
181+
FILL_MAP_LCTOPKPI(decayLength),
182+
FILL_MAP_LCTOPKPI(decayLengthXY),
183+
FILL_MAP_LCTOPKPI(decayLengthXYNormalised),
184+
FILL_MAP_LCTOPKPI(cpa),
185+
FILL_MAP_LCTOPKPI(cpaXY),
186+
// TPC PID variables
187+
FILL_MAP_LCTOPKPI(tpcNSigmaP0),
188+
FILL_MAP_LCTOPKPI(tpcNSigmaKa0),
189+
FILL_MAP_LCTOPKPI(tpcNSigmaPi0),
190+
FILL_MAP_LCTOPKPI(tpcNSigmaP1),
191+
FILL_MAP_LCTOPKPI(tpcNSigmaKa1),
192+
FILL_MAP_LCTOPKPI(tpcNSigmaPi1),
193+
FILL_MAP_LCTOPKPI(tpcNSigmaP2),
194+
FILL_MAP_LCTOPKPI(tpcNSigmaKa2),
195+
FILL_MAP_LCTOPKPI(tpcNSigmaPi2),
196+
// TOF PID variables
197+
FILL_MAP_LCTOPKPI(tofNSigmaP0),
198+
FILL_MAP_LCTOPKPI(tofNSigmaKa0),
199+
FILL_MAP_LCTOPKPI(tofNSigmaPi0),
200+
FILL_MAP_LCTOPKPI(tofNSigmaP1),
201+
FILL_MAP_LCTOPKPI(tofNSigmaKa1),
202+
FILL_MAP_LCTOPKPI(tofNSigmaPi1),
203+
FILL_MAP_LCTOPKPI(tofNSigmaP2),
204+
FILL_MAP_LCTOPKPI(tofNSigmaKa2),
205+
FILL_MAP_LCTOPKPI(tofNSigmaPi2),
206+
// Combined PID variables
207+
FILL_MAP_LCTOPKPI(tpcTofNSigmaPi0),
208+
FILL_MAP_LCTOPKPI(tpcTofNSigmaPi1),
209+
FILL_MAP_LCTOPKPI(tpcTofNSigmaPi2),
210+
FILL_MAP_LCTOPKPI(tpcTofNSigmaKa0),
211+
FILL_MAP_LCTOPKPI(tpcTofNSigmaKa1),
212+
FILL_MAP_LCTOPKPI(tpcTofNSigmaKa2),
213+
FILL_MAP_LCTOPKPI(tpcTofNSigmaPr0),
214+
FILL_MAP_LCTOPKPI(tpcTofNSigmaPr1),
215+
FILL_MAP_LCTOPKPI(tpcTofNSigmaPr2)};
216+
}
217+
};
218+
219+
} // namespace o2::analysis
220+
221+
#undef FILL_MAP_LCTOPKPI
222+
#undef CHECK_AND_FILL_VEC_LCTOPKPI_FULL
223+
#undef CHECK_AND_FILL_VEC_LCTOPKPI
224+
#undef CHECK_AND_FILL_VEC_LCTOPKPI_HFHELPER
225+
226+
#endif // PWGHF_CORE_HFMLRESPONSELCTOPKPI_H_

PWGHF/DataModel/CandidateSelectionTables.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,15 @@ DECLARE_SOA_TABLE(HfSelDstarToD0Pi, "AOD", "HFSELDSTAR", //! Table stores inform
153153

154154
namespace hf_sel_candidate_lc
155155
{
156-
DECLARE_SOA_COLUMN(IsSelLcToPKPi, isSelLcToPKPi, int); //!
157-
DECLARE_SOA_COLUMN(IsSelLcToPiKP, isSelLcToPiKP, int); //!
156+
DECLARE_SOA_COLUMN(IsSelLcToPKPi, isSelLcToPKPi, int); //!
157+
DECLARE_SOA_COLUMN(IsSelLcToPiKP, isSelLcToPiKP, int); //!
158+
DECLARE_SOA_COLUMN(MlProbLcToPKPi, mlProbLcToPKPi, std::vector<float>); //!
159+
DECLARE_SOA_COLUMN(MlProbLcToPiKP, mlProbLcToPiKP, std::vector<float>); //!
158160
} // namespace hf_sel_candidate_lc
159161
DECLARE_SOA_TABLE(HfSelLc, "AOD", "HFSELLC", //!
160162
hf_sel_candidate_lc::IsSelLcToPKPi, hf_sel_candidate_lc::IsSelLcToPiKP);
163+
DECLARE_SOA_TABLE(HfMlLcToPKPi, "AOD", "HFMLLc", //!
164+
hf_sel_candidate_lc::MlProbLcToPKPi, hf_sel_candidate_lc::MlProbLcToPiKP);
161165

162166
namespace hf_sel_candidate_lc_alice3
163167
{

PWGHF/TableProducer/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ o2physics_add_dpl_workflow(candidate-selector-lb-to-lc-pi
122122

123123
o2physics_add_dpl_workflow(candidate-selector-lc
124124
SOURCES candidateSelectorLc.cxx
125-
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore
125+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore
126126
COMPONENT_NAME Analysis)
127127

128128
o2physics_add_dpl_workflow(candidate-selector-lc-pid-ml

0 commit comments

Comments
 (0)