KSFoundation  [October2024]
A platform for structured 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
 
FILTER_INFO filt
 
int * pos
 
LONG override_R1
 
WF_PULSE * echo
 
KS_READ_RESAMPLER resampler
 

Detailed Description

Core sequence object that handles a data acquisition window

KS_READ.png
KS_READ


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.

Example

@ipgexport (HOST)
KS_READ myacqwin = KS_INIT_READ;
@host
cveval() {
myacqwin.rbw = 31.25; // kHz/FOV
myacqwin.duration = 8ms;
ks_eval_read(&myacqwin, "myreadout");
}
@pg
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

FILTER_INFO filt

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

◆ pos

int* 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

◆ resampler

KS_READ_RESAMPLER resampler

Used to retrieve resampling params


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