00001 #ifndef StiTrackNode_H
00002 #define StiTrackNode_H 1
00003
00004 #include <Stiostream.h>
00005 #include <stdlib.h>
00006
00007 #include "StiTreeNode.h"
00008 #include "StiHit.h"
00009 #include "StiNodePars.h"
00010 class StiDetector;
00011
00012 enum eTkPars {kNPars=6,kNErrs=21};
00013 class StiNodeMtx {
00014 public:
00015 void reset(){memset(this,0,sizeof(StiNodeMtx));}
00016 double A[kNPars][kNPars];
00017 };
00018
00019
00020
00021 class StiNodeErrs {
00022 public:
00023 void reset() {memset(this,0,sizeof(StiNodeErrs));}
00024 double getDelta() const {return sqrt(_cXX+_cYY+_cZZ);}
00025 double getDelta2() const {return (_cXX+_cYY+_cZZ);}
00026 StiNodeErrs &operator*=(double f) {for (int i=0;i<kNErrs;i++){A[i]*=f;}; return *this;}
00027 StiNodeErrs &merge(double wt,StiNodeErrs &other);
00028
00029 void get00( double *a) const;
00030 void set00(const double *a) ;
00031 void get10( double *a) const;
00032 void set10(const double *a) ;
00033 void get11( double *a) const;
00034 void set11(const double *a) ;
00035
00036 void recov();
00037 int check(const char *pri=0) const;
00038 double sign() const;
00039 double operator()(int i,int j) const;
00040 void zeroX();
00041 void print() const;
00042
00043 public:
00044 union{double A[1];double _cXX;};
00045 double _cYX,_cYY;
00046 double _cZX,_cZY, _cZZ;
00047 double _cEX,_cEY, _cEZ, _cEE;
00048 double _cPX,_cPY, _cPZ, _cPE, _cPP;
00049 double _cTX,_cTY, _cTZ, _cTE, _cTP, _cTT;
00050 };
00051 class StiHitErrs{
00052 public:
00053 void reset() {memset(this,0,sizeof(*this));}
00054 StiHitErrs &operator*=(double f) {for (int i=0;i<6;i++){A[i]*=f;};return *this;}
00055 void rotate(double angle);
00056 union{
00057 double hXX; double A[1];};
00058 double hYX,hYY;
00059 double hZX,hZY, hZZ;
00060 };
00061
00070 class StiNode2Pars
00071 {
00072 public:
00073 void set(const StiNodePars &pars,StiNodeErrs &errs);
00074 public:
00075 float mPar[2];
00076 float mErr[3];
00077 };
00078
00079
00086 class StiHitContino {
00087 public:
00088 StiHitContino() {reset();}
00089 void reset();
00090 StiHit *getHit (int idx) const {return mHits[idx];}
00091 int getNHits () const;
00092 double getChi2 (int idx=0) const {return mChi2[idx];}
00093 double getDetr (int idx=0) const {return mDetr[idx];}
00094 void add (StiHit *hit,double chi2,double detr=1.);
00095 void print (const char* opt="") const;
00096 private:
00097 enum {kMaxSize=10};
00098 StiHit *mHits[kMaxSize+1];
00099 double mChi2[kMaxSize+1];
00100 double mDetr[kMaxSize+1];
00101 };
00102
00103
00104
00105 class StiTrackNode : public StiTreeNode
00106 {
00107 public:
00108 enum eTrackNodeStatus {
00109 kTNReset = 0,
00110 kTNRotBeg = 1,
00111 kTNRotEnd = 2,
00112 kTNProBeg = 3,
00113 kTNProEnd = 4,
00114 kTNNudBeg = 5,
00115 kTNFitBeg = 6,
00116
00117 kTNReady =10,
00118 kTNNudEnd =11,
00119 kTNFitEnd =12,
00120 kTNInit =13};
00121 enum eTrackNodeFlags {
00122 kTNRefit = 1
00123 };
00124
00125 virtual ~StiTrackNode(){};
00126 virtual double getPt() const=0;
00127 const StiTrackNode& operator=(const StiTrackNode& node);
00128 void reset();
00129 void unset(){;}
00130
00131 virtual double x_g() const =0;
00132 virtual double y_g() const =0;
00133 virtual double z_g() const =0;
00134 virtual double x() const =0;
00135 virtual double y() const =0;
00136 virtual double z() const =0;
00137
00138 StiHit * getHit() const {return _hit;}
00139 void setHit(StiHit* hit) {_hit =hit;}
00140 const StiDetector *getDetector() const;
00141 void setDetector(const StiDetector *detector);
00142 double getChi2 () const {return _chi2;}
00143 double getDeterm() const {return _det ;}
00144 void setChi2(double chi2) {_chi2 =chi2;}
00145 int getState() const {return _state;}
00146 void setInvalid() { _state=0;}
00147 void setReady() { _state=kTNReady;}
00148 int isValid() const {return _state>=kTNReady;}
00149 int isFitted() const {return (_hit && _chi2<1e3);}
00150 double getRefPosition() const;
00151 double getLayerAngle() const;
00152 protected:
00153 static void mult6(double Rot[kNPars][kNPars],const double Pro[kNPars][kNPars]);
00154 static void errPropag6(double G[21],const double F[6][6],int nF);
00155 static int cylCross(double r, const double dx[4],double Rho,double out[4]);
00156 static double sinX(double x);
00157
00158 StiTrackNode() {reset();}
00159 int _state;
00160 const StiDetector * _detector;
00161 StiHit* _hit;
00162 double _det;
00163 double _chi2;
00164 public:
00165 static int mgFlag;
00166 };
00167
00168
00169 inline void StiTrackNode::reset()
00170 {
00171 StiTreeNode::reset();
00172 _state = kTNReset;
00173 _detector = 0;
00174 _hit=0;
00175 _chi2 = 1e60;
00176 }
00177
00178
00179 inline const StiDetector * StiTrackNode::getDetector() const
00180 {
00181 return _detector;
00182 }
00183
00184 inline void StiTrackNode::setDetector(const StiDetector *detector)
00185 {
00186 _detector = detector;
00187 }
00188 inline const StiTrackNode& StiTrackNode::operator=(const StiTrackNode& node)
00189 {
00190
00191 _state = node._state;
00192 _detector = node._detector;
00193 _hit = node._hit;
00194 _chi2 = node._chi2;
00195 return *this;
00196 }
00197
00198 #endif
00199
00200
00201