00001 #include "TrackingTools/AnalyticalJacobians/interface/JacobianCurvilinearToLocal.h"
00002 #include "DataFormats/GeometrySurface/interface/Surface.h"
00003 #include "TrackingTools/TrajectoryParametrization/interface/LocalTrajectoryParameters.h"
00004 #include "MagneticField/Engine/interface/MagneticField.h"
00005
00006 JacobianCurvilinearToLocal::
00007 JacobianCurvilinearToLocal(const Surface& surface,
00008 const LocalTrajectoryParameters& localParameters,
00009 const MagneticField& magField) : theJacobian() {
00010
00011
00012 GlobalVector tn = surface.toGlobal(localParameters.momentum()).unit();
00013 GlobalVector dj = surface.toGlobal(LocalVector(1., 0., 0.));
00014 GlobalVector dk = surface.toGlobal(LocalVector(0., 1., 0.));
00015 GlobalVector di = surface.toGlobal(LocalVector(0., 0., 1.));
00016 LocalVector tnl = surface.toLocal(tn);
00017
00018 LocalVector tvw(tnl.z(), tnl.x(), tnl.y());
00019 double cosl = tn.perp(); if (cosl < 1.e-30) cosl = 1.e-30;
00020 double cosl1 = 1./cosl;
00021 GlobalVector un(-tn.y()*cosl1, tn.x()*cosl1, 0.);
00022 GlobalVector vn(-tn.z()*un.y(), tn.z()*un.x(), cosl);
00023 double uj = un.dot(dj);
00024 double uk = un.dot(dk);
00025 double vj = vn.dot(dj);
00026 double vk = vn.dot(dk);
00027 double t1r = 1./tvw.x();
00028 double t2r = t1r*t1r;
00029 double t3r = t1r*t2r;
00030 theJacobian(0,0) = 1.;
00031 theJacobian(1,1) = -uk*t2r;
00032 theJacobian(1,2) = vk*cosl*t2r;
00033 theJacobian(2,1) = uj*t2r;
00034 theJacobian(2,2) = -vj*cosl*t2r;
00035 theJacobian(3,3) = vk*t1r;
00036 theJacobian(3,4) = -uk*t1r;
00037 theJacobian(4,3) = -vj*t1r;
00038 theJacobian(4,4) = uj*t1r;
00039 GlobalPoint x = surface.toGlobal(localParameters.position());
00040
00041 GlobalVector h = magField.inTesla(x) * 2.99792458e-3;
00042 double q = -h.mag() * localParameters.signedInverseMomentum();
00043 double sinz =-un.dot(h.unit());
00044 double cosz = vn.dot(h.unit());
00045 double ui = un.dot(di);
00046 double vi = vn.dot(di);
00047 theJacobian(1,3) =-q*ui*(vk*cosz-uk*sinz)*t3r;
00048 theJacobian(1,4) =-q*vi*(vk*cosz-uk*sinz)*t3r;
00049 theJacobian(2,3) = q*ui*(vj*cosz-uj*sinz)*t3r;
00050 theJacobian(2,4) = q*vi*(vj*cosz-uj*sinz)*t3r;
00051
00052
00053 }
00054 const AlgebraicMatrix55& JacobianCurvilinearToLocal::jacobian() const {
00055 return theJacobian;
00056 }
00057 const AlgebraicMatrix JacobianCurvilinearToLocal::jacobian_old() const {
00058 return asHepMatrix(theJacobian);
00059 }