25 template <
unsigned int n_summary_types>
26 std::array<xAOD::SummaryType, n_summary_types> summaryArray( std::array<xAOD::SummaryType, n_summary_types> summary_types) {
return summary_types; }
28 template <
class Trk_Helper,
unsigned int n_summary_types>
31 MinTRTHitsCut(
double maxTrtEtaAcceptance,
32 double maxEtaForTrtHitCuts,
34 std::array<xAOD::SummaryType, n_summary_types> summary_types)
35 : m_maxTrtEtaAcceptance(maxTrtEtaAcceptance),
36 m_maxEtaForTrtHitCuts(maxEtaForTrtHitCuts),
37 m_minNHits(min_n_hits),
38 m_summaryTypes(summary_types)
46 return (absEta <= m_maxTrtEtaAcceptance || absEta > m_maxEtaForTrtHitCuts) || nHits(
helper,msgHelper) >=m_minNHits;
49 double m_maxTrtEtaAcceptance;
50 double m_maxEtaForTrtHitCuts;
52 std::array<xAOD::SummaryType, n_summary_types> m_summaryTypes;
58 unsigned int findBin(
const std::vector<T> &
bins, T
value) {
60 unsigned int bin_i=
bins.size();
67 if (
bins.empty())
return true;
68 for (
unsigned int bin_i=1; bin_i<
bins.size(); ++bin_i) {
69 if (
bins[bin_i-1]>=
bins[bin_i])
return false;
75 InDet::InDetTrackSelectionTool::InDetTrackSelectionTool(
const std::string&
name,
const std::string& cutLevel)
77 , m_acceptInfo(
"InDetTrackSelection" )
78 , m_cutLevel(cutLevel)
80 , m_trackSumTool(
"Trk::TrackSummaryTool/TrackSummaryTool", this)
81 , m_extrapolator(
"Trk::Extrapolator/Extrapolator", this)
88 #ifndef XAOD_STANDALONE
89 declareInterface<IInDetTrackSelectionTool>(
this);
96 declareProperty(
"maxAbsEta", m_maxAbsEta,
"Maximum magnitude of pseudorapidity");
99 declareProperty(
"maxZ0SinTheta", m_maxZ0SinTheta,
"Maximum |z0|*sin(theta)");
102 declareProperty(
"maxSigmaZ0SinTheta", m_maxSigmaZ0SinTheta,
"Maximum error on z0*sin(theta)");
103 declareProperty(
"maxD0overSigmaD0", m_maxD0overSigmaD0,
"Significance cut on |d0|");
104 declareProperty(
"maxZ0overSigmaZ0", m_maxZ0overSigmaZ0,
"Significance cut on |z0|");
106 m_maxZ0SinThetaoverSigmaZ0SinTheta,
107 "Significance cut on |z0*sin(theta)|");
109 "Required hits on the innermost pixel layer");
110 declareProperty(
"minNNextToInnermostLayerHits", m_minNNextToInnermostLayerHits,
111 "Required hits on the next to innermost pixel layer");
112 declareProperty(
"minNBothInnermostLayersHits", m_minNBothInnermostLayersHits,
113 "Required hits on two innermost pixel layers");
114 declareProperty(
"maxNInnermostLayerSharedHits", m_maxNInnermostLayerSharedHits,
115 "Maximum shared hits in innermost pixel layer");
116 declareProperty(
"useMinBiasInnermostLayersCut", m_useMinBiasInnermostLayersCut,
117 "IBL hit if expected, otherwise next layer hit if expected");
118 declareProperty(
"minNSiHits", m_minNSiHits,
"Minimum silicon (pixel + SCT) hits");
120 "Maximum silicon (pixel + SCT) sensors shared with other track");
121 declareProperty(
"minNSiHitsIfSiSharedHits", m_minNSiHitsIfSiSharedHits,
122 "Minimum number of silicon hits if there are any shared silicon hits");
123 declareProperty(
"maxNSiHoles", m_maxNSiHoles,
"Maximum silicon (pixel + SCT) holes");
124 declareProperty(
"minNPixelHits", m_minNPixelHits,
"Required pixel hits");
126 "Maximum pixels shared with other tracks");
128 "Maximum number of missed layers in pixel");
129 declareProperty(
"minEtaForStrictNSiHitsCut", m_minEtaForStrictNSiHitsCut,
130 "Eta cutoff for strict silicon hits cut");
131 declareProperty(
"minNSiHitsAboveEtaCutoff", m_minNSiHitsAboveEtaCutoff,
132 "Minimum silicon hits at large pseudorapidity");
134 "Allow only 1 shared pixel hit or 2 shared SCT hits, not both");
136 "Whether or not to use the eta-dependent chi squared per degree of freedom cut");
138 "Minimum physical silicon hits (i.e. dead sensors do not count)");
140 "Minimum physical pixel hits");
142 "Minimum physical SCT hits");
144 declareProperty(
"maxNSctSharedHits", m_maxNSctSharedHits,
"Maximum SCT hits shared with other track");
146 declareProperty(
"maxNSctDoubleHoles", m_maxNSctDoubleHoles,
"Maximum SCT double holes");
148 "Maximum eta that ignores TRT hit cuts");
149 declareProperty(
"maxEtaForTrtHitCuts", m_maxEtaForTrtHitCuts,
"Eta above which TRT hit cuts are not applied.");
152 "Minimum TRT hits including outliers");
153 declareProperty(
"minNTrtHighThresholdHits", m_minNTrtHighThresholdHits,
154 "Minimum high E TRT hits");
156 m_minNTrtHighThresholdHitsPlusOutliers,
157 "Minimum high E TRT hits including outliers");
159 "Maximum TRT hits that are above high energy threshold");
160 declareProperty(
"maxTrtHighEFractionWithOutliers", m_maxTrtHighEFractionWithOutliers,
161 "Maximum TRT hits that are above high energy threshold including outliers");
163 "Maximum fraction of TRT outliers over TRT hits plus outliers");
167 "Maximum chi squared per degree of freedom");
169 "Minimum pt for chi-sq probability cut");
171 "Minimum chi-sq probability above a pt cutoff");
173 "Minimum hits used for dEdx");
175 "Minimum overflow hits in IBL for dEdx");
177 "Minimum High Threshold electron probability");
179 "Flag whether to apply the eProbabilityHT cut only when all TRT hits are Xenon");
181 declareProperty(
"vecEtaCutoffsForSiHitsCut", m_vecEtaCutoffsForSiHitsCut,
182 "Minimum eta cutoffs for each Silicon hit cut");
183 declareProperty(
"vecMinNSiHitsAboveEta", m_vecMinNSiHitsAboveEta,
"Minimum Silicon hits above each eta cutoff");
185 "Minimum eta cutoffs for each pT cut");
186 declareProperty(
"vecMinPtAboveEta", m_vecMinPtAboveEta,
"Minimum transverse momentum above each eta cutoff");
188 declareProperty(
"vecPtCutoffsForSctHitsCut", m_vecPtCutoffsForSctHitsCut,
189 "Minimum pt cutoffs for each SCT hits");
190 declareProperty(
"vecMinNSctHitsAbovePt", m_vecMinNSctHitsAbovePt,
"Minimum SCT hits above each pt cutoff");
192 declareProperty(
"vecEtaCutoffsForZ0SinThetaCut", m_vecEtaCutoffsForZ0SinThetaCut,
193 "Minimum eta cutoffs for each Z0SinTheta value");
194 declareProperty(
"vecPtCutoffsForZ0SinThetaCut", m_vecPtCutoffsForZ0SinThetaCut,
195 "Minimum pt cutoffs for each Z0SinTheta value");
196 declareProperty(
"vecvecMaxZ0SinThetaAboveEtaPt", m_vecvecMaxZ0SinThetaAboveEtaPt,
"Maximum Z0SinTheta value above each eta and pT cutoff");
199 "Minimum eta cutoffs for each D0 value");
201 "Minimum pt cutoffs for each D0 value");
202 declareProperty(
"vecvecMaxD0AboveEtaPt", m_vecvecMaxD0AboveEtaPt,
"Maximum D0 value above each eta and pT cutoff");
204 declareProperty(
"vecEtaCutoffsForSctHolesCut", m_vecEtaCutoffsForSctHolesCut,
205 "Minimum eta cutoffs for each SctHoles value");
206 declareProperty(
"vecPtCutoffsForSctHolesCut", m_vecPtCutoffsForSctHolesCut,
207 "Minimum pt cutoffs for each SctHoles value");
208 declareProperty(
"vecvecMaxSctHolesAboveEtaPt", m_vecvecMaxSctHolesAboveEtaPt,
"Maximum SctHoles value above each eta and pT cutoff");
210 declareProperty(
"vecEtaCutoffsForSctHitsPlusDeadCut", m_vecEtaCutoffsForSctHitsPlusDeadCut,
211 "Minimum eta cutoffs for each SctHitsPlusDead value");
212 declareProperty(
"vecPtCutoffsForSctHitsPlusDeadCut", m_vecPtCutoffsForSctHitsPlusDeadCut,
213 "Minimum pt cutoffs for each SctHitsPlusDead value");
214 declareProperty(
"vecvecMinSctHitsPlusDeadAboveEtaPt", m_vecvecMinSctHitsPlusDeadAboveEtaPt,
"Minimum SctHitsPlusDead value above each eta and pT cutoff");
216 declareProperty(
"useExperimentalInnermostLayersCut", m_useExperimentalInnermostLayersCut,
"Use the experimental cut on pixel holes");
217 #ifndef XAOD_ANALYSIS
230 InDet::InDetTrackSelectionTool::~InDetTrackSelectionTool() =
default;
244 ATH_MSG_ERROR(
"Tool has already been initialized. This is illegitimate." );
245 ATH_MSG_ERROR(
"This call to initialize() will do nothing." );
246 return StatusCode::SUCCESS;
255 std::unordered_map<std::string, InDet::CutLevel>::const_iterator it_mapCutLevel =
s_mapCutLevel.find(
m_cutLevel);
257 ATH_MSG_ERROR(
"The string \"" <<
m_cutLevel <<
"\" is not recognized as a cut level. No cuts will be changed." );
263 ATH_MSG_DEBUG(
"Cut level set to \"" << it_mapCutLevel->first <<
"\"." );
264 ATH_MSG_DEBUG(
"This will not overwrite other cuts that have been set.");
269 #ifndef XAOD_ANALYSIS
283 #endif // XAOD_ANALYSIS
286 m_msgHelper = std::make_unique<asg::AsgMessaging>(
this) ;
289 #ifndef XAOD_ANALYSIS
298 const std::string& cutFamilyName = cutFamily.first;
300 m_numTracksPassedCuts.push_back(0);
301 if (
m_acceptInfo.
addCut( cutFamilyName,
"Selection of tracks according to " + cutFamilyName ) < 0) {
302 ATH_MSG_ERROR(
"Failed to add cut family " << cutFamilyName <<
" because the TAccept object is full." );
303 return StatusCode::FAILURE;
310 return StatusCode::SUCCESS;
314 template <
typename T>
315 inline T
sqr(T
a) {
return a *
a;}
317 template <
int VERBOSE,
class Trk_Helper>
394 return sqr(
z0*sinTheta) <=
420 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" (If a layer has no hits but one is not expected, the" );
421 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" number of hits in that layer will be taken to be 1.)" );
423 ATH_MSG_WARNING(
"A value of minNBothInnermostLayersHits above 2 does not make sense." );
431 >= minNBothInnermostLayersHits);
435 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" An innermost layer hit is required if expected, otherwise" );
436 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" a next-to-innermost layer hit is required if it is expected." );
457 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical pixel hits (i.e. dead sensors do not count): "
482 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical SCT hits (i.e. dead sensors do not count): "
516 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical silicon hits (i.e. dead sensors do not count): "
544 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum silicon hits if the track has shared hits: "
560 return std::abs(
helper.eta(msgHelper)) <= minEtaForStrictNSiHitsCut
568 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." );
576 #ifndef XAOD_ANALYSIS
578 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum modified Si hits (2*pix + sct) (does not include dead sensors)= "
594 return top >= minNSiHitsModTop && bottom >= minNSiHitsModBottom;
612 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold: "
618 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold including outliers: "
624 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits outside eta acceptance: "
630 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
636 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits above eta acceptance including outliers: "
642 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
647 if (m_maxTrtOutlierFraction < 1. && m_maxTrtOutlierFraction >= 0.) {
654 return ( absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
662 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Using pre-defined eta-dependent maximum chi squared (no longer recommended)." );
667 if (std::abs(
eta) < 1.9) {
668 return fit_chi_square <= fit_ndof * ( 4.4 + 0.32*
sqr(
eta) );
671 return fit_chi_square <= fit_ndof * ( 26.9 - 19.6978*std::abs(
eta) + 4.4534*
sqr(
eta) );
698 return helper.pt(msgHelper) <= minPtForProbCut
719 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" (only applied on tracks where all TRT hits are Xenon)" );
735 ATH_MSG_ERROR(
"Eta cutoffs and Silicon hit cuts must be vectors of the same length." );
736 return StatusCode::FAILURE;
739 for (
size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
747 return StatusCode::FAILURE;
754 double abs_eta = std::abs(
helper.eta(msgHelper));
755 unsigned int bin_i = findBin(*p_vecEtaCutoffsForSiHitsCut, abs_eta);
756 return bin_i >= p_vecMinNSiHitsAboveEta->size()
768 ATH_MSG_ERROR(
"Eta cutoffs and pT cuts must be vectors of the same length." );
769 return StatusCode::FAILURE;
772 for (
size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
780 return StatusCode::FAILURE;
786 double abs_eta = std::abs(
helper.eta(msgHelper));
787 unsigned int bin_i = findBin(*p_vecEtaCutoffsForPtCut, abs_eta);
788 return bin_i >= p_vecMinPtAboveEta->size() || abs_eta > 5.0 ||
helper.pt(msgHelper) >= (*p_vecMinPtAboveEta)[bin_i];
795 ATH_MSG_ERROR(
"Pt cutoffs and SCT hit cuts must be vectors of the same length." );
796 return StatusCode::FAILURE;
799 for (
size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
807 return StatusCode::FAILURE;
814 unsigned int bin_i = findBin(*p_vecPtCutoffsForSctHitsCut,
pt);
815 return bin_i >= p_vecPtCutoffsForSctHitsCut->size()
827 ATH_MSG_ERROR(
"Eta cutoffs and Z0SinTheta cuts must be vectors of the same length." );
828 return StatusCode::FAILURE;
830 for (
size_t i_size=0; i_size<etaSize-1; ++i_size) {
832 ATH_MSG_ERROR(
"Pt cutoffs and Z0SinTheta cuts must be vectors of the same length." );
833 return StatusCode::FAILURE;
837 std::stringstream pTRangeBuffer;
839 std::string pTString=pTRangeBuffer.str();
840 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"Z0SinTheta cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
841 for (
size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
843 std::stringstream etaRangeBuffer;
846 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
848 std::stringstream cutBuffer;
857 return StatusCode::FAILURE;
861 return StatusCode::FAILURE;
868 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForZ0SinThetaCut, std::fabs(
eta));
870 unsigned int bin_pt = findBin(*p_vecPtCutoffsForZ0SinThetaCut,
pt);
871 return bin_eta >= p_vecEtaCutoffsForZ0SinThetaCut->size()
872 || bin_pt >= p_vecPtCutoffsForZ0SinThetaCut->size()
873 || std::fabs(
helper.z0(msgHelper) *
std::sin(
helper.theta(msgHelper))) <= (*p_vecvecMaxZ0SinThetaAboveEtaPt)[bin_eta][bin_pt];
883 ATH_MSG_ERROR(
"Eta cutoffs and D0 cuts must be vectors of the same length." );
884 return StatusCode::FAILURE;
886 for (
size_t i_size=0; i_size<etaSize-1; ++i_size) {
888 ATH_MSG_ERROR(
"Pt cutoffs and D0 cuts must be vectors of the same length." );
889 return StatusCode::FAILURE;
893 std::stringstream pTRangeBuffer;
895 std::string pTString=pTRangeBuffer.str();
896 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"D0 cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
897 for (
size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
899 std::stringstream etaRangeBuffer;
900 etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_vecEtaCutoffsForD0Cut.at(i_cut_eta) <<
" < |#eta| < ";
901 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_vecEtaCutoffsForD0Cut.at(i_cut_eta+1);
902 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
904 std::stringstream cutBuffer;
913 return StatusCode::FAILURE;
917 return StatusCode::FAILURE;
924 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForD0Cut, std::fabs(
eta));
926 unsigned int bin_pt = findBin(*p_vecPtCutoffsForD0Cut,
pt);
927 return bin_eta >= p_vecEtaCutoffsForD0Cut->size()
928 || bin_pt >= p_vecPtCutoffsForD0Cut->size()
929 || std::fabs(
helper.d0(msgHelper)) <= (*p_vecvecMaxD0AboveEtaPt)[bin_eta][bin_pt];
939 ATH_MSG_ERROR(
"Eta cutoffs and SctHoles cuts must be vectors of the same length." );
940 return StatusCode::FAILURE;
942 for (
size_t i_size=0; i_size<etaSize-1; ++i_size) {
944 ATH_MSG_ERROR(
"Pt cutoffs and SctHoles cuts must be vectors of the same length." );
945 return StatusCode::FAILURE;
949 std::stringstream pTRangeBuffer;
951 std::string pTString=pTRangeBuffer.str();
952 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"SctHoles cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
953 for (
size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
955 std::stringstream etaRangeBuffer;
958 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
960 std::stringstream cutBuffer;
969 return StatusCode::FAILURE;
973 return StatusCode::FAILURE;
980 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForSctHolesCut, std::fabs(
eta));
982 unsigned int bin_pt = findBin(*p_vecPtCutoffsForSctHolesCut,
pt);
983 return bin_eta >= p_vecEtaCutoffsForSctHolesCut->size()
984 || bin_pt >= p_vecPtCutoffsForSctHolesCut->size()
995 ATH_MSG_ERROR(
"Eta cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
996 return StatusCode::FAILURE;
998 for (
size_t i_size=0; i_size<etaSize-1; ++i_size) {
1000 ATH_MSG_ERROR(
"Pt cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
1001 return StatusCode::FAILURE;
1005 std::stringstream pTRangeBuffer;
1007 std::string pTString=pTRangeBuffer.str();
1008 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"SctHitsPlusDead cuts (>=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
1009 for (
size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
1011 std::stringstream etaRangeBuffer;
1014 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
1016 std::stringstream cutBuffer;
1025 return StatusCode::FAILURE;
1029 return StatusCode::FAILURE;
1036 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForSctHitsPlusDeadCut, std::fabs(
eta));
1038 unsigned int bin_pt = findBin(*p_vecPtCutoffsForSctHitsPlusDeadCut,
pt);
1039 return bin_eta >= p_vecEtaCutoffsForSctHitsPlusDeadCut->size()
1040 || bin_pt >= p_vecPtCutoffsForSctHitsPlusDeadCut->size()
1045 return StatusCode::SUCCESS;
1049 template <
class Trk_Helper>
1051 const std::map< std::string, std::vector< std::function<
bool(Trk_Helper
helper,
const asg::AsgMessaging &msgHelper)> > > &trackCuts)
const {
1054 ATH_MSG_WARNING(
"Tool is not initialized! Calling accept() will not be very helpful." );
1060 bool passAll =
true;
1063 UShort_t cutFamilyIndex = 0;
1064 for (
const auto& cutFamily : trackCuts ) {
1067 for (
const auto&
cut : cutFamily.second ) {
1082 std::lock_guard<std::mutex> lock(
m_mutex);
1083 for (
unsigned int idx=0;
idx < trackCuts.size(); ++
idx) {
1084 assert(
idx<m_numTracksPassedCuts.size());
1099 ATH_MSG_ERROR(
"You are attempting to finalize a tool that has not been initialized()." );
1102 #ifdef XAOD_ANALYSIS
1104 ATH_MSG_INFO(
"No tracks processed in selection tool." );
1105 return StatusCode::SUCCESS;
1115 << cutFamily.first <<
" cut." );
1119 return StatusCode::SUCCESS;
1150 ATH_MSG_ERROR(
"accept(...) Function received a non-track" );
1158 return accept( *trk,
nullptr );
1201 #ifndef XAOD_ANALYSIS
1224 if ( perigee ==
nullptr || !perigee->covariance() ) {
1225 ATH_MSG_WARNING(
"Track preselection: Zero pointer to parameterbase* received (most likely a track without perigee). This track will not pass any cuts." );
1229 std::unique_ptr<const Trk::TrackParameters> paramsAtVertex;
1238 track.info().particleHypothesis());
1239 perigee = paramsAtVertex.get();
1242 if ( perigee ==
nullptr || !perigee->covariance() ) {
1243 ATH_MSG_INFO(
"Track preselection: cannot make a measured perigee. This track will not pass any cuts." );
1245 ATH_MSG_INFO(
"The user should set \"UseTrkTrackTools\" to true if they want the extrapolation tool to try to get a perigee." );
1250 std::unique_ptr<Trk::TrackSummary> cleanup_summary;
1254 summary = cleanup_summary.get();
1257 ATH_MSG_INFO(
"Track preselection: cannot get a track summary. This track will not pass any cuts." );
1259 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." );
1268 #endif // XAOD_ANALYSIS
1286 #pragma GCC diagnostic push
1287 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
1291 #ifndef XAOD_STANDALONE
1292 ATH_MSG_WARNING(
"InDetTrackSelectionTool::setCutLevel() is not designed to be called manually in Athena." );
1293 ATH_MSG_WARNING(
"It may not behave as intended. Instead, configure it in the job options through the CutLevel property." );
1294 #endif // XAOD_STANDALONE
1301 #pragma GCC diagnostic pop
1311 ATH_MSG_WARNING(
"Trying to set cut level while the tool is already initialized." );
1312 ATH_MSG_WARNING(
"This will almost certainly not exhibit intended behavior." );
1371 #ifndef XAOD_ANALYSIS
1405 case CutLevel::LoosePrimary :
1414 case CutLevel::TightPrimary :
1425 case CutLevel::LooseMuon :
1435 case CutLevel::LooseElectron :
1440 case CutLevel::LooseTau :
1448 case CutLevel::MinBias :
1462 case CutLevel::HILoose:
1476 case CutLevel::HITight:
1492 case CutLevel::HILooseOptimized:
1502 2000, 2500, 3000, 5000, 8000, 12000};
1503 m_vecvecMaxZ0SinThetaAboveEtaPt = {{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},
1504 {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},
1505 {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},
1506 {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}};
1513 2000, 2500, 3000, 5000, 8000, 12000};
1514 m_vecvecMaxD0AboveEtaPt = {{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},
1515 {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},
1516 {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},
1517 {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}};
1520 case CutLevel::HITightOptimized:
1530 2000, 2500, 3000, 5000, 8000, 12000};
1531 m_vecvecMaxZ0SinThetaAboveEtaPt = {{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},
1532 {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},
1533 {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},
1534 {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}};
1541 2000, 2500, 3000, 5000, 8000, 12000};
1542 m_vecvecMaxD0AboveEtaPt = {{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},
1543 {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},
1544 {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},
1545 {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}};
1552 2000, 2500, 3000, 5000, 8000, 12000};
1553 m_vecvecMaxSctHolesAboveEtaPt = {{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1},
1554 {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
1555 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
1556 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};
1563 2000, 2500, 3000, 5000, 8000, 12000};
1564 m_vecvecMinSctHitsPlusDeadAboveEtaPt = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1565 {0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, 0},
1566 {8, 8, 8, 7, 7, 6, 6, 6, 6, 6, 0, 0, 0},
1567 {7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
1571 ATH_MSG_ERROR(
"CutLevel not recognized. Cut selection will remain unchanged.");
1577 const std::unordered_map<std::string, InDet::CutLevel>
1582 {
"LoosePrimary", InDet::CutLevel::LoosePrimary},
1583 {
"TightPrimary", InDet::CutLevel::TightPrimary},
1584 {
"LooseMuon", InDet::CutLevel::LooseMuon},
1585 {
"LooseElectron", InDet::CutLevel::LooseElectron},
1586 {
"LooseTau", InDet::CutLevel::LooseTau},
1587 {
"MinBias", InDet::CutLevel::MinBias},
1588 {
"HILoose", InDet::CutLevel::HILoose},
1589 {
"HITight", InDet::CutLevel::HITight},
1590 {
"HILooseOptimized", InDet::CutLevel::HILooseOptimized},
1591 {
"HITightOptimized", InDet::CutLevel::HITightOptimized}