00001 #include "TrackingTools/AnalyticalJacobians/interface/JacobianLocalToCartesian.h"
00002 #include "DataFormats/GeometrySurface/interface/Surface.h"
00003 #include "TrackingTools/TrajectoryParametrization/interface/LocalTrajectoryParameters.h"
00004
00005 JacobianLocalToCartesian::JacobianLocalToCartesian(const Surface& surface,
00006 const LocalTrajectoryParameters& localParameters) : theJacobian() {
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 AlgebraicVector5 localTrackParams = localParameters.mixedFormatVector();
00017 double qbp = localTrackParams[0];
00018 double dxdz = localTrackParams[1];
00019 double dydz = localTrackParams[2];
00020 TrackCharge q = localParameters.charge();
00021
00022
00023 if ( q==0 ) q = 1;
00024 double pzSign = localParameters.pzSign();
00025 double sqr = sqrt(dxdz*dxdz + dydz*dydz + 1);
00026
00027 theJacobian(0,3) = 1.;
00028 theJacobian(1,4) = 1.;
00029 theJacobian(3,0) = pzSign * ( (-q*dxdz)/(sqr*qbp*qbp) );
00030 theJacobian(3,1) = pzSign * ( q/(sqr*qbp) - (q*dxdz*dxdz)/(sqr*sqr*sqr*qbp) );
00031 theJacobian(3,2) = pzSign * ( (-q*dxdz*dydz)/(sqr*sqr*sqr*qbp) );
00032 theJacobian(4,0) = pzSign * ( (-q*dydz)/(sqr*qbp*qbp) );
00033 theJacobian(4,1) = pzSign * ( (-q*dxdz*dydz)/(sqr*sqr*sqr*qbp) );
00034 theJacobian(4,2) = pzSign * ( q/(sqr*qbp) - (q*dydz*dydz)/(sqr*sqr*sqr*qbp) );
00035 theJacobian(5,0) = pzSign * ( -q/(sqr*qbp*qbp) );
00036 theJacobian(5,1) = pzSign * ( (-q*dxdz)/(sqr*sqr*sqr*qbp) );
00037 theJacobian(5,2) = pzSign * ( (-q*dydz)/(sqr*sqr*sqr*qbp) );
00038
00039 GlobalVector g1 = surface.toGlobal(LocalVector(1., 0., 0.));
00040 GlobalVector g2 = surface.toGlobal(LocalVector(0., 1., 0.));
00041 GlobalVector g3 = surface.toGlobal(LocalVector(0., 0., 1.));
00042 AlgebraicMatrix33 Rsub;
00043 Rsub(0,0) = g1.x(); Rsub(0,1) = g2.x(); Rsub(0,2) = g3.x();
00044 Rsub(1,0) = g1.y(); Rsub(1,1) = g2.y(); Rsub(1,2) = g3.y();
00045 Rsub(2,0) = g1.z(); Rsub(2,1) = g2.z(); Rsub(2,2) = g3.z();
00046 AlgebraicMatrix66 R;
00047 R.Place_at(Rsub, 0,0);
00048 R.Place_at(Rsub, 3,3);
00049 theJacobian = R * theJacobian;
00050
00051 }
00052
00053 const AlgebraicMatrix65& JacobianLocalToCartesian::jacobian() const{
00054 return theJacobian;
00055 }
00056 const AlgebraicMatrix JacobianLocalToCartesian::jacobian_old() const{
00057 return asHepMatrix(theJacobian);
00058 }