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
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
#include "seq-tf.h"
00047
#include "event-rfpulse.h"
00048
#include "event-precession.h"
00049
#include "event-acquisition.h"
00050
#include "experience.h"
00051
#include "seq-mpi.h"
00052
00053
void SeqTrueFisp1D_0(SEQPARAM *seqparam,
EXPERIENCE3D* expr);
00054
void SeqTrueFisp2D_0(SEQPARAM *seqparam,
EXPERIENCE3D* expr);
00055
void SeqTrueFisp3D_0(SEQPARAM *seqparam,
EXPERIENCE3D* expr);
00056
00066
PPPVOLUME_COMPLEX_DOUBLE
00067 SeqTrueFisp1D(SEQPARAM *seqparam,
EXPERIENCE3D* expr)
00068 {
00069
mpi_job(seqparam, expr,
SeqTrueFisp1D_0);
00070
NormalizeRFSignal(expr);
00071
return(
GetSignalRFComplexFromExperience(expr));
00072 }
00073
00083
PPPVOLUME_COMPLEX_DOUBLE
00084 SeqTrueFisp2D(SEQPARAM *seqparam,
EXPERIENCE3D* expr)
00085 {
00086
mpi_job(seqparam, expr,
SeqTrueFisp2D_0);
00087
NormalizeRFSignal(expr);
00088
return(
GetSignalRFComplexFromExperience(expr));
00089 }
00090
00100
PPPVOLUME_COMPLEX_DOUBLE
00101 SeqTrueFisp3D(SEQPARAM *seqparam,
EXPERIENCE3D* expr)
00102 {
00103
mpi_job(seqparam, expr,
SeqTrueFisp3D_0);
00104
NormalizeRFSignal(expr);
00105
return(
GetSignalRFComplexFromExperience(expr));
00106 }
00107
00116 void CheckTimesTF(
double tacq,
double tr,
double twait)
00117 {
00118
int f=0;
00119
if((tr>=2*tacq)&&(twait>=0.))f=1;
00120
if(f==0){
00121
FPRINTF(stderr,
"Bad values for your sequence TF: Tacq=%g, Tr=%g, Twait=%g, \n",tacq, tr, twait);
00122 exit(0);
00123 }
00124 }
00125
00134 void SeqTrueFisp1D_0(SEQPARAM *seqparam,
EXPERIENCE3D* expr)
00135 {
00136
int i,ntx,phase,altphase;
00137
double fovx;
00138
double tr,tacq,timp,acq_delay,tgrad,twait;
00139
double gx;
00140
double teta;
00141
int npy, npz;
00142
EVENT* entre, entre_r;
00143 entre = &entre_r;
00144
00145 printf(
"Starting SeqTrueFisp1D \n");
00146
00147 ntx = expr->
ntx;
00148 tacq = expr->
readout_time*1.e+3;
00149 fovx = expr->
fovx;
00150
00151 tr = seqparam->tr;
00152 teta = seqparam->teta;
00153
00154
CheckTimesTF(tacq,tr/2.,tr);
00155 timp=0.3;
00156 acq_delay = 0;
00157 tgrad=(tacq)/2.;
00158 twait=(tr-2*tgrad-tacq)/2;
00159
00160 gx=(ntx-1)/tacq/
G_kHz_G/fovx;
00161 npy=0;npz=0;
00162
00163
SetSpoilingFlag(entre,
INACTIVE);
00164
DoWaiting(expr,entre,
ATT_INIT);
00165
00166 altphase=-1;
00167 phase = 1;
00168
00169
for (i = 0; i<10*ntx; i++)
00170 {
00171
DoPulseRect(expr,entre,teta * phase,timp);
00172
DoWaiting(expr,entre,tr);
00173 phase= phase * altphase;
00174 }
00175
ResetToExperience(expr);
00176
DoPulseRect(expr,entre,teta * phase,timp);
00177
DoWaiting(expr,entre,twait);
00178
DoGradient( expr,entre,tgrad,-gx,0.0,0.0);
00179
DoAcqFrequenceX(expr,entre, +gx, npy, npz,acq_delay, phase);
00180
00181 printf(
"Ending SeqTrueFisp1D \n");
00182 }
00183
00192 void SeqTrueFisp2D_0(SEQPARAM *seqparam,
EXPERIENCE3D* expr)
00193 {
00194
int ntx,nty, phase, altphase;
00195
double fovx,fovy;
00196
double tr,tacq,timp,acq_delay,tgrad,twait;
00197
double gx,gy,gz,gpy;
00198
double teta;
00199
int npy, npz;
00200
EVENT* entre, entre_r;
00201 entre = &entre_r;
00202
00203 printf(
"Starting SeqTrueFisp2D \n");
00204 ntx = expr->
ntx;
00205 nty = expr->
nty;
00206 tacq = expr->
readout_time*1.e+3;
00207 fovx = expr->
fovx;
00208 fovy = expr->
fovy;
00209
00210 tr = seqparam->tr;
00211 teta = seqparam->teta;
00212
00213 timp=0.3;
00214 acq_delay = 0;
00215 tgrad=(tacq)/2.;
00216 twait=(tr-2*tgrad-tacq)/2;
00217
00218
CheckTimesTF(tacq,tr,twait);
00219
00220 gx=(ntx-1.)/tacq/
G_kHz_G/fovx;
00221 gy=2*M_PI*(nty-1)/
G_rad_G/fovy/(tgrad/1000);
00222 gz=0.0;
00223 npz=0;
00224
00225
SetSpoilingFlag(entre,
INACTIVE);
00226
DoWaiting(expr,entre,
ATT_INIT);
00227
00228 altphase=-1;
00229 phase = 1;
00230
00231
00232
for (npy = 0; npy < 10 * expr->
nty; npy++)
00233 {
00234
DoPulseRect(expr,entre,teta * phase,timp);
00235
DoWaiting(expr,entre,tr);
00236 phase= phase * altphase;
00237 }
00238
00239
for (npy = 0; npy < expr->
nty; npy++)
00240 {
00241
ResetToExperience(expr);
00242
DoPulseRect(expr,entre,teta * phase,timp);
00243
DoWaiting(expr,entre,twait);
00244 gpy = (gy) * (npy - nty / 2.) / nty;
00245
00246
DoGradient( expr,entre,tgrad,-gx,-gpy,0.0);
00247
DoAcqFrequenceX(expr,entre, +gx, npy, npz,acq_delay, phase);
00248
DoGradient( expr,entre,tgrad,-gx,+gpy,0.0);
00249
DoWaiting(expr,entre,twait);
00250 phase= phase * altphase;
00251 }
00252 printf(
"Ending SeqTrueFisp2D\n");
00253 }
00254
00263 void SeqTrueFisp3D_0(SEQPARAM *seqparam,
EXPERIENCE3D* expr)
00264 {
00265
int ntx,nty,ntz, phase, altphase;
00266
double fovx,fovy,fovz;
00267
double tr,tacq,timp,acq_delay,tgrad,twait;
00268
double gx,gy,gz,gpy,gpz;
00269
double teta;
00270
int npy,npz;
00271
EVENT* entre, entre_r;
00272 entre = &entre_r;
00273
00274 printf(
"Starting SeqTrueFisp3D \n");
00275 ntx = expr->
ntx;
00276 nty = expr->
nty;
00277 ntz = expr->
ntz;
00278 tacq = expr->
readout_time*1.e+3;
00279 fovx = expr->
fovx;
00280 fovy = expr->
fovy;
00281 fovz = expr->
fovz;
00282
00283 tr = seqparam->tr;
00284 teta = seqparam->teta;
00285
00286 timp=0.3;
00287 acq_delay = 0;
00288 tgrad=(tacq)/2.;
00289 twait=(tr-2*tgrad-tacq)/2;
00290
00291
CheckTimesTF(tacq,tr,twait);
00292
00293 gx=(ntx-1.)/tacq/
G_kHz_G/fovx;
00294 gy=2*M_PI*(nty-1)/
G_rad_G/fovy/(tgrad/1000);
00295 gz=2*M_PI*(ntz-1)/
G_rad_G/fovz/(tgrad/1000);
00296
00297
SetSpoilingFlag(entre,
INACTIVE);
00298
DoWaiting(expr,entre,
ATT_INIT);
00299
00300 altphase=-1;
00301 phase = 1;
00302
00303
00304
for (npy = 0; npy < 10 * expr->
nty; npy++)
00305 {
00306
DoPulseRect(expr,entre,teta * phase,timp);
00307
DoWaiting(expr,entre,tr);
00308 phase= phase * altphase;
00309 }
00310
00311
for (npy = 0; npy < expr->
nty; npy++) {
00312
for (npz = 0; npz < expr->
ntz; npz++)
00313 {
00314
ResetToExperience(expr);
00315
DoPulseRect(expr,entre,teta * phase,timp);
00316
DoWaiting(expr,entre,twait);
00317 gpy = (gy) * (npy - nty / 2.) / nty;
00318 gpz = (gz) * (npz - ntz / 2.) / ntz;
00319
00320
DoGradient( expr,entre,tgrad,-gx,-gpy,-gpz);
00321
DoAcqFrequenceX(expr,entre, +gx, npy, npz,acq_delay, phase);
00322
DoGradient( expr,entre,tgrad,-gx,+gpy,+gpz);
00323
DoWaiting(expr,entre,twait);
00324 phase= phase * altphase;
00325 }}
00326 printf(
"Ending SeqTrueFisp3D\n");
00327 }
00328