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

#include <KSFoundation.h>

Data Fields

KS_TRAP readphaser
KS_TRAP blip
KS_PHASER blipphaser
KS_PHASER zphaser
int R_3d
int etl
int read_spacing
int duration
int time2center
float blipoversize
float minbliparea

Detailed Description

Composite sequence object for EPI readout


The KS_EPI composite sequence object controls an entire EPI train (including de/rephasers on freq & phase axes). The KS_EPI object consists of several fields, four of which are other sequence objects:

  • KS_READTRAP .read: The EPI readout lobes including data acquisition
  • KS_TRAP .readphaser: The dephaser and rephaser gradients before and after the core EPI train, on the same board as .read
  • KS_TRAP .blip: The blip gradients in the phase encoding direction between the readout lobes
  • KS_PHASER .blipphaser: The dephaser & rephaser gradients on the same board as the .blip gradients. For multi-shot EPI these gradients will change in scan() when calling ks_scan_epi_shotcontrol()

The KS_EPI object is set up in cveval() using ks_eval_epi(), but before calling this function, portions of the .read field (KS_READTRAP) and .blipphaser field (KS_PHASER) must be set up. Here follows a minimal list of fields that must be set:

  1. .read.fov: The Field-of-View (FOV) in the frequency encoding (readout) direction
  2. .read.res: The number of pixels within the FOV along the frequency encoding direction
  3. .blipphaser.fov: The Field-of-View (FOV) in the phase encoding direction
  4. .blipphaser.res: The number of pixels within the FOV along the phase encoding direction
  5. .blipphaser.R: Either the number of EPI shots or the parallel imaging factor
  6. .read.rampsampling: Whether rampsampling should be used (see KS_READTRAP). Value of 1 is recommended for EPI
  7. .read.acq.rbw: The receiver bandwidth in [kHz/FOV]. Maximum: 250

If the KS_EPI object is initialized with KS_INIT_EPI on declaration, .read.rampsampling will already be set to 1 and .read.acq.rbw will be set to 250.0 (hence steps 6-7 can be skipped).

Single-shot EPI acquisitions are geometrically distorted to some degree depending on chosen .read.res and .blipphaser.fov. To reduce the EPI distortions, either multi-shot EPI or parallel imaging acceleration can be used. For both alternatives, every Rth phase encoding line is acquired in k-space as the EPI train is played out. R corresponds to the number of shots (opnshots menu in the UI) or the parallel imaging factor. Therefore, e.g. a 4-shot EPI readout is identical to an R = 4 accelerated EPI readout with the same FOV and resolution, why one same field .R may be used to control the EPI train setup, be it multi-shot or parallel imaging acceleration (but not both at the same time). What differs between multi-shot and parallel imaging acceleration in the acquisition is only whether the .blipphaser should change from TR to TR. Hence, to set up a KS_EPI object, use the field .R for both multi-shot EPI and parallel imaging scenarios.

The remaining fields of interest in the KS_EPI sequence objects are:

  • .etl: This is the echo-train-length (ETL) of the EPI readout train, set by ks_eval_epi() based on .blipphaser.res and .blipphaser.R
  • .read_spacing: Additional spacing in [us] between readout lobes. Default value is zero, but can be set > 0 if additional gradients is to be inserted between the readout lobes. One scenario is adding CAIPIRINHA blips on ZGRAD during the time where the EPI readout is played out in the pulse sequence
  • .duration: Convenience information for timing calculations, set by ks_eval_epi(). This is the total time in [us] for the EPI train, including the dephasers and rephasers on the frequency and phase axes. Note that there are also .duration fields for each of the four KS_*** sequence objects in KS_EPI, stating the duration of each of these components.
  • .time2center: Convenience information for timing calculations, set by ks_eval_epi(). The time in [us] from the start of the first dephaser until the center of k-space is reached. This deviates from .duration/2 for partial Fourier EPI trains where .blipphaser.nover > 0 (a.k.a. fractional NEX, but typically shown as MiniumTE in the UI for EPI)

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


@ipgexport (HOST)
cveval() {
myepi.read.fov = opfov; // FOV menu in UI
myepi.read.res = opxres; // Freq res. in UI
myepi.blipphaser.fov = opfov; // FOV menu in UI (EPI uses typically square FOVs)
myepi.blipphaser.res = opyres; // Phaser res. in UI
myepi.blipphaser.R = opnshots; // Number of shots menu in UI
ks_eval_epi(&myepi, "myepi", &gradrfctrl); // setup the KS_EPI object
tmploc.pos = 25ms; // start the EPI train after 25ms
tmploc.board = KS_FREQX_PHASEY; // place the EPI train with frequency encoding on XGRAD and phase encoding on YGRAD
tmploc.ampscale = 1.0; // In ks_pg_epi(), only 1.0 and -1.0 are allowed. This controls the initial readout polarity
ks_pg_epi(&myepi, tmploc, &seqctrl);
@rsp (TGT)
for (i = 0; i < myepi.blipphaser.R; i++) {
0, // echo #, i.e. number of EPI trains
scan_info[slice], // mm info for current slice
phaseshot, // shot #. 0->(opnshots-1)
KS_EPI_POSBLIPS); // alternatively KS_EPI_NEGBLIPS (to play out negative EPI blips, with `.blipphaser` polarity automatically adjusted

Field Documentation

◆ read

EPI readout lobe (etl instances per EPI train)

◆ readphaser

KS_TRAP readphaser

EPI read dephaser (instance #0) and read rephaser (instance #1)

◆ blip

KS_TRAP blip

EPI blips (.etl-1 instances per EPI train)

◆ blipphaser

KS_PHASER blipphaser

EPI blip dephaser (instance #0) and blip rephaser (instance #1)

◆ zphaser

KS_PHASER zphaser

Second phase encoding (ZGRAD) field, zphaser.res > 1 triggers 3D (ks_eval_epi)

◆ R_3d

int R_3d

Undersampling of 3D k-space along ky (outside the kz acs region). Has no effect for 2D-EPI. blipphaser.R must be divisible by R_3d (default: 1 = fully sampled k-space)

◆ etl

int etl

Echo-Train-Length (ETL), set by ks_eval_epi()

◆ read_spacing

int read_spacing

0 [default]: Optional extra spacing between readout lobes [us]

◆ duration

int duration

Duration of EPI train, including dephasers and rephasers [us]

◆ time2center

int time2center

Time from the beginning of first EPI dephaser to the position corresponding to the center of k-space [us]

◆ blipoversize

float blipoversize

1.0 [default]: Blip widening factor to allow for oblique Nyquist ghost correction

◆ minbliparea

float minbliparea

(Internal use) Minimum blip area until the blip needs to be widened to reduce discretization errors. If .blip.area < .minbliparea, .blipoversize will be increased above 1.5

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