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