184 trackCuts[
"Pt"].push_back( [minPt =
m_minPt](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) ->
bool {
return helper.pt(msgHelper) >= minPt; } );
188 trackCuts[
"Eta"].push_back( [maxAbsEta =
m_maxAbsEta](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
return std::abs(helper.eta(msgHelper)) <= maxAbsEta; } );
192 trackCuts[
"P"].push_back( [maxInvP = 1./
m_minP](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
return std::abs(helper.qOverP(msgHelper)) <= maxInvP; } );
196 trackCuts[
"D0"].push_back( [maxD0 =
m_maxD0](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
return std::abs(helper.d0(msgHelper)) <= maxD0; } );
200 trackCuts[
"Z0"].push_back( [maxZ0 =
m_maxZ0](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
return std::abs(helper.z0(msgHelper)) <= maxZ0; } );
205 return std::abs( helper.z0(msgHelper) * std::sin(helper.theta(msgHelper))) <= maxZ0SinTheta;
211 return getDefiningParametersCov(helper,msgHelper, InDetAccessor::d0,InDetAccessor::d0) <= maxSigmaD0Squared;
217 return getDefiningParametersCov(helper,msgHelper, InDetAccessor::z0,InDetAccessor::z0) <= maxSigmaZ0Squared;
221 if constexpr(VERBOSE>0)
ATH_MSG_INFO(
" Maximum uncertainty on z0*sin(theta): "
224 double theta = helper.theta(msgHelper);
225 double sinTheta = std::sin(theta);
226 double cosTheta = std::cos(theta);
227 double z0 = helper.z0(msgHelper);
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;
237 return sqr(helper.d0(msgHelper)) <= maxD0overSigmaD0Squared * getDefiningParametersCov(helper,msgHelper, InDetAccessor::d0,InDetAccessor::d0);
243 return sqr(helper.z0(msgHelper)) <= maxZ0overSigmaZ0Squared * getDefiningParametersCov(helper,msgHelper, InDetAccessor::z0,InDetAccessor::z0);
247 if constexpr(VERBOSE>0)
ATH_MSG_INFO(
" Maximum significance on z0*sin(theta): "
251 double theta = helper.theta(msgHelper);
252 double sinTheta = std::sin(theta);
253 double cosTheta = std::cos(theta);
254 double z0 = helper.z0(msgHelper);
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));
266 if constexpr(VERBOSE>0)
ATH_MSG_INFO(
" (Track will pass if no hit is expected.)" );
268 return ( getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerHits) >= minNInnermostLayerHits
269 || getSummary(helper, msgHelper, xAOD::expectInnermostPixelLayerHit) == 0);
274 if constexpr(VERBOSE>0)
ATH_MSG_INFO(
" (Track will pass if no hit is expected.)" );
276 return ( getSummary(helper, msgHelper, xAOD::numberOfNextToInnermostPixelLayerHits) >= minNNextToInnermostLayerHits
277 || getSummary(helper, msgHelper, xAOD::expectNextToInnermostPixelLayerHit) == 0);
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." );
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);
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) {
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) {
319 return getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerSharedHits) <= maxNInnermostLayerSharedHits;
325 return getSummarySum<2,Trk_Helper>(helper, msgHelper, {xAOD::numberOfPixelHits,xAOD::numberOfPixelDeadSensors}) >= minNPixelHits;
328 if (m_minNPixelHitsPhysical > 0) {
329 if constexpr(VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical pixel hits (i.e. dead sensors do not count): "
330 << m_minNPixelHitsPhysical );
331 trackCuts[
"PixelHits"].push_back([minNPixelHitsPhysical = m_minNPixelHitsPhysical.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
332 return getSummary(helper, msgHelper, xAOD::numberOfPixelHits) >= minNPixelHitsPhysical;
335 if (maxIntIsSet(m_maxNPixelHoles)) {
336 if constexpr(VERBOSE>0)
ATH_MSG_INFO(
" Maximum pixel holes: " << m_maxNPixelHoles );
337 trackCuts[
"PixelHits"].push_back([maxNPixelHoles = m_maxNPixelHoles.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
338 return getSummary(helper, msgHelper, xAOD::numberOfPixelHoles) <= maxNPixelHoles;
341 if (maxIntIsSet(m_maxNPixelSharedHits)) {
342 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum pixel shared hits: " << m_maxNPixelSharedHits );
343 trackCuts[
"PixelHits"].push_back([maxNPixelSharedHits = m_maxNPixelSharedHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
344 return getSummary(helper, msgHelper, xAOD::numberOfPixelSharedHits) <= maxNPixelSharedHits;
347 if (m_minNSctHits > 0) {
349 trackCuts[
"SctHits"].push_back( [minNSctHits = m_minNSctHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
350 return getSummarySum<2,Trk_Helper>(helper, msgHelper, {xAOD::numberOfSCTHits, xAOD::numberOfSCTDeadSensors}) >= minNSctHits;
353 if (m_minNSctHitsPhysical > 0) {
354 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical SCT hits (i.e. dead sensors do not count): "
355 << m_minNSctHitsPhysical );
357 trackCuts[
"SctHits"].push_back([minNSctHitsPhysical = m_minNSctHitsPhysical.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
358 return getSummary(helper, msgHelper, xAOD::numberOfSCTHits) >= minNSctHitsPhysical;
361 if (maxIntIsSet(m_maxNSctHoles)) {
363 trackCuts[
"SctHits"].push_back([maxNSctHoles = m_maxNSctHoles.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
364 return getSummary(helper, msgHelper, xAOD::numberOfSCTHoles) <= maxNSctHoles;
367 if (maxIntIsSet(m_maxNSctSharedHits)) {
368 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum SCT shared hits: " << m_maxNSctSharedHits );
369 trackCuts[
"SctHits"].push_back([maxNSctSharedHits = m_maxNSctSharedHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
370 return getSummary(helper, msgHelper, xAOD::numberOfSCTSharedHits) <= maxNSctSharedHits;
373 if (maxIntIsSet(m_maxNSctDoubleHoles)) {
374 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum SCT double holes: " << m_maxNSctDoubleHoles );
375 trackCuts[
"SctHits"].push_back([maxNSctDoubleHoles = m_maxNSctDoubleHoles.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
376 return getSummary(helper, msgHelper, xAOD::numberOfSCTDoubleHoles) <= maxNSctDoubleHoles ;
379 if (m_minNSiHits > 0) {
380 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum silicon (pixel + SCT) hits: " << m_minNSiHits );
381 trackCuts[
"SiHits"].push_back([minNSiHits = m_minNSiHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
382 return getSummarySum<4,Trk_Helper>(helper, msgHelper, {xAOD::numberOfPixelHits,
383 xAOD::numberOfSCTHits,
384 xAOD::numberOfPixelDeadSensors,
385 xAOD::numberOfSCTDeadSensors} ) >= minNSiHits ;
388 if (m_minNSiHitsPhysical > 0) {
389 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical silicon hits (i.e. dead sensors do not count): "
390 << m_minNSiHitsPhysical );
391 trackCuts[
"SiHits"].push_back([minNSiHitsPhysical = m_minNSiHitsPhysical.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
392 return getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHits, xAOD::numberOfSCTHits} ) >= minNSiHitsPhysical ;
395 if (maxIntIsSet(m_maxNSiHoles)) {
397 trackCuts[
"SiHits"].push_back([maxNSiHoles = m_maxNSiHoles.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
398 return getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHoles, xAOD::numberOfSCTHoles} ) <= maxNSiHoles ;
401 if (maxIntIsSet(m_maxNSiSharedHits)) {
402 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum silicon shared hits: " << m_maxNSiSharedHits );
403 trackCuts[
"SiHits"].push_back([maxNSiSharedHits = m_maxNSiSharedHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
404 return getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelSharedHits, xAOD::numberOfSCTSharedHits} ) <= maxNSiSharedHits ;
407 if (m_maxOneSharedModule) {
411 trackCuts[
"SiHits"].push_back([](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
416 if (m_minNSiHitsIfSiSharedHits > 0) {
417 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum silicon hits if the track has shared hits: "
418 << m_minNSiHitsIfSiSharedHits );
419 trackCuts[
"SiHits"].push_back([minNSiHitsIfSiSharedHits = m_minNSiHitsIfSiSharedHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
420 return getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelSharedHits, xAOD::numberOfSCTSharedHits} ) == 0
427 if (maxDoubleIsSet(m_minEtaForStrictNSiHitsCut)
428 && m_minNSiHitsAboveEtaCutoff > 0) {
430 <<
" silicon hits above eta = " << m_minEtaForStrictNSiHitsCut );
431 trackCuts[
"SiHits"].push_back([minEtaForStrictNSiHitsCut = m_minEtaForStrictNSiHitsCut.value(),
432 minNSiHitsAboveEtaCutoff = m_minNSiHitsAboveEtaCutoff.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
433 return std::abs(helper.eta(msgHelper)) <= minEtaForStrictNSiHitsCut
434 || getSummarySum<4,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHits,
435 xAOD::numberOfSCTHits,
436 xAOD::numberOfPixelDeadSensors,
437 xAOD::numberOfSCTDeadSensors}) >= minNSiHitsAboveEtaCutoff;
440 if (m_useExperimentalInnermostLayersCut) {
441 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." );
442 trackCuts[
"PixHits"].push_back([](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
450 if (m_minNSiHitsMod > 0) {
451 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum modified Si hits (2*pix + sct) (does not include dead sensors)= "
452 << m_minNSiHitsMod );
453 trackCuts[
"SiHits"].push_back([minNSiHitsMod = m_minNSiHitsMod.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
454 return getSummarySum<3,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHits,
455 xAOD::numberOfPixelHits,
456 xAOD::numberOfSCTHits}) >= minNSiHitsMod;
459 if (m_minNSiHitsModTop > 0 || m_minNSiHitsModBottom > 0) {
461 << m_minNSiHitsModTop );
463 << m_minNSiHitsModBottom );
464 trackCuts[
"SiHits"].push_back([minNSiHitsModTop = m_minNSiHitsModTop.value(),
465 minNSiHitsModBottom = m_minNSiHitsModBottom](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
466 auto [top,bottom] = getSiHitsTopBottom(helper, msgHelper);
467 return top >= minNSiHitsModTop && bottom >= minNSiHitsModBottom;
471 if (m_maxEtaForTrtHitCuts > 0. && m_maxTrtEtaAcceptance < m_maxEtaForTrtHitCuts) {
472 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" -- TRT hit cuts applied above eta = " << m_maxTrtEtaAcceptance
473 <<
" and below eta = " << m_maxEtaForTrtHitCuts <<
" --" );
474 if (m_minNTrtHits > 0) {
475 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance: " << m_minNTrtHits );
476 trackCuts[
"TrtHits"].push_back( MinTRTHitsCut<Trk_Helper,1>( m_maxTrtEtaAcceptance, m_maxEtaForTrtHitCuts, m_minNTrtHits,
479 if (m_minNTrtHitsPlusOutliers > 0) {
480 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance including outliers: " << m_minNTrtHitsPlusOutliers );
481 trackCuts[
"TrtHits"].push_back( MinTRTHitsCut<Trk_Helper,2>( m_maxTrtEtaAcceptance,m_maxEtaForTrtHitCuts, m_minNTrtHitsPlusOutliers,
484 if (m_minNTrtHighThresholdHits > 0) {
485 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold: "
486 << m_minNTrtHighThresholdHits );
487 trackCuts[
"TrtHits"].push_back( MinTRTHitsCut<Trk_Helper,1>( m_maxTrtEtaAcceptance,m_maxEtaForTrtHitCuts, m_minNTrtHighThresholdHits,
490 if (m_minNTrtHighThresholdHitsPlusOutliers > 0) {
491 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold including outliers: "
492 << m_minNTrtHighThresholdHitsPlusOutliers );
493 trackCuts[
"TrtHits"].push_back( MinTRTHitsCut<Trk_Helper,2>( m_maxTrtEtaAcceptance,m_maxEtaForTrtHitCuts, m_minNTrtHighThresholdHitsPlusOutliers,
496 if (maxDoubleIsSet(m_maxTrtHighEFraction)) {
497 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits outside eta acceptance: "
498 << m_maxTrtHighEFraction);
499 trackCuts[
"TrtHits"].push_back([maxTrtEtaAcceptance = m_maxTrtEtaAcceptance.value(),
500 maxEtaForTrtHitCuts = m_maxEtaForTrtHitCuts.value(),
501 maxTrtHighEFraction = m_maxTrtHighEFraction.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
502 double absEta = std::abs( helper.eta( msgHelper) );
503 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
504 || getSummary(helper, msgHelper,xAOD::numberOfTRTHighThresholdHits )
505 <= maxTrtHighEFraction * getSummary(helper, msgHelper,xAOD::numberOfTRTHits );
508 if (maxDoubleIsSet(m_maxTrtHighEFractionWithOutliers)) {
509 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits above eta acceptance including outliers: "
510 << m_maxTrtHighEFractionWithOutliers);
511 trackCuts[
"TrtHits"].push_back([maxTrtEtaAcceptance = m_maxTrtEtaAcceptance.value(),
512 maxEtaForTrtHitCuts = m_maxEtaForTrtHitCuts.value(),
513 maxTrtHighEFractionWithOutliers = m_maxTrtHighEFractionWithOutliers.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
514 double absEta = std::abs( helper.eta( msgHelper) );
515 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
516 || ( getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfTRTHighThresholdHits, xAOD::numberOfTRTHighThresholdOutliers} ))
520 if (m_maxTrtOutlierFraction < 1. && m_maxTrtOutlierFraction >= 0.) {
521 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum fraction of TRT hits that are outliers: " << m_maxTrtOutlierFraction );
522 trackCuts[
"TrtHits"].push_back([maxTrtEtaAcceptance = m_maxTrtEtaAcceptance.value(),
523 maxEtaForTrtHitCuts = m_maxEtaForTrtHitCuts.value(),
524 maxTrtOutlierFraction = m_maxTrtOutlierFraction.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
525 double absEta = std::abs( helper.eta( msgHelper) );
526 uint8_t trt_outliers = getSummary(helper, msgHelper,xAOD::numberOfTRTOutliers );
527 return ( absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
528 || trt_outliers <= maxTrtOutlierFraction * ( trt_outliers + getSummary(helper, msgHelper,xAOD::numberOfTRTHits) );
534 if (m_useEtaDependentMaxChiSq) {
535 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Using pre-defined eta-dependent maximum chi squared (no longer recommended)." );
536 trackCuts[
"FitQuality"].push_back([](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
539 double fit_ndof =
getFitNDoF(helper,msgHelper);
540 if (std::abs(
eta) < 1.9) {
541 return fit_chi_square <= fit_ndof * ( 4.4 + 0.32*
sqr(
eta) );
544 return fit_chi_square <= fit_ndof * ( 26.9 - 19.6978*std::abs(
eta) + 4.4534*
sqr(
eta) );
548 if (maxDoubleIsSet(m_maxChiSq)) {
550 trackCuts[
"FitQuality"].push_back([maxChiSq = m_maxChiSq.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
551 return getFitChiSquare(helper,msgHelper) <= maxChiSq;
554 if (maxDoubleIsSet(m_maxChiSqperNdf)) {
555 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum chi squared per degree of freedom: " << m_maxChiSqperNdf );
556 trackCuts[
"FitQuality"].push_back([maxChiSqperNdf = m_maxChiSqperNdf.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
557 return getFitChiSquare(helper,msgHelper) <= maxChiSqperNdf * getFitNDoF(helper,msgHelper);
560 if (m_minProb > 0.) {
562 trackCuts[
"FitQuality"].push_back([minProb = m_minProb.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
563 return TMath::Prob( getFitChiSquare(helper,msgHelper),getFitNDoF(helper,msgHelper)) >= minProb;
566 if (maxDoubleIsSet(m_minPtForProbCut) && m_minProbAbovePtCutoff > 0.) {
567 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum chi-sq probability of " << m_minProbAbovePtCutoff
568 <<
" above pt of " << m_minPtForProbCut*1e-3 <<
" GeV." );
569 trackCuts[
"FitQuality"].push_back([minPtForProbCut = m_minPtForProbCut.value(),
570 minProbAbovePtCutoff = m_minProbAbovePtCutoff.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
571 return helper.pt(msgHelper) <= minPtForProbCut
572 || TMath::Prob( getFitChiSquare(helper,msgHelper),getFitNDoF(helper,msgHelper)) >= minProbAbovePtCutoff;
577 if (m_minNUsedHitsdEdx > 0) {
578 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum used hits for dEdx: " << m_minNUsedHitsdEdx );
579 trackCuts[
"dEdxHits"].push_back([minNUsedHitsdEdx = m_minNUsedHitsdEdx.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
580 return getNumberOfUsedHitsdEdx(helper,msgHelper) >= minNUsedHitsdEdx;
583 if (m_minNOverflowHitsdEdx > 0) {
584 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum IBL overflow hits for dEdx: " << m_minNOverflowHitsdEdx );
585 trackCuts[
"dEdxHits"].push_back([minNOverflowHitsdEdx = m_minNOverflowHitsdEdx.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
586 return getNumberOfIBLOverflowsdEdx(helper,msgHelper) >= minNOverflowHitsdEdx;
589 if (m_minEProbabilityHT > 0) {
590 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum high threshold electron probability: " << m_minEProbabilityHT );
591 if (m_eProbHTonlyForXe) {
592 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" (only applied on tracks where all TRT hits are Xenon)" );
593 trackCuts[
"eProbHT"].push_back([minEProbabilityHT = m_minEProbabilityHT.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
594 return getSummarySum<2,Trk_Helper>(helper, msgHelper, {xAOD::numberOfTRTHits, xAOD::numberOfTRTOutliers})
599 trackCuts[
"eProbHT"].push_back([minEProbabilityHT = m_minEProbabilityHT.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
600 return getEProbabilityHT(helper,msgHelper) >= minEProbabilityHT;
605 if (!m_vecEtaCutoffsForSiHitsCut.empty() || !m_vecMinNSiHitsAboveEta.empty()) {
606 auto cutSize = m_vecEtaCutoffsForSiHitsCut.size();
607 if (cutSize != m_vecMinNSiHitsAboveEta.size()) {
608 ATH_MSG_ERROR(
"Eta cutoffs and Silicon hit cuts must be vectors of the same length." );
609 return StatusCode::FAILURE;
612 for (
size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
613 ATH_MSG_INFO(
" for " << m_vecEtaCutoffsForSiHitsCut[i_cut]
614 <<
" < eta < " << m_vecEtaCutoffsForSiHitsCut[i_cut+1]
615 <<
" ,Silicon hits >= " << m_vecMinNSiHitsAboveEta[i_cut] );
618 if (!
checkOrder(m_vecEtaCutoffsForSiHitsCut.value())) {
620 return StatusCode::FAILURE;
622 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for eta > " << m_vecEtaCutoffsForSiHitsCut[cutSize-1]
623 <<
" ,Silicon hits >= " << m_vecMinNSiHitsAboveEta[cutSize-1] );
625 trackCuts[
"SiHits"].push_back([p_vecEtaCutoffsForSiHitsCut = &std::as_const(m_vecEtaCutoffsForSiHitsCut.value()),
626 p_vecMinNSiHitsAboveEta = &std::as_const(m_vecMinNSiHitsAboveEta.value())](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
627 double abs_eta = std::abs(helper.eta(msgHelper));
628 unsigned int bin_i = findBin(*p_vecEtaCutoffsForSiHitsCut, abs_eta);
629 return bin_i >= p_vecMinNSiHitsAboveEta->size()
631 || getSummarySum<4,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHits,
632 xAOD::numberOfSCTHits,
633 xAOD::numberOfPixelDeadSensors,
634 xAOD::numberOfSCTDeadSensors}) >= (*p_vecMinNSiHitsAboveEta)[bin_i];
638 if (!m_vecEtaCutoffsForPtCut.empty() || !m_vecMinPtAboveEta.empty()) {
639 auto cutSize = m_vecEtaCutoffsForPtCut.size();
640 if (cutSize != m_vecMinPtAboveEta.size()) {
641 ATH_MSG_ERROR(
"Eta cutoffs and pT cuts must be vectors of the same length." );
642 return StatusCode::FAILURE;
645 for (
size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
647 <<
" < eta < " << m_vecEtaCutoffsForPtCut[i_cut+1]
648 <<
" ,transverse momentum >= " << m_vecMinPtAboveEta[i_cut] );
651 if (!
checkOrder(m_vecEtaCutoffsForPtCut.value())) {
653 return StatusCode::FAILURE;
656 <<
" ,transverse momentum >= " << m_vecMinPtAboveEta[cutSize-1] );
657 trackCuts[
"Pt"].push_back([p_vecEtaCutoffsForPtCut = &std::as_const(m_vecEtaCutoffsForPtCut.value()),
658 p_vecMinPtAboveEta = &std::as_const(m_vecMinPtAboveEta.value())](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
659 double abs_eta = std::abs(helper.eta(msgHelper));
660 unsigned int bin_i = findBin(*p_vecEtaCutoffsForPtCut, abs_eta);
661 return bin_i >= p_vecMinPtAboveEta->size() || abs_eta > 5.0 || helper.pt(msgHelper) >= (*p_vecMinPtAboveEta)[bin_i];
665 if (!m_vecPtCutoffsForSctHitsCut.empty() || !m_vecMinNSctHitsAbovePt.empty()) {
666 auto cutSize = m_vecPtCutoffsForSctHitsCut.size();
667 if (cutSize != m_vecMinNSctHitsAbovePt.size()) {
668 ATH_MSG_ERROR(
"Pt cutoffs and SCT hit cuts must be vectors of the same length." );
669 return StatusCode::FAILURE;
672 for (
size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
673 ATH_MSG_INFO(
" for " << m_vecPtCutoffsForSctHitsCut[i_cut]
674 <<
" < pt < " << m_vecPtCutoffsForSctHitsCut[i_cut+1]
675 <<
" MeV,\tSCT hits >= " << m_vecMinNSctHitsAbovePt[i_cut] );
678 if (!
checkOrder(m_vecPtCutoffsForSctHitsCut.value())) {
680 return StatusCode::FAILURE;
682 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for pt > " << m_vecPtCutoffsForSctHitsCut[cutSize-1]
683 <<
" MeV,\t\tSCT hits >= " << m_vecMinNSctHitsAbovePt[cutSize-1] );
684 trackCuts[
"SctHits"].push_back([p_vecPtCutoffsForSctHitsCut = &std::as_const(m_vecPtCutoffsForSctHitsCut.value()),
685 p_vecMinNSctHitsAbovePt = &std::as_const(m_vecMinNSctHitsAbovePt.value())](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
686 double pt = helper.pt(msgHelper);
687 unsigned int bin_i = findBin(*p_vecPtCutoffsForSctHitsCut, pt);
688 return bin_i >= p_vecPtCutoffsForSctHitsCut->size()
689 || getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfSCTHits,
690 xAOD::numberOfSCTDeadSensors}) >= (*p_vecMinNSctHitsAbovePt)[bin_i];
694 if (!m_vecPtCutoffsForZ0SinThetaCut.empty() ||
695 !m_vecEtaCutoffsForZ0SinThetaCut.empty() ||
696 !m_vecvecMaxZ0SinThetaAboveEtaPt.empty()) {
697 auto etaSize = m_vecEtaCutoffsForZ0SinThetaCut.size();
698 auto ptSize = m_vecPtCutoffsForZ0SinThetaCut.size();
699 if (etaSize != m_vecvecMaxZ0SinThetaAboveEtaPt.size()) {
700 ATH_MSG_ERROR(
"Eta cutoffs and Z0SinTheta cuts must be vectors of the same length." );
701 return StatusCode::FAILURE;
703 for (
size_t i_size=0; i_size<etaSize-1; ++i_size) {
704 if (ptSize != m_vecvecMaxZ0SinThetaAboveEtaPt[i_size].
size()) {
705 ATH_MSG_ERROR(
"Pt cutoffs and Z0SinTheta cuts must be vectors of the same length." );
706 return StatusCode::FAILURE;
710 std::stringstream pTRangeBuffer;
711 std::copy(m_vecPtCutoffsForZ0SinThetaCut.begin(), m_vecPtCutoffsForZ0SinThetaCut.end(), std::ostream_iterator<double>(pTRangeBuffer,
", "));
712 std::string pTString=pTRangeBuffer.str();
713 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"Z0SinTheta cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
714 for (
size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
716 std::stringstream etaRangeBuffer;
717 etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForZ0SinThetaCut[i_cut_eta] <<
" < |#eta| < ";
718 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForZ0SinThetaCut[i_cut_eta+1];
719 else etaRangeBuffer << std::setprecision(2) << std::fixed <<m_maxAbsEta;
721 std::stringstream cutBuffer;
722 std::copy(m_vecvecMaxZ0SinThetaAboveEtaPt[i_cut_eta].
begin(), m_vecvecMaxZ0SinThetaAboveEtaPt[i_cut_eta].
end(), std::ostream_iterator<double>(cutBuffer,
", "));
723 std::string cutString=cutBuffer.str();
725 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
728 if (!
checkOrder(m_vecEtaCutoffsForZ0SinThetaCut.value())) {
730 return StatusCode::FAILURE;
732 if (!
checkOrder(m_vecPtCutoffsForZ0SinThetaCut.value())) {
734 return StatusCode::FAILURE;
737 trackCuts[
"Z0SinTheta"].push_back([p_vecEtaCutoffsForZ0SinThetaCut = &std::as_const(m_vecEtaCutoffsForZ0SinThetaCut.value()),
738 p_vecPtCutoffsForZ0SinThetaCut = &std::as_const(m_vecPtCutoffsForZ0SinThetaCut.value()),
739 p_vecvecMaxZ0SinThetaAboveEtaPt = &std::as_const(m_vecvecMaxZ0SinThetaAboveEtaPt.value())] (Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
740 double eta = helper.eta(msgHelper);
741 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForZ0SinThetaCut, std::fabs(eta));
742 double pt = helper.pt(msgHelper);
743 unsigned int bin_pt = findBin(*p_vecPtCutoffsForZ0SinThetaCut, pt);
744 return bin_eta >= p_vecEtaCutoffsForZ0SinThetaCut->size()
745 || bin_pt >= p_vecPtCutoffsForZ0SinThetaCut->size()
746 || std::fabs(helper.z0(msgHelper) * std::sin(helper.theta(msgHelper))) <= (*p_vecvecMaxZ0SinThetaAboveEtaPt)[bin_eta][bin_pt];
750 if (!m_vecPtCutoffsForD0Cut.empty() ||
751 !m_vecEtaCutoffsForD0Cut.empty() ||
752 !m_vecvecMaxD0AboveEtaPt.empty()) {
753 auto etaSize = m_vecEtaCutoffsForD0Cut.size();
754 auto ptSize = m_vecPtCutoffsForD0Cut.size();
755 if (etaSize != m_vecvecMaxD0AboveEtaPt.size()) {
756 ATH_MSG_ERROR(
"Eta cutoffs and D0 cuts must be vectors of the same length." );
757 return StatusCode::FAILURE;
759 for (
size_t i_size=0; i_size<etaSize-1; ++i_size) {
760 if (ptSize != m_vecvecMaxD0AboveEtaPt[i_size].
size()) {
761 ATH_MSG_ERROR(
"Pt cutoffs and D0 cuts must be vectors of the same length." );
762 return StatusCode::FAILURE;
766 std::stringstream pTRangeBuffer;
767 std::copy(m_vecPtCutoffsForD0Cut.begin(), m_vecPtCutoffsForD0Cut.end(), std::ostream_iterator<double>(pTRangeBuffer,
", "));
768 std::string pTString=pTRangeBuffer.str();
769 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"D0 cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
770 for (
size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
772 std::stringstream etaRangeBuffer;
773 etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForD0Cut[i_cut_eta] <<
" < |#eta| < ";
774 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForD0Cut[i_cut_eta+1];
775 else etaRangeBuffer << std::setprecision(2) << std::fixed <<m_maxAbsEta;
777 std::stringstream cutBuffer;
778 std::copy(m_vecvecMaxD0AboveEtaPt[i_cut_eta].
begin(), m_vecvecMaxD0AboveEtaPt[i_cut_eta].
end(), std::ostream_iterator<double>(cutBuffer,
", "));
779 std::string cutString=cutBuffer.str();
781 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
784 if (!
checkOrder(m_vecEtaCutoffsForD0Cut.value())) {
786 return StatusCode::FAILURE;
788 if (!
checkOrder(m_vecPtCutoffsForD0Cut.value())) {
790 return StatusCode::FAILURE;
793 trackCuts[
"D0"].push_back([p_vecEtaCutoffsForD0Cut = &std::as_const(m_vecEtaCutoffsForD0Cut.value()),
794 p_vecPtCutoffsForD0Cut = &std::as_const(m_vecPtCutoffsForD0Cut.value()),
795 p_vecvecMaxD0AboveEtaPt = &std::as_const(m_vecvecMaxD0AboveEtaPt.value())] (Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
796 double eta = helper.eta(msgHelper);
797 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForD0Cut, std::fabs(eta));
798 double pt = helper.pt(msgHelper);
799 unsigned int bin_pt = findBin(*p_vecPtCutoffsForD0Cut, pt);
800 return bin_eta >= p_vecEtaCutoffsForD0Cut->size()
801 || bin_pt >= p_vecPtCutoffsForD0Cut->size()
802 || std::fabs(helper.d0(msgHelper)) <= (*p_vecvecMaxD0AboveEtaPt)[bin_eta][bin_pt];
806 if (!m_vecPtCutoffsForSctHolesCut.empty() ||
807 !m_vecEtaCutoffsForSctHolesCut.empty() ||
808 !m_vecvecMaxSctHolesAboveEtaPt.empty()) {
809 auto etaSize = m_vecEtaCutoffsForSctHolesCut.size();
810 auto ptSize = m_vecPtCutoffsForSctHolesCut.size();
811 if (etaSize != m_vecvecMaxSctHolesAboveEtaPt.size()) {
812 ATH_MSG_ERROR(
"Eta cutoffs and SctHoles cuts must be vectors of the same length." );
813 return StatusCode::FAILURE;
815 for (
size_t i_size=0; i_size<etaSize-1; ++i_size) {
816 if (ptSize != m_vecvecMaxSctHolesAboveEtaPt[i_size].
size()) {
817 ATH_MSG_ERROR(
"Pt cutoffs and SctHoles cuts must be vectors of the same length." );
818 return StatusCode::FAILURE;
822 std::stringstream pTRangeBuffer;
823 std::copy(m_vecPtCutoffsForSctHolesCut.begin(), m_vecPtCutoffsForSctHolesCut.end(), std::ostream_iterator<double>(pTRangeBuffer,
", "));
824 std::string pTString=pTRangeBuffer.str();
825 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"SctHoles cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
826 for (
size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
828 std::stringstream etaRangeBuffer;
829 etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForSctHolesCut[i_cut_eta] <<
" < |#eta| < ";
830 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForSctHolesCut[i_cut_eta+1];
831 else etaRangeBuffer << std::setprecision(2) << std::fixed <<m_maxAbsEta;
833 std::stringstream cutBuffer;
834 std::copy(m_vecvecMaxSctHolesAboveEtaPt[i_cut_eta].
begin(), m_vecvecMaxSctHolesAboveEtaPt[i_cut_eta].
end(), std::ostream_iterator<double>(cutBuffer,
", "));
835 std::string cutString=cutBuffer.str();
837 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
840 if (!
checkOrder(m_vecEtaCutoffsForSctHolesCut.value())) {
842 return StatusCode::FAILURE;
844 if (!
checkOrder(m_vecPtCutoffsForSctHolesCut.value())) {
846 return StatusCode::FAILURE;
849 trackCuts[
"SctHits"].push_back([p_vecEtaCutoffsForSctHolesCut = &std::as_const(m_vecEtaCutoffsForSctHolesCut.value()),
850 p_vecPtCutoffsForSctHolesCut = &std::as_const(m_vecPtCutoffsForSctHolesCut.value()),
851 p_vecvecMaxSctHolesAboveEtaPt = &std::as_const(m_vecvecMaxSctHolesAboveEtaPt.value())] (Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
852 double eta = helper.eta(msgHelper);
853 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForSctHolesCut, std::fabs(eta));
854 double pt = helper.pt(msgHelper);
855 unsigned int bin_pt = findBin(*p_vecPtCutoffsForSctHolesCut, pt);
856 return bin_eta >= p_vecEtaCutoffsForSctHolesCut->size()
857 || bin_pt >= p_vecPtCutoffsForSctHolesCut->size()
858 || getSummary(helper, msgHelper, xAOD::numberOfSCTHoles) <= (*p_vecvecMaxSctHolesAboveEtaPt)[bin_eta][bin_pt];
862 if (!m_vecPtCutoffsForSctHitsPlusDeadCut.empty() ||
863 !m_vecEtaCutoffsForSctHitsPlusDeadCut.empty() ||
864 !m_vecvecMinSctHitsPlusDeadAboveEtaPt.empty()) {
865 auto etaSize = m_vecEtaCutoffsForSctHitsPlusDeadCut.size();
866 auto ptSize = m_vecPtCutoffsForSctHitsPlusDeadCut.size();
867 if (etaSize != m_vecvecMinSctHitsPlusDeadAboveEtaPt.size()) {
868 ATH_MSG_ERROR(
"Eta cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
869 return StatusCode::FAILURE;
871 for (
size_t i_size=0; i_size<etaSize-1; ++i_size) {
872 if (ptSize != m_vecvecMinSctHitsPlusDeadAboveEtaPt[i_size].
size()) {
873 ATH_MSG_ERROR(
"Pt cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
874 return StatusCode::FAILURE;
878 std::stringstream pTRangeBuffer;
879 std::copy(m_vecPtCutoffsForSctHitsPlusDeadCut.begin(), m_vecPtCutoffsForSctHitsPlusDeadCut.end(), std::ostream_iterator<double>(pTRangeBuffer,
", "));
880 std::string pTString=pTRangeBuffer.str();
881 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"SctHitsPlusDead cuts (>=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
882 for (
size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
884 std::stringstream etaRangeBuffer;
885 etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForSctHitsPlusDeadCut[i_cut_eta] <<
" < |#eta| < ";
886 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed << m_vecEtaCutoffsForSctHitsPlusDeadCut[i_cut_eta+1];
887 else etaRangeBuffer << std::setprecision(2) << std::fixed <<m_maxAbsEta;
889 std::stringstream cutBuffer;
890 std::copy(m_vecvecMinSctHitsPlusDeadAboveEtaPt[i_cut_eta].
begin(), m_vecvecMinSctHitsPlusDeadAboveEtaPt[i_cut_eta].
end(), std::ostream_iterator<double>(cutBuffer,
", "));
891 std::string cutString=cutBuffer.str();
893 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
896 if (!
checkOrder(m_vecEtaCutoffsForSctHitsPlusDeadCut.value())) {
898 return StatusCode::FAILURE;
900 if (!
checkOrder(m_vecPtCutoffsForSctHitsPlusDeadCut.value())) {
902 return StatusCode::FAILURE;
905 trackCuts[
"SctHits"].push_back([p_vecEtaCutoffsForSctHitsPlusDeadCut = &std::as_const(m_vecEtaCutoffsForSctHitsPlusDeadCut.value()),
906 p_vecPtCutoffsForSctHitsPlusDeadCut = &std::as_const(m_vecPtCutoffsForSctHitsPlusDeadCut.value()),
907 p_vecvecMinSctHitsPlusDeadAboveEtaPt = &std::as_const(m_vecvecMinSctHitsPlusDeadAboveEtaPt.value())] (Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
908 double eta = helper.eta(msgHelper);
909 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForSctHitsPlusDeadCut, std::fabs(eta));
910 double pt = helper.pt(msgHelper);
911 unsigned int bin_pt = findBin(*p_vecPtCutoffsForSctHitsPlusDeadCut, pt);
912 return bin_eta >= p_vecEtaCutoffsForSctHitsPlusDeadCut->size()
913 || bin_pt >= p_vecPtCutoffsForSctHitsPlusDeadCut->size()
914 || getSummarySum<2,Trk_Helper>(helper, msgHelper, {xAOD::numberOfSCTHits, xAOD::numberOfSCTDeadSensors}) >= (*p_vecvecMinSctHitsPlusDeadAboveEtaPt)[bin_eta][bin_pt];
918 return StatusCode::SUCCESS;
1180 case CutLevel::NoCut :
1184 ATH_MSG_WARNING(
"Trying to set cut level while the tool is already initialized." );
1185 ATH_MSG_WARNING(
"This will almost certainly not exhibit intended behavior." );
1245#ifndef XAOD_ANALYSIS
1270 case CutLevel::Loose :
1279 case CutLevel::LoosePrimary :
1288 case CutLevel::TightPrimary :
1299 case CutLevel::LooseMuon :
1309 case CutLevel::LooseElectron :
1314 case CutLevel::LooseTau :
1322 case CutLevel::MinBias :
1336 case CutLevel::HILoose:
1350 case CutLevel::HITight:
1366 case CutLevel::HILooseOptimized:
1376 std::vector<double>({500, 600, 700, 800, 900, 1000, 1500,
1377 2000, 2500, 3000, 5000, 8000, 12000});
1379 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},
1380 {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},
1381 {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},
1382 {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}});
1389 std::vector<double>({500, 600, 700, 800, 900, 1000, 1500,
1390 2000, 2500, 3000, 5000, 8000, 12000});
1392 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},
1393 {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},
1394 {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},
1395 {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}});
1398 case CutLevel::HITightOptimized:
1408 2000, 2500, 3000, 5000, 8000, 12000});
1410 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},
1411 {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},
1412 {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},
1413 {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}});
1420 2000, 2500, 3000, 5000, 8000, 12000});
1422 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},
1423 {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},
1424 {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},
1425 {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}});
1432 2000, 2500, 3000, 5000, 8000, 12000});
1434 std::vector<std::vector<double>>({{0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1},
1435 {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
1436 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
1437 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}});
1444 2000, 2500, 3000, 5000, 8000, 12000});
1446 std::vector<std::vector<double>>({{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1447 {0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, 0},
1448 {8, 8, 8, 7, 7, 6, 6, 6, 6, 6, 0, 0, 0},
1449 {7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}});
1452 case CutLevel::HILoosePixMod:
1464 ATH_MSG_ERROR(
"CutLevel not recognized. Cut selection will remain unchanged.");