Skip to content

Commit 46de008

Browse files
committed
Improve performance of FulfillsITSHitRequirements
Use a bitmask rather than an std::set.
1 parent 866ce58 commit 46de008

2 files changed

Lines changed: 17 additions & 10 deletions

File tree

Common/Core/TrackSelection.cxx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,11 @@
2727

2828
bool TrackSelection::FulfillsITSHitRequirements(uint8_t itsClusterMap) const
2929
{
30-
constexpr uint8_t bit = 1;
31-
for (auto& itsRequirement : mRequiredITSHits) {
32-
auto hits = std::count_if(itsRequirement.second.begin(), itsRequirement.second.end(), [&](auto&& requiredLayer) { return itsClusterMap & (bit << requiredLayer); });
33-
if ((itsRequirement.first == -1) && (hits > 0)) {
30+
for (const auto& [minHits, layerMask] : mRequiredITSHits) {
31+
int hits = __builtin_popcount(itsClusterMap & layerMask);
32+
if ((minHits == -1) && (hits > 0)) {
3433
return false; // no hits were required in specified layers
35-
} else if (hits < itsRequirement.first) {
34+
} else if (hits < minHits) {
3635
return false; // not enough hits found in specified layers
3736
}
3837
}
@@ -128,12 +127,20 @@ void TrackSelection::SetMaxDcaXYPtDep(std::function<float(float)> ptDepCut)
128127
void TrackSelection::SetRequireHitsInITSLayers(int8_t minNRequiredHits, std::set<uint8_t> requiredLayers)
129128
{
130129
// layer 0 corresponds to the the innermost ITS layer
131-
mRequiredITSHits.push_back(std::make_pair(minNRequiredHits, requiredLayers));
130+
uint8_t mask = 0;
131+
for (const auto& layer : requiredLayers) {
132+
mask |= (1u << layer);
133+
}
134+
mRequiredITSHits.push_back(std::make_pair(minNRequiredHits, mask));
132135
LOG(info) << "Track selection, set require hits in ITS layers: " << static_cast<int>(minNRequiredHits);
133136
}
134137
void TrackSelection::SetRequireNoHitsInITSLayers(std::set<uint8_t> excludedLayers)
135138
{
136-
mRequiredITSHits.push_back(std::make_pair(-1, excludedLayers));
139+
uint8_t mask = 0;
140+
for (const auto& layer : excludedLayers) {
141+
mask |= (1u << layer);
142+
}
143+
mRequiredITSHits.push_back(std::make_pair(-1, mask));
137144
LOG(info) << "Track selection, set require no hits in ITS layers";
138145
}
139146

Common/Core/TrackSelection.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,10 @@ class TrackSelection
268268
bool mRequireTPCRefit{false}; // require refit in TPC
269269
bool mRequireGoldenChi2{false}; // require golden chi2 cut (Run 2 only)
270270

271-
// vector of ITS requirements (minNRequiredHits in specific requiredLayers)
272-
std::vector<std::pair<int8_t, std::set<uint8_t>>> mRequiredITSHits{};
271+
// vector of ITS requirements (minNRequiredHits, bitmask of requiredLayers)
272+
std::vector<std::pair<int8_t, uint8_t>> mRequiredITSHits{};
273273

274-
ClassDefNV(TrackSelection, 1);
274+
ClassDefNV(TrackSelection, 2);
275275
};
276276

277277
#endif // COMMON_CORE_TRACKSELECTION_H_

0 commit comments

Comments
 (0)