Skip to content

Commit 5a1a63e

Browse files
committed
Improve track selection
* Avoid redundant IsRun2 check * Avoid doing IsSelected() twice * Use std::pow (float) rather than C pow (double)
1 parent 4d048a9 commit 5a1a63e

3 files changed

Lines changed: 40 additions & 23 deletions

File tree

Common/Core/TrackSelection.h

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,56 +70,66 @@ class TrackSelection
7070

7171
static const std::string mCutNames[static_cast<int>(TrackCuts::kNCuts)];
7272

73+
// True for Run 2 track types. Hoisted out of the per-cut IsSelected() so that
74+
// the trackType() column is dereferenced once per track instead of once per cut.
75+
template <typename T>
76+
static bool IsRun2Track(T const& track)
77+
{
78+
const auto trackType = track.trackType();
79+
return trackType == o2::aod::track::Run2Track || trackType == o2::aod::track::Run2Tracklet;
80+
}
81+
7382
// Temporary function to check if track passes selection criteria. To be replaced by framework filters.
7483
template <typename T>
7584
bool IsSelected(T const& track) const
7685
{
77-
if (!IsSelected(track, TrackCuts::kTrackType)) {
86+
const bool isRun2 = IsRun2Track(track);
87+
if (!IsSelected(track, TrackCuts::kTrackType, isRun2)) {
7888
return false;
7989
}
80-
if (!IsSelected(track, TrackCuts::kPtRange)) {
90+
if (!IsSelected(track, TrackCuts::kPtRange, isRun2)) {
8191
return false;
8292
}
83-
if (!IsSelected(track, TrackCuts::kEtaRange)) {
93+
if (!IsSelected(track, TrackCuts::kEtaRange, isRun2)) {
8494
return false;
8595
}
86-
if (!IsSelected(track, TrackCuts::kTPCNCls)) {
96+
if (!IsSelected(track, TrackCuts::kTPCNCls, isRun2)) {
8797
return false;
8898
}
89-
if (!IsSelected(track, TrackCuts::kTPCCrossedRows)) {
99+
if (!IsSelected(track, TrackCuts::kTPCCrossedRows, isRun2)) {
90100
return false;
91101
}
92-
if (!IsSelected(track, TrackCuts::kTPCCrossedRowsOverNCls)) {
102+
if (!IsSelected(track, TrackCuts::kTPCCrossedRowsOverNCls, isRun2)) {
93103
return false;
94104
}
95-
if (!IsSelected(track, TrackCuts::kTPCChi2NDF)) {
105+
if (!IsSelected(track, TrackCuts::kTPCChi2NDF, isRun2)) {
96106
return false;
97107
}
98-
if (!IsSelected(track, TrackCuts::kTPCRefit)) {
108+
if (!IsSelected(track, TrackCuts::kTPCRefit, isRun2)) {
99109
return false;
100110
}
101-
if (!IsSelected(track, TrackCuts::kITSNCls)) {
111+
if (!IsSelected(track, TrackCuts::kITSNCls, isRun2)) {
102112
return false;
103113
}
104-
if (!IsSelected(track, TrackCuts::kITSChi2NDF)) {
114+
if (!IsSelected(track, TrackCuts::kITSChi2NDF, isRun2)) {
105115
return false;
106116
}
107-
if (!IsSelected(track, TrackCuts::kITSRefit)) {
117+
if (!IsSelected(track, TrackCuts::kITSRefit, isRun2)) {
108118
return false;
109119
}
110-
if (!IsSelected(track, TrackCuts::kITSHits)) {
120+
if (!IsSelected(track, TrackCuts::kITSHits, isRun2)) {
111121
return false;
112122
}
113-
if (!IsSelected(track, TrackCuts::kGoldenChi2)) {
123+
if (!IsSelected(track, TrackCuts::kGoldenChi2, isRun2)) {
114124
return false;
115125
}
116-
if (!IsSelected(track, TrackCuts::kDCAxy)) {
126+
if (!IsSelected(track, TrackCuts::kDCAxy, isRun2)) {
117127
return false;
118128
}
119-
if (!IsSelected(track, TrackCuts::kDCAz)) {
129+
if (!IsSelected(track, TrackCuts::kDCAz, isRun2)) {
120130
return false;
121131
}
122-
if (!IsSelected(track, TrackCuts::kTPCFracSharedCls)) {
132+
if (!IsSelected(track, TrackCuts::kTPCFracSharedCls, isRun2)) {
123133
return false;
124134
}
125135
return true;
@@ -131,8 +141,9 @@ class TrackSelection
131141
{
132142
uint16_t flag = 0;
133143

144+
const bool isRun2 = IsRun2Track(track);
134145
auto setFlag = [&](const TrackCuts& cut) {
135-
if (IsSelected(track, cut)) {
146+
if (IsSelected(track, cut, isRun2)) {
136147
flag |= 1UL << static_cast<int>(cut);
137148
}
138149
};
@@ -161,8 +172,14 @@ class TrackSelection
161172
template <typename T>
162173
bool IsSelected(T const& track, const TrackCuts& cut) const
163174
{
164-
const bool isRun2 = track.trackType() == o2::aod::track::Run2Track || track.trackType() == o2::aod::track::Run2Tracklet;
175+
return IsSelected(track, cut, IsRun2Track(track));
176+
}
165177

178+
// Overload taking the pre-computed Run 2 flag, so that callers evaluating several
179+
// cuts on the same track do not re-read trackType() for each of them.
180+
template <typename T>
181+
bool IsSelected(T const& track, const TrackCuts& cut, bool isRun2) const
182+
{
166183
switch (cut) {
167184
case TrackCuts::kTrackType:
168185
return track.trackType() == mTrackType;

Common/Core/TrackSelectionDefaults.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ TrackSelection getGlobalTrackSelection()
3939
selectedTracks.SetMaxChi2PerClusterTPC(4.f);
4040
selectedTracks.SetRequireHitsInITSLayers(1, {0, 1}); // one hit in any SPD layer
4141
selectedTracks.SetMaxChi2PerClusterITS(36.f);
42-
selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / pow(pt, 1.1f); });
42+
selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / std::pow(pt, 1.1f); });
4343
selectedTracks.SetMaxDcaZ(2.f);
4444
return selectedTracks;
4545
}
@@ -115,7 +115,7 @@ TrackSelection getGlobalTrackSelectionRun3HF()
115115
selectedTracks.SetMaxChi2PerClusterTPC(4.f);
116116
selectedTracks.SetRequireHitsInITSLayers(1, {0, 1}); // one hit in any SPD layer
117117
selectedTracks.SetMaxChi2PerClusterITS(36.f);
118-
// selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / pow(pt, 1.1f); });
118+
// selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / std::pow(pt, 1.1f); });
119119
selectedTracks.SetMaxDcaZ(2.f);
120120
selectedTracks.SetMaxDcaXY(0.25);
121121

Common/TableProducer/trackselection.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,18 +157,18 @@ struct TrackSelectionTask {
157157
}
158158
if (isRun3) {
159159
for (const auto& track : tracks) {
160+
const o2::aod::track::TrackSelectionFlags::flagtype trackflagGlob = globalTracks.IsSelectedMask(track);
160161

161162
if (produceTable == 1) {
162163
filterTable((uint8_t)0,
163-
globalTracks.IsSelectedMask(track),
164+
trackflagGlob,
164165
filtBit1.IsSelected(track),
165166
filtBit2.IsSelected(track),
166167
filtBit3.IsSelected(track),
167168
filtBit4.IsSelected(track),
168169
filtBit5.IsSelected(track));
169170
}
170171
if (produceFBextendedTable == 1) {
171-
o2::aod::track::TrackSelectionFlags::flagtype trackflagGlob = globalTracks.IsSelectedMask(track);
172172
o2::aod::track::TrackSelectionFlags::flagtype trackflagFB1 = filtBit1.IsSelectedMask(track);
173173
o2::aod::track::TrackSelectionFlags::flagtype trackflagFB2 = filtBit2.IsSelectedMask(track);
174174
// o2::aod::track::TrackSelectionFlags::flagtype trackflagFB3 = filtBit3.IsSelectedMask(track); // only temporarily commented, will be used
@@ -201,7 +201,7 @@ struct TrackSelectionTask {
201201
o2::aod::track::TrackSelectionFlags::flagtype trackflagGlob = globalTracks.IsSelectedMask(track);
202202
if (produceTable == 1) {
203203
filterTable((uint8_t)globalTracksSDD.IsSelected(track),
204-
globalTracks.IsSelectedMask(track),
204+
trackflagGlob,
205205
filtBit1.IsSelected(track),
206206
filtBit2.IsSelected(track),
207207
filtBit3.IsSelected(track),

0 commit comments

Comments
 (0)