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

#include <KSFoundation.h>

Data Fields

KS_BASE base
KS_DESCRIPTION description
int duration
float rbw
LONG override_R1
WF_PULSE * echo

Detailed Description

Core sequence object that handles a data acquisition window


The KS_READ core sequence object is responsible for acquiring data in a certain time window using some receiver bandwidth [kHz]. Direct use of KS_READ applies to cases like MR spectroscopy where no gradients are involved during data acquisition. It can also be used together with a KS_WAVE to make arbitrary non-Cartesian readouts (as there is currently no composite object ready to handle non-Cartesian readouts).

The information necessary for an acquisition window is:

  • .rbw - the desired receiver bandwidth / FOV in [kHz] (max: 250)
  • .duration - the duration in [us]

On calling ks_eval_read() in cveval() the function will validate the desired rBW and round it to the nearest valid value. Also the duration will be rounded up to fit a whole number of samples in the acquisition window.

NOTE: Regardless of the order the KS_READ object is placed out in the @pg section, its instance index is automatically sorted in time, like KS_TRAP and KS_WAVE. Hence, myacqwin.echo[0] in the example below will always be the first acquisition window in time belonging to this KS_READ object. The number of instances of each KS_READ object in the sequence is given by .base.ngenerated (on TGT) and .base.ninst (on HOST). In scan(), use .base.ngenerated instead of relying on other variables such as opnecho when e.g. calling loaddab().

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


@ipgexport (HOST)
KS_READ myacqwin = KS_INIT_READ;
cveval() {
myacqwin.rbw = 31.25; // kHz/FOV
myacqwin.duration = 8ms;
ks_eval_read(&myacqwin, "myreadout");
for (echoindx = 0; echoindx < opnecho; echoindx++){
ks_pg_read(&myacqwin, 10ms + echoindx*(10ms)); // Data acquisition w/o gradients could be used for e.g. spectroscopy
@rsp (TGT)
scan() {
for (echoindx = 0; echoindx < myacqwin.base.ngenerated; echoindx++) {
loaddab(&myacqwin.echo[echoindx], sliceindx, echoindx, DABSTORE, dabview, DABON, PSD_LOAD_DAB_ALL);

Field Documentation

◆ base

KS_BASE base

Internal use

◆ description

KS_DESCRIPTION description

Descriptive string for the KS_READ object with maximum KS_DESCRIPTION_LENGTH characters

◆ duration

int duration

Duration of the acquisition window in [us]

◆ rbw

float rbw

Receiver bandwidth per FOV in [kHz] (max: 250)

◆ filt


GE's standard filter structure (used in e.g. setfilter())

◆ pos

◆ override_R1

LONG override_R1

override the receive gain for this echo

◆ echo

WF_PULSE* echo

N.B.: We need one WF_PULSE per instance so KS_WFINSTANCE is not needed for KS_READ

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