//-*- Mode: C++ -*- // ***************************************************************************** // * // @Autors: I.Kulakov; M.Zyzak; I.Kisel * // @e-mail: I.Kulakov@gsi.de; M.Zyzak@gsi.de; I.Kisel@compeng.uni-frankfurt.de * // * // ***************************************************************************** #ifndef ALIHLTTPCCATRACKPARAMVECTOR_H #define ALIHLTTPCCATRACKPARAMVECTOR_H #include "AliHLTTPCCADef.h" #include "AliHLTVector.h" #include "AliHLTTPCCAMath.h" #include "L1UMeasurementInfo.h" #include "L1XYMeasurementInfo.h" #include "L1MaterialInfo.h" #include "L1Field.h" class AliHLTTPCCAParam; class ITSCAHit; class ITSCAHitV; class ITSCATarget; namespace std { template 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(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 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 Momentum() const { return QP(); } // used for triplets comparison 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 Err2Momentum() 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 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; } } 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 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 L1FieldValue& 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 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 ) ); 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 ) ); 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 PassMaterial( const L1MaterialInfo &info, const sfloat_v &qp0, const sfloat_m &mask = sfloat_m( true ) ); sfloat_m Filter( const sfloat_v &u, const L1UMeasurementInfo &info, const sfloat_m &active ); 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 L1FieldValue 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::Filter( const sfloat_v &u, const L1UMeasurementInfo &info, const sfloat_m &active ) { sfloat_v wi, zeta, zetawi, HCH; sfloat_v F0, F1, F2, F3, F4; sfloat_v K1, K2, K3, K4; zeta = info.cos_phi*fX + info.sin_phi*fY - u; // F = CH' F0 = info.cos_phi*fC00 + info.sin_phi*fC10; F1 = info.cos_phi*fC10 + info.sin_phi*fC11; HCH = ( F0*info.cos_phi + F1*info.sin_phi ); F2 = info.cos_phi*fC20 + info.sin_phi*fC21; F3 = info.cos_phi*fC30 + info.sin_phi*fC31; F4 = info.cos_phi*fC40 + info.sin_phi*fC41; // #if 0 // use mask // const sfloat_m mask = (HCH < info.sigma2 * 16.); // wi = w/( (mask & info.sigma2) +HCH ); // zetawi = zeta *wi; // fChi2 += mask & (zeta * zetawi); // #else wi = 1/( info.sigma2 + HCH ); zetawi = zeta *wi; fChi2(active) += zeta * zetawi; // #endif // 0 fNDF( static_cast(active) ) += 1; K1 = F1*wi; K2 = F2*wi; K3 = F3*wi; K4 = F4*wi; fX(active) -= F0*zetawi; fY(active) -= F1*zetawi; fTx(active) -= F2*zetawi; fTy(active) -= F3*zetawi; fQP(active) -= F4*zetawi; fC00(active) -= F0*F0*wi; fC10(active) -= K1*F0; fC11(active) -= K1*F1; fC20(active) -= K2*F0; fC21(active) -= K2*F1; fC22(active) -= K2*F2; fC30(active) -= K3*F0; fC31(active) -= K3*F1; fC32(active) -= K3*F2; fC33(active) -= K3*F3; fC40(active) -= K4*F0; fC41(active) -= K4*F1; fC42(active) -= K4*F2; fC43(active) -= K4*F3; fC44(active) -= K4*F4; return active; } 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..."<>( std::istream &in, AliHLTTPCCATrackParamVector &ot ); // std::ostream &operator<<( std::ostream &out, const AliHLTTPCCATrackParamVector &ot ); #endif