Go to the documentation of this file.00001 #include "TrackingTools/AnalyticalJacobians/interface/JacobianLocalToCurvilinear.h"
00002 #include "DataFormats/GeometrySurface/interface/Surface.h"
00003 #include "TrackingTools/TrajectoryParametrization/interface/LocalTrajectoryParameters.h"
00004 #include "TrackingTools/TrajectoryParametrization/interface/GlobalTrajectoryParameters.h"
00005
00006 #include "MagneticField/Engine/interface/MagneticField.h"
00007
00008 JacobianLocalToCurvilinear::
00009 JacobianLocalToCurvilinear(const Surface& surface,
00010 const LocalTrajectoryParameters& localParameters,
00011 const MagneticField& magField) : theJacobian() {
00012
00013
00014 GlobalPoint x = surface.toGlobal(localParameters.position());
00015 GlobalVector h = magField.inInverseGeV(x);
00016 GlobalVector hq = h*localParameters.signedInverseMomentum();
00017
00018
00019 LocalVector tnl = localParameters.direction();
00020 GlobalVector tn = surface.toGlobal(tnl);
00021
00022
00023
00024 Surface::RotationType const & rot = surface.rotation();
00025
00026 compute(rot, tnl, tn, hq);
00027 }
00028
00029 JacobianLocalToCurvilinear::
00030 JacobianLocalToCurvilinear(const Surface& surface,
00031 const LocalTrajectoryParameters& localParameters,
00032 const GlobalTrajectoryParameters& globalParameters,
00033 const MagneticField& magField) : theJacobian() {
00034
00035 GlobalPoint x = globalParameters.position();
00036 GlobalVector h = magField.inInverseGeV(x);
00037 GlobalVector hq = h*localParameters.signedInverseMomentum();
00038
00039
00040 LocalVector tnl = localParameters.direction();
00041 GlobalVector tn = surface.toGlobal(tnl);
00042
00043
00044
00045 Surface::RotationType const & rot = surface.rotation();
00046
00047 compute(rot, tnl, tn, hq);
00048 }
00049
00050
00051 void JacobianLocalToCurvilinear::compute(Surface::RotationType const & rot, LocalVector const & tnl, GlobalVector const & tn, GlobalVector const & hq) {
00052
00053
00054 GlobalVector dj(rot.x());
00055 GlobalVector dk(rot.y());
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 LocalVector tvw(tnl.z(), tnl.x(), tnl.y());
00066 double cosl = tn.perp(); if (cosl < 1.e-30) cosl = 1.e-30;
00067 double cosl1 = 1./cosl;
00068
00069
00070 GlobalVector un(-tn.y()*cosl1, tn.x()*cosl1, 0.);
00071 double uj = un.dot(dj);
00072 double uk = un.dot(dk);
00073 double sinz =-un.dot(hq);
00074
00075 GlobalVector vn(-tn.z()*un.y(), tn.z()*un.x(), cosl);
00076 double vj = vn.dot(dj);
00077 double vk = vn.dot(dk);
00078 double cosz = vn.dot(hq);
00079
00080
00081 theJacobian(0,0) = 1.;
00082 theJacobian(1,1) = tvw.x()*vj;
00083 theJacobian(1,2) = tvw.x()*vk;
00084 theJacobian(2,1) = tvw.x()*uj*cosl1;
00085 theJacobian(2,2) = tvw.x()*uk*cosl1;
00086 theJacobian(3,3) = uj;
00087 theJacobian(3,4) = uk;
00088 theJacobian(4,3) = vj;
00089 theJacobian(4,4) = vk;
00090
00091 theJacobian(1,3) = tvw.y()*sinz;
00092 theJacobian(1,4) = tvw.z()*sinz;
00093 theJacobian(2,3) = tvw.y()*(cosz*cosl1);
00094 theJacobian(2,4) = tvw.z()*(cosz*cosl1);
00095
00096
00097
00098 }
00099