CMS 3D CMS Logo

JacobianLocalToCartesian.cc

Go to the documentation of this file.
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   //LocalCoordinates 1 = (x, y, z, px, py, pz)
00009   //LocalCoordinates 2 = (q/|p|, dx/dz, dy/dz, x, y)
00010   //Transformation: x  = x
00011   //                y  = y
00012   //          px = (q/(q/|p|)) * (dx/dz) *  sqrt(1./(1.+(dx/dz)^2+(dy/dz)^2))
00013   //          py = (q/(q/|p|)) * (dy/dz) * sqrt(1./(1.+(dx/dz)^2+(dy/dz)^2))
00014   //          pz = (q/(q/|p|)) * sqrt(1./(1.+(dx/dz)^2+(dy/dz)^2))
00015   //Jacobian J((x, y, px, py, pz)  = f(q/|p|, dx/dz, dy/dz, x, y))
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   // for neutrals: qbp is 1/p instead of q/p - 
00022   //   equivalent to charge 1
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   //dbg::dbg_trace(1,"Loc2Ca", localParameters.vector(),g1,g2,g3,theJacobian);
00051 }
00052 
00053 const AlgebraicMatrix65& JacobianLocalToCartesian::jacobian() const{
00054   return theJacobian;
00055 }
00056 const AlgebraicMatrix JacobianLocalToCartesian::jacobian_old() const{
00057   return asHepMatrix(theJacobian);
00058 }

Generated on Tue Jun 9 17:48:15 2009 for CMSSW by  doxygen 1.5.4