CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_2_7_hltpatch2/src/RecoTracker/TransientTrackingRecHit/src/ProjectedRecHit2D.cc

Go to the documentation of this file.
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       //if (!gdu) std::cout<<"no luck dude"<<std::endl;
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 }