pulsesequence() { double pd, seqtime; double mintDELTA,ted1,ted2,gf; double restol, resto_local; init_mri(); /****needed ****/ restol=getval("restol"); //local frequency offset roff=getval("roff"); //receiver offset init_rf(&p1_rf,p1pat,p1,flip1,rof1,rof2); /* hard pulse */ calc_rf(&p1_rf,"tpwr1","tpwr1f"); init_rf(&p2_rf,p2pat,p2,flip2,rof1,rof2); /* hard pulse */ calc_rf(&p2_rf,"tpwr2","tpwr2f"); gf=1.0; if(diff[0] == 'n') gf=0; int vph180 = v2; /* Phase of 180 pulse */ mintDELTA = tdelta + trise + rof1 + p2 + rof2; if(tDELTA <= mintDELTA) { abort_message("%s: tDELTA too short. Min tDELTA = %f ms",seqfil,mintDELTA*1e3); } ted1 = tDELTA - tdelta + trise + p2 + rof1 + rof2; te = p1/2 + rof2 + tdelta + trise + ted1 + rof1 + p2/2; /* first half-te */ ted2 = te - p2/2 - rof2 - tdelta - trise; if((ted1 <= 0)||(ted2 <= 0) ) { abort_message("%s: tDELTA too short. Min tDELTA = %f ms",seqfil,mintDELTA*1e3); } te = te*2.0; putvalue("te",te); seqtime = at+(p1/2.0)+rof1+te; pd = tr - seqtime; /* predelay based on tr */ if (pd <= 0.0) { abort_message("%s: Requested tr too short. Min tr = %f ms",seqfil,seqtime*1e3); } resto_local=resto-restol; status(A); rotate(); delay(pd); xgate(ticks); /* --- observe period --- */ obsoffset(resto_local); obspower(p1_rf.powerCoarse); obspwrf(p1_rf.powerFine); shapedpulse(p1pat,p1,oph,rof1,rof2); obl_gradient(0,0,gdiff*gf); /* x,y,z gradients selected via orient */ delay(tdelta); zero_all_gradients(); delay(trise); delay(ted1); obspower(p2_rf.powerCoarse); obspwrf(p2_rf.powerFine); settable(t2,2,ph180); /* initialize phase tables and variables */ getelem(t2,ct,v6); /* 180 deg pulse phase alternates +/- 90 off the rcvr */ add(oph,v6,vph180); /* oph=zero */ shapedpulse(p2pat,p2,vph180,rof1,rof2); obl_gradient(0,0,gdiff); /* x,y,z gradients selected via orient */ delay(tdelta); zero_all_gradients(); delay(trise); delay(ted2); startacq(alfa); acquire(np,1.0/sw); endacq(); }
pulsesequence() { /*******************************************************/ /* Internal variable declarations */ /*******************************************************/ double predelay; double agss,grate,gssint, gssrint; double t_after, acq_delay, min_tr; double t_rampslice, t_plateau_sr, t_plateau_min, t_ramp_sr; double slice_offset,f_offset; double pss0; char slice_select[MAXSTR]; initparms_sis(); /* Sets default state of receiver to ON */ /*- will be obsolete on future VNMR versions */ /***************************/ /* initialize variables */ /***************************/ gssf = 1.0; /* slice select fractional refocus */ predelay = PREDELAY; /* define predelay [s] */ acq_delay = ACQ_DELAY; /* time delay between end of refocus and acq */ slice_offset = 0.0; /* force slice offset to 0.0 [cm] */ t_rampslice = 0.0; /* slice select ramp time */ t_ramp_sr = 0.0; /* slice refocusing ramp time */ t_plateau_min = 0.0005; /* min time slice refocusing plateau */ t_plateau_sr =0.0; /* slice refocusing plateau time*/ f_offset=getval("resto"); agss = fabs(gss); /* absolute slice select gradient */ gssr = gmax; /* maximum slice refocusing gradient */ grate = trise/gmax; /* define gradient slew rate [s*cm/g] trise = gradient rise time gmax = maximum gradient strength [G/cm] */ ticks = IGNORE_TRIGGER; /* ignore trigger pulses */ /***************************/ /* Get parameter */ /***************************/ at = getval("at"); pss0 = getval("pss0"); getstr("slice_select",slice_select); /* slice select flag [y] = ON, [n] = OFF */ /*******************************************************/ /* Slice Select gradient area */ /*******************************************************/ t_rampslice = grate * agss; gssint = (agss*p1/2.0) + (agss*t_rampslice/2.0); gssrint=gssint; /******************************************************* * Calculate slice refocussing gradient * *******************************************************/ t_plateau_sr = (gssint / gssr) - trise; if (t_plateau_sr <= 0.0) /* traingular gradients */ { t_plateau_sr = 0.0; gssr = sqrt(gssint / grate); } t_ramp_sr = gssr * grate; /* ramp time for refocusing gradient*/ gssrint = (gssr * t_plateau_sr) + (t_ramp_sr * gssr); /*************************************************************************** * timing calculation * ***************************************************************************/ if (slice_select[0] == 'y') { t_after = tr - (predelay + p1 + t_plateau_sr + at + acq_delay + 2* (t_rampslice + t_ramp_sr)); min_tr = predelay + p1 + t_plateau_sr + at + acq_delay + 2* (t_rampslice + t_ramp_sr); } else { t_after = tr - (predelay + p1 + at + acq_delay ); min_tr = predelay + p1 + at + acq_delay ; } if (t_after < 0.0) { abort_message("Requested repetition time (TR) too short. Min tr = %.f[ms]\n",min_tr*1000); } /******************************************************/ /* */ /* S T A R T */ /* P U L S E S E Q U E N C E */ /* */ /******************************************************/ obspower(tpwr1); /* set tranmitter power */ /*************************************************************************** * Predelay * ***************************************************************************/ obsoffset(f_offset); /* set transmitter offset */ delay(predelay); xgate(ticks); /* set gating */ if (slice_select[0] == 'y') { /*************************************************************************** * Slice select gradient & RF pulse * ***************************************************************************/ obl_gradient(0.0,0.0,gss); /* slice select gradient */ delay(t_rampslice); /* delay - time to ramp up gradient */ shaped_pulse(p1pat,p1,oph,rof1,rof1); zero_all_gradients(); /* force all gradients back to 0 [G/cm] */ delay(t_rampslice); /* time to ramp down gradient */ /*************************************************************************** * Slice refocus gradient * ***************************************************************************/ obl_gradient(0.0,0.0,-gssr); /* slice refocus gradient */ delay(t_ramp_sr+t_plateau_sr); /* ramp up of refocus gradient */ zero_all_gradients(); /* force refocus gradient back to 0 [G/cm] */ delay(t_ramp_sr); /* time to ramp down gradient */ } else { shaped_pulse(p1pat,p1,oph,rof1,rof1); } /*************************************************************************** * Pre-acquire delay * ***************************************************************************/ delay(acq_delay); /*************************************************************************** * Acquire echo * ***************************************************************************/ startacq(alfa); acquire(np,1.0/sw); /* acquire FID */ endacq(); delay(t_after); /* time padding to fill TR */ /******************************************************/ /* */ /* E N D */ /* P U L S E S E Q U E N C E */ /* */ /******************************************************/ }