@@ -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 ;
0 commit comments