#include <KSFoundation.h>
Data Fields | |
int | nslices |
int | npasses |
int | nslices_per_pass |
DATA_ACQ_ORDER | acq_order [SLICE_FACTOR *DATA_ACQ_MAX] |
For 2D imaging one can fit a certain number of slices within each TR, and one may often need multiple TRs (or passes) to play out all slices. GE's product sequences uses the following CVs:
opslquant
(number of slices in total, taken from the prescribed slices in the UI)slquant1
(number of slices that can fit within one TR)acqs
(number of passes, acquisitions, or TRs necessary to acquire all slices)Then typically orderslice()
is called to set up the global data_acq_order
array, which is used in the reconstruction
This is replaced with one ks_slice_plan
, effectively making acqs
and slquant1
obsolete, and making scan()
only dependent on one KS_SLICE_PLAN. This is e.g. beneficial for multiband (SMS) imaging, where there is one slice plan for the calibration step and another slice plan for the slice-accelerated scan.
Multiple functions can exist to create different KS_SLICE_PLANs (instead of using orderslice()
), and for standard interleaved 2D imaging (odd slices followed by even slices), there is aleady a ks_calc_sliceplan() function, which in turn calls ks_calc_sliceplan_interleaved(), where the level of slice interleaving can be set.
As GE's data_acq_order()
is critical for the image reconstruction, this has to be filled in correctly before scanning, and this is done by store the ks_slice_plan
information by calling GEReq_predownload_store_sliceplan() in predownload().
ks_slice_plan
is declared as KS_SLICE_PLAN in GERequired.e, hence there is no need to declare it for each pulse sequence.
int nslices |
Number of slices in total (opslquant)
int npasses |
Number of TRs or passes (i.e. acquisitions) necessary to acquire all slices
int nslices_per_pass |
Number of slices that can fit each TR (pass)
DATA_ACQ_ORDER acq_order[SLICE_FACTOR *DATA_ACQ_MAX] |
Table of slice locations, slice order, and pass index for the scan