#ifndef L1Extrapolation_h #define L1Extrapolation_h #include "CbmL1Def.h" #include "L1Field.h" #include "L1TrackPar.h" //#define cnst static const fvec #define cnst const fvec // #define ANALYTICEXTRAPOLATION #ifdef ANALYTICEXTRAPOLATION inline void L1Extrapolate ( L1TrackPar &T, // input track parameters (x,y,tx,ty,Q/p) and cov.matrix fvec z_out , // extrapolate to this z position fvec qp0 , // use Q/p linearisation at this value L1FieldRegion &F, fvec *w = 0 ) { //cout<<"Extrapolation..."< 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; Ax[step] = ( txty*B[step][0] + ty*B[step][2] - ( 1.f + tx2 )*B[step][1] ) * tx2ty2; Ay[step] = (-txty*B[step][1] - tx*B[step][2] + ( 1.f + ty2 )*B[step][0] ) * tx2ty2; Ax_tx[step] = Ax[step]*tx*I_tx2ty21 + ( ty*B[step][0]-2.f*tx*B[step][1])*tx2ty2qp; Ax_ty[step] = Ax[step]*ty*I_tx2ty21 + ( tx*B[step][0]+ B[step][2])*tx2ty2qp; Ay_tx[step] = Ay[step]*tx*I_tx2ty21 + (-ty*B[step][1]- B[step][2])*tx2ty2qp; Ay_ty[step] = Ay[step]*ty*I_tx2ty21 + (-tx*B[step][1]+2.f*ty*B[step][0])*tx2ty2qp; step4 = step * 4; k[step4 ] = tx * h; k[step4+1] = ty * h; k[step4+2] = Ax[step] * qp0; k[step4+3] = Ay[step] * qp0; } // end of Runge-Kutta steps 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 ); } { T.x = ( (x0[0]+c[0]*k[0]+c[1]*k[4+0]+c[2]*k[8+0]+c[3]*k[12+0]) & initialised) + ( (!initialised) & T.x); T.y = ( (x0[1]+c[0]*k[1]+c[1]*k[4+1]+c[2]*k[8+1]+c[3]*k[12+1]) & initialised) + ( (!initialised) & T.y); T.tx = ( (x0[2]+c[0]*k[2]+c[1]*k[4+2]+c[2]*k[8+2]+c[3]*k[12+2]) & initialised) + ( (!initialised) & T.tx); T.ty = ( (x0[3]+c[0]*k[3]+c[1]*k[4+3]+c[2]*k[8+3]+c[3]*k[12+3]) & initialised) + ( (!initialised) & T.ty); T.z = ( z_out & initialised) + ( (!initialised) & T.z); } // // Derivatives dx/dqp // x0[0] = 0.f; x0[1] = 0.f; x0[2] = 0.f; x0[3] = 0.f; // // Runge-Kutta step for derivatives dx/dqp for (step = 0; step < 4; ++step) { for(i=0; i < 4; ++i) { if(step == 0) { x[i] = x0[i]; } else { x[i] = x0[i] + b[step] * k1[step*4-4+i]; } } step4 = step * 4; k1[step4 ] = x[2] * h; k1[step4+1] = x[3] * h; k1[step4+2] = Ax[step] + Ax_tx[step] * x[2] + Ax_ty[step] * x[3]; k1[step4+3] = Ay[step] + Ay_tx[step] * x[2] + Ay_ty[step] * x[3]; } // end of Runge-Kutta steps for derivatives dx/dqp fvec J[25]; for (i = 0; i < 4; ++i ) { J[20+i]=x0[i]+c[0]*k1[i]+c[1]*k1[4+i]+c[2]*k1[8+i]+c[3]*k1[12+i]; } J[24] = 1.; // // end of derivatives dx/dqp // // Derivatives dx/tx // x0[0] = 0.f; x0[1] = 0.f; x0[2] = 1.f; x0[3] = 0.f; // // Runge-Kutta step for derivatives dx/dtx // for (step = 0; step < 4; ++step) { for(i=0; i < 4; ++i) { if(step == 0) { x[i] = x0[i]; } else if ( i!=2 ) { x[i] = x0[i] + b[step] * k1[step*4-4+i]; } } step4 = step * 4; k1[step4 ] = x[2] * h; k1[step4+1] = x[3] * h; // k1[step4+2] = Ax_tx[step] * x[2] + Ax_ty[step] * x[3]; k1[step4+3] = Ay_tx[step] * x[2] + Ay_ty[step] * x[3]; } // end of Runge-Kutta steps for derivatives dx/dtx for (i = 0; i < 4; ++i ) { if(i != 2) { J[10+i]=x0[i]+c[0]*k1[i]+c[1]*k1[4+i]+c[2]*k1[8+i]+c[3]*k1[12+i]; } } // end of derivatives dx/dtx J[12] = 1.f; J[14] = 0.f; // Derivatives dx/ty // x0[0] = 0.f; x0[1] = 0.f; x0[2] = 0.f; x0[3] = 1.f; // // Runge-Kutta step for derivatives dx/dty // for (step = 0; step < 4; ++step) { for(i=0; i < 4; ++i) { if(step == 0) { x[i] = x0[i]; // ty fixed } else if(i!=3) { x[i] = x0[i] + b[step] * k1[step*4-4+i]; } } step4 = step * 4; k1[step4 ] = x[2] * h; k1[step4+1] = x[3] * h; k1[step4+2] = Ax_tx[step] * x[2] + Ax_ty[step] * x[3]; // k1[step4+3] = Ay_tx[step] * x[2] + Ay_ty[step] * x[3]; } // end of Runge-Kutta steps for derivatives dx/dty for (i = 0; i < 3; ++i ) { J[15+i]=x0[i]+c[0]*k1[i]+c[1]*k1[4+i]+c[2]*k1[8+i]+c[3]*k1[12+i]; } // end of derivatives dx/dty J[18] = 1.; J[19] = 0.; // // derivatives dx/dx and dx/dy for(i = 0; i < 10; ++i){ J[i] = 0.;} J[0] = 1.; J[6] = 1.; fvec dqp = qp_in - qp0; { // update parameters T.x += ((J[5*4+0]*dqp) & initialised); T.y += ((J[5*4+1]*dqp) & initialised); T.tx +=((J[5*4+2]*dqp) & initialised); T.ty +=((J[5*4+3]*dqp) & initialised); } // covariance matrix transport // // if ( C_in&&C_out ) CbmKFMath::multQtSQ( 5, J, C_in, C_out); // TODO // j(0,2) = J[5*2 + 0]; // j(1,2) = J[5*2 + 1]; // j(2,2) = J[5*2 + 2]; // j(3,2) = J[5*2 + 3]; // // j(0,3) = J[5*3 + 0]; // j(1,3) = J[5*3 + 1]; // j(2,3) = J[5*3 + 2]; // j(3,3) = J[5*3 + 3]; // // j(0,4) = J[5*4 + 0]; // j(1,4) = J[5*4 + 1]; // j(2,4) = J[5*4 + 2]; // j(3,4) = J[5*4 + 3]; const fvec c42 = T.C42, c43 = T.C43; const fvec cj00 = T.C00 + T.C20*J[5*2 + 0] + T.C30*J[5*3 + 0] + T.C40*J[5*4 + 0]; // const fvec cj10 = T.C10 + T.C21*J[5*2 + 0] + T.C31*J[5*3 + 0] + T.C41*J[5*4 + 0]; const fvec cj20 = T.C20 + T.C22*J[5*2 + 0] + T.C32*J[5*3 + 0] + c42*J[5*4 + 0]; const fvec cj30 = T.C30 + T.C32*J[5*2 + 0] + T.C33*J[5*3 + 0] + c43*J[5*4 + 0]; const fvec cj01 = T.C10 + T.C20*J[5*2 + 1] + T.C30*J[5*3 + 1] + T.C40*J[5*4 + 1]; const fvec cj11 = T.C11 + T.C21*J[5*2 + 1] + T.C31*J[5*3 + 1] + T.C41*J[5*4 + 1]; const fvec cj21 = T.C21 + T.C22*J[5*2 + 1] + T.C32*J[5*3 + 1] + c42*J[5*4 + 1]; const fvec cj31 = T.C31 + T.C32*J[5*2 + 1] + T.C33*J[5*3 + 1] + c43*J[5*4 + 1]; // const fvec cj02 = T.C20*J[5*2 + 2] + T.C30*J[5*3 + 2] + T.C40*J[5*4 + 2]; // const fvec cj12 = T.C21*J[5*2 + 2] + T.C31*J[5*3 + 2] + T.C41*J[5*4 + 2]; const fvec cj22 = T.C22*J[5*2 + 2] + T.C32*J[5*3 + 2] + c42*J[5*4 + 2]; const fvec cj32 = T.C32*J[5*2 + 2] + T.C33*J[5*3 + 2] + c43*J[5*4 + 2]; // const fvec cj03 = T.C20*J[5*2 + 3] + T.C30*J[5*3 + 3] + T.C40*J[5*4 + 3]; // const fvec cj13 = T.C21*J[5*2 + 3] + T.C31*J[5*3 + 3] + T.C41*J[5*4 + 3]; const fvec cj23 = T.C22*J[5*2 + 3] + T.C32*J[5*3 + 3] + c42*J[5*4 + 3]; const fvec cj33 = T.C32*J[5*2 + 3] + T.C33*J[5*3 + 3] + c43*J[5*4 + 3]; T.C40 += ((c42*J[5*2 + 0] + c43*J[5*3 + 0] + T.C44*J[5*4 + 0]) & initialised); // cj40 T.C41 += ((c42*J[5*2 + 1] + c43*J[5*3 + 1] + T.C44*J[5*4 + 1]) & initialised); // cj41 T.C42 = ((c42*J[5*2 + 2] + c43*J[5*3 + 2] + T.C44*J[5*4 + 2]) & initialised) + ((!initialised) & T.C42); T.C43 = ((c42*J[5*2 + 3] + c43*J[5*3 + 3] + T.C44*J[5*4 + 3]) & initialised) + ((!initialised) & T.C43); T.C00 = ((cj00 + J[5*2 + 0]*cj20 + J[5*3 + 0]*cj30 + J[5*4 + 0]*T.C40)& initialised) + ((!initialised) & T.C00); T.C10 = ((cj01 + J[5*2 + 0]*cj21 + J[5*3 + 0]*cj31 + J[5*4 + 0]*T.C41) & initialised) + ((!initialised) & T.C10); T.C11 = ((cj11 + J[5*2 + 1]*cj21 + J[5*3 + 1]*cj31 + J[5*4 + 1]*T.C41) & initialised) + ((!initialised) & T.C11); T.C20 = ((J[5*2 + 2]*cj20 + J[5*3 + 2]*cj30 + J[5*4 + 2]*T.C40) & initialised) + ((!initialised) & T.C20); T.C30 = ((J[5*2 + 3]*cj20 + J[5*3 + 3]*cj30 + J[5*4 + 3]*T.C40) & initialised) + ((!initialised) & T.C30); T.C21 = ((J[5*2 + 2]*cj21 + J[5*3 + 2]*cj31 + J[5*4 + 2]*T.C41) & initialised) + ((!initialised) & T.C21); T.C31 = ((J[5*2 + 3]*cj21 + J[5*3 + 3]*cj31 + J[5*4 + 3]*T.C41) & initialised) + ((!initialised) & T.C31); T.C22 = ((J[5*2 + 2]*cj22 + J[5*3 + 2]*cj32 + J[5*4 + 2]*T.C42) & initialised) + ((!initialised) & T.C22); T.C32 = ((J[5*2 + 3]*cj22 + J[5*3 + 3]*cj32 + J[5*4 + 3]*T.C42) & initialised) + ((!initialised) & T.C32); T.C33 = ((J[5*2 + 3]*cj23 + J[5*3 + 3]*cj33 + J[5*4 + 3]*T.C43) & initialised) + ((!initialised) & T.C33); } #endif //ANALYTICEXTRAPOLATION inline void L1Extrapolate0 ( L1TrackPar &T, // input track parameters (x,y,tx,ty,Q/p) and cov.matrix fvec z_out , // extrapolate to this z position L1FieldRegion &F ) { // // Part of the analytic extrapolation formula with error (c_light*B*dz)^4/4! // cnst c_light = 0.000299792458; cnst c1 = 1., c2i = 1./2., c3i = 1./3., c6i = 1./6., c12i = 1./12.; const fvec qp = T.qp; const fvec dz = (z_out - T.z); const fvec dz2 = dz*dz; // construct coefficients const fvec x = T.tx; const fvec y = T.ty; // const fvec z = T.z; const fvec xx = x*x; const fvec xy = x*y; const fvec yy = y*y; const fvec Ay = -xx-c1; const fvec Bx = yy+c1; const fvec ct = c_light*sqrt( c1 + xx + yy ); const fvec dzc2i = dz*c2i; const fvec dz2c3i = dz2*c3i; const fvec dzc6i = dz*c6i; const fvec dz2c12i= dz2*c12i; const fvec sx = ( F.cx0 + F.cx1*dzc2i + F.cx2*dz2c3i ); const fvec sy = ( F.cy0 + F.cy1*dzc2i + F.cy2*dz2c3i ); const fvec sz = ( F.cz0 + F.cz1*dzc2i + F.cz2*dz2c3i ); const fvec Sx = ( F.cx0*c2i + F.cx1*dzc6i + F.cx2*dz2c12i ); const fvec Sy = ( F.cy0*c2i + F.cy1*dzc6i + F.cy2*dz2c12i ); const fvec Sz = ( F.cz0*c2i + F.cz1*dzc6i + F.cz2*dz2c12i ); const fvec ctdz = ct*dz; const fvec ctdz2 = ct*dz2; const fvec j04 = ctdz2* ( Sx*xy + Sy*Ay + Sz*y ); const fvec j14 = ctdz2* ( Sx*Bx - Sy*xy - Sz*x ); const fvec j24 = ctdz * ( sx*xy + sy*Ay + sz*y ); const fvec j34 = ctdz * ( sx*Bx - sy*xy - sz*x ); T.x += x*dz + j04*qp; T.y += y*dz + j14*qp; T.tx+=j24*qp; T.ty+=j34*qp; T.z += dz; //T.t += sqrt((x-T.x)*(x-T.x)+(y-T.y)*(y-T.y)+dz*dz)/29.9792458f; // covariance matrix transport const fvec cj00 = T.C00 + T.C20*dz + T.C40*j04; // const fvec cj10 = T.C10 + T.C21*dz + T.C41*j04; const fvec cj20 = T.C20 + T.C22*dz + T.C42*j04; const fvec cj30 = T.C30 + T.C32*dz + T.C43*j04; const fvec cj01 = T.C10 + T.C30*dz + T.C40*j14; const fvec cj11 = T.C11 + T.C31*dz + T.C41*j14; const fvec cj21 = T.C21 + T.C32*dz + T.C42*j14; const fvec cj31 = T.C31 + T.C33*dz + T.C43*j14; // const fvec cj02 = T.C20 + T.C40*j24; // const fvec cj12 = T.C21 + T.C41*j24; const fvec cj22 = T.C22 + T.C42*j24; const fvec cj32 = T.C32 + T.C43*j24; // const fvec cj03 = T.C30 + T.C40*j34; // const fvec cj13 = T.C31 + T.C41*j34; // const fvec cj23 = T.C32 + T.C42*j34; const fvec cj33 = T.C33 + T.C43*j34; T.C40+= T.C42*dz + T.C44*j04; // cj40 T.C41+= T.C43*dz + T.C44*j14; // cj41 T.C42+= T.C44*j24; // cj42 T.C43+= T.C44*j34; // cj43 T.C00 = cj00 + dz*cj20 + j04*T.C40; T.C10 = cj01 + dz*cj21 + j04*T.C41; T.C11 = cj11 + dz*cj31 + j14*T.C41; T.C20 = cj20 + j24*T.C40 ; T.C30 = cj30 + j34*T.C40 ; T.C21 = cj21 + j24*T.C41 ; T.C31 = cj31 + j34*T.C41 ; T.C22 = cj22 + j24*T.C42 ; T.C32 = cj32 + j34*T.C42 ; T.C33 = cj33 + j34*T.C43 ; } inline void L1ExtrapolateTime ( L1TrackPar &T, // input track parameters (x,y,tx,ty,Q/p) and cov.matrix fvec dz // extrapolate to this z position ) { cnst c_light = 29.9792458; T.t += sqrt((T.tx*T.tx)+(T.ty*T.ty)+1)*dz/c_light; const fvec k1 = T.tx*dz/(c_light*sqrt((T.tx*T.tx)+(T.ty*T.ty)+1)); const fvec k2 = T.ty*dz/(c_light*sqrt((T.tx*T.tx)+(T.ty*T.ty)+1)); fvec c52 = T.C52; fvec c53 = T.C53; // cout<