00001 #include "TrackingTools/GeomPropagators/interface/StraightLinePropagator.h"
00002
00003 #include "DataFormats/Math/interface/AlgebraicROOTObjects.h"
00004 #include "DataFormats/GeometrySurface/interface/Plane.h"
00005 #include "DataFormats/GeometrySurface/interface/Cylinder.h"
00006 #include "TrackingTools/GeomPropagators/interface/PropagationExceptions.h"
00007
00008 std::pair<TrajectoryStateOnSurface,double>
00009 StraightLinePropagator::propagateWithPath(const FreeTrajectoryState& fts,
00010 const Plane& plane) const
00011 {
00012
00013 LocalPoint x;
00014 LocalVector p;
00015 double s = 0;
00016 bool parametersOK = propagateParametersOnPlane(fts, plane, x, p, s);
00017 if(!parametersOK) return std::make_pair(TrajectoryStateOnSurface(), 0.);
00018
00019
00020 if (fts.hasError()) {
00021 return std::make_pair( propagatedState(fts, plane, jacobian(s), x, p), s);
00022 } else {
00023
00024 return std::make_pair(TSOS(LocalTrajectoryParameters(x, p, fts.charge()),
00025 plane, theField), s);
00026 }
00027 }
00028
00029 std::pair<TrajectoryStateOnSurface,double>
00030 StraightLinePropagator::propagateWithPath(const FreeTrajectoryState& fts,
00031 const Cylinder& cylinder) const
00032 {
00033
00034 GlobalPoint x;
00035 GlobalVector p;
00036 double s = 0;
00037 bool parametersOK = propagateParametersOnCylinder(fts, cylinder, x, p, s);
00038 if(!parametersOK) return std::make_pair(TrajectoryStateOnSurface(), 0.);
00039
00040
00041 if (fts.hasError()) {
00042 return std::make_pair( propagatedState(fts, cylinder, jacobian(s), x, p), s);
00043 } else {
00044
00045 return std::make_pair(TSOS(GlobalTrajectoryParameters(x, p, fts.charge(),theField),
00046 cylinder), s);
00047 }
00048 }
00049
00050 TrajectoryStateOnSurface
00051 StraightLinePropagator::propagatedState(const FTS& fts,
00052 const Surface& surface,
00053 const AlgebraicMatrix55& jacobian,
00054 const LocalPoint& x,
00055 const LocalVector& p) const {
00056 if(fts.hasError()) {
00057
00058 TSOS tmp( fts, surface);
00059 const AlgebraicSymMatrix55 & eLocal =tmp.localError().matrix();
00060 AlgebraicSymMatrix55 lte = ROOT::Math::Similarity(jacobian,eLocal);
00061 LocalTrajectoryError eloc(lte);
00062 LocalTrajectoryParameters ltp(x, p, fts.charge());
00063 return TSOS(ltp, eloc, surface, theField);
00064 } else {
00065
00066 return TSOS(LocalTrajectoryParameters(x, p, fts.charge()), surface, theField);
00067 }
00068 }
00069
00070 TrajectoryStateOnSurface
00071 StraightLinePropagator::propagatedState(const FTS& fts,
00072 const Surface& surface,
00073 const AlgebraicMatrix55& jacobian,
00074 const GlobalPoint& x,
00075 const GlobalVector& p) const {
00076
00077 if(fts.hasError()) {
00078
00079 TSOS tmp(fts, surface);
00080 const AlgebraicSymMatrix55 & eLocal =tmp.localError().matrix();
00081 AlgebraicSymMatrix55 lte = ROOT::Math::Similarity(jacobian,eLocal);
00082 LocalTrajectoryError eloc(lte);
00083
00084 TSOS tmp2(tmp.localParameters(), eloc, surface, theField);
00085 GlobalTrajectoryParameters gtp(x, p, fts.charge(), theField);
00086 return TSOS(gtp, tmp2.cartesianError(), surface);
00087 } else {
00088
00089 return TSOS(GlobalTrajectoryParameters(x, p, fts.charge(), theField), surface);
00090 }
00091 }
00092
00093 AlgebraicMatrix55 StraightLinePropagator::jacobian(double& s) const {
00094
00095 AlgebraicMatrix55 j = AlgebraicMatrixID();
00096
00097 double dir = (propagationDirection() == alongMomentum) ? 1. : -1.;
00098 if (s*dir < 0.) return j;
00099
00100 j(3,1) = s;
00101 j(4,2) = s;
00102
00103 return j;
00104 }
00105
00106 bool StraightLinePropagator::propagateParametersOnCylinder(const FTS& fts,
00107 const Cylinder& cylinder,
00108 GlobalPoint& x,
00109 GlobalVector& p,
00110 double& s) const {
00111 GlobalPoint sp = cylinder.toGlobal(LocalPoint(0., 0.));
00112 if (sp.x()!=0. || sp.y()!=0.) {
00113 throw PropagationException("Cannot propagate to an arbitrary cylinder");
00114 }
00115
00116 x = fts.position();
00117 p = fts.momentum();
00118 s = cylinder.radius() - x.perp();
00119
00120 double dir = (propagationDirection() == alongMomentum) ? 1. : -1.;
00121 if(s*dir < 0.) return false;
00122
00123 double dt = s/p.perp();
00124 x = GlobalPoint(x.x() + p.x()*dt,
00125 x.y() + p.y()*dt,
00126 x.z() + p.z()*dt);
00127
00128 return true;
00129 }
00130
00131 bool StraightLinePropagator::propagateParametersOnPlane(const FTS& fts,
00132 const Plane& plane,
00133 LocalPoint& x,
00134 LocalVector& p,
00135 double& s) const {
00136
00137
00138
00139 x = plane.toLocal(fts.position());
00140 p = plane.toLocal(fts.momentum());
00141 s = -x.z();
00142
00143
00144
00145 if ((p.x() != 0 || p.y() != 0) && p.z() == 0 && s!= 0) return false;
00146
00147 x = LocalPoint( x.x() + (p.x()/p.z())*s,
00148 x.y() + (p.y()/p.z())*s,
00149 x.z() + s);
00150
00151 return true;
00152 }
00153
00154
00155
00156
00157