Go to the documentation of this file.00001 #ifndef CRackTrajectoryBuilder_h
00002 #define CRackTrajectoryBuilder_h
00003
00004
00005
00006
00007
00008
00009 #include <string>
00010
00011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00012 #include "FWCore/Framework/interface/EventSetup.h"
00013
00014 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00015 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h"
00016 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2DCollection.h"
00017 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2DCollection.h"
00018 #include "DataFormats/TrackCandidate/interface/TrackCandidateCollection.h"
00019 #include "TrackingTools/PatternTools/interface/Trajectory.h"
00020 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00021 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00022 #include "TrackingTools/GeomPropagators/interface/AnalyticalPropagator.h"
00023 #include "TrackingTools/KalmanUpdators/interface/KFUpdator.h"
00024 #include "TrackingTools/KalmanUpdators/interface/Chi2MeasurementEstimator.h"
00025 #include "MagneticField/Engine/interface/MagneticField.h"
00026 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00027 #include "RecoTracker/TkDetLayers/interface/GeometricSearchTracker.h"
00028 #include "RecoTracker/Record/interface/TrackerRecoGeometryRecord.h"
00029 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
00030 #include "DataFormats/TrackReco/interface/Track.h"
00031 #include "DataFormats/TrackReco/interface/TrackExtra.h"
00032 #include "TrackingTools/TrackFitters/interface/KFTrajectoryFitter.h"
00033 #include "TrackingTools/TrackFitters/interface/KFTrajectorySmoother.h"
00034 #include "TrackingTools/MeasurementDet/interface/LayerMeasurements.h"
00035 #include "RecoTracker/MeasurementDet/interface/MeasurementTracker.h"
00036 #include "TrackingTools/MaterialEffects/interface/PropagatorWithMaterial.h"
00037
00038 #include "FWCore/Framework/interface/ESHandle.h"
00039
00040
00041
00042 class CompareDetY_plus {
00043 public:
00044 CompareDetY_plus(const TrackerGeometry& tracker):_tracker(tracker){}
00045 bool operator()( const TrackingRecHit *rh1,
00046 const TrackingRecHit *rh2)
00047 {
00048 const GeomDet* detPos1 = _tracker.idToDet(rh1->geographicalId());
00049 const GeomDet* detPos2 = _tracker.idToDet(rh2->geographicalId());
00050
00051 GlobalPoint gp1 = detPos1->position();
00052 GlobalPoint gp2 = detPos2->position();
00053
00054 if (gp1.y()>gp2.y())
00055 return true;
00056 if (gp1.y()<gp2.y())
00057 return false;
00058
00059
00060 return (rh1->geographicalId() < rh2->geographicalId());
00061 };
00062 private:
00063
00064 const TrackerGeometry& _tracker;
00065 };
00066
00067 class CompareDetY_minus {
00068 public:
00069 CompareDetY_minus(const TrackerGeometry& tracker):_tracker(tracker){}
00070 bool operator()( const TrackingRecHit *rh1,
00071 const TrackingRecHit *rh2)
00072 {
00073 const GeomDet* detPos1 = _tracker.idToDet(rh1->geographicalId());
00074 const GeomDet* detPos2 = _tracker.idToDet(rh2->geographicalId());
00075
00076 GlobalPoint gp1 = detPos1->position();
00077 GlobalPoint gp2 = detPos2->position();
00078
00079 if (gp1.y()<gp2.y())
00080 return true;
00081 if (gp1.y()>gp2.y())
00082 return false;
00083
00084
00085 return (rh1->geographicalId() < rh2->geographicalId());
00086 };
00087 private:
00088
00089 const TrackerGeometry& _tracker;
00090 };
00091
00092 #ifndef TrajectoryBuilder_CompareHitY
00093 #define TrajectoryBuilder_CompareHitY
00094
00095 class CompareHitY {
00096 public:
00097 CompareHitY(const TrackerGeometry& tracker):_tracker(tracker){}
00098 bool operator()( const TrackingRecHit *rh1,
00099 const TrackingRecHit *rh2)
00100 {
00101 GlobalPoint gp1=_tracker.idToDet(rh1->geographicalId())->surface().toGlobal(rh1->localPosition());
00102 GlobalPoint gp2=_tracker.idToDet(rh2->geographicalId())->surface().toGlobal(rh2->localPosition());
00103 return gp1.y()<gp2.y();};
00104 private:
00105
00106 const TrackerGeometry& _tracker;
00107 };
00108
00109 class CompareHitY_plus {
00110 public:
00111 CompareHitY_plus(const TrackerGeometry& tracker):_tracker(tracker){}
00112 bool operator()( const TrackingRecHit *rh1,
00113 const TrackingRecHit *rh2)
00114 {
00115 GlobalPoint gp1=_tracker.idToDet(rh1->geographicalId())->surface().toGlobal(rh1->localPosition());
00116 GlobalPoint gp2=_tracker.idToDet(rh2->geographicalId())->surface().toGlobal(rh2->localPosition());
00117 return gp1.y()>gp2.y();};
00118 private:
00119
00120 const TrackerGeometry& _tracker;
00121 };
00122
00123 #endif
00124
00125 class CRackTrajectoryBuilder
00126 {
00127
00128
00129 typedef TrajectoryStateOnSurface TSOS;
00130 typedef TrajectoryMeasurement TM;
00131
00132 typedef std::vector<const TrackingRecHit*>::iterator TrackingRecHitIterator;
00133
00134 typedef std::pair<TrackingRecHitIterator, TrackingRecHitIterator> TrackingRecHitRange;
00135 typedef std::vector<TrackingRecHitRange>::iterator TrackingRecHitRangeIterator;
00136
00137
00138 typedef std::pair<TrackingRecHitRangeIterator, TSOS> PairTrackingRecHitTsos;
00139
00140 public:
00141 class CompareDetByTraj;
00142 friend class CompareDetByTraj;
00143
00144 class CompareDetByTraj {
00145 public:
00146 CompareDetByTraj(const TSOS& tSos ):_tSos(tSos)
00147 {};
00148 bool operator()( const std::pair<TrackingRecHitRangeIterator, TSOS> rh1,
00149 const std::pair<TrackingRecHitRangeIterator, TSOS> rh2)
00150 {
00151 GlobalPoint gp1 = rh1.second.globalPosition();
00152 GlobalPoint gp2 = rh2.second.globalPosition();
00153
00154 GlobalPoint gpT = _tSos.globalPosition();
00155 GlobalVector gpDiff1 = gp1-gpT;
00156 GlobalVector gpDiff2 = gp2-gpT;
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 float dist1 = gpDiff1 * _tSos.globalDirection();
00167 float dist2 = gpDiff2 * _tSos.globalDirection();
00168
00169 if (dist1 < 0)
00170 return false;
00171 if ( dist1<dist2 )
00172 return true;
00173
00174 return false;
00175 };
00176 private:
00177 const TrajectoryStateOnSurface& _tSos;
00178 };
00179
00180
00181
00182 public:
00183
00184 CRackTrajectoryBuilder(const edm::ParameterSet& conf);
00185 ~CRackTrajectoryBuilder();
00186
00188
00189 void run(const TrajectorySeedCollection &collseed,
00190 const SiStripRecHit2DCollection &collstereo,
00191 const SiStripRecHit2DCollection &collrphi ,
00192 const SiStripMatchedRecHit2DCollection &collmatched,
00193 const SiPixelRecHitCollection &collpixel,
00194 const edm::EventSetup& es,
00195 edm::Event& e,
00196 std::vector<Trajectory> &trajoutput);
00197
00198 void init(const edm::EventSetup& es,bool);
00199 Trajectory createStartingTrajectory( const TrajectorySeed& seed) const;
00200 private:
00201 std::vector<TrajectoryMeasurement> seedMeasurements(const TrajectorySeed& seed) const;
00202
00203
00204 std::vector<const TrackingRecHit*> SortHits(const SiStripRecHit2DCollection &collstereo,
00205 const SiStripRecHit2DCollection &collrphi ,
00206 const SiStripMatchedRecHit2DCollection &collmatched,
00207 const SiPixelRecHitCollection &collpixel,
00208 const TrajectorySeed &seed,
00209 const bool bAddSeedHits
00210 );
00211
00212
00213
00214
00215
00216 TSOS startingTSOS(const TrajectorySeed& seed)const;
00217 void updateTrajectory( Trajectory& traj,
00218 const TM& tm,
00219 const TransientTrackingRecHit& hit) const;
00220
00221 void AddHit(Trajectory &traj,
00222 const std::vector<const TrackingRecHit*>&Hits,
00223 Propagator *currPropagator
00224 );
00225
00226 bool qualityFilter(const Trajectory& traj);
00227
00228 bool isDifferentStripReHit2D (const SiStripRecHit2D& hitA, const SiStripRecHit2D& hitB );
00229
00230 std::pair<TrajectoryStateOnSurface, const GeomDet*>
00231 innerState( const Trajectory& traj) const;
00232
00233 private:
00234 edm::ESHandle<MagneticField> magfield;
00235 edm::ESHandle<TrackerGeometry> tracker;
00236 edm::ParameterSet conf_;
00237
00238 PropagatorWithMaterial *thePropagator;
00239 PropagatorWithMaterial *thePropagatorOp;
00240
00241
00242
00243
00244 KFUpdator *theUpdator;
00245 Chi2MeasurementEstimator *theEstimator;
00246 const TransientTrackingRecHitBuilder *RHBuilder;
00247 const KFTrajectorySmoother * theSmoother;
00248 const KFTrajectoryFitter * theFitter;
00249
00250
00251 bool debug_info;
00252 bool fastPropagation;
00253 bool useMatchedHits;
00254
00255 int theMinHits;
00256 double chi2cut;
00257 std::vector<Trajectory> trajFit;
00258
00259 TransientTrackingRecHit::RecHitContainer hits;
00260 bool seed_plus;
00261 std::string geometry;
00262
00263 };
00264
00265 #endif