Data Structures | |
struct | KSINV_DESIGN |
struct | KSINV_MODULE |
struct | KSINV_LOOP_CONTROL_DESIGN |
struct | KSINV_LOOP_CONTROL |
struct | KSINV_CHAIN_DESIGN |
struct | KSINV_MULTI_INV_VOL |
struct | KSINV_CHAIN |
Enumerations | |
enum | KSINV_MODE { KSINV_OFF, KSINV_ON_INTERLEAVED, KSINV_ON_FLAIR_BLOCK } |
enum | KSINV_LOOP_MODE { KSINV_LOOP_NORMAL, KSINV_LOOP_SLICEAHEAD_FIRST, KSINV_LOOP_SLICEAHEAD_LAST } |
enum | KSINV_GSCALE_POLICY { KSINV_GSCALE_SET, KSINV_GSCALE_NONOVERLAP, KSINV_GSCALE_MAXWIDTH } |
Functions | |
void | ksinv_init_loopcontrol (KSINV_LOOP_CONTROL *loop_control) |
void | ksinv_init_design (KSINV_DESIGN *design, const char *desc) |
void | ksinv_init_sequence (KSINV_MODULE *seq) |
STATUS | ksinv_eval_validatedesign (KSINV_DESIGN *design) |
STATUS | ksinv_eval_setupobjects (KSINV_MODULE *seq, const KSINV_DESIGN *design) |
STATUS | ksinv_pg (KSINV_MODULE *seq) |
STATUS | ksinv_scan_seqstate (KSINV_MODULE *seq, const SCAN_INFO *slice_pos) |
KS_CORESLICETIME | ksinv_scan_irslice (KSINV_MODULE *seq, const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic) |
float | ksinv_eval_gscale (float slice_thickness, float slice_spacing, int numacqs, KSINV_GSCALE_POLICY gscale_policy) |
STATUS | ksinv_eval_design (KSINV_MODULE *invseq, KSINV_DESIGN *invseq_design, int npasses, KS_SEQ_COLLECTION *seqcollection) |
STATUS | ksinv_loop_control_eval_design (KSINV_LOOP_CONTROL *inv_loopctrl, KS_CORESLICETIME irslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_SEQ_CONTROL *invseq_seqctrl_ptr, KS_CORESLICETIME coreslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_SEQ_CONTROL *mainseq_seqctrl_ptr, const KSINV_LOOP_CONTROL_DESIGN *design, KS_SEQ_COLLECTION *seqcollection) |
STATUS | ksinv_eval_duration_simple (KSINV_LOOP_CONTROL *inv_loopctrl, KS_CORESLICETIME irslicetime, KS_CORESLICETIME coreslicetime, KS_SEQ_CONTROL *invseq_seqctrl_ptr, const KSINV_LOOP_CONTROL_DESIGN *design) |
int | ksinv_eval_nullti (int TR, int T1value, int seqdur) |
int | ksinv_eval_nulltr (int TI, int T1value, int seqdur) |
STATUS | ksinv_eval_duration_interleaved (KSINV_LOOP_CONTROL *inv_loopctrl, KS_CORESLICETIME irslicetime, KS_CORESLICETIME coreslicetime, KS_SEQ_CONTROL *invseq_seqctrl_ptr, KS_SEQ_CONTROL *mainseq_seqctrl_ptr, const KSINV_LOOP_CONTROL_DESIGN *design) |
STATUS | ksinv_eval_duration_flairblock (KSINV_LOOP_CONTROL *inv_loopctrl, KS_CORESLICETIME irslicetime, KS_CORESLICETIME coreslicetime, KS_SEQ_CONTROL *invseq_seqctrl_ptr, KS_SEQ_CONTROL *mainseq_seqctrl_ptr, const KSINV_LOOP_CONTROL_DESIGN *design) |
STATUS | ksinv_eval_duration_setfilltr (KS_SEQ_CONTROL *filltr, int duration) |
STATUS | ksinv_check () |
STATUS | ksinv_predownload_setrecon () |
s64 | ksinv_scan_sliceloop (KSINV_LOOP_CONTROL *inv_loopctrl, KS_DYNAMIC_STATE *dynamic, KSINV_LOOP_MODE ksinv_loop_mode, KS_CORESLICETIME coreslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_CORESLICETIME irslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic)) |
s64 | ksinv_scan_sliceloop_flairblock (KSINV_LOOP_CONTROL *inv_loopctrl, KS_DYNAMIC_STATE *dynamic, KS_CORESLICETIME coreslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_CORESLICETIME irslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic)) |
s64 | ksinv_scan_sliceloop_sliceahead (KSINV_LOOP_CONTROL *inv_loopctrl, KS_DYNAMIC_STATE *dynamic, KS_CORESLICETIME coreslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_CORESLICETIME irslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), int nslicesahead_current, int nslicesahead_next, int play_core) |
s64 | ksinv_scan_acqloop (KSINV_LOOP_CONTROL *inv_loopctrl, KS_DYNAMIC_STATE *dynamic, KS_CORESLICETIME coreslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_CORESLICETIME irslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), const int inv_rampup, const int inv_rampdown) |
s64 | ksinv_scan_scanloop (KSINV_LOOP_CONTROL *inv_loopctrl, KS_DYNAMIC_STATE *dynamic, KS_CORESLICETIME coreslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_CORESLICETIME irslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic)) |
void | ksinv_prescanloop (KSINV_LOOP_CONTROL *inv_loopctrl, KS_CORESLICETIME coreslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_CORESLICETIME irslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), int nloops, int dda) |
STATUS | ksinv_eval_chain_design (KSINV_CHAIN *inv_chain, KSINV_CHAIN_DESIGN *inv_chain_design, const KSINV_LOOP_CONTROL *inv_loopctrl) |
s64 | ksinv_scan_acqloop_chain (const KSINV_CHAIN *inv_chain, KSINV_LOOP_CONTROL *inv_loopctrl, KS_DYNAMIC_STATE *dynamic, KS_CORESLICETIME coreslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_CORESLICETIME irslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic)) |
s64 | ksinv_scan_scanloop_chain (const KSINV_CHAIN *inv_chain, KSINV_LOOP_CONTROL *inv_loopctrl, KS_DYNAMIC_STATE *dynamic, KS_CORESLICETIME coreslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic), KS_CORESLICETIME irslice(const SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic)) |
#define KSINV_DEFAULT_FLIP 180 |
default inversion flip angle
#define KSINV_DEFAULT_SPOILERAREA 5000 |
default spoiler area [(G/cm)*us]
#define KSINV_MINTR_T2FLAIR 8000000 |
default minTR [us] for T2FLAIR, 8 [s]
#define KSINV_MINTR_T1FLAIR 1400000 |
default minTR [us] for T1FLAIR, 1.4 [s]
#define KSINV_MAXTR_T1FLAIR 2800000 |
default maxTR [us] for T1FLAIR, 2.8 [s]
#define T1_CSF_3T 4400000 |
Approximate T1 value for CSF at 3T [us]
#define T1_CSF_1_5T 3600000 |
Approximate T1 value for CSF at 1.5T [us]
#define T1_GM_3T 1400000 |
Approximate T1 value for gray matter at 3T [us]
#define T1_GM_1_5T 1100000 |
Approximate T1 value for gray matter at 1.5T [us]
#define T1_WM_3T 750000 |
Approximate T1 value for white matter at 3T [us]
#define T1_WM_1_5T 600000 |
Approximate T1 value for white matter at 1.5T [us]
#define T1_FAT_3T 340000 |
Approximate T1 value for fat at 3T [us]
#define T1_FAT_1_5T 260000 |
Approximate T1 value for fat at 1.5T [us]
#define KSINV_SPOILX 1 |
Bitmask for KSINV_DESIGN spoileraxes to activate spoiling on the logical X-axis
#define KSINV_SPOILY 2 |
Bitmask for KSINV_DESIGN spoileraxes to activate spoiling on the logical Y-axis
#define KSINV_SPOILZ 4 |
Bitmask for KSINV_DESIGN spoileraxes to activate spoiling on the logical Z-axis
#define KSINV_INIT_DESIGN {"inversion", KS_INIT_SELRF_INVDESIGN, 0, KSINV_GSCALE_NONOVERLAP, 1000.0, KSINV_SPOILX + KSINV_SPOILY + KSINV_SPOILZ, 0, KS_DEFAULT_SSI_TIME} |
Default KSINV_DESIGN values
#define KSINV_INIT_MODULE {KS_INIT_SEQ_CONTROL, KS_INIT_SELRF, KS_INIT_TRAP, KSINV_SPOILX + KSINV_SPOILY + KSINV_SPOILZ, 0} |
Default values for KSINV_MODULE
#define KSINV_INIT_LOOP_CONTROL_DESIGN {KSINV_OFF, KS_NOTSET, KS_NOTSET, FALSE, KS_DEFAULT_SSI_TIME, KSSCAN_INIT_LOOP_CONTROL_DESIGN} |
Default KSINV_LOOP_CONTRO_DESIGN values
#define KSINV_INIT_LOOP_CONTROL {KSINV_OFF, KS_NOTSET, KS_NOTSET, KS_NOTSET, KS_NOTSET, KS_NOTSET, 0, KSSCAN_INIT_LOOP_CONTROL, KS_INIT_SEQ_CONTROL} |
Default KSINV_LOOP_CONTROL values
#define KSINV_MULTI_INV_MAX_NUM_VOLS 16 |
#define KSINV_INIT_CHAIN_DESIGN {0, {0}, {KS_INIT_PHASEENCODING_PLAN_DESIGN}, {0}} |
#define KSINV_INIT_CHAIN {0, {{0, KS_INIT_PHASEENCODING_PLAN, 0, 0}}} |
enum KSINV_MODE |
enum KSINV_LOOP_MODE |
enum KSINV_GSCALE_POLICY |
void ksinv_init_loopcontrol | ( | KSINV_LOOP_CONTROL * | loop_control | ) |
[out] | loop_control | Pointer to the inversion loop control to be initialized |
void ksinv_init_design | ( | KSINV_DESIGN * | design, |
const char * | desc | ||
) |
This function should be called from an sequence (*.e file) that uses ksinversion.h:KSINV_MODULE before setting up its design struct.
[out] | design | Pointer to the design struct |
[in] | desc | Description of the sequence |
void ksinv_init_sequence | ( | KSINV_MODULE * | seq | ) |
[out] | seq | Pointer to KSINV_MODULE |
STATUS ksinv_eval_validatedesign | ( | KSINV_DESIGN * | design | ) |
This function is called by ksinv_eval_design() to make sure the user's input design stuctures are valid
[in] | design | KSINV_DESIGN to be validated |
STATUS | SUCCESS or FAILURE |
STATUS ksinv_eval_setupobjects | ( | KSINV_MODULE * | seq, |
const KSINV_DESIGN * | design | ||
) |
This function is called by ksinv_eval() to set up the specs (amplitudes and durations) for the sequence objects (gradients, RF, ...) in KSINV_MODULE
[out] | seq | Pointer to the inversion module |
[in] | design | Pointer to the design struct |
STATUS | SUCCESS or FAILURE |
STATUS ksinv_pg | ( | KSINV_MODULE * | seq | ) |
[in,out] | seq | Pointer to the inversion module |
STATUS | SUCCESS or FAILURE |
STATUS ksinv_scan_seqstate | ( | KSINV_MODULE * | seq, |
const SCAN_INFO * | slice_pos | ||
) |
This function sets the current state of all ksinv
sequence objects being part of KSINV_MODULE, specifically slice-dependent RF freq/phases changes.
The idea of having a 'seqstate' function is to be able to come back to a certain sequence state at any time and possibly play it out once more. This could for example be useful when certain lines or slices need to be rescanned due to image artifacts detected during scanning.
[in] | seq | Pointer to KSINV_MODULE |
[in] | slice_pos | Pointer to position of the slice to be played out (one element in the ks_scan_info[] array) |
STATUS | SUCCESS or FAILURE |
KS_CORESLICETIME ksinv_scan_irslice | ( | KSINV_MODULE * | seq, |
const SCAN_INFO * | slice_pos, | ||
KS_DYNAMIC_STATE * | dynamic | ||
) |
On TGT on the MR system (PSD_HW), this function sets up (ksinv_scan_seqstate()) and plays out one KSINV_MODULE. The low-level function call startseq()
, which actually starts the realtime sequence playout is called from within ks_scan_playsequence(), which in addition also returns the time to play out that sequence module (see time += ...).
On HOST only the timing informations are returned. These are used for to compute inversion timing and total scan time.
[in] | seq | Pointer to KSINV_MODULE |
[in] | slice_pos | Pointer to position of the slice to be played out (one element in the ks_scan_info[] array) |
[in] | dynamic | Pointer to KS_DYNAMIC_STATE |
KS_CORESLICETIME | Time taken in [us] to play out one inversion slice (.duration) and time to center of inversion pulse (.referencetimepoint) |
float ksinv_eval_gscale | ( | float | slice_thickness, |
float | slice_spacing, | ||
int | numacqs, | ||
KSINV_GSCALE_POLICY | gscale_policy | ||
) |
This function is called by ksinv_eval_design() to set seq->design.invdesign.gscale based on other design fields
[in] | slice_thickness | Slice thickness in [mm] |
[in] | slice_spacing | Slice spacing in [mm] |
[in] | numacqs | Number of acquistions (passes) for the scan (usually 2+ for inversion sequences) |
[in] | gscale_policy | KSINV_GSCALE_FIXED (uses .gscale), KSINV_GSCALE_NONOVERLAP (IR slices may never overlap regardless of interleaving) or KSINV_GSCALE_MAXWIDTH (IR slice may overlap) |
STATUS | SUCCESS or FAILURE |
STATUS ksinv_eval_design | ( | KSINV_MODULE * | invseq, |
KSINV_DESIGN * | invseq_design, | ||
int | npasses, | ||
KS_SEQ_COLLECTION * | seqcollection | ||
) |
This function should be called in the cveval() function of a main sequence (*.e) that uses ksinversion.h/ksinversion.cc to generate a standard inversion module.
STATUS ksinv_loop_control_eval_design | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_CORESLICETIME | irsliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_SEQ_CONTROL * | invseq_seqctrl_ptr, | ||
KS_CORESLICETIME | coresliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_SEQ_CONTROL * | mainseq_seqctrl_ptr, | ||
const KSINV_LOOP_CONTROL_DESIGN * | design, | ||
KS_SEQ_COLLECTION * | seqcollection | ||
) |
This function is the most general way to generate an inversion loop control. Recall that the objective of an inversion module is to interweave two different blocks of one or more modules (sequence entries). The first block is responsible for sampling the desired k-space data while the second is needed for prepare the magnetization via inversion. Here the two blocks are handled via two function pointer that play a series of modules configured to excite at a specific slice location.
[out] | inv_loopctrl | Inversion loop control to be generated |
[in] | irslice | Coreslice function playing an inversion (and optionally more) modules for a single inversion slice playout |
[out] | invseq_seqctrl_ptr | Pointer to the sequence entry among those played in irslice to be inflated if it is needed to fix the timing. Note that it is assumed that this module is played exactly once in irslice. |
[in] | coreslice | Pointer to function playing one or more sequence modules for a single playout |
[out] | mainseq_seqctrl_ptr | Pointer to the sequence entry among those played in coreslice to be inflated if it is needed to fix the timing. Note that it is assumed that this module is played exactly once in coreslice. |
[in] | design | Design for the inversion loop control |
[in,out] | seqcollection | Sequence collection to which all modules played in irslice and coreslice ought to have been registered with ks_eval_addtoseqcollection. |
STATUS | SUCCESS or FAILURE |
STATUS ksinv_eval_duration_simple | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_CORESLICETIME | irslicetime, | ||
KS_CORESLICETIME | coreslicetime, | ||
KS_SEQ_CONTROL * | invseq_seqctrl_ptr, | ||
const KSINV_LOOP_CONTROL_DESIGN * | design | ||
) |
For simple main sequences consisting of only one sequence module each time it is played out (i.e. without additional fatsat or spatial sat sequences attached before each main sequence), coreslicetime.referencetimepoint
is typically a small value of a few [ms] indicating the isocenter of the excitation pulse of the main sequence measured from the start of the main sequence. When e.g. a fatsat pulse sequence module is added before each main sequence module, this needs to be taken into account to get the correct inversion time. In these cases coreslicetime.referencetimepoint
should be larger (to also include any leading extra sequence module between the inversion module and the main sequence module, and consequently the duration of the inversion module becomes proportionally smaller. If .design.TI
is short in relation to coreslicetime.referencetimepoint
this function will return an error.
If design->dosliceahead > 0, then the inversion duration is attempted to be reduced by playing the IR module in a slice-ahead fashion (like T1-FLAIR). Even for STIR sequences (depending on the ETL of the main sequence) it can be possible to get very low time penalty with the IR pulse, provided that the main sequence can fit in the dead space of the inversion duration.
[out] | inv_loopctrl | Pointer to the inversion loop control to be generated |
[in] | irslicetime | KS_CORESLICETIME returned by the irslice function (usually ksinv_scan_irslice()) |
[in] | coreslicetime | KS_CORESLICETIME returned by the coreslice function of the main sequence (cf. ksfse.cc:ksfse_scan_coreslice(), ksepi.cc:ksepi_scan_coreslice()) |
[in,out] | invseq_seqctrl_ptr | Pointer to KS_SEQ_CONTROL of the inversion sequence to be used. Note that the duration might be altered to adjust the timing |
[in] | design | Pointer to inverion loop control design |
STATUS | SUCCESS or FAILURE |
int ksinv_eval_nullti | ( | int | TR, |
int | T1value, | ||
int | seqdur | ||
) |
[in] | TR | Repetition time in [us] |
[in] | T1value | The T1 value of the tissue to be nulled in [us] |
[in] | seqdur | The duration of the main sequence in [us] |
int ksinv_eval_nulltr | ( | int | TI, |
int | T1value, | ||
int | seqdur | ||
) |
[in] | TI | Inversion time in [us] |
[in] | T1value | The T1 value of the tissue to be nulled in [us] |
[in] | seqdur | The duration of the main sequence in [us] |
STATUS ksinv_eval_duration_interleaved | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_CORESLICETIME | irslicetime, | ||
KS_CORESLICETIME | coreslicetime, | ||
KS_SEQ_CONTROL * | invseq_seqctrl_ptr, | ||
KS_SEQ_CONTROL * | mainseq_seqctrl_ptr, | ||
const KSINV_LOOP_CONTROL_DESIGN * | design | ||
) |
This function will set up the TI and TR (within seq.slicetiming.design.minTR/maxTR) and set the .seqctrl.duration for both the inversion and main sequence accordingly. It is a requirement for this function to work with AutoTR (some range given bydesign.minTR/maxTR differences) and AutoTI (.T1value > 0 and .TI = KS_NOTSET).
The inversion time will be approximated by the number of slices that can be played slice-aheaed but efforts are made to shift time between the inversion and main sequence to come as close to the optimal TI as possible. This is easier for main sequences with short ETL, many slices and long T1values (CSF), which is the typical case for T1-FLAIR.
This function will be used for STIR cases (with short TI) when AutoTI (.T1value > 0 and .TI = KS_NOTSET) in ksinv_eval() is selecting this function over ksinv_eval_duration_simple().
[in,out] | inv_loopctrl | Pointer to the inversion loop control |
[in] | irslicetime | KS_CORESLICETIME returned by the irslice function (usually ksinv_scan_irslice()) |
[in] | coreslicetime | KS_CORESLICETIME returned by the coreslice function of the main sequence (cf. ksfse.cc:ksfse_scan_coreslice(), ksepi.cc:ksepi_scan_coreslice()) |
[in] | invseq_seqctrl_ptr | Pointer to the inversion sequence control to be used |
[in] | mainseq_seqctrl_ptr | Pointer to the main sequence control to be used |
[in] | design | Pointer to inverion loop control design |
STATUS | SUCCESS or FAILURE |
STATUS ksinv_eval_duration_flairblock | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_CORESLICETIME | irslicetime, | ||
KS_CORESLICETIME | coreslicetime, | ||
KS_SEQ_CONTROL * | invseq_seqctrl_ptr, | ||
KS_SEQ_CONTROL * | mainseq_seqctrl_ptr, | ||
const KSINV_LOOP_CONTROL_DESIGN * | design | ||
) |
This function sets the duration for an KSINV_MODULE module in a FLAIR block design, where seq.state.nflairslices
number of inversion pulses are played first (at different slice locations) followed by equally many 'coreslice' playouts (main sequence + optional other sequence modules attached to the main sequence).
For few slices, the TR is increased by a separate empty pulse sequnce (seq.seqctrl_filltr) to reach slicetiming.design.minTR.
[in,out] | inv_loopctrl | Pointer to the inversion loop control |
[in] | irslicetime | KS_CORESLICETIME returned by the irslice function (usually ksinv_scan_irslice()) |
[in] | coreslicetime | KS_CORESLICETIME returned by the coreslice function of the main sequence (cf. ksfse.cc:ksfse_scan_coreslice(), ksepi.cc:ksepi_scan_coreslice()) |
[in] | invseq_seqctrl_ptr | Pointer to the inversion sequence control to be used |
[in] | mainseq_seqctrl_ptr | Pointer to the main sequence control to be used |
[in] | design | Pointer to inverion loop control design |
STATUS | SUCCESS or FAILURE |
STATUS ksinv_eval_duration_setfilltr | ( | KS_SEQ_CONTROL * | filltr, |
int | duration | ||
) |
[in,out] | filltr | Pointer to KS_SEQ_CONTROL for the empty sequence |
[in] | duration | Duration in [us] for the empty fill sequence |
STATUS | SUCCESS or FAILURE |
STATUS ksinv_check | ( | ) |
STATUS ksinv_predownload_setrecon | ( | ) |
s64 ksinv_scan_sliceloop | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_DYNAMIC_STATE * | dynamic, | ||
KSINV_LOOP_MODE | ksinv_loop_mode, | ||
KS_CORESLICETIME | coresliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_CORESLICETIME | irsliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic | ||
) |
[in] | inv_loopctrl | Inversion loop control that describe the looping patterns |
[in,out] | dynamic | Pointer to KS_DYNAMIC_STATE struct, which has elements being automatically updated by the scan looping functions and which is ultimately used to set the state for all modules |
[in] | ksinv_loop_mode | Type of TR to played if the inversions are interleaved (irmode = KSINV_ON_INTERLEAVED) |
[in] | coreslice | Pointer to function playing one or more sequence modules for a single playout |
[in] | irslice | Pointer to function playing an inversion (and optionally more) modules for a single inversion slice playout |
time | Duration in [us] to play out the scope of the function in real time |
s64 ksinv_scan_sliceloop_flairblock | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_DYNAMIC_STATE * | dynamic, | ||
KS_CORESLICETIME | coresliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_CORESLICETIME | irsliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic | ||
) |
[in] | inv_loopctrl | Pointer to the inversion loop control |
dynamic | Pointer to KS_DYNAMIC_STATE | |
[in] | coreslice | Function pointer to function playing one or more sequence modules for a single playout |
[in] | irslice | Function pointer to function playing the inversion function |
s64 ksinv_scan_sliceloop_sliceahead | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_DYNAMIC_STATE * | dynamic, | ||
KS_CORESLICETIME | coresliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_CORESLICETIME | irsliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
int | nslicesahead_current, | ||
int | nslicesahead_next, | ||
int | play_core | ||
) |
inv_loopctrl | Pointer to the inversion loop control | |
dynamic | Pointer to KS_DYNAMIC_STATE struct, which has elements being automatically updated by the scan looping functions | |
[in] | coreslice | Function pointer to function playing one or more sequence modules for a single playout |
[in] | irslice | Function pointer to function playing an inversion (and optionally more) modules for a single inversion slice playout |
[in] | nslicesahead_current | Offset of the slice index used for inversion module(s) with respect to the one used for the core module(s). This is used only for inversions that will be sampled within the same repetition |
[in] | nslicesahead_next | Offset of the slice index used for inversion module(s) with respect to the one used for the core module(s). This is used only for inversions that will be sampled in the next repetition. Note that it is requred that nslicesahead_next <= nslicesahead_next. |
[in] | play_core | Flag indicating whether to turn on the acquisition of the core module |
time | Duration in [us] to play out the scope of the function in real time |
s64 ksinv_scan_acqloop | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_DYNAMIC_STATE * | dynamic, | ||
KS_CORESLICETIME | coresliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_CORESLICETIME | irsliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
const int | inv_rampup, | ||
const int | inv_rampdown | ||
) |
It affords the option to ramp up/down the inversions
[in] | inv_loopctrl | Pointer to the inversion loop control |
[in,out] | dynamic | Pointer to KS_DYNAMIC_STATE |
[in] | coreslice | Function pointer to function playing one or more sequence modules for a single playout |
[in] | irslice | Function pointer to function playing an inversion (and optionally more) modules for a single inversion slice playout |
[in] | inv_rampup | Flag for turning on the ramp up of the inversions at the beginning of the acquisition/pass |
[in] | inv_rampdown | Flag for turning on the ramp down of the inversions at the end of the acquisition/pass |
time | Duration in [us] to play out the scope of the function in real time |
s64 ksinv_scan_scanloop | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_DYNAMIC_STATE * | dynamic, | ||
KS_CORESLICETIME | coresliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_CORESLICETIME | irsliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic | ||
) |
[in] | inv_loopctrl | Pointer to the inversion loop control |
[in,out] | dynamic | Pointer to KS_DYNAMIC_STATE struct, which has elements being automatically updated by the scan looping functions |
[in] | coreslice | Function pointer to function playing one or more sequence modules for a single playout |
[in] | irslice | Function pointer to function playing the inversion function |
In a single pass scan we should ramp up/down only once. NOTE: this holds only if all sequences have the same slice encoding plan. – E.A.
void ksinv_prescanloop | ( | KSINV_LOOP_CONTROL * | inv_loopctrl, |
KS_CORESLICETIME | coresliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_CORESLICETIME | irsliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
int | nloops, | ||
int | dda | ||
) |
[in] | inv_loopctrl | Pointer to the inversion loop control |
[in] | coreslice | Function pointer to function playing one or more sequence modules for a single playout |
[in] | irslice | Function pointer to function playing the inversion function |
[in] | nloops | ADDTEXTHERE |
[in] | dda | ADDTEXTHERE |
STATUS ksinv_eval_chain_design | ( | KSINV_CHAIN * | inv_chain, |
KSINV_CHAIN_DESIGN * | inv_chain_design, | ||
const KSINV_LOOP_CONTROL * | inv_loopctrl | ||
) |
ADDDESCHERE
inv_chain | ADDTEXTHERE |
inv_chain_design | ADDTEXTHERE |
inv_loopctrl | ADDTEXTHERE |
STATUS | SUCCESS or FAILURE |
s64 ksinv_scan_acqloop_chain | ( | const KSINV_CHAIN * | inv_chain, |
KSINV_LOOP_CONTROL * | inv_loopctrl, | ||
KS_DYNAMIC_STATE * | dynamic, | ||
KS_CORESLICETIME | coresliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_CORESLICETIME | irsliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic | ||
) |
ADDDESCHERE
inv_chain | ADDTEXTHERE | |
inv_loopctrl | ADDTEXTHERE | |
dynamic | Pointer to KS_DYNAMIC_STATE struct, which has elements being automatically updated by the scan looping functions | |
[in] | coreslice | Function pointer to function playing one or more sequence modules for a single playout |
[in] | irslice | Function pointer to function playing the inversion function |
s64 ksinv_scan_scanloop_chain | ( | const KSINV_CHAIN * | inv_chain, |
KSINV_LOOP_CONTROL * | inv_loopctrl, | ||
KS_DYNAMIC_STATE * | dynamic, | ||
KS_CORESLICETIME | coresliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic, | ||
KS_CORESLICETIME | irsliceconst SCAN_INFO *slice_pos, KS_DYNAMIC_STATE *dynamic | ||
) |
ADDDESCHERE
inv_chain | ADDTEXTHERE | |
inv_loopctrl | ADDTEXTHERE | |
dynamic | Pointer to KS_DYNAMIC_STATE struct, which has elements being automatically updated by the scan looping functions | |
[in] | coreslice | Function pointer to function playing one or more sequence modules for a single playout |
[in] | irslice | Function pointer to function playing the inversion function |