ATLAS Offline Software
Loading...
Searching...
No Matches
InDet::InDetTrackSelectionTool Class Reference

Implementation of the track selector tool. More...

#include <InDetTrackSelectionTool.h>

Inheritance diagram for InDet::InDetTrackSelectionTool:

Public Member Functions

virtual void print () const
 Print the state of the tool.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
Additional helper functions, not directly mimicking Athena
template<class T>
const T * getProperty (const std::string &name) const
 Get one of the tool's properties.
const std::string & msg_level_name () const __attribute__((deprecated))
 A deprecated function for getting the message level's name.
const std::string & getName (const void *ptr) const
 Get the name of an object that is / should be in the event store.
SG::sgkey_t getKey (const void *ptr) const
 Get the (hashed) key of an object that is in the event store.

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

ASG_TOOL_CLASS2(InDetTrackSelectionTool, IAsgSelectionTool, InDet::IInDetTrackSelectionTool) public ~InDetTrackSelectionTool ()
 Create a proper constructor for Athena.
virtual void setCutLevel (InDet::CutLevel level, bool overwrite=true) override __attribute__((deprecated("For consistency with the athena interface
 Function to set the cut level within standalone ROOT.
void setCutLevelPrivate (InDet::CutLevel level, bool overwrite=true)
template<int VERBOSE, class Trk_Helper>
StatusCode setupCuts (std::map< std::string, std::vector< std::function< bool(Trk_Helper helper, const asg::AsgMessaging &msgHelper)> > > &trackCuts)
template<class Trk_Helper>
asg::AcceptData accept (Trk_Helper helper, const std::map< std::string, std::vector< std::function< bool(Trk_Helper helper, const asg::AsgMessaging &msgHelper)> > > &trackCuts) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>
Function(s) implementing the asg::IAsgTool interface
virtual StatusCode initialize () override
 Function initialising the tool.
virtual StatusCode finalize () override
 Function finalizing the tool.
Function(s) implementing the IAsgSelectionTool interface
virtual const asg::AcceptInfogetAcceptInfo () const override
 Get an object describing the "selection steps" of the tool.
virtual asg::AcceptData accept (const xAOD::IParticle *) const override
 Get the decision using a generic IParticle pointer.
Function(s) implementing the IInDetTrackSelectionTool interface
virtual asg::AcceptData accept (const xAOD::TrackParticle &track, const xAOD::Vertex *vertex=nullptr) const override
 Get the decision for a specific track object.
virtual asg::AcceptData accept (const Trk::Track &track, const Trk::Vertex *vertex=nullptr) const override
 Function that returns the result of the cuts to a Trk::Track.

Static Private Member Functions

static bool maxDoubleIsSet (double cutValue)
static bool maxIntIsSet (int cutValue)

Private Attributes

virtual void the cut level is best set through the CutLevel property
bool m_isInitialized = false
std::atomic_bool m_warnInit = false
std::unordered_map< std::string, std::shared_ptr< TrackAccessor > > m_trackAccessors
 list of the accessors that need to be run for each track
std::unique_ptr< asg::AsgMessagingm_msgHelper
std::map< std::string, std::vector< std::function< bool(InDetAccessor::TrackParticleHelper helper, const asg::AsgMessaging &msgHelper)> > > m_trackParticleCuts
 First element is the name of the cut family, second element is the set of cuts.
std::map< std::string, std::vector< std::function< bool(InDetAccessor::TrkTrackHelper helper, const asg::AsgMessaging &msgHelper)> > > m_trkTrackCuts
 First element is the name of the cut family, second element is the set of cuts.
std::atomic< uint64_t > m_numTracksProcessed = 0
 a counter of the number of tracks proccessed
std::atomic< uint64_t > m_numTracksPassed = 0
 a counter of the number of tracks that passed all cuts
std::vector< uint64_t > m_numTracksPassedCuts ATLAS_THREAD_SAFE
 tracks the number of tracks that passed each cut family.
std::mutex m_mutex
Gaudi::Property< double > m_minPt {this, "minPt", -1., "Minimum transverse momentum"}
Gaudi::Property< double > m_minP {this, "minP", -1., "Minimum momentum"}
Gaudi::Property< double > m_maxAbsEta {this, "maxAbsEta", LOCAL_MAX_DOUBLE, "Maximum magnitude of pseudorapidity"}
Gaudi::Property< double > m_maxZ0SinTheta {this, "maxZ0SinTheta", LOCAL_MAX_DOUBLE, "Maximum |z0|*sin(theta)"}
Gaudi::Property< double > m_maxZ0 {this, "maxZ0", LOCAL_MAX_DOUBLE, "Maximum longitudinal separation"}
Gaudi::Property< double > m_maxD0 {this, "maxD0", LOCAL_MAX_DOUBLE, "Maximum transvers separation"}
Gaudi::Property< double > m_maxSigmaD0 {this, "maxSigmaD0", LOCAL_MAX_DOUBLE, "Maximum error on d0"}
Gaudi::Property< double > m_maxSigmaZ0 {this, "maxSigmaZ0", LOCAL_MAX_DOUBLE, "Maximum error on z0"}
Gaudi::Property< double > m_maxSigmaZ0SinTheta {this, "maxSigmaZ0SinTheta", LOCAL_MAX_DOUBLE, "Maximum error on z0*sin(theta)"}
Gaudi::Property< double > m_maxD0overSigmaD0 {this, "maxD0overSigmaD0", LOCAL_MAX_DOUBLE, "Significance cut on |d0|"}
Gaudi::Property< double > m_maxZ0overSigmaZ0 {this, "maxZ0overSigmaZ0", LOCAL_MAX_DOUBLE, "Significance cut on |z0|"}
Gaudi::Property< double > m_maxZ0SinThetaoverSigmaZ0SinTheta
Gaudi::Property< int > m_minNInnermostLayerHits
Gaudi::Property< int > m_minNNextToInnermostLayerHits
Gaudi::Property< int > m_minNBothInnermostLayersHits
Gaudi::Property< int > m_maxNInnermostLayerSharedHits
Gaudi::Property< int > m_useMinBiasInnermostLayersCut
Gaudi::Property< bool > m_useHILoosePixModInnermostLayersCut
Gaudi::Property< int > m_minNSiHits {this, "minNSiHits", -1, "Minimum silicon (pixel + SCT) hits"}
Gaudi::Property< int > m_maxNSiSharedHits
Gaudi::Property< int > m_minNSiHitsIfSiSharedHits
Gaudi::Property< int > m_maxNSiHoles {this, "maxNSiHoles", LOCAL_MAX_INT, "Maximum silicon (pixel + SCT) holes"}
Gaudi::Property< int > m_minNPixelHits {this, "minNPixelHits", -1, "Required pixel hits"}
Gaudi::Property< int > m_maxNPixelSharedHits
Gaudi::Property< int > m_maxNPixelHoles
Gaudi::Property< double > m_minEtaForStrictNSiHitsCut
Gaudi::Property< int > m_minNSiHitsAboveEtaCutoff
Gaudi::Property< bool > m_maxOneSharedModule
Gaudi::Property< bool > m_useEtaDependentMaxChiSq
Gaudi::Property< int > m_minNSiHitsPhysical
Gaudi::Property< int > m_minNPixelHitsPhysical {this, "minNPixelHitsPhysical", -1, "Minimum physical pixel hits"}
Gaudi::Property< int > m_minNSctHitsPhysical {this, "minNSctHitsPhysical", -1, "Minimum physical SCT hits"}
Gaudi::Property< int > m_minNSctHits {this, "minNSctHits", -1, "Minimum SCT hits"}
Gaudi::Property< int > m_maxNSctSharedHits
Gaudi::Property< int > m_maxNSctHoles {this, "maxNSctHoles", LOCAL_MAX_INT, "Maximum SCT holes"}
Gaudi::Property< int > m_maxNSctDoubleHoles {this, "maxNSctDoubleHoles", LOCAL_MAX_INT, "Maximum SCT double holes"}
Gaudi::Property< double > m_maxTrtEtaAcceptance
Gaudi::Property< double > m_maxEtaForTrtHitCuts
Gaudi::Property< int > m_minNTrtHits {this, "minNTrtHits", -1, "Minimum TRT hits"}
Gaudi::Property< int > m_minNTrtHitsPlusOutliers {this, "minNTrtHitsPlusOutliers", -1, "Minimum TRT hits including outliers"}
Gaudi::Property< int > m_minNTrtHighThresholdHits {this, "minNTrtHighThresholdHits", -1, "Minimum high E TRT hits"}
Gaudi::Property< int > m_minNTrtHighThresholdHitsPlusOutliers
Gaudi::Property< double > m_maxTrtHighEFraction
Gaudi::Property< double > m_maxTrtHighEFractionWithOutliers
Gaudi::Property< double > m_maxTrtOutlierFraction
Gaudi::Property< double > m_maxChiSq {this, "maxChiSq", LOCAL_MAX_DOUBLE, "Maximum chi squared"}
Gaudi::Property< double > m_maxChiSqperNdf
Gaudi::Property< double > m_minProb {this, "minProb", -1., "Minimum p(chi^2, Ndof)"}
Gaudi::Property< double > m_minPtForProbCut
Gaudi::Property< double > m_minProbAbovePtCutoff
Gaudi::Property< int > m_minNUsedHitsdEdx {this, "minNUsedHitsdEdx", -1, "Minimum hits used for dEdx"}
Gaudi::Property< int > m_minNOverflowHitsdEdx {this, "minNOverflowHitsdEdx", -1, "Minimum overflow hits in IBL for dEdx"}
Gaudi::Property< bool > m_eProbHTonlyForXe
Gaudi::Property< double > m_minEProbabilityHT
Gaudi::Property< bool > m_useExperimentalInnermostLayersCut
Gaudi::Property< int > m_minNSiHitsMod
Gaudi::Property< int > m_minNSiHitsModTop
Gaudi::Property< int > m_minNSiHitsModBottom
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForSiHitsCut
Gaudi::Property< std::vector< int > > m_vecMinNSiHitsAboveEta
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForPtCut {this, "vecEtaCutoffsForPtCut", {}, "Minimum eta cutoffs for each pT cut"}
Gaudi::Property< std::vector< double > > m_vecMinPtAboveEta
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForSctHitsCut
Gaudi::Property< std::vector< int > > m_vecMinNSctHitsAbovePt
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForZ0SinThetaCut
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForZ0SinThetaCut
Gaudi::Property< std::vector< std::vector< double > > > m_vecvecMaxZ0SinThetaAboveEtaPt
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForD0Cut {this, "vecEtaCutoffsForD0Cut", {}, "Minimum eta cutoffs for each D0 value"}
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForD0Cut {this, "vecPtCutoffsForD0Cut", {}, "Minimum pt cutoffs for each D0 value"}
Gaudi::Property< std::vector< std::vector< double > > > m_vecvecMaxD0AboveEtaPt
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForSctHolesCut
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForSctHolesCut
Gaudi::Property< std::vector< std::vector< double > > > m_vecvecMaxSctHolesAboveEtaPt
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForSctHitsPlusDeadCut
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForSctHitsPlusDeadCut
Gaudi::Property< std::vector< std::vector< double > > > m_vecvecMinSctHitsPlusDeadAboveEtaPt
asg::AcceptInfo m_acceptInfo
 Object used to store the last decision.
Gaudi::Property< std::string > m_cutLevel {this, "CutLevel", ""}
 The string version of the cut level so that it can be set via jobOptions.
Gaudi::Property< bool > m_initTrkTools {this, "UseTrkTrackTools", false, "Whether to initialize the Trk::Track tools"}
bool m_trackSumToolAvailable = false
 Whether the summary tool is available.
ToolHandle< Trk::ITrackSummaryToolm_trackSumTool {this, "TrackSummaryTool", "Trk::TrackSummaryTool/TrackSummaryTool"}
ToolHandle< Trk::IExtrapolatorm_extrapolator {this, "Extrapolator", "Trk::Extrapolator/Extrapolator"}
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Static Private Attributes

static constexpr double LOCAL_MAX_DOUBLE = 1.0e16
static constexpr int LOCAL_MAX_INT = std::numeric_limits<int>::max()
static const std::unordered_map< std::string, CutLevel > s_mapCutLevel

Friends

class TrackCut

Detailed Description

Implementation of the track selector tool.

Definition at line 51 of file InDetTrackSelectionTool.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ ~InDetTrackSelectionTool()

InDet::InDetTrackSelectionTool::~InDetTrackSelectionTool ( )
privatedefault

Create a proper constructor for Athena.

Member Function Documentation

◆ accept() [1/4]

asg::AcceptData InDet::InDetTrackSelectionTool::accept ( const Trk::Track & track,
const Trk::Vertex * vertex = nullptr ) const
overrideprivatevirtual

Function that returns the result of the cuts to a Trk::Track.

This version of accept() is included to allow the tool to be used in full-blown athena on Trk::Tracks. It is supposed to have identical functionality to the user as the xAOD version above, but of course it does need to access track information differently.

Implements InDet::IInDetTrackSelectionTool.

Definition at line 1082 of file InDetTrackSelectionTool.cxx.

1084{
1085 if (!m_isInitialized) ATH_MSG_WARNING( "Tool is not initialized! Calling accept() will not be very helpful." );
1086
1087 asg::AcceptData acceptData(&m_acceptInfo);
1088 if (m_trkTrackCuts.empty()) {
1091 return acceptData;
1092 }
1093
1094 const Trk::TrackParameters* perigee = track.perigeeParameters();
1095
1096 if ( perigee == nullptr || !perigee->covariance() ) {
1097 ATH_MSG_WARNING( "Track preselection: Zero pointer to parameterbase* received (most likely a track without perigee). This track will not pass any cuts." );
1098 return acceptData;
1099 }
1100
1101 std::unique_ptr<const Trk::TrackParameters> paramsAtVertex;
1102 if (vertex) {
1103 Trk::PerigeeSurface perigeeSurface(vertex->position());
1104 paramsAtVertex =
1105 m_extrapolator->extrapolate(Gaudi::Hive::currentContext(),
1106 *perigee,
1107 perigeeSurface,
1109 true,
1110 track.info().particleHypothesis());
1111 perigee = paramsAtVertex.get();
1112 }
1113
1114 if ( perigee == nullptr || !perigee->covariance() ) {
1115 ATH_MSG_INFO( "Track preselection: cannot make a measured perigee. This track will not pass any cuts." );
1116 if (!m_initTrkTools)
1117 ATH_MSG_INFO( "The user should set \"UseTrkTrackTools\" to true if they want the extrapolation tool to try to get a perigee." );
1118 return acceptData;
1119 }
1120
1121
1122 std::unique_ptr<Trk::TrackSummary> cleanup_summary;
1123 const Trk::TrackSummary* summary = track.trackSummary();
1124 if (summary == nullptr && m_trackSumToolAvailable) {
1125 cleanup_summary = m_trackSumTool->summary(Gaudi::Hive::currentContext(),track);
1126 summary = cleanup_summary.get();
1127 }
1128 if (summary == nullptr) {
1129 ATH_MSG_INFO( "Track preselection: cannot get a track summary. This track will not pass any cuts." );
1130 if (!m_initTrkTools)
1131 ATH_MSG_INFO( "The Trk::Track tools were not set to be initialized. The user should set the property \"UseTrkTrackTools\" to true if they wish to use the summary tool." );
1132 return acceptData;
1133 }
1134
1135 InDetAccessor::TrkTrackHelper track_helper(track,*summary, perigee);
1136 acceptData = accept( track_helper, m_trkTrackCuts);
1137 return acceptData;
1138}
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
ToolHandle< Trk::ITrackSummaryTool > m_trackSumTool
std::atomic< uint64_t > m_numTracksPassed
a counter of the number of tracks that passed all cuts
virtual asg::AcceptData accept(const xAOD::IParticle *) const override
Get the decision using a generic IParticle pointer.
std::atomic< uint64_t > m_numTracksProcessed
a counter of the number of tracks proccessed
asg::AcceptInfo m_acceptInfo
Object used to store the last decision.
ToolHandle< Trk::IExtrapolator > m_extrapolator
bool m_trackSumToolAvailable
Whether the summary tool is available.
std::map< std::string, std::vector< std::function< bool(InDetAccessor::TrkTrackHelper helper, const asg::AsgMessaging &msgHelper)> > > m_trkTrackCuts
First element is the name of the cut family, second element is the set of cuts.
@ anyDirection
ParametersBase< TrackParametersDim, Charged > TrackParameters

◆ accept() [2/4]

asg::AcceptData InDet::InDetTrackSelectionTool::accept ( const xAOD::IParticle * p) const
overrideprivatevirtual

Get the decision using a generic IParticle pointer.

Function that returns the result of the cut through the xAOD::IParticle interface.

This is included to implement the AsgSelectionTool interface. It is not the recommended way of using the tool. If the IParticle is an xAOD::TrackParticle, then it will return the result of the explicitly xAOD::TrackParticle version below, with no vertex provided.

Parameters
pAn xAOD::IParticle pointer. If it is of type xAOD::TrackParticle, then it will be cast as such and funnelled into the corresponding function. If it is of some different type, then the particle will not pass.

Implements InDet::IInDetTrackSelectionTool.

Definition at line 1016 of file InDetTrackSelectionTool.cxx.

1017{
1018
1019 asg::AcceptData acceptData(&m_acceptInfo);
1020 // Check if this is a track:
1021 if( p->type() != xAOD::Type::TrackParticle ) {
1022 ATH_MSG_ERROR( "accept(...) Function received a non-track" );
1023 return acceptData;
1024 }
1025
1026 // Cast it to a track (we have already checked its type so we do not have to dynamic_cast):
1027 const xAOD::TrackParticle* trk = static_cast< const xAOD::TrackParticle* >( p );
1028
1029 // Let the specific function do the work:
1030 return accept( *trk, nullptr );
1031}
#define ATH_MSG_ERROR(x)
@ TrackParticle
The object is a charged track particle.
Definition ObjectType.h:43
TrackParticle_v1 TrackParticle
Reference the current persistent version:

◆ accept() [3/4]

asg::AcceptData InDet::InDetTrackSelectionTool::accept ( const xAOD::TrackParticle & trk,
const xAOD::Vertex * vtx = nullptr ) const
overrideprivatevirtual

Get the decision for a specific track object.

Function that returns the result of the cuts applied to a track in the xAOD framework.

The workhorse function of the tool that checks whether or not a track passes, and also can provide some information about why the track failed when it does. First it accesses all the data it needs from the track (but does not retrieve info it won't need to check) by looping over its InDet::TrackAccessors. It then loops over its cut families, each of which is composed of one or more InDet::TrackCuts, storing whether or not the track passes all the corresponding cuts. This design allows functionality to be added to the tool without increasing overhead in the main loop for users who don't need it. This eliminates the need for several multiple versions of the tool.

Parameters
trkThe xAOD::TrackParticle in question.
vtxAn optional pointer to a xAOD::Vertex that can be provided if the user wishes to cut on z0 with respect to the vertex's position. Note that this does not affect d0 cuts. If a vertex is not provided then the z0 cuts are performed with respect to the beamspot. More information can be found at the InDetTrackingDC14 TWiki.
Returns
A asg::AcceptData object that can be treated as a boolean for a simple pass/fail. It does store more detailed information about which cuts passed and which failed, by organizing the results into cut families. For example, TAccept::getCutResult("Z0SinTheta") will be true if the track passed cuts on Z0*Sin(theta), its uncertainty, and its significance.

Implements InDet::IInDetTrackSelectionTool.

Definition at line 1059 of file InDetTrackSelectionTool.cxx.

1061{
1062 asg::AcceptData acceptData(&m_acceptInfo);
1063 if (m_trackParticleCuts.empty()) {
1066 return acceptData;
1067 }
1068
1069 InDetAccessor::TrackParticleHelper track_helper(trk,vtx);
1070 return accept( track_helper, m_trackParticleCuts);
1071}
std::map< std::string, std::vector< std::function< bool(InDetAccessor::TrackParticleHelper helper, const asg::AsgMessaging &msgHelper)> > > m_trackParticleCuts
First element is the name of the cut family, second element is the set of cuts.

◆ accept() [4/4]

template<class Trk_Helper>
asg::AcceptData InDet::InDetTrackSelectionTool::accept ( Trk_Helper helper,
const std::map< std::string, std::vector< std::function< bool(Trk_Helper helper, const asg::AsgMessaging &msgHelper)> > > & trackCuts ) const
private

Definition at line 922 of file InDetTrackSelectionTool.cxx.

923 {
924 if (!m_isInitialized) {
925 if (!m_warnInit) {
926 ATH_MSG_WARNING( "Tool is not initialized! Calling accept() will not be very helpful." );
927 m_warnInit = true;
928 }
929 }
930
931 asg::AcceptData acceptData(&m_acceptInfo);
932 bool passAll = true;
933
934 // loop over all cuts
935 UShort_t cutFamilyIndex = 0;
936 for ( const auto& cutFamily : trackCuts ) {
937 bool pass = true;
938
939 for ( const auto& cut : cutFamily.second ) {
940 if (! cut(helper, *m_msgHelper) ) {
941 pass = false;
942 break;
943 }
944 }
945
946 // @TODO really always run through all cuts even if passed is false ?
947 passAll &= pass;
948 acceptData.setCutResult( cutFamilyIndex, pass );
949 cutFamilyIndex++;
950 }
951
952 {
953 // lock access to m_numTracksPassedCuts
954 std::lock_guard<std::mutex> lock(m_mutex);
955 for (unsigned int idx=0; idx < trackCuts.size(); ++idx) {
956 assert(idx<m_numTracksPassedCuts.size());
957 m_numTracksPassedCuts[idx] += acceptData.getCutResult(idx);
958 }
959 }
960 if (passAll) m_numTracksPassed++;
962
963 return acceptData;
964
965}
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
std::unique_ptr< asg::AsgMessaging > m_msgHelper

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ finalize()

StatusCode InDet::InDetTrackSelectionTool::finalize ( )
overrideprivatevirtual

Function finalizing the tool.

Implements InDet::IInDetTrackSelectionTool.

Definition at line 968 of file InDetTrackSelectionTool.cxx.

969{
970 if (!m_isInitialized) {
971 ATH_MSG_ERROR( "You are attempting to finalize a tool that has not been initialized()." );
972 }
973
974#ifdef XAOD_ANALYSIS
975 if (m_numTracksProcessed == 0) {
976 ATH_MSG_INFO( "No tracks processed in selection tool." );
977 return StatusCode::SUCCESS;
978 }
979
980 // Only printed out for analysis
982 << m_numTracksPassed*100./m_numTracksProcessed << "% passed all cuts." );
983 for (const auto& cutFamily : m_trackParticleCuts) {
984 // lock(m_mutex) is not needed because this is inside of non-const finalize method.
985 uint64_t numPassed = m_numTracksPassedCuts.at(m_acceptInfo.getCutPosition(cutFamily.first));
986 ATH_MSG_INFO( numPassed << " = " << numPassed*100./m_numTracksProcessed << "% passed "
987 << cutFamily.first << " cut." );
988 }
989#endif
990
991 return StatusCode::SUCCESS;
992}

◆ getAcceptInfo()

const asg::AcceptInfo & InDet::InDetTrackSelectionTool::getAcceptInfo ( ) const
overrideprivatevirtual

Get an object describing the "selection steps" of the tool.

Accessor function to the tool's Root::TAccept object, which stores the result of the last accept(...) call.

The TAccept object itself is expensive to copy, and so should be accessed by const reference.

Implements InDet::IInDetTrackSelectionTool.

Definition at line 999 of file InDetTrackSelectionTool.cxx.

1000{
1001 return m_acceptInfo;
1002}

◆ getKey()

SG::sgkey_t asg::AsgTool::getKey ( const void * ptr) const
inherited

Get the (hashed) key of an object that is in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::TEvent both provide ways for getting the SG::sgkey_t key for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getName
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The hashed key of the object in the store. If not found, an invalid (zero) key.

Definition at line 119 of file AsgTool.cxx.

119 {
120
121#ifdef XAOD_STANDALONE
122 // In case we use @c xAOD::TEvent, we have a direct function call
123 // for this.
124 return evtStore()->event()->getKey( ptr );
125#else
126 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
127 return ( proxy == nullptr ? 0 : proxy->sgkey() );
128#endif // XAOD_STANDALONE
129 }
ServiceHandle< StoreGateSvc > & evtStore()

◆ getName()

const std::string & asg::AsgTool::getName ( const void * ptr) const
inherited

Get the name of an object that is / should be in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::TEvent both provide ways for getting the std::string name for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getKey
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The string name of the object in the store. If not found, an empty string.

Definition at line 106 of file AsgTool.cxx.

106 {
107
108#ifdef XAOD_STANDALONE
109 // In case we use @c xAOD::TEvent, we have a direct function call
110 // for this.
111 return evtStore()->event()->getName( ptr );
112#else
113 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
114 static const std::string dummy = "";
115 return ( proxy == nullptr ? dummy : proxy->name() );
116#endif // XAOD_STANDALONE
117 }

◆ getProperty()

template<class T>
const T * asg::AsgTool::getProperty ( const std::string & name) const
inherited

Get one of the tool's properties.

◆ initialize()

StatusCode InDet::InDetTrackSelectionTool::initialize ( void )
overrideprivatevirtual

Function initialising the tool.

Initializes the selection tool, setting up the cut objects as well as any additional tools it needs.

In athena, this is called automatically after the user has set the properties and so it must set the cut level without overwriting any additional cuts that have been set.

In standalone root, the cut levels can be set in a more or less intuitive way. After setting the cut levels and providing any additional configuration, this initialize() function must be called explicitly.

Implements InDet::IInDetTrackSelectionTool.

Definition at line 103 of file InDetTrackSelectionTool.cxx.

103 {
104 // Make sure we haven't already been initialized - this would be a sign of improper usage.
105 if (m_isInitialized) {
106 ATH_MSG_ERROR( "Tool has already been initialized. This is illegitimate." );
107 ATH_MSG_ERROR( "This call to initialize() will do nothing." );
108 return StatusCode::SUCCESS;
109 }
110
111 // Greet the user:
113
114 // if the CutLevel string is set to something recognizable,
115 // then do a soft set on the cuts (i.e. not overwriting those already set)
116 if (!m_cutLevel.empty()) {
117 std::unordered_map<std::string, InDet::CutLevel>::const_iterator it_mapCutLevel = s_mapCutLevel.find(m_cutLevel);
118 if ( it_mapCutLevel == s_mapCutLevel.end() ) {
119 ATH_MSG_ERROR( "The string \"" << m_cutLevel << "\" is not recognized as a cut level. No cuts will be changed." );
120 ATH_MSG_ERROR( "Cut level options are:" );
121 for (const auto& opt : s_mapCutLevel) {
122 ATH_MSG_ERROR( "\t" << opt.first );
123 }
124 } else {
125 ATH_MSG_DEBUG( "Cut level set to \"" << it_mapCutLevel->first << "\"." );
126 ATH_MSG_DEBUG( "This will not overwrite other cuts that have been set.");
127 setCutLevelPrivate( it_mapCutLevel->second, false );
128 }
129 }
130
131#ifndef XAOD_ANALYSIS
132 if (m_initTrkTools) {
134 if (!m_trackSumTool.empty()) {
135 ATH_CHECK( m_trackSumTool.retrieve() );
136 ATH_MSG_DEBUG( "Track summary tool retrieved." );
138 }
139 ATH_CHECK( m_extrapolator.retrieve() );
140 ATH_MSG_DEBUG( "Retrieved tool " << m_extrapolator );
141 } else {
142 m_extrapolator.disable();
143 m_trackSumTool.disable();
144 }
145#endif // XAOD_ANALYSIS
146
147 // Need messaging helper for cut functions
148 m_msgHelper = std::make_unique<asg::AsgMessaging>(this) ;
149
150
151#ifndef XAOD_ANALYSIS
152 // setup cut functions for Trk::Tracks
155#else
157#endif
158 // setup cut functions for xAOD::TrackParticles
159 for (const auto& cutFamily : m_trackParticleCuts) {
160 const std::string& cutFamilyName = cutFamily.first;
161 // lock(m_mutex) is not needed because this is inside of non-const initialize method.
162 m_numTracksPassedCuts.push_back(0);
163 if (m_acceptInfo.addCut( cutFamilyName, "Selection of tracks according to " + cutFamilyName ) < 0) {
164 ATH_MSG_ERROR( "Failed to add cut family " << cutFamilyName << " because the TAccept object is full." );
165 return StatusCode::FAILURE;
166 }
167 ATH_MSG_VERBOSE("Adding cut family " << cutFamilyName);
168 }
169
170 m_isInitialized = true;
171
172 return StatusCode::SUCCESS;
173}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
StatusCode setupCuts(std::map< std::string, std::vector< std::function< bool(Trk_Helper helper, const asg::AsgMessaging &msgHelper)> > > &trackCuts)
Gaudi::Property< std::string > m_cutLevel
The string version of the cut level so that it can be set via jobOptions.
static const std::unordered_map< std::string, CutLevel > s_mapCutLevel
void setCutLevelPrivate(InDet::CutLevel level, bool overwrite=true)
virtual StatusCode initialize()
Dummy implementation of the initialisation function.
Definition AsgTool.h:133

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ maxDoubleIsSet()

bool InDet::InDetTrackSelectionTool::maxDoubleIsSet ( double cutValue)
inlinestaticprivate

Definition at line 137 of file InDetTrackSelectionTool.h.

137{return cutValue < InDet::InDetTrackSelectionTool::LOCAL_MAX_DOUBLE && cutValue >= 0.;}

◆ maxIntIsSet()

bool InDet::InDetTrackSelectionTool::maxIntIsSet ( int cutValue)
inlinestaticprivate

Definition at line 138 of file InDetTrackSelectionTool.h.

138{return cutValue < InDet::InDetTrackSelectionTool::LOCAL_MAX_INT && cutValue >= 0;}

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msg_level_name()

const std::string & asg::AsgTool::msg_level_name ( ) const
inherited

A deprecated function for getting the message level's name.

Instead of using this, weirdly named function, user code should get the string name of the current minimum message level (in case they really need it...), with:

MSG::name( msg().level() )

This function's name doesn't follow the ATLAS coding rules, and as such will be removed in the not too distant future.

Returns
The string name of the current minimum message level that's printed

Definition at line 101 of file AsgTool.cxx.

101 {
102
103 return MSG::name( msg().level() );
104 }
MsgStream & msg() const
const std::string & name(Level lvl)
Convenience function for translating message levels to strings.
Definition MsgLevel.cxx:19

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ print()

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setCutLevel()

void InDet::InDetTrackSelectionTool::setCutLevel ( InDet::CutLevel level,
bool overwrite = true )
overrideprivatevirtual

Function to set the cut level within standalone ROOT.

This function can be used to set the cut selection of the tool to a pre-defined level, as definied in the twiki for InDetTrackingPerformanceGuidelines. It is left public for use in standalone ROOT. In athena, this should be set through the jobOptions via the "CutLevel" property instead.

Parameters
levelThe CutLevel enumeration that picks the preset level to set the cuts to.
overwriteA boolean (default true) that indicates whether to force an overwrite of each cut. If false, this function does not change the cut levels if they have been altered from their default (no cut) value.

Implements InDet::IInDetTrackSelectionTool.

Definition at line 1161 of file InDetTrackSelectionTool.cxx.

1162{
1163#ifndef XAOD_STANDALONE
1164 ATH_MSG_WARNING( "InDetTrackSelectionTool::setCutLevel() is not designed to be called manually in Athena." );
1165 ATH_MSG_WARNING( "It may not behave as intended. Instead, configure it in the job options through the CutLevel property." );
1166#endif // XAOD_STANDALONE
1167 if (!m_cutLevel.empty()) {
1168 ATH_MSG_WARNING( "Cut level already set to " << m_cutLevel << ". Calling setCutLevel() is not expected." );
1169 }
1170 setCutLevelPrivate(level, overwrite);
1171}

◆ setCutLevelPrivate()

void InDet::InDetTrackSelectionTool::setCutLevelPrivate ( InDet::CutLevel level,
bool overwrite = true )
private

Definition at line 1176 of file InDetTrackSelectionTool.cxx.

1177{
1178 switch (level) {
1179 case CutLevel::NoCut :
1180 if (m_isInitialized) {
1181 // this check is in here so that it only happens once per call to setCutLevel,
1182 // but will still warn if only the private version is called somehow.
1183 ATH_MSG_WARNING( "Trying to set cut level while the tool is already initialized." );
1184 ATH_MSG_WARNING( "This will almost certainly not exhibit intended behavior." );
1185 }
1186 if (overwrite) {
1187 // minimum cuts will default to -1, so if a user wishes to remove a cut
1188 // from a preset level they can do so by setting the minimum to zero.
1189 // maximum cuts can be removed from a preset level by setting them negative.
1190 m_minPt = -1.; // in MeV
1191 m_minP = -1.;
1208 m_minNPixelHits = -1;
1212 m_minNSctHits = -1;
1217 m_minNSiHits = -1;
1224 m_maxOneSharedModule = false;
1226 m_maxEtaForTrtHitCuts = -1.; // this is really a minimum eta above which cuts are not applied
1227 m_minNTrtHits = -1;
1235 m_minProb = -1.;
1240 m_minNUsedHitsdEdx = -1;
1242 m_minEProbabilityHT = -1.;
1243 m_eProbHTonlyForXe = false;
1244#ifndef XAOD_ANALYSIS
1245 m_minNSiHitsMod = -1;
1246 m_minNSiHitsModTop = -1;
1248#endif
1249 m_vecEtaCutoffsForSiHitsCut = std::vector<double>();
1250 m_vecMinNSiHitsAboveEta = std::vector<int>();
1251 m_vecEtaCutoffsForPtCut = std::vector<double>();
1252 m_vecMinPtAboveEta = std::vector<double>();
1253 m_vecPtCutoffsForSctHitsCut = std::vector<double>();
1254 m_vecMinNSctHitsAbovePt = std::vector<int>();
1255 m_vecEtaCutoffsForZ0SinThetaCut = std::vector<double>();
1256 m_vecPtCutoffsForZ0SinThetaCut = std::vector<double>();
1257 m_vecvecMaxZ0SinThetaAboveEtaPt = std::vector<std::vector<double>>();
1258 m_vecEtaCutoffsForD0Cut = std::vector<double>();
1259 m_vecPtCutoffsForD0Cut = std::vector<double>();
1260 m_vecvecMaxD0AboveEtaPt = std::vector<std::vector<double>>();
1261 m_vecEtaCutoffsForSctHolesCut = std::vector<double>();
1262 m_vecPtCutoffsForSctHolesCut = std::vector<double>();
1263 m_vecvecMaxSctHolesAboveEtaPt = std::vector<std::vector<double>>();
1264 m_vecEtaCutoffsForSctHitsPlusDeadCut = std::vector<double>();
1265 m_vecPtCutoffsForSctHitsPlusDeadCut = std::vector<double>();
1266 m_vecvecMinSctHitsPlusDeadAboveEtaPt = std::vector<std::vector<double>>();
1267 }
1268 break;
1269 case CutLevel::Loose :
1270 setCutLevelPrivate(CutLevel::NoCut, overwrite); // if hard overwrite, reset all cuts first. will do nothing if !overwrite
1271 // change the cuts if a hard overwrite is asked for or if the cuts are unset
1272 if (overwrite || m_maxAbsEta >= LOCAL_MAX_DOUBLE) m_maxAbsEta = 2.5;
1273 if (overwrite || m_minNSiHits < 0) m_minNSiHits = 8;
1274 m_maxOneSharedModule = true;
1275 if (overwrite || m_maxNSiHoles >= LOCAL_MAX_INT) m_maxNSiHoles = 2;
1276 if (overwrite || m_maxNPixelHoles >= LOCAL_MAX_INT) m_maxNPixelHoles = 1;
1277 break;
1278 case CutLevel::LoosePrimary :
1279 setCutLevelPrivate(CutLevel::NoCut, overwrite); // implement loose cuts first
1280 if (overwrite || m_maxAbsEta >= LOCAL_MAX_DOUBLE) m_maxAbsEta = 2.5;
1281 if (overwrite || m_minNSiHits < 0) m_minNSiHits = 8;
1282 m_maxOneSharedModule = true;
1283 if (overwrite || m_maxNSiHoles >= LOCAL_MAX_INT) m_maxNSiHoles = 2;
1284 if (overwrite || m_maxNPixelHoles >= LOCAL_MAX_INT) m_maxNPixelHoles = 1;
1285 if (overwrite || m_minNSiHitsIfSiSharedHits < 0) m_minNSiHitsIfSiSharedHits = 10;
1286 break;
1287 case CutLevel::TightPrimary :
1288 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1289 if (overwrite || m_maxAbsEta >= LOCAL_MAX_DOUBLE) m_maxAbsEta = 2.5;
1290 if (overwrite || m_minNSiHits < 0) m_minNSiHits = 9;
1291 m_maxOneSharedModule = true;
1292 if (overwrite || m_maxNSiHoles >= LOCAL_MAX_INT) m_maxNSiHoles = 2;
1293 if (overwrite || m_maxNPixelHoles >= LOCAL_MAX_INT) m_maxNPixelHoles = 0;
1295 if (overwrite || m_minNSiHitsAboveEtaCutoff < 0) m_minNSiHitsAboveEtaCutoff = 11;
1297 break;
1298 case CutLevel::LooseMuon :
1299 setCutLevelPrivate(CutLevel::NoCut, overwrite); // reset cuts unless we are doing a soft set
1300 if (overwrite || m_minNPixelHits < 0) m_minNPixelHits = 1;
1301 if (overwrite || m_minNSctHits < 0) m_minNSctHits = 5;
1302 if (overwrite || m_maxNSiHoles >= LOCAL_MAX_INT) m_maxNSiHoles = 2;
1304 if (overwrite || m_maxEtaForTrtHitCuts < 0.) m_maxEtaForTrtHitCuts = 1.9;
1305 if (overwrite || m_minNTrtHitsPlusOutliers < 0) m_minNTrtHitsPlusOutliers = 6;
1307 break;
1308 case CutLevel::LooseElectron :
1309 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1310 if (overwrite || m_minNSiHits < 0) m_minNSiHits = 7;
1311 if (overwrite || m_minNPixelHits < 0) m_minNPixelHits = 1;
1312 break;
1313 case CutLevel::LooseTau :
1314 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1315 if (overwrite || m_minPt < 0.0) m_minPt = 1000.0;
1316 if (overwrite || m_minNSiHits < 0) m_minNSiHits = 7;
1317 if (overwrite || m_minNPixelHits < 0) m_minNPixelHits = 2;
1318 if (overwrite || m_maxD0 >= LOCAL_MAX_DOUBLE) m_maxD0 = 1.0;
1319 if (overwrite || m_maxZ0 >= LOCAL_MAX_DOUBLE) m_maxZ0 = 1.5;
1320 break;
1321 case CutLevel::MinBias :
1322 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1323 if (overwrite || m_useMinBiasInnermostLayersCut >= 0) m_useMinBiasInnermostLayersCut = 1; // if this is less than 0, it is turned off
1324 if (overwrite || m_minNPixelHits < 0) m_minNPixelHits = 1;
1325 if (overwrite || m_minNSctHits < 0) m_minNSctHits = 6;
1326 if (overwrite || m_minProbAbovePtCutoff < 0.) {
1327 m_minPtForProbCut = 10000.;
1329 }
1330 if (overwrite || m_maxD0 >= LOCAL_MAX_DOUBLE) m_maxD0 = 1.5;
1331 if (overwrite || m_maxZ0SinTheta >= LOCAL_MAX_DOUBLE) m_maxZ0SinTheta = 1.5;
1332 if (overwrite || m_maxAbsEta >= LOCAL_MAX_DOUBLE) m_maxAbsEta = 2.5;
1333 if (overwrite || m_minPt < 0.) m_minPt = 500.0;
1334 break;
1335 case CutLevel::HILoose:
1336 // HILoose is similar to MinBias, but not identical
1337 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1338 if (overwrite || m_maxAbsEta >= LOCAL_MAX_DOUBLE) m_maxAbsEta = 2.5;
1340 if (overwrite || m_minNPixelHits < 0) m_minNPixelHits = 1;
1341 if (overwrite || (m_vecPtCutoffsForSctHitsCut.empty()
1342 && m_vecMinNSctHitsAbovePt.empty())) {
1343 m_vecPtCutoffsForSctHitsCut = std::vector<double>({0.0, 300.0, 400.0});
1344 m_vecMinNSctHitsAbovePt = std::vector<int>({2, 4, 6});
1345 }
1346 if (overwrite || m_maxD0 >= LOCAL_MAX_DOUBLE) m_maxD0 = 1.5;
1347 if (overwrite || m_maxZ0SinTheta >= LOCAL_MAX_DOUBLE) m_maxZ0SinTheta = 1.5;
1348 break;
1349 case CutLevel::HITight:
1350 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1351 // HITight is like HILoose but we require 8 SCT hits and 2 pixel hits
1352 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1353 if (overwrite || m_maxAbsEta >= LOCAL_MAX_DOUBLE) m_maxAbsEta = 2.5;
1355 if (overwrite || m_minNPixelHits < 0) m_minNPixelHits = 2;
1356 if (overwrite || (m_vecPtCutoffsForSctHitsCut.empty()
1357 && m_vecMinNSctHitsAbovePt.empty())) {
1358 m_vecPtCutoffsForSctHitsCut = std::vector<double>({0.0, 300.0, 400.0});
1359 m_vecMinNSctHitsAbovePt = std::vector<int>({4, 6, 8});
1360 }
1361 if (overwrite || m_maxD0 >= LOCAL_MAX_DOUBLE) m_maxD0 = 1.0;
1362 if (overwrite || m_maxZ0SinTheta >= LOCAL_MAX_DOUBLE) m_maxZ0SinTheta = 1.0;
1363 if (overwrite || m_maxChiSqperNdf >= LOCAL_MAX_DOUBLE) m_maxChiSqperNdf = 6.0;
1364 break;
1365 case CutLevel::HILooseOptimized:
1366 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1367 if (overwrite || m_maxAbsEta >= LOCAL_MAX_DOUBLE) m_maxAbsEta = 2.5;
1368 if (overwrite || m_maxNPixelHoles >= LOCAL_MAX_INT) m_maxNPixelHoles = 0;
1370 if (overwrite || (m_vecEtaCutoffsForZ0SinThetaCut.empty() &&
1373 m_vecEtaCutoffsForZ0SinThetaCut = std::vector<double>({0.0, 1.1, 1.6, 2.0});
1375 std::vector<double>({500, 600, 700, 800, 900, 1000, 1500,
1376 2000, 2500, 3000, 5000, 8000, 12000});
1378 std::vector<std::vector<double>>({{2.10, 2.15, 6.00, 5.00, 3.10, 2.00, 1.75, 1.60, 1.43, 1.40, 1.05, 0.65, 0.60},
1379 {1.44, 1.47, 1.50, 1.55, 1.62, 1.45, 1.45, 1.78, 1.73, 1.50, 1.20, 0.97, 0.53},
1380 {1.40, 1.45, 1.50, 1.46, 1.41, 1.37, 1.25, 1.50, 1.50, 1.36, 1.10, 0.85, 0.52},
1381 {1.51, 1.70, 1.70, 1.71, 1.71, 1.53, 1.54, 1.49, 1.36, 1.20, 0.95, 0.60, 0.55}});
1382 }
1383 if (overwrite || (m_vecEtaCutoffsForD0Cut.empty() &&
1384 m_vecPtCutoffsForD0Cut.empty() &&
1385 m_vecvecMaxD0AboveEtaPt.empty())){
1386 m_vecEtaCutoffsForD0Cut = std::vector<double>({0.0, 1.1, 1.6, 2.0});
1388 std::vector<double>({500, 600, 700, 800, 900, 1000, 1500,
1389 2000, 2500, 3000, 5000, 8000, 12000});
1391 std::vector<std::vector<double>>({{0.81, 0.90, 0.94, 0.92, 0.90, 0.75, 0.65, 0.63, 0.62, 0.60, 0.63, 0.50, 0.55},
1392 {1.00, 0.98, 0.98, 0.92, 0.90, 0.69, 0.67, 0.86, 0.88, 0.88, 0.88, 0.87, 1.06},
1393 {1.19, 1.15, 1.10, 1.08, 1.03, 0.94, 0.85, 0.97, 0.97, 0.96, 0.95, 0.92, 1.04},
1394 {1.33, 1.23, 1.21, 1.15, 1.15, 1.07, 0.94, 0.97, 0.97, 0.97, 0.98, 1.10, 1.10}});
1395 }
1396 break;
1397 case CutLevel::HITightOptimized:
1398 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1399 if (overwrite || m_maxAbsEta >= LOCAL_MAX_DOUBLE) m_maxAbsEta = 2.5;
1400 if (overwrite || m_maxNPixelHoles >= LOCAL_MAX_INT) m_maxNPixelHoles = 0;
1402 if (overwrite || (m_vecEtaCutoffsForZ0SinThetaCut.empty() &&
1405 m_vecEtaCutoffsForZ0SinThetaCut = std::vector<double>({0.0, 1.1, 1.6, 2.0});
1406 m_vecPtCutoffsForZ0SinThetaCut = std::vector<double>({500, 600, 700, 800, 900, 1000, 1500,
1407 2000, 2500, 3000, 5000, 8000, 12000});
1409 std::vector<std::vector<double>>({{0.62, 0.70, 0.82, 0.87, 0.74, 0.61, 0.50, 0.48, 0.46, 0.45, 0.30, 0.24, 0.23},
1410 {0.51, 0.53, 0.53, 0.53, 0.52, 0.43, 0.28, 0.27, 0.28, 0.30, 0.24, 0.22, 0.13},
1411 {0.91, 0.89, 0.87, 0.55, 0.59, 0.37, 0.39, 0.31, 0.34, 0.35, 0.30, 0.30, 0.20},
1412 {0.76, 0.71, 0.69, 0.48, 0.48, 0.47, 0.46, 0.42, 0.38, 0.32, 0.28, 0.20, 0.15}});
1413 }
1414 if (overwrite || (m_vecEtaCutoffsForD0Cut.empty() &&
1415 m_vecPtCutoffsForD0Cut.empty() &&
1416 m_vecvecMaxD0AboveEtaPt.empty())){
1417 m_vecEtaCutoffsForD0Cut = std::vector<double>({0.0, 1.1, 1.6, 2.0});
1418 m_vecPtCutoffsForD0Cut = std::vector<double>({500, 600, 700, 800, 900, 1000, 1500,
1419 2000, 2500, 3000, 5000, 8000, 12000});
1421 std::vector<std::vector<double>>({{0.34, 0.39, 0.47, 0.49, 0.55, 0.47, 0.44, 0.21, 0.19, 0.17, 0.12, 0.14, 0.15},
1422 {0.32, 0.32, 0.33, 0.33, 0.33, 0.27, 0.16, 0.15, 0.13, 0.15, 0.13, 0.16, 0.20},
1423 {0.95, 0.91, 0.88, 0.35, 0.37, 0.24, 0.26, 0.22, 0.23, 0.24, 0.19, 0.19, 0.23},
1424 {0.68, 0.67, 0.65, 0.42, 0.42, 0.36, 0.35, 0.31, 0.27, 0.26, 0.27, 0.28, 0.30}});
1425 }
1426 if (overwrite || (m_vecEtaCutoffsForSctHolesCut.empty() &&
1429 m_vecEtaCutoffsForSctHolesCut = std::vector<double>({0.0, 1.1, 1.6, 2.0});
1430 m_vecPtCutoffsForSctHolesCut = std::vector<double>({500, 600, 700, 800, 900, 1000, 1500,
1431 2000, 2500, 3000, 5000, 8000, 12000});
1433 std::vector<std::vector<double>>({{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1},
1434 {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
1435 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
1436 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}});
1437 }
1438 if (overwrite || (m_vecEtaCutoffsForSctHitsPlusDeadCut.empty() &&
1441 m_vecEtaCutoffsForSctHitsPlusDeadCut = std::vector<double>({0.0, 1.1, 1.6, 2.0});
1442 m_vecPtCutoffsForSctHitsPlusDeadCut = std::vector<double>({500, 600, 700, 800, 900, 1000, 1500,
1443 2000, 2500, 3000, 5000, 8000, 12000});
1445 std::vector<std::vector<double>>({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1446 {0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, 0},
1447 {8, 8, 8, 7, 7, 6, 6, 6, 6, 6, 0, 0, 0},
1448 {7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}});
1449 }
1450 break;
1451 case CutLevel::HILoosePixMod:
1452 // HILoosePixMod is similar to HILoose, but with a modified hit cut on the innermost layers
1453 setCutLevelPrivate(CutLevel::NoCut, overwrite);
1454 if (overwrite || m_maxAbsEta >= LOCAL_MAX_DOUBLE) m_maxAbsEta = 2.5;
1455 if (overwrite) m_useHILoosePixModInnermostLayersCut = true;
1456 if (overwrite || m_minNPixelHits < 0) m_minNPixelHits = 1;
1457 if (overwrite || m_vecPtCutoffsForSctHitsCut.empty()) m_vecPtCutoffsForSctHitsCut = std::vector<double>({0.0, 300.0, 400.0});
1458 if (overwrite || m_vecMinNSctHitsAbovePt.empty()) m_vecMinNSctHitsAbovePt = std::vector<int>({2, 4, 6});
1459 if (overwrite || m_maxD0 >= LOCAL_MAX_DOUBLE) m_maxD0 = 1.5;
1460 if (overwrite || m_maxZ0SinTheta >= LOCAL_MAX_DOUBLE) m_maxZ0SinTheta = 1.5;
1461 break;
1462 default:
1463 ATH_MSG_ERROR("CutLevel not recognized. Cut selection will remain unchanged.");
1464 break;
1465 }
1466}
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForSctHitsPlusDeadCut
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForSiHitsCut
Gaudi::Property< double > m_maxTrtHighEFraction
Gaudi::Property< int > m_minNSiHitsAboveEtaCutoff
Gaudi::Property< bool > m_eProbHTonlyForXe
Gaudi::Property< std::vector< std::vector< double > > > m_vecvecMaxSctHolesAboveEtaPt
Gaudi::Property< double > m_minEtaForStrictNSiHitsCut
Gaudi::Property< bool > m_useHILoosePixModInnermostLayersCut
Gaudi::Property< int > m_maxNSctDoubleHoles
Gaudi::Property< double > m_maxZ0SinThetaoverSigmaZ0SinTheta
Gaudi::Property< int > m_minNBothInnermostLayersHits
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForD0Cut
Gaudi::Property< double > m_maxZ0overSigmaZ0
Gaudi::Property< int > m_minNPixelHitsPhysical
Gaudi::Property< int > m_minNSiHitsPhysical
Gaudi::Property< double > m_minPtForProbCut
Gaudi::Property< std::vector< std::vector< double > > > m_vecvecMaxZ0SinThetaAboveEtaPt
Gaudi::Property< double > m_maxSigmaZ0SinTheta
Gaudi::Property< double > m_maxD0overSigmaD0
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForSctHitsPlusDeadCut
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForD0Cut
Gaudi::Property< int > m_minNSiHitsIfSiSharedHits
Gaudi::Property< double > m_maxSigmaD0
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForSctHitsCut
Gaudi::Property< int > m_minNInnermostLayerHits
Gaudi::Property< std::vector< std::vector< double > > > m_vecvecMinSctHitsPlusDeadAboveEtaPt
Gaudi::Property< double > m_minEProbabilityHT
Gaudi::Property< int > m_useMinBiasInnermostLayersCut
Gaudi::Property< double > m_maxEtaForTrtHitCuts
Gaudi::Property< int > m_minNSiHitsModBottom
Gaudi::Property< int > m_maxNInnermostLayerSharedHits
Gaudi::Property< bool > m_useEtaDependentMaxChiSq
Gaudi::Property< int > m_minNOverflowHitsdEdx
Gaudi::Property< double > m_maxAbsEta
Gaudi::Property< bool > m_maxOneSharedModule
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForPtCut
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForSctHolesCut
Gaudi::Property< int > m_minNSctHitsPhysical
Gaudi::Property< double > m_minProbAbovePtCutoff
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForSctHolesCut
Gaudi::Property< int > m_minNTrtHighThresholdHitsPlusOutliers
Gaudi::Property< double > m_maxChiSqperNdf
Gaudi::Property< double > m_maxTrtOutlierFraction
Gaudi::Property< int > m_minNNextToInnermostLayerHits
Gaudi::Property< int > m_maxNPixelSharedHits
Gaudi::Property< double > m_maxZ0SinTheta
Gaudi::Property< int > m_minNTrtHighThresholdHits
Gaudi::Property< std::vector< double > > m_vecMinPtAboveEta
Gaudi::Property< std::vector< int > > m_vecMinNSctHitsAbovePt
Gaudi::Property< std::vector< int > > m_vecMinNSiHitsAboveEta
Gaudi::Property< int > m_minNTrtHitsPlusOutliers
Gaudi::Property< double > m_maxTrtEtaAcceptance
Gaudi::Property< std::vector< double > > m_vecPtCutoffsForZ0SinThetaCut
Gaudi::Property< double > m_maxTrtHighEFractionWithOutliers
Gaudi::Property< double > m_maxSigmaZ0
Gaudi::Property< std::vector< std::vector< double > > > m_vecvecMaxD0AboveEtaPt
Gaudi::Property< std::vector< double > > m_vecEtaCutoffsForZ0SinThetaCut

◆ setupCuts()

template<int VERBOSE, class Trk_Helper>
StatusCode InDet::InDetTrackSelectionTool::setupCuts ( std::map< std::string, std::vector< std::function< bool(Trk_Helper helper, const asg::AsgMessaging &msgHelper)> > > & trackCuts)
private

Definition at line 180 of file InDetTrackSelectionTool.cxx.

180 {
181 // track parameter cuts
182 if (m_minPt > 0.) {
183 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum Pt: " << m_minPt << " MeV" );
184 trackCuts["Pt"].push_back( [minPt = m_minPt](Trk_Helper helper, const asg::AsgMessaging &msgHelper) -> bool { return helper.pt(msgHelper) >= minPt; } );
185 }
187 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum |Eta|: " << m_maxAbsEta );
188 trackCuts["Eta"].push_back( [maxAbsEta = m_maxAbsEta](Trk_Helper helper, const asg::AsgMessaging &msgHelper) { return std::abs(helper.eta(msgHelper)) <= maxAbsEta; } );
189 }
190 if (m_minP > 0.) {
191 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum P: " << m_minP << " MeV" );
192 trackCuts["P"].push_back( [maxInvP = 1./m_minP](Trk_Helper helper, const asg::AsgMessaging &msgHelper) { return std::abs(helper.qOverP(msgHelper)) <= maxInvP; } );
193 }
194 if (maxDoubleIsSet(m_maxD0)) {
195 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum d0: " << m_maxD0 << " mm" );
196 trackCuts["D0"].push_back( [maxD0 = m_maxD0](Trk_Helper helper, const asg::AsgMessaging &msgHelper) { return std::abs(helper.d0(msgHelper)) <= maxD0; } );
197 }
198 if (maxDoubleIsSet(m_maxZ0)) {
199 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum z0: " << m_maxZ0 << " mm");
200 trackCuts["Z0"].push_back( [maxZ0 = m_maxZ0](Trk_Helper helper, const asg::AsgMessaging &msgHelper) { return std::abs(helper.z0(msgHelper)) <= maxZ0; } );
201 }
203 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum z0*sin(theta): " << m_maxZ0SinTheta << " mm" );
204 trackCuts["Z0SinTheta"].push_back([maxZ0SinTheta = m_maxZ0SinTheta](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
205 return std::abs( helper.z0(msgHelper) * std::sin(helper.theta(msgHelper))) <= maxZ0SinTheta;
206 });
207 }
209 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum uncertainty on d0: " << m_maxSigmaD0 << " mm" );
210 trackCuts["D0"].push_back([maxSigmaD0Squared = sqr(m_maxSigmaD0.value())](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
211 return getDefiningParametersCov(helper,msgHelper, InDetAccessor::d0,InDetAccessor::d0) <= maxSigmaD0Squared;
212 });
213 }
215 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum uncertainty on z0: " << m_maxSigmaZ0 << " mm" );
216 trackCuts["Z0"].push_back([maxSigmaZ0Squared = sqr(m_maxSigmaZ0.value())](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
217 return getDefiningParametersCov(helper,msgHelper, InDetAccessor::z0,InDetAccessor::z0) <= maxSigmaZ0Squared;
218 });
219 }
221 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum uncertainty on z0*sin(theta): "
222 << m_maxSigmaZ0SinTheta << " mm" );
223 trackCuts["Z0SinTheta"].push_back([maxSigmaZ0SinThetaSquared = sqr(m_maxSigmaZ0SinTheta.value())](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
224 double theta = helper.theta(msgHelper);
225 double sinTheta = std::sin(theta);
226 double cosTheta = std::cos(theta);
227 double z0 = helper.z0(msgHelper);
228
229 return ( sqr(z0)*sqr(cosTheta) * getDefiningParametersCov(helper,msgHelper, InDetAccessor::theta,InDetAccessor::theta)
230 + 2*z0 *sinTheta*cosTheta * getDefiningParametersCov(helper,msgHelper, InDetAccessor::theta,InDetAccessor::z0)
231 + sqr(sinTheta) * getDefiningParametersCov(helper,msgHelper, InDetAccessor::z0, InDetAccessor::z0) ) <= maxSigmaZ0SinThetaSquared;
232 });
233 }
235 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum significance on d0: " << m_maxD0overSigmaD0 );
236 trackCuts["D0"].push_back([maxD0overSigmaD0Squared = sqr(m_maxD0overSigmaD0.value())](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
237 return sqr(helper.d0(msgHelper)) <= maxD0overSigmaD0Squared * getDefiningParametersCov(helper,msgHelper, InDetAccessor::d0,InDetAccessor::d0);
238 });
239 }
241 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum significance on z0: " << m_maxZ0overSigmaZ0 );
242 trackCuts["Z0"].push_back([maxZ0overSigmaZ0Squared = sqr(m_maxZ0overSigmaZ0.value())](Trk_Helper helper, const asg::AsgMessaging &msgHelper) -> bool {
243 return sqr(helper.z0(msgHelper)) <= maxZ0overSigmaZ0Squared * getDefiningParametersCov(helper,msgHelper, InDetAccessor::z0,InDetAccessor::z0);
244 });
245 }
247 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum significance on z0*sin(theta): "
249 trackCuts["Z0SinTheta"].push_back([maxZ0SinThetaoverSigmaZ0SinThetaSquared = sqr(m_maxZ0SinThetaoverSigmaZ0SinTheta.value())](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
250
251 double theta = helper.theta(msgHelper);
252 double sinTheta = std::sin(theta);
253 double cosTheta = std::cos(theta);
254 double z0 = helper.z0(msgHelper);
255
256 return sqr(z0*sinTheta) <=
257 maxZ0SinThetaoverSigmaZ0SinThetaSquared * ( sqr(z0)*sqr(cosTheta) * getDefiningParametersCov(helper,msgHelper, InDetAccessor::theta,InDetAccessor::theta)
258 + 2*z0 *sinTheta*cosTheta * getDefiningParametersCov(helper,msgHelper, InDetAccessor::theta,InDetAccessor::z0)
259 + sqr(sinTheta) * getDefiningParametersCov(helper,msgHelper, InDetAccessor::z0, InDetAccessor::z0));
260 });
261 }
262
263 // hit cuts
264 if (m_minNInnermostLayerHits > 0) {
265 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum hits from innermost pixel layer: " << m_minNInnermostLayerHits );
266 if constexpr(VERBOSE>0) ATH_MSG_INFO( " (Track will pass if no hit is expected.)" );
267 trackCuts["InnermostLayersHits"].push_back([minNInnermostLayerHits = m_minNInnermostLayerHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
268 return ( getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerHits) >= minNInnermostLayerHits
269 || getSummary(helper, msgHelper, xAOD::expectInnermostPixelLayerHit) == 0);
270 });
271 }
273 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum hits from next to innermost pixel layer: " << m_minNNextToInnermostLayerHits );
274 if constexpr(VERBOSE>0) ATH_MSG_INFO( " (Track will pass if no hit is expected.)" );
275 trackCuts["InnermostLayersHits"].push_back([minNNextToInnermostLayerHits = m_minNNextToInnermostLayerHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
276 return ( getSummary(helper, msgHelper, xAOD::numberOfNextToInnermostPixelLayerHits) >= minNNextToInnermostLayerHits
277 || getSummary(helper, msgHelper, xAOD::expectNextToInnermostPixelLayerHit) == 0);
278 });
279 }
281 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum hits from both innermost pixel layers: " << m_minNBothInnermostLayersHits );
282 if constexpr(VERBOSE>0) ATH_MSG_INFO( " (If a layer has no hits but one is not expected, the" );
283 if constexpr(VERBOSE>0) ATH_MSG_INFO( " number of hits in that layer will be taken to be 1.)" );
285 ATH_MSG_WARNING( "A value of minNBothInnermostLayersHits above 2 does not make sense." );
286 ATH_MSG_WARNING( " Use 1 for \"or\" or 2 for \"and\"." );
287 }
288 trackCuts["InnermostLayersHits"].push_back([minNBothInnermostLayersHits = m_minNBothInnermostLayersHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
289 return ( std::max( getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerHits),
290 static_cast<uint8_t>( !getSummary(helper, msgHelper, xAOD::expectInnermostPixelLayerHit) ))
291 +std::max( getSummary(helper, msgHelper, xAOD::numberOfNextToInnermostPixelLayerHits),
292 static_cast<uint8_t>( !getSummary(helper, msgHelper, xAOD::expectNextToInnermostPixelLayerHit )))
293 >= minNBothInnermostLayersHits);
294 });
295 }
296 if (m_useMinBiasInnermostLayersCut > 0 ) { // less than zero indicates this cut is manually turned off
297 if constexpr(VERBOSE>0) ATH_MSG_INFO( " An innermost layer hit is required if expected, otherwise" );
298 if constexpr(VERBOSE>0) ATH_MSG_INFO( " a next-to-innermost layer hit is required if it is expected." );
299 trackCuts["InnermostLayersHits"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
300 uint8_t expected_innermost_pixel_layer_hit = getSummary(helper, msgHelper, xAOD::expectInnermostPixelLayerHit);
301 return (expected_innermost_pixel_layer_hit > 0 && getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerHits)>=1)
302 || (expected_innermost_pixel_layer_hit == 0 && ( getSummary(helper, msgHelper, xAOD::expectNextToInnermostPixelLayerHit)==0
304 });
305 }
307 if constexpr(VERBOSE>0) ATH_MSG_INFO( " An innermost layer hit or next-to-innermost layer hit is required. If there are" );
308 if constexpr(VERBOSE>0) ATH_MSG_INFO( " no innermost layer or next-to-innermost layer hits, then zero expected" );
309 if constexpr(VERBOSE>0) ATH_MSG_INFO( " next-to-innermost layer hits is required." );
310 trackCuts["InnermostLayersHits"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
311 return (getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerHits)>=1)
313 || (getSummary(helper, msgHelper, xAOD::expectNextToInnermostPixelLayerHit)==0);
314 });
315 }
317 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum shared hits in innermost pixel layer: " << m_maxNInnermostLayerSharedHits );
318 trackCuts["InnermostLayersHits"].push_back([maxNInnermostLayerSharedHits = m_maxNInnermostLayerSharedHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
319 return getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerSharedHits) <= maxNInnermostLayerSharedHits;
320 });
321 }
322 if (m_minNPixelHits > 0) {
323 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum pixel hits: " << m_minNPixelHits );
324 trackCuts["PixelHits"].push_back( [minNPixelHits = m_minNPixelHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
325 return getSummarySum<2,Trk_Helper>(helper, msgHelper, {xAOD::numberOfPixelHits,xAOD::numberOfPixelDeadSensors}) >= minNPixelHits;
326 });
327 }
328 if (m_minNPixelHitsPhysical > 0) {
329 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum physical pixel hits (i.e. dead sensors do not count): "
331 trackCuts["PixelHits"].push_back([minNPixelHitsPhysical = m_minNPixelHitsPhysical](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
332 return getSummary(helper, msgHelper, xAOD::numberOfPixelHits) >= minNPixelHitsPhysical;
333 });
334 }
336 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum pixel holes: " << m_maxNPixelHoles );
337 trackCuts["PixelHits"].push_back([maxNPixelHoles = m_maxNPixelHoles](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
338 return getSummary(helper, msgHelper, xAOD::numberOfPixelHoles) <= maxNPixelHoles;
339 });
340 }
342 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum pixel shared hits: " << m_maxNPixelSharedHits );
343 trackCuts["PixelHits"].push_back([maxNPixelSharedHits = m_maxNPixelSharedHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
344 return getSummary(helper, msgHelper, xAOD::numberOfPixelSharedHits) <= maxNPixelSharedHits;
345 });
346 }
347 if (m_minNSctHits > 0) {
348 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum SCT hits: " << m_minNSctHits );
349 trackCuts["SctHits"].push_back( [minNSctHits = m_minNSctHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
350 return getSummarySum<2,Trk_Helper>(helper, msgHelper, {xAOD::numberOfSCTHits, xAOD::numberOfSCTDeadSensors}) >= minNSctHits;
351 });
352 }
353 if (m_minNSctHitsPhysical > 0) {
354 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum physical SCT hits (i.e. dead sensors do not count): "
356 trackCuts["SctHits"].push_back([minNSctHitsPhysical = m_minNSctHitsPhysical](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
357 return getSummary(helper, msgHelper, xAOD::numberOfSCTHits) >= minNSctHitsPhysical;
358 });
359 }
361 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum SCT holes: " << m_maxNSctHoles );
362 trackCuts["SctHits"].push_back([maxNSctHoles = m_maxNSctHoles](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
363 return getSummary(helper, msgHelper, xAOD::numberOfSCTHoles) <= maxNSctHoles;
364 });
365 }
367 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum SCT shared hits: " << m_maxNSctSharedHits );
368 trackCuts["SctHits"].push_back([maxNSctSharedHits = m_maxNSctSharedHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
369 return getSummary(helper, msgHelper, xAOD::numberOfSCTSharedHits) <= maxNSctSharedHits;
370 });
371 }
373 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum SCT double holes: " << m_maxNSctDoubleHoles );
374 trackCuts["SctHits"].push_back([maxNSctDoubleHoles = m_maxNSctDoubleHoles](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
375 return getSummary(helper, msgHelper, xAOD::numberOfSCTDoubleHoles) <= maxNSctDoubleHoles ;
376 });
377 }
378 if (m_minNSiHits > 0) {
379 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum silicon (pixel + SCT) hits: " << m_minNSiHits );
380 trackCuts["SiHits"].push_back([minNSiHits = m_minNSiHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
381 return getSummarySum<4,Trk_Helper>(helper, msgHelper, {xAOD::numberOfPixelHits,
384 xAOD::numberOfSCTDeadSensors} ) >= minNSiHits ;
385 });
386 }
387 if (m_minNSiHitsPhysical > 0) {
388 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum physical silicon hits (i.e. dead sensors do not count): "
390 trackCuts["SiHits"].push_back([minNSiHitsPhysical = m_minNSiHitsPhysical](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
391 return getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHits, xAOD::numberOfSCTHits} ) >= minNSiHitsPhysical ;
392 });
393 }
395 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum silicon holes: " << m_maxNSiHoles );
396 trackCuts["SiHits"].push_back([maxNSiHoles = m_maxNSiHoles](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
397 return getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHoles, xAOD::numberOfSCTHoles} ) <= maxNSiHoles ;
398 });
399 }
401 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum silicon shared hits: " << m_maxNSiSharedHits );
402 trackCuts["SiHits"].push_back([maxNSiSharedHits = m_maxNSiSharedHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
403 return getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelSharedHits, xAOD::numberOfSCTSharedHits} ) <= maxNSiSharedHits ;
404 });
405 }
407 if constexpr(VERBOSE>0) ATH_MSG_INFO( " No more than one shared module:" );
408 if constexpr(VERBOSE>0) ATH_MSG_INFO( " i.e. max 1 shared pixel hit or" );
409 if constexpr(VERBOSE>0) ATH_MSG_INFO( " 2 shared SCT hits, and not both." );
410 trackCuts["SiHits"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
411 return getSummary(helper, msgHelper,xAOD::numberOfPixelSharedHits )
412 + getSummary(helper, msgHelper,xAOD::numberOfSCTSharedHits )/2 <= 1 ;
413 });
414 }
416 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum silicon hits if the track has shared hits: "
418 trackCuts["SiHits"].push_back([minNSiHitsIfSiSharedHits = m_minNSiHitsIfSiSharedHits](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
423 xAOD::numberOfSCTDeadSensors}) >=minNSiHitsIfSiSharedHits;
424 });
425 }
428 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Require " << m_minNSiHitsAboveEtaCutoff
429 << " silicon hits above eta = " << m_minEtaForStrictNSiHitsCut );
430 trackCuts["SiHits"].push_back([minEtaForStrictNSiHitsCut = m_minEtaForStrictNSiHitsCut,
431 minNSiHitsAboveEtaCutoff = m_minNSiHitsAboveEtaCutoff](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
432 return std::abs(helper.eta(msgHelper)) <= minEtaForStrictNSiHitsCut
436 xAOD::numberOfSCTDeadSensors}) >= minNSiHitsAboveEtaCutoff;
437 });
438 }
440 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Zero pixel holes allowed, except one pix hole is allowed if there is a physical IBL hit and a BLayer hit is expected but there is no BLayer hit." );
441 trackCuts["PixHits"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
442 uint8_t pixel_holes = getSummary(helper, msgHelper,xAOD::numberOfPixelHoles);
443 return pixel_holes == 0 || ( pixel_holes<=1 && getSummary(helper, msgHelper,xAOD::numberOfInnermostPixelLayerHits) >= 1
445 && getSummary(helper, msgHelper,xAOD::numberOfNextToInnermostPixelLayerHits) == 0 );
446 });
447 }
448#ifndef XAOD_ANALYSIS
449 if (m_minNSiHitsMod > 0) {
450 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum modified Si hits (2*pix + sct) (does not include dead sensors)= "
451 << m_minNSiHitsMod );
452 trackCuts["SiHits"].push_back([minNSiHitsMod = m_minNSiHitsMod](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
454 xAOD::numberOfPixelHits, // pixel hits count twice in this definition
455 xAOD::numberOfSCTHits}) >= minNSiHitsMod;
456 });
457 }
459 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum modified Si hits in top half = "
461 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum modified Si hits in bottom half = "
463 trackCuts["SiHits"].push_back([minNSiHitsModTop = m_minNSiHitsModTop,
464 minNSiHitsModBottom = m_minNSiHitsModBottom](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
465 auto [top,bottom] = getSiHitsTopBottom(helper, msgHelper);
466 return top >= minNSiHitsModTop && bottom >= minNSiHitsModBottom;
467 });
468 }
469#endif
471 if constexpr(VERBOSE>0) ATH_MSG_INFO( " -- TRT hit cuts applied above eta = " << m_maxTrtEtaAcceptance
472 << " and below eta = " << m_maxEtaForTrtHitCuts << " --" );
473 if (m_minNTrtHits > 0) {
474 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum TRT hits outside eta acceptance: " << m_minNTrtHits );
475 trackCuts["TrtHits"].push_back( MinTRTHitsCut<Trk_Helper,1>( m_maxTrtEtaAcceptance, m_maxEtaForTrtHitCuts, m_minNTrtHits,
477 }
479 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum TRT hits outside eta acceptance including outliers: " << m_minNTrtHitsPlusOutliers );
480 trackCuts["TrtHits"].push_back( MinTRTHitsCut<Trk_Helper,2>( m_maxTrtEtaAcceptance,m_maxEtaForTrtHitCuts, m_minNTrtHitsPlusOutliers,
482 }
484 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum TRT hits outside eta acceptance above high energy threshold: "
486 trackCuts["TrtHits"].push_back( MinTRTHitsCut<Trk_Helper,1>( m_maxTrtEtaAcceptance,m_maxEtaForTrtHitCuts, m_minNTrtHighThresholdHits,
488 }
490 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum TRT hits outside eta acceptance above high energy threshold including outliers: "
492 trackCuts["TrtHits"].push_back( MinTRTHitsCut<Trk_Helper,2>( m_maxTrtEtaAcceptance,m_maxEtaForTrtHitCuts, m_minNTrtHighThresholdHitsPlusOutliers,
494 }
495 if (maxDoubleIsSet(m_maxTrtHighEFraction)) { // I think this condition could be instead that it is between 0 and 1
496 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum ratio of high threshold to regular TRT hits outside eta acceptance: "
498 trackCuts["TrtHits"].push_back([maxTrtEtaAcceptance = m_maxTrtEtaAcceptance,
499 maxEtaForTrtHitCuts = m_maxEtaForTrtHitCuts,
500 maxTrtHighEFraction = m_maxTrtHighEFraction](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
501 double absEta = std::abs( helper.eta( msgHelper) );
502 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
504 <= maxTrtHighEFraction * getSummary(helper, msgHelper,xAOD::numberOfTRTHits );
505 });
506 }
508 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum ratio of high threshold to regular TRT hits above eta acceptance including outliers: "
510 trackCuts["TrtHits"].push_back([maxTrtEtaAcceptance = m_maxTrtEtaAcceptance,
511 maxEtaForTrtHitCuts = m_maxEtaForTrtHitCuts,
512 maxTrtHighEFractionWithOutliers = m_maxTrtHighEFractionWithOutliers](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
513 double absEta = std::abs( helper.eta( msgHelper) );
514 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
516 <= maxTrtHighEFractionWithOutliers * ( getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfTRTHits, xAOD::numberOfTRTOutliers} ));
517 });
518 }
520 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum fraction of TRT hits that are outliers: " << m_maxTrtOutlierFraction );
521 trackCuts["TrtHits"].push_back([maxTrtEtaAcceptance = m_maxTrtEtaAcceptance,
522 maxEtaForTrtHitCuts = m_maxEtaForTrtHitCuts,
523 maxTrtOutlierFraction = m_maxTrtOutlierFraction](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
524 double absEta = std::abs( helper.eta( msgHelper) );
525 uint8_t trt_outliers = getSummary(helper, msgHelper,xAOD::numberOfTRTOutliers );
526 return ( absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
527 || trt_outliers <= maxTrtOutlierFraction * ( trt_outliers + getSummary(helper, msgHelper,xAOD::numberOfTRTHits) );
528 });
529 }
530 }
531
532 // fit quality cuts
534 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Using pre-defined eta-dependent maximum chi squared (no longer recommended)." );
535 trackCuts["FitQuality"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
536 double eta = helper.eta(msgHelper);
537 double fit_chi_square = getFitChiSquare(helper,msgHelper);
538 double fit_ndof = getFitNDoF(helper,msgHelper);
539 if (std::abs( eta) < 1.9) {
540 return fit_chi_square <= fit_ndof * ( 4.4 + 0.32*sqr(eta) );
541 }
542 else {
543 return fit_chi_square <= fit_ndof * ( 26.9 - 19.6978*std::abs(eta) + 4.4534*sqr(eta) );
544 }
545 });
546 }
548 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum chi squared: " << m_maxChiSq );
549 trackCuts["FitQuality"].push_back([maxChiSq = m_maxChiSq](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
550 return getFitChiSquare(helper,msgHelper) <= maxChiSq;
551 });
552 }
554 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Maximum chi squared per degree of freedom: " << m_maxChiSqperNdf );
555 trackCuts["FitQuality"].push_back([maxChiSqperNdf = m_maxChiSqperNdf](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
556 return getFitChiSquare(helper,msgHelper) <= maxChiSqperNdf * getFitNDoF(helper,msgHelper);
557 });
558 }
559 if (m_minProb > 0.) {
560 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum chi squared probability: " << m_minProb );
561 trackCuts["FitQuality"].push_back([minProb = m_minProb](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
562 return TMath::Prob( getFitChiSquare(helper,msgHelper),getFitNDoF(helper,msgHelper)) >= minProb;
563 });
564 }
566 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum chi-sq probability of " << m_minProbAbovePtCutoff
567 << " above pt of " << m_minPtForProbCut*1e-3 << " GeV." );
568 trackCuts["FitQuality"].push_back([minPtForProbCut = m_minPtForProbCut,
569 minProbAbovePtCutoff = m_minProbAbovePtCutoff](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
570 return helper.pt(msgHelper) <= minPtForProbCut
571 || TMath::Prob( getFitChiSquare(helper,msgHelper),getFitNDoF(helper,msgHelper)) >= minProbAbovePtCutoff;
572 });
573 }
574
575 // dE/dx cuts
576 if (m_minNUsedHitsdEdx > 0) {
577 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum used hits for dEdx: " << m_minNUsedHitsdEdx );
578 trackCuts["dEdxHits"].push_back([minNUsedHitsdEdx = m_minNUsedHitsdEdx](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
579 return getNumberOfUsedHitsdEdx(helper,msgHelper) >= minNUsedHitsdEdx;
580 });
581 }
582 if (m_minNOverflowHitsdEdx > 0) {
583 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum IBL overflow hits for dEdx: " << m_minNOverflowHitsdEdx );
584 trackCuts["dEdxHits"].push_back([minNOverflowHitsdEdx = m_minNOverflowHitsdEdx](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
585 return getNumberOfIBLOverflowsdEdx(helper,msgHelper) >= minNOverflowHitsdEdx;
586 });
587 }
588 if (m_minEProbabilityHT > 0) {
589 if constexpr(VERBOSE>0) ATH_MSG_INFO( " Minimum high threshold electron probability: " << m_minEProbabilityHT );
590 if (m_eProbHTonlyForXe) {
591 if constexpr(VERBOSE>0) ATH_MSG_INFO( " (only applied on tracks where all TRT hits are Xenon)" );
592 trackCuts["eProbHT"].push_back([minEProbabilityHT = m_minEProbabilityHT](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
594 > getSummary(helper, msgHelper, xAOD::numberOfTRTXenonHits)
595 || getEProbabilityHT(helper,msgHelper) >= minEProbabilityHT;
596 });
597 } else {
598 trackCuts["eProbHT"].push_back([minEProbabilityHT = m_minEProbabilityHT](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
599 return getEProbabilityHT(helper,msgHelper) >= minEProbabilityHT;
600 });
601 }
602 }
603
604 if (!m_vecEtaCutoffsForSiHitsCut.empty() || !m_vecMinNSiHitsAboveEta.empty()) {
605 auto cutSize = m_vecEtaCutoffsForSiHitsCut.size();
606 if (cutSize != m_vecMinNSiHitsAboveEta.size()) {
607 ATH_MSG_ERROR( "Eta cutoffs and Silicon hit cuts must be vectors of the same length." );
608 return StatusCode::FAILURE;
609 }
610 if constexpr(VERBOSE>0) {
611 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
613 << " < eta < " << m_vecEtaCutoffsForSiHitsCut[i_cut+1]
614 << " ,Silicon hits >= " << m_vecMinNSiHitsAboveEta[i_cut] );
615 }
616 }
618 ATH_MSG_ERROR( "Eta values not in ascending order." );
619 return StatusCode::FAILURE;
620 }
621 if constexpr(VERBOSE>0) ATH_MSG_INFO( " for eta > " << m_vecEtaCutoffsForSiHitsCut[cutSize-1]
622 << " ,Silicon hits >= " << m_vecMinNSiHitsAboveEta[cutSize-1] );
623
624 trackCuts["SiHits"].push_back([p_vecEtaCutoffsForSiHitsCut = &std::as_const(m_vecEtaCutoffsForSiHitsCut.value()),
625 p_vecMinNSiHitsAboveEta = &std::as_const(m_vecMinNSiHitsAboveEta.value())](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
626 double abs_eta = std::abs(helper.eta(msgHelper));
627 unsigned int bin_i = findBin(*p_vecEtaCutoffsForSiHitsCut, abs_eta);
628 return bin_i >= p_vecMinNSiHitsAboveEta->size()
629 || abs_eta>5.0
630 || getSummarySum<4,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHits,
631 xAOD::numberOfSCTHits,
632 xAOD::numberOfPixelDeadSensors,
633 xAOD::numberOfSCTDeadSensors}) >= (*p_vecMinNSiHitsAboveEta)[bin_i];
634 });
635 }
636
637 if (!m_vecEtaCutoffsForPtCut.empty() || !m_vecMinPtAboveEta.empty()) {
638 auto cutSize = m_vecEtaCutoffsForPtCut.size();
639 if (cutSize != m_vecMinPtAboveEta.size()) {
640 ATH_MSG_ERROR( "Eta cutoffs and pT cuts must be vectors of the same length." );
641 return StatusCode::FAILURE;
642 }
643 if constexpr(VERBOSE>0) {
644 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
645 ATH_MSG_INFO( " for " << m_vecEtaCutoffsForPtCut[i_cut]
646 << " < eta < " << m_vecEtaCutoffsForPtCut[i_cut+1]
647 << " ,transverse momentum >= " << m_vecMinPtAboveEta[i_cut] );
648 }
649 }
650 if (!checkOrder(m_vecEtaCutoffsForPtCut.value())) {
651 ATH_MSG_ERROR( "Eta values not in ascending order." );
652 return StatusCode::FAILURE;
653 }
654 if constexpr(VERBOSE>0) ATH_MSG_INFO( " for eta > " << m_vecEtaCutoffsForPtCut[cutSize-1]
655 << " ,transverse momentum >= " << m_vecMinPtAboveEta[cutSize-1] );
656 trackCuts["Pt"].push_back([p_vecEtaCutoffsForPtCut = &std::as_const(m_vecEtaCutoffsForPtCut.value()),
657 p_vecMinPtAboveEta = &std::as_const(m_vecMinPtAboveEta.value())](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
658 double abs_eta = std::abs(helper.eta(msgHelper));
659 unsigned int bin_i = findBin(*p_vecEtaCutoffsForPtCut, abs_eta);
660 return bin_i >= p_vecMinPtAboveEta->size() || abs_eta > 5.0 || helper.pt(msgHelper) >= (*p_vecMinPtAboveEta)[bin_i];
661 });
662 }
663
664 if (!m_vecPtCutoffsForSctHitsCut.empty() || !m_vecMinNSctHitsAbovePt.empty()) {
665 auto cutSize = m_vecPtCutoffsForSctHitsCut.size();
666 if (cutSize != m_vecMinNSctHitsAbovePt.size()) {
667 ATH_MSG_ERROR( "Pt cutoffs and SCT hit cuts must be vectors of the same length." );
668 return StatusCode::FAILURE;
669 }
670 if constexpr(VERBOSE>0) {
671 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
673 << " < pt < " << m_vecPtCutoffsForSctHitsCut[i_cut+1]
674 << " MeV,\tSCT hits >= " << m_vecMinNSctHitsAbovePt[i_cut] );
675 }
676 }
678 ATH_MSG_ERROR( "Pt values not in ascending order." );
679 return StatusCode::FAILURE;
680 }
681 if constexpr(VERBOSE>0) ATH_MSG_INFO( " for pt > " << m_vecPtCutoffsForSctHitsCut[cutSize-1]
682 << " MeV,\t\tSCT hits >= " << m_vecMinNSctHitsAbovePt[cutSize-1] );
683 trackCuts["SctHits"].push_back([p_vecPtCutoffsForSctHitsCut = &std::as_const(m_vecPtCutoffsForSctHitsCut.value()),
684 p_vecMinNSctHitsAbovePt = &std::as_const(m_vecMinNSctHitsAbovePt.value())](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
685 double pt = helper.pt(msgHelper);
686 unsigned int bin_i = findBin(*p_vecPtCutoffsForSctHitsCut, pt);
687 return bin_i >= p_vecPtCutoffsForSctHitsCut->size()
688 || getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfSCTHits,
689 xAOD::numberOfSCTDeadSensors}) >= (*p_vecMinNSctHitsAbovePt)[bin_i];
690 });
691 }
692
693 if (!m_vecPtCutoffsForZ0SinThetaCut.empty() ||
696 auto etaSize = m_vecEtaCutoffsForZ0SinThetaCut.size();
697 auto ptSize = m_vecPtCutoffsForZ0SinThetaCut.size();
698 if (etaSize != m_vecvecMaxZ0SinThetaAboveEtaPt.size()) {
699 ATH_MSG_ERROR( "Eta cutoffs and Z0SinTheta cuts must be vectors of the same length." );
700 return StatusCode::FAILURE;
701 }
702 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
703 if (ptSize != m_vecvecMaxZ0SinThetaAboveEtaPt[i_size].size()) {
704 ATH_MSG_ERROR( "Pt cutoffs and Z0SinTheta cuts must be vectors of the same length." );
705 return StatusCode::FAILURE;
706 }
707 }
708
709 std::stringstream pTRangeBuffer;
710 std::copy(m_vecPtCutoffsForZ0SinThetaCut.begin(), m_vecPtCutoffsForZ0SinThetaCut.end(), std::ostream_iterator<double>(pTRangeBuffer, ", "));
711 std::string pTString=pTRangeBuffer.str();
712 if constexpr(VERBOSE>0) ATH_MSG_INFO("Z0SinTheta cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<"MeV, respectively:");
713 for (size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
714 {
715 std::stringstream etaRangeBuffer;
716 etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForZ0SinThetaCut[i_cut_eta] << " < |#eta| < ";
717 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForZ0SinThetaCut[i_cut_eta+1];
718 else etaRangeBuffer << std::setprecision(2) << std::fixed <<m_maxAbsEta;
719
720 std::stringstream cutBuffer;
721 std::copy(m_vecvecMaxZ0SinThetaAboveEtaPt[i_cut_eta].begin(), m_vecvecMaxZ0SinThetaAboveEtaPt[i_cut_eta].end(), std::ostream_iterator<double>(cutBuffer, ", "));
722 std::string cutString=cutBuffer.str();
723
724 if constexpr(VERBOSE>0) ATH_MSG_INFO(" for "<<etaRangeBuffer.str()<<": "<<cutString.substr(0, cutString.size()-2));
725 }
726
728 ATH_MSG_ERROR( "Eta values not in ascending order." );
729 return StatusCode::FAILURE;
730 }
732 ATH_MSG_ERROR( "Pt values not in ascending order." );
733 return StatusCode::FAILURE;
734 }
735
736 trackCuts["Z0SinTheta"].push_back([p_vecEtaCutoffsForZ0SinThetaCut = &std::as_const(m_vecEtaCutoffsForZ0SinThetaCut.value()),
737 p_vecPtCutoffsForZ0SinThetaCut = &std::as_const(m_vecPtCutoffsForZ0SinThetaCut.value()),
738 p_vecvecMaxZ0SinThetaAboveEtaPt = &std::as_const(m_vecvecMaxZ0SinThetaAboveEtaPt.value())] (Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
739 double eta = helper.eta(msgHelper);
740 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForZ0SinThetaCut, std::fabs(eta));
741 double pt = helper.pt(msgHelper);
742 unsigned int bin_pt = findBin(*p_vecPtCutoffsForZ0SinThetaCut, pt);
743 return bin_eta >= p_vecEtaCutoffsForZ0SinThetaCut->size()
744 || bin_pt >= p_vecPtCutoffsForZ0SinThetaCut->size()
745 || std::fabs(helper.z0(msgHelper) * std::sin(helper.theta(msgHelper))) <= (*p_vecvecMaxZ0SinThetaAboveEtaPt)[bin_eta][bin_pt];
746 });
747 }
748
749 if (!m_vecPtCutoffsForD0Cut.empty() ||
750 !m_vecEtaCutoffsForD0Cut.empty() ||
751 !m_vecvecMaxD0AboveEtaPt.empty()) {
752 auto etaSize = m_vecEtaCutoffsForD0Cut.size();
753 auto ptSize = m_vecPtCutoffsForD0Cut.size();
754 if (etaSize != m_vecvecMaxD0AboveEtaPt.size()) {
755 ATH_MSG_ERROR( "Eta cutoffs and D0 cuts must be vectors of the same length." );
756 return StatusCode::FAILURE;
757 }
758 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
759 if (ptSize != m_vecvecMaxD0AboveEtaPt[i_size].size()) {
760 ATH_MSG_ERROR( "Pt cutoffs and D0 cuts must be vectors of the same length." );
761 return StatusCode::FAILURE;
762 }
763 }
764
765 std::stringstream pTRangeBuffer;
766 std::copy(m_vecPtCutoffsForD0Cut.begin(), m_vecPtCutoffsForD0Cut.end(), std::ostream_iterator<double>(pTRangeBuffer, ", "));
767 std::string pTString=pTRangeBuffer.str();
768 if constexpr(VERBOSE>0) ATH_MSG_INFO("D0 cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<"MeV, respectively:");
769 for (size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
770 {
771 std::stringstream etaRangeBuffer;
772 etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForD0Cut[i_cut_eta] << " < |#eta| < ";
773 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForD0Cut[i_cut_eta+1];
774 else etaRangeBuffer << std::setprecision(2) << std::fixed <<m_maxAbsEta;
775
776 std::stringstream cutBuffer;
777 std::copy(m_vecvecMaxD0AboveEtaPt[i_cut_eta].begin(), m_vecvecMaxD0AboveEtaPt[i_cut_eta].end(), std::ostream_iterator<double>(cutBuffer, ", "));
778 std::string cutString=cutBuffer.str();
779
780 if constexpr(VERBOSE>0) ATH_MSG_INFO(" for "<<etaRangeBuffer.str()<<": "<<cutString.substr(0, cutString.size()-2));
781 }
782
783 if (!checkOrder(m_vecEtaCutoffsForD0Cut.value())) {
784 ATH_MSG_ERROR( "Eta values not in ascending order." );
785 return StatusCode::FAILURE;
786 }
787 if (!checkOrder(m_vecPtCutoffsForD0Cut.value())) {
788 ATH_MSG_ERROR( "Pt values not in ascending order." );
789 return StatusCode::FAILURE;
790 }
791
792 trackCuts["D0"].push_back([p_vecEtaCutoffsForD0Cut = &std::as_const(m_vecEtaCutoffsForD0Cut.value()),
793 p_vecPtCutoffsForD0Cut = &std::as_const(m_vecPtCutoffsForD0Cut.value()),
794 p_vecvecMaxD0AboveEtaPt = &std::as_const(m_vecvecMaxD0AboveEtaPt.value())] (Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
795 double eta = helper.eta(msgHelper);
796 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForD0Cut, std::fabs(eta));
797 double pt = helper.pt(msgHelper);
798 unsigned int bin_pt = findBin(*p_vecPtCutoffsForD0Cut, pt);
799 return bin_eta >= p_vecEtaCutoffsForD0Cut->size()
800 || bin_pt >= p_vecPtCutoffsForD0Cut->size()
801 || std::fabs(helper.d0(msgHelper)) <= (*p_vecvecMaxD0AboveEtaPt)[bin_eta][bin_pt];
802 });
803 }
804
805 if (!m_vecPtCutoffsForSctHolesCut.empty() ||
808 auto etaSize = m_vecEtaCutoffsForSctHolesCut.size();
809 auto ptSize = m_vecPtCutoffsForSctHolesCut.size();
810 if (etaSize != m_vecvecMaxSctHolesAboveEtaPt.size()) {
811 ATH_MSG_ERROR( "Eta cutoffs and SctHoles cuts must be vectors of the same length." );
812 return StatusCode::FAILURE;
813 }
814 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
815 if (ptSize != m_vecvecMaxSctHolesAboveEtaPt[i_size].size()) {
816 ATH_MSG_ERROR( "Pt cutoffs and SctHoles cuts must be vectors of the same length." );
817 return StatusCode::FAILURE;
818 }
819 }
820
821 std::stringstream pTRangeBuffer;
822 std::copy(m_vecPtCutoffsForSctHolesCut.begin(), m_vecPtCutoffsForSctHolesCut.end(), std::ostream_iterator<double>(pTRangeBuffer, ", "));
823 std::string pTString=pTRangeBuffer.str();
824 if constexpr(VERBOSE>0) ATH_MSG_INFO("SctHoles cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<"MeV, respectively:");
825 for (size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
826 {
827 std::stringstream etaRangeBuffer;
828 etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForSctHolesCut[i_cut_eta] << " < |#eta| < ";
829 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForSctHolesCut[i_cut_eta+1];
830 else etaRangeBuffer << std::setprecision(2) << std::fixed <<m_maxAbsEta;
831
832 std::stringstream cutBuffer;
833 std::copy(m_vecvecMaxSctHolesAboveEtaPt[i_cut_eta].begin(), m_vecvecMaxSctHolesAboveEtaPt[i_cut_eta].end(), std::ostream_iterator<double>(cutBuffer, ", "));
834 std::string cutString=cutBuffer.str();
835
836 if constexpr(VERBOSE>0) ATH_MSG_INFO(" for "<<etaRangeBuffer.str()<<": "<<cutString.substr(0, cutString.size()-2));
837 }
838
840 ATH_MSG_ERROR( "Eta values not in ascending order." );
841 return StatusCode::FAILURE;
842 }
844 ATH_MSG_ERROR( "Pt values not in ascending order." );
845 return StatusCode::FAILURE;
846 }
847
848 trackCuts["SctHits"].push_back([p_vecEtaCutoffsForSctHolesCut = &std::as_const(m_vecEtaCutoffsForSctHolesCut.value()),
849 p_vecPtCutoffsForSctHolesCut = &std::as_const(m_vecPtCutoffsForSctHolesCut.value()),
850 p_vecvecMaxSctHolesAboveEtaPt = &std::as_const(m_vecvecMaxSctHolesAboveEtaPt.value())] (Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
851 double eta = helper.eta(msgHelper);
852 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForSctHolesCut, std::fabs(eta));
853 double pt = helper.pt(msgHelper);
854 unsigned int bin_pt = findBin(*p_vecPtCutoffsForSctHolesCut, pt);
855 return bin_eta >= p_vecEtaCutoffsForSctHolesCut->size()
856 || bin_pt >= p_vecPtCutoffsForSctHolesCut->size()
857 || getSummary(helper, msgHelper, xAOD::numberOfSCTHoles) <= (*p_vecvecMaxSctHolesAboveEtaPt)[bin_eta][bin_pt];
858 });
859 }
860
864 auto etaSize = m_vecEtaCutoffsForSctHitsPlusDeadCut.size();
865 auto ptSize = m_vecPtCutoffsForSctHitsPlusDeadCut.size();
866 if (etaSize != m_vecvecMinSctHitsPlusDeadAboveEtaPt.size()) {
867 ATH_MSG_ERROR( "Eta cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
868 return StatusCode::FAILURE;
869 }
870 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
871 if (ptSize != m_vecvecMinSctHitsPlusDeadAboveEtaPt[i_size].size()) {
872 ATH_MSG_ERROR( "Pt cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
873 return StatusCode::FAILURE;
874 }
875 }
876
877 std::stringstream pTRangeBuffer;
878 std::copy(m_vecPtCutoffsForSctHitsPlusDeadCut.begin(), m_vecPtCutoffsForSctHitsPlusDeadCut.end(), std::ostream_iterator<double>(pTRangeBuffer, ", "));
879 std::string pTString=pTRangeBuffer.str();
880 if constexpr(VERBOSE>0) ATH_MSG_INFO("SctHitsPlusDead cuts (>=) for pT above "<<pTString.substr(0, pTString.size()-2)<<"MeV, respectively:");
881 for (size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
882 {
883 std::stringstream etaRangeBuffer;
884 etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForSctHitsPlusDeadCut[i_cut_eta] << " < |#eta| < ";
885 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForSctHitsPlusDeadCut[i_cut_eta+1];
886 else etaRangeBuffer << std::setprecision(2) << std::fixed <<m_maxAbsEta;
887
888 std::stringstream cutBuffer;
889 std::copy(m_vecvecMinSctHitsPlusDeadAboveEtaPt[i_cut_eta].begin(), m_vecvecMinSctHitsPlusDeadAboveEtaPt[i_cut_eta].end(), std::ostream_iterator<double>(cutBuffer, ", "));
890 std::string cutString=cutBuffer.str();
891
892 if constexpr(VERBOSE>0) ATH_MSG_INFO(" for "<<etaRangeBuffer.str()<<": "<<cutString.substr(0, cutString.size()-2));
893 }
894
896 ATH_MSG_ERROR( "Eta values not in ascending order." );
897 return StatusCode::FAILURE;
898 }
900 ATH_MSG_ERROR( "Pt values not in ascending order." );
901 return StatusCode::FAILURE;
902 }
903
904 trackCuts["SctHits"].push_back([p_vecEtaCutoffsForSctHitsPlusDeadCut = &std::as_const(m_vecEtaCutoffsForSctHitsPlusDeadCut.value()),
905 p_vecPtCutoffsForSctHitsPlusDeadCut = &std::as_const(m_vecPtCutoffsForSctHitsPlusDeadCut.value()),
906 p_vecvecMinSctHitsPlusDeadAboveEtaPt = &std::as_const(m_vecvecMinSctHitsPlusDeadAboveEtaPt.value())] (Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
907 double eta = helper.eta(msgHelper);
908 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForSctHitsPlusDeadCut, std::fabs(eta));
909 double pt = helper.pt(msgHelper);
910 unsigned int bin_pt = findBin(*p_vecPtCutoffsForSctHitsPlusDeadCut, pt);
911 return bin_eta >= p_vecEtaCutoffsForSctHitsPlusDeadCut->size()
912 || bin_pt >= p_vecPtCutoffsForSctHitsPlusDeadCut->size()
913 || getSummarySum<2,Trk_Helper>(helper, msgHelper, {xAOD::numberOfSCTHits, xAOD::numberOfSCTDeadSensors}) >= (*p_vecvecMinSctHitsPlusDeadAboveEtaPt)[bin_eta][bin_pt];
914 });
915 }
916
917 return StatusCode::SUCCESS;
918}
Scalar eta() const
pseudorapidity method
#define sqr(t)
size_t size() const
Number of registered mappings.
@ top
static bool maxDoubleIsSet(double cutValue)
Gaudi::Property< bool > m_useExperimentalInnermostLayersCut
static bool maxIntIsSet(int cutValue)
Int_t getNumberOfUsedHitsdEdx(Trk_Helper &helper, const asg::AsgMessaging &msgHelper)
std::tuple< uint8_t, uint8_t > getSiHitsTopBottom(const Trk::Track &track, const asg::AsgMessaging &msgHelper)
double getFitChiSquare(const Trk_Helper &helper, const asg::AsgMessaging &msgHelper)
Int_t getNumberOfIBLOverflowsdEdx(Trk_Helper &helper, const asg::AsgMessaging &msgHelper)
uint8_t getSummarySum(const T_TrkHelper helper, const asg::AsgMessaging &msgHelper, std::array< xAOD::SummaryType, n_summary_types > sumTypes)
double getFitNDoF(const TrkHelper &helper, const asg::AsgMessaging &msgHelper)
float getEProbabilityHT(const Trk_Helper &helper, const asg::AsgMessaging &msgHelper)
uint8_t getSummary(const T_TrkHelper &helper, const asg::AsgMessaging &msgHelper, xAOD::SummaryType sumType)
bool absEta(const xAOD::TauJet &tau, float &out)
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfTRTHighThresholdOutliers
number of TRT high threshold outliers (only xenon counted) [unit8_t].
@ numberOfInnermostPixelLayerSharedHits
number of Pixel 0th layer barrel hits shared by several tracks.
@ numberOfTRTXenonHits
number of TRT hits on track in straws with xenon [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfNextToInnermostPixelLayerHits
these are the hits in the 1st pixel barrel layer
@ numberOfSCTDeadSensors
number of dead SCT sensors crossed [unit8_t].
@ expectNextToInnermostPixelLayerHit
Do we expect a 1st-layer barrel hit for this track?
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfSCTDoubleHoles
number of Holes in both sides of a SCT module [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfTRTHighThresholdHits
number of TRT hits which pass the high threshold (only xenon counted) [unit8_t].
@ numberOfTRTOutliers
number of TRT outliers [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

◆ TrackCut

friend class TrackCut
friend

Definition at line 55 of file InDetTrackSelectionTool.h.

Member Data Documentation

◆ ATLAS_THREAD_SAFE

std::vector<uint64_t> m_numTracksPassedCuts InDet::InDetTrackSelectionTool::ATLAS_THREAD_SAFE
mutableprivate

tracks the number of tracks that passed each cut family.

Guarded by m_mutex

Definition at line 134 of file InDetTrackSelectionTool.h.

◆ LOCAL_MAX_DOUBLE

double InDet::InDetTrackSelectionTool::LOCAL_MAX_DOUBLE = 1.0e16
staticconstexprprivate

Definition at line 139 of file InDetTrackSelectionTool.h.

◆ LOCAL_MAX_INT

int InDet::InDetTrackSelectionTool::LOCAL_MAX_INT = std::numeric_limits<int>::max()
staticconstexprprivate

Definition at line 140 of file InDetTrackSelectionTool.h.

◆ m_acceptInfo

asg::AcceptInfo InDet::InDetTrackSelectionTool::m_acceptInfo
private

Object used to store the last decision.

Object that stores detailed selection information

Definition at line 356 of file InDetTrackSelectionTool.h.

◆ m_cutLevel

Gaudi::Property<std::string> InDet::InDetTrackSelectionTool::m_cutLevel {this, "CutLevel", ""}
private

The string version of the cut level so that it can be set via jobOptions.

Definition at line 360 of file InDetTrackSelectionTool.h.

360{this, "CutLevel", ""};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 393 of file AthCommonDataStore.h.

◆ m_eProbHTonlyForXe

Gaudi::Property<bool> InDet::InDetTrackSelectionTool::m_eProbHTonlyForXe
private
Initial value:
{this, "eProbHTonlyForXe", false,
"Flag whether to apply the eProbabilityHT cut only when all TRT hits are Xenon"}

Definition at line 275 of file InDetTrackSelectionTool.h.

276 {this, "eProbHTonlyForXe", false,
277 "Flag whether to apply the eProbabilityHT cut only when all TRT hits are Xenon"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extrapolator

ToolHandle<Trk::IExtrapolator> InDet::InDetTrackSelectionTool::m_extrapolator {this, "Extrapolator", "Trk::Extrapolator/Extrapolator"}
private

Definition at line 370 of file InDetTrackSelectionTool.h.

371{this, "Extrapolator", "Trk::Extrapolator/Extrapolator"};

◆ m_initTrkTools

Gaudi::Property<bool> InDet::InDetTrackSelectionTool::m_initTrkTools {this, "UseTrkTrackTools", false, "Whether to initialize the Trk::Track tools"}
private

Definition at line 366 of file InDetTrackSelectionTool.h.

366{this, "UseTrkTrackTools", false, "Whether to initialize the Trk::Track tools"};

◆ m_isInitialized

bool InDet::InDetTrackSelectionTool::m_isInitialized = false
private

Definition at line 109 of file InDetTrackSelectionTool.h.

◆ m_maxAbsEta

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxAbsEta {this, "maxAbsEta", LOCAL_MAX_DOUBLE, "Maximum magnitude of pseudorapidity"}
private

Definition at line 145 of file InDetTrackSelectionTool.h.

146{this, "maxAbsEta", LOCAL_MAX_DOUBLE, "Maximum magnitude of pseudorapidity"};

◆ m_maxChiSq

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxChiSq {this, "maxChiSq", LOCAL_MAX_DOUBLE, "Maximum chi squared"}
private

Definition at line 258 of file InDetTrackSelectionTool.h.

259{this, "maxChiSq", LOCAL_MAX_DOUBLE, "Maximum chi squared"};

◆ m_maxChiSqperNdf

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxChiSqperNdf
private
Initial value:
{this, "maxChiSqperNdf", LOCAL_MAX_DOUBLE,
"Maximum chi squared per degree of freedom"}

Definition at line 260 of file InDetTrackSelectionTool.h.

261 {this, "maxChiSqperNdf", LOCAL_MAX_DOUBLE,
262 "Maximum chi squared per degree of freedom"};

◆ m_maxD0

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxD0 {this, "maxD0", LOCAL_MAX_DOUBLE, "Maximum transvers separation"}
private

Definition at line 151 of file InDetTrackSelectionTool.h.

152{this, "maxD0", LOCAL_MAX_DOUBLE, "Maximum transvers separation"};

◆ m_maxD0overSigmaD0

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxD0overSigmaD0 {this, "maxD0overSigmaD0", LOCAL_MAX_DOUBLE, "Significance cut on |d0|"}
private

Definition at line 159 of file InDetTrackSelectionTool.h.

160{this, "maxD0overSigmaD0", LOCAL_MAX_DOUBLE, "Significance cut on |d0|"};

◆ m_maxEtaForTrtHitCuts

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxEtaForTrtHitCuts
private
Initial value:
{this, "maxEtaForTrtHitCuts", -1.,
"Eta above which TRT hit cuts are not applied."}

Definition at line 237 of file InDetTrackSelectionTool.h.

238 {this, "maxEtaForTrtHitCuts", -1.,
239 "Eta above which TRT hit cuts are not applied."};

◆ m_maxNInnermostLayerSharedHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_maxNInnermostLayerSharedHits
private
Initial value:
{this, "maxNInnermostLayerSharedHits", LOCAL_MAX_INT,
"Maximum shared hits in innermost pixel layer"}

Definition at line 176 of file InDetTrackSelectionTool.h.

177 {this, "maxNInnermostLayerSharedHits", LOCAL_MAX_INT,
178 "Maximum shared hits in innermost pixel layer"};

◆ m_maxNPixelHoles

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_maxNPixelHoles
private
Initial value:
{this, "maxNPixelHoles", LOCAL_MAX_INT,
"Maximum number of missed layers in pixel"}

Definition at line 200 of file InDetTrackSelectionTool.h.

201 {this, "maxNPixelHoles", LOCAL_MAX_INT,
202 "Maximum number of missed layers in pixel"};

◆ m_maxNPixelSharedHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_maxNPixelSharedHits
private
Initial value:
{this, "maxNPixelSharedHits", LOCAL_MAX_INT,
"Maximum pixels shared with other tracks"}

Definition at line 197 of file InDetTrackSelectionTool.h.

198 {this, "maxNPixelSharedHits", LOCAL_MAX_INT,
199 "Maximum pixels shared with other tracks"};

◆ m_maxNSctDoubleHoles

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_maxNSctDoubleHoles {this, "maxNSctDoubleHoles", LOCAL_MAX_INT, "Maximum SCT double holes"}
private

Definition at line 231 of file InDetTrackSelectionTool.h.

232{this, "maxNSctDoubleHoles", LOCAL_MAX_INT, "Maximum SCT double holes"};

◆ m_maxNSctHoles

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_maxNSctHoles {this, "maxNSctHoles", LOCAL_MAX_INT, "Maximum SCT holes"}
private

Definition at line 229 of file InDetTrackSelectionTool.h.

230{this, "maxNSctHoles", LOCAL_MAX_INT, "Maximum SCT holes"};

◆ m_maxNSctSharedHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_maxNSctSharedHits
private
Initial value:
{this, "maxNSctSharedHits", LOCAL_MAX_INT,
"Maximum SCT hits shared with other track"}

Definition at line 226 of file InDetTrackSelectionTool.h.

227 {this, "maxNSctSharedHits", LOCAL_MAX_INT,
228 "Maximum SCT hits shared with other track"};

◆ m_maxNSiHoles

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_maxNSiHoles {this, "maxNSiHoles", LOCAL_MAX_INT, "Maximum silicon (pixel + SCT) holes"}
private

Definition at line 193 of file InDetTrackSelectionTool.h.

194{this, "maxNSiHoles", LOCAL_MAX_INT, "Maximum silicon (pixel + SCT) holes"};

◆ m_maxNSiSharedHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_maxNSiSharedHits
private
Initial value:
{this, "maxNSiSharedHits", LOCAL_MAX_INT,
"Maximum silicon (pixel + SCT) sensors shared with other track"}

Definition at line 187 of file InDetTrackSelectionTool.h.

188 {this, "maxNSiSharedHits", LOCAL_MAX_INT,
189 "Maximum silicon (pixel + SCT) sensors shared with other track"};

◆ m_maxOneSharedModule

Gaudi::Property<bool> InDet::InDetTrackSelectionTool::m_maxOneSharedModule
private
Initial value:
{this, "maxOneSharedModule", false,
"Allow only 1 shared pixel hit or 2 shared SCT hits, not both"}

Definition at line 210 of file InDetTrackSelectionTool.h.

211 {this, "maxOneSharedModule", false,
212 "Allow only 1 shared pixel hit or 2 shared SCT hits, not both"};

◆ m_maxSigmaD0

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxSigmaD0 {this, "maxSigmaD0", LOCAL_MAX_DOUBLE, "Maximum error on d0"}
private

Definition at line 153 of file InDetTrackSelectionTool.h.

154{this, "maxSigmaD0", LOCAL_MAX_DOUBLE, "Maximum error on d0"};

◆ m_maxSigmaZ0

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxSigmaZ0 {this, "maxSigmaZ0", LOCAL_MAX_DOUBLE, "Maximum error on z0"}
private

Definition at line 155 of file InDetTrackSelectionTool.h.

156{this, "maxSigmaZ0", LOCAL_MAX_DOUBLE, "Maximum error on z0"};

◆ m_maxSigmaZ0SinTheta

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxSigmaZ0SinTheta {this, "maxSigmaZ0SinTheta", LOCAL_MAX_DOUBLE, "Maximum error on z0*sin(theta)"}
private

Definition at line 157 of file InDetTrackSelectionTool.h.

158{this, "maxSigmaZ0SinTheta", LOCAL_MAX_DOUBLE, "Maximum error on z0*sin(theta)"};

◆ m_maxTrtEtaAcceptance

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxTrtEtaAcceptance
private
Initial value:
{this, "maxTrtEtaAcceptance", LOCAL_MAX_DOUBLE,
"Maximum eta that ignores TRT hit cuts"}

Definition at line 234 of file InDetTrackSelectionTool.h.

235 {this, "maxTrtEtaAcceptance", LOCAL_MAX_DOUBLE,
236 "Maximum eta that ignores TRT hit cuts"};

◆ m_maxTrtHighEFraction

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxTrtHighEFraction
private
Initial value:
{this, "maxTrtHighEFraction", LOCAL_MAX_DOUBLE,
"Maximum TRT hits that are above high energy threshold"}

Definition at line 248 of file InDetTrackSelectionTool.h.

249 {this, "maxTrtHighEFraction", LOCAL_MAX_DOUBLE,
250 "Maximum TRT hits that are above high energy threshold"};

◆ m_maxTrtHighEFractionWithOutliers

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxTrtHighEFractionWithOutliers
private
Initial value:
{this, "maxTrtHighEFractionWithOutliers", LOCAL_MAX_DOUBLE,
"Maximum TRT hits that are above high energy threshold including outliers"}

Definition at line 251 of file InDetTrackSelectionTool.h.

252 {this, "maxTrtHighEFractionWithOutliers", LOCAL_MAX_DOUBLE,
253 "Maximum TRT hits that are above high energy threshold including outliers"};

◆ m_maxTrtOutlierFraction

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxTrtOutlierFraction
private
Initial value:
{this, "maxTrtOutlierFraction", LOCAL_MAX_DOUBLE,
"Maximum fraction of TRT outliers over TRT hits plus outliers"}

Definition at line 254 of file InDetTrackSelectionTool.h.

255 {this, "maxTrtOutlierFraction", LOCAL_MAX_DOUBLE,
256 "Maximum fraction of TRT outliers over TRT hits plus outliers"};

◆ m_maxZ0

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxZ0 {this, "maxZ0", LOCAL_MAX_DOUBLE, "Maximum longitudinal separation"}
private

Definition at line 149 of file InDetTrackSelectionTool.h.

150{this, "maxZ0", LOCAL_MAX_DOUBLE, "Maximum longitudinal separation"};

◆ m_maxZ0overSigmaZ0

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxZ0overSigmaZ0 {this, "maxZ0overSigmaZ0", LOCAL_MAX_DOUBLE, "Significance cut on |z0|"}
private

Definition at line 161 of file InDetTrackSelectionTool.h.

162{this, "maxZ0overSigmaZ0", LOCAL_MAX_DOUBLE, "Significance cut on |z0|"};

◆ m_maxZ0SinTheta

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxZ0SinTheta {this, "maxZ0SinTheta", LOCAL_MAX_DOUBLE, "Maximum |z0|*sin(theta)"}
private

Definition at line 147 of file InDetTrackSelectionTool.h.

148{this, "maxZ0SinTheta", LOCAL_MAX_DOUBLE, "Maximum |z0|*sin(theta)"};

◆ m_maxZ0SinThetaoverSigmaZ0SinTheta

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_maxZ0SinThetaoverSigmaZ0SinTheta
private
Initial value:
{this, "maxZ0SinThetaoverSigmaZ0SinTheta", LOCAL_MAX_DOUBLE,
"Significance cut on |z0*sin(theta)|"}

Definition at line 163 of file InDetTrackSelectionTool.h.

164 {this, "maxZ0SinThetaoverSigmaZ0SinTheta", LOCAL_MAX_DOUBLE,
165 "Significance cut on |z0*sin(theta)|"};

◆ m_minEProbabilityHT

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_minEProbabilityHT
private
Initial value:
{this, "minEProbabilityHT", -1.,
"Minimum High Threshold electron probability"}

Definition at line 278 of file InDetTrackSelectionTool.h.

279 {this, "minEProbabilityHT", -1.,
280 "Minimum High Threshold electron probability"};

◆ m_minEtaForStrictNSiHitsCut

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_minEtaForStrictNSiHitsCut
private
Initial value:
{this, "minEtaForStrictNSiHitsCut", LOCAL_MAX_DOUBLE,
"Eta cutoff for strict silicon hits cut"}

Definition at line 204 of file InDetTrackSelectionTool.h.

205 {this, "minEtaForStrictNSiHitsCut", LOCAL_MAX_DOUBLE,
206 "Eta cutoff for strict silicon hits cut"};

◆ m_minNBothInnermostLayersHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNBothInnermostLayersHits
private
Initial value:
{this, "minNBothInnermostLayersHits", -1,
"Required hits on two innermost pixel layers"}

Definition at line 173 of file InDetTrackSelectionTool.h.

174 {this, "minNBothInnermostLayersHits", -1,
175 "Required hits on two innermost pixel layers"};

◆ m_minNInnermostLayerHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNInnermostLayerHits
private
Initial value:
{this, "minNInnermostLayerHits", -1,
"Required hits on the innermost pixel layer"}

Definition at line 167 of file InDetTrackSelectionTool.h.

168 {this, "minNInnermostLayerHits", -1,
169 "Required hits on the innermost pixel layer"};

◆ m_minNNextToInnermostLayerHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNNextToInnermostLayerHits
private
Initial value:
{this, "minNNextToInnermostLayerHits", -1,
"Required hits on the next to innermost pixel layer"}

Definition at line 170 of file InDetTrackSelectionTool.h.

171 {this, "minNNextToInnermostLayerHits", -1,
172 "Required hits on the next to innermost pixel layer"};

◆ m_minNOverflowHitsdEdx

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNOverflowHitsdEdx {this, "minNOverflowHitsdEdx", -1, "Minimum overflow hits in IBL for dEdx"}
private

Definition at line 273 of file InDetTrackSelectionTool.h.

274{this, "minNOverflowHitsdEdx", -1, "Minimum overflow hits in IBL for dEdx"};

◆ m_minNPixelHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNPixelHits {this, "minNPixelHits", -1, "Required pixel hits"}
private

Definition at line 195 of file InDetTrackSelectionTool.h.

196{this, "minNPixelHits", -1, "Required pixel hits"};

◆ m_minNPixelHitsPhysical

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNPixelHitsPhysical {this, "minNPixelHitsPhysical", -1, "Minimum physical pixel hits"}
private

Definition at line 220 of file InDetTrackSelectionTool.h.

221{this, "minNPixelHitsPhysical", -1, "Minimum physical pixel hits"};

◆ m_minNSctHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNSctHits {this, "minNSctHits", -1, "Minimum SCT hits"}
private

Definition at line 224 of file InDetTrackSelectionTool.h.

225{this, "minNSctHits", -1, "Minimum SCT hits"};

◆ m_minNSctHitsPhysical

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNSctHitsPhysical {this, "minNSctHitsPhysical", -1, "Minimum physical SCT hits"}
private

Definition at line 222 of file InDetTrackSelectionTool.h.

223{this, "minNSctHitsPhysical", -1, "Minimum physical SCT hits"};

◆ m_minNSiHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNSiHits {this, "minNSiHits", -1, "Minimum silicon (pixel + SCT) hits"}
private

Definition at line 185 of file InDetTrackSelectionTool.h.

186{this, "minNSiHits", -1, "Minimum silicon (pixel + SCT) hits"};

◆ m_minNSiHitsAboveEtaCutoff

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNSiHitsAboveEtaCutoff
private
Initial value:
{this, "minNSiHitsAboveEtaCutoff", -1,
"Minimum silicon hits at large pseudorapidity"}

Definition at line 207 of file InDetTrackSelectionTool.h.

208 {this, "minNSiHitsAboveEtaCutoff", -1,
209 "Minimum silicon hits at large pseudorapidity"};

◆ m_minNSiHitsIfSiSharedHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNSiHitsIfSiSharedHits
private
Initial value:
{this, "minNSiHitsIfSiSharedHits", -1,
"Minimum number of silicon hits if there are any shared silicon hits"}

Definition at line 190 of file InDetTrackSelectionTool.h.

191 {this, "minNSiHitsIfSiSharedHits", -1,
192 "Minimum number of silicon hits if there are any shared silicon hits"};

◆ m_minNSiHitsMod

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNSiHitsMod
private
Initial value:
{this, "minNSiHitsMod", -1,
"Minimum number of Si hits, with pixel hits counting twice"}

Definition at line 287 of file InDetTrackSelectionTool.h.

288 {this, "minNSiHitsMod", -1,
289 "Minimum number of Si hits, with pixel hits counting twice"};

◆ m_minNSiHitsModBottom

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNSiHitsModBottom
private
Initial value:
{this, "minNSiHitsModBottom", -1,
"Min number of Si hits on bottom half (pixel counting twice)"}

Definition at line 293 of file InDetTrackSelectionTool.h.

294 {this, "minNSiHitsModBottom", -1,
295 "Min number of Si hits on bottom half (pixel counting twice)"};

◆ m_minNSiHitsModTop

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNSiHitsModTop
private
Initial value:
{this, "minNSiHitsModTop", -1,
"Min number of Si hits on top half (pixel counting twice)"}

Definition at line 290 of file InDetTrackSelectionTool.h.

291 {this, "minNSiHitsModTop", -1,
292 "Min number of Si hits on top half (pixel counting twice)"};

◆ m_minNSiHitsPhysical

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNSiHitsPhysical
private
Initial value:
{this, "minNSiHitsPhysical", -1,
"Minimum physical silicon hits (i.e. dead sensors do not count)"}

Definition at line 217 of file InDetTrackSelectionTool.h.

218 {this, "minNSiHitsPhysical", -1,
219 "Minimum physical silicon hits (i.e. dead sensors do not count)"};

◆ m_minNTrtHighThresholdHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNTrtHighThresholdHits {this, "minNTrtHighThresholdHits", -1, "Minimum high E TRT hits"}
private

Definition at line 243 of file InDetTrackSelectionTool.h.

244{this, "minNTrtHighThresholdHits", -1, "Minimum high E TRT hits"};

◆ m_minNTrtHighThresholdHitsPlusOutliers

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNTrtHighThresholdHitsPlusOutliers
private
Initial value:
{this, "minNTrtHighThresholdHitsPlusOutliers", -1,
"Minimum high E TRT hits including outliers"}

Definition at line 245 of file InDetTrackSelectionTool.h.

246 {this, "minNTrtHighThresholdHitsPlusOutliers", -1,
247 "Minimum high E TRT hits including outliers"};

◆ m_minNTrtHits

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNTrtHits {this, "minNTrtHits", -1, "Minimum TRT hits"}
private

Definition at line 240 of file InDetTrackSelectionTool.h.

240{this, "minNTrtHits", -1, "Minimum TRT hits"};

◆ m_minNTrtHitsPlusOutliers

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNTrtHitsPlusOutliers {this, "minNTrtHitsPlusOutliers", -1, "Minimum TRT hits including outliers"}
private

Definition at line 241 of file InDetTrackSelectionTool.h.

242{this, "minNTrtHitsPlusOutliers", -1, "Minimum TRT hits including outliers"};

◆ m_minNUsedHitsdEdx

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_minNUsedHitsdEdx {this, "minNUsedHitsdEdx", -1, "Minimum hits used for dEdx"}
private

Definition at line 271 of file InDetTrackSelectionTool.h.

272{this, "minNUsedHitsdEdx", -1, "Minimum hits used for dEdx"};

◆ m_minP

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_minP {this, "minP", -1., "Minimum momentum"}
private

Definition at line 143 of file InDetTrackSelectionTool.h.

143{this, "minP", -1., "Minimum momentum"};

◆ m_minProb

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_minProb {this, "minProb", -1., "Minimum p(chi^2, Ndof)"}
private

Definition at line 263 of file InDetTrackSelectionTool.h.

263{this, "minProb", -1., "Minimum p(chi^2, Ndof)"};

◆ m_minProbAbovePtCutoff

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_minProbAbovePtCutoff
private
Initial value:
{this, "minProbAbovePtCutoff", -1.,
"Minimum chi-sq probability above a pt cutoff"}

Definition at line 267 of file InDetTrackSelectionTool.h.

268 {this, "minProbAbovePtCutoff", -1.,
269 "Minimum chi-sq probability above a pt cutoff"};

◆ m_minPt

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_minPt {this, "minPt", -1., "Minimum transverse momentum"}
private

Definition at line 142 of file InDetTrackSelectionTool.h.

142{this, "minPt", -1., "Minimum transverse momentum"};

◆ m_minPtForProbCut

Gaudi::Property<double> InDet::InDetTrackSelectionTool::m_minPtForProbCut
private
Initial value:
{this, "minPtForProbCut", LOCAL_MAX_DOUBLE,
"Minimum pt for chi-sq probability cut"}

Definition at line 264 of file InDetTrackSelectionTool.h.

265 {this, "minPtForProbCut", LOCAL_MAX_DOUBLE,
266 "Minimum pt for chi-sq probability cut"};

◆ m_msgHelper

std::unique_ptr<asg::AsgMessaging> InDet::InDetTrackSelectionTool::m_msgHelper
private

Definition at line 124 of file InDetTrackSelectionTool.h.

◆ m_mutex

std::mutex InDet::InDetTrackSelectionTool::m_mutex
mutableprivate

Definition at line 135 of file InDetTrackSelectionTool.h.

◆ m_numTracksPassed

std::atomic<uint64_t> InDet::InDetTrackSelectionTool::m_numTracksPassed = 0
mutableprivate

a counter of the number of tracks that passed all cuts

Definition at line 133 of file InDetTrackSelectionTool.h.

◆ m_numTracksProcessed

std::atomic<uint64_t> InDet::InDetTrackSelectionTool::m_numTracksProcessed = 0
mutableprivate

a counter of the number of tracks proccessed

Definition at line 132 of file InDetTrackSelectionTool.h.

◆ m_trackAccessors

std::unordered_map< std::string, std::shared_ptr<TrackAccessor> > InDet::InDetTrackSelectionTool::m_trackAccessors
private

list of the accessors that need to be run for each track

Definition at line 122 of file InDetTrackSelectionTool.h.

◆ m_trackParticleCuts

std::map< std::string, std::vector< std::function<bool(InDetAccessor::TrackParticleHelper helper, const asg::AsgMessaging &msgHelper)> > > InDet::InDetTrackSelectionTool::m_trackParticleCuts
private

First element is the name of the cut family, second element is the set of cuts.

Definition at line 126 of file InDetTrackSelectionTool.h.

◆ m_trackSumTool

ToolHandle<Trk::ITrackSummaryTool> InDet::InDetTrackSelectionTool::m_trackSumTool {this, "TrackSummaryTool", "Trk::TrackSummaryTool/TrackSummaryTool"}
private

Definition at line 368 of file InDetTrackSelectionTool.h.

369{this, "TrackSummaryTool", "Trk::TrackSummaryTool/TrackSummaryTool"};

◆ m_trackSumToolAvailable

bool InDet::InDetTrackSelectionTool::m_trackSumToolAvailable = false
private

Whether the summary tool is available.

Definition at line 367 of file InDetTrackSelectionTool.h.

◆ m_trkTrackCuts

std::map< std::string, std::vector< std::function<bool(InDetAccessor::TrkTrackHelper helper, const asg::AsgMessaging &msgHelper)> > > InDet::InDetTrackSelectionTool::m_trkTrackCuts
private

First element is the name of the cut family, second element is the set of cuts.

Definition at line 129 of file InDetTrackSelectionTool.h.

◆ m_useEtaDependentMaxChiSq

Gaudi::Property<bool> InDet::InDetTrackSelectionTool::m_useEtaDependentMaxChiSq
private
Initial value:
{this, "useEtaDependentMaxChiSq", false,
"Whether or not to use the eta-dependent chi squared per degree of freedom cut"}

Definition at line 213 of file InDetTrackSelectionTool.h.

214 {this, "useEtaDependentMaxChiSq", false,
215 "Whether or not to use the eta-dependent chi squared per degree of freedom cut"};

◆ m_useExperimentalInnermostLayersCut

Gaudi::Property<bool> InDet::InDetTrackSelectionTool::m_useExperimentalInnermostLayersCut
private
Initial value:
{this, "useExperimentalInnermostLayersCut", false,
"Use the experimental cut on pixel holes"}

Definition at line 282 of file InDetTrackSelectionTool.h.

283 {this, "useExperimentalInnermostLayersCut", false,
284 "Use the experimental cut on pixel holes"};

◆ m_useHILoosePixModInnermostLayersCut

Gaudi::Property<bool> InDet::InDetTrackSelectionTool::m_useHILoosePixModInnermostLayersCut
private
Initial value:
{this, "useHILoosePixModInnermostLayersCut", false,
"IBL or next layer hit, otherwise zero expected next layer hits"}

Definition at line 182 of file InDetTrackSelectionTool.h.

183 {this, "useHILoosePixModInnermostLayersCut", false,
184 "IBL or next layer hit, otherwise zero expected next layer hits"};

◆ m_useMinBiasInnermostLayersCut

Gaudi::Property<int> InDet::InDetTrackSelectionTool::m_useMinBiasInnermostLayersCut
private
Initial value:
{this, "useMinBiasInnermostLayersCut", 0,
"IBL hit if expected, otherwise next layer hit if expected"}

Definition at line 179 of file InDetTrackSelectionTool.h.

180 {this, "useMinBiasInnermostLayersCut", 0,
181 "IBL hit if expected, otherwise next layer hit if expected"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vecEtaCutoffsForD0Cut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecEtaCutoffsForD0Cut {this, "vecEtaCutoffsForD0Cut", {}, "Minimum eta cutoffs for each D0 value"}
private

Definition at line 327 of file InDetTrackSelectionTool.h.

328{this, "vecEtaCutoffsForD0Cut", {}, "Minimum eta cutoffs for each D0 value"};

◆ m_vecEtaCutoffsForPtCut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecEtaCutoffsForPtCut {this, "vecEtaCutoffsForPtCut", {}, "Minimum eta cutoffs for each pT cut"}
private

Definition at line 304 of file InDetTrackSelectionTool.h.

305{this, "vecEtaCutoffsForPtCut", {}, "Minimum eta cutoffs for each pT cut"};

◆ m_vecEtaCutoffsForSctHitsPlusDeadCut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecEtaCutoffsForSctHitsPlusDeadCut
private
Initial value:
{this, "vecEtaCutoffsForSctHitsPlusDeadCut", {},
"Minimum eta cutoffs for each SctHitsPlusDead value"}

Definition at line 345 of file InDetTrackSelectionTool.h.

346 {this, "vecEtaCutoffsForSctHitsPlusDeadCut", {},
347 "Minimum eta cutoffs for each SctHitsPlusDead value"};

◆ m_vecEtaCutoffsForSctHolesCut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecEtaCutoffsForSctHolesCut
private
Initial value:
{this, "vecEtaCutoffsForSctHolesCut", {},
"Minimum eta cutoffs for each SctHoles value"}

Definition at line 335 of file InDetTrackSelectionTool.h.

336 {this, "vecEtaCutoffsForSctHolesCut", {},
337 "Minimum eta cutoffs for each SctHoles value"};

◆ m_vecEtaCutoffsForSiHitsCut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecEtaCutoffsForSiHitsCut
private
Initial value:
{this, "vecEtaCutoffsForSiHitsCut", {},
"Minimum eta cutoffs for each Silicon hit cut"}

Definition at line 298 of file InDetTrackSelectionTool.h.

299 {this, "vecEtaCutoffsForSiHitsCut", {},
300 "Minimum eta cutoffs for each Silicon hit cut"};

◆ m_vecEtaCutoffsForZ0SinThetaCut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecEtaCutoffsForZ0SinThetaCut
private
Initial value:
{this, "vecEtaCutoffsForZ0SinThetaCut", {},
"Minimum eta cutoffs for each Z0SinTheta value"}

Definition at line 317 of file InDetTrackSelectionTool.h.

318 {this, "vecEtaCutoffsForZ0SinThetaCut", {},
319 "Minimum eta cutoffs for each Z0SinTheta value"};

◆ m_vecMinNSctHitsAbovePt

Gaudi::Property<std::vector<int> > InDet::InDetTrackSelectionTool::m_vecMinNSctHitsAbovePt
private
Initial value:
{this, "vecMinNSctHitsAbovePt", {},
"Minimum SCT hits above each pt cutoff"}

Definition at line 313 of file InDetTrackSelectionTool.h.

314 {this, "vecMinNSctHitsAbovePt", {},
315 "Minimum SCT hits above each pt cutoff"};

◆ m_vecMinNSiHitsAboveEta

Gaudi::Property<std::vector<int> > InDet::InDetTrackSelectionTool::m_vecMinNSiHitsAboveEta
private
Initial value:
{this, "vecMinNSiHitsAboveEta", {},
"Minimum Silicon hits above each eta cutoff"}

Definition at line 301 of file InDetTrackSelectionTool.h.

302 {this, "vecMinNSiHitsAboveEta", {},
303 "Minimum Silicon hits above each eta cutoff"};

◆ m_vecMinPtAboveEta

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecMinPtAboveEta
private
Initial value:
{this, "vecMinPtAboveEta", {},
"Minimum transverse momentum above each eta cutoff"}

Definition at line 306 of file InDetTrackSelectionTool.h.

307 {this, "vecMinPtAboveEta", {},
308 "Minimum transverse momentum above each eta cutoff"};

◆ m_vecPtCutoffsForD0Cut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecPtCutoffsForD0Cut {this, "vecPtCutoffsForD0Cut", {}, "Minimum pt cutoffs for each D0 value"}
private

Definition at line 329 of file InDetTrackSelectionTool.h.

330{this, "vecPtCutoffsForD0Cut", {}, "Minimum pt cutoffs for each D0 value"};

◆ m_vecPtCutoffsForSctHitsCut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecPtCutoffsForSctHitsCut
private
Initial value:
{this, "vecPtCutoffsForSctHitsCut", {},
"Minimum pt cutoffs for each SCT hits"}

Definition at line 310 of file InDetTrackSelectionTool.h.

311 {this, "vecPtCutoffsForSctHitsCut", {},
312 "Minimum pt cutoffs for each SCT hits"};

◆ m_vecPtCutoffsForSctHitsPlusDeadCut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecPtCutoffsForSctHitsPlusDeadCut
private
Initial value:
{this, "vecPtCutoffsForSctHitsPlusDeadCut", {},
"Minimum pt cutoffs for each SctHitsPlusDead value"}

Definition at line 348 of file InDetTrackSelectionTool.h.

349 {this, "vecPtCutoffsForSctHitsPlusDeadCut", {},
350 "Minimum pt cutoffs for each SctHitsPlusDead value"};

◆ m_vecPtCutoffsForSctHolesCut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecPtCutoffsForSctHolesCut
private
Initial value:
{this, "vecPtCutoffsForSctHolesCut", {},
"Minimum pt cutoffs for each SctHoles value"}

Definition at line 338 of file InDetTrackSelectionTool.h.

339 {this, "vecPtCutoffsForSctHolesCut", {},
340 "Minimum pt cutoffs for each SctHoles value"};

◆ m_vecPtCutoffsForZ0SinThetaCut

Gaudi::Property<std::vector<double> > InDet::InDetTrackSelectionTool::m_vecPtCutoffsForZ0SinThetaCut
private
Initial value:
{this, "vecPtCutoffsForZ0SinThetaCut", {},
"Minimum pt cutoffs for each Z0SinTheta value"}

Definition at line 320 of file InDetTrackSelectionTool.h.

321 {this, "vecPtCutoffsForZ0SinThetaCut", {},
322 "Minimum pt cutoffs for each Z0SinTheta value"};

◆ m_vecvecMaxD0AboveEtaPt

Gaudi::Property<std::vector<std::vector<double> > > InDet::InDetTrackSelectionTool::m_vecvecMaxD0AboveEtaPt
private
Initial value:
{this, "vecvecMaxD0AboveEtaPt", {},
"Maximum D0 value above each eta and pT cutoff"}

Definition at line 331 of file InDetTrackSelectionTool.h.

332 {this, "vecvecMaxD0AboveEtaPt", {},
333 "Maximum D0 value above each eta and pT cutoff"};

◆ m_vecvecMaxSctHolesAboveEtaPt

Gaudi::Property<std::vector<std::vector<double> > > InDet::InDetTrackSelectionTool::m_vecvecMaxSctHolesAboveEtaPt
private
Initial value:
{this, "vecvecMaxSctHolesAboveEtaPt", {},
"Maximum SctHoles value above each eta and pT cutoff"}

Definition at line 341 of file InDetTrackSelectionTool.h.

342 {this, "vecvecMaxSctHolesAboveEtaPt", {},
343 "Maximum SctHoles value above each eta and pT cutoff"};

◆ m_vecvecMaxZ0SinThetaAboveEtaPt

Gaudi::Property<std::vector<std::vector<double> > > InDet::InDetTrackSelectionTool::m_vecvecMaxZ0SinThetaAboveEtaPt
private
Initial value:
{this, "vecvecMaxZ0SinThetaAboveEtaPt", {},
"Maximum Z0SinTheta value above each eta and pT cutoff"}

Definition at line 323 of file InDetTrackSelectionTool.h.

324 {this, "vecvecMaxZ0SinThetaAboveEtaPt", {},
325 "Maximum Z0SinTheta value above each eta and pT cutoff"};

◆ m_vecvecMinSctHitsPlusDeadAboveEtaPt

Gaudi::Property<std::vector<std::vector<double> > > InDet::InDetTrackSelectionTool::m_vecvecMinSctHitsPlusDeadAboveEtaPt
private
Initial value:
{this, "vecvecMinSctHitsPlusDeadAboveEtaPt", {},
"Minimum SctHitsPlusDead value above each eta and pT cutoff"}

Definition at line 351 of file InDetTrackSelectionTool.h.

352 {this, "vecvecMinSctHitsPlusDeadAboveEtaPt", {},
353 "Minimum SctHitsPlusDead value above each eta and pT cutoff"};

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_warnInit

std::atomic_bool InDet::InDetTrackSelectionTool::m_warnInit = false
mutableprivate

Definition at line 110 of file InDetTrackSelectionTool.h.

◆ property

virtual void the cut level is best set through the CutLevel InDet::InDetTrackSelectionTool::property
private

Definition at line 106 of file InDetTrackSelectionTool.h.

◆ s_mapCutLevel

const std::unordered_map< std::string, InDet::CutLevel > InDet::InDetTrackSelectionTool::s_mapCutLevel
staticprivate
Initial value:
=
{
{"NoCut", InDet::CutLevel::NoCut},
{"Loose", InDet::CutLevel::Loose},
{"LoosePrimary", InDet::CutLevel::LoosePrimary},
{"TightPrimary", InDet::CutLevel::TightPrimary},
{"LooseMuon", InDet::CutLevel::LooseMuon},
{"LooseElectron", InDet::CutLevel::LooseElectron},
{"LooseTau", InDet::CutLevel::LooseTau},
{"MinBias", InDet::CutLevel::MinBias},
{"HILoose", InDet::CutLevel::HILoose},
{"HITight", InDet::CutLevel::HITight},
{"HILooseOptimized", InDet::CutLevel::HILooseOptimized},
{"HITightOptimized", InDet::CutLevel::HITightOptimized},
{"HILoosePixMod", InDet::CutLevel::HILoosePixMod}
}

Definition at line 1470 of file InDetTrackSelectionTool.h.

1503 {
1504
1505 class TrackParticleHelper;
1506
1507#ifndef XAOD_ANALYSIS
1508 class TrkTrackHelper;
1509#endif
1510}
1511
1512namespace InDet {
1513
1514 // forward declaration of helper classes
1515 class TrackAccessor;
1516 class TrackCut;
1517
1521 public virtual IInDetTrackSelectionTool,
1522 public asg::AsgTool {
1523
1524 friend class TrackCut;
1525
1527 ASG_TOOL_CLASS2( InDetTrackSelectionTool,
1528 IAsgSelectionTool,
1529 InDet::IInDetTrackSelectionTool )
1530
1531 public:
1533 InDetTrackSelectionTool( const std::string& name );
1534
1535 // The default destructor is OK but it must be defined in the
1536 // implementation file in order to forward declare with unique_ptr
1538
1541
1543 virtual StatusCode initialize() override;
1545 virtual StatusCode finalize() override;
1546
1548
1551
1553 virtual const asg::AcceptInfo& getAcceptInfo() const override;
1554
1556 virtual asg::AcceptData accept( const xAOD::IParticle* ) const override;
1557
1559
1562
1564 virtual asg::AcceptData accept( const xAOD::TrackParticle& track,
1565 const xAOD::Vertex* vertex = nullptr ) const override;
1566
1567#ifndef XAOD_ANALYSIS
1568 virtual asg::AcceptData accept( const Trk::Track& track,
1569 const Trk::Vertex* vertex = nullptr ) const override;
1570#endif
1571
1573
1574 virtual void setCutLevel( InDet::CutLevel level, bool overwrite = true ) override
1575 __attribute__ ((deprecated("For consistency with the athena interface, the cut level is best set through the \"CutLevel\" property.")));
1576
1577 private:
1578 bool m_isInitialized = false; // flag whether or not the tool has been initialized, to check erroneous use cases.
1579 mutable std::atomic_bool m_warnInit = false; // flag to keep track of whether we have warned about a lack of initialization
1580
1581 // this is the setCutLevel function that actually does the work, so that it doesn't warn if called in athena.
1582 void setCutLevelPrivate( InDet::CutLevel level, bool overwrite = true );
1583
1584 // helper method to setup the cut functions for TrackParticles and Trk::Tracks
1585 template <int VERBOSE, class Trk_Helper>
1586 StatusCode setupCuts(std::map< std::string, std::vector< std::function<bool(Trk_Helper helper, const asg::AsgMessaging &msgHelper)> > > &trackCuts);
1587
1588 template <class Trk_Helper>
1589 asg::AcceptData accept(Trk_Helper helper, const std::map< std::string, std::vector< std::function<bool(Trk_Helper helper, const asg::AsgMessaging &msgHelper)> > > &trackCuts) const;
1590
1591 std::unordered_map< std::string, std::shared_ptr<TrackAccessor> > m_trackAccessors;
1592
1593 std::unique_ptr<asg::AsgMessaging> m_msgHelper;
1594 std::map< std::string, std::vector< std::function<bool(InDetAccessor::TrackParticleHelper helper, const asg::AsgMessaging &msgHelper)> > >
1596#ifndef XAOD_ANALYSIS
1597 std::map< std::string, std::vector< std::function<bool(InDetAccessor::TrkTrackHelper helper, const asg::AsgMessaging &msgHelper)> > >
1599#endif
1600
1601 mutable std::atomic<uint64_t> m_numTracksProcessed = 0;
1602 mutable std::atomic<uint64_t> m_numTracksPassed = 0;
1603 mutable std::vector<uint64_t> m_numTracksPassedCuts ATLAS_THREAD_SAFE;
1604 mutable std::mutex m_mutex;
1605
1606 static inline bool maxDoubleIsSet(double cutValue) {return cutValue < InDet::InDetTrackSelectionTool::LOCAL_MAX_DOUBLE && cutValue >= 0.;}
1607 static inline bool maxIntIsSet(int cutValue){return cutValue < InDet::InDetTrackSelectionTool::LOCAL_MAX_INT && cutValue >= 0;}
1608 constexpr static double LOCAL_MAX_DOUBLE = 1.0e16;
1609 constexpr static int LOCAL_MAX_INT = std::numeric_limits<int>::max();
1610
1611 Gaudi::Property<double> m_minPt{this, "minPt", -1., "Minimum transverse momentum"};
1612 Gaudi::Property<double> m_minP{this, "minP", -1., "Minimum momentum"};
1613
1614 Gaudi::Property<double> m_maxAbsEta
1615 {this, "maxAbsEta", LOCAL_MAX_DOUBLE, "Maximum magnitude of pseudorapidity"};
1616 Gaudi::Property<double> m_maxZ0SinTheta
1617 {this, "maxZ0SinTheta", LOCAL_MAX_DOUBLE, "Maximum |z0|*sin(theta)"};
1618 Gaudi::Property<double> m_maxZ0
1619 {this, "maxZ0", LOCAL_MAX_DOUBLE, "Maximum longitudinal separation"};
1620 Gaudi::Property<double> m_maxD0
1621 {this, "maxD0", LOCAL_MAX_DOUBLE, "Maximum transvers separation"};
1622 Gaudi::Property<double> m_maxSigmaD0
1623 {this, "maxSigmaD0", LOCAL_MAX_DOUBLE, "Maximum error on d0"};
1624 Gaudi::Property<double> m_maxSigmaZ0
1625 {this, "maxSigmaZ0", LOCAL_MAX_DOUBLE, "Maximum error on z0"};
1626 Gaudi::Property<double> m_maxSigmaZ0SinTheta
1627 {this, "maxSigmaZ0SinTheta", LOCAL_MAX_DOUBLE, "Maximum error on z0*sin(theta)"};
1628 Gaudi::Property<double> m_maxD0overSigmaD0
1629 {this, "maxD0overSigmaD0", LOCAL_MAX_DOUBLE, "Significance cut on |d0|"};
1630 Gaudi::Property<double> m_maxZ0overSigmaZ0
1631 {this, "maxZ0overSigmaZ0", LOCAL_MAX_DOUBLE, "Significance cut on |z0|"};
1632 Gaudi::Property<double> m_maxZ0SinThetaoverSigmaZ0SinTheta
1633 {this, "maxZ0SinThetaoverSigmaZ0SinTheta", LOCAL_MAX_DOUBLE,
1634 "Significance cut on |z0*sin(theta)|"};
1635
1636 Gaudi::Property<int> m_minNInnermostLayerHits
1637 {this, "minNInnermostLayerHits", -1,
1638 "Required hits on the innermost pixel layer"};
1639 Gaudi::Property<int> m_minNNextToInnermostLayerHits
1640 {this, "minNNextToInnermostLayerHits", -1,
1641 "Required hits on the next to innermost pixel layer"};
1642 Gaudi::Property<int> m_minNBothInnermostLayersHits
1643 {this, "minNBothInnermostLayersHits", -1,
1644 "Required hits on two innermost pixel layers"};
1645 Gaudi::Property<int> m_maxNInnermostLayerSharedHits
1646 {this, "maxNInnermostLayerSharedHits", LOCAL_MAX_INT,
1647 "Maximum shared hits in innermost pixel layer"};
1648 Gaudi::Property<int> m_useMinBiasInnermostLayersCut
1649 {this, "useMinBiasInnermostLayersCut", 0,
1650 "IBL hit if expected, otherwise next layer hit if expected"};
1651 Gaudi::Property<bool> m_useHILoosePixModInnermostLayersCut
1652 {this, "useHILoosePixModInnermostLayersCut", false,
1653 "IBL or next layer hit, otherwise zero expected next layer hits"};
1654 Gaudi::Property<int> m_minNSiHits
1655 {this, "minNSiHits", -1, "Minimum silicon (pixel + SCT) hits"};
1656 Gaudi::Property<int> m_maxNSiSharedHits
1657 {this, "maxNSiSharedHits", LOCAL_MAX_INT,
1658 "Maximum silicon (pixel + SCT) sensors shared with other track"};
1659 Gaudi::Property<int> m_minNSiHitsIfSiSharedHits
1660 {this, "minNSiHitsIfSiSharedHits", -1,
1661 "Minimum number of silicon hits if there are any shared silicon hits"};
1662 Gaudi::Property<int> m_maxNSiHoles
1663 {this, "maxNSiHoles", LOCAL_MAX_INT, "Maximum silicon (pixel + SCT) holes"};
1664 Gaudi::Property<int> m_minNPixelHits
1665 {this, "minNPixelHits", -1, "Required pixel hits"};
1666 Gaudi::Property<int> m_maxNPixelSharedHits
1667 {this, "maxNPixelSharedHits", LOCAL_MAX_INT,
1668 "Maximum pixels shared with other tracks"};
1669 Gaudi::Property<int> m_maxNPixelHoles
1670 {this, "maxNPixelHoles", LOCAL_MAX_INT,
1671 "Maximum number of missed layers in pixel"};
1672
1673 Gaudi::Property<double> m_minEtaForStrictNSiHitsCut
1674 {this, "minEtaForStrictNSiHitsCut", LOCAL_MAX_DOUBLE,
1675 "Eta cutoff for strict silicon hits cut"};
1676 Gaudi::Property<int> m_minNSiHitsAboveEtaCutoff
1677 {this, "minNSiHitsAboveEtaCutoff", -1,
1678 "Minimum silicon hits at large pseudorapidity"};
1679 Gaudi::Property<bool> m_maxOneSharedModule
1680 {this, "maxOneSharedModule", false,
1681 "Allow only 1 shared pixel hit or 2 shared SCT hits, not both"};
1682 Gaudi::Property<bool> m_useEtaDependentMaxChiSq
1683 {this, "useEtaDependentMaxChiSq", false,
1684 "Whether or not to use the eta-dependent chi squared per degree of freedom cut"};
1685
1686 Gaudi::Property<int> m_minNSiHitsPhysical
1687 {this, "minNSiHitsPhysical", -1,
1688 "Minimum physical silicon hits (i.e. dead sensors do not count)"};
1689 Gaudi::Property<int> m_minNPixelHitsPhysical
1690 {this, "minNPixelHitsPhysical", -1, "Minimum physical pixel hits"};
1691 Gaudi::Property<int> m_minNSctHitsPhysical
1692 {this, "minNSctHitsPhysical", -1, "Minimum physical SCT hits"};
1693 Gaudi::Property<int> m_minNSctHits
1694 {this, "minNSctHits", -1, "Minimum SCT hits"};
1695 Gaudi::Property<int> m_maxNSctSharedHits
1696 {this, "maxNSctSharedHits", LOCAL_MAX_INT,
1697 "Maximum SCT hits shared with other track"};
1698 Gaudi::Property<int> m_maxNSctHoles
1699 {this, "maxNSctHoles", LOCAL_MAX_INT, "Maximum SCT holes"};
1700 Gaudi::Property<int> m_maxNSctDoubleHoles
1701 {this, "maxNSctDoubleHoles", LOCAL_MAX_INT, "Maximum SCT double holes"};
1702
1703 Gaudi::Property<double> m_maxTrtEtaAcceptance
1704 {this, "maxTrtEtaAcceptance", LOCAL_MAX_DOUBLE,
1705 "Maximum eta that ignores TRT hit cuts"};
1706 Gaudi::Property<double> m_maxEtaForTrtHitCuts
1707 {this, "maxEtaForTrtHitCuts", -1.,
1708 "Eta above which TRT hit cuts are not applied."};
1709 Gaudi::Property<int> m_minNTrtHits{this, "minNTrtHits", -1, "Minimum TRT hits"};
1710 Gaudi::Property<int> m_minNTrtHitsPlusOutliers
1711 {this, "minNTrtHitsPlusOutliers", -1, "Minimum TRT hits including outliers"};
1712 Gaudi::Property<int> m_minNTrtHighThresholdHits
1713 {this, "minNTrtHighThresholdHits", -1, "Minimum high E TRT hits"};
1714 Gaudi::Property<int> m_minNTrtHighThresholdHitsPlusOutliers
1715 {this, "minNTrtHighThresholdHitsPlusOutliers", -1,
1716 "Minimum high E TRT hits including outliers"};
1717 Gaudi::Property<double> m_maxTrtHighEFraction
1718 {this, "maxTrtHighEFraction", LOCAL_MAX_DOUBLE,
1719 "Maximum TRT hits that are above high energy threshold"};
1720 Gaudi::Property<double> m_maxTrtHighEFractionWithOutliers
1721 {this, "maxTrtHighEFractionWithOutliers", LOCAL_MAX_DOUBLE,
1722 "Maximum TRT hits that are above high energy threshold including outliers"};
1723 Gaudi::Property<double> m_maxTrtOutlierFraction
1724 {this, "maxTrtOutlierFraction", LOCAL_MAX_DOUBLE,
1725 "Maximum fraction of TRT outliers over TRT hits plus outliers"};
1726
1727 Gaudi::Property<double> m_maxChiSq
1728 {this, "maxChiSq", LOCAL_MAX_DOUBLE, "Maximum chi squared"};
1729 Gaudi::Property<double> m_maxChiSqperNdf
1730 {this, "maxChiSqperNdf", LOCAL_MAX_DOUBLE,
1731 "Maximum chi squared per degree of freedom"};
1732 Gaudi::Property<double> m_minProb{this, "minProb", -1., "Minimum p(chi^2, Ndof)"};
1733 Gaudi::Property<double> m_minPtForProbCut
1734 {this, "minPtForProbCut", LOCAL_MAX_DOUBLE,
1735 "Minimum pt for chi-sq probability cut"};
1736 Gaudi::Property<double> m_minProbAbovePtCutoff
1737 {this, "minProbAbovePtCutoff", -1.,
1738 "Minimum chi-sq probability above a pt cutoff"};
1739
1740 Gaudi::Property<int> m_minNUsedHitsdEdx
1741 {this, "minNUsedHitsdEdx", -1, "Minimum hits used for dEdx"};
1742 Gaudi::Property<int> m_minNOverflowHitsdEdx
1743 {this, "minNOverflowHitsdEdx", -1, "Minimum overflow hits in IBL for dEdx"};
1744 Gaudi::Property<bool> m_eProbHTonlyForXe
1745 {this, "eProbHTonlyForXe", false,
1746 "Flag whether to apply the eProbabilityHT cut only when all TRT hits are Xenon"};
1747 Gaudi::Property<double> m_minEProbabilityHT
1748 {this, "minEProbabilityHT", -1.,
1749 "Minimum High Threshold electron probability"};
1750
1751 Gaudi::Property<bool> m_useExperimentalInnermostLayersCut
1752 {this, "useExperimentalInnermostLayersCut", false,
1753 "Use the experimental cut on pixel holes"};
1754
1755#ifndef XAOD_ANALYSIS
1756 Gaudi::Property<int> m_minNSiHitsMod
1757 {this, "minNSiHitsMod", -1,
1758 "Minimum number of Si hits, with pixel hits counting twice"};
1759 Gaudi::Property<int> m_minNSiHitsModTop
1760 {this, "minNSiHitsModTop", -1,
1761 "Min number of Si hits on top half (pixel counting twice)"};
1762 Gaudi::Property<int> m_minNSiHitsModBottom
1763 {this, "minNSiHitsModBottom", -1,
1764 "Min number of Si hits on bottom half (pixel counting twice)"};
1765#endif
1766
1767 Gaudi::Property<std::vector<double>> m_vecEtaCutoffsForSiHitsCut
1768 {this, "vecEtaCutoffsForSiHitsCut", {},
1769 "Minimum eta cutoffs for each Silicon hit cut"};
1770 Gaudi::Property<std::vector<int>> m_vecMinNSiHitsAboveEta
1771 {this, "vecMinNSiHitsAboveEta", {},
1772 "Minimum Silicon hits above each eta cutoff"};
1773 Gaudi::Property<std::vector<double>> m_vecEtaCutoffsForPtCut
1774 {this, "vecEtaCutoffsForPtCut", {}, "Minimum eta cutoffs for each pT cut"};
1775 Gaudi::Property<std::vector<double>> m_vecMinPtAboveEta
1776 {this, "vecMinPtAboveEta", {},
1777 "Minimum transverse momentum above each eta cutoff"};
1778
1779 Gaudi::Property<std::vector<double>> m_vecPtCutoffsForSctHitsCut
1780 {this, "vecPtCutoffsForSctHitsCut", {},
1781 "Minimum pt cutoffs for each SCT hits"};
1782 Gaudi::Property<std::vector<int>> m_vecMinNSctHitsAbovePt
1783 {this, "vecMinNSctHitsAbovePt", {},
1784 "Minimum SCT hits above each pt cutoff"};
1785
1786 Gaudi::Property<std::vector<double>> m_vecEtaCutoffsForZ0SinThetaCut
1787 {this, "vecEtaCutoffsForZ0SinThetaCut", {},
1788 "Minimum eta cutoffs for each Z0SinTheta value"};
1789 Gaudi::Property<std::vector<double>> m_vecPtCutoffsForZ0SinThetaCut
1790 {this, "vecPtCutoffsForZ0SinThetaCut", {},
1791 "Minimum pt cutoffs for each Z0SinTheta value"};
1792 Gaudi::Property<std::vector<std::vector<double>>> m_vecvecMaxZ0SinThetaAboveEtaPt
1793 {this, "vecvecMaxZ0SinThetaAboveEtaPt", {},
1794 "Maximum Z0SinTheta value above each eta and pT cutoff"};
1795
1796 Gaudi::Property<std::vector<double>> m_vecEtaCutoffsForD0Cut
1797 {this, "vecEtaCutoffsForD0Cut", {}, "Minimum eta cutoffs for each D0 value"};
1798 Gaudi::Property<std::vector<double>> m_vecPtCutoffsForD0Cut
1799 {this, "vecPtCutoffsForD0Cut", {}, "Minimum pt cutoffs for each D0 value"};
1800 Gaudi::Property<std::vector<std::vector<double>>> m_vecvecMaxD0AboveEtaPt
1801 {this, "vecvecMaxD0AboveEtaPt", {},
1802 "Maximum D0 value above each eta and pT cutoff"};
1803
1804 Gaudi::Property<std::vector<double>> m_vecEtaCutoffsForSctHolesCut
1805 {this, "vecEtaCutoffsForSctHolesCut", {},
1806 "Minimum eta cutoffs for each SctHoles value"};
1807 Gaudi::Property<std::vector<double>> m_vecPtCutoffsForSctHolesCut
1808 {this, "vecPtCutoffsForSctHolesCut", {},
1809 "Minimum pt cutoffs for each SctHoles value"};
1810 Gaudi::Property<std::vector<std::vector<double>>> m_vecvecMaxSctHolesAboveEtaPt
1811 {this, "vecvecMaxSctHolesAboveEtaPt", {},
1812 "Maximum SctHoles value above each eta and pT cutoff"};
1813
1814 Gaudi::Property<std::vector<double>> m_vecEtaCutoffsForSctHitsPlusDeadCut
1815 {this, "vecEtaCutoffsForSctHitsPlusDeadCut", {},
1816 "Minimum eta cutoffs for each SctHitsPlusDead value"};
1817 Gaudi::Property<std::vector<double>> m_vecPtCutoffsForSctHitsPlusDeadCut
1818 {this, "vecPtCutoffsForSctHitsPlusDeadCut", {},
1819 "Minimum pt cutoffs for each SctHitsPlusDead value"};
1820 Gaudi::Property<std::vector<std::vector<double>>> m_vecvecMinSctHitsPlusDeadAboveEtaPt
1821 {this, "vecvecMinSctHitsPlusDeadAboveEtaPt", {},
1822 "Minimum SctHitsPlusDead value above each eta and pT cutoff"};
1823
1825 asg::AcceptInfo m_acceptInfo;
1826
1827 // to set to a pre-defined cut level in Athena, we need to save the cut level
1828 // as a string so we can do a soft set in initialize()
1829 Gaudi::Property<std::string> m_cutLevel{this, "CutLevel", ""};
1830
1831 // we need a map from strings (for use in Athena) to the CutLevel enum
1832 static const std::unordered_map<std::string, CutLevel> s_mapCutLevel;
1833
1834#ifndef XAOD_ANALYSIS
1835 Gaudi::Property<bool> m_initTrkTools{this, "UseTrkTrackTools", false, "Whether to initialize the Trk::Track tools"};
1836 bool m_trackSumToolAvailable = false;
1837 ToolHandle<Trk::ITrackSummaryTool> m_trackSumTool
1838 {this, "TrackSummaryTool", "Trk::TrackSummaryTool/TrackSummaryTool"};
1839 ToolHandle<Trk::IExtrapolator> m_extrapolator
1840 {this, "Extrapolator", "Trk::Extrapolator/Extrapolator"};
1841
1842#endif // XAOD_ANALYSIS
1843
1844 }; // class InDetTrackSelectionTool
1845
1846} // namespace InDet
1847
1848#endif // INDETTRACKSELECTIONTOOL_INDETTRACKSELECTIONTOOL_H
#define ASG_TOOL_CLASS2(CLASSNAME, INT1, INT2)
__attribute__((always_inline)) inline uint16_t TileCalibDrawerBase
Interface for track selection tool.
Implementation of the track selector tool.
std::unordered_map< std::string, std::shared_ptr< TrackAccessor > > m_trackAccessors
list of the accessors that need to be run for each track
virtual const asg::AcceptInfo & getAcceptInfo() const override
Get an object describing the "selection steps" of the tool.
std::vector< uint64_t > m_numTracksPassedCuts ATLAS_THREAD_SAFE
tracks the number of tracks that passed each cut family.
virtual StatusCode finalize() override
Function finalizing the tool.
virtual StatusCode initialize() override
Function initialising the tool.
ASG_TOOL_CLASS2(InDetTrackSelectionTool, IAsgSelectionTool, InDet::IInDetTrackSelectionTool) public ~InDetTrackSelectionTool()
Create a proper constructor for Athena.
virtual void setCutLevel(InDet::CutLevel level, bool overwrite=true) override __attribute__((deprecated("For consistency with the athena interface
Function to set the cut level within standalone ROOT.
::StatusCode StatusCode
StatusCode definition for legacy code.
AccessorTemplate< TrackDef, CT, ColumnAccessMode::input, CM > TrackAccessor
Definition TrackDef.h:45
Vertex_v1 Vertex
Define the latest version of the vertex class.
setBGCode setTAP setLVL2ErrorBits bool
#define private

The documentation for this class was generated from the following files: