//-*- Mode: C++ -*- // $Id: PndFTSCATrackParamVector.h,v 1.3 2011/01/31 17:18:32 fisyak Exp $ // ************************************************************************ // This file is property of and copyright by the ALICE HLT Project * // ALICE Experiment at CERN, All rights reserved. * // See cxx source for full Copyright notice * // * //************************************************************************* #ifndef PNDFTSCATRACKPARAMVECTOR_H #define PNDFTSCATRACKPARAMVECTOR_H class PndFTSCATrackParam; #ifdef PANDA_FTS #include "PndFTSCADef.h" #include "PndFTSVector.h" #include "PndFTSCAMath.h" #include "L1XYMeasurementInfo.h" #include "L1MaterialInfo.h" #include "L1Field.h" #include "FairField.h" #include "FairRunAna.h" // #include "CAX1X2MeasurementInfo.h" #include "FTSCAStation.h" class PndFTSCAParam; class FTSCAHit; class FTSCAHitV; class FTSCATarget; /** * @class PndFTSCATrackParamVector * * PndFTSCATrackParamVector class describes the track parametrisation * which is used by the PndFTSCATracker slice tracker. * */ class PndFTSCATrackParamVector { friend std::istream &operator>>( std::istream &, PndFTSCATrackParamVector & ); friend std::ostream &operator<<( std::ostream &, const PndFTSCATrackParamVector & ); public: PndFTSCATrackParamVector(): fX(0.f),fY(0.f),fTx(0.f),fTy(0.f),fQP(0.f),fZ(0.f), fC00(0.f), fC10(0.f), fC11(0.f), fC20(0.f), fC21(0.f), fC22(0.f), fC30(0.f), fC31(0.f), fC32(0.f), fC33(0.f), fC40(0.f), fC41(0.f), fC42(0.f), fC43(0.f), fC44(0.f), fChi2(0.f), fNDF(0.f) { fZB[0] = fZB[1] = 10e10; fDirection = true; } void SetTrackParam(const PndFTSCATrackParamVector ¶m, const float_m &m = float_m( true ) ) { for(int i=0; i<5; i++) Par(i)(m) = param.Par(i); for(int i=0; i<15; i++) Cov(i)(m) = param.Cov(i); fX(m) = param.X(); fChi2(m) = param.Chi2(); fZ(m) = param.Z(); fNDF(static_cast(m)) = param.NDF(); fAlpha(static_cast(m)) = param.Angle(); } void SetTrackParamOne(int iV, const PndFTSCATrackParamVector ¶m, int iVa ) { for(int i=0; i<5; i++) Par(i)[iV] = param.Par(i)[iVa]; for(int i=0; i<15; i++) Cov(i)[iV] = param.Cov(i)[iVa]; fX[iV] = param.X()[iVa]; fZ[iV] = param.Z()[iVa]; fChi2[iV] = param.Chi2()[iVa]; fNDF[iV] = param.NDF()[iVa]; fAlpha[iV] = param.Angle()[iVa]; } void ConvertTrackParamToVector( PndFTSCATrackParam t0[float_v::Size], int nTracksV ); void PrintCovMat() { cout << "CovMat " << endl; //for ( int i = 0; i < 15; i++ ) cout << Cov(0) << endl; cout << Cov(1) << " "<< Cov(2) << endl; cout << Cov(3) << " "<< Cov(4) <<" "<< Cov(5) << endl; cout << Cov(6) << " "<< Cov(7) <<" "<< Cov(8) <<" "<< Cov(9) << endl; cout << Cov(10) <<" "<< Cov(11) <<" "<< Cov(12) <<" "<< Cov(13) <<" "<< Cov(14) << endl; /*cout << Cov(0)[0] << endl; cout << Cov(1)[0] << " "<< Cov(2)[0] << endl; cout << Cov(3)[0] << " "<< Cov(4)[0] <<" "<< Cov(5)[0] << endl; cout << Cov(6)[0] << " "<< Cov(7)[0] <<" "<< Cov(8)[0] <<" "<< Cov(9)[0] << endl; cout << Cov(10)[0] <<" "<< Cov(11)[0] <<" "<< Cov(12)[0] <<" "<< Cov(13)[0] <<" "<< Cov(14)[0];*/ } void InitCovMatrix( float_v d2QMom = 0.f ); void InitByTarget( const FTSCATarget& target ); void InitByHit( const FTSCAHitV& hit, const PndFTSCAParam& param, const float_v& dQP ); void InitDirection( float_v r0, float_v r1, float_v r2 ) { // initialize direction parameters according to a given tangent vector r = { r0, r1, r2 } float_m mask = (r0 > 0.f); float_v tx (Vc::Zero); tx(mask) = r1/r0; float_v ty(Vc::Zero); ty(mask) = r2/r0; SetTx( tx ); SetTy( ty ); } float_v X() const { return fX; } float_v Y() const { return fY; } float_v Z() const { return fZ; } float_v Tx() const { return fTx; } float_v Ty() const { return fTy; } float_v QP() const { return fQP;} float_v Bx() const { return fBx; } float_v By() const { return fBy; } float_v Chi2() const { return fChi2; } int_v NDF() const { return fNDF; } float_v Angle() const { return fAlpha; } float_v X0() const { return Z(); } float_v X1() const { return X(); } float_v X2() const { return Y(); } float_v Tx1() const { return Tx(); } float_v Tx2() const { return Ty(); } float_v QMomentum() const { return QP(); } // used for triplets comparison float_v SinPhi() const { // dx/dxz const float_v tx12 = Tx1()*Tx1(); return sqrt( tx12/(1.f + tx12) ); } const float_v& Par( int i ) const { switch ( i ) { case 0: return fX; case 1: return fY; case 2: return fTx; case 3: return fTy; case 4: return fQP; case 5: return fZ; }; assert(0); return fX; } const float_v& Cov( int i ) const { switch ( i ) { case 0: return fC00; case 1: return fC10; case 2: return fC11; case 3: return fC20; case 4: return fC21; case 5: return fC22; case 6: return fC30; case 7: return fC31; case 8: return fC32; case 9: return fC33; case 10: return fC40; case 11: return fC41; case 12: return fC42; case 13: return fC43; case 14: return fC44; }; assert(0); return fC00; } float_v Err2X1() const { return Err2X(); } float_v Err2X2() const { return Err2Y(); } float_v Err2X() const { return fC00; } float_v Err2Y() const { return fC11; } float_v Err2QP() const { return fC44; } float_v Err2QMomentum() const { return Err2QP(); } void SetX( const float_v &v ) { fX = v; } void SetY( const float_v &v ) { fY = v; } void SetZ( const float_v &v ) { fZ = v; } void SetTx( const float_v &v ) { fTx = v; } void SetTy( const float_v &v ) { fTy = v; } void SetQP( const float_v &v ) { fQP = v; } void SetQMomentum( const float_v &v ) { fQP = v; } void SetBx( const float_v &v ) { fBx = v; } void SetBy( const float_v &v ) { fBy = v; } void SetChi2( const float_v &v ) { fChi2 = v; } void SetNDF( int v ) { fNDF = v; } void SetNDF( const int_v &v ) { fNDF = v; } void SetAngle( const float_v& v ) { fAlpha = v; } void SetPar( int i, float_v v ) { switch ( i ) { case 0: fX = v; break; case 1: fY = v; break; case 2: fTx = v; break; case 3: fTy = v; break; case 4: fQP = v; break; } } void SetCov( int i, float_v v ) { switch ( i ) { case 0: fC00 = v; break; case 1: fC10 = v; break; case 2: fC11 = v; break; case 3: fC20 = v; break; case 4: fC21 = v; break; case 5: fC22 = v; break; case 6: fC30 = v; break; case 7: fC31 = v; break; case 8: fC32 = v; break; case 9: fC33 = v; break; case 10: fC40 = v; break; case 11: fC41 = v; break; case 12: fC42 = v; break; case 13: fC43 = v; break; case 14: fC44 = v; break; } } void SetDirection( bool b ) { fDirection = b; } float_v& Par( int i ) { switch ( i ) { case 0: return fX; case 1: return fY; case 2: return fTx; case 3: return fTy; case 4: return fQP; }; assert(0); return fX; } float_v& Cov( int i ) { switch ( i ) { case 0: return fC00; case 1: return fC10; case 2: return fC11; case 3: return fC20; case 4: return fC21; case 5: return fC22; case 6: return fC30; case 7: return fC31; case 8: return fC32; case 9: return fC33; case 10: return fC40; case 11: return fC41; case 12: return fC42; case 13: return fC43; case 14: return fC44; }; assert(0); return fC00; } void SetX( const float_v &v, const float_m &m ) { fX( m ) = v; } void SetY( const float_v &v, const float_m &m ) { fY( m ) = v; } void SetZ( const float_v &v, const float_m &m ) { fZ( m ) = v; } void SetTx( const float_v &v, const float_m &m ) { fTx( m ) = v; } void SetTy( const float_v &v, const float_m &m ) { fTy( m ) = v; } void SetQP( const float_v &v, const float_m &m ) { fQP( m ) = v; } void SetQMomentum( const float_v &v, const float_m &m ) { fQP( m ) = v; } void SetChi2( const float_v &v, const float_m &m ) { fChi2(m) = v; } void SetNDF( const int_v &v, const int_m &m ) { fNDF(m) = v; } void SetField( int i, const CAFieldValue& b, const float_v& zb ) { fB[i] = b; fZB[i] = zb; } void UpdateFieldValues(const FTSCAHitV& hit, const PndFTSCAParam& param, L1FieldRegion& f, const float_m& mask); void UpdateFieldValues(const FTSCAHitV& hit, int_v& iVrt, float_v& zVirtualStation, const PndFTSCAParam& param, L1FieldRegion& f, const float_m& mask); void SetCovX12( float_v v00, float_v v10, float_v v11 ) { fC00 = v00; fC10 = v10; fC11 = v11; } // float_m Transport(const int_v& ista, const int_v& iVSta, const PndFTSCAParam& param, const float_m&mask = float_m( true ) ); //float_m Transport( const int_v& ista, const PndFTSCAParam& param, const float_m &mask = float_m( true ) ); float_m Transport( const FTSCAHitV& hit, const PndFTSCAParam& p, float_v& qp0, const float_m &mask = float_m( true ) ); float_m Transport( const FTSCAHitV& hit, const PndFTSCAParam& p, const float_m &mask = float_m( true ) ); float_m TransportByLine( const FTSCAHitV& hit, const PndFTSCAParam& param, const float_m &mask = float_m( true ) ); float_m Filter( const FTSCAHitV& hit, const PndFTSCAParam& param, const float_m &mask = float_m( true ), const float_v& chi2Cut = 10e10f ); float_m Transport( const FTSCAHit& hit, const PndFTSCAParam& p, const float_m &mask = float_m( true ) ); float_m Filter( const FTSCAHit& hit, const PndFTSCAParam& param, const float_m &mask = float_m( true ), const float_v& chi2Cut = 10e10f ); float_m AddTarget( const FTSCATarget& t, const float_m &mask = float_m( true ) ); private: // float_m Transport( const FTSCAHitV& hit, const L1FieldRegion& F, const PndFTSCAParam& p, const float_m &mask = float_m( true ) ); // dbg TODO delme float_m TransportToX0WithMaterial( const float_v &x0, const L1FieldRegion &F, const L1MaterialInfo &material, float_v &qp0, const float_m &mask = float_m( true ) ); float_m TransportToX0( const float_v &x0, const L1FieldRegion &F, const float_v &qp0, const float_m &mask = float_m( true ) ); float_m RK4TransportToX0( const float_v &x0_out, const L1FieldRegion &F, const float_v &qp0, const float_m &mask = float_m(true) ); float_m TransportToX0Line( const float_v &x0, const float_m &mask = float_m( true ) ); float_m PassMaterial( const L1MaterialInfo &info, const float_v &qp0, const float_m &mask = float_m( true ) ); void EnergyLossCorrection( const float_v& mass2, const float_v& radThick, float_v &qp0, float_v direction, const float_m &mask); float_v ApproximateBetheBloch( const float_v &bg2 ); float_m Filter( const float_v &y0, const float_v &z0, const float_v &r, const FTSCAStripInfoVector &info, float_v err2, const float_m &active, const float_v& chi2Cut = 10e10f ); float_m FilterVtx( const float_v &xV, const float_v& yV, const L1XYMeasurementInfo &info, float_v& extrDx, float_v& extrDy, float_v J[], const float_m &active = float_m( true ) ); float_m TransportJXY0ToX0( const float_v &x0, const L1FieldRegion &F, float_v& extrDx, float_v& extrDy, float_v &J04, float_v &J14, const float_m &active = float_m( true ) ); float_v fX,fY,fTx,fTy,fQP,fZ, fC00, fC10, fC11, fC20, fC21, fC22, fC30, fC31, fC32, fC33, fC40, fC41, fC42, fC43, fC44; float_v fChi2; // the chi^2 value int_v fNDF; // the Number of Degrees of Freedom float_v fBx; float_v fBy; CAFieldValue fB[2]; // field at two previous points, which track passed float_v fZB[2]; // fZ position of the filld point bool fDirection; float_v fAlpha; // coor system float_v fDelta; }; #include "debug.h" inline float_m PndFTSCATrackParamVector::TransportToX0Line( const float_v &x0_out, const float_m &mask ) { float_v dz = (x0_out - fZ); //cout<<"dz "< 1.e-8f ); //const float_v& h0 = info.cos; //const float_v& h1 = info.sin; float_v h0(Vc::Zero); float_v h1(Vc::Zero); h0(active) = info.cos; h1(active) = info.sin; /*foreach_bit(unsigned short iV, active) { h0[iV] = info.cos; h1[iV] = info.sin; }*/ const float_v tx = h0*fTx + h1*fTy; float_v zeta; // float_v Sign_1 = float_v(0.0); float_v rCorrection = sqrt(1.f+tx*tx); float_v Diff = h0*(fX - x0) + h1*(fY - y0); float_v zeta_1, zeta_2; zeta_1 = h0*(fX - x0) + h1*(fY - y0) - r*rCorrection; zeta_2 = h0*(fX - x0) + h1*(fY - y0) + r*rCorrection; for (int iDiff=0; iDiff < 4; iDiff++) { float Diff_f = (float)Diff[iDiff]; if (Diff_f> 0.f ) { //zeta = h0*(fX - x0) + h1*(fY - y0) - r*rCorrection; zeta[iDiff] = zeta_1[iDiff]; } else { zeta[iDiff] = zeta_2[iDiff]; } } // iDiff //const float_v zeta2 = h0*(fX - x0) + h1*(fY - y0) + r*rCorrection; if (err2[0] < 0.01f) err2[0] = err2[0] + r[0]*r[0]; err2 *= rCorrection*rCorrection; float_v wi, zetawi, HCH; float_v F0, F1, F2, F3, F4; float_v K1, K2, K3, K4; if (fC00[0] < 0.f) fC00[0]=0.f; // F = CH' F0 = h0*fC00 + h1*fC10; F1 = h0*fC10 + h1*fC11; //HCH = ( F0*h0 + F1*h1 ); HCH = (h0*h0*fC00 + 2.f*h0*h1*fC10) + h1*h1*fC11; F2 = h0*fC20 + h1*fC21; F3 = h0*fC30 + h1*fC31; F4 = h0*fC40 + h1*fC41; float_v dChi2(Vc::Zero); #if 0 // use mask cout<<"we don't have to be here for now \n"; const float_m mask = success && (HCH > err2 * 16.f); HCH(mask) += err2; wi(mask) = 1.f/HCH ; zetawi(mask) = zeta *wi; dChi2(mask) += (zeta * zetawi); fChi2 += dChi2; #else wi = 1.f/( err2 + HCH ); zetawi = zeta *wi; dChi2(success) += zeta * zetawi; //success &= dChi2 < chi2Cut; fChi2 += dChi2; //fChi2(success) += zeta * zetawi; #endif // 0 //success &= fChi2 < chi2Cut; K1 = F1*wi; K2 = F2*wi; K3 = F3*wi; K4 = F4*wi; fX(success) -= F0*zetawi; fY(success) -= F1*zetawi; fTx(success) -= F2*zetawi; fTy(success) -= F3*zetawi; fQP(success) -= F4*zetawi; fC00(success) -= F0*F0*wi; fC10(success) -= K1*F0; fC11(success) -= K1*F1; fC20(success) -= K2*F0; fC21(success) -= K2*F1; fC22(success) -= K2*F2; fC30(success) -= K3*F0; fC31(success) -= K3*F1; fC32(success) -= K3*F2; fC33(success) -= K3*F3; fC40(success) -= K4*F0; fC41(success) -= K4*F1; fC42(success) -= K4*F2; fC43(success) -= K4*F3; fC44(success) -= K4*F4; fNDF( static_cast(success) ) += 1; return success; } inline float_m PndFTSCATrackParamVector::TransportToX0WithMaterial( const float_v &x0, const L1FieldRegion &F, const L1MaterialInfo &material, float_v &qp0, const float_m &mask ) { // TODO material float_m active = mask; active &= TransportToX0( x0, F, qp0, active ); //active &= TransportToX0Line(x0, active); //active &= RK4TransportToX0( x0, F, qp0, active ); active &= PassMaterial( material, qp0, active ); const float_v mass2 = 0.13957f*0.13957f; float_v direction = -1.f; if(fDirection) direction = 1.f; //std::cout << "qp " << qp0[0] << " " << " fQP " << fQP[0]<<" "; EnergyLossCorrection(mass2, material.RadThick, qp0, direction, active); //std::cout << qp0[0] << " " << fQP[0] << std::endl; return active; } inline float_m PndFTSCATrackParamVector::RK4TransportToX0( const float_v &x0_out, const L1FieldRegion &F, const float_v &qp0, const float_m &mask ) { // Forth-order Runge-Kutta method for solution of the equation // of motion of a particle with parameter qp = Q /P // in the magnetic field B() // // | x | tx // | y | ty // d/dz = | tx| = ft * ( ty * ( B(3)+tx*b(1) ) - (1+tx**2)*B(2) ) // | ty| ft * (-tx * ( B(3)+ty+b(2) - (1+ty**2)*B(1) ) , // // where ft = c_light*qp*sqrt ( 1 + tx**2 + ty**2 ) . // // In the following for RK step : // // x=x[0], y=x[1], tx=x[3], ty=x[4]. // //======================================================================== // const float ZERO = 0.0, ONE = 1.; //RK4ORDER float_v xOut[5]; float_v Fmat[25]; const float_v fC = 0.000299792458f; float_v coef[4]; coef[0] = 0.f; coef[1] = 0.5f; coef[2] = 0.5f; coef[3] = 1.f; float_v xIn[4]; xIn[0] = fX; xIn[2] = fTx; xIn[1] = fY; xIn[3] = fTy; xIn[4] = fQP; float_v Ax[4], Ay[4]; float_v dAx_dtx[4], dAy_dtx[4], dAx_dty[4], dAy_dty[4]; float_v k[4][4]; float_v h = x0_out - fZ; //cout<<"Step h: "< 0) { x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1]; x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1]; x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1]; x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1]; } float_v bx(0.f), by(0.f), bz(0.f); double p[3]; double b[3]; for (int xxx = 0; xxx < float_v::Size; xxx++) { // if (fabs(x[0][xxx])>0.001) { //double p[3] = {fX[ctr], fY[ctr], fZ[ctr]}; //double b[3] = {0., 0., 0.}; p[0] = x[0][xxx]; p[1] = x[1][xxx]; p[2] = fZ[xxx] + coef[iStep][xxx] * h[xxx]; b[0] = 0; b[1] = 0; b[2] = 0; FairRunAna::Instance()->GetField()->Field(p,b);//CbmKF::Instance()->GetMagneticField()->GetFieldValue(p,b); bx[xxx] = b[0]; by[xxx] = b[1]; bz[xxx] = b[2]; } } //fField->GetFieldValue(x[0], x[1], zIn + coef[iStep] * h, Bx, By, Bz); float_v tx = x[2]; float_v ty = x[3]; float_v txtx = tx * tx; float_v tyty = ty * ty; float_v txty = tx * ty; float_v txtxtyty1= 1.f + txtx + tyty; float_v t1 = sqrt(txtxtyty1); float_v t2 = 1.f / txtxtyty1; Ax[iStep] = ( txty * bx + ty * bz - ( 1.f + txtx ) * by ) * t1; Ay[iStep] = (-txty * by - tx * bz + ( 1.f + tyty ) * bx ) * t1; dAx_dtx[iStep] = Ax[iStep] * tx * t2 + ( ty * bx - 2.f * tx * by ) * t1; dAx_dty[iStep] = Ax[iStep] * ty * t2 + ( tx * bx + bz ) * t1; dAy_dtx[iStep] = Ay[iStep] * tx * t2 + (-ty * by - bz ) * t1; dAy_dty[iStep] = Ay[iStep] * ty * t2 + (-tx * by + 2.f * ty * bx ) * t1; k[0][iStep] = tx * h; k[1][iStep] = ty * h; k[2][iStep] = Ax[iStep] * hCqp; k[3][iStep] = Ay[iStep] * hCqp; } // 1 //in + k[0]/6.f + k[1]/3.f + k[2]/3.f + k[3]/6.f; //for (unsigned int i = 0; i < 4; i++) { xOut[i] = CalcOut(xIn[i], k[i]); } xOut[0] = xIn[0] + k[0][0]/6.f + k[0][1]/3.f + k[0][2]/3.f + k[0][3]/6.f; xOut[1] = xIn[1] + k[1][0]/6.f + k[1][1]/3.f + k[1][2]/3.f + k[1][3]/6.f; xOut[2] = xIn[2] + k[2][0]/6.f + k[2][1]/3.f + k[2][2]/3.f + k[2][3]/6.f; xOut[3] = xIn[3] + k[3][0]/6.f + k[3][1]/3.f + k[3][2]/3.f + k[3][3]/6.f; xOut[4] = xIn[4]; fX(mask) = xOut[0]; fY(mask) = xOut[1]; fTx(mask) = xOut[2]; fTy(mask) = xOut[3]; fQP(mask) = xOut[4]; fZ(mask) += h; // Calculation of the derivatives // derivatives dx/dx and dx/dy // dx/dx Fmat[0] = 1.f; Fmat[5] = 0.f; Fmat[10] = 0.f; Fmat[15] = 0.f; Fmat[20] = 0.f; // dx/dy Fmat[1] = 0.f; Fmat[6] = 1.f; Fmat[11] = 0.f; Fmat[16] = 0.f; Fmat[21] = 0.f; // end of derivatives dx/dx and dx/dy // Derivatives dx/tx x[0] = x0[0] = 0.f; x[1] = x0[1] = 0.f; x[2] = x0[2] = 1.f; x[3] = x0[3] = 0.f; for (unsigned int iStep = 0; iStep < 4; iStep++) { // 2 if (iStep > 0) { x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1]; x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1]; x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1]; } k[0][iStep] = x[2] * h; k[1][iStep] = x[3] * h; //k[2][iStep] = (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]) * hCqp; k[3][iStep] = (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]) * hCqp; } // 2 Fmat[2] = x0[0] + k[0][0]/6.f + k[0][1]/3.f + k[0][2]/3.f + k[0][3]/6.f; Fmat[7] = x0[1] + k[1][0]/6.f + k[1][1]/3.f + k[1][2]/3.f + k[1][3]/6.f; Fmat[12] = 1.f; Fmat[17] = x0[3] + k[3][0]/6.f + k[3][1]/3.f + k[3][2]/3.f + k[3][3]/6.f; Fmat[22] = 0.f; // end of derivatives dx/dtx // Derivatives dx/ty x[0] = x0[0] = 0.f; x[1] = x0[1] = 0.f; x[2] = x0[2] = 0.f; x[3] = x0[3] = 1.f; for (unsigned int iStep = 0; iStep < 4; iStep++) { // 4 if (iStep > 0) { x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1]; x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1]; x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1]; } k[0][iStep] = x[2] * h; k[1][iStep] = x[3] * h; k[2][iStep] = (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]) * hCqp; //k[3][iStep] = (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]) * hCqp; } // 4 Fmat[3] = x0[0] + k[0][0]/6.f + k[0][1]/3.f + k[0][2]/3.f + k[0][3]/6.f; Fmat[8] = x0[1] + k[1][0]/6.f + k[1][1]/3.f + k[1][2]/3.f + k[1][3]/6.f; Fmat[13] = x0[2] + k[2][0]/6.f + k[2][1]/3.f + k[2][2]/3.f + k[2][3]/6.f; Fmat[18] = 1.f; Fmat[23] = 0.f; // end of derivatives dx/dty // Derivatives dx/dqp x[0] = x0[0] = 0.f; x[1] = x0[1] = 0.f; x[2] = x0[2] = 0.f; x[3] = x0[3] = 0.f; for (unsigned int iStep = 0; iStep < 4; iStep++) { // 4 if (iStep > 0) { x[0] = xIn[0] + coef[iStep] * k[0][iStep - 1]; x[1] = xIn[1] + coef[iStep] * k[1][iStep - 1]; x[2] = xIn[2] + coef[iStep] * k[2][iStep - 1]; x[3] = xIn[3] + coef[iStep] * k[3][iStep - 1]; } k[0][iStep] = x[2] * h; k[1][iStep] = x[3] * h; k[2][iStep] = Ax[iStep] * hC + hCqp * (dAx_dtx[iStep] * x[2] + dAx_dty[iStep] * x[3]); k[3][iStep] = Ay[iStep] * hC + hCqp * (dAy_dtx[iStep] * x[2] + dAy_dty[iStep] * x[3]); } // 4 Fmat[4] = x0[0] + k[0][0]/6.f + k[0][1]/3.f + k[0][2]/3.f + k[0][3]/6.f; Fmat[9] = x0[1] + k[1][0]/6.f + k[1][1]/3.f + k[1][2]/3.f + k[1][3]/6.f; Fmat[14] = x0[2] + k[2][0]/6.f + k[2][1]/3.f + k[2][2]/3.f + k[2][3]/6.f; Fmat[19] = x[3] + k[3][0]/6.f + k[3][1]/3.f + k[3][2]/3.f + k[3][3]/6.f; Fmat[24] = 1.f; // end of derivatives dx/dqp // end calculation of the derivatives // F*C*Ft float_v A = fC20 + Fmat[2] * fC22 + Fmat[3] * fC32 + Fmat[4] * fC42; float_v B = fC30 + Fmat[2] * fC32 + Fmat[3] * fC33 + Fmat[4] * fC43; float_v C = fC40 + Fmat[2] * fC42 + Fmat[3] * fC43 + Fmat[4] * fC44; float_v D = fC21 + Fmat[7] * fC22 + Fmat[8] * fC32 + Fmat[9] * fC42; float_v E = fC31 + Fmat[7] * fC32 + Fmat[8] * fC33 + Fmat[9] * fC43; float_v G = fC41 + Fmat[7] * fC42 + Fmat[8] * fC43 + Fmat[9] * fC44; float_v H = fC22 + Fmat[13] * fC32 + Fmat[14] * fC42; float_v I = fC32 + Fmat[13] * fC33 + Fmat[14] * fC43; float_v J = fC42 + Fmat[13] * fC43 + Fmat[14] * fC44; float_v K = fC43 + Fmat[17] * fC42 + Fmat[19] * fC44; fC00(mask) = fC00 + Fmat[2] * fC20 + Fmat[3] * fC30 + Fmat[4] * fC40 + A * Fmat[2] + B * Fmat[3] + C * Fmat[4]; fC10(mask) = fC10 + Fmat[2] * fC21 + Fmat[3] * fC31 + Fmat[4] * fC41 + A * Fmat[7] + B * Fmat[8] + C * Fmat[9]; fC20(mask) = A + B * Fmat[13] + C * Fmat[14]; fC30(mask) = B + A * Fmat[17] + C * Fmat[19]; fC40(mask) = C; fC11(mask) = fC11 + Fmat[7] * fC21 + Fmat[8] * fC31 + Fmat[9] * fC41 + D * Fmat[7] + E * Fmat[8] + G * Fmat[9]; fC21(mask) = D + E * Fmat[13] + G * Fmat[14]; fC31(mask) = E + D * Fmat[17] + G * Fmat[19]; fC41(mask) = G; fC22(mask) = H + I * Fmat[13] + J * Fmat[14]; fC32(mask) = I + H * Fmat[17] + J * Fmat[19]; fC42(mask) = J; fC33(mask) = fC33 + Fmat[17] * fC32 + Fmat[19] * fC43 + (Fmat[17] * fC22 + fC32 + Fmat[19] * fC42) * Fmat[17] + K * Fmat[19]; fC43(mask) = K; fC44(mask) = fC44; return mask; } inline float_m PndFTSCATrackParamVector::TransportToX0( const float_v &x0_out, const L1FieldRegion &F, const float_v &qp0, const float_m &mask ) { //cout<<"Extrapolation..."< x1; d2(init) = lhwI + x - 0.5f; const float_v &r = ( x1 - x ) / ( x1 - x0 ); init = (x > x0) & (x1 > x); d2(init) = (lhwI + x - 0.5f + ( 0.5f - lhwI - x0 ) * r * r * r); return mK*mZA*( 1.f + bg2 ) / bg2*( 0.5f*log( _2me*bg2*maxT/(mI*mI) ) - bg2 / ( 1.f + bg2 ) - d2 ); } inline void PndFTSCATrackParamVector::EnergyLossCorrection( const float_v& mass2, const float_v& radThick, float_v &qp0, float_v direction, const float_m &mask) { const float_v& p2 = 1.f/(qp0*qp0); const float_v& E2 = mass2 + p2; const float_v& bethe = ApproximateBetheBloch( p2/mass2 ); float_v tr = sqrt(1.f + fTx*fTx + fTy*fTy) ; const float_v& dE = bethe * radThick*tr * 2.33f * 9.34961f; const float_v& E2Corrected = (sqrt(E2) + direction*dE) * (sqrt(E2) + direction*dE); float_v corr = sqrt( p2/( E2Corrected - mass2 ) ); //cout<<"corr "< struct char_traits; template class basic_istream; typedef basic_istream > istream; template class basic_ostream; typedef basic_ostream > ostream; } // namespace std /** * @class PndFTSCATrackParamVector * * PndFTSCATrackParamVector class describes the track parametrisation * which is used by the PndFTSCATracker slice tracker. * */ class PndFTSCATrackParamVector { friend std::istream &operator>>( std::istream &, PndFTSCATrackParamVector & ); friend std::ostream &operator<<( std::ostream &, const PndFTSCATrackParamVector & ); public: PndFTSCATrackParamVector() : fX( Vc::Zero ), fSignCosPhi( Vc::Zero ), fChi2( Vc::Zero ), fNDF( Vc::Zero ) { for ( int i = 0; i < 5; ++i ) fP[i].setZero(); for ( int i = 0; i < 15; ++i ) fC[i].setZero(); } void ConvertTrackParamToVector( PndFTSCATrackParam t0[float_v::Size], int nTracksV ); void InitCovMatrix( float_v d2QMom = 0.f ); void InitByTarget( const FTSCATarget& target ); void InitByHit( const FTSCAHitV& hit, const PndFTSCAParam& param, const float_v& dQMom ); void InitDirection( float_v r0, float_v r1, float_v r2 ) // initialize direction parameters according to a given tangent vector { const float_v r = sqrt( r0*r0+r1*r1 ); SetSinPhi( r1/r ); SetSignCosPhi( r0/abs(r0) ); SetDzDs( r2/r ); } struct PndFTSCATrackFitParam { float_v fBethe; float_v fE; float_v fTheta2; float_v fEP2; float_v fSigmadE2; float_v fK22; float_v fK33; float_v fK43; float_v fK44; }; float_v X() const { return fX; } float_v Y() const { return fP[0]; } float_v Z() const { return fP[1]; } float_v SinPhi() const { return fP[2]; } float_v DzDs() const { return fP[3]; } float_v QPt() const { return fP[4]; } float_v Angle() const { return fAlpha; } float_v X0() const { return X(); } float_v X1() const { return Y(); } float_v X2() const { return Z(); } float_v Tx1() const { return SinPhi()/(SignCosPhi()*sqrt( 1 - SinPhi()*SinPhi() )); } // CHECKME float_v Tx2() const { return DzDs()/(SignCosPhi()*sqrt( 1 - SinPhi()*SinPhi() )); } // dx2/dx0 = dz/dx float_v QMomentum() const { return QPt(); } // used for triplets comparison /** * The sign of cos phi is always positive in the slice tracker. Only after coordinate * transformation can the sign change to negative. */ float_v SignCosPhi() const { return fSignCosPhi; } float_v Chi2() const { return fChi2; } int_v NDF() const { return fNDF; } float_v Err2Y() const { return fC[0]; } float_v Err2Z() const { return fC[2]; } float_v Err2SinPhi() const { return fC[5]; } float_v Err2DzDs() const { return fC[9]; } float_v Err2QPt() const { return fC[14]; } float_v GetX() const { return fX; } float_v GetY() const { return fP[0]; } float_v GetZ() const { return fP[1]; } float_v GetSinPhi() const { return fP[2]; } float_v GetDzDs() const { return fP[3]; } float_v GetQPt() const { return fP[4]; } float_v GetSignCosPhi() const { return fSignCosPhi; } float_v GetChi2() const { return fChi2; } int_v GetNDF() const { return fNDF; } float_v GetKappa( const float_v &Bz ) const { return fP[4]*Bz; } float_v GetCosPhiPositive() const { return CAMath::Sqrt( float_v( Vc::One ) - SinPhi()*SinPhi() ); } float_v GetCosPhi() const { return fSignCosPhi*CAMath::Sqrt( float_v( Vc::One ) - SinPhi()*SinPhi() ); } float_v Err2X1() const { return fC[0]; } float_v Err2X2() const { return fC[2]; } // float_v GetErr2SinPhi() const { return fC[5]; } // float_v GetErr2DzDs() const { return fC[9]; } float_v Err2QMomentum() const { return fC[14]; } const float_v& Par( int i ) const { return fP[i]; } const float_v& Cov( int i ) const { return fC[i]; } private: friend class PndFTSCATrackParam; const float_v *Par() const { return fP; } const float_v *Cov() const { return fC; } float_v *Par() { return fP; } float_v *Cov() { return fC; } public: void SetTrackParam(const PndFTSCATrackParamVector ¶m, const float_m &m = float_m( true ) ) { for(int i=0; i<5; i++) fP[i](m) = param.Par()[i]; for(int i=0; i<15; i++) fC[i](m) = param.Cov()[i]; fX(m) = param.X(); fSignCosPhi(m) = param.SignCosPhi(); fChi2(m) = param.GetChi2(); fNDF(static_cast(m)) = param.GetNDF(); fAlpha(static_cast(m)) = param.Angle(); } void SetTrackParamOne(int iV, const PndFTSCATrackParamVector ¶m, int iVa ) { for(int i=0; i<5; i++) fP[i][iV] = param.Par()[i][iVa]; for(int i=0; i<15; i++) fC[i][iV] = param.Cov()[i][iVa]; fX[iV] = param.X()[iVa]; fSignCosPhi[iV] = param.SignCosPhi()[iVa]; fChi2[iV] = param.GetChi2()[iVa]; fNDF[iV] = param.GetNDF()[iVa]; fAlpha[iV] = param.Angle()[iVa]; } void SetPar( int i, const float_v &v ) { fP[i] = v; } void SetPar( int i, const float_v &v, const float_m &m ) { fP[i]( m ) = v; } void SetCov( int i, const float_v &v ) { fC[i] = v; } void SetCov( int i, const float_v &v, const float_m &m ) { fC[i]( m ) = v; } void SetX( const float_v &v ) { fX = v; } void SetY( const float_v &v ) { fP[0] = v; } void SetZ( const float_v &v ) { fP[1] = v; } void SetX( const float_v &v, const float_m &m ) { fX( m ) = v; } void SetY( const float_v &v, const float_m &m ) { fP[0]( m ) = v; } void SetZ( const float_v &v, const float_m &m ) { fP[1]( m ) = v; } void SetSinPhi( const float_v &v ) { fP[2] = v; } void SetSinPhi( const float_v &v, const float_m &m ) { fP[2]( m ) = v; } void SetDzDs( const float_v &v ) { fP[3] = v; } void SetDzDs( const float_v &v, const float_m &m ) { fP[3]( m ) = v; } void SetQPt( const float_v &v ) { fP[4] = v; } void SetQMomentum( const float_v &v ) { SetQPt(v); } void SetQPt( const float_v &v, const float_m &m ) { fP[4]( m ) = v; } void SetSignCosPhi( const float_v &v ) { fSignCosPhi = v; } void SetSignCosPhi( const float_v &v, const float_m &m ) { fSignCosPhi(m) = v; } void SetChi2( const float_v &v ) { fChi2 = v; } void SetChi2( const float_v &v, const float_m &m ) { fChi2(m) = v; } void SetNDF( int v ) { fNDF = v; } void SetNDF( const int_v &v ) { fNDF = v; } void SetNDF( const int_v &v, const int_m &m ) { fNDF(m) = v; } void SetAngle( const float_v &v ) { fAlpha = v; } void SetAngle( const float_v &v, const float_m &m ) { fAlpha(m) = v; } void SetErr2Y( float_v v ) { fC[0] = v; } void SetErr2Z( float_v v ) { fC[2] = v; } void SetErr2QPt( float_v v ) { fC[14] = v; } float_v GetDist2( const PndFTSCATrackParamVector &t ) const; float_v GetDistXZ2( const PndFTSCATrackParamVector &t ) const; float_v GetS( const float_v &x, const float_v &y, const float_v &Bz ) const; void GetDCAPoint( const float_v &x, const float_v &y, const float_v &z, float_v *px, float_v *py, float_v *pz, const float_v &Bz ) const; float_m TransportToX0WithMaterial( const float_v &x, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi = .999f ); float_m TransportToX0( const float_v &x, const float_v &Bz, const float maxSinPhi = .999f, const float_m &mask = float_m( true ) ); float_m TransportToX0( const float_v &x, PndFTSCATrackLinearisationVector &t0, const float_v &Bz, const float maxSinPhi = .999f, float_v *DL = 0, const float_m &mask = float_m( true ) ); float_m TransportToX0( const float_v &x, const float_v &sinPhi0, const float_v &Bz, const float_v maxSinPhi = .999f, const float_m &mask = float_m( true ) ); float_m TransportToX0WithMaterial( const float_v &x, PndFTSCATrackLinearisationVector &t0, PndFTSCATrackFitParam &par, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi = .999f, const float_m &mask = float_m( true ) ); float_m TransportToX0WithMaterial( const float_v &x, PndFTSCATrackFitParam &par, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi = .999f ); float_m Rotate( const float_v &alpha, PndFTSCATrackLinearisationVector &t0, const float maxSinPhi = .999f, const float_m &mask = float_m( true ) ); float_m Rotate( const float_v &alpha, const float maxSinPhi = .999f, const float_m &mask = float_m( true ) ); void RotateXY( float_v alpha, float_v &x, float_v &y, float_v &sin, const float_m &mask = float_m( true ) ) const ; float_m FilterWithMaterial( const float_v &y, const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z, float maxSinPhi=0.999f, const float_m &mask = float_m( true ), const int_v& hitNDF = int_v(2) ,const float_v& chi2Cut = 10e10f ); // filters 2-D measurement float_m FilterWithMaterial( const float_v &y, const float_v &z, const FTSCAStripInfo &info, float_v err2, float maxSinPhi=0.999f, const float_m &mask = float_m( true ), const float_v& chi2Cut = 10e10f ); // filters 1-D measurement float_m FilterWithMaterial( const float_v &y, const float_v &z, const float_v &r, const FTSCAStripInfo &info, float_v err2, float maxSinPhi=0.999f, const float_m &mask = float_m( true ), const float_v& chi2Cut = 10e10f ); // filters tube measurement static float_v ApproximateBetheBloch( const float_v &beta2 ); static float_v BetheBlochGeant( const float_v &bg, const float_v &kp0 = 2.33f, const float_v &kp1 = 0.20f, const float_v &kp2 = 3.00f, const float_v &kp3 = 173e-9f, const float_v &kp4 = 0.49848f ); static float_v BetheBlochSolid( const float_v &bg ); static float_v BetheBlochGas( const float_v &bg ); void CalculateFitParameters( PndFTSCATrackFitParam &par, const float_v &mass = 0.13957f ); float_m CorrectForMeanMaterial( const float_v &xOverX0, const float_v &xTimesRho, const PndFTSCATrackFitParam &par, const float_m &_mask ); // float_m FilterDelta( const float_m &mask, const float_v &dy, const float_v &dz, // float_v err2Y, float_v err2Z, const float maxSinPhi = .999f ); // float_m Filter( const float_m &mask, const float_v &y, const float_v &z, // float_v err2Y, float_v err2Z, const float maxSinPhi = .999f ); float_m FilterVtx( const float_v &xV, const float_v& yV, const CAX1X2MeasurementInfo &info, float_v& extrDx, float_v& extrDy, float_v J[], const float_m &active = float_m( true ) ); float_m TransportJ0ToX0( const float_v &x0, const float_v&cBz, float_v& extrDy, float_v& extrDz, float_v J[], const float_m &active = float_m( true ) ); float_m Transport( const int_v& ista, const PndFTSCAParam& param, const float_m &mask = float_m( true ) ); float_m Transport( const FTSCAHitV& hit, const PndFTSCAParam& p, const float_m &mask = float_m( true ) ); float_m Filter( const FTSCAHitV& hit, const PndFTSCAParam& param, const float_m &mask = float_m( true ), const float_v& chi2Cut = 10e10f ); float_m Transport( const FTSCAHit& hit, const PndFTSCAParam& p, const float_m &mask = float_m( true ) ); float_m Filter( const FTSCAHit& hit, const PndFTSCAParam& param, const float_m &mask = float_m( true ), const float_v& chi2Cut = 10e10f ); float_m AddTarget( const FTSCATarget& target, const float_m &mask = float_m( true ) ); private: float_v fX; // x position float_v fSignCosPhi; // sign of cosPhi float_v fP[5]; // 'active' track parameters: Y, Z, SinPhi = dy/sqrt(dx*dx + dy*dy), DzDs = dz/sqrt(dx*dx + dy*dy), q/Pt // if q/pt = 0 then track equation is [dr x e] = 0, where e = { sqrt( ( 1 - SinPhi^2 )/( 1 + DzDs^2 ) ), sqrt( SinPhi^2/( 1 + DzDs^2 ) ), sqrt( 1 /( 1 + DzDs^2 ) ) } float_v fC[15]; // the covariance matrix for Y,Z,SinPhi,.. float_v fChi2; // the chi^2 value int_v fNDF; // the Number of Degrees of Freedom float_v fAlpha; // coor system }; #include "debug.h" inline float_m PndFTSCATrackParamVector::TransportToX0( const float_v &x, const float_v &sinPhi0, const float_v &Bz, const float_v maxSinPhi, const float_m &_mask ) { //* Transport the track parameters to X=x, using linearization at phi0 with 0 curvature, //* and the field value Bz //* maxSinPhi is the max. allowed value for |t0.SinPhi()| //* linearisation of trajectory t0 is also transported to X=x, //* returns 1 if OK //* debugKF() << "Start TransportToX0(" << x << ", " << _mask << ")\n" << *this << std::endl; const float_v &ey = sinPhi0; const float_v &dx = x - X(); const float_v &exi = float_v( Vc::One ) * CAMath::RSqrt( float_v( Vc::One ) - ey * ey ); // RSqrt const float_v &dxBz = dx * Bz; const float_v &dS = dx * exi; const float_v &h2 = dS * exi * exi; const float_v &h4 = .5f * h2 * dxBz; //#define LOSE_DEBUG #ifdef LOSE_DEBUG std::cout << " TrTo-sinPhi0 = " << sinPhi0 << std::endl; #endif ///mvz start 23.01.2010 // const float_v &sinPhi = SinPhi() * (float_v( Vc::One ) - 0.5f * dxBz * QPt() *dxBz * QPt()/ ( float_v( Vc::One ) - SinPhi()*SinPhi() )) + dxBz * QPt(); const float_v &sinPhi = SinPhi() + dxBz * QPt(); ///mvz end 23.01.2010 #ifdef LOSE_DEBUG std::cout << " TrTo-sinPhi = " << sinPhi << std::endl; #endif float_m mask = _mask && CAMath::Abs( exi ) <= 1.e4f; mask &= ( (CAMath::Abs( sinPhi ) <= maxSinPhi) || (maxSinPhi <= 0.f) ); fX ( mask ) += dx; fP[0]( mask ) += dS * ey + h2 * ( SinPhi() - ey ) + h4 * QPt(); fP[1]( mask ) += dS * DzDs(); fP[2]( mask ) = sinPhi; //const float_v c00 = fC[0]; //const float_v c11 = fC[2]; const float_v c20 = fC[3]; //const float_v c21 = fC[4]; const float_v c22 = fC[5]; //const float_v c30 = fC[6]; const float_v c31 = fC[7]; //const float_v c32 = fC[8]; const float_v c33 = fC[9]; const float_v c40 = fC[10]; //const float_v c41 = fC[11]; const float_v c42 = fC[12]; //const float_v c43 = fC[13]; const float_v c44 = fC[14]; const float_v two( 2.f ); fC[0] ( mask ) += h2 * h2 * c22 + h4 * h4 * c44 + two * ( h2 * c20 + h4 * ( c40 + h2 * c42 ) ); //fC[1] ( mask ) += h2 * c21 + h4 * c41 + dS * ( c30 + h2 * c32 + h4 * c43 ); fC[2] ( mask ) += dS * ( two * c31 + dS * c33 ); fC[3] ( mask ) += h2 * c22 + h4 * c42 + dxBz * ( c40 + h2 * c42 + h4 * c44 ); //fC[4] ( mask ) += dS * c32 + dxBz * ( c41 + dS * c43 ); const float_v &dxBz_c44 = dxBz * c44; fC[12]( mask ) += dxBz_c44; fC[5] ( mask ) += dxBz * ( two * c42 + dxBz_c44 ); //fC[6] ( mask ) += h2 * c32 + h4 * c43; fC[7] ( mask ) += dS * c33; //fC[8] ( mask ) += dxBz * c43; //fC[9] ( mask ) = c33; fC[10]( mask ) += h2 * c42 + h4 * c44; //fC[11]( mask ) += dS * c43; //fC[13]( mask ) = c43; //fC[14]( mask ) = c44; debugKF() << mask << "\n" << *this << std::endl; return mask; } #include #ifdef NVALGRIND #define VALGRIND_CHECK_VALUE_IS_DEFINED( mask ) #define VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( v, k ) #define VALGRIND_CHECK_MEM_IS_DEFINED( v, k ); #define VALGRIND_CHECK_MEM_IS_ADDRESSABLE( v, k ); #else #include #define VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( v, k ) \ { \ __typeof__( v + v ) tmp( v ); \ tmp.setZero( !k ); \ VALGRIND_CHECK_VALUE_IS_DEFINED( tmp ); \ } #endif // inline float_m PndFTSCATrackParamVector::FilterDelta( const float_m &mask, const float_v &dy, const float_v &dz, // float_v err2Y, float_v err2Z, const float maxSinPhi ) // { // debugKF() << "Kalman filter( " << mask // << "\n " << dy // << "\n " << dz // << "\n " << err2Y // << "\n " << err2Z // << "\n):" << std::endl; // assert( err2Y > 0.f || !mask ); // assert( err2Z > 0.f || !mask ); // VALGRIND_CHECK_VALUE_IS_DEFINED( mask ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( dy, mask ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( dz, mask ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( err2Y, mask ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( err2Z, mask ); // #ifndef NVALGRIND // err2Y.setZero( !mask ); // err2Z.setZero( !mask ); // #endif // VALGRIND_CHECK_VALUE_IS_DEFINED( maxSinPhi ); // //* Add the y,z measurement with the Kalman filter // const float_v c00 = fC[ 0]; // const float_v c11 = fC[ 2]; // const float_v c20 = fC[ 3]; // const float_v c31 = fC[ 7]; // const float_v c40 = fC[10]; // VALGRIND_CHECK_VALUE_IS_DEFINED( c00 ); // VALGRIND_CHECK_VALUE_IS_DEFINED( c11 ); // VALGRIND_CHECK_VALUE_IS_DEFINED( c20 ); // VALGRIND_CHECK_VALUE_IS_DEFINED( c40 ); // VALGRIND_CHECK_VALUE_IS_DEFINED( c31 ); // err2Y += c00; // err2Z += c11; // #ifndef NODEBUG // if ( !( err2Y > 0.f || !mask ).isFull() ) { // std::cerr << err2Y << mask << ( err2Y > 0.f || !mask ) << c00 << std::endl; // } // #endif // assert( err2Y > 0.f || !mask ); // assert( err2Z > 0.f || !mask ); // VALGRIND_CHECK_VALUE_IS_DEFINED( fP[0] ); // VALGRIND_CHECK_VALUE_IS_DEFINED( fP[1] ); // VALGRIND_CHECK_VALUE_IS_DEFINED( fP[2] ); // const float_v &z0 = dy; // const float_v &z1 = dz; // const float_v &mS0 = float_v( Vc::One ) / err2Y; // const float_v &mS2 = float_v( Vc::One ) / err2Z; // //const float_v &mS0 = CAMath::Reciprocal( err2Y ); // //const float_v &mS2 = CAMath::Reciprocal( err2Z ); // debugKF() << "delta(mS0): " << CAMath::Abs( float_v( Vc::One ) / err2Y - mS0 ) << std::endl; // debugKF() << "delta(mS2): " << CAMath::Abs( float_v( Vc::One ) / err2Z - mS2 ) << std::endl; // assert( mS0 > 0.f || !mask ); // assert( mS2 > 0.f || !mask ); // // K = CHtS // const float_v &k00 = c00 * mS0; // const float_v &k20 = c20 * mS0; // const float_v &k40 = c40 * mS0; // const float_v &k11 = c11 * mS2; // const float_v &k31 = c31 * mS2; // debugKF() << "delta(k00): " << ( c00 / err2Y - k00 ) << std::endl; // debugKF() << "delta(k20): " << ( c20 / err2Y - k20 ) << std::endl; // debugKF() << "delta(k40): " << ( c40 / err2Y - k40 ) << std::endl; // debugKF() << "delta(k11): " << ( c11 / err2Z - k11 ) << std::endl; // debugKF() << "delta(k31): " << ( c31 / err2Z - k31 ) << std::endl; // const float_v &sinPhi = fP[2] + k20 * z0 ; // debugKF() << "delta(sinPhi): " << ( z0 * c20 / err2Y + fP[2] - sinPhi ) << std::endl; // assert( maxSinPhi > 0.f ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( sinPhi, mask ); // const float_m &success = mask && err2Y >= 1.e-8f && err2Z >= 1.e-8f && CAMath::Abs( sinPhi ) < maxSinPhi; // VALGRIND_CHECK_VALUE_IS_DEFINED( success ); // fNDF ( static_cast( success ) ) += 2; // fChi2 ( success ) += mS0 * z0 * z0 + mS2 * z1 * z1 ; // fP[ 0]( success ) += k00 * z0 ; // fP[ 1]( success ) += k11 * z1 ; // fP[ 2]( success ) = sinPhi ; // fP[ 3]( success ) += k31 * z1 ; // fP[ 4]( success ) += k40 * z0 ; // fC[ 0]( success ) -= k00 * c00 ; // fC[ 3]( success ) -= k20 * c00 ; // fC[ 5]( success ) -= k20 * c20 ; // fC[10]( success ) -= k40 * c00 ; // fC[12]( success ) -= k40 * c20 ; // fC[14]( success ) -= k40 * c40 ; // fC[ 2]( success ) -= k11 * c11 ; // fC[ 7]( success ) -= k31 * c11 ; // fC[ 9]( success ) -= k31 * c31 ; // #if 1 // const float_m check = ( fC[ 0] >= 0.f ) && ( fC[ 2] >= 0.f ) && ( fC[ 5] >= 0.f ) && ( fC[ 9] >= 0.f ) && ( fC[14] >= 0.f ); // #else // assert( fC[ 0] >= 0.f ); // assert( fC[ 2] >= 0.f ); // assert( fC[ 5] >= 0.f ); // assert( fC[ 9] >= 0.f ); // assert( fC[14] >= 0.f ); // #endif // return success && check; // } // inline float_m PndFTSCATrackParamVector::Filter( const float_m &mask, const float_v &y, const float_v &z, // float_v err2Y, float_v err2Z, const float maxSinPhi ) // { // debugKF() << "Kalman filter( " << mask // << "\n " << y // << "\n " << z // << "\n " << err2Y // << "\n " << err2Z // << "\n):" << std::endl; // assert( err2Y > 0.f || !mask ); // assert( err2Z > 0.f || !mask ); // VALGRIND_CHECK_VALUE_IS_DEFINED( mask ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( y, mask ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( z, mask ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( err2Y, mask ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( err2Z, mask ); // #ifndef NVALGRIND // err2Y.setZero( !mask ); // err2Z.setZero( !mask ); // #endif // VALGRIND_CHECK_VALUE_IS_DEFINED( maxSinPhi ); // //* Add the y,z measurement with the Kalman filter // const float_v c00 = fC[ 0]; // const float_v c11 = fC[ 2]; // const float_v c20 = fC[ 3]; // const float_v c31 = fC[ 7]; // const float_v c40 = fC[10]; // VALGRIND_CHECK_VALUE_IS_DEFINED( c00 ); // VALGRIND_CHECK_VALUE_IS_DEFINED( c11 ); // VALGRIND_CHECK_VALUE_IS_DEFINED( c20 ); // VALGRIND_CHECK_VALUE_IS_DEFINED( c40 ); // VALGRIND_CHECK_VALUE_IS_DEFINED( c31 ); // err2Y += c00; // err2Z += c11; // #ifndef NODEBUG // if ( !( err2Y > 0.f || !mask ).isFull() ) { // std::cerr << err2Y << mask << ( err2Y > 0.f || !mask ) << c00 << std::endl; // } // #endif // assert( err2Y > 0.f || !mask ); // assert( err2Z > 0.f || !mask ); // VALGRIND_CHECK_VALUE_IS_DEFINED( fP[0] ); // VALGRIND_CHECK_VALUE_IS_DEFINED( fP[1] ); // VALGRIND_CHECK_VALUE_IS_DEFINED( fP[2] ); // const float_v &z0 = y - fP[0]; // const float_v &z1 = z - fP[1]; // const float_v &mS0 = float_v( Vc::One ) / err2Y; // const float_v &mS2 = float_v( Vc::One ) / err2Z; // //const float_v &mS0 = CAMath::Reciprocal( err2Y ); // //const float_v &mS2 = CAMath::Reciprocal( err2Z ); // debugKF() << "delta(mS0): " << CAMath::Abs( float_v( Vc::One ) / err2Y - mS0 ) << std::endl; // debugKF() << "delta(mS2): " << CAMath::Abs( float_v( Vc::One ) / err2Z - mS2 ) << std::endl; // assert( mS0 > 0.f || !mask ); // assert( mS2 > 0.f || !mask ); // // K = CHtS // const float_v &k00 = c00 * mS0; // const float_v &k20 = c20 * mS0; // const float_v &k40 = c40 * mS0; // const float_v &k11 = c11 * mS2; // const float_v &k31 = c31 * mS2; // debugKF() << "delta(k00): " << ( c00 / err2Y - k00 ) << std::endl; // debugKF() << "delta(k20): " << ( c20 / err2Y - k20 ) << std::endl; // debugKF() << "delta(k40): " << ( c40 / err2Y - k40 ) << std::endl; // debugKF() << "delta(k11): " << ( c11 / err2Z - k11 ) << std::endl; // debugKF() << "delta(k31): " << ( c31 / err2Z - k31 ) << std::endl; // const float_v &sinPhi = fP[2] + k20 * z0 ; // debugKF() << "delta(sinPhi): " << ( z0 * c20 / err2Y + fP[2] - sinPhi ) << std::endl; // assert( maxSinPhi > 0.f ); // VALGRIND_CHECK_MASKED_VECTOR_IS_DEFINED( sinPhi, mask ); // const float_m &success = mask && err2Y >= 1.e-8f && err2Z >= 1.e-8f && CAMath::Abs( sinPhi ) < maxSinPhi; // VALGRIND_CHECK_VALUE_IS_DEFINED( success ); // fNDF ( static_cast( success ) ) += 2; // fChi2 ( success ) += mS0 * z0 * z0 + mS2 * z1 * z1 ; // fP[ 0]( success ) += k00 * z0 ; // fP[ 1]( success ) += k11 * z1 ; // fP[ 2]( success ) = sinPhi ; // fP[ 3]( success ) += k31 * z1 ; // fP[ 4]( success ) += k40 * z0 ; // fC[ 0]( success ) -= k00 * c00 ; // fC[ 3]( success ) -= k20 * c00 ; // fC[ 5]( success ) -= k20 * c20 ; // fC[10]( success ) -= k40 * c00 ; // fC[12]( success ) -= k40 * c20 ; // fC[14]( success ) -= k40 * c40 ; // fC[ 2]( success ) -= k11 * c11 ; // fC[ 7]( success ) -= k31 * c11 ; // fC[ 9]( success ) -= k31 * c31 ; // #if 1 // const float_m check = ( fC[ 0] >= 0.f ) && ( fC[ 2] >= 0.f ) && ( fC[ 5] >= 0.f ) && ( fC[ 9] >= 0.f ) && ( fC[14] >= 0.f ); // #else // assert( fC[ 0] >= 0.f ); // assert( fC[ 2] >= 0.f ); // assert( fC[ 5] >= 0.f ); // assert( fC[ 9] >= 0.f ); // assert( fC[14] >= 0.f ); // #endif // return success && check; // } inline float_m PndFTSCATrackParamVector::Rotate( const float_v &alpha, const float maxSinPhi, const float_m &mask ) { //* Rotate the coordinate system in XY on the angle alpha if ( (abs(alpha) < 1e-6f || !mask).isFull() ) return mask; const float_v cA = CAMath::Cos( alpha ); const float_v sA = CAMath::Sin( alpha ); const float_v x = X(), y = Y(), sP = SinPhi(), cP = GetCosPhi(); const float_v cosPhi = cP * cA + sP * sA; const float_v sinPhi = -cP * sA + sP * cA; float_m mReturn = mask && (CAMath::Abs( sinPhi ) < maxSinPhi) && (CAMath::Abs( cosPhi ) > 1.e-2f) && (CAMath::Abs( cP ) > 1.e-2f); mReturn &= abs(alpha) < 3.1415f * 0.25f; // allow turn by 45 degree only const float_v j0 = cP / cosPhi; const float_v j2 = cosPhi / cP; SetX( x*cA + y*sA, mReturn); SetY( -x*sA + y*cA, mReturn ); SetSignCosPhi( CAMath::Abs(cosPhi)/cosPhi, mReturn ); SetSinPhi( sinPhi, mReturn ); //float J[5][5] = { { j0, 0, 0, 0, 0 }, // Y // { 0, 1, 0, 0, 0 }, // Z // { 0, 0, j2, 0, 0 }, // SinPhi // { 0, 0, 0, 1, 0 }, // DzDs // { 0, 0, 0, 0, 1 } }; // Kappa //cout<<"alpha="<>( std::istream &in, PndFTSCATrackParamVector &ot ); std::ostream &operator<<( std::ostream &out, const PndFTSCATrackParamVector &ot ); #endif // !PANDA_FTS typedef PndFTSCATrackParamVector TrackParamVector; #endif