14 #include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
24 const IInterface*
p ) :
33 m_maxTrtFittedRatio(-1),
38 m_selectortool(
"InDet::InDetTrtDriftCircleCutTool", this),
40 m_extrapolator(
"Trk::Extrapolator", this)
42 declareInterface<Trk::ITrackScoringTool>(
this);
110 if (
sc.isFailure())
return sc;
113 if (
sc.isFailure()) {
115 return StatusCode::FAILURE;
126 msg(
MSG::FATAL) <<
"Both on, normal ambi funciton and the one for back tracking, configuration problem, not recoverable" <<
endmsg;
127 return StatusCode::FAILURE;
139 return StatusCode::SUCCESS;
146 if (!
track.trackSummary()) {
171 if (numPixelDead<0) numPixelDead = 0;
172 if (numSCTDead<0) numSCTDead = 0;
182 if (ispatterntrack) {
183 ATH_MSG_DEBUG (
"==> this is a pattern track, no hit cuts !");
185 ATH_MSG_DEBUG (
"==> this is a refitted track, so we can use the chi2 and other stuff ! ");
190 if (
track.fitQuality()) {
194 if (numSCTDoubleHoles>=0) {
198 ATH_MSG_DEBUG (
"Track has "<< numSCTDoubleHoles <<
" double holes, reject it!");
231 ATH_MSG_DEBUG (
"Track has " << numTRT <<
" TRT hits, reject it");
236 ATH_MSG_DEBUG (
"Track has " << ((
double)numTRTTube)/numTRT <<
" TRT tube hit fraction, reject it");
240 if ( numSCT>=0 && numPixel>=0) {
243 if (numPixel+numSCT+numPixelDead+numSCTDead < minSiClusters) {
244 ATH_MSG_DEBUG (
"Track has " << numPixel+numSCT <<
" Si clusters and " << numPixelDead+numSCTDead <<
" dead sensors, reject it");
252 if(numPixel < minPixel) {
253 ATH_MSG_DEBUG (
"Track has " << numPixel <<
" pixel hits, reject it");
264 if (beamSpotHandle.isValid()) beamSpotPosition = beamSpotHandle->beamVtx().position();
272 const EventContext& ctx = Gaudi::Hive::currentContext();
275 if (fieldCondObj ==
nullptr) {
280 fieldCondObj->getInitializedCache (fieldCache);
285 if (std::abs(
input->pT()) < minPt) {
299 std::unique_ptr<const Trk::TrackParameters> parm(
m_extrapolator->extrapolateDirectly(ctx,*
input, perigeeSurface) );
302 if (!extrapolatedPerigee) {
303 ATH_MSG_WARNING(
"Extrapolation of perigee failed, this should never happen" );
310 if (std::abs(extrapolatedPerigee->parameters()[
Trk::z0]) > maxZ0) {
322 if (std::abs(extrapolatedPerigee->parameters()[
Trk::d0]) > maxD0) {
323 ATH_MSG_DEBUG (
"Track Rphi impact > "<<maxD0<<
", reject it");
356 if (
track.fitQuality()!=
nullptr &&
track.fitQuality()->chiSquared()>0 &&
track.fitQuality()->numberDoF()>0 ) {
357 double p = 1.0-Genfun::CumulativeChiSquare(
track.fitQuality()->numberDoF())(
track.fitQuality()->chiSquared());
377 double pt = fabs(
track.trackParameters()->front()->pT());
378 double prob = log10(
pt ) - 1.;
394 <<
" New score now: " <<
prob);
408 <<
" New score now: " <<
prob);
419 <<
" New score now: " <<
prob);
440 <<
" New score now: " <<
prob);
452 <<
" New score now: " <<
prob);
463 <<
" New score now: " <<
prob);
474 <<
" New score now: " <<
prob);
488 <<
" New score now: " <<
prob);
500 double nTrtExpected = 30.;
503 ATH_MSG_DEBUG (
"Expected number of TRT hits: " << nTrtExpected <<
" for eta: "
504 << fabs(
track.trackParameters()->front()->eta()));
505 double ratio = (nTrtExpected != 0) ? iTRT_Hits / nTrtExpected : 0;
518 double fitted =
double(iTRT_Hits) /
double(iTRT_Hits + iTRT_Outliers);
537 if (!ispatterntrack) {
538 if (
track.fitQuality()!=
nullptr &&
track.fitQuality()->chiSquared()>0 &&
track.fitQuality()->numberDoF()>0 ) {
539 int indf =
track.fitQuality()->numberDoF();
540 double chi2 =
track.fitQuality()->chiSquared();
541 double fac = 1. / log10 (10. + 10. *
chi2 / indf);
544 <<
" is : "<< fac <<
" New score now: " <<
prob);
553 int ndf =
track.fitQuality()->numberDoF();
554 double chi2 =
track.fitQuality()->chiSquared();
561 if (sigmaChi2times100 > 0) {
562 double testvar =
double(sigmaChi2times100)/100. - sqrt(2.*
chi2/
ndf);
567 <<
" New score now: " <<
prob);
571 <<
" New score now: " <<
prob);
577 <<
" New score now: " <<
prob);
598 const int maxPixHoles = 2;
599 const double goodPixHoles[maxPixHoles+1] = {1.0 , 0.04 , 0.004 };
600 const double fakePixHoles[maxPixHoles+1] = {1.0 , 0.30 , 0.200 };
610 const int maxSCT_Holes = 5;
611 const double goodSCT_Holes[maxSCT_Holes+1] = { 1.0 , 0.06 , 0.010 , 0.0007, 0.0005, 0.0003 };
612 const double fakeSCT_Holes[maxSCT_Holes+1] = { 1.0 , 0.15 , 0.100 , 0.0100, 0.0100, 0.0100 };
618 const int maxSCT_Holes = 6;
619 const double goodSCT_Holes[maxSCT_Holes+1] = {0.910, 0.074, 0.014, 0.001, 0.001, 0.00001, 0.00001};
620 const double fakeSCT_Holes[maxSCT_Holes+1] = {0.910, 0.192, 0.229, 0.061, 0.065, 0.016 , 0.025};
630 const int maxDblHoles = 3;
631 const double goodDblHoles[maxDblHoles+1] = { 1. , 0.03 , 0.007 , 0.0003 };
632 const double fakeDblHoles[maxDblHoles+1] = { 1. , 0.09 , 0.09 , 0.008 };
643 const int maxB_LayerHitsITk = 8;
645 const double blayModi[maxB_LayerHitsITk + 1] = {0.25, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5};
648 const int maxB_LayerHits = 3;
649 const double goodB_LayerHits[maxB_LayerHits+1] = {0.203, 0.732, 0.081, 0.010};
650 const double fakeB_LayerHits[maxB_LayerHits+1] = {0.808, 0.174, 0.018, 0.002};
657 const int maxB_LayerHits = 3;
658 const double goodB_LayerHits[maxB_LayerHits+1] = {0.605, 0.349, 0.044, 0.010};
659 const double fakeB_LayerHits[maxB_LayerHits+1] = {0.865, 0.124, 0.011, 0.002};
671 const int maxPixelHitsITk = 26;
673 double maxScore = 30.0;
674 double minScore = 5.00;
680 (maxScore - minScore) / (maxBarrel - minBarrel), (maxScore - minScore) / (maxPixelHitsITk - minEnd)
683 for (
int i = 0;
i <= maxPixelHitsITk;
i++) {
688 const int maxPixelHits = 8;
689 const double goodPixelHits[maxPixelHits+1] = {0.095, 0.031, 0.118, 0.615, 0.137, 0.011, 0.01 , 0.011, 0.012};
690 const double fakePixelHits[maxPixelHits+1] = {0.658, 0.100, 0.091, 0.124, 0.026, 0.002, 0.001 , 0.001, 0.001};
696 const int maxPixelHits = 8;
697 const double goodPixelHits[maxPixelHits+1] = {0.401, 0.079, 0.140, 0.291, 0.011, 0.078, 0.01 , 0.011, 0.012};
698 const double fakePixelHits[maxPixelHits+1] = {0.673, 0.138, 0.113, 0.057, 0.002, 0.011, 0.001 , 0.001, 0.001};
709 const int maxPixelLayITk = 16;
711 double maxScore = 30.0;
712 double minScore = 5.00;
718 (maxScore - minScore) / (maxBarrel - minBarrel), (maxScore - minScore) / (maxPixelLayITk - minEnd)
721 for (
int i = 0;
i <= maxPixelLayITk;
i++) {
726 const int maxPixLay = 7;
727 const double goodPixLay[maxPixLay+1] = {0.095, 0.033, 0.131, 0.740, 0.840, 0.940, 1.040,1.140};
728 const double fakePixLay[maxPixLay+1] = {0.658, 0.106, 0.092, 0.144, 0.144, 0.144, 0.144,0.144};
735 const int maxPixLay = 7;
736 const double goodPixLay[maxPixLay+1] = {0.401, 0.088, 0.152, 0.355, 0.405, 0.455, 0.505, 0.555};
737 const double fakePixLay[maxPixLay+1] = {0.673, 0.146, 0.115, 0.065, 0.065, 0.065, 0.065, 0.065};
747 const int maxGangedFakes = 2;
748 const double goodGangedFakes[maxGangedFakes+1] = {0.62 , 0.23 , 0.15 };
749 const double fakeGangedFakes[maxGangedFakes+1] = {0.12 , 0.41 , 0.47 };
759 const int maxHitsITk = 26;
761 double maxScore = 40.0;
762 double minScore = 5.00;
768 (maxScore - minScore) / (maxBarrel - minBarrel), (maxScore - minScore) / (maxHitsITk - minEnd)
771 for (
int i = 0;
i <= maxHitsITk;
i++) {
772 if (
i < minEnd)
m_factorHits.push_back(0.01 + (
i * 1.0 / minEnd));
776 const int maxHits = 19;
777 const double goodSiHits[maxHits+1] = { 0.001 , 0.002 , 0.003 , 0.004 , 0.01 , 0.01 , 0.01 ,
778 0.015 , 0.02 , 0.06 , 0.1 , 0.3 , 0.2 , 0.50 , 0.055,
779 0.03 , 0.015 , 0.010 , 0.002 , 0.0005 };
780 const double fakeSiHits[maxHits+1] = { 1.0 , 1.0 , 1.0 , 1.0 , 0.5 , 0.25 , 0.15 ,
781 0.20 , 0.1 , 0.2 , 0.08 , 0.07 , 0.035 , 0.08 , 0.008,
782 0.004 , 0.0015 , 0.0008 , 0.0001 , 0.00001 };
792 const int maxTrtRatio = 7 ;
793 const double TrtRatioBounds[maxTrtRatio+1] = { 0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 2.4};
795 const double goodTrtRatio[maxTrtRatio] = { 0.05, 0.11, 0.12, 0.15, 0.20, 0.16, 0.17};
796 const double fakeTrtRatio[maxTrtRatio] = { 0.6 , 0.08, 0.06, 0.05, 0.04, 0.03, 0.03};
806 const int maxTrtFittedRatio = 4;
807 const double TrtFittedRatioBounds[maxTrtFittedRatio+1] = { 0, 0.3, 0.6, 0.9, 1.0};
809 const double goodTrtFittedRatio[maxTrtFittedRatio] = { 0.1, 0.2, 0.3, 0.5};
810 const double fakeTrtFittedRatio[maxTrtFittedRatio] = { 0.6, 0.1, 0.1, 0.1};
824 const int maxSigmaChi2 = 13 ;
825 const double SigmaChi2Bounds[maxSigmaChi2+1] = { -5.,-4.,-3.,-2.,-1.,0.,1.,2.,3.,4.,5.,6.,7.,8.};
826 const double goodSigmaChi2[maxSigmaChi2] = {0.00004, 0.0004, 0.002, 0.15, 0.8, 0.015, 0.01 , 0.009, 0.008, 0.0007 , 0.0006 , 0.0005, 0.00004};
827 const double fakeSigmaChi2[maxSigmaChi2] = {0.0008 , 0.005 , 0.02 , 0.2 , 0.3, 0.1 , 0.1 , 0.1 , 0.1 , 0.01 , 0.01 , 0.01 , 0.001};
888 for (
const auto *tsos : *
track.trackStateOnSurfaces() ) {
890 const auto *meas = tsos->measurementOnTrack();
891 const auto *
tp = tsos->trackParameters();