Skip to content

Commit ffb432a

Browse files
committed
[WIP] Implementation of Lc task and selector
1 parent 0a1c878 commit ffb432a

12 files changed

+1500
-683
lines changed

ALICE3/DataModel/A3DecayFinderTables.h

Lines changed: 150 additions & 85 deletions
Large diffs are not rendered by default.
Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,278 @@
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 alice3-mlresponse3prong.h
13+
/// \brief Class to compute the ML response for Lc+ → p K- π+ analysis selections
14+
/// \author Marcello Di Costanzo <[email protected]>, Polytechnic University of Turin and INFN Turin
15+
16+
#ifndef ALICE3_ML_ALICE3MLRESPONSE3PRONG_H_
17+
#define ALICE3_ML_ALICE3MLRESPONSE3PRONG_H_
18+
19+
#include "Tools/ML/MlResponse.h"
20+
#include "PWGHF/DataModel/CandidateReconstructionTables.h"
21+
22+
#include "Tools/ML/MlResponse.h"
23+
24+
#include <cstdint>
25+
#include <map>
26+
#include <string>
27+
#include <vector>
28+
29+
// Fill the map of available input features
30+
// the key is the feature's name (std::string)
31+
// the value is the corresponding value in EnumInputFeatures
32+
#define FILL_MAP_3PRONG(FEATURE) \
33+
{ \
34+
#FEATURE, static_cast<uint8_t>(InputFeatures3Prong::FEATURE) \
35+
}
36+
37+
// Check if the index of mCachedIndices (index associated to a FEATURE)
38+
// matches the entry in EnumInputFeatures associated to this FEATURE
39+
// if so, the inputFeatures vector is filled with the FEATURE's value
40+
// by calling the corresponding GETTER from OBJECT
41+
#define CHECK_AND_FILL_VEC_3PRONG_FULL(OBJECT, FEATURE, GETTER) \
42+
case static_cast<uint8_t>(InputFeatures3Prong::FEATURE): { \
43+
inputFeatures.emplace_back(OBJECT.GETTER()); \
44+
break; \
45+
}
46+
47+
// Specific case of CHECK_AND_FILL_VEC_3PRONG_FULL(OBJECT, FEATURE, GETTER)
48+
// where OBJECT is named candidate and FEATURE = GETTER
49+
#define CHECK_AND_FILL_VEC_3PRONG(GETTER) \
50+
case static_cast<uint8_t>(InputFeatures3Prong::GETTER): { \
51+
inputFeatures.emplace_back(candidate.GETTER()); \
52+
break; \
53+
}
54+
55+
// Variation of CHECK_AND_FILL_VEC_3PRONG_FULL(OBJECT, FEATURE, GETTER)
56+
// where GETTER is a method of hfHelper
57+
#define CHECK_AND_FILL_VEC_3PRONG_HFHELPER(OBJECT, FEATURE, GETTER) \
58+
case static_cast<uint8_t>(InputFeatures3Prong::FEATURE): { \
59+
inputFeatures.emplace_back(hfHelper.GETTER(OBJECT)); \
60+
break; \
61+
}
62+
63+
// Variation of CHECK_AND_FILL_VEC_3PRONG_OBJECT_SIGNED(OBJECT1, OBJECT2, FEATURE, GETTER)
64+
// where OBJECT1 and OBJECT2 are the objects from which we call the GETTER method, and the variable
65+
// is filled depending on whether it is a LcToPKPi or a LcToPiKP
66+
#define CHECK_AND_FILL_VEC_3PRONG_OBJECT_SIGNED(OBJECT1, OBJECT2, FEATURE, GETTER) \
67+
case static_cast<uint8_t>(InputFeatures3Prong::FEATURE): { \
68+
if (caseLcToPKPi) { \
69+
inputFeatures.emplace_back(OBJECT1.GETTER()); \
70+
} else { \
71+
inputFeatures.emplace_back(OBJECT2.GETTER()); \
72+
} \
73+
break; \
74+
}
75+
76+
// Variation of CHECK_AND_FILL_VEC_3PRONG_HFHELPER_SIGNED(OBJECT, FEATURE, GETTER1, GETTER2)
77+
// where GETTER1 and GETTER2 are methods of the OBJECT
78+
#define CHECK_AND_FILL_VEC_3PRONG_SIGNED(OBJECT, FEATURE, GETTER1, GETTER2) \
79+
case static_cast<uint8_t>(InputFeatures3Prong::FEATURE): { \
80+
if (caseLcToPKPi) { \
81+
inputFeatures.emplace_back(OBJECT.GETTER1()); \
82+
} else { \
83+
inputFeatures.emplace_back(OBJECT.GETTER2()); \
84+
} \
85+
break; \
86+
}
87+
88+
namespace o2::analysis
89+
{
90+
enum class InputFeatures3Prong : uint8_t {
91+
ptProng0 = 0,
92+
ptProng1,
93+
ptProng2,
94+
impactParameterXY0,
95+
impactParameterXY1,
96+
impactParameterXY2,
97+
impactParameterZ0,
98+
impactParameterZ1,
99+
impactParameterZ2,
100+
decayLength,
101+
decayLengthXY,
102+
decayLengthXYNormalised,
103+
cpa,
104+
cpaXY,
105+
chi2PCA,
106+
nSigRichPr0, // 0
107+
nSigRichKa0, // 0
108+
nSigRichPi0, // 0
109+
nSigRichPr1, // 1
110+
nSigRichKa1, // 1
111+
nSigRichPi1, // 1
112+
nSigRichPr2, // 2
113+
nSigRichKa2, // 2
114+
nSigRichPi2, // 2
115+
nSigInnTofPr0, // 0
116+
nSigInnTofKa0, // 0
117+
nSigInnTofPi0, // 0
118+
nSigInnTofPr1, // 1
119+
nSigInnTofKa1, // 1
120+
nSigInnTofPi1, // 1
121+
nSigInnTofPr2, // 2
122+
nSigInnTofKa2, // 2
123+
nSigInnTofPi2, // 2
124+
nSigOutTofPr0, // 0
125+
nSigOutTofKa0, // 0
126+
nSigOutTofPi0, // 0
127+
nSigOutTofPr1, // 1
128+
nSigOutTofKa1, // 1
129+
nSigOutTofPi1, // 1
130+
nSigOutTofPr2, // 2
131+
nSigOutTofKa2, // 2
132+
nSigOutTofPi2, // 2
133+
nSigTrkPr0, // 0
134+
nSigTrkKa0, // 0
135+
nSigTrkPi0, // 0
136+
nSigTrkPr1, // 1
137+
nSigTrkKa1, // 1
138+
nSigTrkPi1, // 1
139+
nSigTrkPr2, // 2
140+
nSigTrkKa2, // 2
141+
nSigTrkPi2 // 2
142+
};
143+
144+
template <typename TypeOutputScore = float>
145+
class Alice3MlResponse3Prong : public MlResponse<TypeOutputScore>
146+
{
147+
public:
148+
/// Default constructor
149+
Alice3MlResponse3Prong() = default;
150+
/// Default destructor
151+
virtual ~Alice3MlResponse3Prong() = default;
152+
153+
/// Method to get the input features vector needed for ML inference
154+
/// \param candidate is the Lc candidate
155+
/// \param prong0 is the candidate's prong0
156+
/// \param prong1 is the candidate's prong1
157+
/// \param prong2 is the candidate's prong2
158+
/// \return inputFeatures vector
159+
template <typename T1>
160+
std::vector<float> getInputFeatures(T1 const& candidate, int part)
161+
{
162+
std::vector<float> inputFeatures;
163+
164+
for (const auto& idx : MlResponse<TypeOutputScore>::mCachedIndices) {
165+
switch (idx) {
166+
CHECK_AND_FILL_VEC_3PRONG(ptProng0);
167+
CHECK_AND_FILL_VEC_3PRONG(ptProng1);
168+
CHECK_AND_FILL_VEC_3PRONG(ptProng2);
169+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, impactParameterXY0, impactParameter0);
170+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, impactParameterXY1, impactParameter1);
171+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, impactParameterXY2, impactParameter2);
172+
CHECK_AND_FILL_VEC_3PRONG(impactParameterZ0);
173+
CHECK_AND_FILL_VEC_3PRONG(impactParameterZ1);
174+
CHECK_AND_FILL_VEC_3PRONG(impactParameterZ2);
175+
CHECK_AND_FILL_VEC_3PRONG(decayLength);
176+
CHECK_AND_FILL_VEC_3PRONG(decayLengthXY);
177+
CHECK_AND_FILL_VEC_3PRONG(decayLengthXYNormalised);
178+
CHECK_AND_FILL_VEC_3PRONG(cpa);
179+
CHECK_AND_FILL_VEC_3PRONG(cpaXY);
180+
CHECK_AND_FILL_VEC_3PRONG(chi2PCA);
181+
switch (part) {
182+
case 0: {
183+
// RICH PID variables
184+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigRichPr0, nSigRichPr0);
185+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigRichKa1, nSigRichKa1);
186+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigRichPi2, nSigRichPi2);
187+
// INNER TOF PID variables
188+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigInnTofPr0, nSigInnTofPr0);
189+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigInnTofKa1, nSigInnTofKa1);
190+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigInnTofPi2, nSigInnTofPi2);
191+
// OUTER TOF PID variables
192+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigOutTofPr0, nSigOutTofPr0);
193+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigOutTofKa1, nSigOutTofKa1);
194+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigOutTofPi2, nSigOutTofPi2);
195+
// TRACKER PID variables
196+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigTrkPr0, nSigTrkPr0);
197+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigTrkKa1, nSigTrkKa1);
198+
CHECK_AND_FILL_VEC_3PRONG_FULL(candidate, nSigTrkPi2, nSigTrkPi2);
199+
break;
200+
}
201+
}
202+
}
203+
}
204+
return inputFeatures;
205+
}
206+
207+
protected:
208+
/// Method to fill the map of available input features
209+
void setAvailableInputFeatures()
210+
{
211+
MlResponse<TypeOutputScore>::mAvailableInputFeatures = {
212+
FILL_MAP_3PRONG(ptProng0),
213+
FILL_MAP_3PRONG(ptProng1),
214+
FILL_MAP_3PRONG(ptProng2),
215+
FILL_MAP_3PRONG(impactParameterXY0),
216+
FILL_MAP_3PRONG(impactParameterXY1),
217+
FILL_MAP_3PRONG(impactParameterXY2),
218+
FILL_MAP_3PRONG(impactParameterZ0),
219+
FILL_MAP_3PRONG(impactParameterZ1),
220+
FILL_MAP_3PRONG(impactParameterZ2),
221+
FILL_MAP_3PRONG(decayLength),
222+
FILL_MAP_3PRONG(decayLengthXY),
223+
FILL_MAP_3PRONG(decayLengthXYNormalised),
224+
FILL_MAP_3PRONG(cpa),
225+
FILL_MAP_3PRONG(cpaXY),
226+
FILL_MAP_3PRONG(chi2PCA),
227+
// RICH PID variables
228+
FILL_MAP_3PRONG(nSigRichPr0),
229+
FILL_MAP_3PRONG(nSigRichKa0),
230+
FILL_MAP_3PRONG(nSigRichPi0),
231+
FILL_MAP_3PRONG(nSigRichPr1),
232+
FILL_MAP_3PRONG(nSigRichKa1),
233+
FILL_MAP_3PRONG(nSigRichPi1),
234+
FILL_MAP_3PRONG(nSigRichPr2),
235+
FILL_MAP_3PRONG(nSigRichKa2),
236+
FILL_MAP_3PRONG(nSigRichPi2),
237+
// INNER TOF PID variables
238+
FILL_MAP_3PRONG(nSigInnTofPr0),
239+
FILL_MAP_3PRONG(nSigInnTofKa0),
240+
FILL_MAP_3PRONG(nSigInnTofPi0),
241+
FILL_MAP_3PRONG(nSigInnTofPr1),
242+
FILL_MAP_3PRONG(nSigInnTofKa1),
243+
FILL_MAP_3PRONG(nSigInnTofPi1),
244+
FILL_MAP_3PRONG(nSigInnTofPr2),
245+
FILL_MAP_3PRONG(nSigInnTofKa2),
246+
FILL_MAP_3PRONG(nSigInnTofPi2),
247+
// OUTER TOF PID variables
248+
FILL_MAP_3PRONG(nSigOutTofPr0),
249+
FILL_MAP_3PRONG(nSigOutTofKa0),
250+
FILL_MAP_3PRONG(nSigOutTofPi0),
251+
FILL_MAP_3PRONG(nSigOutTofPr1),
252+
FILL_MAP_3PRONG(nSigOutTofKa1),
253+
FILL_MAP_3PRONG(nSigOutTofPi1),
254+
FILL_MAP_3PRONG(nSigOutTofPr2),
255+
FILL_MAP_3PRONG(nSigOutTofKa2),
256+
FILL_MAP_3PRONG(nSigOutTofPi2),
257+
// TRACKER PID variables
258+
FILL_MAP_3PRONG(nSigTrkPr0),
259+
FILL_MAP_3PRONG(nSigTrkKa0),
260+
FILL_MAP_3PRONG(nSigTrkPi0),
261+
FILL_MAP_3PRONG(nSigTrkPr1),
262+
FILL_MAP_3PRONG(nSigTrkKa1),
263+
FILL_MAP_3PRONG(nSigTrkPi1),
264+
FILL_MAP_3PRONG(nSigTrkPr2),
265+
FILL_MAP_3PRONG(nSigTrkKa2),
266+
FILL_MAP_3PRONG(nSigTrkPi2)};
267+
}
268+
};
269+
270+
} // namespace o2::analysis
271+
272+
#undef FILL_MAP_3PRONG
273+
#undef CHECK_AND_FILL_VEC_3PRONG_FULL
274+
#undef CHECK_AND_FILL_VEC_3PRONG
275+
#undef CHECK_AND_FILL_VEC_3PRONG_HFHELPER
276+
#undef CHECK_AND_FILL_VEC_3PRONG_OBJECT_SIGNED
277+
278+
#endif // ALICE3_ML_ALICE3MLRESPONSE3PRONG_H_

ALICE3/TableProducer/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,5 @@ o2physics_add_dpl_workflow(alice3-correlatorddbar
4848

4949
o2physics_add_dpl_workflow(alice3-selector-3prong
5050
SOURCES alice3-selector3prong.cxx
51-
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter
51+
PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter O2Physics::MLCore
5252
COMPONENT_NAME Analysis)

ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,7 @@ struct OnTheFlyRichPid {
696696
aod::McParticles const&,
697697
aod::McCollisions const&)
698698
{
699+
LOG(info) << "[RICH] Processing collision with ID: " << collision.globalIndex();
699700
const o2::dataformats::VertexBase pvVtx({collision.posX(), collision.posY(), collision.posZ()},
700701
{collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()});
701702

ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ struct OnTheFlyTofPid {
430430
aod::McParticles const&,
431431
aod::McCollisions const&)
432432
{
433+
LOG(info) << "[TOF] Processing event with collision ID: " << collision.globalIndex();
433434
o2::dataformats::VertexBase pvVtx({collision.posX(), collision.posY(), collision.posZ()},
434435
{collision.covXX(), collision.covXY(), collision.covYY(),
435436
collision.covXZ(), collision.covYZ(), collision.covZZ()});

ALICE3/TableProducer/OTF/onTheFlyTracker.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ struct OnTheFlyTracker {
522522
float dNdEta = 0.f; // Charged particle multiplicity to use in the efficiency evaluation
523523
void process(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles)
524524
{
525+
LOG(info) << "[Trk] Processing new event in OnTheFlyTracker: " << mcCollision.globalIndex();
525526
int lastTrackIndex = tableStoredTracksCov.lastIndex() + 1; // bookkeep the last added track
526527

527528
tracksAlice3.clear();

ALICE3/TableProducer/OTF/onTheFlyTrackerPid.cxx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ struct OnTheFlyTrackerPid {
431431

432432
void init(o2::framework::InitContext&)
433433
{
434+
LOG(info) << "[TrkPid] Init function";
434435
ccdb->setURL("http://alice-ccdb.cern.ch");
435436
ccdb->setTimestamp(-1);
436437

@@ -541,13 +542,15 @@ struct OnTheFlyTrackerPid {
541542
h2dBarrelNsigmaTrue[iTrue][iHyp] = histos.add<TH2>(histName.c_str(), histTitle.c_str(), kTH2F, {axisMomentum, axisNsigma});
542543
}
543544
}
545+
LOG(info) << "[TrkPid] Finished Init function";
544546
}
545547

546548
void process(soa::Join<aod::Collisions, aod::McCollisionLabels>::iterator const& collision,
547549
soa::Join<aod::Tracks, aod::TracksCov, aod::McTrackLabels> const& tracks,
548550
aod::McParticles const& /*mcParticles*/,
549551
aod::McCollisions const& /*mcCollisions*/)
550552
{
553+
LOG(info) << "[TrkPid] Processing collision ID: " << collision.globalIndex();
551554
o2::dataformats::VertexBase mcPvVtx({0.0f, 0.0f, 0.0f}, {0.});
552555

553556
if (collision.has_mcCollision()) {

0 commit comments

Comments
 (0)