/* 
_01 	derived from kp_srtACQ_39.c
	new code uses improved explicit acquisition method
_02	extended scyc
*/


#include <standard.h>


//phase cycle on all pulses
static int	ph1[64] = {0,2, 0,2, 0,2,0,2, 1,3,1,3,1,3,1,3, 0,2,0,2,0,2,0,2,1,3,1,3,1,3,1,3, 0,2,0,2,0,2,0,2,1,3,1,3,1,3,1,3, 0,2,0,2,0,2,0,2,1,3,1,3,1,3,1,3},	//v1;	90 excitation
		ph2[64] = {0,0, 0,0, 1,1,1,1, 0,0,0,0,1,1,1,1, 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1, 2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3, 2,2,2,2,3,3,3,3,2,2,2,2,3,3,3,3},	//v2;	hard180 
		ph3[64] = {0,0, 1,1, 0,0,1,1, 0,0,1,1,0,0,1,1, 2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3, 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, 2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3},	//v3;	sel180 active  	
		ph4[64] = {0,0, 1,1, 0,0,1,1, 0,0,1,1,0,0,1,1, 2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3, 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, 2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3},	//v4;v24	sel180 passive

		ph14[64]= {1,1, 2,2, 1,1,2,2, 1,1,2,2,1,1,2,2, 3,3,0,0,3,3,0,0,3,3,0,0,3,3,0,0, 1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2, 3,3,0,0,3,3,0,0,3,3,0,0,3,3,0,0},	//v14;v34	hard180 of WATERGATE
		ph15[64]= {3,3, 0,0, 3,3,0,0, 3,3,0,0,3,3,0,0, 1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2, 3,3,0,0,3,3,0,0,3,3,0,0,3,3,0,0, 1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2},	//v15;v35	sel90 of WATERGATE

		ph21[64]= {0,0, 1,1, 0,0,1,1, 0,0,1,1,0,0,1,1, 2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3, 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, 2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3},	//v21;	90s of BIRD
		ph22[64]= {1,1, 2,2, 1,1,2,2, 1,1,2,2,1,1,2,2, 3,3,0,0,3,3,0,0,3,3,0,0,3,3,0,0, 1,1,2,2,1,1,2,2,1,1,2,2,1,1,2,2, 3,3,0,0,3,3,0,0,3,3,0,0,3,3,0,0},	//v22;	180s of BIRD
		//ph23[64]= {2,2, 3,3, 2,2,3,3, 2,2,3,3,2,2,3,3, 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1, 2,2,3,3,2,2,3,3,2,2,3,3,2,2,3,3, 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1},	//v23;	last 90 of BIRD
		ph5[64] = {0,2, 2,0, 2,0,0,2, 1,3,3,1,3,1,1,3, 0,2,2,0,2,0,0,2,1,3,3,1,3,1,1,3, 0,2,2,0,2,0,0,2,1,3,3,1,3,1,1,3, 0,2,2,0,2,0,0,2,1,3,3,1,3,1,1,3};	//oph
//v10;v11 reserved for the real-time loop
//v12;v13 reserved for ifzero PFGs

//v6 for auto-incremented supercycle additional to the scan-to-scan on v4/v14-v15/v21-v22-v23
//v7 used for small-angle phases
static int	  ph6_m4[ 4] = {0,0,2,2},
		  ph6_m8[ 8] = {0,0,2,2, 0,2,2,0},
		  ph6_t5[ 5] = {0,5,2,5,0},
		  ph6_t7[ 7] = {0,7,20,17,20,7,0},
		  ph6_t9[ 9] = {0,1,12,11,18,11,12,1,0},

		 ph6_m16[16] = {0,0,2,2, 0,2,2,0, 2,2,0,0, 2,0,0,2},
		 ph6_m32[32] = {0,0,2,2, 2,0,0,2, 2,2,0,0, 0,2,2,0,  0,0,0,2, 2,2,0,0, 2,2,2,0, 0,0,2,2},
		 ph6_m64[64] = {0,0,2,2, 2,0,0,2, 2,2,0,0, 0,2,2,0,  0,0,0,2, 2,2,0,0, 2,2,2,0, 0,0,2,2,
				2,2,0,0, 0,2,2,0, 0,0,2,2, 2,0,0,2,  2,2,2,0, 0,0,2,2, 0,0,0,2, 2,2,0,0},

		ph6_t5m4[20] = {0,5,2,5,0, 0,5,2,5,0, 6,11,8,11,6, 6,11,8,11,6},
	       ph6_t5m16[80] = {0,5,2,5,0, 0,5,2,5,0, 6,11,8,11,6, 6,11,8,11,6,
				0,5,2,5,0, 6,11,8,11,6, 6,11,8,11,6, 0,5,2,5,0,
				6,11,8,11,6, 6,11,8,11,6, 0,5,2,5,0, 0,5,2,5,0,
				6,11,8,11,6, 0,5,2,5,0, 0,5,2,5,0, 6,11,8,11,6},
	        ph6_t7m4[28] = {0,7,20,17,20,7,0, 0,7,20,17,20,7,0, 12,19,32,29,32,19,12, 12,19,32,29,32,19,12},
	       ph6_t7m16[112]= {0,7,20,17,20,7,0, 0,7,20,17,20,7,0, 12,19,32,29,32,19,12, 12,19,32,29,32,19,12,
				0,7,20,17,20,7,0, 12,19,32,29,32,19,12, 12,19,32,29,32,19,12, 0,7,20,17,20,7,0,
				12,19,32,29,32,19,12, 12,19,32,29,32,19,12, 0,7,20,17,20,7,0, 0,7,20,17,20,7,0,
				12,19,32,29,32,19,12, 0,7,20,17,20,7,0, 0,7,20,17,20,7,0, 12,19,32,29,32,19,12,},
		ph6_t9m4[36] = {0,1,12,11,18,11,12,1,0, 0,1,12,11,18,11,12,1,0, 12,13,24,23,30,23,24,13,12, 12,13,24,23,30,23,24,13,12},

		ph6[ 4] = {0,0,0,0};	

pulsesequence()
{	
double	rof3 = getval("rof3"),	//should be 2.0us
	tau_a = getval("tau_a"),
	tau_p = getval("tau_p"),	//tau_p is the total length of the period without acquisition of data points; must be an integer multiple of 1.0/sw
	tau_r = 0.0,				//calculated by the sequence based on the parameters; the executable delay before and after the decoupling element; this must accomodate 2*(ACQ_gt1+ACQ_gstab)
	tau_w = getval("tau_w"),	//time correction for the lost chemical shift evolution during the softWATERGATE element
	tpwr = getval("tpwr"),
	tpwrf = getval("tpwrf"),
	pw = getval("pw"),
//hard180 refocusing
	pp = getval("pp"),
	pplvl = getval("pplvl"),
	pplvlf = getval("pplvlf"),
//sel180 refocusing of the active spin
	pw180_a = getval("pw180_a"),
	pwr180_a = getval("pwr180_a"),
//sel180 decoupling of the passive
	pw180_p = getval("pw180_p"),
	pwr180_p = getval("pwr180_p"),
//soft90 for WATERGATE of the passive
	pw90_w = getval("pw90_w"),
	pwr90_w = getval("pwr90_w"),
//BIRD
	j1xh = getval("j1xh"),
	tau = 1.0/(4.0*j1xh),
	pwxlvl = getval("pwxlvl"),
	pwx = getval("pwx"),
	dpwr = getval("dpwr"),

//PFG parameters
	hsgt = getval("hsgt"),
	hsglvl = getval("hsglvl"),

	gstab = getval("gstab"),
	gt1 = getval("gt1"),  
	gzlvl1 = getval("gzlvl1"),
	gt2 = getval("gt2"),  
	gzlvl2 = getval("gzlvl2"),
	gzlvl7 = getval("gzlvl7"),
	kp_gmult = getval("kp_gmult"),
	kp_pfgtc = getval("kp_pfgtc"),  //time correction for PFG group delay

	kp_del = getval("kp_del"),

	ACQ_gt1 = getval("ACQ_gt1"),  
	ACQ_gzlvl1 = getval("ACQ_gzlvl1"),
	ACQ_gzlvl2 = getval("ACQ_gzlvl2"),
	ACQ_gzlvl3 = getval("ACQ_gzlvl3"),
	ACQ_gzlvl4 = getval("ACQ_gzlvl4"),
	ACQ_gstab = getval("ACQ_gstab"),

//chunk definitions
	sw1 = getval("sw1"),	// length of chunk is 1.0/sw1; must be an integer multiple of 1.0/sw
	npoints = getval("npoints"),	//number of lines (np/2) of each pure shift data points
	droppts1 = getval("droppts1"),	//droppts at the begining of each chunk
	droppts2 = getval("droppts2"),	//droppts at the end of each chunk

	cycles=(double)((floor)(np/(2.0*(droppts1+droppts2+npoints)) -1.0 ));	//int truncates if needed
	//loop counters v10(v11)
	F_initval(cycles,v10);	

int 	kpph = getval("kpph"),		//number of steps used from the phase cycle; if zero than all steps are used
	kp_scyc_len;

char	sspul[MAXSTR],
	lkgate_flg[MAXSTR],
	kp_scyc[MAXSTR],
	BIRDmode[MAXSTR],	
	shp_a[MAXSTR], 
	shp_w[MAXSTR],
	shp_p[MAXSTR];
  
	getstr("sspul",sspul);
	getstr("lkgate_flg",lkgate_flg);
	getstr("kp_scyc",kp_scyc);
	getstr("BIRDmode",BIRDmode);
	getstr("shp_a",shp_a);		//created by macro kp_makePS7 using bw_a/kp_phincr_a
	getstr("shp_w",shp_w);		//created by macro kp_makePS7 when BIRDmode=='w' using pw90_p / wave def: square90 / kp_phincr_w (phase; fine phase calibration) / kp_beta_w (flip angle; fine amplitude calibration)
	getstr("shp_p",shp_p);		//created by macro kp_makePS7 when BIRDmode=='n' 1) if gzlvl7==0 then using bw_p or 2) if gzlvl7!=0 then using pw180_p


//calculate tau_r
	if (BIRDmode[0]=='n')
	{
		if ((kp_gmult!=0.0) && (gzlvl7!=0.0))	
		{
		tau_r = (tau_p - 2.0*ACQ_gt1-4.0*ACQ_gstab-pw180_p-kp_pfgtc-2.0*(pw180_p+kp_pfgtc)/kp_gmult)/2.0; 
		}
		else	
		{ 
		tau_r = (tau_p - 2.0*ACQ_gt1-2.0*ACQ_gstab-2.0*rof1-pw180_p)/2.0; 
		}
	}
	if (BIRDmode[0]=='w')
	{

		if ((kp_gmult!=0.0) && (gzlvl7!=0.0))	
		{
//this version is not working yet
		tau_r = (tau_p - 2.0*kp_pfgtc-2.0*ACQ_gt1-4.0*ACQ_gstab-4.0*rof1-pp-2.0*pw90_w - tau_w)/2.0; 
		}
		else	
		{ 
	//	tau_r = (tau_p - 2.0*ACQ_gt1-2.0*ACQ_gstab-6.0*rof1-pp-2.0*pw90_w - tau_w)/2.0;
		tau_r = (tau_p - 2.0*ACQ_gt1-2.0*ACQ_gstab-2.0*rof1-2.0*pw90_w +2.0*pw90_w/3.14259 +tau_w  )/2.0; 
 		}
	}
	if (BIRDmode[0]=='b')
	{
	if (pw>pwx) 	tau_r = (tau_p - 2.0*ACQ_gt1-2.0*ACQ_gstab-6.0*rof1-4.0*pw-4.0*pwx-4.0*tau)/2.0;
	else 	tau_r = (tau_p - 2.0*ACQ_gt1-2.0*ACQ_gstab-6.0*rof1-2.0*pw-6.0*pwx-4.0*tau)/2.0;
	}

//ACQmode definitions 
setacqmode(WACQ|NZ);	

if ((kpph<0) || (kpph>64))
{
abort_message("Number of steps for phase cycling is incorrect..change kpph..");
}

//phase cycle
if (kpph==0)
{
	settable(t1,64,ph1);
	settable(t2,64,ph2);
	settable(t3,64,ph3);
	settable(t4,64,ph4);
	settable(t5,64,ph5);
	settable(t14,64,ph14);
	settable(t15,64,ph15);
	settable(t21,64,ph21);
	settable(t22,64,ph22);
}
else
{
	settable(t1,kpph,ph1);
	settable(t2,kpph,ph2);
	settable(t3,kpph,ph3);
	settable(t4,kpph,ph4);
	settable(t5,kpph,ph5);
	settable(t14,kpph,ph14);
	settable(t15,kpph,ph15);
	settable(t21,kpph,ph21);
	settable(t22,kpph,ph22);
}
	getelem(t1, ct, v1);
	getelem(t2, ct, v2);
	getelem(t3, ct, v3);
	getelem(t4, ct, v4);
	getelem(t5, ct, oph);
	getelem(t14, ct, v14);
	getelem(t15, ct, v15);
	getelem(t21, ct, v21);
	getelem(t22, ct, v22);


// chunk to chunk phase sequencing options
kp_scyc_len=strlen(kp_scyc);
//printf("Length %d",kp_scyc_len);

//no phase sequencing
if (kp_scyc[0]=='n')
{
	settable(t6,4,ph6);
}
// phase sequencing with m4/m8/t5/t7/t9
	if (kp_scyc_len==2) 
	{
//m4 phase sequencing
if ((kp_scyc[0]=='m') && (kp_scyc[1]=='4'))
{
settable(t6,4,ph6_m4);
}
//m8 phase sequencing
if ((kp_scyc[0]=='m') && (kp_scyc[1]=='8'))
{
settable(t6,8,ph6_m8);
}
//t5 phase sequencing
if ((kp_scyc[0]=='t') && (kp_scyc[1]=='5'))
{
settable(t6,5,ph6_t5);
obsstepsize(30.0);
if (BIRDmode[0]=='b') decstepsize(30.0);
}
//t7 phase sequencing
if ((kp_scyc[0]=='t') && (kp_scyc[1]=='7'))
{
settable(t6,7,ph6_t7);
obsstepsize(15.0);
if (BIRDmode[0]=='b') decstepsize(15.0);
}
//t9 phase sequencing
if ((kp_scyc[0]=='t') && (kp_scyc[1]=='9'))
{
settable(t6,9,ph6_t9);
obsstepsize(15.0);
if (BIRDmode[0]=='b') decstepsize(15.0);
}
	}
// phase sequencing with m16/m32/m64
	if (kp_scyc_len==3) 
	{
//m16 phase sequencing
if ((kp_scyc[0]=='m') && (kp_scyc[1]=='1'))
{
settable(t6,16,ph6_m16);
}
//m32 phase sequencing
if ((kp_scyc[0]=='m') && (kp_scyc[1]=='3'))
{
settable(t6,32,ph6_m32);
}
//m64 phase sequencing
if ((kp_scyc[0]=='m') && (kp_scyc[1]=='6'))
{
settable(t6,64,ph6_m64);
}
	}
// phase sequencing with t5m4/t7m4/t9m4
	if (kp_scyc_len==4) 
	{
//t5m4 phase sequencing
if (kp_scyc[1]=='5')
{
settable(t6,20,ph6_t5m4);
obsstepsize(30.0);
if (BIRDmode[0]=='b') decstepsize(30.0);
}
//t7m4 phase sequencing
if (kp_scyc[1]=='7')
{
settable(t6,28,ph6_t7m4);
obsstepsize(15.0);
if (BIRDmode[0]=='b') decstepsize(15.0);
}
//t9m4 phase sequencing
if (kp_scyc[1]=='9')
{
settable(t6,36,ph6_t9m4);
obsstepsize(15.0);
if (BIRDmode[0]=='b') decstepsize(15.0);
}
	}
// phase sequencing with t5m16/t7m16
	if (kp_scyc_len==5) 
	{
//t5m16 phase sequencing
if (kp_scyc[1]=='5')
{
settable(t6,80,ph6_t5m16);
obsstepsize(30.0);
if (BIRDmode[0]=='b') decstepsize(30.0);
}
//t7m16 phase sequencing
if (kp_scyc[1]=='7')
{
settable(t6,112,ph6_t7m16);
obsstepsize(15.0);
if (BIRDmode[0]=='b') decstepsize(15.0);
}
	}

//end of the chunk to chunk phase sequencing options


// equilibrium period 
status(A);
	txphase(zero);
	xmtrphase(zero);
        obsoffset(tof);
	obspower(tpwr);
	obspwrf(tpwrf);
	delay(0.1);

	if (sspul[0]=='y') 
	{
	if ( (lkgate_flg[0] == 'y') || (lkgate_flg[0] == 'k') )  lk_hold(); 
	delay(0.001);
	zgradpulse(hsglvl,hsgt); 
	delay(gstab);
	rgpulse(pw,zero,rof1,rof1);
	zgradpulse(hsglvl,hsgt); 
	delay(0.05);
	}
	if ( (lkgate_flg[0] == 'y') || (lkgate_flg[0] == 'k') )  lk_sample();
	delay(d1);
	if ( (lkgate_flg[0] == 'y') || (lkgate_flg[0] == 'k') )  lk_hold(); 
	delay(0.001);
status(B);
	rgpulse(pw,v1,rof1,0.0);
delay(d2/2.0);
	obspower(pplvl);
	if (tpwrf!=pplvlf) obspwrf(pplvlf);
	delay(0.25*(npoints)/sw-rof1-gt1-gstab -50.0e-9);
	zgradpulse(gzlvl1,gt1);
	delay(gstab);
	rgpulse(pp,v2,rof1,rof1);
	obspower(pwr180_a); 
	if ( ( 0.25*(npoints)/sw-rof1-gt1-gstab -50.0e-9) > gstab )
	{
	delay(gstab);
	zgradpulse(gzlvl1,gt1);
	delay(0.25*(npoints)/sw-rof1-gt1-gstab -50.0e-9);
	}
	else
	{
	delay(0.25*(npoints)/sw-rof1-gt1-gstab -50.0e-9);
	zgradpulse(gzlvl1,gt1);
	delay(gstab);
	}
	delay(droppts1/sw);
//tau_a calculation needs to be checked for gzlvl7 options
	if ((kp_gmult!=0.0) && (gzlvl7!=0.0))	
	{ 
	delay(tau_a-100.0e-6-kp_pfgtc-gt2-gstab);
	zgradpulse(gzlvl2,gt2);
	delay(gstab);
	rgradient('z',gzlvl7);
	delay(100.0e-6-rof1+kp_pfgtc);
	shaped_pulse(shp_a,pw180_a,v3,rof1,0.0);
	delay(100.0e-6);
	rgradient('z',0.0);
		if ((tau_a-100.0e-6-gt2-gstab) > gstab)
		{
        delay(gstab);
	zgradpulse(gzlvl2,gt2);
	delay(tau_a-100.0e-6-gt2-gstab);
		}
		else
		{
	delay(tau_a-100.0e-6-gt2-gstab);
	zgradpulse(gzlvl2,gt2);
        delay(gstab);
		}
	}
	else
	{
	delay(tau_a-rof1-gt2-gstab);
	zgradpulse(gzlvl2,gt2);
	delay(gstab);
	shaped_pulse(shp_a,pw180_a,v3,rof1,rof1);
		if ((tau_a-rof1-gt2-gstab) > gstab)
		{
        delay(gstab);
	zgradpulse(gzlvl2,gt2);
	delay(tau_a-rof1-gt2-gstab);
		}
		else
		{
	delay(tau_a-rof1-gt2-gstab);
	zgradpulse(gzlvl2,gt2);
        delay(gstab);
		}
	}
delay(d2/2.0);
	delay(rof2);	
status(C);
	startacq(getval("alfa"));


loop(v10,v11);
//acquire a chunk of data
	sample((droppts1+npoints+droppts2)/sw);
	recoff();	
				//switch between BIRDmode options
//shaped selective 180 on all passive spins
if (BIRDmode[0]=='n')
{
	obspower(pwr180_p);
	obsunblank();

//setup phase sequencing
	getelem(t6,v11,v7);
	if (kp_scyc[0]=='t')
	{
	xmtrphase(v7);
	}
	else
	{
	add(v7,v4,v24);
	}
//apply the next PFG level
	mod4(v11,v12);
	delay(tau_r-50.0e-9);
	if ((kp_gmult!=0.0) && (gzlvl7!=0.0))	delay(ACQ_gstab+(pw180_p+kp_pfgtc)/kp_gmult);
	ifzero(v12);
	 zgradpulse(1.0*ACQ_gzlvl1,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v12);
	ifrtEQ(v12,one,v13);
	 zgradpulse(1.0*ACQ_gzlvl2,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,two,v13);
	 zgradpulse(1.0*ACQ_gzlvl3,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,three,v13);
	 zgradpulse(1.0*ACQ_gzlvl4,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);

	if ((kp_gmult!=0.0) && (gzlvl7!=0.0))	
	{ 
	rgradient('z',gzlvl7);
	delay(kp_pfgtc-rof1);
	shaped_pulse(shp_p,pw180_p,v24,rof1,0.0);
	rgradient('z',0.0);
	delay(ACQ_gstab);
	rgradient('z',-1.0*kp_gmult*gzlvl7);
	delay((pw180_p+kp_pfgtc)/kp_gmult);
	rgradient('z',0.0);
	}
	else
	{
	shaped_pulse(shp_p,pw180_p,v24,rof1,rof1);
	}

	if (ACQ_gstab>tau_r)
	{
	delay(tau_r-rof3);
	ifzero(v12);
	 zgradpulse(-1.0*ACQ_gzlvl1,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v12);
	ifrtEQ(v12,one,v13);
	 zgradpulse(-1.0*ACQ_gzlvl2,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,two,v13);
	 zgradpulse(-1.0*ACQ_gzlvl3,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,three,v13);
	 zgradpulse(-1.0*ACQ_gzlvl4,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	}
	else
	{
	ifzero(v12);
	 delay(ACQ_gstab);
	 zgradpulse(-1.0*ACQ_gzlvl1,ACQ_gt1);
	endif(v12);
	ifrtEQ(v12,one,v13);
	 delay(ACQ_gstab);
	 zgradpulse(-1.0*ACQ_gzlvl2,ACQ_gt1);
	endif(v13);
	ifrtEQ(v12,two,v13);
	 delay(ACQ_gstab);
	 zgradpulse(-1.0*ACQ_gzlvl3,ACQ_gt1);
	endif(v13);
	ifrtEQ(v12,three,v13);
	 delay(ACQ_gstab);
	 zgradpulse(-1.0*ACQ_gzlvl4,ACQ_gt1);
	endif(v13);
	delay(tau_r-rof3);
	}
}
//softWATERGATE version
	if (BIRDmode[0]=='w')
	{
	obspower(pwr90_w);
	if (pplvlf!=4095.0) obspwrf(4095.0);
	obsunblank();
//setup phase sequencing
	getelem(t6,v11,v7);
	if (kp_scyc[0]=='t')
	{
	xmtrphase(v7);
	}
	else
	{
	add(v7,v14,v34);
	add(v7,v15,v35);
	}
//apply the next PFG level
	mod4(v11,v12);
	delay(tau_r-50.0e-9);
	ifzero(v12);
	 zgradpulse(1.0*ACQ_gzlvl1,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v12);
	ifrtEQ(v12,one,v13);
	 zgradpulse(1.0*ACQ_gzlvl2,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,two,v13);
	 zgradpulse(1.0*ACQ_gzlvl3,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,three,v13);
	 zgradpulse(1.0*ACQ_gzlvl4,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);

	if ((kp_gmult!=0.0) && (gzlvl7!=0.0))	
	{ 
	rgradient('z',gzlvl7);
	delay(kp_pfgtc-rof1);
	shaped_pulse(shp_w,pw90_w,v35,rof1,0.0);
	rgradient('z',0.0);
	delay(rof1-50.0e-9);	
	obspower(pplvl);
	if (pplvlf!=4095.0) obspwrf(pplvlf);	
	delay(ACQ_gstab);
	rgpulse(pp,v34,rof1,0.0);
	obspower(pwr90_w);
	if (pplvlf!=4095.0) obspwrf(4095.0);
	delay(rof1-50.0e-9);
	delay(ACQ_gstab);
	rgradient('z',gzlvl7);
	delay(kp_pfgtc-rof1);
	shaped_pulse(shp_w,pw90_w,v35,rof1,0.0);
	rgradient('z',0.0);
	delay(rof1);
	}
	else
	{
	shaped_pulse(shp_w,pw90_w,v35,rof1,0.0);
delay(kp_del);
	obspower(pplvl);
	if (pplvlf!=4095.0) obspwrf(pplvlf);	
	delay(rof1-50.0e-9);
	rgpulse(pp,v34,rof1,0.0);
	obspower(pwr90_w);
	if (pplvlf!=4095.0) obspwrf(4095.0);
	delay(rof1-50.0e-9);
delay(kp_del);
	shaped_pulse(shp_w,pw90_w,v35,rof1,rof1);
	}

	if (ACQ_gstab>tau_r)
	{
	delay(tau_r-rof3);
	ifzero(v12);
	 zgradpulse(-1.0*ACQ_gzlvl1,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v12);
	ifrtEQ(v12,one,v13);
	 zgradpulse(-1.0*ACQ_gzlvl2,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,two,v13);
	 zgradpulse(-1.0*ACQ_gzlvl3,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,three,v13);
	 zgradpulse(-1.0*ACQ_gzlvl4,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	}
	else
	{
	ifzero(v12);
	 delay(ACQ_gstab);
	 zgradpulse(-1.0*ACQ_gzlvl1,ACQ_gt1);
	endif(v12);
	ifrtEQ(v12,one,v13);
	 delay(ACQ_gstab);
	 zgradpulse(-1.0*ACQ_gzlvl2,ACQ_gt1);
	endif(v13);
	ifrtEQ(v12,two,v13);
	 delay(ACQ_gstab);
	 zgradpulse(-1.0*ACQ_gzlvl3,ACQ_gt1);
	endif(v13);
	ifrtEQ(v12,three,v13);
	 delay(ACQ_gstab);
	 zgradpulse(-1.0*ACQ_gzlvl4,ACQ_gt1);
	endif(v13);
	delay(tau_r-rof3);
	}


	}
//BIRD version
	if (BIRDmode[0]=='b')
	{
	obspower(tpwr);
	obspwrf(tpwrf);
	obsunblank();
//setup phase sequencing
	getelem(t6,v11,v7);
	if (kp_scyc[0]=='t')
	{
	xmtrphase(v7);
	dcplrphase(v7);
	}
	else
	{
	add(v7,v21,v21);
	add(v7,v22,v22);
	}
//apply the next PFG level
	mod4(v11,v12);
	delay(tau_r-50.0e-9);
	ifzero(v12);
	 zgradpulse(1.0*ACQ_gzlvl1,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v12);
	ifrtEQ(v12,one,v13);
	 zgradpulse(1.0*ACQ_gzlvl2,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,two,v13);
	 zgradpulse(1.0*ACQ_gzlvl3,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,three,v13);
	 zgradpulse(1.0*ACQ_gzlvl4,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);

	delay(2.0*pwx+2.0*rof1);   
	rgpulse(pw,v21,rof1,rof1);		
	decpower(pwxlvl);		
	delay(2.0*tau-50.0e-9-2.0*rof1);						
	simpulse(2.0*pw,2.0*pwx,v22,v22,rof1,rof1);	
	delay(2.0*tau-2.0*rof1);
	rgpulse(pw,v21,rof1,rof1);
	decrgpulse(2.0*pwx,v22,rof1,rof1);  	

	ifzero(v12);
	 zgradpulse(-1.0*ACQ_gzlvl1,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v12);
	ifrtEQ(v12,one,v13);
	 zgradpulse(-1.0*ACQ_gzlvl2,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,two,v13);
	 zgradpulse(-1.0*ACQ_gzlvl3,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	ifrtEQ(v12,three,v13);
	 zgradpulse(-1.0*ACQ_gzlvl4,ACQ_gt1);
	 delay(ACQ_gstab);
	endif(v13);
	decpower(dpwr);
	if (kp_scyc[0]=='t')
	{
	dcplrphase(zero);
	}
	delay(tau_r-50.0e-9-rof3);

	}
	rcvron();
endloop(v11);
	sample((droppts1+npoints+droppts2)/sw);
	recoff();	
	endacq();	
	
delay(0.05);
	if ( (lkgate_flg[0] == 'y') || (lkgate_flg[0] == 'k') )  lk_sample();
delay(0.05);

}



