Skip to content
Snippets Groups Projects

Consolidate RichPID functors

Merged Gerhard Raven requested to merge consolidate-richpid-functors into master
All threads resolved!
Files
2
@@ -16,78 +16,64 @@
namespace Functors::PID {
// RICH
template <Rich::ParticleIDType pidtype, bool scaled = false>
struct RichDLL : public Function {
auto operator()( LHCb::Particle const& p ) const {
auto const* pid = p.proto() ? p.proto()->richPID() : nullptr;
if constexpr ( scaled ) {
return pid ? Functors::Optional{pid->scaledDLLForCombDLL( pidtype )} : std::nullopt;
} else {
return pid ? Functors::Optional{pid->particleDeltaLL( pidtype )} : std::nullopt;
namespace details {
template <Rich::ParticleIDType pidtype, bool scaled = false>
struct RichDLL : public Function {
auto operator()( LHCb::Particle const& p ) const {
auto const* pid = p.proto() ? p.proto()->richPID() : nullptr;
if constexpr ( scaled ) {
return pid ? Functors::Optional{pid->scaledDLLForCombDLL( pidtype )} : std::nullopt;
} else {
return pid ? Functors::Optional{pid->particleDeltaLL( pidtype )} : std::nullopt;
}
}
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
};
using RichDLLe = RichDLL<Rich::ParticleIDType::Electron>;
using RichDLLmu = RichDLL<Rich::ParticleIDType::Muon>;
using RichDLLp = RichDLL<Rich::ParticleIDType::Proton>;
using RichDLLk = RichDLL<Rich::ParticleIDType::Kaon>;
using RichDLLpi = RichDLL<Rich::ParticleIDType::Pion>;
using RichDLLd = RichDLL<Rich::ParticleIDType::Deuteron>;
using RichDLLbt = RichDLL<Rich::ParticleIDType::BelowThreshold>;
using RichScaledDLLe = RichDLL<Rich::ParticleIDType::Electron, true>;
using RichScaledDLLmu = RichDLL<Rich::ParticleIDType::Muon, true>;
struct Rich1GasUsed : public Predicate {
bool operator()( LHCb::Particle const& p ) const {
auto const* pid = p.proto() ? p.proto()->richPID() : nullptr;
return pid ? pid->usedRich1Gas() : false;
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
};
struct Rich2GasUsed : public Predicate {
bool operator()( LHCb::Particle const& p ) const {
auto const* pid = p.proto() ? p.proto()->richPID() : nullptr;
return pid ? pid->usedRich2Gas() : false;
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
};
template <Rich::ParticleIDType pidtype>
struct RichThreshold : public Predicate {
bool operator()( LHCb::Particle const& p ) const {
auto const* pid = p.proto() ? p.proto()->richPID() : nullptr;
return pid ? pid->isAboveThreshold( pidtype ) : false;
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
};
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
};
using RichThresholdEl = RichThreshold<Rich::ParticleIDType::Electron>;
using RichThresholdKa = RichThreshold<Rich::ParticleIDType::Kaon>;
using RichThresholdMu = RichThreshold<Rich::ParticleIDType::Muon>;
using RichThresholdPi = RichThreshold<Rich::ParticleIDType::Pion>;
using RichThresholdPr = RichThreshold<Rich::ParticleIDType::Proton>;
using RichThresholdDe = RichThreshold<Rich::ParticleIDType::Deuteron>;
template <auto fn, auto... args>
struct RichPIDPredicate : Predicate {
bool operator()( LHCb::Particle const& p ) const {
auto const* pid = p.proto() ? p.proto()->richPID() : nullptr;
return pid ? std::invoke( fn, *pid, args... ) : false;
}
bool operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
};
} // namespace details
using RichDLLe = details::RichDLL<Rich::ParticleIDType::Electron>;
using RichDLLmu = details::RichDLL<Rich::ParticleIDType::Muon>;
using RichDLLp = details::RichDLL<Rich::ParticleIDType::Proton>;
using RichDLLk = details::RichDLL<Rich::ParticleIDType::Kaon>;
using RichDLLpi = details::RichDLL<Rich::ParticleIDType::Pion>;
using RichDLLd = details::RichDLL<Rich::ParticleIDType::Deuteron>;
using RichDLLbt = details::RichDLL<Rich::ParticleIDType::BelowThreshold>;
using RichScaledDLLe = details::RichDLL<Rich::ParticleIDType::Electron, true>;
using RichScaledDLLmu = details::RichDLL<Rich::ParticleIDType::Muon, true>;
using Rich1GasUsed = details::RichPIDPredicate<&LHCb::RichPID::usedRich1Gas>;
using Rich2GasUsed = details::RichPIDPredicate<&LHCb::RichPID::usedRich2Gas>;
using RichThresholdEl = details::RichPIDPredicate<&LHCb::RichPID::isAboveThreshold, Rich::ParticleIDType::Electron>;
using RichThresholdKa = details::RichPIDPredicate<&LHCb::RichPID::isAboveThreshold, Rich::ParticleIDType::Kaon>;
using RichThresholdMu = details::RichPIDPredicate<&LHCb::RichPID::isAboveThreshold, Rich::ParticleIDType::Muon>;
using RichThresholdPi = details::RichPIDPredicate<&LHCb::RichPID::isAboveThreshold, Rich::ParticleIDType::Pion>;
using RichThresholdPr = details::RichPIDPredicate<&LHCb::RichPID::isAboveThreshold, Rich::ParticleIDType::Proton>;
using RichThresholdDe = details::RichPIDPredicate<&LHCb::RichPID::isAboveThreshold, Rich::ParticleIDType::Deuteron>;
// MUON
//
/** @brief IsMuon, as defined by the accessor of the same name.
*/
struct IsMuon : public Predicate {
bool operator()( LHCb::ProtoParticle const& pp ) const {
auto pid = pp.muonPID();
return pid ? ( *this )( *pid ) : false;
return Functors::detail::and_then( pp.muonPID(), *this ).value_or( false );
}
bool operator()( LHCb::Particle const& p ) const {
auto const* pp = p.proto();
return pp && ( *this )( *pp );
return Functors::detail::and_then( p.proto(), *this ).value_or( false );
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
@@ -102,9 +88,7 @@ namespace Functors::PID {
*/
struct InAcceptance : public Predicate {
auto operator()( LHCb::Particle const& p ) const {
return Functors::detail::and_then(
p.proto(), []( auto const& pp ) { return pp.muonPID(); },
[]( auto const& pid ) { return pid.InAcceptance(); } )
return Functors::detail::and_then( p.proto(), &LHCb::ProtoParticle::muonPID, &LHCb::MuonPID::InAcceptance )
.value_or( false );
}
@@ -121,16 +105,16 @@ namespace Functors::PID {
*/
struct IsMuonTight : public Predicate {
bool operator()( LHCb::ProtoParticle const& pp ) const {
auto pid = pp.muonPID();
return pid ? pid->IsMuonTight() : false;
return Functors::detail::and_then( pp.muonPID(), &LHCb::MuonPID::IsMuonTight ).value_or( false );
}
bool operator()( LHCb::Particle const& p ) const {
auto const* pp = p.proto();
return pp && ( *this )( *pp );
return Functors::detail::and_then( p.proto(), *this ).value_or( false );
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
auto operator()( LHCb::Particle const* p ) const {
return Functors::detail::and_then( p, *this ).value_or( false );
}
template <typename Data>
auto operator()( Data const& d ) const -> decltype( Sel::Utils::deref_if_ptr( d ).IsMuonTight() ) {
@@ -143,8 +127,7 @@ namespace Functors::PID {
*/
struct MuonChi2Corr : public Function {
auto operator()( LHCb::Particle const& p ) const {
return Functors::detail::and_then(
p.proto(), []( auto const& pp ) { return pp.muonPID(); }, []( auto const& pid ) { return pid.chi2Corr(); } );
return Functors::detail::and_then( p.proto(), &LHCb::ProtoParticle::muonPID, &LHCb::MuonPID::chi2Corr );
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
@@ -159,8 +142,7 @@ namespace Functors::PID {
*/
struct MuonLLMu : public Function {
auto operator()( LHCb::Particle const& p ) const {
return Functors::detail::and_then(
p.proto(), []( auto const& pp ) { return pp.muonPID(); }, []( auto const& pid ) { return pid.MuonLLMu(); } );
return Functors::detail::and_then( p.proto(), &LHCb::ProtoParticle::muonPID, &LHCb::MuonPID::MuonLLMu );
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
@@ -175,8 +157,7 @@ namespace Functors::PID {
*/
struct MuonLLBg : public Function {
auto operator()( LHCb::Particle const& p ) const {
return Functors::detail::and_then(
p.proto(), []( auto const& pp ) { return pp.muonPID(); }, []( auto const& pid ) { return pid.MuonLLBg(); } );
return Functors::detail::and_then( p.proto(), &LHCb::ProtoParticle::muonPID, &LHCb::MuonPID::MuonLLBg );
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
@@ -192,8 +173,7 @@ namespace Functors::PID {
*/
struct MuonCatBoost : public Function {
auto operator()( LHCb::Particle const& p ) const {
return Functors::detail::and_then(
p.proto(), []( auto const& pp ) { return pp.muonPID(); }, []( auto const& pid ) { return pid.muonMVA2(); } );
return Functors::detail::and_then( p.proto(), &LHCb::ProtoParticle::muonPID, &LHCb::MuonPID::muonMVA2 );
}
auto operator()( LHCb::Particle const* p ) const { return ( *this )( *p ); }
Loading