726 std::vector<double>
res = {-999., -99., -999., -99., -100., -100., -1.,
730 const AmgSymMatrix(3) poscov = vtx->covariancePosition();
731 auto ctx =
Gaudi::Hive::currentContext();
733 if ( chi2DefToUse < 2 || (chi2DefToUse > 5 && chi2DefToUse < 8) ) {
735 std::unique_ptr<const Trk::Perigee>
737 if ( trkPerigee != NULL ) {
740 const AmgSymMatrix(5)* locError = trkPerigee->covariance();
741 if ( locError != NULL ) {
745 if ( chi2DefToUse == 1 ) {
747 Amg::Vector3D perppt(trkPerigee->momentum().y()/trkPerigee->pT(),
748 -trkPerigee->momentum().x()/trkPerigee->pT(),
750 double vtxD0Err2 = perppt.transpose()*poscov*perppt;
751 res[1] = sqrt(
pow(
res[1], 2.) + vtxD0Err2 );
752 res[3] = sqrt(
pow(
res[3], 2.) + poscov(2,2) );
754 if ( chi2DefToUse < 2 ) {
755 if ( fabs(
res[1]) > 0. && fabs(
res[3]) > 0. ) {
761 <<
" d0 = " <<
res[0] <<
", d0Err = "
762 <<
res[1] <<
", z0 = " <<
res[2]
763 <<
", z0Err = " <<
res[3]);
767 if ( chi2DefToUse > 5 && chi2DefToUse < 8 ) {
772 if ( chi2DefToUse == 6 ) {
779 AmgSymMatrix(3) mCovTrk3D = dmat.transpose()*(*locError)*dmat;
784 res[4] =
log( dvec.transpose() * (poscov+mCovTrk3D).
inverse()
786 res[7] = duvec.transpose()*poscov*duvec;
787 res[8] = duvec.transpose()*mCovTrk3D*duvec;
790 if ( chi2DefToUse == 7 ) {
798 AmgSymMatrix(2) mCovVtx2D = dmat.transpose()*poscov*dmat;
800 mCovTrk2D(0,0) = (*locError)(
Trk::
d0,
Trk::
d0);
801 mCovTrk2D(0,1) = (*locError)(
Trk::
d0,
Trk::
z0);
802 mCovTrk2D(1,0) = (*locError)(
Trk::
d0,
Trk::
z0);
803 mCovTrk2D(1,1) = (*locError)(
Trk::
z0,
Trk::
z0);
807 res[4] =
log( dvec.transpose()*(mCovVtx2D+mCovTrk2D).
inverse()
809 res[7] = duvec.transpose()*mCovVtx2D*duvec;
810 res[8] = duvec.transpose()*mCovTrk2D*duvec;
823 " locError pointer is NULL!");
827 " trkPerigee pointer is NULL!");
830 }
else if ( chi2DefToUse == 2
831 || (chi2DefToUse > 7 && chi2DefToUse < 10 )) {
836 TVector3 SV_def(vtx->
x(), vtx->
y(), vtx->
z());
840 double px = (
track->p4() ).Px();
841 double py = (
track->p4() ).Py();
844 double d0Err2 =
track->definingParametersCovMatrixVec()[0];
846 double z0Err2 =
track->definingParametersCovMatrixVec()[2];
848 double d0z0Cov =
track->definingParametersCovMatrixVec()[1];
852 TVector3 SV = SV_def - trk_origin;
857 double d0toSV =
d0 + (SV[0]*upx + SV[1]*upy);
858 double d0toSVErr2 = upx*SV_cov(0, 0)*upx + 2*upx*SV_cov(1, 0)*upy
859 + upy*SV_cov(1, 1)*upy + d0Err2;
864 double z0corr = (SV[0]*upx + SV[1]*upy)*cot_theta;
865 double z0toSV =
z0 + z0corr - SV[2];
866 double z0toSVErr2 = SV_cov(2, 2) + z0Err2;
868 double docaSV = sqrt(
pow(d0toSV, 2) +
pow(z0toSV, 2) );
870 double chi2testSV(999.);
871 if ( chi2DefToUse == 2 ) {
872 if (d0toSVErr2 !=0 && z0toSVErr2 != 0)
873 chi2testSV =
log(
pow( d0toSV, 2)/d0toSVErr2
874 +
pow( z0toSV, 2)/z0toSVErr2);
876 res = {d0toSV, sqrt(d0toSVErr2), z0toSV, sqrt(z0toSVErr2),
877 chi2testSV, (doDCAin3D ? docaSV : d0toSV), 4,
880 if ( chi2DefToUse > 7 && chi2DefToUse < 10 ) {
882 if ( chi2DefToUse == 8 ) {
887 dmat(2,0) = -d0toSV*
cos(
phi);
888 dmat(2,1) = -d0toSV*
sin(
phi);
890 track->definingParametersCovMatrix();
891 AmgSymMatrix(3) mCovTrk3D = dmat.transpose()*mCovTrk5D*dmat;
896 double chi2testSV =
log( dvec.transpose()
899 double vtx3DErr2 = duvec.transpose()*poscov*duvec;
900 double trk3DErr2 = duvec.transpose()*mCovTrk3D*duvec;
902 res = {d0toSV, sqrt(d0Err2), z0toSV, sqrt(z0Err2),
903 chi2testSV, (doDCAin3D ? docaSV : d0toSV), 5,
904 vtx3DErr2, trk3DErr2,
phi};
906 if ( chi2DefToUse == 9 ) {
914 AmgSymMatrix(2) mCovVtx2D = dmat.transpose()*SV_cov*dmat;
916 mCovTrk2D(0,0) = d0Err2;
917 mCovTrk2D(0,1) = d0z0Cov;
918 mCovTrk2D(1,0) = d0z0Cov;
919 mCovTrk2D(1,1) = z0Err2;
923 chi2testSV =
log( dvec.transpose()*(mCovVtx2D+mCovTrk2D).
inverse()
925 double vtx2DErr2 = duvec.transpose()*mCovVtx2D*duvec;
926 double trk2DErr2 = duvec.transpose()*mCovTrk2D*duvec;
928 if ( vtx2DErr2 < 0. || trk2DErr2 < 0. ) {
930 "getTrackLogChi2DCA(): "
931 <<
"vtx2DErr2 = " << vtx2DErr2
932 <<
" trk2DErr2 = " << trk2DErr2
933 <<
" chi2testSV = " << chi2testSV);
943 <<
" z0toSV = " << z0toSV
945 <<
" docaSV = " << docaSV);
949 res = {d0toSV, sqrt(d0Err2), z0toSV, sqrt(z0Err2),
950 chi2testSV, (doDCAin3D ? docaSV : d0toSV), 6,
951 vtx2DErr2, trk2DErr2,
phi};
955 <<
" docaSV == 0 !");
959 }
else if ( chi2DefToUse > 2 && chi2DefToUse < 5 ) {
965 if (chi2DefToUse == 4) {
978 double z0toPV =
track->z0() +
track->vz() - vtx->
z();
979 double z0Err2 =
track->definingParametersCovMatrixVec()[2];
980 if (chi2DefToUse == 4) z0Err2+= vtx->covariancePosition()(2,2);
981 double z0sign = z0toPV / sqrt( z0Err2 );
984 res = {-999., -99., z0toPV, sqrt(z0Err2),
chi2, -100., 4, -99., -99.,
990 " track pointer is NULL!");