KSFoundation  [April-2021]
A platform for simpler EPIC programming on GE MR systems
KS_READTRAP Struct Reference

#include <KSFoundation.h>

Data Fields

KS_READ acq
 
float fov
 
int res
 
int rampsampling
 
int nover
 
int acqdelay
 
float paddingarea
 
float freqoffHz
 
float area2center
 
int time2center
 
KS_TRAP grad
 
KS_TRAP omega
 

Detailed Description

Composite sequence object for data readout using a trapezoid gradient

KS_READTRAP.png
KS_READTRAP


KS_READTRAP is a composite sequence object used to read out data while a trapezoid is played out, which is applicable to Cartesian, propeller and radial pulse sequences. The KS_READTRAP object is set up by calling ks_eval_readtrap(), but before calling this function, the following fields in KS_READTRAP must be set up:

  1. .fov: Desired image Field-of-View (FOV) in [mm] along the sequence board one intends to place the KS_READTRAP on (typically XGRAD)
  2. .res: Number of pixels within the FOV
  3. .acq.rbw: Receiver bandwidth (rBW) in [kHz/FOV]. Maximum is 250
  4. .rampsampling: If non-zero, data acquisition will be performed on the ramps of the trapezoid as well. This reduces the readout time, especially for high rBWs.
  5. .acqdelay: Needs to be set only if .rampsampling = 1. The .acqdelay (in [us]) will dictate the time from the start of the ramp-up until data acquisition will begin
  6. .nover: Number of overscans. If 0, a full echo will be generated (filling k-space). If > 0, fractional echo (i.e. shorter TE) will be set up with .nover number of extra sample points beyond .res/2. The total number of samples will be .res/2 + .nover. Values of .nover between 1 and about 16 should be avoided since half Fourier reconstruction methods will likely have difficulties
  7. .freqoffHz: Static offset frequency in Hz. Can be used to e.g. center fat instead of water

If the KS_READTRAP object is initialized with KS_INIT_READTRAP, the fields .nover, .rampsampling, .acqdelay and .freqoffHz will all be zero (steps 4-7 can be skipped)

Based on the information in the KS_READTRAP object, ks_eval_readtrap() will set up its .grad trapezoid (KS_TRAP) and its acquisition window .acq (KS_READ).

If .rampsampling = 1, ks_eval_readtrap() will also copy the shape of .grad into .omega (also KS_TRAP). This is needed for FOV-offsets in the readout direction when data acquisition is done on both the ramps and on the plateau, and ks_pg_readtrap() and ks_scan_offsetfov() will handle the .omega KS_TRAP so that the intended FOV shift in [mm] will be performed.

ks_eval_readtrap() will also fill in the convenience fields .area2center and .time2center properly. .area2center is useful to use as desired input .area for a read dephaser, and .time2center makes sequence timing calculations easier. Both fields take partial/full Fourier (.nover) into account.

It is a requirement that there is a (sequence generating) function in the @pg section (containing the ks_pg_readtrap() call(s)) that can be run on both HOST and TGT. This function should be called once in cveval() (after ks_eval_readtrap() and other ks_eval_***() functions). ks_pg_readtrap() will throw an error on TGT if this has not been done.

Multi-echo example (also showing a read dephaser)

@ipgexport (HOST)
KS_READTRAP myreadout = KS_INIT_READTRAP; // readout trapezoid including data acquisition window
KS_TRAP myreaddephaser = KS_INIT_TRAP; // dephaser gradient for the readout
cveval() {
myreadout.fov = opfov; // FOV menu in UI
myreadout.res = opxres; // Freq res. menu in UI
myreadout.acq.rbw = oprbw; // Receiver bandwidth menu in UI
ks_eval_readtrap(&myreadout, "myreadout"); // setup the readout with trapezoid
myreaddephaser.area = -myreadout.area2center; // works for both partial (.nover > 0) and full Fourier (.nover = 0)
ks_eval_trap(&myreaddephaser, "myreaddephaser"); // setup the dephaser gradient
}
@pg
tmploc.pos = 15ms; // start reading out after 15ms
tmploc.board = XGRAD; // place the readout on XGRAD
for (i = 0; i < opnecho; i++) { // opnecho is "number of echoes" menu in the UI
ks_pg_readtrap(&myreadout, tmploc, &seqctrl);
tmploc.pos += myreadout.grad.duration; // forward the position to the next readout
tmploc.ampscale *= -1.0; // negate the readout amplitude for even echoes
}
@rsp (TGT)
ks_scan_offsetfov(&myreadout, INSTRALL, scan_info[slice], kyview, opphasefov, 0); // FOV-shift all readouts according to scan_info[]

Field Documentation

◆ acq

KS_READ acq

Data acq window (incl. filter info) (set by ks_eval_readtrap())

◆ fov

float fov

FOV in the frequency encoding direction [mm] (must be set before calling ks_eval_readtrap())

◆ res

int res

Number of pixels in the frequency encoding direction (must be set before calling ks_eval_readtrap())

◆ rampsampling

int rampsampling

0 [default]: data acquisition on the plateau of the trapezoid, 1: data acquisition also on the ramps (optionally set before ks_eval_readtrap())

◆ nover

int nover

0 [default]: Full Fourier imaging (full k-space), >0: Partial Fourier (in freq.dir.). Actual value sets the number of partial Fourier overscans. (optionally set before ks_eval_readtrap())

◆ acqdelay

int acqdelay

Time [us] until data sampling should start relative to the attack ramp start. Must be set manually when .rampsampling = 1. Without rampsampling, .acqdelay is set to .ramptime (if paddingarea = 0)

◆ paddingarea

float paddingarea

0 [default]: Minimum gradient area [(G/cm)*us] before or after the start of the sampling window on the plateau part (applies only when .rampsampling = 0)

◆ freqoffHz

float freqoffHz

0 [default]: Static frequency offset in [Hz] that is to be added to the FOV dependent frequency offset (c.f. ks_scan_offsetfov())

◆ area2center

float area2center

Gradient area until center of k-space (convenient information set by ks_eval_readtrap())

◆ time2center

int time2center

Time [us] until center of k-space (convenient information set by ks_eval_readtrap())

◆ grad

KS_TRAP grad

Gradient during data acq (set by ks_eval_readtrap())

◆ omega

KS_TRAP omega

OMEGA trapezoid for frequency modulation during data acquisition when .rampsampling = 1, otherwise not used. (set by ks_eval_readtrap())


The documentation for this struct was generated from the following file: