00001 #include "RecoTracker/TransientTrackingRecHit/interface/ProjectedRecHit2D.h"
00002 #include "TrackingTools/TransientTrackingRecHit/interface/TrackingRecHitProjector.h"
00003 #include "RecoTracker/TransientTrackingRecHit/interface/TSiStripRecHit2DLocalPos.h"
00004 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
00005
00006
00007 ProjectedRecHit2D::ProjectedRecHit2D( const LocalPoint& pos, const LocalError& err,
00008 const GeomDet* det, const GeomDet* originalDet,
00009 const TransientTrackingRecHit& originalTransientHit) :
00010 GenericTransientTrackingRecHit( det, new ProjectedSiStripRecHit2D( pos, err, det->geographicalId(),
00011 static_cast<const SiStripRecHit2D*>(originalTransientHit.hit()) ) )
00012 {
00013 const TSiStripRecHit2DLocalPos* specificOriginalTransientHit = static_cast<const TSiStripRecHit2DLocalPos*>(&originalTransientHit);
00014 theCPE = specificOriginalTransientHit->cpe();
00015 theOriginalDet = originalDet;
00016 }
00017
00018 ProjectedRecHit2D::RecHitPointer
00019 ProjectedRecHit2D::clone( const TrajectoryStateOnSurface& ts) const
00020 {
00021 if (theCPE != 0) {
00022 TrackingRecHitProjector<ProjectedRecHit2D> proj;
00023 if(!originalHit().cluster().isNull()){
00024 const SiStripCluster& clust = *(originalHit().cluster());
00025
00026 const GeomDetUnit * gdu = reinterpret_cast<const GeomDetUnit *>(theOriginalDet);
00027
00028 StripClusterParameterEstimator::LocalValues lv =
00029 theCPE->localParameters( clust, *gdu, ts);
00030
00031 RecHitPointer updatedOriginalHit =
00032 TSiStripRecHit2DLocalPos::build( lv.first, lv.second, theOriginalDet,
00033 originalHit().cluster(), theCPE);
00034
00035 RecHitPointer hit = proj.project( *updatedOriginalHit, *det(), ts);
00036
00037 return hit;
00038 }else{
00039 const SiStripCluster& clust = *(originalHit().cluster_regional());
00040
00041 const GeomDetUnit * gdu = reinterpret_cast<const GeomDetUnit *>(theOriginalDet);
00042 StripClusterParameterEstimator::LocalValues lv =
00043 theCPE->localParameters( clust, *gdu, ts);
00044
00045 RecHitPointer updatedOriginalHit =
00046 TSiStripRecHit2DLocalPos::build( lv.first, lv.second, theOriginalDet,
00047 originalHit().cluster_regional(), theCPE);
00048
00049 RecHitPointer hit = proj.project( *updatedOriginalHit, *det(), ts);
00050
00051 return hit;
00052
00053 }
00054 }
00056 else return clone();
00057 }
00058
00059 TransientTrackingRecHit::ConstRecHitContainer
00060 ProjectedRecHit2D::transientHits () const {
00061 ConstRecHitContainer result;
00062 result.push_back(TSiStripRecHit2DLocalPos::build( theOriginalDet,&originalHit(),theCPE));
00063
00064 return result;
00065 }
00066
00067 ProjectedRecHit2D::ProjectedRecHit2D( const GeomDet * geom, const GeomDet* originaldet,
00068 const ProjectedSiStripRecHit2D* rh,
00069 const StripClusterParameterEstimator* cpe,
00070 bool computeCoarseLocalPosition) :
00071 GenericTransientTrackingRecHit( geom, *rh), theCPE(cpe), theOriginalDet(originaldet) {
00072 if (computeCoarseLocalPosition){
00073 if (theCPE != 0) {
00074 TrackingRecHitProjector<ProjectedRecHit2D> proj;
00075 if(!originalHit().cluster().isNull()){
00076 const SiStripCluster& clust = *(originalHit().cluster());
00077
00078 StripClusterParameterEstimator::LocalValues lv =
00079 theCPE->localParameters( clust, *detUnit());
00080
00081 RecHitPointer updatedOriginalHit =
00082 TSiStripRecHit2DLocalPos::build( lv.first, lv.second, theOriginalDet,
00083 originalHit().cluster(), theCPE);
00084
00085 RecHitPointer hit = proj.project( *updatedOriginalHit, *det());
00086 trackingRecHit_ = hit->hit()->clone();
00087 }else{
00088 const SiStripCluster& clust = *(originalHit().cluster_regional());
00089
00090 StripClusterParameterEstimator::LocalValues lv =
00091 theCPE->localParameters( clust, *detUnit());
00092
00093 RecHitPointer updatedOriginalHit =
00094 TSiStripRecHit2DLocalPos::build( lv.first, lv.second, theOriginalDet,
00095 originalHit().cluster_regional(), theCPE);
00096
00097 RecHitPointer hit = proj.project( *updatedOriginalHit, *det());
00098 trackingRecHit_ = hit->hit()->clone();
00099 }
00100 }
00101 }
00102 }