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 }
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" );
310 trackCuts["InnermostLayersHits"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
314 });
315 }
318 trackCuts[
"InnermostLayersHits"].push_back([maxNInnermostLayerSharedHits =
m_maxNInnermostLayerSharedHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
320 });
321 }
324 trackCuts[
"PixelHits"].push_back( [minNPixelHits =
m_minNPixelHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
326 });
327 }
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) {
333 });
334 }
337 trackCuts[
"PixelHits"].push_back([maxNPixelHoles =
m_maxNPixelHoles](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
339 });
340 }
343 trackCuts[
"PixelHits"].push_back([maxNPixelSharedHits =
m_maxNPixelSharedHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
345 });
346 }
349 trackCuts[
"SctHits"].push_back( [minNSctHits =
m_minNSctHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
351 });
352 }
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) {
358 });
359 }
362 trackCuts[
"SctHits"].push_back([maxNSctHoles =
m_maxNSctHoles](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
364 });
365 }
368 trackCuts[
"SctHits"].push_back([maxNSctSharedHits =
m_maxNSctSharedHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
370 });
371 }
374 trackCuts[
"SctHits"].push_back([maxNSctDoubleHoles =
m_maxNSctDoubleHoles](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
376 });
377 }
380 trackCuts[
"SiHits"].push_back([minNSiHits =
m_minNSiHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
385 });
386 }
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) {
392 });
393 }
396 trackCuts[
"SiHits"].push_back([maxNSiHoles =
m_maxNSiHoles](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
398 });
399 }
402 trackCuts[
"SiHits"].push_back([maxNSiSharedHits =
m_maxNSiSharedHits](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
404 });
405 }
410 trackCuts["SiHits"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
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) {
424 });
425 }
432 return std::abs(
helper.eta(msgHelper)) <= minEtaForStrictNSiHitsCut
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) {
446 });
447 }
448#ifndef XAOD_ANALYSIS
450 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum modified Si hits (2*pix + sct) (does not include dead sensors)= "
452 trackCuts[
"SiHits"].push_back([minNSiHitsMod =
m_minNSiHitsMod](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
456 });
457 }
464 minNSiHitsModBottom =
m_minNSiHitsModBottom](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
466 return top >= minNSiHitsModTop && bottom >= minNSiHitsModBottom;
467 });
468 }
469#endif
477 }
482 }
484 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold: "
488 }
490 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold including outliers: "
494 }
496 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits outside eta acceptance: "
500 maxTrtHighEFraction =
m_maxTrtHighEFraction](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
502 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
505 });
506 }
508 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits above eta acceptance including outliers: "
514 return (absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
517 });
518 }
526 return ( absEta <= maxTrtEtaAcceptance || absEta > maxEtaForTrtHitCuts)
528 });
529 }
530 }
531
532
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) {
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 }
549 trackCuts[
"FitQuality"].push_back([maxChiSq =
m_maxChiSq](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
551 });
552 }
555 trackCuts[
"FitQuality"].push_back([maxChiSqperNdf =
m_maxChiSqperNdf](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
557 });
558 }
561 trackCuts[
"FitQuality"].push_back([minProb =
m_minProb](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
563 });
564 }
570 return helper.pt(msgHelper) <= minPtForProbCut
572 });
573 }
574
575
578 trackCuts[
"dEdxHits"].push_back([minNUsedHitsdEdx =
m_minNUsedHitsdEdx](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
580 });
581 }
584 trackCuts[
"dEdxHits"].push_back([minNOverflowHitsdEdx =
m_minNOverflowHitsdEdx](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
586 });
587 }
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) {
596 });
597 } else {
598 trackCuts[
"eProbHT"].push_back([minEProbabilityHT =
m_minEProbabilityHT](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
600 });
601 }
602 }
603
607 ATH_MSG_ERROR(
"Eta cutoffs and Silicon hit cuts must be vectors of the same length." );
608 return StatusCode::FAILURE;
609 }
611 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
615 }
616 }
619 return StatusCode::FAILURE;
620 }
623
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
640 ATH_MSG_ERROR(
"Eta cutoffs and pT cuts must be vectors of the same length." );
641 return StatusCode::FAILURE;
642 }
644 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
648 }
649 }
652 return StatusCode::FAILURE;
653 }
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
667 ATH_MSG_ERROR(
"Pt cutoffs and SCT hit cuts must be vectors of the same length." );
668 return StatusCode::FAILURE;
669 }
671 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
675 }
676 }
679 return StatusCode::FAILURE;
680 }
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
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) {
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;
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;
718 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
719
720 std::stringstream 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
729 return StatusCode::FAILURE;
730 }
733 return StatusCode::FAILURE;
734 }
735
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
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) {
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;
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;
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;
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
785 return StatusCode::FAILURE;
786 }
789 return StatusCode::FAILURE;
790 }
791
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
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) {
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;
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;
830 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
831
832 std::stringstream 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
841 return StatusCode::FAILURE;
842 }
845 return StatusCode::FAILURE;
846 }
847
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
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) {
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;
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;
886 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
887
888 std::stringstream 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
897 return StatusCode::FAILURE;
898 }
901 return StatusCode::FAILURE;
902 }
903
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
size_t size() const
Number of registered mappings.
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].