00001
00002
00003 #ifndef StiKalmanTrackFinder_H_INCLUDED
00004 #define StiKalmanTrackFinder_H_INCLUDED
00005 #include "Sti/StiTrackFinder.h"
00006 #include "Sti/Base/Named.h"
00007 #include "Sti/Base/Described.h"
00008 #ifdef DO_TPCCATRACKER
00009 class StiTPCCATrackerInterface;
00010 #endif
00011 class TStopwatch;
00012 class StiDetector;
00013 class StiDetectorBuilder;
00014 class StiDetectorContainer;
00015 class StiToolkit;
00016 class StiKalmanTrackFactory;
00017 class StiHitContainer;
00018 class StiTrackContainer;
00019 class StiTrack;
00020 class StiKalmanTrack;
00021 class StiKalmanTrackNode;
00022 template<class Factorized>class Factory;
00023
00024
00034 class StiKalmanTrackFinder : public StiTrackFinder, public Named, public Described
00035 {
00036 public:
00037 StiKalmanTrackFinder() {}
00038 StiKalmanTrackFinder(StiToolkit *toolkit);
00039 virtual ~StiKalmanTrackFinder() {}
00041 virtual void initialize();
00043 void setTiming();
00045 #ifdef DO_TPCCATRACKER
00046 virtual void findTpcTracks(StiTPCCATrackerInterface &caTrackerInt);
00047 #endif
00048 virtual void findAllTracks();
00049 virtual void findTracks();
00051 bool find(StiTrack *track, int direction, double rmin=0);
00053 virtual StiTrack * findTrack(double rMin=0);
00055 void extendSeeds (double rMin);
00056 void extendTracks(double rMin);
00058 int extendTrack(StiKalmanTrack *track,double rMin);
00060 void extendTracksToVertex(StiHit* vertex);
00061 void extendTracksToVertices(const std::vector<StiHit*> &vertices);
00063 int getNTracks() const ;
00064 int getNPrims() const { return _nPrimTracks;}
00066 virtual void reset();
00067 virtual void unset(){}
00068
00070 virtual void clear();
00072 virtual void finish() const;
00073 virtual Int_t Fit(StiKalmanTrack *track, Double_t rMin=0);
00075 virtual Filter<StiTrack> * getTrackFilter();
00077 void doInitLayer(int trackingDirection);
00078 void doNextDetector();
00079 void doFinishLayer();
00080 void doFinishTrackSearch();
00081 void doNextTrackStep();
00082 static void setDebug(int m = 0) {_debug = m;}
00083 static int debug() {return _debug;}
00084 #ifdef DO_TPCCATRACKER
00085 static void PrintFitStatus(const int status, const StiKalmanTrack* track);
00086 #endif
00087 typedef enum{
00088 kNoErrors = 0,
00089 kApproxFail,
00090 kFitFail,
00091 kExtendFail,
00092 kCheckFail
00093 } TFitStatus;
00094
00095 typedef enum{
00096 kExtended,
00097 kNotExtended,
00098 kRefitInFail,
00099 kRefitOutFail
00100 } TExtendStatus;
00101
00102
00103 private:
00104 class QAFind;
00105 void find(StiKalmanTrack *track, int direction,StiKalmanTrackNode *node,QAFind &qa);
00106 void nodeQA(StiKalmanTrackNode *node, int position,int active,QAFind &qa);
00107 int compQA(QAFind &qaBest,QAFind &qaTry,double maxChi2);
00108
00109 protected:
00110
00111 void printState();
00112 StiToolkit * _toolkit;
00113 Filter<StiTrack> * _trackFilter;
00114 StiTrackFinder * _trackSeedFinder;
00115 Factory<StiKalmanTrackNode> * _trackNodeFactory;
00116 StiDetectorContainer * _detectorContainer;
00117 StiHitContainer * _hitContainer;
00118 StiTrackContainer * _trackContainer;
00119 int _nPrimTracks;
00120 private:
00121
00122 double chi2;
00123 TStopwatch *mTimg[3];
00124 int mTrackPerm;
00125 int mEventPerm;
00126 int mUseComb;
00127 static int _debug;
00128 };
00129
00130 inline Filter<StiTrack> * StiKalmanTrackFinder::getTrackFilter()
00131 {
00132 return _trackFilter;
00133 }
00134
00135
00136 class CloserAngle
00137 {
00138 public:
00139 CloserAngle(double refAngle);
00140 bool operator()(const StiDetector*lhs, const StiDetector* rhs);
00141 protected:
00142 double _refAngle;
00143 };
00144
00145 #endif
00146
00147
00148