Skip to content

Commit 2a75fb1

Browse files
committed
adding SFINAE checks for PID + optimisation of the tasks
1 parent 7fb86c0 commit 2a75fb1

File tree

4 files changed

+299
-240
lines changed

4 files changed

+299
-240
lines changed

PWGCF/Femto3D/DataModel/PIDutils.h

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
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+
///
13+
/// \file checkPacking.cxx
14+
/// \author Gleb Romanenko [email protected]
15+
/// \brief SFINAE checks for existance of PID info
16+
/// \since 24/03/2025
17+
///
18+
19+
#include <type_traits>
20+
#include "Common/DataModel/PIDResponse.h"
21+
22+
namespace o2::aod::singletrackselector
23+
{
24+
namespace pidutils
25+
{
26+
27+
//========================================== SFINAE checks ==========================================
28+
29+
template <typename T, typename = void>
30+
struct hasTPCPi : std::false_type {
31+
};
32+
template <typename T>
33+
struct hasTPCPi<T, std::void_t<o2::aod::pidutils::hasTPCPi<T>>> : std::true_type {
34+
};
35+
36+
template <typename T, typename = void>
37+
struct hasTPCKa : std::false_type {
38+
};
39+
template <typename T>
40+
struct hasTPCKa<T, std::void_t<o2::aod::pidutils::hasTPCKa<T>>> : std::true_type {
41+
};
42+
43+
template <typename T, typename = void>
44+
struct hasTPCPr : std::false_type {
45+
};
46+
template <typename T>
47+
struct hasTPCPr<T, std::void_t<o2::aod::pidutils::hasTPCPr<T>>> : std::true_type {
48+
};
49+
50+
template <typename T, typename = void>
51+
struct hasTPCDe : std::false_type {
52+
};
53+
template <typename T>
54+
struct hasTPCDe<T, std::void_t<o2::aod::pidutils::hasTPCDe<T>>> : std::true_type {
55+
};
56+
57+
template <typename T, typename = void>
58+
struct hasTPCTr : std::false_type {
59+
};
60+
template <typename T>
61+
struct hasTPCTr<T, std::void_t<o2::aod::pidutils::hasTPCTr<T>>> : std::true_type {
62+
};
63+
64+
template <typename T, typename = void>
65+
struct hasTPCHe : std::false_type {
66+
};
67+
template <typename T>
68+
struct hasTPCHe<T, std::void_t<o2::aod::pidutils::hasTPCHe<T>>> : std::true_type {
69+
};
70+
71+
template <typename T, typename = void>
72+
struct hasTOFPi : std::false_type {
73+
};
74+
template <typename T>
75+
struct hasTOFPi<T, std::void_t<o2::aod::pidutils::hasTOFPi<T>>> : std::true_type {
76+
};
77+
78+
template <typename T, typename = void>
79+
struct hasTOFKa : std::false_type {
80+
};
81+
template <typename T>
82+
struct hasTOFKa<T, std::void_t<o2::aod::pidutils::hasTOFKa<T>>> : std::true_type {
83+
};
84+
85+
template <typename T, typename = void>
86+
struct hasTOFPr : std::false_type {
87+
};
88+
template <typename T>
89+
struct hasTOFPr<T, std::void_t<o2::aod::pidutils::hasTOFPr<T>>> : std::true_type {
90+
};
91+
92+
template <typename T, typename = void>
93+
struct hasTOFDe : std::false_type {
94+
};
95+
template <typename T>
96+
struct hasTOFDe<T, std::void_t<o2::aod::pidutils::hasTOFDe<T>>> : std::true_type {
97+
};
98+
99+
template <typename T, typename = void>
100+
struct hasTOFTr : std::false_type {
101+
};
102+
template <typename T>
103+
struct hasTOFTr<T, std::void_t<o2::aod::pidutils::hasTOFTr<T>>> : std::true_type {
104+
};
105+
106+
template <typename T, typename = void>
107+
struct hasTOFHe : std::false_type {
108+
};
109+
template <typename T>
110+
struct hasTOFHe<T, std::void_t<o2::aod::pidutils::hasTOFHe<T>>> : std::true_type {
111+
};
112+
113+
} // namespace pidutils
114+
115+
//========================================== ITS PID ==========================================
116+
117+
template <typename TrackType>
118+
inline float getITSNsigma(TrackType const& track, int const& PDG)
119+
{
120+
switch (PDG) {
121+
case 211:
122+
return track.itsNSigmaPi();
123+
case 321:
124+
return track.itsNSigmaKa();
125+
case 2212:
126+
return track.itsNSigmaPr();
127+
case 1000010020:
128+
return track.itsNSigmaDe();
129+
case 1000020030:
130+
return track.itsNSigmaHe();
131+
case 1000010030:
132+
return track.itsNSigmaTr();
133+
case 0:
134+
return -1000.0;
135+
default:
136+
LOG(fatal) << "Cannot interpret PDG for ITS selection: " << PDG;
137+
return -1000.0;
138+
}
139+
}
140+
141+
template <typename TrackType>
142+
inline bool ITSselection(TrackType const& track, std::pair<int, std::vector<float>> const& PIDcuts)
143+
{
144+
float Nsigma = getITSNsigma(track, PIDcuts.first);
145+
146+
if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) {
147+
return true;
148+
}
149+
return false;
150+
}
151+
152+
//========================================== TPC PID ==========================================
153+
154+
template <typename TrackType>
155+
inline float getTPCNsigma(TrackType const& track, int const& PDG)
156+
{
157+
switch (PDG) {
158+
case 211:
159+
if constexpr (o2::aod::singletrackselector::pidutils::hasTPCPi<TrackType>::value)
160+
return track.tpcNSigmaPi();
161+
case 321:
162+
if constexpr (o2::aod::singletrackselector::pidutils::hasTPCKa<TrackType>::value)
163+
return track.tpcNSigmaKa();
164+
case 2212:
165+
if constexpr (o2::aod::singletrackselector::pidutils::hasTPCPr<TrackType>::value)
166+
return track.tpcNSigmaPr();
167+
case 1000010020:
168+
if constexpr (o2::aod::singletrackselector::pidutils::hasTPCDe<TrackType>::value)
169+
return track.tpcNSigmaDe();
170+
case 1000020030:
171+
if constexpr (o2::aod::singletrackselector::pidutils::hasTPCHe<TrackType>::value)
172+
return track.tpcNSigmaHe();
173+
case 1000010030:
174+
if constexpr (o2::aod::singletrackselector::pidutils::hasTPCTr<TrackType>::value)
175+
return track.tpcNSigmaTr();
176+
case 0:
177+
return -1000.0;
178+
default:
179+
LOG(fatal) << "Cannot interpret PDG for TPC selection: " << PDG;
180+
return -1000.0;
181+
}
182+
}
183+
184+
template <bool useITS, typename TrackType>
185+
inline bool TPCselection(TrackType const& track, std::pair<int, std::vector<float>> const& PIDcuts, std::vector<float> const& ITSCut = std::vector<float>{})
186+
{
187+
int PDG = PIDcuts.first;
188+
189+
if constexpr (useITS) {
190+
if (ITSCut.size() != 0 && !ITSselection(track, std::make_pair(PDG, ITSCut)))
191+
return false;
192+
}
193+
194+
float Nsigma = getTPCNsigma(track, PDG);
195+
196+
if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) {
197+
return true;
198+
}
199+
return false;
200+
}
201+
202+
//========================================== TOF PID ==========================================
203+
204+
template <typename TrackType>
205+
inline float getTOFNsigma(TrackType const& track, int const& PDG)
206+
{
207+
switch (PDG) {
208+
case 211:
209+
if constexpr (o2::aod::singletrackselector::pidutils::hasTOFPi<TrackType>::value)
210+
return track.tofNSigmaPi();
211+
case 321:
212+
if constexpr (o2::aod::singletrackselector::pidutils::hasTOFKa<TrackType>::value)
213+
return track.tofNSigmaKa();
214+
case 2212:
215+
if constexpr (o2::aod::singletrackselector::pidutils::hasTOFPr<TrackType>::value)
216+
return track.tofNSigmaPr();
217+
case 1000010020:
218+
if constexpr (o2::aod::singletrackselector::pidutils::hasTOFDe<TrackType>::value)
219+
return track.tofNSigmaDe();
220+
case 1000020030:
221+
if constexpr (o2::aod::singletrackselector::pidutils::hasTOFHe<TrackType>::value)
222+
return track.tofNSigmaHe();
223+
case 1000010030:
224+
if constexpr (o2::aod::singletrackselector::pidutils::hasTOFTr<TrackType>::value)
225+
return track.tofNSigmaTr();
226+
case 0:
227+
return -1000.0;
228+
default:
229+
LOG(fatal) << "Cannot interpret PDG for TOF selection: " << PDG;
230+
return -1000.0;
231+
}
232+
}
233+
234+
template <typename TrackType>
235+
inline bool TOFselection(TrackType const& track, std::pair<int, std::vector<float>> const& PIDcuts, std::vector<float> const& TPCresidualCut = std::vector<float>{-5.0f, 5.0f})
236+
{
237+
int PDG = PIDcuts.first;
238+
if (!TPCselection<false>(track, std::make_pair(PDG, TPCresidualCut)))
239+
return false;
240+
241+
float Nsigma = getTOFNsigma(track, PDG);
242+
243+
if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) {
244+
return true;
245+
}
246+
return false;
247+
}
248+
} // namespace o2::aod::singletrackselector

PWGCF/Femto3D/DataModel/singletrackselector.h

Lines changed: 2 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#ifndef PWGCF_FEMTO3D_DATAMODEL_SINGLETRACKSELECTOR_H_
1717
#define PWGCF_FEMTO3D_DATAMODEL_SINGLETRACKSELECTOR_H_
1818

19-
#include <experimental/type_traits>
19+
// #include <experimental/type_traits>
2020
#include <utility>
2121
#include <vector>
2222

@@ -26,6 +26,7 @@
2626
#include "Common/DataModel/PIDResponseITS.h"
2727
#include "Framework/Logger.h"
2828
#include "Common/DataModel/Multiplicity.h"
29+
#include "PWGCF/Femto3D/DataModel/PIDutils.h"
2930

3031
namespace o2::aod
3132
{
@@ -514,125 +515,3 @@ DECLARE_SOA_TABLE(SingleTrkMCs, "AOD", "SINGLETRKMC", // Table with generatad in
514515
} // namespace o2::aod
515516

516517
#endif // PWGCF_FEMTO3D_DATAMODEL_SINGLETRACKSELECTOR_H_
517-
518-
namespace o2::aod::singletrackselector
519-
{
520-
template <typename TrackType>
521-
inline bool ITSselection(TrackType const& track, std::pair<int, std::vector<float>> const& PIDcuts)
522-
{
523-
int PDG = PIDcuts.first;
524-
525-
float Nsigma = -1000;
526-
switch (PDG) {
527-
case 2212:
528-
Nsigma = track.itsNSigmaPr();
529-
break;
530-
case 1000010020:
531-
Nsigma = track.itsNSigmaDe();
532-
break;
533-
case 1000020030:
534-
Nsigma = track.itsNSigmaHe();
535-
break;
536-
case 1000010030:
537-
Nsigma = track.itsNSigmaTr();
538-
break;
539-
case 211:
540-
Nsigma = track.itsNSigmaPi();
541-
break;
542-
case 321:
543-
Nsigma = track.itsNSigmaKa();
544-
break;
545-
case 0:
546-
return false;
547-
default:
548-
LOG(fatal) << "Cannot interpret PDG for ITS selection: " << PIDcuts.first;
549-
}
550-
551-
if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) {
552-
return true;
553-
}
554-
return false;
555-
}
556-
557-
template <bool useITS, typename TrackType>
558-
inline bool TPCselection(TrackType const& track, std::pair<int, std::vector<float>> const& PIDcuts, std::vector<float> const& ITSCut = std::vector<float>{})
559-
{
560-
int PDG = PIDcuts.first;
561-
562-
if constexpr (useITS) {
563-
if (ITSCut.size() != 0 && !ITSselection(track, std::make_pair(PDG, ITSCut)))
564-
return false;
565-
}
566-
567-
float Nsigma = -1000;
568-
switch (PDG) {
569-
case 2212:
570-
Nsigma = track.tpcNSigmaPr();
571-
break;
572-
case 1000010020:
573-
Nsigma = track.tpcNSigmaDe();
574-
break;
575-
case 1000020030:
576-
Nsigma = track.tpcNSigmaHe();
577-
break;
578-
case 1000010030:
579-
Nsigma = track.tpcNSigmaTr();
580-
break;
581-
case 211:
582-
Nsigma = track.tpcNSigmaPi();
583-
break;
584-
case 321:
585-
Nsigma = track.tpcNSigmaKa();
586-
break;
587-
case 0:
588-
return false;
589-
default:
590-
LOG(fatal) << "Cannot interpret PDG for TPC selection: " << PIDcuts.first;
591-
}
592-
593-
if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) {
594-
return true;
595-
}
596-
return false;
597-
}
598-
599-
template <typename TrackType>
600-
inline bool TOFselection(TrackType const& track, std::pair<int, std::vector<float>> const& PIDcuts, std::vector<float> const& TPCresidualCut = std::vector<float>{-5.0f, 5.0f})
601-
{
602-
int PDG = PIDcuts.first;
603-
if (!TPCselection<false>(track, std::make_pair(PDG, TPCresidualCut)))
604-
return false;
605-
606-
float Nsigma = -1000;
607-
switch (PDG) {
608-
case 2212:
609-
Nsigma = track.tofNSigmaPr();
610-
break;
611-
case 1000010020:
612-
Nsigma = track.tofNSigmaDe();
613-
break;
614-
case 1000020030:
615-
Nsigma = track.tofNSigmaHe();
616-
break;
617-
case 1000010030:
618-
Nsigma = track.tofNSigmaTr();
619-
break;
620-
case 211:
621-
Nsigma = track.tofNSigmaPi();
622-
break;
623-
case 321:
624-
Nsigma = track.tofNSigmaKa();
625-
break;
626-
case 0:
627-
return false;
628-
default:
629-
LOG(fatal) << "Cannot interpret PDG for TOF selection: " << PIDcuts.first;
630-
}
631-
632-
if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) {
633-
return true;
634-
}
635-
return false;
636-
}
637-
638-
} // namespace o2::aod::singletrackselector

0 commit comments

Comments
 (0)