diff --git a/Common/Core/TrackSelection.cxx b/Common/Core/TrackSelection.cxx index 6fe7a2e162b..dd0c84bf29d 100644 --- a/Common/Core/TrackSelection.cxx +++ b/Common/Core/TrackSelection.cxx @@ -27,12 +27,11 @@ bool TrackSelection::FulfillsITSHitRequirements(uint8_t itsClusterMap) const { - constexpr uint8_t bit = 1; - for (auto& itsRequirement : mRequiredITSHits) { - auto hits = std::count_if(itsRequirement.second.begin(), itsRequirement.second.end(), [&](auto&& requiredLayer) { return itsClusterMap & (bit << requiredLayer); }); - if ((itsRequirement.first == -1) && (hits > 0)) { + for (const auto& [minHits, layerMask] : mRequiredITSHits) { + int hits = __builtin_popcount(itsClusterMap & layerMask); + if ((minHits == -1) && (hits > 0)) { return false; // no hits were required in specified layers - } else if (hits < itsRequirement.first) { + } else if (hits < minHits) { return false; // not enough hits found in specified layers } } @@ -128,12 +127,20 @@ void TrackSelection::SetMaxDcaXYPtDep(std::function ptDepCut) void TrackSelection::SetRequireHitsInITSLayers(int8_t minNRequiredHits, std::set requiredLayers) { // layer 0 corresponds to the the innermost ITS layer - mRequiredITSHits.push_back(std::make_pair(minNRequiredHits, requiredLayers)); + uint8_t mask = 0; + for (const auto& layer : requiredLayers) { + mask |= (1u << layer); + } + mRequiredITSHits.push_back(std::make_pair(minNRequiredHits, mask)); LOG(info) << "Track selection, set require hits in ITS layers: " << static_cast(minNRequiredHits); } void TrackSelection::SetRequireNoHitsInITSLayers(std::set excludedLayers) { - mRequiredITSHits.push_back(std::make_pair(-1, excludedLayers)); + uint8_t mask = 0; + for (const auto& layer : excludedLayers) { + mask |= (1u << layer); + } + mRequiredITSHits.push_back(std::make_pair(-1, mask)); LOG(info) << "Track selection, set require no hits in ITS layers"; } diff --git a/Common/Core/TrackSelection.h b/Common/Core/TrackSelection.h index 5f8590cb85f..b803b3a33ff 100644 --- a/Common/Core/TrackSelection.h +++ b/Common/Core/TrackSelection.h @@ -268,10 +268,10 @@ class TrackSelection bool mRequireTPCRefit{false}; // require refit in TPC bool mRequireGoldenChi2{false}; // require golden chi2 cut (Run 2 only) - // vector of ITS requirements (minNRequiredHits in specific requiredLayers) - std::vector>> mRequiredITSHits{}; + // vector of ITS requirements (minNRequiredHits, bitmask of requiredLayers) + std::vector> mRequiredITSHits{}; - ClassDefNV(TrackSelection, 1); + ClassDefNV(TrackSelection, 2); }; #endif // COMMON_CORE_TRACKSELECTION_H_