13 #undef SKIPHIGHACCURACYCORRECTION
22 return *(m+(row*(row-1))/2+(col-1));
32 const FitParams* fitparams,
const TMatrixDSym& V,
36 if(
vtxverbose>=6) { std::cout <<
"KalmanCalculator::init()"<<std::endl;}
37 m_nconstraints = value.GetNrows() ;
38 m_nparameters = fitparams->
dim() ;
40 int valdim = value.GetNrows() ;
41 int statdim = fitparams->
par().GetNrows() ;
43 #ifdef VTK_BOUNDSCHECKING
44 assert( G.GetNrows() == valdim && G.GetNcols() == statdim &&
45 (V.GetNrows()==valdim) ) ;
49 TMatrixDSym
C(fitparams->
cov());
50 if(
vtxverbose>=6) {
printf(
"KalmanCalculator::init() G.GetNrows()/G.GetNcols() = %i/%i \t valdim/statdim = %i/%i \t V.GetNrows()/C.GetNrows() = %i/%i V.GetNcols()/C.GetNcols() = %i/%i \n",G.GetNrows(),G.GetNcols(),valdim,statdim,V.GetNrows(),
C.GetNrows(),V.GetNcols(),
C.GetNcols());}
54 if(
vtxverbose>=7) { std::cout <<
"KalmanCalculator::init() calc C*GT 'slow'"<<std::endl;}
56 TMatrixD CGt(
C,TMatrixD::kMultTranspose,G);
57 if(
vtxverbose>=7) { std::cout <<
"KalmanCalculator::init() CGT:";CGt.Print();}
58 m_matrixCGT.ResizeTo(CGt);
61 if(
vtxverbose>=7) { std::cout <<
"KalmanCalculator::init() calc C*GT 'fast'"<<std::endl;}
63 m_matrixCGT =
TMatrixD(statdim,valdim) ;
65 for(
int k=0; k<m_nparameters; k++)
66 if( (tmp=G(
col,k)) !=0 ) {
73 if(
vtxverbose>=6) { std::cout <<
"KalmanCalculator::init() calc R = G*C*GT + V"<<std::endl;}
78 TMatrixDSym Rinv=
C.Similarity(G);
79 m_matrixRinv.ResizeTo(Rinv);
84 if(
vtxverbose>=6) { std::cout <<
"KalmanCalculator::init() V"<<std::endl;}
88 if(weight!=1) m_matrixRinv *= weight ;
92 for(
int k=0; k<m_nparameters; k++)
93 if( (tmp=G(
row,k)) != 0 )
95 m_matrixRinv(
row,
col) += tmp*m_matrixCGT(k,
col) ;
100 if(
vtxverbose>=6) { std::cout <<
"KalmanCalculator::init() G*C*GT"<<std::endl;}
103 if(
vtxverbose>=6) { std::cout <<
"KalmanCalculator::init() invert R"<<std::endl;}
104 m_matrixR.ResizeTo(m_matrixRinv);
105 m_matrixR = m_matrixRinv ;
107 m_matrixRinv.InvertFast(&det);
110 std::cout <<
"Error inverting matrix. Vertex fit fails." << std::endl ;
114 if(
vtxverbose>=6) { std::cout <<
"KalmanCalculator::init() calculate gain"<<std::endl;}
116 TMatrixD K(m_matrixCGT,TMatrixD::kMult,m_matrixRinv);
117 m_matrixK.ResizeTo(K) ;
129 if(
vtxverbose>=6) { std::cout <<
"KalmanCalculator::init() done"<<std::endl;}
136 if(
vtxverbose>=5) { std::cout <<
"KalmanCalculator::updatePar(FitParams*):"<<std::endl;}
138 fitparams->
par() -= m_matrixK * (*m_value) ;
140 m_chisq = m_matrixRinv.Similarity(*m_value) ;
141 if(
vtxverbose>=5) { std::cout <<
"KalmanCalculator::updatePar() done"<<std::endl;}
147 if(
vtxverbose>=5) { std::cout <<
"KalmanCalculator::updatePar(TVectorD&,FitParams*)"<<std::endl;}
149 TVectorD valueprime = (*m_value) + (*m_matrixG) * (pred-fitparams->
par()) ;
150 fitparams->
par() = pred - m_matrixK*valueprime ;
151 m_chisq = m_matrixRinv.Similarity( valueprime ) ;
152 if(
vtxverbose>=5) { std::cout <<
"KalmanCalculator::updatePar() done"<<std::endl;}
158 if(
vtxverbose>=7) { std::cout <<
"KalmanCalculator::updateCov(FitParams*)"<<std::endl;}
169 TMatrixD HC(*m_matrixG,TMatrixD::kMult,fitparams->
cov());
170 TMatrixD dcov1(m_matrixK,TMatrixD::kMult,HC);
171 TMatrixDSym KRKt = m_matrixR.Similarity(m_matrixK);
172 TMatrixDSym dcov3(dcov1.GetNrows());
173 for(
int row=0;
row<dcov1.GetNrows();
row++){
179 fitparams->
cov() += KRKt ;
180 fitparams->
cov() += dcov3 ;
196 #ifndef SKIPHIGHACCURACYCORRECTION
203 for(
int col=0;
col<m_nconstraints;
col++)
204 if( (tmp =2*m_matrixCGT(
row,
col))!=0 ) {
205 for(
int k=0; k<m_nconstraints; k++)
206 tmp -= m_matrixK(
row,k) * m_matrixR(k,
col) ;
207 m_matrixCGT(
row,
col) = tmp ;
221 for(
int k=0; k<m_nconstraints; k++)
222 if( (tmp = -(m_matrixCGT(
row,k))) != 0 )
227 for(
int col=0;
col<m_nconstraints;
col++)
228 for(
int k=0; k<m_nparameters; k++)
230 if(
vtxverbose>=5) { std::cout <<
"KalmanCalculator::updateCov() done"<<std::endl;}
ClassImp(KalmanCalculator)
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
double fastsymmatrixaccess(double *m, int row, int col)
double symmatrixaccess(double *m, int row, int col)
void updatePar(FitParams *fitparams)
int & nConstraintsVec(int row)
void updateCov(FitParams *fitparams)
TMatrixT< double > TMatrixD
ErrCode init(const TVectorD &value, const TMatrixD &G, const FitParams *fitparams, const TMatrixDSym &V, int weight=1)