#include "L1TrackParFit.h" #define cnst const fvec void L1TrackParFit::Filter( L1UMeasurementInfo &info, fvec u, fvec w) { fvec wi, zeta, zetawi, HCH; fvec F0, F1, F2, F3, F4, F5; fvec K1, K2, K3, K4, K5; zeta = info.cos_phi*fx + info.sin_phi*fy - u; // F = CH' F0 = info.cos_phi*C00 + info.sin_phi*C10; F1 = info.cos_phi*C10 + info.sin_phi*C11; HCH = ( F0*info.cos_phi + F1*info.sin_phi ); F2 = info.cos_phi*C20 + info.sin_phi*C21; F3 = info.cos_phi*C30 + info.sin_phi*C31; F4 = info.cos_phi*C40 + info.sin_phi*C41; F5 = info.cos_phi*C50 + info.sin_phi*C51; #if 0 // use mask const fvec mask = (HCH < info.sigma2 * 16.); wi = w/( (mask & info.sigma2) +HCH ); zetawi = zeta *wi; chi2 += mask & (zeta * zetawi); #else wi = w/( info.sigma2 + HCH ); zetawi = zeta *wi; chi2 += zeta * zetawi; #endif // 0 NDF += w; K1 = F1*wi; K2 = F2*wi; K3 = F3*wi; K4 = F4*wi; K5 = F5*wi; fx -= F0*zetawi; fy -= F1*zetawi; ftx -= F2*zetawi; fty -= F3*zetawi; fqp -= F4*zetawi; ft -= F5*zetawi; C00-= F0*F0*wi; C10-= K1*F0; C11-= K1*F1; C20-= K2*F0; C21-= K2*F1; C22-= K2*F2; C30-= K3*F0; C31-= K3*F1; C32-= K3*F2; C33-= K3*F3; C40-= K4*F0; C41-= K4*F1; C42-= K4*F2; C43-= K4*F3; C44-= K4*F4; C50-= K5*F0; C51-= K5*F1; C52-= K5*F2; C53-= K5*F3; C54-= K5*F4; C55-= K5*F5; } void L1TrackParFit::FilterNoP( L1UMeasurementInfo &info, fvec u, fvec w) { fvec wi, zeta, zetawi, HCH; fvec F0, F1, F2, F3, F4, F5; fvec K1, K2, K3, K4, K5; zeta = info.cos_phi*fx + info.sin_phi*fy - u; // F = CH' F0 = info.cos_phi*C00 + info.sin_phi*C10; F1 = info.cos_phi*C10 + info.sin_phi*C11; HCH = ( F0*info.cos_phi + F1*info.sin_phi ); F2 = info.cos_phi*C20 + info.sin_phi*C21; F3 = info.cos_phi*C30 + info.sin_phi*C31; F4 = info.cos_phi*C40 + info.sin_phi*C41; F5 = info.cos_phi*C50 + info.sin_phi*C51; #if 0 // use mask const fvec mask = (HCH < info.sigma2 * 16.); wi = w/( (mask & info.sigma2) +HCH ); zetawi = zeta *wi; chi2 += mask & (zeta * zetawi); #else wi = w/( info.sigma2 + HCH ); zetawi = zeta *wi; chi2 += zeta * zetawi; #endif // 0 NDF += w; K1 = F1*wi; K2 = F2*wi; K3 = F3*wi; K4 = F4*wi; K5 = F5*wi; fx -= F0*zetawi; fy -= F1*zetawi; ftx -= F2*zetawi; fty -= F3*zetawi; // fqp -= F4*zetawi; ft -= F5*zetawi; C00-= F0*F0*wi; C10-= K1*F0; C11-= K1*F1; C20-= K2*F0; C21-= K2*F1; C22-= K2*F2; C30-= K3*F0; C31-= K3*F1; C32-= K3*F2; C33-= K3*F3; // C40-= K4*F0; // C41-= K4*F1; // C42-= K4*F2; // C43-= K4*F3; // C44-= K4*F4; C50-= K5*F0; C51-= K5*F1; C52-= K5*F2; C53-= K5*F3; C54-= K5*F4; C55-= K5*F5; } void L1TrackParFit::Filter( fvec t0, fvec dt0, fvec w) { fvec wi, zeta, zetawi, HCH; fvec F0, F1, F2, F3, F4, F5; fvec K1, K2, K3, K4, K5; zeta = ft - t0; // F = CH' F0 = C50; F1 = C51; HCH = C55; F2 = C52; F3 = C53; F4 = C54; F5 = C55; #if 0 // use mask const fvec mask = (HCH < info.sigma2 * 16.); wi = w/( (mask & info.sigma2) +HCH ); zetawi = zeta *wi; chi2 += mask & (zeta * zetawi); #else wi = w/( dt0*dt0 + HCH ); zetawi = zeta *wi; chi2 += zeta * zetawi; #endif // 0 NDF += w; K1 = F1*wi; K2 = F2*wi; K3 = F3*wi; K4 = F4*wi; K5 = F5*wi; fx -= F0*zetawi; fy -= F1*zetawi; ftx -= F2*zetawi; fty -= F3*zetawi; fqp -= F4*zetawi; ft -= F5*zetawi; C00-= F0*F0*wi; C10-= K1*F0; C11-= K1*F1; C20-= K2*F0; C21-= K2*F1; C22-= K2*F2; C30-= K3*F0; C31-= K3*F1; C32-= K3*F2; C33-= K3*F3; C40-= K4*F0; C41-= K4*F1; C42-= K4*F2; C43-= K4*F3; C44-= K4*F4; C50-= K5*F0; C51-= K5*F1; C52-= K5*F2; C53-= K5*F3; C54-= K5*F4; C55-= K5*F5; } void L1TrackParFit::ExtrapolateLine(fvec z_out, fvec *w) { cnst ZERO = 0.0, ONE = 1.; cnst c_light = 29.9792458; fvec initialised = ZERO; if(w) //TODO use operator {?:} { const fvec zero = ZERO; initialised = fvec( zero < *w ); } else { const fvec one = ONE; const fvec zero = ZERO; initialised = fvec( zero < one ); } fvec dz = (z_out - fz); fx += (ftx*dz & initialised); fy += (fty*dz & initialised); fz += ( dz & initialised); ft += ( (dz*sqrt ( 1 + ftx*ftx + fty*fty )/c_light) & initialised); const fvec k1 = ftx*dz/(c_light*sqrt((ftx*ftx)+(fty*fty)+1)); const fvec k2 = fty*dz/(c_light*sqrt((ftx*ftx)+(fty*fty)+1)); const fvec dzC32_in = dz * C32; C21 += (dzC32_in & initialised); C10 += (dz * ( C21 + C30 ) & initialised); const fvec C20_in = C20; C20 += ((dz * C22) & initialised); C00 += (dz * ( C20 + C20_in ) & initialised); const fvec C31_in = C31; C31 += ((dz * C33) & initialised); C11 += ((dz * ( C31 + C31_in )) & initialised); C30 += dzC32_in & initialised; C40 += (dz * C42 & initialised); C41 += (dz * C43 & initialised); fvec c52 = C52; fvec c53 = C53; C50 = ((k1*C20 + k2*C30) & initialised) + C50; C51 = ((k1*C21 + k2*C31) & initialised) + C51; C52 = ((k1*C22 + k2*C32) & initialised) + C52; C53 = ((k1*C32 + k2*C33) & initialised) + C53; C54 = ((k1*C42 + k2*C43) & initialised) + C54; C55 = ((k1*(C52 + c52) + k2*(C53 + c53) ) & initialised) + C55; } void L1TrackParFit::ExtrapolateLine1(fvec z_out, fvec *w, fvec v) { cnst ZERO = 0.0, ONE = 1.; cnst c_light = 29.9792458; fvec initialised = ZERO; if(w) //TODO use operator {?:} { const fvec zero = ZERO; initialised = fvec( zero < *w ); } else { const fvec one = ONE; const fvec zero = ZERO; initialised = fvec( zero < one ); } fvec dz = (z_out - fz); fx += (ftx*dz & initialised); fy += (fty*dz & initialised); fz += ( dz & initialised); ft += ( (dz*sqrt ( 1 + ftx*ftx + fty*fty )/(v*c_light)) & initialised); const fvec k1 = ftx*dz/((v*c_light)*sqrt((ftx*ftx)+(fty*fty)+1)); const fvec k2 = fty*dz/((v*c_light)*sqrt((ftx*ftx)+(fty*fty)+1)); const fvec dzC32_in = dz * C32; C21 += (dzC32_in & initialised); C10 += (dz * ( C21 + C30 ) & initialised); const fvec C20_in = C20; C20 += ((dz * C22) & initialised); C00 += (dz * ( C20 + C20_in ) & initialised); const fvec C31_in = C31; C31 += ((dz * C33) & initialised); C11 += ((dz * ( C31 + C31_in )) & initialised); C30 += dzC32_in & initialised; C40 += (dz * C42 & initialised); C41 += (dz * C43 & initialised); fvec c52 = C52; fvec c53 = C53; C50 = ((k1*C20 + k2*C30) & initialised) + C50; C51 = ((k1*C21 + k2*C31) & initialised) + C51; C52 = ((k1*C22 + k2*C32) & initialised) + C52; C53 = ((k1*C32 + k2*C33) & initialised) + C53; C54 = ((k1*C42 + k2*C43) & initialised) + C54; C55 = ((k1*(C52 + c52) + k2*(C53 + c53) ) & initialised) + C55; // fz = ( z_out & initialised) + ( (!initialised) & fz); //TEST // cout << "fz = " << fz << endl; } void L1TrackParFit::Extrapolate // extrapolates track parameters and returns jacobian for extrapolation of CovMatrix ( fvec z_out , // extrapolate to this z position fvec qp0 , // use Q/p linearisation at this value const L1FieldRegion &F, fvec *w ) { // // 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]. // //======================================================================== // // NIM A395 (1997) 169-184; NIM A426 (1999) 268-282. // // the routine is based on LHC(b) utility code // //======================================================================== cnst ZERO = 0.0, ONE = 1.; cnst c_light = 0.000299792458; const fvec a[4] = {0.0f, 0.5f, 0.5f, 1.0f}; const fvec c[4] = {1.0f/6.0f, 1.0f/3.0f, 1.0f/3.0f, 1.0f/6.0f}; const fvec b[4] = {0.0f, 0.5f, 0.5f, 1.0f}; int step4; fvec k[20],x0[5],x[5],k1[20]; fvec Ax[4],Ay[4],Ax_tx[4],Ay_tx[4],Ax_ty[4],Ay_ty[4], At[4], At_tx[4], At_ty[4]; //---------------------------------------------------------------- fvec qp_in = fqp; const fvec z_in = fz; const fvec h = (z_out - fz); // cout< 1.e4 ) return 1; fvec I_tx2ty21 = 1.f / tx2ty21 * qp0; fvec tx2ty2 = sqrt(tx2ty21 ) ; // fvec I_tx2ty2 = qp0 * hC / tx2ty2 ; unsused ??? tx2ty2 *= hC; fvec tx2ty2qp = tx2ty2 * qp0; // cout<