00001 #ifndef TrackingRecHitProjector_H
00002 #define TrackingRecHitProjector_H
00003
00004 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
00005
00006
00007 template <class ResultingHit>
00008 class TrackingRecHitProjector {
00009 public:
00010
00011 typedef TransientTrackingRecHit::RecHitPointer RecHitPointer;
00012
00013 RecHitPointer project( const TransientTrackingRecHit& hit,
00014 const GeomDet& det,
00015 const TrajectoryStateOnSurface& ts) const {
00016
00017 GlobalVector gdir = ts.globalParameters().momentum();
00018 const BoundPlane& gluedPlane = det.surface();
00019 const BoundPlane& hitPlane = hit.det()->surface();
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 double delta = gluedPlane.localZ( hitPlane.position());
00033 LocalVector ldir = gluedPlane.toLocal(gdir);
00034 LocalPoint lhitPos = gluedPlane.toLocal( hit.globalPosition());
00035 LocalPoint projectedHitPos = lhitPos - ldir * delta/ldir.z();
00036
00037 LocalVector hitXAxis = gluedPlane.toLocal( hitPlane.toGlobal( LocalVector(1,0,0)));
00038 LocalError hitErr = hit.localPositionError();
00039 if (gluedPlane.normalVector().dot( hitPlane.normalVector()) < 0) {
00040
00041 hitErr = LocalError( hitErr.xx(), -hitErr.xy(), hitErr.yy());
00042 }
00043 LocalError rotatedError = hitErr.rotate( hitXAxis.x(), hitXAxis.y());
00044
00045 return ResultingHit::build( projectedHitPos, rotatedError, &det, hit.det(), hit);
00046 }
00047
00048 };
00049
00050 #endif