Sti/StiTrackNode.h

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]; // Node_Y , Node_Z 00076 float mErr[3]; // yy,yz,zz 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, // TrackNode after reset 00110 kTNRotBeg = 1, // TrackNode start rotation 00111 kTNRotEnd = 2, // TrackNode rotated, errmatrix 3d 00112 kTNProBeg = 3, // TrackNode start propagation, errmatrix wrong 00113 kTNProEnd = 4, // TrackNode end propagation, errmatrix still wrong 00114 kTNNudBeg = 5, // TrackNode start nudge 00115 kTNFitBeg = 6, // TrackNode start fit 00116 00117 kTNReady =10, // TrackNode propagateError called,errmatrix OK 00118 kTNNudEnd =11, // TrackNode end nudge 00119 kTNFitEnd =12, // TrackNode end fit 00120 kTNInit =13}; // TrackNode initialized 00121 enum eTrackNodeFlags { 00122 kTNRefit = 1 // TrackNode in refit stage 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); // (sin(x)-x)/x**3 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 //not called StiTreeNode::operator=(); //Relationship is not changed 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

Generated on Sun Mar 15 04:54:47 2009 for StRoot by doxygen 1.3.7