Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
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                */
    /*                                                    */
    /******************************************************/

}