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 {
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 {
00065 if(dynamic_cast<const SiStripMatchedRecHit2D *>(tRecHit) != 0)
00066 {
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 {
00078 if(dynamic_cast<const SiStripRecHit2D *>(tRecHit) != 0)
00079 {
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 {
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 {
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 {
00136 if(dynamic_cast<const SiStripMatchedRecHit2D *>(tRecHit) != 0)
00137 {
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 {
00160 if(dynamic_cast<const SiStripRecHit2D *>(tRecHit) != 0)
00161 {
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 {
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
00208 if(toBeContinued(t)) return true;
00209
00210
00211 if(t.measurements().size() <= 3) return false;
00212
00213 return true;
00214 }
00215