CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoPixelVertexing/PixelLowPtUtilities/src/ClusterShapeTrajectoryFilter.cc

Go to the documentation of this file.
00001 #include "RecoPixelVertexing/PixelLowPtUtilities/interface/ClusterShapeTrajectoryFilter.h"
00002 
00003 #include "RecoPixelVertexing/PixelLowPtUtilities/interface/ClusterShapeHitFilter.h"
00004 
00005 #include "FWCore/Framework/interface/EventSetup.h"
00006 #include "FWCore/Framework/interface/ESHandle.h"
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008 
00009 #include "TrackingTools/PatternTools/interface/Trajectory.h"
00010 #include "TrackingTools/PatternTools/interface/TempTrajectory.h"
00011 
00012 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
00013 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHit.h"
00014 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
00015 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h"
00016 #include "DataFormats/TrackerRecHit2D/interface/ProjectedSiStripRecHit2D.h"
00017 
00018 #include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
00019 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
00020 
00021 #include "MagneticField/Engine/interface/MagneticField.h"
00022 
00023 #include "CondFormats/DataRecord/interface/SiPixelLorentzAngleRcd.h"
00024 #include "CondFormats/DataRecord/interface/SiStripLorentzAngleRcd.h"
00025 
00026 #include "RecoTracker/Record/interface/CkfComponentsRecord.h"
00027 
00028 #include <vector>
00029 using namespace std;
00030 
00031 /*****************************************************************************/
00032 ClusterShapeTrajectoryFilter::~ClusterShapeTrajectoryFilter()
00033 {
00034 }
00035 
00036 /*****************************************************************************/
00037 bool ClusterShapeTrajectoryFilter::toBeContinued
00038   (Trajectory& trajectory) const 
00039 {
00040   vector<TrajectoryMeasurement> tms = trajectory.measurements();
00041 
00042   for(vector<TrajectoryMeasurement>::const_iterator
00043        tm = tms.begin(); tm!= tms.end(); tm++)
00044   {
00045     const TransientTrackingRecHit* ttRecHit = &(*((*tm).recHit()));
00046 
00047     if(ttRecHit->isValid())
00048     {
00049       const TrackingRecHit * tRecHit = ttRecHit->hit();
00050 
00051       TrajectoryStateOnSurface ts = (*tm).updatedState();
00052       const GlobalVector gdir = ts.globalDirection();
00053 
00054       if(ttRecHit->det()->subDetector() == GeomDetEnumerators::PixelBarrel ||
00055          ttRecHit->det()->subDetector() == GeomDetEnumerators::PixelEndcap)
00056       { // pixel
00057         const SiPixelRecHit* recHit =
00058            dynamic_cast<const SiPixelRecHit *>(tRecHit);
00059 
00060         if(recHit != 0)
00061           return theFilter->isCompatible(*recHit, gdir);
00062       }
00063       else
00064       { // strip
00065         if(dynamic_cast<const SiStripMatchedRecHit2D *>(tRecHit)  != 0)
00066         { // glued
00067           const SiStripMatchedRecHit2D* recHit =
00068             dynamic_cast<const SiStripMatchedRecHit2D *>(tRecHit);
00069 
00070           if(recHit != 0)
00071           { 
00072             return (theFilter->isCompatible(*(recHit->monoHit())  , gdir) &&
00073                     theFilter->isCompatible(*(recHit->stereoHit()), gdir));
00074           }
00075         }
00076         else
00077         { // single
00078           if(dynamic_cast<const SiStripRecHit2D *>(tRecHit) != 0)
00079           { // normal
00080             const SiStripRecHit2D* recHit =
00081               dynamic_cast<const SiStripRecHit2D *>(tRecHit);
00082   
00083             if(recHit != 0)
00084               return theFilter->isCompatible(*recHit, gdir);
00085           }
00086           else
00087           { // projected
00088             const ProjectedSiStripRecHit2D* recHit =
00089               dynamic_cast<const ProjectedSiStripRecHit2D *>(tRecHit);
00090  
00091             if(recHit != 0)
00092               return theFilter->isCompatible(recHit->originalHit(), gdir);
00093           }
00094         }
00095       }
00096     }
00097   }
00098 
00099   return true;
00100 }
00101 
00102 /*****************************************************************************/
00103 bool ClusterShapeTrajectoryFilter::toBeContinued
00104   (TempTrajectory& trajectory) const 
00105 {
00106   TempTrajectory::DataContainer tms = trajectory.measurements();
00107 
00108   for(TempTrajectory::DataContainer::const_iterator
00109        tm = tms.rbegin(); tm!= tms.rend(); --tm)
00110   {
00111     const TransientTrackingRecHit* ttRecHit = &(*((*tm).recHit()));
00112 
00113     if(ttRecHit->isValid())
00114     {
00115       const TrackingRecHit * tRecHit = ttRecHit->hit();
00116 
00117       TrajectoryStateOnSurface ts = (*tm).updatedState();
00118       GlobalVector gdir = ts.globalDirection();
00119 
00120       if(ttRecHit->det()->subDetector() == GeomDetEnumerators::PixelBarrel ||
00121          ttRecHit->det()->subDetector() == GeomDetEnumerators::PixelEndcap)
00122       { // pixel
00123         const SiPixelRecHit* recHit =
00124            dynamic_cast<const SiPixelRecHit *>(tRecHit);
00125 
00126         if(recHit != 0)
00127           if(! theFilter->isCompatible(*recHit, gdir))
00128           {
00129             LogTrace("TrajectFilter")
00130               << "  [TrajectFilter] fail pixel";
00131             return false;
00132           }
00133       }
00134       else
00135       { // strip
00136         if(dynamic_cast<const SiStripMatchedRecHit2D *>(tRecHit)  != 0)
00137         { // glued
00138           const SiStripMatchedRecHit2D* recHit =
00139             dynamic_cast<const SiStripMatchedRecHit2D *>(tRecHit);
00140 
00141           if(recHit != 0)
00142           { 
00143             if(! theFilter->isCompatible(*(recHit->monoHit()  ), gdir))
00144             {
00145               LogTrace("TrajectFilter")
00146                << "  [TrajectFilter] fail strip matched 1st";
00147               return false;
00148             }
00149 
00150             if(! theFilter->isCompatible(*(recHit->stereoHit()), gdir))
00151             {
00152               LogTrace("TrajectFilter")
00153                 << "  [TrajectFilter] fail strip matched 2nd";
00154               return false;
00155             }
00156           }
00157         }
00158         else
00159         { // single
00160           if(dynamic_cast<const SiStripRecHit2D *>(tRecHit) != 0)
00161           { // normal
00162             const SiStripRecHit2D* recHit =
00163               dynamic_cast<const SiStripRecHit2D *>(tRecHit);
00164   
00165             if(recHit != 0)
00166               if(! theFilter->isCompatible(*recHit, gdir))
00167               {
00168                 LogTrace("TrajectFilter")
00169                   << "  [TrajectFilter] fail strip single";
00170                 return false;
00171               }
00172           }
00173           else
00174           { // projected
00175             const ProjectedSiStripRecHit2D* recHit =
00176               dynamic_cast<const ProjectedSiStripRecHit2D *>(tRecHit);
00177  
00178             if(recHit != 0)
00179               if(! theFilter->isCompatible(recHit->originalHit(), gdir))
00180               {
00181                 LogTrace("TrajectFilter")
00182                   << "  [TrajectFilter] fail strip projected";
00183                 return false;
00184               }
00185           }
00186         }
00187       }
00188     }
00189   }
00190 
00191   return true;
00192 }
00193 
00194 /*****************************************************************************/
00195 bool ClusterShapeTrajectoryFilter::qualityFilter
00196   (const Trajectory& trajectory) const
00197 {
00198   return true;
00199 }
00200 
00201 /*****************************************************************************/
00202 bool ClusterShapeTrajectoryFilter::qualityFilter
00203   (const TempTrajectory& trajectory) const
00204 {
00205   TempTrajectory t = trajectory;
00206 
00207   // Check if ok
00208   if(toBeContinued(t)) return true;
00209 
00210   // Should take out last
00211   if(t.measurements().size() <= 3) return false;
00212 
00213   return true;
00214 }
00215