@@ -770,6 +770,76 @@ o2::dataformats::GlobalFwdTrack MatchGlobalFwd::MCHtoFwd(const o2::mch::TrackPar
770770 return convertedTrack;
771771}
772772
773+ // _________________________________________________________________________________________________
774+ o2::mch::TrackParam MatchGlobalFwd::FwdtoMCH (const o2::dataformats::GlobalFwdTrack& fwdtrack)
775+ {
776+ // Convert Forward Track parameters and covariances matrix to the
777+ // MCH track format.
778+
779+ // Parameter conversion
780+ double alpha1, alpha3, alpha4, x2, x3, x4;
781+
782+ x2 = fwdtrack.getPhi ();
783+ x3 = fwdtrack.getTanl ();
784+ x4 = fwdtrack.getInvQPt ();
785+
786+ auto sinx2 = TMath::Sin (x2);
787+ auto cosx2 = TMath::Cos (x2);
788+
789+ alpha1 = cosx2 / x3;
790+ alpha3 = sinx2 / x3;
791+ alpha4 = x4 / TMath::Sqrt (x3 * x3 + sinx2 * sinx2);
792+
793+ auto K = TMath::Sqrt (x3 * x3 + sinx2 * sinx2);
794+ auto K3 = K * K * K;
795+
796+ // Covariances matrix conversion
797+ SMatrix55Std jacobian;
798+ SMatrix55Sym covariances;
799+
800+ covariances (0 , 0 ) = fwdtrack.getCovariances ()(0 , 0 );
801+ covariances (0 , 1 ) = fwdtrack.getCovariances ()(0 , 1 );
802+ covariances (0 , 2 ) = fwdtrack.getCovariances ()(0 , 2 );
803+ covariances (0 , 3 ) = fwdtrack.getCovariances ()(0 , 3 );
804+ covariances (0 , 4 ) = fwdtrack.getCovariances ()(0 , 4 );
805+
806+ covariances (1 , 1 ) = fwdtrack.getCovariances ()(1 , 1 );
807+ covariances (1 , 2 ) = fwdtrack.getCovariances ()(1 , 2 );
808+ covariances (1 , 3 ) = fwdtrack.getCovariances ()(1 , 3 );
809+ covariances (1 , 4 ) = fwdtrack.getCovariances ()(1 , 4 );
810+
811+ covariances (2 , 2 ) = fwdtrack.getCovariances ()(2 , 2 );
812+ covariances (2 , 3 ) = fwdtrack.getCovariances ()(2 , 3 );
813+ covariances (2 , 4 ) = fwdtrack.getCovariances ()(2 , 4 );
814+
815+ covariances (3 , 3 ) = fwdtrack.getCovariances ()(3 , 3 );
816+ covariances (3 , 4 ) = fwdtrack.getCovariances ()(3 , 4 );
817+
818+ covariances (4 , 4 ) = fwdtrack.getCovariances ()(4 , 4 );
819+
820+ jacobian (0 , 0 ) = 1 ;
821+
822+ jacobian (1 , 2 ) = -sinx2 / x3;
823+ jacobian (1 , 3 ) = -cosx2 / (x3 * x3);
824+
825+ jacobian (2 , 1 ) = 1 ;
826+
827+ jacobian (3 , 2 ) = cosx2 / x3;
828+ jacobian (3 , 3 ) = -sinx2 / (x3 * x3);
829+
830+ jacobian (4 , 2 ) = -x4 * sinx2 * cosx2 / K3;
831+ jacobian (4 , 3 ) = -x3 * x4 / K3;
832+ jacobian (4 , 4 ) = 1 / K;
833+ // jacobian*covariances*jacobian^T
834+ covariances = ROOT::Math::Similarity (jacobian, covariances);
835+
836+ double cov[] = {covariances (0 , 0 ), covariances (1 , 0 ), covariances (1 , 1 ), covariances (2 , 0 ), covariances (2 , 1 ), covariances (2 , 2 ), covariances (3 , 0 ), covariances (3 , 1 ), covariances (3 , 2 ), covariances (3 , 3 ), covariances (4 , 0 ), covariances (4 , 1 ), covariances (4 , 2 ), covariances (4 , 3 ), covariances (4 , 4 )};
837+ double param[] = {fwdtrack.getX (), alpha1, fwdtrack.getY (), alpha3, alpha4};
838+
839+ o2::mch::TrackParam convertedTrack (fwdtrack.getZ (), param, cov);
840+ return o2::mch::TrackParam (convertedTrack);
841+ }
842+
773843// _________________________________________________________________________________________________
774844MatchGlobalFwd::MatchGlobalFwd ()
775845{
0 commit comments