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.value()](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.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
268 return ( getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerHits) >= minNInnermostLayerHits
269 || getSummary(helper, msgHelper, xAOD::expectInnermostPixelLayerHit) == 0);
270 });
271 }
275 trackCuts[
"InnermostLayersHits"].push_back([minNNextToInnermostLayerHits =
m_minNNextToInnermostLayerHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
276 return ( getSummary(helper, msgHelper, xAOD::numberOfNextToInnermostPixelLayerHits) >= minNNextToInnermostLayerHits
277 || getSummary(helper, msgHelper, xAOD::expectNextToInnermostPixelLayerHit) == 0);
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.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
289 return ( std::max( getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerHits),
290 static_cast<uint8_t>( !getSummary(helper, msgHelper, xAOD::expectInnermostPixelLayerHit) ))
291 +std::max( getSummary(helper, msgHelper, xAOD::numberOfNextToInnermostPixelLayerHits),
292 static_cast<uint8_t>( !getSummary(helper, msgHelper, xAOD::expectNextToInnermostPixelLayerHit )))
293 >= minNBothInnermostLayersHits);
294 });
295 }
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.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
319 return getSummary(helper, msgHelper, xAOD::numberOfInnermostPixelLayerSharedHits) <= maxNInnermostLayerSharedHits;
320 });
321 }
324 trackCuts[
"PixelHits"].push_back( [minNPixelHits =
m_minNPixelHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
325 return getSummarySum<2,Trk_Helper>(helper, msgHelper, {xAOD::numberOfPixelHits,xAOD::numberOfPixelDeadSensors}) >= minNPixelHits;
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.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
332 return getSummary(helper, msgHelper, xAOD::numberOfPixelHits) >= minNPixelHitsPhysical;
333 });
334 }
337 trackCuts[
"PixelHits"].push_back([maxNPixelHoles =
m_maxNPixelHoles.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
338 return getSummary(helper, msgHelper, xAOD::numberOfPixelHoles) <= maxNPixelHoles;
339 });
340 }
343 trackCuts[
"PixelHits"].push_back([maxNPixelSharedHits =
m_maxNPixelSharedHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
344 return getSummary(helper, msgHelper, xAOD::numberOfPixelSharedHits) <= maxNPixelSharedHits;
345 });
346 }
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;
351 });
352 }
354 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical SCT hits (i.e. dead sensors do not count): "
356
357 trackCuts[
"SctHits"].push_back([minNSctHitsPhysical =
m_minNSctHitsPhysical.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
358 return getSummary(helper, msgHelper, xAOD::numberOfSCTHits) >= minNSctHitsPhysical;
359 });
360 }
363 trackCuts[
"SctHits"].push_back([maxNSctHoles =
m_maxNSctHoles.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
364 return getSummary(helper, msgHelper, xAOD::numberOfSCTHoles) <= maxNSctHoles;
365 });
366 }
369 trackCuts[
"SctHits"].push_back([maxNSctSharedHits =
m_maxNSctSharedHits.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
370 return getSummary(helper, msgHelper, xAOD::numberOfSCTSharedHits) <= maxNSctSharedHits;
371 });
372 }
375 trackCuts[
"SctHits"].push_back([maxNSctDoubleHoles =
m_maxNSctDoubleHoles.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
376 return getSummary(helper, msgHelper, xAOD::numberOfSCTDoubleHoles) <= maxNSctDoubleHoles ;
377 });
378 }
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 ;
386 });
387 }
389 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum physical silicon hits (i.e. dead sensors do not count): "
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 ;
393 });
394 }
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 ;
399 });
400 }
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 ;
405 });
406 }
411 trackCuts["SiHits"].push_back([](Trk_Helper helper, const asg::AsgMessaging &msgHelper) {
414 });
415 }
417 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum silicon hits if the track has shared hits: "
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
425 });
426 }
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;
438 });
439 }
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) {
447 });
448 }
449#ifndef XAOD_ANALYSIS
451 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum modified Si hits (2*pix + sct) (does not include dead sensors)= "
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;
457 });
458 }
465 minNSiHitsModBottom =
m_minNSiHitsModBottom](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
466 auto [top,bottom] = getSiHitsTopBottom(helper, msgHelper);
467 return top >= minNSiHitsModTop && bottom >= minNSiHitsModBottom;
468 });
469 }
470#endif
478 }
483 }
485 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold: "
489 }
491 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Minimum TRT hits outside eta acceptance above high energy threshold including outliers: "
495 }
497 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits outside eta acceptance: "
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 );
506 });
507 }
509 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" Maximum ratio of high threshold to regular TRT hits above eta acceptance including outliers: "
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} ))
518 });
519 }
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) );
529 });
530 }
531 }
532
533
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) );
542 }
543 else {
544 return fit_chi_square <= fit_ndof * ( 26.9 - 19.6978*std::abs(
eta) + 4.4534*
sqr(
eta) );
545 }
546 });
547 }
550 trackCuts[
"FitQuality"].push_back([maxChiSq =
m_maxChiSq.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
551 return getFitChiSquare(helper,msgHelper) <= maxChiSq;
552 });
553 }
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);
558 });
559 }
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;
564 });
565 }
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;
573 });
574 }
575
576
579 trackCuts[
"dEdxHits"].push_back([minNUsedHitsdEdx =
m_minNUsedHitsdEdx.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
580 return getNumberOfUsedHitsdEdx(helper,msgHelper) >= minNUsedHitsdEdx;
581 });
582 }
585 trackCuts[
"dEdxHits"].push_back([minNOverflowHitsdEdx =
m_minNOverflowHitsdEdx.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
586 return getNumberOfIBLOverflowsdEdx(helper,msgHelper) >= minNOverflowHitsdEdx;
587 });
588 }
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})
597 });
598 } else {
599 trackCuts[
"eProbHT"].push_back([minEProbabilityHT =
m_minEProbabilityHT.value()](Trk_Helper helper,
const asg::AsgMessaging &msgHelper) {
600 return getEProbabilityHT(helper,msgHelper) >= minEProbabilityHT;
601 });
602 }
603 }
604
608 ATH_MSG_ERROR(
"Eta cutoffs and Silicon hit cuts must be vectors of the same length." );
609 return StatusCode::FAILURE;
610 }
612 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
616 }
617 }
620 return StatusCode::FAILURE;
621 }
624
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()
630 || abs_eta>5.0
631 || getSummarySum<4,Trk_Helper>(helper, msgHelper,{xAOD::numberOfPixelHits,
632 xAOD::numberOfSCTHits,
633 xAOD::numberOfPixelDeadSensors,
634 xAOD::numberOfSCTDeadSensors}) >= (*p_vecMinNSiHitsAboveEta)[bin_i];
635 });
636 }
637
641 ATH_MSG_ERROR(
"Eta cutoffs and pT cuts must be vectors of the same length." );
642 return StatusCode::FAILURE;
643 }
645 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
649 }
650 }
653 return StatusCode::FAILURE;
654 }
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];
662 });
663 }
664
668 ATH_MSG_ERROR(
"Pt cutoffs and SCT hit cuts must be vectors of the same length." );
669 return StatusCode::FAILURE;
670 }
672 for (size_t i_cut=0; i_cut<cutSize-1; ++i_cut) {
676 }
677 }
680 return StatusCode::FAILURE;
681 }
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];
691 });
692 }
693
700 ATH_MSG_ERROR(
"Eta cutoffs and Z0SinTheta cuts must be vectors of the same length." );
701 return StatusCode::FAILURE;
702 }
703 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
705 ATH_MSG_ERROR(
"Pt cutoffs and Z0SinTheta cuts must be vectors of the same length." );
706 return StatusCode::FAILURE;
707 }
708 }
709
710 std::stringstream 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)
715 {
716 std::stringstream etaRangeBuffer;
719 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
720
721 std::stringstream cutBuffer;
723 std::string cutString=cutBuffer.str();
724
725 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
726 }
727
730 return StatusCode::FAILURE;
731 }
734 return StatusCode::FAILURE;
735 }
736
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];
747 });
748 }
749
756 ATH_MSG_ERROR(
"Eta cutoffs and D0 cuts must be vectors of the same length." );
757 return StatusCode::FAILURE;
758 }
759 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
761 ATH_MSG_ERROR(
"Pt cutoffs and D0 cuts must be vectors of the same length." );
762 return StatusCode::FAILURE;
763 }
764 }
765
766 std::stringstream 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)
771 {
772 std::stringstream etaRangeBuffer;
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;
776
777 std::stringstream cutBuffer;
779 std::string cutString=cutBuffer.str();
780
781 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
782 }
783
786 return StatusCode::FAILURE;
787 }
790 return StatusCode::FAILURE;
791 }
792
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];
803 });
804 }
805
812 ATH_MSG_ERROR(
"Eta cutoffs and SctHoles cuts must be vectors of the same length." );
813 return StatusCode::FAILURE;
814 }
815 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
817 ATH_MSG_ERROR(
"Pt cutoffs and SctHoles cuts must be vectors of the same length." );
818 return StatusCode::FAILURE;
819 }
820 }
821
822 std::stringstream 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)
827 {
828 std::stringstream etaRangeBuffer;
831 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
832
833 std::stringstream cutBuffer;
835 std::string cutString=cutBuffer.str();
836
837 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
838 }
839
842 return StatusCode::FAILURE;
843 }
846 return StatusCode::FAILURE;
847 }
848
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];
859 });
860 }
861
868 ATH_MSG_ERROR(
"Eta cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
869 return StatusCode::FAILURE;
870 }
871 for (size_t i_size=0; i_size<etaSize-1; ++i_size) {
873 ATH_MSG_ERROR(
"Pt cutoffs and SctHitsPlusDead cuts must be vectors of the same length." );
874 return StatusCode::FAILURE;
875 }
876 }
877
878 std::stringstream 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)
883 {
884 std::stringstream etaRangeBuffer;
887 else etaRangeBuffer << std::setprecision(2) << std::fixed <<
m_maxAbsEta;
888
889 std::stringstream cutBuffer;
891 std::string cutString=cutBuffer.str();
892
893 if constexpr(
VERBOSE>0)
ATH_MSG_INFO(
" for "<<etaRangeBuffer.str()<<
": "<<cutString.substr(0, cutString.size()-2));
894 }
895
898 return StatusCode::FAILURE;
899 }
902 return StatusCode::FAILURE;
903 }
904
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];
915 });
916 }
917
918 return StatusCode::SUCCESS;
919}
Scalar eta() const
pseudorapidity method
size_t size() const
Number of registered mappings.
double getFitChiSquare(const 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)
@ 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].
@ 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].
@ 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].