20 fExpansionPoint(0.,0.,0.),
37 TLorentzVector
mom = tcand->
P4();
52 Error(
"RhoKalmanVtxFitter::FitNode()",
"Fit failed for composite %p. Set chisquare to %f.",b,
fChiSquare);
83 for (
int iterate=0;iterate<
niter;iterate++){
85 std::vector<TMatrixD> w;
86 std::vector<TMatrixD> xp;
90 for(
int i=0;
i<nTrk;
i++) {
95 if(!testprg) {
return -2; }
99 std::cout<<
" #$# Fast #$# Helix cov: ";
106 if(t!=0.) { t = 1/
t; }
114 if(
fVerbose) {std::cout<<
" #$# Fast #$# COVi "; COVi.Print();}
123 if(
fDebug) {std::cout<<
" #$# Fast #$# Di "; Di.Print();}
127 xpi[0][1]=-c*fPrgParams[0];
128 xpi[0][2]=fPrgParams[1];
130 if(
fVerbose) {std::cout<<
" #$# Fast #$# xpi "; xpi.Print();}
134 Wi.InvertFast(&determinant);
135 if (determinant == 0.) {
136 std::cout<<
"RhoKalmanVtxFitter: COVi Inversion failed, abort fit -888"<<std::endl;
140 if(
fDebug) {std::cout<<
" #$# Fast #$# Wi"<<std::endl; Wi.Print();}
143 if(
fDebug) {std::cout<<
" #$# Fast #$# wi "; wi.Print();}
144 TMatrixD wixpi(wi,TMatrixD::kMultTranspose,xpi);
145 if(
fDebug) {std::cout<<
" #$# Fast #$# wixpi "; wixpi.Print();}
148 if(
fDebug) {std::cout<<
" #$# Fast #$# sumw "; sumw.Print();}
150 if(
fDebug) {std::cout<<
" #$# Fast #$# sumwx "; sumwx.Print();}
154 cV.InvertFast(&determinant);
155 if (determinant==0) {
156 std::cout<<
"RhoKalmanVtxFitter: sumw Inversion failed, retunring -777"<<std::endl;
160 if(
fVerbose) {std::cout<<
" #$# Fast #$# cV "; cV.Print();}
161 TMatrixD V(cV,TMatrixD::kMult,sumwx);
163 if(
fVerbose) {std::cout<<
" #$# Fast #$# V "; V.Print();}
164 vtx.SetXYZ(V[0][0],V[0][1],V[0][2]);
166 if(
fVerbose) {std::cout<<
" #$# Fast #$# Vtx: "; vtx.Print();}
172 for(
int i=0;
i<nTrk;
i++) {
173 if(
fDebug) {std::cout<<
" #$# Fast #$# V "; V.Print();}
174 TMatrixD resid(xp[
i],TMatrixD::kMinus,V);
175 if(
fDebug) {std::cout<<
" #$# Fast #$# resid "; resid.Print();}
176 if(
fDebug) {std::cout<<
" #$# Fast #$# w["<<i<<
"] "; w[
i].Print();}
177 TMatrixD chisqi(
TMatrixD(resid,TMatrixD::kMult,w[i]),TMatrixD::kMultTranspose,resid);
178 if(
fDebug) {std::cout<<
" #$# Fast #$# chisqi "; chisqi.Print();}
181 if(
fVerbose) {std::cout<<
" #$# Fast #$# chisq = "<<chisq<<std::endl;}
200 TVector3 vtx(0.,0.,0.);
201 std::vector<TVector3> momenta;
206 std::vector<TMatrixD> B;
207 std::vector<TMatrixD> GI;
208 std::vector<TMatrixD> BGI;
209 std::vector<TMatrixD> D;
210 std::vector<TMatrixD> E;
213 std::vector<TMatrixD> U;
214 std::vector<TMatrixD>
W;
215 std::vector<TMatrixD> dq;
216 TMatrixD CovFitFull(3+3*nTrk,3+3*nTrk);
227 if(
fVerbose) {std::cout<<
" #$# Fit #$# Vertex after fast prefit: "; vtx.Print();}
229 for (
int iteration = 0 ; iteration <
fNIterations ; iteration++) {
231 std::cout<<
"Iteration "<<iteration<<std::endl;
232 std::cout<<
" #$# Fit #$# Begin iteration "<<iteration<<
" #$#$#$# "<<std::endl;
248 for(
int i=0;
i<nTrk;
i++) {
249 if(
fVerbose) {std::cout<<
" #$# Fit #$# track "<<
i<<
" #$#$#$# "<<std::endl;}
251 if(
fVerbose) {std::cout<<
" #$# Fit #$# Vertex before (global) "; (vtx).
Print();}
260 if(!testprg) {
printf(
"#$# Fit #$# CANNOT CALCULATE TRACK PARAMETERS (momenta at origin)");
return kFALSE;}
276 if(!testvtx) {
return kFALSE; }
279 std::cout<<
" #$# Fit #$# Helix cov: ";
291 for (
int kk=0; kk<5; kk++) { qipi[kk][0]=qip[kk][
i]; }
292 TMatrixD dqi(qiv,TMatrixD::kMinus,qipi);
294 if(
fDebug) {std::cout<<
" #$# Fit #$# dqi "; dqi.Print();}
300 if(
fVerbose) {std::cout<<
" #$# Fit #$# COVi "; COVi.Print();}
321 if(
fDebug) {std::cout<<
" #$# Fit #$# Di "; Di.Print();}
341 if(
fDebug) {std::cout<<
" #$# Fit #$# Ei "; Ei.Print();}
346 Wi.InvertFast(&determinant);
347 if (determinant==0) {
348 std::cout<<
"RhoKalmanVtxFitter: COVi Inversion failed, abort fit."<<std::endl;
353 std::cout<<
" #$# Fit #$# Wi (det(cov) = "<<determinant<<
")"<<std::endl;
355 for(
int sdsd=0; sdsd<3; sdsd++)
for(
int asas=sdsd; asas<3; asas++) {
356 printf(
"W{%i}[%i][%i] = %6.9f\n",
i,sdsd,asas,Wi[sdsd][asas]);
357 printf(
"W{%i}[%i][%i] = %6.9f\n",
i,asas,sdsd,Wi[asas][sdsd]);
362 TMatrixD DitWi(Di,TMatrixD::kTransposeMult,Wi);
363 if(
fDebug) {std::cout<<
" #$# Fit #$# DitWi "; DitWi.Print();}
365 TMatrixD EitWi(Ei,TMatrixD::kTransposeMult,Wi);
366 if(
fDebug) {std::cout<<
" #$# Fit #$# EitWi "; EitWi.Print();}
368 TMatrixD Ai(DitWi,TMatrixD::kMult,Di);
370 if(
fDebug) {std::cout<<
" #$# Fit #$# Ai ("<<
i<<
") = DitWiDi "; Ai.Print();}
372 TMatrixD Bi(DitWi,TMatrixD::kMult,Ei);
374 if(
fDebug) {std::cout<<
" #$# Fit #$# Bi = DitWiEi "; Bi.Print();}
376 TMatrixD Gi(EitWi,TMatrixD::kMult,Ei);
377 if(
fDebug) {std::cout<<
" #$# Fit #$# Gi = EitWiEi "; Gi.Print();}
381 GIi.InvertFast(&determinant);
382 if (determinant==0) {
383 std::cout<<
"RhoKalmanVtxFitter: GIi Inversion failed, abort fit."<<std::endl;
387 if(
fDebug) {std::cout<<
" #$# Fit #$# GIi = Gi^-1 (det="<<determinant<<
")"; GIi.Print();}
389 TMatrixD BiGIi(Bi,TMatrixD::kMult,GIi);
390 BGI.push_back(BiGIi);
391 if(
fDebug) {std::cout<<
" #$# Fit #$# BiGIi "; BiGIi.Print();}
393 TMatrixD Ti(DitWi,TMatrixD::kMult,dqi);
395 if(
fDebug) {std::cout<<
" #$# Fit #$# Ti = DitWi*dqi "; Ti.Print();}
397 TMatrixD Ui(EitWi,TMatrixD::kMult,dqi);
399 if(
fDebug) {std::cout<<
" #$# Fit #$# Ui = EitWi*dqi"; Ui.Print();}
402 if(
fDebug) {std::cout<<
" #$# Fit #$# A = "; A.Print();}
406 if(
fDebug) {std::cout<<
" #$# Fit #$# WV = "; WV.Print();}
408 if(
fDebug) {std::cout<<
" #$# Fit #$# Vpre "; Vpre.Print();}
409 for(
int i=0;
i<nTrk;
i++) {
411 TMatrixD BiGIiUi(BiGIi,TMatrixD::kMult,U[i]);
413 if(
fDebug) {std::cout<<
" #$# Fit #$# GIi ("<<i<<
") "; GI[
i].Print();}
414 if(
fDebug) {std::cout<<
" #$# Fit #$# Bi ("<<i<<
") "; B[
i].Print();}
415 if(
fDebug) {std::cout<<
" #$# Fit #$# BiGIi ("<<i<<
") "; BiGIi.Print();}
416 TMatrixD BiGIiBti(BiGIi,TMatrixD::kMultTranspose,B[i]);
417 if(
fDebug) {std::cout<<
" #$# Fit #$# BiGIiBti ("<<i<<
") = "; BiGIiBti.Print();}
419 if(
fDebug) {std::cout<<
" #$# Fit #$# WV = "; WV.Print();}
420 if(
fDebug) {std::cout<<
" #$# Fit #$# Vpre "; Vpre.Print();}
424 CovVV.InvertFast(&determinant);
426 if (determinant==0) {
427 std::cout<<
"RhoKalmanVtxFitter: WV Inversion failed, abort fit."<<std::endl;
430 if(
fDebug) {std::cout<<
" #$# Fit #$# WV= "; WV.Print();}
431 if(
fDebug) {std::cout<<
" #$# Fit #$# CovVV (det="<<determinant<<
") ="; CovVV.Print();}
433 TMatrixD uV(CovVV,TMatrixD::kMult,Vpre);
434 vtx.SetXYZ(vtx.X()+uV[0][0],vtx.Y()+uV[1][0],vtx.Z()+uV[2][0]);
435 if(
fDebug) {std::cout<<
" #$# Fit #$# Vertex update = "; uV.Print();}
436 if(
fVerbose) {std::cout<<
" #$# Fit #$# Vertex after "; vtx.Print();}
437 if(
fVerbose) {std::cout<<
" #$# Fit #$# Vertex after (global) "; vtx.Print();}
446 std::vector<TMatrixD> uq;
449 for(
int i=0;
i<nTrk;
i++) {
450 TMatrixD BtiV(B[
i],TMatrixD::kTransposeMult,uV);
451 TMatrixD uPi(GI[i],TMatrixD::kMult,U[i]-BtiV);
453 momenta[
i]+=TVector3(uPi[0][0],uPi[1][0],uPi[2][0]);
454 if(
fVerbose) {std::cout<<
" #$# Fit #$# Momenum update on particle %i"<<
i; uPi.Print();}
458 TMatrixD uvi(D[i],TMatrixD::kMult,uV);
459 TMatrixD upi(E[i],TMatrixD::kMult,uPi);
463 TMatrixD dqitWi(dq[i],TMatrixD::kTransposeMult,W[i]);
464 TMatrixD chis(dqitWi,TMatrixD::kMult,dq[i]);
466 if(
fDebug){std::cout<<
" #$# Fit #$# Insert Chisquare"<<std::endl;}
469 if(chiq>0 && chiq<10000) { chisquare=chiq; }
470 else { chisquare = -20; }
478 for(
int k=0; k<3; k++)
for(
int l=0; l<3; l++) {
479 CovFitFull[k][l]=CovVV[k][l];
483 for(
int i=0;
i<nTrk;
i++) {
484 TMatrixD CovVPi(CovVV,TMatrixD::kMult,BGI[
i]);
486 for(
int k=0; k<3; k++)
for(
int l=0; l<3; l++) {
487 CovFitFull[k+3*(i+1)][l]=CovVPi[k][l]; ;
488 CovFitFull[l][k+3*(i+1)]=CovVPi[k][l]; ;
491 for(
int j=0; j<nTrk; j++) {
493 TMatrixD CovPPijtmp(GI[j],TMatrixD::kMultTranspose,B[j]);
494 TMatrixD CovPPij(CovPPijtmp,TMatrixD::kMult,CovVPi);
496 if(i==j) { CovPPij+=GI[j]; }
497 for(
int k=0; k<3; k++)
for(
int l=0; l<3; l++) {
498 CovFitFull[k+3*(j+1)][l+3*(i+1)]=CovPPij[k][l];
499 CovFitFull[l+3*(i+1)][k+3*(j+1)]=CovPPij[k][l];
503 if(
fDebug) {std::cout<<
" #$# Fit #$# CovFitFull: "; CovFitFull.Print();}
510 for(
int k=0; k<3; k++)
for(
int l=0; l<3; l++) {
511 CovP7[k][l]=CovVV[k][l];
514 for(
int i=0;
i<nTrk;
i++) {
520 if(
fDebug) {std::cout<<
" #$# Fit #$# Final Momentum :("<<
i<<
") "; momenta[
i].Print();}
523 for(
int k=0; k<3; k++)
for(
int l=0; l<3; l++) {
524 CovP7[k+3][l+3]=CovFitFull[3*(i+1)+k][3*(i+1)+l];
525 CovP7[k+3][l]=CovFitFull[3*(i+1)+k][l];
526 CovP7[l][k+3]=CovFitFull[l][3*(i+1)+k];
529 double invE = 1./tcand->
E();
530 CovP7[3][6] = CovP7[6][3] = (momenta[
i].X()*CovP7[3][3]+momenta[
i].Y()*CovP7[3][4]+momenta[
i].Z()*CovP7[3][5])*invE;
531 CovP7[4][6] = CovP7[6][4] = (momenta[
i].X()*CovP7[4][3]+momenta[
i].Y()*CovP7[4][4]+momenta[
i].Z()*CovP7[4][5])*invE;
532 CovP7[5][6] = CovP7[6][5] = (momenta[
i].X()*CovP7[5][3]+momenta[
i].Y()*CovP7[5][4]+momenta[
i].Z()*CovP7[5][5])*invE;
534 CovP7[6][6] = (momenta[
i].X()*momenta[
i].X()*CovP7[3][3]+momenta[
i].Y()*momenta[
i].Y()*CovP7[4][4]+momenta[
i].Z()*momenta[
i].Z()*CovP7[5][5]
535 +2.0*momenta[
i].X()*momenta[
i].Y()*CovP7[3][4]
536 +2.0*momenta[
i].X()*momenta[
i].Z()*CovP7[3][5]
537 +2.0*momenta[
i].Y()*momenta[
i].Z()*CovP7[4][5])*invE*invE;
539 CovP7[6][0] = CovP7[0][6] = (momenta[
i].X()*CovP7[3][0]+momenta[
i].Y()*CovP7[4][0]+momenta[
i].Z()*CovP7[5][0])*invE;
540 CovP7[6][1] = CovP7[1][6] = (momenta[
i].X()*CovP7[3][1]+momenta[
i].Y()*CovP7[4][1]+momenta[
i].Z()*CovP7[5][1])*invE;
541 CovP7[6][2] = CovP7[2][6] = (momenta[
i].X()*CovP7[3][2]+momenta[
i].Y()*CovP7[4][2]+momenta[
i].Z()*CovP7[5][2])*invE;
printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime)
friend F32vec4 cos(const F32vec4 &a)
void SetPos(const TVector3 &pos)
Double_t GetCharge() const
friend F32vec4 sin(const F32vec4 &a)
Bool_t FitNode(RhoCandidate *b)
virtual ~RhoKalmanVtxFitter()
RhoCandidate * Daughter(Int_t n)
void SetFourMomentumByDaughters(RhoCandidate *composite)
Bool_t CalcPrgParams(RhoCandidate *cand, TVector3 expansionpoint)
RhoKalmanVtxFitter(RhoCandidate *b)
void SetP3(const TVector3 &p3)
TVector3 GetPosition() const
TVector3 GetMomentum() const
TLorentzVector P4() const
double FitVertexFast(TVector3 &vtx, TMatrixD &cov, bool skipcov=false, int niter=2)
RhoCandidate * fCurrentHead
RhoCandidate * fHeadOfTree
void SetDecayVertex(RhoCandidate *composite, const TVector3 &vtx, const TMatrixD &CovVV)
void SetCov7(const TMatrixD &cov7)
void InsertChi2(const RhoCandidate *bc, const double chi2)
TMatrixT< double > TMatrixD