File indexing completed on 2023-03-17 11:26:19
0001 #include "TrackingTools/AnalyticalJacobians/interface/JacobianCartesianToLocal.h"
0002 #include "DataFormats/GeometrySurface/interface/Surface.h"
0003 #include "TrackingTools/TrajectoryParametrization/interface/LocalTrajectoryParameters.h"
0004
0005 JacobianCartesianToLocal::JacobianCartesianToLocal(const Surface& surface,
0006 const LocalTrajectoryParameters& localParameters)
0007 : theJacobian() {
0008
0009
0010
0011
0012
0013
0014
0015 LocalVector plocal = localParameters.momentum();
0016 double px = plocal.x(), py = plocal.y(), pz = plocal.z();
0017 double p = plocal.mag();
0018 TrackCharge q = localParameters.charge();
0019
0020
0021 if (q == 0)
0022 q = 1;
0023
0024 theJacobian(0, 3) = -q * px / (p * p * p);
0025 theJacobian(0, 4) = -q * py / (p * p * p);
0026 theJacobian(0, 5) = -q * pz / (p * p * p);
0027 if (fabs(pz) > 0) {
0028 theJacobian(1, 3) = 1. / pz;
0029 theJacobian(1, 5) = -px / (pz * pz);
0030 theJacobian(2, 4) = 1. / pz;
0031 theJacobian(2, 5) = -py / (pz * pz);
0032 }
0033 theJacobian(3, 0) = 1.;
0034 theJacobian(4, 1) = 1.;
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 AlgebraicMatrix33 Rsub;
0047
0048 Surface::RotationType const& rot = surface.rotation();
0049 Rsub(0, 0) = rot.xx();
0050 Rsub(0, 1) = rot.xy();
0051 Rsub(0, 2) = rot.xz();
0052 Rsub(1, 0) = rot.yx();
0053 Rsub(1, 1) = rot.yy();
0054 Rsub(1, 2) = rot.yz();
0055 Rsub(2, 0) = rot.zx();
0056 Rsub(2, 1) = rot.zy();
0057 Rsub(2, 2) = rot.zz();
0058
0059 AlgebraicMatrix66 R;
0060 R.Place_at(Rsub, 0, 0);
0061 R.Place_at(Rsub, 3, 3);
0062 theJacobian = theJacobian * R;
0063
0064 }