12#include "CbmKFTrack.h"
34 vTracks.push_back(Track);
49 MassConstraint = MotherMass;
59 const Int_t MaxIter=3;
67 r[0] = r[1] = r[2] = 0.;
81 for ( Int_t iteration =0; iteration<MaxIter;++iteration ){
83 for(
int i=0;
i<8;
i++) r0[
i] = r[
i];
90 for(Int_t
i=0;
i<36;++
i) C[
i]=0.0;
92 C[0] = C[2] = C[5] = 100.0;
97 for( vector<CbmKFTrackInterface*>::iterator tr=vTracks.begin(); tr!=vTracks.end(); ++tr )
108 Double_t a =
m[2], b =
m[3], qp =
m[4];
110 Double_t s = V[0]*V[2] - V[1]*V[1];
111 s = ( s > 1.E-20 ) ?1./s :0;
112 Double_t zetas[2] = { (r0[0]-
m[0])*s, (r0[1]-
m[1])*s };
113 a += ( V[ 3]*V[2] -V[ 4]*V[1])*zetas[0]
114 +(-V[ 3]*V[1] +V[ 4]*V[0])*zetas[1];
115 b += ( V[ 6]*V[2] -V[ 7]*V[1])*zetas[0]
116 +(-V[ 6]*V[1] +V[ 7]*V[0])*zetas[1];
117 qp+= (V[10]*V[2]-V[11]*V[1])*zetas[0]
118 +(-V[10]*V[1]+V[11]*V[0])*zetas[1];
122 double mm[6], VV[21];
124 double c2 = 1./(1. + a*a + b*b);
127 double pz =
sqrt(p2*c2);
132 double da = (
m[2]-a);
133 double db = (
m[3]-b);
134 double dq = (
m[4]-qp);
136 double H[3] = { -px*c2, -py*c2, -pz*p };
139 double dpz = H[0]*da + H[1]*db + H[2]*dq;
143 mm[2] = px + da + a*dpz;
144 mm[3] = py + db + b*dpz;
148 double cxpz = H[0]*V[ 3] + H[1]*V[ 6] + H[2]*V[10];
149 double cypz = H[0]*V[ 4] + H[1]*V[ 7] + H[2]*V[11];
150 double capz = H[0]*V[ 5] + H[1]*V[ 8] + H[2]*V[12];
151 double cbpz = H[0]*V[ 8] + H[1]*V[ 9] + H[2]*V[13];
152 double cqpz = H[0]*V[12] + H[1]*V[13] + H[2]*V[14];
153 double cpzpz = H[0]*H[0]*V[5] +H[1]*H[1]*V[9] + H[2]*H[2]*V[14]
154 + 2*( H[0]*H[1]*V[8] +H[0]*H[2]*V[12] +H[1]*H[2]*V[13]);
159 VV[ 3] = V[3]*pz + a*cxpz;
160 VV[ 4] = V[4]*pz + a*cypz;
161 VV[ 5] = V[5]*pz*pz + 2*a*pz*capz + a*a*cpzpz;
162 VV[ 6] = V[6]*pz+b*cxpz;
163 VV[ 7] = V[7]*pz+b*cypz;
164 VV[ 8] = V[8]*pz*pz + a*pz*cbpz + b*pz*capz + a*b*cpzpz;
165 VV[ 9] = V[9]*pz*pz + 2*b*pz*cbpz + b*b*cpzpz;
168 VV[12] = capz*pz + a*cpzpz;
169 VV[13] = cbpz*pz + b*cpzpz;
173 VV[17] = HE*( V[12]*pz + a*cqpz );
174 VV[18] = HE*( V[13]*pz + b*cqpz );
176 VV[20] = HE*HE*V[14];
210 Double_t zeta[2] = { mm[0]-(r[0]-a*(r[2]-r0[2])),
211 mm[1]-(r[1]-b*(r[2]-r0[2])) };
217 Double_t S[3] = { VV[0] + C[0] - 2*a*C[3] + a*a*C[5],
218 VV[1] + C[1] - b*C[3] - a*C[4] + a*b*C[5],
219 VV[2] + C[2] - 2*b*C[4] + b*b*C[5] };
223 Double_t s = S[0]*S[2] - S[1]*S[1];
225 if ( s < 1.E-20 )
continue;
235 Double_t CHt0[7], CHt1[7];
237 CHt0[0]= C[ 0] -a*C[ 3]; CHt1[0]= C[ 1] -b*C[ 3];
238 CHt0[1]= C[ 1] -a*C[ 4]; CHt1[1]= C[ 2] -b*C[ 4];
239 CHt0[2]= C[ 3] -a*C[ 5]; CHt1[2]= C[ 4] -b*C[ 5];
240 CHt0[3]= C[ 6] -a*C[ 8] -VV[ 3]; CHt1[3]= C[ 7] -b*C[ 8] -VV[ 4];
241 CHt0[4]= C[10] -a*C[12] -VV[ 6]; CHt1[4]= C[11] -b*C[12] -VV[ 7];
242 CHt0[5]= C[15] -a*C[17] -VV[10]; CHt1[5]= C[16] -b*C[17] -VV[11];
243 CHt0[6]= C[21] -a*C[23] -VV[15]; CHt1[6]= C[22] -b*C[23] -VV[16];
247 Double_t K0[7], K1[7];
249 for(Int_t
i=0;
i<7;++
i){
250 K0[
i] = CHt0[
i]*S[0] + CHt1[
i]*S[1];
251 K1[
i] = CHt0[
i]*S[1] + CHt1[
i]*S[2];
256 for(Int_t
i=0;
i<7;++
i) r[
i] += K0[
i]*zeta[0] + K1[
i]*zeta[1];
260 for(Int_t
i=0, k=0;
i<7;++
i){
261 for(Int_t j=0;j<=
i;++j,++k)
262 C[k] -= K0[
i]*CHt0[j] + K1[
i]*CHt1[j];
268 Chi2 += zeta[0]*zeta[0]*S[0] + 2*zeta[0]*zeta[1]*S[1]
269 + zeta[1]*zeta[1]*S[2] ;
306 Double_t px=r[3], py=r[4], pz=r[5];
308 Double_t p =
sqrt( px*px + py*py + pz*pz );
323 for ( Int_t
i=0;
i<5;
i++)
324 for (Int_t j=0;j<6;++j) J[
i][j]=0.0;
327 J[0][0] = 1; J[0][2] = -Par[2];
328 J[1][1] = 1; J[1][2] = -Par[3];
329 J[2][3] = pzi; J[2][5] = -Par[2]*pzi;
330 J[3][4] = pzi; J[3][5] = -Par[3]*pzi;
331 J[4][3] = -qp3*px; J[4][4] = -qp3*py; J[4][4] = -qp3*pz;
335 for( Int_t
i=0;
i<5;
i++)
336 for(Int_t j=0;j<6;j++){
338 for( Int_t k=0; k<6; k++) JC[
i][j]+=J[
i][k]*Cij(k,j);
342 for( Int_t
i=0;
i<5;
i++)
343 for(Int_t j=
i;j<5;j++, ii++){
345 for( Int_t k=0; k<6; k++) Cov[ii]+=JC[
i][k]*J[j][k];
354 Double_t S = ( r[3]*r[3]*C[9] + r[4]*r[4]*C[14] + r[5]*r[5]*C[20]
356 + 2*( + r[3]*r[4]*C[13] + r[5]*(r[3]*C[18] + r[4]*C[19])
357 - r[6]*( r[3]*C[24] + r[4]*C[25] + r[5]*C[26] ) )
359 Double_t m2 = r[6]*r[6] - r[3]*r[3] - r[4]*r[4] - r[5]*r[5];
361 if( M ) *M = ( m2>1.e-20 ) ?
sqrt(m2) :0. ;
362 if( Error_ ) *Error_ = ( S>=0 && m2>1.e-20 ) ?
sqrt(S/m2) :1.e4;
366void CbmKFSecondaryVertexFinder::AddMassConstraint()
368 if( MassConstraint<0 )
return;
370 H[0] = H[1] = H[2] = 0.;
376 double m2 = r0[6]*r0[6] - r0[3]*r0[3] - r0[4]*r0[4] - r0[5]*r0[5];
378 double zeta = MassConstraint*MassConstraint - m2;
379 for(Int_t
i=0;
i<8;++
i) zeta -= H[
i]*(r[
i]-r0[
i]);
383 for (Int_t
i=0;
i<8;++
i ){
385 for (Int_t j=0;j<8;++j) CHt[
i] += Cij(
i,j)*H[j];
389 if( S<1.e-20 )
return;
393 for( Int_t
i=0, ii=0;
i<8; ++
i ){
394 Double_t Ki = CHt[
i]*S;
396 for(Int_t j=0;j<=
i;++j) C[ii++] -= Ki*CHt[j];
414 double C30 = C[ 6] + T*C[ 9];
415 double C41 = C[11] + T*C[14];
416 double C52 = C[17] + T*C[20];
417 double T54 = T*C[19];
419 C[ 0] += T*( C[ 6] + C30 );
420 C[ 1] += T*( C[ 7] + C[10] );
421 C[ 2] += T*( C[11] + C41 );
428 C[ 3] += T*(C[ 8] + C[15]);
429 C[ 4] += T*(C[12] + C[16]);
430 C[ 5] += T*(C[17] + C52);
446void CbmKFSecondaryVertexFinder::AddTopoConstraint()
448 if( !VParent )
return;
462 double xinf = r0[0]*inf;
463 double yinf = r0[1]*inf;
464 double zinf = r0[2]*inf;
483 Ai[0] = C[4]*C[4] - C[2]*C[5];
484 Ai[1] = C[1]*C[5] - C[3]*C[4];
485 Ai[3] = C[2]*C[3] - C[1]*C[4];
486 double det = (C[0]*Ai[0] + C[1]*Ai[1] + C[3]*Ai[3]);
487 det = (det>1.e-8) ?1./det :0;
491 Ai[2] = ( C[3]*C[3] - C[0]*C[5] )*det;
492 Ai[4] = ( C[0]*C[4] - C[1]*C[3] )*det;
493 Ai[5] = ( C[1]*C[1] - C[0]*C[2] )*det;
496 B[0][0] = C[ 6]*Ai[0] + C[ 7]*Ai[1] + C[ 8]*Ai[3];
497 B[0][1] = C[ 6]*Ai[1] + C[ 7]*Ai[2] + C[ 8]*Ai[4];
498 B[0][2] = C[ 6]*Ai[3] + C[ 7]*Ai[4] + C[ 8]*Ai[5];
500 B[1][0] = C[10]*Ai[0] + C[11]*Ai[1] + C[12]*Ai[3];
501 B[1][1] = C[10]*Ai[1] + C[11]*Ai[2] + C[12]*Ai[4];
502 B[1][2] = C[10]*Ai[3] + C[11]*Ai[4] + C[12]*Ai[5];
504 B[2][0] = C[15]*Ai[0] + C[16]*Ai[1] + C[17]*Ai[3];
505 B[2][1] = C[15]*Ai[1] + C[16]*Ai[2] + C[17]*Ai[4];
506 B[2][2] = C[15]*Ai[3] + C[16]*Ai[4] + C[17]*Ai[5];
508 B[3][0] = C[21]*Ai[0] + C[22]*Ai[1] + C[23]*Ai[3];
509 B[3][1] = C[21]*Ai[1] + C[22]*Ai[2] + C[23]*Ai[4];
510 B[3][2] = C[21]*Ai[3] + C[22]*Ai[4] + C[23]*Ai[5];
512 B[4][0] = C[28]*Ai[0] + C[29]*Ai[1] + C[30]*Ai[3];
513 B[4][1] = C[28]*Ai[1] + C[29]*Ai[2] + C[30]*Ai[4];
514 B[4][2] = C[28]*Ai[3] + C[29]*Ai[4] + C[30]*Ai[5];
516 double z[3] = {
m[0]-r[0],
m[1]-r[1],
m[2]-r[2]};
520 r[3]+= B[0][0]*z[0] + B[0][1]*z[1] + B[0][2]*z[2];
521 r[4]+= B[1][0]*z[0] + B[1][1]*z[1] + B[1][2]*z[2];
522 r[5]+= B[2][0]*z[0] + B[2][1]*z[1] + B[2][2]*z[2];
523 r[6]+= B[3][0]*z[0] + B[3][1]*z[1] + B[3][2]*z[2];
524 r[7]+= B[4][0]*z[0] + B[4][1]*z[1] + B[4][2]*z[2];
527 double AV[6] = { C[0]-V[0], C[1]-V[1], C[2]-V[2],
528 C[3]-V[3], C[4]-V[4], C[5]-V[5] };
530 AVi[0] = AV[4]*AV[4] - AV[2]*AV[5];
531 AVi[1] = AV[1]*AV[5] - AV[3]*AV[4];
532 AVi[2] = AV[3]*AV[3] - AV[0]*AV[5] ;
533 AVi[3] = AV[2]*AV[3] - AV[1]*AV[4];
534 AVi[4] = AV[0]*AV[4] - AV[1]*AV[3] ;
536 det = ( AV[0]*AVi[0] + AV[1]*AVi[1] + AV[3]*AVi[3] );
537 det = (det>1.e-8) ?1./det :0;
539 Chi2 += ( +(AVi[0]*z[0] + AVi[1]*z[1] + AVi[3]*z[2])*z[0]
540 +(AVi[1]*z[0] + AVi[2]*z[1] + AVi[4]*z[2])*z[1]
541 +(AVi[3]*z[0] + AVi[4]*z[1] + AVi[5]*z[2])*z[2] )*det;
552 d0= B[0][0]*V[0] + B[0][1]*V[1] + B[0][2]*V[3] - C[ 6];
553 d1= B[0][0]*V[1] + B[0][1]*V[2] + B[0][2]*V[4] - C[ 7];
554 d2= B[0][0]*V[3] + B[0][1]*V[4] + B[0][2]*V[5] - C[ 8];
559 C[ 9]+= d0*B[0][0] + d1*B[0][1] + d2*B[0][2];
561 d0= B[1][0]*V[0] + B[1][1]*V[1] + B[1][2]*V[3] - C[10];
562 d1= B[1][0]*V[1] + B[1][1]*V[2] + B[1][2]*V[4] - C[11];
563 d2= B[1][0]*V[3] + B[1][1]*V[4] + B[1][2]*V[5] - C[12];
568 C[13]+= d0*B[0][0] + d1*B[0][1] + d2*B[0][2];
569 C[14]+= d0*B[1][0] + d1*B[1][1] + d2*B[1][2];
571 d0= B[2][0]*V[0] + B[2][1]*V[1] + B[2][2]*V[3] - C[15];
572 d1= B[2][0]*V[1] + B[2][1]*V[2] + B[2][2]*V[4] - C[16];
573 d2= B[2][0]*V[3] + B[2][1]*V[4] + B[2][2]*V[5] - C[17];
578 C[18]+= d0*B[0][0] + d1*B[0][1] + d2*B[0][2];
579 C[19]+= d0*B[1][0] + d1*B[1][1] + d2*B[1][2];
580 C[20]+= d0*B[2][0] + d1*B[2][1] + d2*B[2][2];
582 d0= B[3][0]*V[0] + B[3][1]*V[1] + B[3][2]*V[3] - C[21];
583 d1= B[3][0]*V[1] + B[3][1]*V[2] + B[3][2]*V[4] - C[22];
584 d2= B[3][0]*V[3] + B[3][1]*V[4] + B[3][2]*V[5] - C[23];
589 C[24]+= d0*B[0][0] + d1*B[0][1] + d2*B[0][2];
590 C[25]+= d0*B[1][0] + d1*B[1][1] + d2*B[1][2];
591 C[26]+= d0*B[2][0] + d1*B[2][1] + d2*B[2][2];
592 C[27]+= d0*B[3][0] + d1*B[3][1] + d2*B[3][2];
594 d0= B[4][0]*V[0] + B[4][1]*V[1] + B[4][2]*V[3] - C[28];
595 d1= B[4][0]*V[1] + B[4][1]*V[2] + B[4][2]*V[4] - C[29];
596 d2= B[4][0]*V[3] + B[4][1]*V[4] + B[4][2]*V[5] - C[30];
601 C[31]+= d0*B[0][0] + d1*B[0][1] + d2*B[0][2];
602 C[32]+= d0*B[1][0] + d1*B[1][1] + d2*B[1][2];
603 C[33]+= d0*B[2][0] + d1*B[2][1] + d2*B[2][2];
604 C[34]+= d0*B[3][0] + d1*B[3][1] + d2*B[3][2];
605 C[35]+= d0*B[4][0] + d1*B[4][1] + d2*B[4][2];
610 double CH00 = C[0]+r0[0]*C[28];
611 double CH10 = C[1]+r0[0]*C[29];
612 double CH11 = C[2]+r0[1]*C[29];
613 double CH20 = C[3]+r0[0]*C[30];
614 double CH21 = C[4]+r0[1]*C[30];
615 double CH22 = C[5]+r0[2]*C[30];
621 C[0] = CH00+r0[0]*C[28];
622 C[1] = CH10+r0[1]*C[28];
623 C[2] = CH11+r0[1]*C[29];
624 C[3] = CH20+r0[2]*C[28];
625 C[4] = CH21+r0[2]*C[29];
626 C[5] = CH22+r0[2]*C[30];
friend F32vec4 sqrt(const F32vec4 &a)
void SetTopoConstraint(CbmKFVertexInterface *Parent=0)
void SetTracks(std::vector< CbmKFTrackInterface * > &vTracks)
void GetMass(Double_t *M, Double_t *Error)
void SetApproximation(CbmKFVertexInterface *Guess=0)
void SetMassConstraint(Double_t MotherMass=-1)
void GetVertex(CbmKFVertexInterface &vtx)
void GetMotherTrack(Double_t T[], Double_t C[])
void AddTrack(CbmKFTrackInterface *Track)
void Extrapolate(double T)
Int_t Extrapolate(Double_t z, Double_t *QP0=0, Bool_t line=false)
Access to i-th hit.
Double_t * GetTrack()
Is it electron.
Double_t & GetRefChi2()
array[15] of covariance matrix
Int_t & GetRefNDF()
Chi^2 after fit.
Double_t * GetCovMatrix()
array[6] of track parameters(x,y,tx,ty,qp,z)
virtual Double_t & GetRefY()
virtual Double_t & GetRefX()
virtual Double_t & GetRefZ()
virtual Double_t & GetRefChi2()
Array[6] of covariance matrix.
virtual Int_t & GetRefNDF()
Chi^2 after fit.
void GetVertex(CbmVertex &v)
virtual Double_t * GetCovMatrix()
static CbmKF * Instance()
std::vector< CbmKFTube > vTargets