CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/RecoTracker/SingleTrackPattern/interface/CRackTrajectoryBuilder.h

Go to the documentation of this file.
00001 #ifndef CRackTrajectoryBuilder_h
00002 #define CRackTrajectoryBuilder_h
00003 
00004 //
00005 // Package:         RecoTracker/SingleTrackPattern
00006 // Class:           CRackTrajectoryBuilder
00007 // Original Author:  Michele Pioppi-INFN perugia
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 //to sort hits by the det position
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      //  if (gp1.y()== gp2.y())
00059      // 
00060      return (rh1->geographicalId() < rh2->geographicalId());
00061    };
00062     private:
00063    //   edm::ESHandle<TrackerGeometry> _tracker;
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      //  if (gp1.y()== gp2.y())
00084      // 
00085      return (rh1->geographicalId() < rh2->geographicalId());
00086    };
00087     private:
00088    //   edm::ESHandle<TrackerGeometry> _tracker;
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   //   edm::ESHandle<TrackerGeometry> _tracker;
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    //   edm::ESHandle<TrackerGeometry> _tracker;
00120    const TrackerGeometry& _tracker;
00121  };
00122 
00123 #endif
00124 
00125 class CRackTrajectoryBuilder 
00126 {
00127 //  using namespace std;
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   //  typedef std::pair<TrackingRecHitIterator, TSOS> PairTrackingRecHitTsos; 
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      //this might have a better performance ...
00159      //       float dist1 = ( gp1.x()-gpT.x() ) * ( gp1.x()-gpT.x() ) + ( gp1.y()-gpT.y() ) * ( gp1.y()-gpT.y() ) + ( gp1.z()-gpT.z() ) * ( gp1.z()-gpT.z() );
00160      //       float dist2 = ( gp2.x()-gpT.x() ) * ( gp2.x()-gpT.x() ) + ( gp2.y()-gpT.y() ) * ( gp2.y()-gpT.y() ) + ( gp2.z()-gpT.z() ) * ( gp2.z()-gpT.z() );
00161      //if ( dist1<dist2 )
00162 
00163      //     if ( gpDiff1.mag2() < gpDiff2.mag2() )
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     //    std::vector<TrackingRecHitRange> SortByTrajectory (const std::vector<TrackingRecHitRange>& inputHits);
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     //          edm::OwnVector<TransientTrackingRecHit> hits);
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 //   AnalyticalPropagator *thePropagator;
00242 //   AnalyticalPropagator *thePropagatorOp;
00243 
00244    KFUpdator *theUpdator;
00245    Chi2MeasurementEstimator *theEstimator;
00246    const TransientTrackingRecHitBuilder *RHBuilder;
00247    const KFTrajectorySmoother * theSmoother;
00248    const KFTrajectoryFitter * theFitter;
00249 //   const KFTrajectoryFitter * theFitterOp;
00250 
00251    bool debug_info;
00252    bool fastPropagation;
00253    bool useMatchedHits;
00254 
00255    int theMinHits;
00256    double chi2cut;
00257    std::vector<Trajectory> trajFit;
00258    //RC edm::OwnVector<const TransientTrackingRecHit> hits;
00259    TransientTrackingRecHit::RecHitContainer  hits;
00260    bool seed_plus;
00261    std::string geometry;
00262 //   TransientInitialStateEstimator*  theInitialState;
00263 };
00264 
00265 #endif