diff --git a/Tr/TrackTools/src/StandaloneMuonRec.cpp b/Tr/TrackTools/src/StandaloneMuonRec.cpp index e13c0f3ced94294a8e86211ba8ec278828fb8f5a..5372c690203e141c62cb2a049ab616dace84b5f6 100644 --- a/Tr/TrackTools/src/StandaloneMuonRec.cpp +++ b/Tr/TrackTools/src/StandaloneMuonRec.cpp @@ -84,7 +84,12 @@ namespace { }; } // namespace -template <class MuonPosition> +/// MuonPositionConcept makes sure we are dealing either with CommonMuonHit or with MuonCluster +template <typename MuonPosition> +concept MuonPositionConcept = + requires { requires std::is_same_v<MuonPosition, CommonMuonHit> || std::is_same_v<MuonPosition, MuonCluster>; }; + +template <MuonPositionConcept MuonPosition> class StandaloneMuonRec : public LHCb::Algorithm::Transformer< LHCb::Tracks( const std::vector<MuonPosition, LHCb::Allocators::EventLocal<MuonPosition>>&, const Cache& ), @@ -166,7 +171,7 @@ DECLARE_COMPONENT_WITH_ID( StandaloneMuonRec<MuonCluster>, "StandaloneMuonRecWit //============================================================================= // Main execution //============================================================================= -template <typename MuonPosition> +template <MuonPositionConcept MuonPosition> LHCb::Tracks StandaloneMuonRec<MuonPosition>::operator()( const MuonPositionContainer& hitContainer, const Cache& cache ) const { @@ -204,7 +209,7 @@ LHCb::Tracks StandaloneMuonRec<MuonPosition>::operator()( const MuonPositionCont return outputTracks; } -template <typename MuonPosition> +template <MuonPositionConcept MuonPosition> bool StandaloneMuonRec<MuonPosition>::findCoincidence( const float x, const float y, const unsigned int station, const unsigned int regionBefore, const std::vector<MuonPosition>& hits, @@ -230,7 +235,7 @@ bool StandaloneMuonRec<MuonPosition>::findCoincidence( const float x, const floa } return findCand; } -template <typename MuonPosition> +template <MuonPositionConcept MuonPosition> void StandaloneMuonRec<MuonPosition>::findmuonTrack( const PositionsInStations& hitContainer, const Cache& cache, std::array<MuonPosition, LHCb::Detector::Muon::nStations>& bestCandidates, const int seed, @@ -278,7 +283,7 @@ void StandaloneMuonRec<MuonPosition>::findmuonTrack( muonTracks.push_back( muon ); } } -template <typename MuonPosition> +template <MuonPositionConcept MuonPosition> std::vector<StandaloneMuonTrack<MuonPosition>> StandaloneMuonRec<MuonPosition>::muonSearch( const PositionsInStations& hitContainer, const Cache& cache ) const { std::vector<StandaloneMuonTrack<MuonPosition>> muonTracks; @@ -307,7 +312,7 @@ StandaloneMuonRec<MuonPosition>::muonSearch( const PositionsInStations& hitConta } // estimate the momentum of muonTrack -template <typename MuonPosition> +template <MuonPositionConcept MuonPosition> void StandaloneMuonRec<MuonPosition>::recMomentum( StandaloneMuonTrack<MuonPosition>& track, const Cache& cache, LHCb::Track& lbtrack ) const { @@ -386,9 +391,6 @@ void StandaloneMuonRec<MuonPosition>::recMomentum( StandaloneMuonTrack<MuonPosit const int DoFForPointAtZero = m_yAt0Error < std::numeric_limits<float>::max(); lbtrack.setNDoF( track.nHits() - 2 + DoFForPointAtZero ); // add one degree of freedom for the point at 0/0/0 - static_assert( std::is_same_v<MuonPosition, CommonMuonHit> || std::is_same_v<MuonPosition, MuonCluster>, - "Muon position must either be a CommonMuonHit or a MuonCluster" ); - for ( int i = 0; i < track.nHits(); i++ ) { if constexpr ( std::is_same_v<MuonPosition, CommonMuonHit> ) { const auto tile = track.point( i ).tile(); @@ -409,7 +411,7 @@ void StandaloneMuonRec<MuonPosition>::recMomentum( StandaloneMuonTrack<MuonPosit lbtrack.setType( LHCb::Track::Types::Muon ); } -template <typename MuonPosition> +template <MuonPositionConcept MuonPosition> void StandaloneMuonRec<MuonPosition>::detectClone( std::vector<StandaloneMuonTrack<MuonPosition>>& muonTracks, const Cache& cache ) const {