!=================================== ! rSNOB X pulse ! BENJAMIN WYLIE AND YING LI !=================================== ! WTF additions 010706 ! 1. streamlined phase/freq hopping implementation. ! 2. added variables to make it fully internal (an actual includes file) ! 3. Changed variable/Macro naming conventions ! 4. Added acq params here.(010906) !=================================== ! Li, Wylie, Rienstra JMR 2006 ! ! phase cycling may be done within ch1 or loop1 (after declaring into ch1) ! !calculation phases .phase phi_rSNOB = 0.0; .phase ph0_rSNOB = 0.0; .phase p00_rSNOB = 0.0; .phase p_err_rSNOB = 0.0; .phase d_ph_rSNOB = 0.0; !timings .time extern pw_rSNOB = 10m; .time autofix PW_rSNOB = 10u; .time t_rSNOB = 10u; .time t_rSNOB_Y = 10u; .time rSNOB_rm = 10u; .time tau_r_rSNOB = 10u; .time tau_r_rSNOB_PI = 10u; .time PW90Ytemp; .long steps_rSNOB "shape steps" = 256; .long cycles_rSNOB; .long ii,jj,kk; .time cyclesrem_rSNOB; !rSNOB Globals .time extern pw_tppm_rSNOB; .ampl extern aHdec_rSNOB; .phase extern p2_tppm_rSNOB; ! r-SNOB fourier coefficients (Shape) .float Ac_rSNOB[]=0.5000,-1.1472, 0.5572,-0.0829, 0.0525; .float Bc_rSNOB[]=0.0000, 0.0000, 0.0000, 0.0000, 0.0000; ! rSNOB amplitudes !ch++ ch1; .long list fixed ap_rSNOB[256]; .float list a_rSNOB[256]; .phase p_rSNOB[256]; .phase list rSNOB_plist[256]; .float extern freqhop_rSNOB = 0.0; !ch--; .ampl extern aX_rSNOB = 0.1; .ampl amplrSNOB = 0.1; .scale scX_rSNOB "X rSNOB scaler" = 0.1; .float norm = 0.0; .phase pshift; .phase phi_0 = 0.0; .phase phi_00 = 0.0; .phase perror = 0.0; .ampl AX_rSNOB; !Add to .acq file !# Selective echo !scX_rSNOB;X scalar soft;0.1;-;0.0;1.0;3;1;float !pw_rSNOB;soft 180 pulse;360;u;200;10000;2;1;float !aX_rSNOB;X 180 soft.;0.1;-;0.0;1.0;4;1;float !#rSNOB Decoupling (all rSNOBs) !aHdec_soft;dec. during echo;0.5;-;0.0;1.0;4;3;float !pw_tppm_soft;TPPM pw(echo);7;u;0.1;1000;2;2;float !p2_tppm_soft; TPPM phase(echo);15;-;0;360;1;2;float !---- add to update section DEFINE rSNOB_prog(t_soft) PW_rSNOB=(pw_rSNOB-12u)/steps_rSNOB; while(PW_rSNOB < 1u){ steps_rSNOB = steps_rSNOB - 1; PW_rSNOB=(pw_rSNOB-12u)/steps_rSNOB; } rSNOB_rm = pw_rSNOB - (steps_rSNOB*PW_rSNOB); d_ph_rSNOB = 0.0 ; norm = 0.0; i=0; do(steps_rSNOB){ amplrSNOB=0.0; j=0; ss Ac_rSNOB; ss Bc_rSNOB; do(Ac_rSNOB.size){ amplrSNOB=amplrSNOB+(@Ac_rSNOB++)*cos(i*j*(2*pi/steps_rSNOB)); amplrSNOB=amplrSNOB+(@Bc_rSNOB++)*sin(i*j*(2*pi/steps_rSNOB)); j++; } if( abs(amplrSNOB) > norm ){norm=abs(amplrSNOB);} i++; } d_ph_rSNOB = 0.0 ; t_rSNOB = pw_rSNOB ; t_soft = t_rSNOB; ch++ ch1; MAKE_rSNOB; MAKE_ampl_rSNOB; ch--; cycles_rSNOB= floor((t_rSNOB)/(2.0*pw_tppm_rSNOB))-1; cyclesrem_rSNOB=(t_rSNOB)-(cycles_rSNOB*2.0*pw_tppm_rSNOB); if( cyclesrem_rSNOB < 1.0u){ cycles_rSNOB=cycles_rSNOB-1; cyclesrem_rSNOB=(t_rSNOB)-(cycles_rSNOB*2.0*pw_tppm_rSNOB); } PW90Ytemp=pw90Y; ENDDEF DEFINE MAKE_rSNOB p_err_rSNOB = 0.0; AX_rSNOB=aX_rSNOB/scX_rSNOB; ss ap_rSNOB; ss p_rSNOB; ss a_rSNOB; i=0; ii=0; norm=0.0; do(steps_rSNOB){ amplrSNOB=0.0; jj=0; do(Ac_rSNOB.size){ a_rSNOB[ii] = a_rSNOB[ii] + Ac_rSNOB[jj]*cos(ii*jj*(2*pi/steps_rSNOB)); a_rSNOB[ii] = a_rSNOB[ii] + Bc_rSNOB[jj]*sin(ii*jj*(2*pi/steps_rSNOB)); jj++; } if(abs(a_rSNOB[ii]) > norm) { norm = abs(a_rSNOB[ii]); } ii++; } ii = 0; pshift=(freqhop_rSNOB*360.0)*(pw_rSNOB/steps_rSNOB); perror = 0.0; ss ap_rSNOB; do(steps_rSNOB){ phi_0 = -1.0*(freqhop_rSNOB*180.0)*(pw_rSNOB); ! normally phi_0 = 0.0; a_rSNOB[ii] = (a_rSNOB[ii]/norm)*AX_rSNOB; if(a_rSNOB[ii] < 0.0){ a_rSNOB[ii] = abs(a_rSNOB[ii]); phi_0 = phi_0 + 180.0; } phi_0 = phi_0 + pshift*(ii+1); phi_0 = phi_0; phi_00 = floor(phi_0+0.5); perror = perror + (phi_0 - phi_00); if(abs(perror) > 1.0){ phi_00 = phi_00 + floor(perror); perror = perror - floor(perror); } p_rSNOB[ii]=phi_00; ii++; } ! ss p_rSNOB; ! ss a_rSNOB; ! ss ap_rSNOB; ! do(steps_rSNOB){ ! @ap_rSNOB++ = TG | AP(@a_rSNOB++,@p_rSNOB++) ; ! } ENDDEF DEFINE MAKE_ampl_rSNOB p_err_rSNOB = 0.0; ph0_rSNOB = 0.0; ss a_rSNOB; ss p_rSNOB; do(steps_rSNOB){@a_rSNOB++=0.0;@p_rSNOB++=0.0;} ss a_rSNOB; ss p_rSNOB; i = 0; do(steps_rSNOB){ amplrSNOB=0.0; ss Ac_rSNOB; ss Bc_rSNOB; j=0; do(Ac_rSNOB.size){ amplrSNOB=amplrSNOB + Ac_rSNOB[j]*cos(j*2*pi*i/steps_rSNOB); amplrSNOB=amplrSNOB + Bc_rSNOB[j]*sin(j*2*pi*i/steps_rSNOB); j++; } amplrSNOB=aX_rSNOB*amplrSNOB/scX_rSNOB; if(amplrSNOB < 0.0){ ph0_rSNOB=p180+ph0_rSNOB; amplrSNOB=abs(amplrSNOB); } ph0_rSNOB= ph0_rSNOB + (i*d_ph_rSNOB); p00_rSNOB=floor(ph0_rSNOB + 0.5); p_err_rSNOB = p_err_rSNOB + (ph0_rSNOB - p00_rSNOB); if(abs(p_err_rSNOB)>1.0){ p00_rSNOB = p00_rSNOB + floor(p_err_rSNOB); p_err_rSNOB = p_err_rSNOB - floor(p_err_rSNOB); } p00_rSNOB=p00_rSNOB - floor(p00_rSNOB/360.0)*360.0; @a_rSNOB++ = amplrSNOB ; @p_rSNOB++ = p00_rSNOB ; i++; } ENDDEF DEFINE rSNOB_X ss ap_rSNOB; out time(3u) ch1: TB ; out time(3u) ch1: SC(scX_rSNOB); for(i=0, i1.0u) { out time(t_rSNOB_Y); out pw90Y ch3:TG|AP(aY90, 0.0); out pw90Y ch3:TG|AP(aY90,90.0); out pw90Y ch3:TG|AP(aY90,90.0); out pw90Y ch3:TG|AP(aY90, 0.0); } ENDDEF