180 {
181
184 trackCuts[
"Pt"].push_back( [minPt =
m_minPt](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) ->
bool {
return helper.pt(msgHelper) >= minPt; } );
185 }
188 trackCuts[
"Eta"].push_back( [maxAbsEta =
m_maxAbsEta](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
return std::abs(
helper.eta(msgHelper)) <= maxAbsEta; } );
189 }
192 trackCuts[
"P"].push_back( [maxInvP = 1./
m_minP](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
return std::abs(
helper.qOverP(msgHelper)) <= maxInvP; } );
193 }
196 trackCuts[
"D0"].push_back( [maxD0 =
m_maxD0](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
return std::abs(
helper.d0(msgHelper)) <= maxD0; } );
197 }
200 trackCuts[
"Z0"].push_back( [maxZ0 =
m_maxZ0](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
return std::abs(
helper.z0(msgHelper)) <= maxZ0; } );
201 }
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 }
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 }
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 }
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 }
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 }
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 }
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
267 trackCuts[
"InnermostLayersHits"].push_back([minNInnermostLayerHits =
m_minNInnermostLayerHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
270 });
271 }
275 trackCuts[
"InnermostLayersHits"].push_back([minNNextToInnermostLayerHits =
m_minNNextToInnermostLayerHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
278 });
279 }
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." );
287 }
288 trackCuts[
"InnermostLayersHits"].push_back([minNBothInnermostLayersHits =
m_minNBothInnermostLayersHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
293 >= minNBothInnermostLayersHits);
294 });
295 }
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) {
304 });
305 }
308 trackCuts[
"InnermostLayersHits"].push_back([maxNInnermostLayerSharedHits =
m_maxNInnermostLayerSharedHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
310 });
311 }
314 trackCuts[
"PixelHits"].push_back( [minNPixelHits =
m_minNPixelHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
316 });
317 }
319 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical pixel hits (i.e. dead sensors do not count): "
321 trackCuts[
"PixelHits"].push_back([minNPixelHitsPhysical =
m_minNPixelHitsPhysical](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
323 });
324 }
327 trackCuts[
"PixelHits"].push_back([maxNPixelHoles =
m_maxNPixelHoles](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
329 });
330 }
333 trackCuts[
"PixelHits"].push_back([maxNPixelSharedHits =
m_maxNPixelSharedHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
335 });
336 }
339 trackCuts[
"SctHits"].push_back( [minNSctHits =
m_minNSctHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
341 });
342 }
344 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical SCT hits (i.e. dead sensors do not count): "
346 trackCuts[
"SctHits"].push_back([minNSctHitsPhysical =
m_minNSctHitsPhysical](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
348 });
349 }
352 trackCuts[
"SctHits"].push_back([maxNSctHoles =
m_maxNSctHoles](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
354 });
355 }
358 trackCuts[
"SctHits"].push_back([maxNSctSharedHits =
m_maxNSctSharedHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
360 });
361 }
364 trackCuts[
"SctHits"].push_back([maxNSctDoubleHoles =
m_maxNSctDoubleHoles](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
366 });
367 }
370 trackCuts[
"SiHits"].push_back([minNSiHits =
m_minNSiHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
375 });
376 }
378 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical silicon hits (i.e. dead sensors do not count): "
380 trackCuts[
"SiHits"].push_back([minNSiHitsPhysical =
m_minNSiHitsPhysical](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
382 });
383 }
386 trackCuts[
"SiHits"].push_back([maxNSiHoles =
m_maxNSiHoles](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
388 });
389 }
392 trackCuts[
"SiHits"].push_back([maxNSiSharedHits =
m_maxNSiSharedHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
394 });
395 }
400 trackCuts["SiHits"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
403 });
404 }
406 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum silicon hits if the track has shared hits: "
408 trackCuts[
"SiHits"].push_back([minNSiHitsIfSiSharedHits =
m_minNSiHitsIfSiSharedHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
414 });
415 }
422 return std::abs(
helper.eta(msgHelper)) <= minEtaForStrictNSiHitsCut
427 });
428 }
430 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." );
431 trackCuts["PixHits"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
436 });
437 }
438#ifndef XAOD_ANALYSIS
440 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum modified Si hits (2*pix + sct) (does not include dead sensors)= "
442 trackCuts[
"SiHits"].push_back([minNSiHitsMod =
m_minNSiHitsMod](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
446 });
447 }
454 minNSiHitsModBottom =
m_minNSiHitsModBottom](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
456 return top >= minNSiHitsModTop && bottom >= minNSiHitsModBottom;
457 });
458 }
459#endif
467 }
472 }
474 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold: "
478 }
480 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold including outliers: "
484 }
486 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits outside eta acceptance: "
490 maxTrtHighEFraction =
m_maxTrtHighEFraction](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
492 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
495 });
496 }
498 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits above eta acceptance including outliers: "
504 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
507 });
508 }
516 return ( absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
518 });
519 }
520 }
521
522
524 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Using pre-defined eta-dependent maximum chi squared (no longer recommended)." );
525 trackCuts["FitQuality"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
528 double fit_ndof =
getFitNDoF(helper,msgHelper);
529 if (std::abs(
eta) < 1.9) {
530 return fit_chi_square <= fit_ndof * ( 4.4 + 0.32*
sqr(
eta) );
531 }
532 else {
533 return fit_chi_square <= fit_ndof * ( 26.9 - 19.6978*std::abs(
eta) + 4.4534*
sqr(
eta) );
534 }
535 });
536 }
539 trackCuts[
"FitQuality"].push_back([maxChiSq =
m_maxChiSq](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
541 });
542 }
545 trackCuts[
"FitQuality"].push_back([maxChiSqperNdf =
m_maxChiSqperNdf](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
547 });
548 }
551 trackCuts[
"FitQuality"].push_back([minProb =
m_minProb](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
553 });
554 }
560 return helper.pt(msgHelper) <= minPtForProbCut
562 });
563 }
564
565
568 trackCuts[
"dEdxHits"].push_back([minNUsedHitsdEdx =
m_minNUsedHitsdEdx](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
570 });
571 }
574 trackCuts[
"dEdxHits"].push_back([minNOverflowHitsdEdx =
m_minNOverflowHitsdEdx](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
576 });
577 }
581 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" (only applied on tracks where all TRT hits are Xenon)" );
582 trackCuts[
"eProbHT"].push_back([minEProbabilityHT =
m_minEProbabilityHT](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
586 });
587 } else {
588 trackCuts[
"eProbHT"].push_back([minEProbabilityHT =
m_minEProbabilityHT](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
590 });
591 }
592 }
593
597 ATH_MSG_ERROR(
"Eta cutoffs and Silicon hit cuts must be vectors of the same length." );
598 return StatusCode::FAILURE;
599 }
601 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
605 }
606 }
609 return StatusCode::FAILURE;
610 }
613
615 p_vecMinNSiHitsAboveEta = &std::as_const(
m_vecMinNSiHitsAboveEta.value())](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
616 double abs_eta = std::abs(helper.eta(msgHelper));
617 unsigned int bin_i = findBin(*p_vecEtaCutoffsForSiHitsCut, abs_eta);
618 return bin_i >= p_vecMinNSiHitsAboveEta->size()
619 || abs_eta>5.0
620 || getSummarySum<4,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHits,
621 xAOD::numberOfSCTHits,
622 xAOD::numberOfPixelDeadSensors,
623 xAOD::numberOfSCTDeadSensors}) >= (*p_vecMinNSiHitsAboveEta)[bin_i];
624 });
625 }
626
630 ATH_MSG_ERROR(
"Eta cutoffs and pT cuts must be vectors of the same length." );
631 return StatusCode::FAILURE;
632 }
634 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
638 }
639 }
642 return StatusCode::FAILURE;
643 }
647 p_vecMinPtAboveEta = &std::as_const(
m_vecMinPtAboveEta.value())](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
648 double abs_eta = std::abs(helper.eta(msgHelper));
649 unsigned int bin_i = findBin(*p_vecEtaCutoffsForPtCut, abs_eta);
650 return bin_i >= p_vecMinPtAboveEta->size() || abs_eta > 5.0 || helper.pt(msgHelper) >= (*p_vecMinPtAboveEta)[bin_i];
651 });
652 }
653
657 ATH_MSG_ERROR(
"Pt cutoffs and SCT hit cuts must be vectors of the same length." );
658 return StatusCode::FAILURE;
659 }
661 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
665 }
666 }
669 return StatusCode::FAILURE;
670 }
674 p_vecMinNSctHitsAbovePt = &std::as_const(
m_vecMinNSctHitsAbovePt.value())](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
675 double pt = helper.pt(msgHelper);
676 unsigned int bin_i = findBin(*p_vecPtCutoffsForSctHitsCut, pt);
677 return bin_i >= p_vecPtCutoffsForSctHitsCut->size()
678 || getSummarySum<2,Trk_Helper>(helper, msgHelper,{xAOD::numberOfSCTHits,
679 xAOD::numberOfSCTDeadSensors}) >= (*p_vecMinNSctHitsAbovePt)[bin_i];
680 });
681 }
682
689 ATH_MSG_ERROR(
"Eta cutoffs and Z0SinTheta cuts must be vectors of the same length." );
690 return StatusCode::FAILURE;
691 }
692 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
694 ATH_MSG_ERROR(
"Pt cutoffs and Z0SinTheta cuts must be vectors of the same length." );
695 return StatusCode::FAILURE;
696 }
697 }
698
699 std::stringstream pTRangeBuffer;
701 std::string pTString=pTRangeBuffer.str();
702 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"Z0SinTheta cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
703 for (size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
704 {
705 std::stringstream etaRangeBuffer;
708 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
709
710 std::stringstream cutBuffer;
712 std::string cutString=cutBuffer.str();
713
714 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
715 }
716
719 return StatusCode::FAILURE;
720 }
723 return StatusCode::FAILURE;
724 }
725
729 double eta = helper.eta(msgHelper);
730 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForZ0SinThetaCut, std::fabs(eta));
731 double pt = helper.pt(msgHelper);
732 unsigned int bin_pt = findBin(*p_vecPtCutoffsForZ0SinThetaCut, pt);
733 return bin_eta >= p_vecEtaCutoffsForZ0SinThetaCut->size()
734 || bin_pt >= p_vecPtCutoffsForZ0SinThetaCut->size()
735 || std::fabs(helper.z0(msgHelper) * std::sin(helper.theta(msgHelper))) <= (*p_vecvecMaxZ0SinThetaAboveEtaPt)[bin_eta][bin_pt];
736 });
737 }
738
745 ATH_MSG_ERROR(
"Eta cutoffs and D0 cuts must be vectors of the same length." );
746 return StatusCode::FAILURE;
747 }
748 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
750 ATH_MSG_ERROR(
"Pt cutoffs and D0 cuts must be vectors of the same length." );
751 return StatusCode::FAILURE;
752 }
753 }
754
755 std::stringstream pTRangeBuffer;
757 std::string pTString=pTRangeBuffer.str();
758 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"D0 cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
759 for (size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
760 {
761 std::stringstream etaRangeBuffer;
763 if(i_cut_eta!=etaSize-1) etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_vecEtaCutoffsForD0Cut[i_cut_eta+1];
764 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
765
766 std::stringstream cutBuffer;
768 std::string cutString=cutBuffer.str();
769
770 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
771 }
772
775 return StatusCode::FAILURE;
776 }
779 return StatusCode::FAILURE;
780 }
781
784 p_vecvecMaxD0AboveEtaPt = &std::as_const(
m_vecvecMaxD0AboveEtaPt.value())] (Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
785 double eta = helper.eta(msgHelper);
786 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForD0Cut, std::fabs(eta));
787 double pt = helper.pt(msgHelper);
788 unsigned int bin_pt = findBin(*p_vecPtCutoffsForD0Cut, pt);
789 return bin_eta >= p_vecEtaCutoffsForD0Cut->size()
790 || bin_pt >= p_vecPtCutoffsForD0Cut->size()
791 || std::fabs(helper.d0(msgHelper)) <= (*p_vecvecMaxD0AboveEtaPt)[bin_eta][bin_pt];
792 });
793 }
794
801 ATH_MSG_ERROR(
"Eta cutoffs and SctHoles cuts must be vectors of the same length." );
802 return StatusCode::FAILURE;
803 }
804 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
806 ATH_MSG_ERROR(
"Pt cutoffs and SctHoles cuts must be vectors of the same length." );
807 return StatusCode::FAILURE;
808 }
809 }
810
811 std::stringstream pTRangeBuffer;
813 std::string pTString=pTRangeBuffer.str();
814 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"SctHoles cuts (<=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
815 for (size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
816 {
817 std::stringstream etaRangeBuffer;
820 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
821
822 std::stringstream cutBuffer;
824 std::string cutString=cutBuffer.str();
825
826 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
827 }
828
831 return StatusCode::FAILURE;
832 }
835 return StatusCode::FAILURE;
836 }
837
840 p_vecvecMaxSctHolesAboveEtaPt = &std::as_const(
m_vecvecMaxSctHolesAboveEtaPt.value())] (Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
841 double eta = helper.eta(msgHelper);
842 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForSctHolesCut, std::fabs(eta));
843 double pt = helper.pt(msgHelper);
844 unsigned int bin_pt = findBin(*p_vecPtCutoffsForSctHolesCut, pt);
845 return bin_eta >= p_vecEtaCutoffsForSctHolesCut->size()
846 || bin_pt >= p_vecPtCutoffsForSctHolesCut->size()
847 || getSummary(helper, msgHelper, xAOD::numberOfSCTHoles) <= (*p_vecvecMaxSctHolesAboveEtaPt)[bin_eta][bin_pt];
848 });
849 }
850
857 ATH_MSG_ERROR(
"Eta cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
858 return StatusCode::FAILURE;
859 }
860 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
862 ATH_MSG_ERROR(
"Pt cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
863 return StatusCode::FAILURE;
864 }
865 }
866
867 std::stringstream pTRangeBuffer;
869 std::string pTString=pTRangeBuffer.str();
870 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
"SctHitsPlusDead cuts (>=) for pT above "<<pTString.substr(0, pTString.size()-2)<<
"MeV, respectively:");
871 for (size_t i_cut_eta=0; i_cut_eta<etaSize; ++i_cut_eta)
872 {
873 std::stringstream etaRangeBuffer;
876 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
877
878 std::stringstream cutBuffer;
880 std::string cutString=cutBuffer.str();
881
882 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
883 }
884
887 return StatusCode::FAILURE;
888 }
891 return StatusCode::FAILURE;
892 }
893
897 double eta = helper.eta(msgHelper);
898 unsigned int bin_eta = findBin(*p_vecEtaCutoffsForSctHitsPlusDeadCut, std::fabs(eta));
899 double pt = helper.pt(msgHelper);
900 unsigned int bin_pt = findBin(*p_vecPtCutoffsForSctHitsPlusDeadCut, pt);
901 return bin_eta >= p_vecEtaCutoffsForSctHitsPlusDeadCut->size()
902 || bin_pt >= p_vecPtCutoffsForSctHitsPlusDeadCut->size()
903 || getSummarySum<2,Trk_Helper>(helper, msgHelper, {xAOD::numberOfSCTHits, xAOD::numberOfSCTDeadSensors}) >= (*p_vecvecMinSctHitsPlusDeadAboveEtaPt)[bin_eta][bin_pt];
904 });
905 }
906
907 return StatusCode::SUCCESS;
908}
Scalar eta() const
pseudorapidity method
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].