As said on the quality assessment page, this function is used to determine whether or not a given dataset (run) is suitable for subsequent data analysis.
To run the fMRI quality checking function, the images need to be in one of the functional imaging data formats currently supported by the xff class:
fmriquality - get some quality assurance for fMRI data FORMAT: [fq, fmridata = ] fmriquality(images [, opts]) Input fields: images list of images (or fMRI datatype, like FMR/VTC) opts optional settings .motcor perform motion-correction (and re-do stats, def: false) .nuisreg nuisance regressors/confounds for temp. filtering .pbar 1x1 xfigure::ProgressBar or xprogress object .prange progress bar range (default: [0 .. 1]) .qasheet flag, display quality assessment sheet (default: false) .res resolution (for motion detection, default: from file) .robfilt flag, perform filtering robustly (default: false) .robmotcor flag, do motion detection robustly (default: false) .tempffrq temp filter frequency cut-off (as TRs, default: 80) .tempfset temp filter set, either of 'DC', {'Fourrier'} Output fields: fq complex struct, containing masks, time courses, etc. fmridata 4-D data slab (motion corrected, if selected) Note: the data of one run must at least fit into memory (in single precision), plus some temporary arrays and, if motion correction is selected, with further memory allocation required!
The basic algorithm can be unpacked into the following steps:
Additionally, at the end of steps that produce time courses, an outlier detection is performed which amasses evidence for a given volume being an outlier.
The detection of the foreground involves the following steps:
The detection of the background involves the following steps:
The mentioned (conservative) estimate of the background noise is computed by
The following criteria are being considered for the detection of outliers:
The most basic (and pre-configured) way of running fmriquality is by simply passing in the filename(s) or object of the run to check:
qas = fmriquality(findfiles(sessionfolder, '*.img', 'depth=1'));
fmr = xff('*.fmr', 'Select FMR for which you want to check the data quality...'); qas = fmriquality(fmr);
% selecting files with findfiles qafiles = fmriquality(findfiles(pwd, '*.img')); % options qaopts = struct( ... 'motcor', true, ... 'qasheet', true, ... 'robfilt', true, ... 'tempffrq', 64); % running fmriquality fmriquality(qafiles, qaopts);
% loop over VTCs in MDM for study = 1:size(mdm.XTC_RTC, 1) % perform quality assessment q = fmriquality(mdm.XTC_RTC{study, 1}, struct('robfilt', true)); % store as VTCNAME_qasheet.mat save([mdm.XTC_RTC{study, 1}(1:end-4) '_qasheet.mat'], 'q'); end
In case the QA sheet is not shown by the function (flag .qasheet
set to false
, which is the default), the returned struct can be visualized via a call to fmriqasheet
:
% load a QA sheet (contains variable/struct q !) load CPU4212_run3_qasheet.mat % open QA sheet fmriqasheet(q);
If the .qasheet
option is not set to true, the returned variable can later be passed to fmriqasheet manually (for scripted QA-ing). This variable is of type struct and contains (at least) the following fields:
.Dims 1x4 array, size .Filename the first filename given .Masks automatically detected masks (foreground, background, etc) .Raw mean, stdev, and null-voxel image .TempFiltered re-created summary values/maps after applying temporal filtering .Quality summary images trying to capture overall quality measures (SNR, CNR, etc.) .TC diverse time courses
When passed to fmriqasheet, this function then creates a new figure and displays part of the information contained in the structure, which can be used to decide on whether or not a subject would likely introduce too much noise/bias at the group level.
Please be aware that the first argument must be a list of filenames; so, even for a single NIftI (NII) file, a cell array must be passed in:
% using a single NII file qas = fmriquality({'vols.nii'});
Also, please note that motion parameter estimation requires between one and several minutes (depending of the length of the run and whether or not robust motion estimation is employed). The runtime also easily increases tenfold when robust temporal filtering is used. In other words, these options are more useful and meant for situations where the fmriquality function is part of a larger script that automatically checks the quality of all incoming data instead of being used from the command line in a more interactive way!
Finally, at the moment, the “problem detection” thresholds (to mark a volume as outliers) are fixed, but are likely to change in a future version.