//-*- Mode: C++ -*- // $Id: AliHLTTPCCATrackParamVector.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 ALIHLTTPCCATRACKPARAMVECTOR_H #define ALIHLTTPCCATRACKPARAMVECTOR_H class AliHLTTPCCATrackParam; #ifdef PANDA_FTS #include "AliHLTTPCCADef.h" #include "AliHLTVector.h" #include "AliHLTTPCCAMath.h" #include "L1XYMeasurementInfo.h" #include "L1MaterialInfo.h" #include "L1Field.h" // #include "CAX1X2MeasurementInfo.h" #include "ITSCAStation.h" class AliHLTTPCCAParam; class ITSCAHit; class ITSCAHitV; class ITSCATarget; /** * @class AliHLTTPCCATrackParamVector * * AliHLTTPCCATrackParamVector class describes the track parametrisation * which is used by the AliHLTTPCCATracker slice tracker. * */ class AliHLTTPCCATrackParamVector { friend std::istream &operator>>( std::istream &, AliHLTTPCCATrackParamVector & ); friend std::ostream &operator<<( std::ostream &, const AliHLTTPCCATrackParamVector & ); public: AliHLTTPCCATrackParamVector(): 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; } void SetTrackParam(const AliHLTTPCCATrackParamVector ¶m, const sfloat_m &m = sfloat_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(); fNDF(static_cast(m)) = param.NDF(); fAlpha(static_cast(m)) = param.Angle(); } void SetTrackParamOne(int iV, const AliHLTTPCCATrackParamVector ¶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]; fChi2[iV] = param.Chi2()[iVa]; fNDF[iV] = param.NDF()[iVa]; fAlpha[iV] = param.Angle()[iVa]; } void ConvertTrackParamToVector( AliHLTTPCCATrackParam t0[sfloat_v::Size], int nTracksV ); void InitCovMatrix( sfloat_v d2QMom = 0.f ); void InitByTarget( const ITSCATarget& target ); // void InitByHit( const ITSCAHitV& hit, const AliHLTTPCCAParam& param, const sfloat_v& dQP ); void InitDirection( sfloat_v r0, sfloat_v r1, sfloat_v r2 ) { // initialize direction parameters according to a given tangent vector r = { r0, r1, r2 } SetTx( r1/r0 ); SetTy( r2/r0 ); } sfloat_v X() const { return fX; } sfloat_v Y() const { return fY; } sfloat_v Z() const { return fZ; } sfloat_v Tx() const { return fTx; } sfloat_v Ty() const { return fTy; } sfloat_v QP() const { return fQP;} sfloat_v Chi2() const { return fChi2; } short_v NDF() const { return fNDF; } sfloat_v Angle() const { return fAlpha; } sfloat_v X0() const { return Z(); } sfloat_v X1() const { return X(); } sfloat_v X2() const { return Y(); } sfloat_v Tx1() const { return Tx(); } sfloat_v Tx2() const { return Ty(); } sfloat_v QMomentum() const { return QP(); } // used for triplets comparison sfloat_v SinPhi() const { // dx/dxz const sfloat_v tx12 = Tx1()*Tx1(); return sqrt( tx12/(1.f + tx12) ); } const sfloat_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; }; assert(0); return fX; } const sfloat_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; } sfloat_v Err2X1() const { return Err2X(); } sfloat_v Err2X2() const { return Err2Y(); } sfloat_v Err2X() const { return fC00; } sfloat_v Err2Y() const { return fC11; } sfloat_v Err2QP() const { return fC44; } sfloat_v Err2QMomentum() const { return Err2QP(); } void SetX( const sfloat_v &v ) { fX = v; } void SetY( const sfloat_v &v ) { fY = v; } void SetZ( const sfloat_v &v ) { fZ = v; } void SetTx( const sfloat_v &v ) { fTx = v; } void SetTy( const sfloat_v &v ) { fTy = v; } void SetQP( const sfloat_v &v ) { fQP = v; } void SetQMomentum( const sfloat_v &v ) { fQP = v; } void SetChi2( const sfloat_v &v ) { fChi2 = v; } void SetNDF( int v ) { fNDF = v; } void SetNDF( const short_v &v ) { fNDF = v; } void SetAngle( const sfloat_v& v ) { fAlpha = v; } void SetPar( int i, sfloat_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, sfloat_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; } } sfloat_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; } sfloat_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 sfloat_v &v, const sfloat_m &m ) { fX( m ) = v; } void SetY( const sfloat_v &v, const sfloat_m &m ) { fY( m ) = v; } void SetZ( const sfloat_v &v, const sfloat_m &m ) { fZ( m ) = v; } void SetTx( const sfloat_v &v, const sfloat_m &m ) { fTx( m ) = v; } void SetTy( const sfloat_v &v, const sfloat_m &m ) { fTy( m ) = v; } void SetQP( const sfloat_v &v, const sfloat_m &m ) { fQP( m ) = v; } void SetQMomentum( const sfloat_v &v, const sfloat_m &m ) { fQP( m ) = v; } void SetChi2( const sfloat_v &v, const sfloat_m &m ) { fChi2(m) = v; } void SetNDF( const short_v &v, const short_m &m ) { fNDF(m) = v; } void SetField( int i, const CAFieldValue& b, const sfloat_v& zb ) { fB[i] = b; fZB[i] = zb; } void SetCovX12( sfloat_v v00, sfloat_v v10, sfloat_v v11 ) { fC00 = v00; fC10 = v10; fC11 = v11; } sfloat_m Transport(const short_v& ista, const short_v& iVSta, const AliHLTTPCCAParam& param, const sfloat_m&mask = sfloat_m( true ) ); sfloat_m Transport( const short_v& ista, const AliHLTTPCCAParam& param, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m Transport( const ITSCAHitV& hit, const AliHLTTPCCAParam& p, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m Filter( const ITSCAHitV& hit, const AliHLTTPCCAParam& param, const sfloat_m &mask = sfloat_m( true ), const sfloat_v& chi2Cut = 10e10f ); sfloat_m Transport( const ITSCAHit& hit, const AliHLTTPCCAParam& p, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m Filter( const ITSCAHit& hit, const AliHLTTPCCAParam& param, const sfloat_m &mask = sfloat_m( true ), const sfloat_v& chi2Cut = 10e10f ); sfloat_m AddTarget( const ITSCATarget& t, const sfloat_m &mask = sfloat_m( true ) ); private: sfloat_m Transport( const ITSCAHitV& hit, const L1FieldRegion& F, const AliHLTTPCCAParam& p, const sfloat_m &mask = sfloat_m( true ) ); // dbg TODO delme sfloat_m TransportToX0WithMaterial( const sfloat_v &x0, const L1FieldRegion &F, const L1MaterialInfo &material, const sfloat_v &qp0, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m TransportToX0( const sfloat_v &x0, const L1FieldRegion &F, const sfloat_v &qp0, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m TransportToX0Line( const sfloat_v &x0, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m PassMaterial( const L1MaterialInfo &info, const sfloat_v &qp0, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m Filter( const sfloat_v &y0, const sfloat_v &z0, const sfloat_v &r, const ITSCAStripInfo &info, sfloat_v err2, const sfloat_m &active, const sfloat_v& chi2Cut = 10e10f ); sfloat_m FilterVtx( const sfloat_v &xV, const sfloat_v& yV, const L1XYMeasurementInfo &info, sfloat_v& extrDx, sfloat_v& extrDy, sfloat_v J[], const sfloat_m &active = sfloat_m( true ) ); sfloat_m TransportJXY0ToX0( const sfloat_v &x0, const L1FieldRegion &F, sfloat_v& extrDx, sfloat_v& extrDy, sfloat_v &J04, sfloat_v &J14, const sfloat_m &active = sfloat_m( true ) ); sfloat_v fX,fY,fTx,fTy,fQP,fZ, fC00, fC10, fC11, fC20, fC21, fC22, fC30, fC31, fC32, fC33, fC40, fC41, fC42, fC43, fC44; sfloat_v fChi2; // the chi^2 value short_v fNDF; // the Number of Degrees of Freedom CAFieldValue fB[2]; // field at two previous points, which track passed sfloat_v fZB[2]; // fZ position of the filld point sfloat_v fAlpha; // coor system }; #include "debug.h" inline sfloat_m AliHLTTPCCATrackParamVector::TransportToX0Line( const sfloat_v &x0_out, const sfloat_m &mask ) { sfloat_v dz = (x0_out - fZ); fX(mask) += fTx*dz; fY(mask) += fTy*dz; fZ(mask) += dz; const sfloat_v dzC32_in = dz * fC32; fC21(mask) += dzC32_in; fC10(mask) += dz * ( fC21 + fC30 ); const sfloat_v C20_in = fC20; fC20(mask) += dz * fC22; fC00(mask) += dz * ( fC20 + C20_in ); const sfloat_v C31_in = fC31; fC31(mask) += dz * fC33; fC11(mask) += dz * ( fC31 + C31_in ); fC30(mask) += dzC32_in; fC40(mask) += dz * fC42; fC41(mask) += dz * fC43; return mask; } inline sfloat_m AliHLTTPCCATrackParamVector::Filter( const sfloat_v &y0, const sfloat_v &z0, const sfloat_v &r, const ITSCAStripInfo &info, sfloat_v err2, const sfloat_m &active, const sfloat_v& chi2Cut ) //* Adds the tube measurement with the Kalman filter //* @beta is angle between the strip and z-axis, clockwise. The wire equation is: {x,y,z} - {x0,y0,z0} = t*e_s, where ort e_s = { 0, -sinB, cos B } { // linearize track in current point, which must be x == x0 // distance between wire and track are : r = - ({x,y,z} - {x0,y0,z0}) * e_o / |e_o|, where ort e_o = |[e_t x e_s]| sfloat_m success = active; success &= ( err2 > 1.e-8f ); // const sfloat_v& etx = sqrt( 1 - SinPhi()*SinPhi() ); // const sfloat_v& ety = SinPhi(); // const sfloat_v& etz = 1.f; const sfloat_v& etx = 1.f; const sfloat_v& ety = Tx1(); const sfloat_v& etz = Tx2(); const sfloat_v& eox = - ety * info.cos - etz * info.sin; // e_o[x] = - e_t[y] * e_s[z] + e_t[z] * e_s[y] const sfloat_v& eoy = etx * info.cos; // e_o[y] = - 0 + e_t[x] * e_s[z] const sfloat_v& eoz = etx * info.sin; // e_o[z] = - e_t[x] * e_s[y] + 0 const sfloat_v& iEo = rsqrt( eox*eox + eoy*eoy + eoz*eoz ); const sfloat_v& h0 = eoy*iEo; const sfloat_v& h1 = eoz*iEo; const sfloat_v zeta = h0*(fX - y0) + h1*(fY - z0) - r; sfloat_v wi, zetawi, HCH; sfloat_v F0, F1, F2, F3, F4; sfloat_v K1, K2, K3, K4; // F = CH' F0 = h0*fC00 + h1*fC10; F1 = h0*fC10 + h1*fC11; HCH = ( F0*h0 + F1*h1 ); F2 = h0*fC20 + h1*fC21; F3 = h0*fC30 + h1*fC31; F4 = h0*fC40 + h1*fC41; #if 1 // use mask const sfloat_m mask = success && (HCH < err2 * 16.f); sfloat_v err2Masked(Vc::Zero); err2Masked(mask) = err2; wi = 1.f/( err2Masked +HCH ); zetawi = zeta * wi; fChi2(mask) += zeta * zetawi; #else wi = 1/( err2 + HCH ); zetawi = zeta *wi; fChi2(success) += zeta * zetawi; #endif // 0 success &= fChi2 < chi2Cut; fNDF( static_cast(success) ) += 1; 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; return success; } inline sfloat_m AliHLTTPCCATrackParamVector::TransportToX0WithMaterial( const sfloat_v &x0, const L1FieldRegion &F, const L1MaterialInfo &material, const sfloat_v &qp0, const sfloat_m &mask ) { // TODO material sfloat_m active = mask; active &= TransportToX0( x0, F, qp0, active ); active &= PassMaterial( material, qp0, active ); return active; } inline sfloat_m AliHLTTPCCATrackParamVector::TransportToX0( const sfloat_v &x0_out, const L1FieldRegion &F, const sfloat_v &qp0, const sfloat_m &mask ) { //cout<<"Extrapolation..."< struct char_traits; template class basic_istream; typedef basic_istream > istream; template class basic_ostream; typedef basic_ostream > ostream; } // namespace std /** * @class AliHLTTPCCATrackParamVector * * AliHLTTPCCATrackParamVector class describes the track parametrisation * which is used by the AliHLTTPCCATracker slice tracker. * */ class AliHLTTPCCATrackParamVector { friend std::istream &operator>>( std::istream &, AliHLTTPCCATrackParamVector & ); friend std::ostream &operator<<( std::ostream &, const AliHLTTPCCATrackParamVector & ); public: AliHLTTPCCATrackParamVector() : 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( AliHLTTPCCATrackParam t0[sfloat_v::Size], int nTracksV ); void InitCovMatrix( sfloat_v d2QMom = 0.f ); void InitByTarget( const ITSCATarget& target ); void InitByHit( const ITSCAHitV& hit, const AliHLTTPCCAParam& param, const sfloat_v& dQMom ); void InitDirection( sfloat_v r0, sfloat_v r1, sfloat_v r2 ) // initialize direction parameters according to a given tangent vector { const sfloat_v r = sqrt( r0*r0+r1*r1 ); SetSinPhi( r1/r ); SetSignCosPhi( r0/abs(r0) ); SetDzDs( r2/r ); } struct AliHLTTPCCATrackFitParam { sfloat_v fBethe; sfloat_v fE; sfloat_v fTheta2; sfloat_v fEP2; sfloat_v fSigmadE2; sfloat_v fK22; sfloat_v fK33; sfloat_v fK43; sfloat_v fK44; }; sfloat_v X() const { return fX; } sfloat_v Y() const { return fP[0]; } sfloat_v Z() const { return fP[1]; } sfloat_v SinPhi() const { return fP[2]; } sfloat_v DzDs() const { return fP[3]; } sfloat_v QPt() const { return fP[4]; } sfloat_v Angle() const { return fAlpha; } sfloat_v X0() const { return X(); } sfloat_v X1() const { return Y(); } sfloat_v X2() const { return Z(); } sfloat_v Tx1() const { return SinPhi()/(SignCosPhi()*sqrt( 1 - SinPhi()*SinPhi() )); } // CHECKME sfloat_v Tx2() const { return DzDs()/(SignCosPhi()*sqrt( 1 - SinPhi()*SinPhi() )); } // dx2/dx0 = dz/dx sfloat_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. */ sfloat_v SignCosPhi() const { return fSignCosPhi; } sfloat_v Chi2() const { return fChi2; } short_v NDF() const { return fNDF; } sfloat_v Err2Y() const { return fC[0]; } sfloat_v Err2Z() const { return fC[2]; } sfloat_v Err2SinPhi() const { return fC[5]; } sfloat_v Err2DzDs() const { return fC[9]; } sfloat_v Err2QPt() const { return fC[14]; } sfloat_v GetX() const { return fX; } sfloat_v GetY() const { return fP[0]; } sfloat_v GetZ() const { return fP[1]; } sfloat_v GetSinPhi() const { return fP[2]; } sfloat_v GetDzDs() const { return fP[3]; } sfloat_v GetQPt() const { return fP[4]; } sfloat_v GetSignCosPhi() const { return fSignCosPhi; } sfloat_v GetChi2() const { return fChi2; } short_v GetNDF() const { return fNDF; } sfloat_v GetKappa( const sfloat_v &Bz ) const { return fP[4]*Bz; } sfloat_v GetCosPhiPositive() const { return CAMath::Sqrt( sfloat_v( Vc::One ) - SinPhi()*SinPhi() ); } sfloat_v GetCosPhi() const { return fSignCosPhi*CAMath::Sqrt( sfloat_v( Vc::One ) - SinPhi()*SinPhi() ); } sfloat_v Err2X1() const { return fC[0]; } sfloat_v Err2X2() const { return fC[2]; } // sfloat_v GetErr2SinPhi() const { return fC[5]; } // sfloat_v GetErr2DzDs() const { return fC[9]; } sfloat_v Err2QMomentum() const { return fC[14]; } const sfloat_v& Par( int i ) const { return fP[i]; } const sfloat_v& Cov( int i ) const { return fC[i]; } private: friend class AliHLTTPCCATrackParam; const sfloat_v *Par() const { return fP; } const sfloat_v *Cov() const { return fC; } sfloat_v *Par() { return fP; } sfloat_v *Cov() { return fC; } public: void SetTrackParam(const AliHLTTPCCATrackParamVector ¶m, const sfloat_m &m = sfloat_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 AliHLTTPCCATrackParamVector ¶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 sfloat_v &v ) { fP[i] = v; } void SetPar( int i, const sfloat_v &v, const sfloat_m &m ) { fP[i]( m ) = v; } void SetCov( int i, const sfloat_v &v ) { fC[i] = v; } void SetCov( int i, const sfloat_v &v, const sfloat_m &m ) { fC[i]( m ) = v; } void SetX( const sfloat_v &v ) { fX = v; } void SetY( const sfloat_v &v ) { fP[0] = v; } void SetZ( const sfloat_v &v ) { fP[1] = v; } void SetX( const sfloat_v &v, const sfloat_m &m ) { fX( m ) = v; } void SetY( const sfloat_v &v, const sfloat_m &m ) { fP[0]( m ) = v; } void SetZ( const sfloat_v &v, const sfloat_m &m ) { fP[1]( m ) = v; } void SetSinPhi( const sfloat_v &v ) { fP[2] = v; } void SetSinPhi( const sfloat_v &v, const sfloat_m &m ) { fP[2]( m ) = v; } void SetDzDs( const sfloat_v &v ) { fP[3] = v; } void SetDzDs( const sfloat_v &v, const sfloat_m &m ) { fP[3]( m ) = v; } void SetQPt( const sfloat_v &v ) { fP[4] = v; } void SetQMomentum( const sfloat_v &v ) { SetQPt(v); } void SetQPt( const sfloat_v &v, const sfloat_m &m ) { fP[4]( m ) = v; } void SetSignCosPhi( const sfloat_v &v ) { fSignCosPhi = v; } void SetSignCosPhi( const sfloat_v &v, const sfloat_m &m ) { fSignCosPhi(m) = v; } void SetChi2( const sfloat_v &v ) { fChi2 = v; } void SetChi2( const sfloat_v &v, const sfloat_m &m ) { fChi2(m) = v; } void SetNDF( int v ) { fNDF = v; } void SetNDF( const short_v &v ) { fNDF = v; } void SetNDF( const short_v &v, const short_m &m ) { fNDF(m) = v; } void SetAngle( const sfloat_v &v ) { fAlpha = v; } void SetAngle( const sfloat_v &v, const sfloat_m &m ) { fAlpha(m) = v; } void SetErr2Y( sfloat_v v ) { fC[0] = v; } void SetErr2Z( sfloat_v v ) { fC[2] = v; } void SetErr2QPt( sfloat_v v ) { fC[14] = v; } sfloat_v GetDist2( const AliHLTTPCCATrackParamVector &t ) const; sfloat_v GetDistXZ2( const AliHLTTPCCATrackParamVector &t ) const; sfloat_v GetS( const sfloat_v &x, const sfloat_v &y, const sfloat_v &Bz ) const; void GetDCAPoint( const sfloat_v &x, const sfloat_v &y, const sfloat_v &z, sfloat_v *px, sfloat_v *py, sfloat_v *pz, const sfloat_v &Bz ) const; sfloat_m TransportToX0WithMaterial( const sfloat_v &x, const sfloat_v &XOverX0, const sfloat_v &XThimesRho, const sfloat_v &Bz, const float maxSinPhi = .999f ); sfloat_m TransportToX0( const sfloat_v &x, const sfloat_v &Bz, const float maxSinPhi = .999f, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m TransportToX0( const sfloat_v &x, AliHLTTPCCATrackLinearisationVector &t0, const sfloat_v &Bz, const float maxSinPhi = .999f, sfloat_v *DL = 0, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m TransportToX0( const sfloat_v &x, const sfloat_v &sinPhi0, const sfloat_v &Bz, const sfloat_v maxSinPhi = .999f, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m TransportToX0WithMaterial( const sfloat_v &x, AliHLTTPCCATrackLinearisationVector &t0, AliHLTTPCCATrackFitParam &par, const sfloat_v &XOverX0, const sfloat_v &XThimesRho, const sfloat_v &Bz, const float maxSinPhi = .999f, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m TransportToX0WithMaterial( const sfloat_v &x, AliHLTTPCCATrackFitParam &par, const sfloat_v &XOverX0, const sfloat_v &XThimesRho, const sfloat_v &Bz, const float maxSinPhi = .999f ); sfloat_m Rotate( const sfloat_v &alpha, AliHLTTPCCATrackLinearisationVector &t0, const float maxSinPhi = .999f, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m Rotate( const sfloat_v &alpha, const float maxSinPhi = .999f, const sfloat_m &mask = sfloat_m( true ) ); void RotateXY( sfloat_v alpha, sfloat_v &x, sfloat_v &y, sfloat_v &sin, const sfloat_m &mask = sfloat_m( true ) ) const ; sfloat_m FilterWithMaterial( const sfloat_v &y, const sfloat_v &z, sfloat_v err2Y, sfloat_v errYZ, sfloat_v err2Z, float maxSinPhi=0.999f, const sfloat_m &mask = sfloat_m( true ), const short_v& hitNDF = short_v(2) ,const sfloat_v& chi2Cut = 10e10f ); // filters 2-D measurement sfloat_m FilterWithMaterial( const sfloat_v &y, const sfloat_v &z, const ITSCAStripInfo &info, sfloat_v err2, float maxSinPhi=0.999f, const sfloat_m &mask = sfloat_m( true ), const sfloat_v& chi2Cut = 10e10f ); // filters 1-D measurement sfloat_m FilterWithMaterial( const sfloat_v &y, const sfloat_v &z, const sfloat_v &r, const ITSCAStripInfo &info, sfloat_v err2, float maxSinPhi=0.999f, const sfloat_m &mask = sfloat_m( true ), const sfloat_v& chi2Cut = 10e10f ); // filters tube measurement static sfloat_v ApproximateBetheBloch( const sfloat_v &beta2 ); static sfloat_v BetheBlochGeant( const sfloat_v &bg, const sfloat_v &kp0 = 2.33f, const sfloat_v &kp1 = 0.20f, const sfloat_v &kp2 = 3.00f, const sfloat_v &kp3 = 173e-9f, const sfloat_v &kp4 = 0.49848f ); static sfloat_v BetheBlochSolid( const sfloat_v &bg ); static sfloat_v BetheBlochGas( const sfloat_v &bg ); void CalculateFitParameters( AliHLTTPCCATrackFitParam &par, const sfloat_v &mass = 0.13957f ); sfloat_m CorrectForMeanMaterial( const sfloat_v &xOverX0, const sfloat_v &xTimesRho, const AliHLTTPCCATrackFitParam &par, const sfloat_m &_mask ); // sfloat_m FilterDelta( const sfloat_m &mask, const sfloat_v &dy, const sfloat_v &dz, // sfloat_v err2Y, sfloat_v err2Z, const float maxSinPhi = .999f ); // sfloat_m Filter( const sfloat_m &mask, const sfloat_v &y, const sfloat_v &z, // sfloat_v err2Y, sfloat_v err2Z, const float maxSinPhi = .999f ); sfloat_m FilterVtx( const sfloat_v &xV, const sfloat_v& yV, const CAX1X2MeasurementInfo &info, sfloat_v& extrDx, sfloat_v& extrDy, sfloat_v J[], const sfloat_m &active = sfloat_m( true ) ); sfloat_m TransportJ0ToX0( const sfloat_v &x0, const sfloat_v&cBz, sfloat_v& extrDy, sfloat_v& extrDz, sfloat_v J[], const sfloat_m &active = sfloat_m( true ) ); sfloat_m Transport( const short_v& ista, const AliHLTTPCCAParam& param, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m Transport( const ITSCAHitV& hit, const AliHLTTPCCAParam& p, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m Filter( const ITSCAHitV& hit, const AliHLTTPCCAParam& param, const sfloat_m &mask = sfloat_m( true ), const sfloat_v& chi2Cut = 10e10f ); sfloat_m Transport( const ITSCAHit& hit, const AliHLTTPCCAParam& p, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m Filter( const ITSCAHit& hit, const AliHLTTPCCAParam& param, const sfloat_m &mask = sfloat_m( true ), const sfloat_v& chi2Cut = 10e10f ); sfloat_m AddTarget( const ITSCATarget& target, const sfloat_m &mask = sfloat_m( true ) ); private: sfloat_v fX; // x position sfloat_v fSignCosPhi; // sign of cosPhi sfloat_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 ) ) } sfloat_v fC[15]; // the covariance matrix for Y,Z,SinPhi,.. sfloat_v fChi2; // the chi^2 value short_v fNDF; // the Number of Degrees of Freedom sfloat_v fAlpha; // coor system }; #include "debug.h" inline sfloat_m AliHLTTPCCATrackParamVector::TransportToX0( const sfloat_v &x, const sfloat_v &sinPhi0, const sfloat_v &Bz, const sfloat_v maxSinPhi, const sfloat_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 sfloat_v &ey = sinPhi0; const sfloat_v &dx = x - X(); const sfloat_v &exi = sfloat_v( Vc::One ) * CAMath::RSqrt( sfloat_v( Vc::One ) - ey * ey ); // RSqrt const sfloat_v &dxBz = dx * Bz; const sfloat_v &dS = dx * exi; const sfloat_v &h2 = dS * exi * exi; const sfloat_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 sfloat_v &sinPhi = SinPhi() * (sfloat_v( Vc::One ) - 0.5f * dxBz * QPt() *dxBz * QPt()/ ( sfloat_v( Vc::One ) - SinPhi()*SinPhi() )) + dxBz * QPt(); const sfloat_v &sinPhi = SinPhi() + dxBz * QPt(); ///mvz end 23.01.2010 #ifdef LOSE_DEBUG std::cout << " TrTo-sinPhi = " << sinPhi << std::endl; #endif sfloat_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 sfloat_v c00 = fC[0]; //const sfloat_v c11 = fC[2]; const sfloat_v c20 = fC[3]; //const sfloat_v c21 = fC[4]; const sfloat_v c22 = fC[5]; //const sfloat_v c30 = fC[6]; const sfloat_v c31 = fC[7]; //const sfloat_v c32 = fC[8]; const sfloat_v c33 = fC[9]; const sfloat_v c40 = fC[10]; //const sfloat_v c41 = fC[11]; const sfloat_v c42 = fC[12]; //const sfloat_v c43 = fC[13]; const sfloat_v c44 = fC[14]; const sfloat_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 sfloat_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 sfloat_m AliHLTTPCCATrackParamVector::FilterDelta( const sfloat_m &mask, const sfloat_v &dy, const sfloat_v &dz, // sfloat_v err2Y, sfloat_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 sfloat_v c00 = fC[ 0]; // const sfloat_v c11 = fC[ 2]; // const sfloat_v c20 = fC[ 3]; // const sfloat_v c31 = fC[ 7]; // const sfloat_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 sfloat_v &z0 = dy; // const sfloat_v &z1 = dz; // const sfloat_v &mS0 = sfloat_v( Vc::One ) / err2Y; // const sfloat_v &mS2 = sfloat_v( Vc::One ) / err2Z; // //const sfloat_v &mS0 = CAMath::Reciprocal( err2Y ); // //const sfloat_v &mS2 = CAMath::Reciprocal( err2Z ); // debugKF() << "delta(mS0): " << CAMath::Abs( sfloat_v( Vc::One ) / err2Y - mS0 ) << std::endl; // debugKF() << "delta(mS2): " << CAMath::Abs( sfloat_v( Vc::One ) / err2Z - mS2 ) << std::endl; // assert( mS0 > 0.f || !mask ); // assert( mS2 > 0.f || !mask ); // // K = CHtS // const sfloat_v &k00 = c00 * mS0; // const sfloat_v &k20 = c20 * mS0; // const sfloat_v &k40 = c40 * mS0; // const sfloat_v &k11 = c11 * mS2; // const sfloat_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 sfloat_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 sfloat_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 sfloat_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 sfloat_m AliHLTTPCCATrackParamVector::Filter( const sfloat_m &mask, const sfloat_v &y, const sfloat_v &z, // sfloat_v err2Y, sfloat_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 sfloat_v c00 = fC[ 0]; // const sfloat_v c11 = fC[ 2]; // const sfloat_v c20 = fC[ 3]; // const sfloat_v c31 = fC[ 7]; // const sfloat_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 sfloat_v &z0 = y - fP[0]; // const sfloat_v &z1 = z - fP[1]; // const sfloat_v &mS0 = sfloat_v( Vc::One ) / err2Y; // const sfloat_v &mS2 = sfloat_v( Vc::One ) / err2Z; // //const sfloat_v &mS0 = CAMath::Reciprocal( err2Y ); // //const sfloat_v &mS2 = CAMath::Reciprocal( err2Z ); // debugKF() << "delta(mS0): " << CAMath::Abs( sfloat_v( Vc::One ) / err2Y - mS0 ) << std::endl; // debugKF() << "delta(mS2): " << CAMath::Abs( sfloat_v( Vc::One ) / err2Z - mS2 ) << std::endl; // assert( mS0 > 0.f || !mask ); // assert( mS2 > 0.f || !mask ); // // K = CHtS // const sfloat_v &k00 = c00 * mS0; // const sfloat_v &k20 = c20 * mS0; // const sfloat_v &k40 = c40 * mS0; // const sfloat_v &k11 = c11 * mS2; // const sfloat_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 sfloat_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 sfloat_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 sfloat_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 sfloat_m AliHLTTPCCATrackParamVector::Rotate( const sfloat_v &alpha, const float maxSinPhi, const sfloat_m &mask ) { //* Rotate the coordinate system in XY on the angle alpha if ( (abs(alpha) < 1e-6f || !mask).isFull() ) return mask; const sfloat_v cA = CAMath::Cos( alpha ); const sfloat_v sA = CAMath::Sin( alpha ); const sfloat_v x = X(), y = Y(), sP = SinPhi(), cP = GetCosPhi(); const sfloat_v cosPhi = cP * cA + sP * sA; const sfloat_v sinPhi = -cP * sA + sP * cA; sfloat_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 sfloat_v j0 = cP / cosPhi; const sfloat_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, AliHLTTPCCATrackParamVector &ot ); std::ostream &operator<<( std::ostream &out, const AliHLTTPCCATrackParamVector &ot ); #endif // !PANDA_FTS typedef AliHLTTPCCATrackParamVector TrackParamVector; #endif