00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
#include "seq-se.h"
00036
#include "event-rfpulse.h"
00037
#include "event-precession.h"
00038
#include "event-acquisition.h"
00039
#include "seq-mpi.h"
00040
00041
void SeqSpinEcho1D_0(SEQPARAM *seqparam,
EXPERIENCE3D*expr);
00042
void SeqSpinEcho2D_0(SEQPARAM *seqparam,
EXPERIENCE3D*expr);
00043
void SeqSpinEcho3D_0(SEQPARAM *seqparam,
EXPERIENCE3D*expr);
00044
00054 PPPVOLUME_COMPLEX_DOUBLE SeqSpinEcho1D(SEQPARAM *seqparam,
EXPERIENCE3D*expr)
00055 {
00056
mpi_job(seqparam, expr,
SeqSpinEcho1D_0);
00057
NormalizeRFSignal(expr);
00058
return(
GetSignalRFComplexFromExperience(expr));
00059 }
00060
00070 PPPVOLUME_COMPLEX_DOUBLE SeqSpinEcho2D(SEQPARAM *seqparam,
EXPERIENCE3D*expr)
00071 {
00072
mpi_job(seqparam , expr,
SeqSpinEcho2D_0);
00073
NormalizeRFSignal(expr);
00074
return(
GetSignalRFComplexFromExperience(expr));
00075 }
00076
00086 PPPVOLUME_COMPLEX_DOUBLE SeqSpinEcho3D(SEQPARAM *seqparam,
EXPERIENCE3D*expr)
00087 {
00088
mpi_job(seqparam, expr,
SeqSpinEcho3D_0);
00089
NormalizeRFSignal(expr);
00090
return(
GetSignalRFComplexFromExperience(expr));
00091 }
00092
00101 void CheckTimesSE(
double tacq,
double te,
double tr)
00102 {
00103
int f=0;
00104
if((tacq<te)&&(tr>te+tacq/2.0))f=1;
00105
if(f==0){
00106
FPRINTF(stderr,
"Bad values for your sequence SE: Tacq=%g, Te=%g, Tr=%g\n",tacq, te, tr);
00107 exit(0);
00108 }
00109 }
00110
00119 void SeqSpinEcho1D_0(SEQPARAM *seqparam,
EXPERIENCE3D*expr)
00120 {
00121
int ntx;
00122
double fovx;
00123
double te,tr,tacq;
00124
double gx,gy,gz;
00125
double acq_delay,timp;
00126
int npy, npz;
00127
int i;
00128
EVENT* event, event_r;
00129 event = &event_r;
00130
00131 printf(
"Starting SeqSpinEcho1D\n");
00132 ntx = expr->
ntx;
00133 tacq = expr->
readout_time*1.e+3;
00134 fovx = expr->
fovx;
00135
00136 te = seqparam->te;
00137 tr = seqparam->tr;
00138
00139
CheckTimesSE(tacq,te,tr);
00140
00141 acq_delay = (te/2) - (tacq/2. + tacq/2./(ntx-1));
00142 timp=0.3;
00143 gx=(ntx-2.)/tacq/
G_kHz_G/fovx;
00144 gy=0.0;
00145 gz=0.0;
00146 npy=0;npz=0;
00147
00148
SetSpoilingFlag(event,
ACTIVE);
00149
DoWaiting(expr,event,
ATT_INIT);
00150
ResetToExperience(expr);
00151
00152
for(i=0;i<10;i++)
00153 {
00154
DoPulseRect(expr,event, 90., timp);
00155
DoGradient(expr,event, te/2.,gx,gy,gz);
00156
DoPulseRect(expr,event,180.,timp);
00157
DoGradient(expr,event, acq_delay+tacq,gx,gy,gz);
00158
DoWaiting(expr,event,tr-te-tacq/2.0);
00159 }
00160
00161
DoPulseRect(expr,event, 90.,timp);
00162
DoGradient(expr,event, te/2.,gx,gy,gz);
00163
DoPulseRect(expr,event,180.,timp);
00164
DoAcqFrequenceX( expr,event, gx, npy, npz,acq_delay,
MINUS);
00165
00166 printf(
"Ending SeqSpinEcho1D\n");
00167 }
00168
00177 void SeqSpinEcho2D_0(SEQPARAM *seqparam,
EXPERIENCE3D*expr)
00178 {
00179
int ntx,nty;
00180
double fovx,fovy;
00181
double te,tr,tacq,timp,acq_delay,tg;
00182
double gx,gy,gz,gp;
00183
int npy, npz;
00184
EVENT* event, event_r;
00185 event = &event_r;
00186
00187 printf(
"Starting SeqSpinEcho2D \n");
00188 ntx = expr->
ntx;
00189 nty = expr->
nty;
00190 tacq = expr->
readout_time*1.e+3;
00191 fovx = expr->
fovx;
00192 fovy = expr->
fovy;
00193
00194 te = seqparam->te;
00195 tr = seqparam->tr;
00196
00197
CheckTimesSE(tacq,te,tr);
00198 timp=0.3;
00199 acq_delay = (te/2) - (tacq/2. + tacq/2./(ntx-1));
00200 tg = te/2.;
00201 gx = (ntx-2.)/tacq/
G_kHz_G/fovx;
00202 gy = 2*M_PI*(nty-1)/
G_rad_G/fovy/(tg/1000);
00203 gz = 0.0;
00204 npz= 0;
00205
00206
SetSpoilingFlag(event,
ACTIVE);
00207
00208
DoWaiting(expr,event,
ATT_INIT);
00209
for (npy = 0; npy < expr->
nty; npy++)
00210 {
00211
ResetToExperience(expr);
00212
DoPulseRect(expr,event, 90.,timp);
00213
00214 gp = (gy) * (npy - (nty) / 2) / (nty);
00215
DoGradient(expr,event,tg,gx,gp,gz);
00216
00217
DoPulseRect(expr,event,180.,timp);
00218
00219
DoAcqFrequenceX( expr,event, gx, npy, npz,acq_delay,
MINUS);
00220
00221
DoWaiting(expr,event,tr-te-tacq/2.0);
00222 }
00223 printf(
"Ending SeqSpinEcho2D\n");
00224 }
00225
00234 void SeqSpinEcho3D_0(SEQPARAM *seqparam,
EXPERIENCE3D*expr)
00235 {
00236
int ntx,nty,ntz;
00237
double fovx,fovy,fovz;
00238
double te,tr,tacq;
00239
double gx,gy,gz,timp;
00240
double acq_delay;
00241
int npy,npz;
00242
EVENT* event, event_r;
00243 event = &event_r;
00244
00245 printf(
"Starting SeqSpinEcho3D\n");
00246 ntx = expr->
ntx;
00247 nty = expr->
nty;
00248 ntz = expr->
ntz;
00249 tacq = expr->
readout_time*1.e+3;
00250 fovx = expr->
fovx;
00251 fovy = expr->
fovy;
00252 fovz = expr->
fovz;
00253
00254 te = seqparam->te;
00255 tr = seqparam->tr;
00256
00257
CheckTimesSE(tacq,te,tr);
00258
00259 acq_delay = (te/2) - (tacq/2. + tacq/2./(ntx-1));
00260
00261 gx=(ntx-2.)/tacq/
G_kHz_G/fovx;
00262 gy=2*M_PI*(nty-1)/
G_rad_G/fovy/(te/2./1000);
00263 gz=2*M_PI*(ntz-1)/
G_rad_G/fovz/(te/2./1000);
00264 timp=0.3;
00265
00266
SetSpoilingFlag(event,
ACTIVE);
00267
00268
DoWaiting(expr,event,
ATT_INIT);
00269
for (npy = 0; npy < expr->
nty; npy++) {
00270
for (npz = 0; npz < expr->
ntz; npz++) {
00271
ResetToExperience(expr);
00272
DoPulseRect(expr,event, 90., timp);
00273
DoGradient( expr,event, te/2.,gx,
00274 (gy) * (npy - nty / 2) / nty,
00275 (gz) * (npz - ntz / 2) / ntz);
00276
DoPulseRect(expr,event,180.,timp);
00277
DoAcqFrequenceX( expr,event, gx, npy, npz,acq_delay,
MINUS);
00278
DoWaiting(expr,event,tr-te-tacq/2.0);
00279 }}
00280 printf(
"Ending SeqSpinEcho3D\n");
00281 }
00282