/* 
Pulse sequence code for pure shift homonuclear 2DJ Spectroscopy using interferogram style PSYCHE with extra ZQS elements 

Developed By NMR Methodology Group
School of Chemistry, University of Manchester
United Kingdom
Dec 2016

*/


#include <standard.h>

//phase cycle
static int	 ph1[16] = {0,2,0,2, 0,2,0,2, 0,2,0,2,0,2,0,2},		//v1 	excitation 90
		 ph2[16] = {0,0,1,1, 0,0,1,1, 0,0,1,1,0,0,1,1},		//v2 	2dj 180
		 ph3[16] = {0,2,0,2, 0,2,0,2, 0,2,0,2,0,2,0,2},		//v3	1st 90 of ZQF
		 ph4[16] = {0,2,0,2, 0,2,0,2, 0,2,0,2,0,2,0,2},		//v4	final 90 of ZQF
		 ph5[16] = {0,2,2,0, 2,0,0,2, 2,0,0,2,0,2,2,0},		//PSYCHE oph 
		 ph6[16] = {0,2,2,0, 0,2,2,0, 0,2,2,0,0,2,2,0};		//2dj oph
static int	 ph7[16] = {0,0,0,0, 1,1,1,1, 0,0,0,0,1,1,1,1},		//v7 	hard 180
		 ph8[16] = {0,0,0,0, 0,0,0,0, 1,1,1,1,1,1,1,1};		//v8 	soft 180

pulsesequence()
{

double	droppts	= getval("droppts"),	
	gt1	= getval("gt1"),	
	gzlvl1	= getval("gzlvl1"),	
	gt2	= getval("gt2"),	
	gzlvl2	= getval("gzlvl2"),	
	gt3	= getval("gt3"),	
	gzlvl3	= getval("gzlvl3"),	
    	gstab	= getval("gstab"),	
	gzlvl7	= getval("gzlvl7"),	
    	gstab0	= getval("gstab0"),	//final gstab
	hsglvl	= getval("hsglvl"),
	hsgt	= getval("hsgt"),

	gzlvl4 = getval("gzlvl4"),
        gt4 = getval("gt4"),
	zqfpw1 = getval("zqfpw1"),
	zqfpwr1 = getval("zqfpwr1"),
	gzlvlzq1 = getval("gzlvlzq1"),

	gzlvl5 = getval("gzlvl5"),
        gt5 = getval("gt5"),
	zqfpw2 = getval("zqfpw2"),
	zqfpwr2 = getval("zqfpwr2"),
	gzlvlzq2 = getval("gzlvlzq2"),


	selpw	= getval("selpw"),	// pulse length for the PSYCHE pulse  
	selpwr	= getval("selpwr");	// power level  for the PSYCHE pulse  

int 	kpph = (int)(getval("kpph")); 	//number of steps from the phase cycle to use; set it to zero for normal experiments

int	phase2 = (int)(getval("phase2")+0.5);

char    sspul[MAXSTR], lkgate_flg[MAXSTR], pureshift[MAXSTR], Gzqfilt[MAXSTR],
	zqfpat1[MAXSTR], zqfpat2[MAXSTR], zqfpat3[MAXSTR], gradaxis[MAXSTR],
     	selshape[MAXSTR],selshape2[MAXSTR];		// pulse file for the PSYCHE pulse 

  	getstr("sspul",sspul);
  	getstr("lkgate_flg",lkgate_flg);
  	getstr("pureshift",pureshift);
	getstr("zqfpat1",zqfpat1);
	getstr("zqfpat2",zqfpat2);
	getstr("selshape",selshape);
	getstr("selshape2",selshape2);
	getstr("gradaxis",gradaxis);
	getstr("zqfpat3",zqfpat3);
	getstr("Gzqfilt",Gzqfilt);

	if (kpph==0)
	{
	settable(t1,16,ph1);
	settable(t2,16,ph2);
	settable(t3,16,ph3);
	settable(t4,16,ph4);
		if ((pureshift[0]=='y') || (pureshift[0]=='p') || (pureshift[0]=='z') )
		{ settable(t5,16,ph5); }
		else
		{ settable(t5,16,ph6); }
	settable(t7,16,ph7);
	settable(t8,16,ph8);
	}
	else
	{
	settable(t1,kpph,ph1);
	settable(t2,kpph,ph2);
	settable(t3,kpph,ph3);
	settable(t4,kpph,ph4);
		if ((pureshift[0]=='y') || (pureshift[0]=='p') || (pureshift[0]=='z') )
		{ settable(t5,kpph,ph5); }
		else
		{ settable(t5,kpph,ph6); }
	settable(t7,kpph,ph7);
	settable(t8,kpph,ph8);
	}
	
  	getelem(t1, ct, v1);		
  	getelem(t2, ct, v2);
  	getelem(t3, ct, v3);		
  	getelem(t4, ct, v4);
	getelem(t5, ct, oph);
	getelem(t7, ct, v7);
	getelem(t8, ct, v8);


	if (pureshift[0]=='z')
	{
	add(two,oph,oph);
	}

//quadrature in F1
	if (phase2 == 2) 
	{
	add(v3,one,v3);
	//add(v4,one,v4);  
	//add(oph,one,oph);
	}
	
//power limits
	if (pw>50)
	{
        printf("pw is too long..\n");
        psg_abort(1);
	}

status(A);

	obspower(tpwr);
	txphase(zero);
	obsoffset(tof);
	delay(0.0001);  

if (sspul[A] == 'y')
{
//lock gating
if (lkgate_flg[0] == 'y')  lk_hold(); /* turn lock sampling off */		

	delay(0.001);  
	zgradpulse(hsglvl*0.7,hsgt); 
  rgpulse(pw,zero,rof1,rof1);
	zgradpulse(hsglvl,hsgt); 
	delay(0.1);
}

if (lkgate_flg[0] == 'y')  lk_sample(); /* turn lock sampling on */	
	if (sspul[0]=='y') delay(d1-0.1001); else delay(d1-0.0002);
if (lkgate_flg[0] == 'y')  lk_hold(); /* turn lock sampling off */		
	delay(0.001);

status(B);

/******* excitation ************/

	rgpulse(pw, v1, rof1, rof1);   	

/******* 2dj evolution ************/
	if (gt3>0.0)
	{
	zgradpulse(gzlvl3,gt3); 
	delay(gstab);
	if ((d3/2.0)>(gt3+2.0*GRADIENT_DELAY+gstab)) delay(d3/2.0+ 2.0*pw/PI - gt3 - 2.0*GRADIENT_DELAY - gstab); 
	else delay(d3/2.0); 
	}
	else
	{
	delay(d3/2.0);
	}

	if ((pureshift[0]=='y') || (pureshift[0]=='p') || (pureshift[0]=='z') )
	{
	rgpulse(2.0*pw, v2, rof1,rof1);
	}
	else
	{
	rgpulse(2.0*pw, v2, rof1,2.0*rof1);
	}

	if (gt3>0.0)
	{
	zgradpulse(gzlvl3,gt3); 
	delay(gstab);
	if ((d3/2.0)>(gt3+2.0*GRADIENT_DELAY+gstab)) delay(d3/2.0+ 2.0*pw/PI - gt3 - 2.0*GRADIENT_DELAY - gstab); 
	else delay(d3/2.0+ 2.0*pw/PI); 
	}
	else
	{
	delay(d3/2.0 + 2.0*pw/PI);
	}


/******* pure shift evolution ************/

if ((pureshift[0]=='y') || (pureshift[0]=='p') || (pureshift[0]=='z') )
{

/******* z-filter ************/
if (Gzqfilt[0]=='y')
{
	rgpulse(pw,v3,rof1,rof1);
	obspower(zqfpwr1);
	rgradient(gradaxis[0],gzlvlzq1);
	delay(100.0e-6);
	shaped_pulse(zqfpat1,zqfpw1,zero,rof1,rof1);
	delay(100.0e-6);
	rgradient(gradaxis[0],0.0);
	obspower(tpwr);
	delay(100e-6);
	zgradpulse(gzlvl4,gt4);
	delay(gstab);
	rgpulse(pw,v4,rof1,0.0);
}
//pure shift chunks
	delay(d2/2.0);
	delay((0.25/sw1)-gt1-gstab - 2.0*GRADIENT_DELAY);		

	if (gt1>0.0)
	{
	zgradpulse(gzlvl1,gt1); 
	delay(gstab);			
	}
   	rgpulse(2.0*pw,v7,rof1,rof1);	
	obspower(selpwr);		
	delay((0.25/sw1)-gt1-gstab - 2.0*GRADIENT_DELAY - POWER_DELAY);	
	if (gt1>0.0)
	{
	zgradpulse(gzlvl1,gt1); 
	delay(gstab);
	}
	delay(gstab0);

//ZS or PSYCHE
	if (gt2>0.0)
	{
	zgradpulse(gzlvl2,gt2); 
	delay(gstab);
	}
	rgradient('z',gzlvl7);	
	shaped_pulse(selshape,selpw, v8, rof1, rof1);	   
if ((Gzqfilt[1]=='y') || (Gzqfilt[1]=='h'))
{
	if (selpwr!=zqfpwr2) obspower(zqfpwr2);
	if (gradaxis[1]=='z')
	{
	rgradient('z',gzlvlzq2);
	}
	else
	{
	rgradient('z',0.0);
	rgradient(gradaxis[1],gzlvlzq2);
	}
	shaped_pulse(zqfpat2,zqfpw2,zero,rof1,rof1);

  if (Gzqfilt[1]=='h')
  {
	rgradient(gradaxis[1],0.0);
	if (tpwr!=zqfpwr2) obspower(tpwr);
	rgpulse(2.0*pw,zero,rof1,rof1);
	if (selpwr!=tpwr) obspower(selpwr);
	rgradient('z',gzlvl7);
  }
  else
  {
	shaped_pulse(zqfpat3,zqfpw2,zero,rof1,rof1);
	if (gradaxis[1]=='z')
	{
	rgradient('z',gzlvl7);
	}
	else
	{
	rgradient(gradaxis[1],0.0);
	rgradient('z',gzlvl7);
	}
	if (selpwr!=zqfpwr2) obspower(selpwr);
  }
}
	shaped_pulse(selshape2,selpw, v8, rof1, rof1);	   
	rgradient('z',0.0);
	if (gt2>0.0)
	{
	zgradpulse(gzlvl2,gt2); 
	delay(gstab);
	}
      rcvron();
      obsblank();
	obspower(tpwr);		
	delay(gstab0-droppts/sw -POWER_DELAY);	
	delay(d2/2.0);

}

/* detection */
   status(C);
					

}




