diff --git a/Pr/PrAlgorithms/src/PrMatchNN.cpp b/Pr/PrAlgorithms/src/PrMatchNN.cpp index 6a974475c51386dcfce44ed5a6e5a8ce1ce5fa0c..ed4d035aa655935a07e2b32dfe0dd71e7c27cdcf 100644 --- a/Pr/PrAlgorithms/src/PrMatchNN.cpp +++ b/Pr/PrAlgorithms/src/PrMatchNN.cpp @@ -128,6 +128,8 @@ namespace LHCb::Pr::MatchNN { Gaudi::Property<float> m_maxDistY{this, "MaxDistY", 250 * Gaudi::Units::mm}; Gaudi::Property<float> m_maxDSlope{this, "MaxDSlope", 1.5}; Gaudi::Property<float> m_maxDSlopeY{this, "MaxDSlopeY", 0.15}; + Gaudi::Property<float> m_minP{this, "MinP", 0.0 * Gaudi::Units::MeV}; + Gaudi::Property<float> m_minPt{this, "MinPt", 0.0 * Gaudi::Units::MeV}; // -- Counters mutable Gaudi::Accumulators::MsgCounter<MSG::WARNING> m_momentum_failed{this, "momentum determination failed!"}; @@ -360,30 +362,17 @@ namespace LHCb::Pr::MatchNN { auto const seediter = seeds.simd(); auto const veloiter = velos.simd(); + const bool apply_min_p_cut = m_minP.value() > 0; + const simd::float_v maxQOvP = + ( apply_min_p_cut ? 1.0 / m_minP.value() : std::numeric_limits<simd::float_v>::max() ); + const bool apply_min_pt_cut = m_minPt.value() > 0; + for ( auto const& match : matches.simd() ) { - auto loopMask = match.loop_mask(); - auto const oTrack = result.compress_back<SIMDWrapper::InstructionSet::Best>( loopMask ); - oTrack.field<TracksTag::trackVP>().set( match.get<Tag::veloIndex>() ); - oTrack.field<TracksTag::trackUT>().set( -1 ); - oTrack.field<TracksTag::trackSeed>().set( match.get<Tag::seedIndex>() ); + auto loopMask = match.loop_mask(); auto const seed_track = seediter.gather( match.get<Tag::seedIndex>(), loopMask ); auto const velo_track = veloiter.gather( match.get<Tag::veloIndex>(), loopMask ); - auto const n_fthits = seed_track.nHits(); - auto const n_vphits = velo_track.nHits(); - oTrack.field<TracksTag::VPHits>().resize( n_vphits ); - oTrack.field<TracksTag::UTHits>().resize( 0 ); - oTrack.field<TracksTag::FTHits>().resize( n_fthits ); - - for ( auto idx{0}; idx < n_vphits.hmax( loopMask ); ++idx ) { - oTrack.field<TracksTag::VPHits>()[idx].template field<TracksTag::Index>().set( velo_track.vp_index( idx ) ); - oTrack.field<TracksTag::VPHits>()[idx].template field<TracksTag::LHCbID>().set( velo_track.vp_lhcbID( idx ) ); - } - for ( auto idx{0}; idx < n_fthits.hmax( loopMask ); ++idx ) { - oTrack.field<TracksTag::FTHits>()[idx].template field<TracksTag::Index>().set( seed_track.ft_index( idx ) ); - oTrack.field<TracksTag::FTHits>()[idx].template field<TracksTag::LHCbID>().set( seed_track.ft_lhcbID( idx ) ); - } //== get Velo and T states at the usual pattern reco positions auto state_endvelo = velo_track.get<VeloTag::States>( 1 ); @@ -401,6 +390,42 @@ namespace LHCb::Pr::MatchNN { } ) .ignore(); + // If enabled filter on min track P, Pt + if ( apply_min_p_cut ) { + auto pMask = abs( qOverP ) < maxQOvP; + loopMask = loopMask & pMask; + } + if ( apply_min_pt_cut ) { + const auto momentum = abs( 1.0 / qOverP ); + const auto tx2 = state_beam.tx() * state_beam.tx(); + const auto ty2 = state_beam.ty() * state_beam.ty(); + const auto sinTrack = sqrt( 1.0 - ( 1.0 / ( 1.0 + tx2 + ty2 ) ) ); + const auto pt = sinTrack * momentum; + auto ptMask = m_minPt.value() < pt; + loopMask = loopMask & ptMask; + } + + auto const oTrack = result.compress_back<SIMDWrapper::InstructionSet::Best>( loopMask ); + + oTrack.field<TracksTag::trackVP>().set( match.get<Tag::veloIndex>() ); + oTrack.field<TracksTag::trackUT>().set( -1 ); + oTrack.field<TracksTag::trackSeed>().set( match.get<Tag::seedIndex>() ); + + auto const n_fthits = seed_track.nHits(); + auto const n_vphits = velo_track.nHits(); + oTrack.field<TracksTag::VPHits>().resize( n_vphits ); + oTrack.field<TracksTag::UTHits>().resize( 0 ); + oTrack.field<TracksTag::FTHits>().resize( n_fthits ); + + for ( auto idx{0}; idx < n_vphits.hmax( loopMask ); ++idx ) { + oTrack.field<TracksTag::VPHits>()[idx].template field<TracksTag::Index>().set( velo_track.vp_index( idx ) ); + oTrack.field<TracksTag::VPHits>()[idx].template field<TracksTag::LHCbID>().set( velo_track.vp_lhcbID( idx ) ); + } + for ( auto idx{0}; idx < n_fthits.hmax( loopMask ); ++idx ) { + oTrack.field<TracksTag::FTHits>()[idx].template field<TracksTag::Index>().set( seed_track.ft_index( idx ) ); + oTrack.field<TracksTag::FTHits>()[idx].template field<TracksTag::LHCbID>().set( seed_track.ft_lhcbID( idx ) ); + } + // store end of VELO state oTrack.field<TracksTag::States>( 0 ).setPosition( state_endvelo.x(), state_endvelo.y(), state_endvelo.z() ); oTrack.field<TracksTag::States>( 0 ).setDirection( state_endvelo.tx(), state_endvelo.ty() );