00001 #include "StiHitTest.h"
00002 #include <stdio.h>
00003 #include <stdlib.h>
00004 #include <assert.h>
00005 #include "TVectorD.h"
00006 #include "TMatrixDSym.h"
00007 #include "TMath.h"
00008
00009 void StiHitTest::reset()
00010 {
00011 memset(fBeg, 0,fEnd-fBeg+1);
00012 fW[0]=-1;
00013 }
00014
00015
00016 void StiHitTest::add(double x,double y,double z)
00017 {
00018 double xx[3]; xx[0]=x;xx[1]=y;xx[2]=z;
00019 add(xx);
00020 }
00021
00022 void StiHitTest::add(double x[3])
00023 {
00024 fN++;
00025 for (int i=0;i<3;i++) {
00026 fX[i] += x[i];
00027 for (int j=0;j<3;j++) {
00028 fM[i][j] += x[i]*x[j];
00029 }}
00030 }
00031
00032 void StiHitTest::doIt()
00033 {
00034 if (!fN) return;
00035 if (fW[0]>=0.) return;
00036 for (int i=0;i<3*4;i++) {fX[i]/=fN;}
00037 for (int i=0;i<3;i++) {
00038 for (int j=0;j<3;j++) {
00039 fM[i][j] -= fX[i]*fX[j];
00040 }}
00041 TMatrixDSym Sym(3,fM[0],"");
00042 TVectorD vals(3);
00043 TMatrixD vecs = Sym.EigenVectors(vals);
00044
00045 memcpy(fW, vals.GetMatrixArray(),sizeof(fW));
00046 vecs.Transpose(vecs);
00047 memcpy(fV[0],vecs.GetMatrixArray(),sizeof(fV));
00048 }
00049
00050 double StiHitTest::width(int idx)
00051 {
00052 doIt();
00053 return fW[idx];
00054 }
00055
00056
00057 const double *StiHitTest::vector(int idx)
00058 {
00059 doIt();
00060 return fV[idx];
00061 }
00062
00063 double StiHitTest::yAngle() const
00064 {
00065 double dy = fV[2][1]; double dx = fV[2][0];
00066 if (dx<0) {dx=-dx;dy=-dy;}
00067 return TMath::ATan2(dy,dx);
00068 }
00069
00070 double StiHitTest::zAngle() const
00071 {
00072 double dz = fV[2][2]; double dx = fV[2][0];
00073 if (dx<0) {dx=-dx;dz=-dz;}
00074 return TMath::ATan2(dz,dx);
00075 }
00076
00077
00078