Go to the documentation of this file.00001 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00002 #include "DataFormats/TrackReco/interface/Track.h"
00003 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00004 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00005 #include "DataFormats/GeometrySurface/interface/Surface.h"
00006 #include "TrackingTools/TrajectoryParametrization/interface/GlobalTrajectoryParameters.h"
00007 #include "Geometry/CommonDetUnit/interface/TrackingGeometry.h"
00008 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00009
00010
00011 namespace trajectoryStateTransform {
00012
00013 using namespace SurfaceSideDefinition;
00014
00015 PTrajectoryStateOnDet
00016 persistentState( const TrajectoryStateOnSurface& ts,
00017 unsigned int detid)
00018 {
00019 int surfaceSide = static_cast<int>(ts.surfaceSide());
00020
00021 if (ts.hasError()) {
00022 AlgebraicSymMatrix55 m = ts.localError().matrix();
00023
00024 int dim = 5;
00025 float localErrors[15];
00026
00027 int k = 0;
00028 for (int i=0; i<dim; i++) {
00029 for (int j=0; j<=i; j++) {
00030 localErrors[k++] = m(i,j);
00031 }
00032 }
00033 return PTrajectoryStateOnDet(ts.localParameters(),
00034 localErrors, detid,
00035 surfaceSide);
00036 }
00037 return PTrajectoryStateOnDet(ts.localParameters(),
00038 detid,
00039 surfaceSide);
00040 }
00041
00042 TrajectoryStateOnSurface
00043 transientState( const PTrajectoryStateOnDet& ts,
00044 const Surface* surface,
00045 const MagneticField* field)
00046 {
00047 AlgebraicSymMatrix55 m;
00048 bool errInv=true;
00049 if (ts.hasError()) {
00050 errInv = false;
00051 int dim = 5;
00052 int k = 0;
00053 for (int i=0; i<dim; i++) {
00054 for (int j=0; j<=i; j++) {
00055 m(i,j) = ts.error(k++);
00056 }
00057 }
00058 }
00059
00060
00061 return TrajectoryStateOnSurface( ts.parameters(),
00062 errInv ? LocalTrajectoryError(InvalidError()) : LocalTrajectoryError(m),
00063 *surface, field,
00064 static_cast<SurfaceSide>(ts.surfaceSide()));
00065
00066 }
00067
00068 FreeTrajectoryState initialFreeState( const reco::Track& tk,
00069 const MagneticField* field)
00070 {
00071 Basic3DVector<float> pos( tk.vertex());
00072 GlobalPoint gpos( pos);
00073 Basic3DVector<float> mom( tk.momentum());
00074 GlobalVector gmom( mom);
00075 GlobalTrajectoryParameters par( gpos, gmom, tk.charge(), field);
00076 CurvilinearTrajectoryError err( tk.covariance());
00077 return FreeTrajectoryState( par, err);
00078 }
00079
00080 FreeTrajectoryState innerFreeState( const reco::Track& tk,
00081 const MagneticField* field)
00082 {
00083 Basic3DVector<float> pos( tk.innerPosition());
00084 GlobalPoint gpos( pos);
00085 Basic3DVector<float> mom( tk.innerMomentum());
00086 GlobalVector gmom( mom);
00087 GlobalTrajectoryParameters par( gpos, gmom, tk.charge(), field);
00088 CurvilinearTrajectoryError err( tk.extra()->innerStateCovariance());
00089 return FreeTrajectoryState( par, err);
00090 }
00091
00092
00093 FreeTrajectoryState outerFreeState( const reco::Track& tk,
00094 const MagneticField* field)
00095 {
00096 Basic3DVector<float> pos( tk.outerPosition());
00097 GlobalPoint gpos( pos);
00098 Basic3DVector<float> mom( tk.outerMomentum());
00099 GlobalVector gmom( mom);
00100 GlobalTrajectoryParameters par( gpos, gmom, tk.charge(), field);
00101 CurvilinearTrajectoryError err( tk.extra()->outerStateCovariance());
00102 return FreeTrajectoryState( par, err);
00103 }
00104
00105
00106 TrajectoryStateOnSurface innerStateOnSurface( const reco::Track& tk,
00107 const TrackingGeometry& geom,
00108 const MagneticField* field)
00109 {
00110 const Surface& surface = geom.idToDet( DetId( tk.extra()->innerDetId()))->surface();
00111 return TrajectoryStateOnSurface( innerFreeState( tk, field), surface);
00112 }
00113
00114 TrajectoryStateOnSurface outerStateOnSurface( const reco::Track& tk,
00115 const TrackingGeometry& geom,
00116 const MagneticField* field)
00117 {
00118 const Surface& surface = geom.idToDet( DetId( tk.extra()->outerDetId()))->surface();
00119 return TrajectoryStateOnSurface( outerFreeState( tk, field), surface);
00120 }
00121
00122 }