#ifndef FitC_H #define FitC_H /// conventinal KF approach #include "FitFunctional.h" #include "FitBase.h" class FitC: public virtual FitFunctional, public FitBase { public: void ExtrapolateALight( Fvec_t T[], CovV &C, const Fvec_t &z_out, Fvec_t& qp0, FieldRegion &F, Fvec_t w = ZERO) const; protected: void Filter( TrackV &track, HitInfo &info, Fvec_t &u, Fvec_t w = ONE ) const; void FilterFirst( TrackV &track, HitV &hit, Station &st ) const; void ExtrapolateWithMaterial( TrackV &track, const Fvec_t &z_out, Fvec_t& qp0, FieldRegion &F, Station &st, bool isPipe = 0, Fvec_t w = 0.f) const; void AddMaterial( CovV &C, Fvec_t Q22, Fvec_t Q32, Fvec_t Q33 ) const; }; //inline // --> causes a runtime overhead and problems for the MS compiler (error C2603) void FitC::ExtrapolateALight ( Fvec_t T [], // input track parameters (x,y,tx,ty,Q/p) CovV &C, // input covariance matrix const Fvec_t &z_out , // extrapolate to this z position Fvec_t &qp0 , // use Q/p linearisation at this value FieldRegion &F, Fvec_t w ) const { // // Part of the analytic extrapolation formula with error (c_light*B*dz)^4/4! // Jacobian_t j; ExtrapolateJ( T, z_out, qp0, F, j, w ); // covariance matrix transport const Fvec_t c42 = C.C42, c43 = C.C43; const Fvec_t cj00 = C.C00 + C.C20*j(0,2) + C.C30*j(0,3) + C.C40*j(0,4); // const Fvec_t cj10 = C.C10 + C.C21*j(0,2) + C.C31*j(0,3) + C.C41*j(0,4); const Fvec_t cj20 = C.C20 + C.C22*j(0,2) + C.C32*j(0,3) + c42*j(0,4); const Fvec_t cj30 = C.C30 + C.C32*j(0,2) + C.C33*j(0,3) + c43*j(0,4); const Fvec_t cj01 = C.C10 + C.C20*j(1,2) + C.C30*j(1,3) + C.C40*j(1,4); const Fvec_t cj11 = C.C11 + C.C21*j(1,2) + C.C31*j(1,3) + C.C41*j(1,4); const Fvec_t cj21 = C.C21 + C.C22*j(1,2) + C.C32*j(1,3) + c42*j(1,4); const Fvec_t cj31 = C.C31 + C.C32*j(1,2) + C.C33*j(1,3) + c43*j(1,4); // const Fvec_t cj02 = C.C20*j(2,2) + C.C30*j(2,3) + C.C40*j(2,4); // const Fvec_t cj12 = C.C21*j(2,2) + C.C31*j(2,3) + C.C41*j(2,4); const Fvec_t cj22 = C.C22*j(2,2) + C.C32*j(2,3) + c42*j(2,4); const Fvec_t cj32 = C.C32*j(2,2) + C.C33*j(2,3) + c43*j(2,4); // const Fvec_t cj03 = C.C20*j(3,2) + C.C30*j(3,3) + C.C40*j(3,4); // const Fvec_t cj13 = C.C21*j(3,2) + C.C31*j(3,3) + C.C41*j(3,4); const Fvec_t cj23 = C.C22*j(3,2) + C.C32*j(3,3) + c42*j(3,4); const Fvec_t cj33 = C.C32*j(3,2) + C.C33*j(3,3) + c43*j(3,4); C.C40+= c42*j(0,2) + c43*j(0,3) + C.C44*j(0,4); // cj40 C.C41+= c42*j(1,2) + c43*j(1,3) + C.C44*j(1,4); // cj41 C.C42 = c42*j(2,2) + c43*j(2,3) + C.C44*j(2,4); C.C43 = c42*j(3,2) + c43*j(3,3) + C.C44*j(3,4); C.C00 = (cj00 + j(0,2)*cj20 + j(0,3)*cj30 + j(0,4)*C.C40); C.C10 = (cj01 + j(0,2)*cj21 + j(0,3)*cj31 + j(0,4)*C.C41); C.C11 = (cj11 + j(1,2)*cj21 + j(1,3)*cj31 + j(1,4)*C.C41); C.C20 = (j(2,2)*cj20 + j(2,3)*cj30 + j(2,4)*C.C40); C.C30 = (j(3,2)*cj20 + j(3,3)*cj30 + j(3,4)*C.C40); C.C21 = (j(2,2)*cj21 + j(2,3)*cj31 + j(2,4)*C.C41); C.C31 = (j(3,2)*cj21 + j(3,3)*cj31 + j(3,4)*C.C41); C.C22 = (j(2,2)*cj22 + j(2,3)*cj32 + j(2,4)*C.C42); C.C32 = (j(3,2)*cj22 + j(3,3)*cj32 + j(3,4)*C.C42); C.C33 = (j(3,2)*cj23 + j(3,3)*cj33 + j(3,4)*C.C43); } inline void FitC::Filter( TrackV &track, HitInfo &info, Fvec_t &u, Fvec_t w ) const { const Fvec_t p = ONE/w; cnst w_th = 0.001f; // max w to filter measurement const Fvec_m_t mask = w > w_th; const Fvec_t sigma2 = info.sigma2*p; // convert input Fvec_t *T = track.T; CovV &C = track.C; register Fvec_t wi, zeta, zetawi, HCH; register Fvec_t F0, F1, F2, F3, F4; register Fvec_t K1, K2, K3, K4; // Fvec_t wi, zeta, zetawi, HCH; // // Fvec_t F0, F1, F2, F3, F4; // Fvec_t K1, K2, K3, K4; zeta = info.cos_phi*T[0] + info.sin_phi*T[1] - u; // F = CH' F0 = info.cos_phi*C.C00 + info.sin_phi*C.C10; F1 = info.cos_phi*C.C10 + info.sin_phi*C.C11; HCH = ( F0*info.cos_phi +F1*info.sin_phi ); F2 = info.cos_phi*C.C20 + info.sin_phi*C.C21; F3 = info.cos_phi*C.C30 + info.sin_phi*C.C31; F4 = info.cos_phi*C.C40 + info.sin_phi*C.C41; const Fvec_m_t initialised = HCH