1seq=mr.Sequence(); % Create a new sequence object
2fov=260e-3; Nx=320; % Define FOV and resolution
3alpha=10; % flip angle
4sliceThickness=3e-3; % slice
5TE=8e-3; % TE; give a vector here to have multiple TEs (e.g. for field mapping)
6TR=20e-3; % only a single value for now
7Nr=256; % number of radial spokes
8Ndummy=20; % number of dummy scans
9delta= pi / Nr; % angular increment; try golden angle pi*(3-5^0.5) or 0.5 of it
11% more in-depth parameters
12% RF spoiling increment = 84° for smoother transient decay, https://doi.org/10.1002/mrm.1910350216, 169° for diffusion independent rf spoiling in steady-state https://doi.org/10.1371/journal.pone.0324455
13rfSpoilingInc=84; % RF spoiling increment
15% set system limits
16sys = mr.opts('MaxGrad', 28, 'GradUnit', 'mT/m', ...
17 'MaxSlew', 120, 'SlewUnit', 'T/m/s', 'rfRingdownTime', 20e-6, ...
18 'rfDeadTime', 100e-6, 'adcDeadTime', 10e-6);
20% Create alpha-degree slice selection pulse and gradient
21[rf, gz] = mr.makeSincPulse(alpha*pi/180,'Duration',4e-3,...
22 'SliceThickness',sliceThickness,'apodization',0.5,'timeBwProduct',4,'system',sys,...
23 'use','excitation');
25% Define other gradients and ADC events
26deltak=1/fov;
27gx = mr.makeTrapezoid('x','FlatArea',Nx*deltak,'FlatTime',6.4e-3/5,'system',sys);
28adc = mr.makeAdc(Nx,'Duration',gx.flatTime,'Delay',gx.riseTime,'system',sys);
29gxPre = mr.makeTrapezoid('x','Area',-gx.area/2-deltak/2,'Duration',2e-3,'system',sys);
30gzReph = mr.makeTrapezoid('z','Area',-gz.area/2,'Duration',2e-3,'system',sys);
32% gradient spoiling
33gxSpoil=mr.makeTrapezoid('x','Area',0.5*Nx*deltak,'system',sys);
34gzSpoil=mr.makeTrapezoid('z','Area',4/sliceThickness,'system',sys);
36% Calculate timing
37delayTE=ceil((TE - mr.calcDuration(gxPre) - gz.fallTime - gz.flatTime/2 ...
38 - mr.calcDuration(gx)/2)/seq.gradRasterTime)*seq.gradRasterTime;
39delayTR=ceil((TR - mr.calcDuration(gxPre) - mr.calcDuration(gz) ...
40 - mr.calcDuration(gx) - delayTE)/seq.gradRasterTime)*seq.gradRasterTime;
41assert(all(delayTR>=mr.calcDuration(gxSpoil,gzSpoil)));
43rf_phase=0;
44rf_inc=0;
46for i=(-Ndummy):Nr
47 for c=1:length(TE)
48 rf.phaseOffset=rf_phase/180*pi;
49 adc.phaseOffset=rf_phase/180*pi;
50 rf_inc=mod(rf_inc+rfSpoilingInc, 360.0);
51 rf_phase=mod(rf_phase+rf_inc, 360.0);
52 %
53 seq.addBlock(rf,gz);
54 phi=delta*(i-1);
55 seq.addBlock(mr.rotate('z',phi,gxPre,gzReph));
56 seq.addBlock(mr.makeDelay(delayTE(c)));
57 if (i>0)
58 seq.addBlock(mr.rotate('z',phi,gx,adc));
59 else
60 seq.addBlock(mr.rotate('z',phi,gx));
61 end
62 seq.addBlock(mr.rotate('z',phi,gxSpoil,gzSpoil,mr.makeDelay(delayTR)));
63 end
64end
67%% check whether the timing of the sequence is correct
68[ok, error_report]=seq.checkTiming;
70if (ok)
71 fprintf('Timing check passed successfully\n');
72else
73 fprintf('Timing check failed! Error listing follows:\n');
74 fprintf([error_report{:}]);
75 fprintf('\n');
76end
78%%
79seq.setDefinition('FOV', [fov fov sliceThickness]);
80seq.setDefinition('Name', 'gre_rad');
82seq.write('gre_rad.seq') % Write to pulseq file