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