SPM/BIDS
SPM 维基教科书已迁移至 https://www.fil.ion.ucl.ac.uk/spm/docs/ |
The 脑影像数据结构 (BIDS) 是一种简单直观的组织和描述脑影像和行为数据的方式。
脑影像数据结构,一种组织和描述神经影像实验输出的格式. Gorgolewski K.J., Auer T., Calhoun V.D., Craddock R.C., Das S., Duff E.P., Flandin G., Ghosh S.S., Glatard T., Halchenko Y.O., Handwerker D.A., Hanke M., Keator D., Li X., Michael Z., Maumet C., Nichols B.N., Nichols T.E., Pellman J., Poline J.-B., Rokem A., Schaefer G., Sochat V., Triplett W., Turner J.A., Varoquaux G. & Poldrack R.A. 科学数据 3, 160044 (2016).
BIDS 应用:改善神经影像数据分析方法的易用性、可访问性和可重复性. Gorgolewski K.J., Alfaro-Almagro F., Auer T., Bellec P., Capota M., Chakravarty M.M., Churchill N.W., Cohen A.L., Craddock R.C., Devenyi G.A., Eklund A., Esteban O., Flandin G., Ghosh S.S., Guntupalli J.S., Jenkinson M., Keshavan A., Kiar G., Liem F., Raamana P.R., Raffelt D., Steele C.J., Quirion P.-O., Smith R.E., Strother S.C., Varoquaux G., Wang Y., Yarkoni T. & Poldrack R.A. PLOS 计算生物学 13(3):e1005209 (2017).
MEG-BIDS,扩展到脑磁图的脑影像数据结构. Niso G., Gorgolewski K.J., Bock E., Brooks T.L., Flandin G., Gramfort A., Henson R.N., Jas M., Litvak V., Moreau J.T., Oostenveld R., Schoffelen J.-M., Tadel F., Wexler J. & Baillet S. 科学数据 5, 180110 (2018).
EEG-BIDS,脑影像数据结构扩展到脑电图. Pernet C.R., Appelhoff S., Gorgolewski K.J., Flandin G., Phillips C., Delorme A. & Oostenveld R. 科学数据 6, 103 (2019) .
SPM 提供了许多功能(MATLAB/Octave 函数)来帮助创建或使用根据 BIDS 格式化的数据集。
可以使用 spm_jsonread
和 spm_jsonwrite
读取/写入 JSON 文件。
>> type sub-01_task-rest_bold.json
{
"RepetitionTime": 3.0,
"Instruction": "Lie still and keep your eyes open"
}
>> bold = spm_jsonread('sub-01_task-rest_bold.json')
bold =
RepetitionTime: 3
Instruction: 'Lie still and keep your eyes open'
>> descr = struct('Name','My Dataset','BIDSVersion','1.0.2')
descr =
Name: 'My Dataset'
BIDSVersion: '1.0.2'
>> spm_jsonwrite('dataset_description.json',descr, struct('indent',' '));
>> type dataset_description.json
{
"Name": "My Dataset",
"BIDSVersion": "1.0.2"
}
这些函数也可单独在 JSONio,一个针对 MATLAB 和 Octave 的 JSON 库 中使用。它们与 MATLAB 的 jsonencode 和 jsondecode 兼容。
可以使用 spm_load
和 spm_save
读取/写入 制表符分隔值 (TSV) 文件。
>> type task-Checkerboard_acq-TR645_events.tsv
onset duration trial_type
0 20 Fixation
20 20 Checkerboard
40 20 Fixation
60 20 Checkerboard
80 20 Fixation
100 20 Checkerboard
>> events = spm_load('task-Checkerboard_acq-TR645_events.tsv')
events =
onset: [6x1 double]
duration: [6x1 double]
trial_type: {6x1 cell}
>> p = struct('participant_id',{{'sub-01','sub-02'}}, 'sex',{{'M','F'}}, 'age',[28 21])
p =
participant_id: {'sub-01' 'sub-02'}
sex: {'M' 'F'}
age: [28 21]
>> spm_save('participants.tsv',p)
>> type participants.tsv
participant_id sex age
sub-01 M 28
sub-02 F 21
这些函数与 MATLAB 表格数组 兼容,并透明地处理 gzip 压缩。
>> participant_id = {'sub-01'; 'sub-02'};
>> sex = {'M'; 'F'};
>> age = [28 21]';
>> p = table(participant_id,sex,age);
>> spm_save('participants.tsv.gz',p)
>> spm_load('participants.tsv.gz')
ans =
participant_id: {2x1 cell}
sex: {2x1 cell}
age: [2x1 double]
可以使用 spm_vol
或 @nifti
读取/写入 NIfTI 文件。
>> S = nifti('sub-2475376__T1w.nii')
S =
NIFTI object: 1-by-1
dat: [256x256x192 file_array]
mat: [4x4 double]
mat_intent: 'Scanner'
mat0: [4x4 double]
mat0_intent: 'Scanner'
descrip: 'MR'
>> F = nifti('sub-2475376_task-Checkerboard_bold.nii')
F =
NIFTI object: 1-by-1
dat: [4-D file_array]
mat: [4x4 double]
mat_intent: 'Scanner'
mat0: [4x4 double]
mat0_intent: 'Scanner'
timing: [1x1 struct]
descrip: '4D image'
>> F.timing.tspace
ans =
1.4000
默认情况下,SPM 不支持压缩的 NIfTI 文件 (.nii.gz
),但 MATLAB/Octave 提供 gzip/gunzip 函数,如果需要,它们也可通过 BasicIO > 文件操作 > 解压缩文件
从批处理界面获得。
可以使用 spm_BIDS
解析根据 BIDS 组织的数据目录。
以下是一个使用 ds007 数据集的示例
>> % Parse BIDS directory
>> BIDS = spm_BIDS('/data/BIDS-examples/ds007');
>> % Make general queries about the dataset
>> spm_BIDS(BIDS,'subjects')
ans =
'01' '02' '03' '04' '05' '06' '07' '08' '09' '10' '11' '12' '13' '14' '15' '16' '17' '18' '19' '20'
>> spm_BIDS(BIDS,'sessions')
ans =
Empty cell array: 1-by-0
>> spm_BIDS(BIDS,'runs')
ans =
'01' '02'
>> spm_BIDS(BIDS,'tasks')
ans =
'stopsignalwithletternaming' 'stopsignalwithmanualresponse' 'stopsignalwithpseudowordnaming'
>> spm_BIDS(BIDS,'types')
ans =
'T1w' 'bold' 'events' 'inplaneT2'
>> spm_BIDS(BIDS,'modalities')
ans =
'anat' 'func'
>> % Make more specific queries
>> spm_BIDS(BIDS,'runs','type','T1w')
ans =
Empty cell array: 1-by-0
>> spm_BIDS(BIDS,'runs','type','bold')
ans =
'01' '02'
>> % Get the NIfTI file for subject '05', run '02' and task 'stopsignalwithmanualresponse':
>> spm_BIDS(BIDS,'data','sub','05','run','02','task','stopsignalwithmanualresponse','type','bold')
ans =
'/data/ds007/sub-05/func/sub-05_task-stopsignalwithmanualresponse_run-02_bold.nii.gz'
>> % and corresponding metadata, including TR:
>> spm_BIDS(BIDS,'metadata','sub','05','run','02','task','stopsignalwithmanualresponse','type','bold')
ans =
RepetitionTime: 2
TaskName: 'stop signal with manual response'
>> % Get the T1-weighted images from all subjects:
>> spm_BIDS(BIDS,'data','type','T1w')
ans =
'/data/ds007/sub-01/anat/sub-01_T1w.nii.gz'
'/data/ds007/sub-02/anat/sub-02_T1w.nii.gz'
'/data/ds007/sub-03/anat/sub-03_T1w.nii.gz'
'/data/ds007/sub-04/anat/sub-04_T1w.nii.gz'
'/data/ds007/sub-05/anat/sub-05_T1w.nii.gz'
'/data/ds007/sub-06/anat/sub-06_T1w.nii.gz'
'/data/ds007/sub-07/anat/sub-07_T1w.nii.gz'
'/data/ds007/sub-08/anat/sub-08_T1w.nii.gz'
'/data/ds007/sub-09/anat/sub-09_T1w.nii.gz'
'/data/ds007/sub-10/anat/sub-10_T1w.nii.gz'
'/data/ds007/sub-11/anat/sub-11_T1w.nii.gz'
'/data/ds007/sub-12/anat/sub-12_T1w.nii.gz'
'/data/ds007/sub-13/anat/sub-13_T1w.nii.gz'
'/data/ds007/sub-14/anat/sub-14_T1w.nii.gz'
'/data/ds007/sub-15/anat/sub-15_T1w.nii.gz'
'/data/ds007/sub-16/anat/sub-16_T1w.nii.gz'
'/data/ds007/sub-17/anat/sub-17_T1w.nii.gz'
'/data/ds007/sub-18/anat/sub-18_T1w.nii.gz'
'/data/ds007/sub-19/anat/sub-19_T1w.nii.gz'
'/data/ds007/sub-20/anat/sub-20_T1w.nii.gz'
辅助函数 spm_mkdir
和 spm_copy
可能会有用,以及前面提到的 spm_save
和 spm_jsonwrite
。
例如,以下使用 spm_mkdir
的代码片段
>> spm_mkdir('/data/bids',{'sub-2475376','sub-5489652'},{'ses-1','ses-2'},'func');
>> spm_mkdir('/data/bids',{'sub-2475376','sub-5489652'},'ses-1','anat');
创建此目录层次结构
/data
└── bids
├── sub-2475376
│ ├── ses-1
│ │ ├── anat
│ │ └── func
│ └── ses-2
│ └── func
└── sub-5489652
├── ses-1
│ ├── anat
│ └── func
└── ses-2
└── func
而 spm_copy
使得更容易复制文件及其附加的元数据(例如 sidecar JSON 文件),并在复制过程中进行压缩。
>> ls
sub-2475376_task-rest_bold.json
sub-2475376_task-rest_bold.nii.gz
>> spm_copy('sub-2475376_task-rest_bold.nii.gz','/derivatives', 'nifti',true, 'gunzip',true)
>> ls /derivatives
sub-2475376_task-rest_bold.json
sub-2475376_task-rest_bold.nii
另请参阅批处理界面中的这些选项
DICOM 导入
批处理模块有一个选项可以创建元数据 sidecar JSON 文件
matlabbatch{1}.spm.util.import.dicom.convopts.meta = true;
3D 到 4D 文件转换
批处理模块有一个选项可以将 TR 存储在 NIfTI 头文件中
matlabbatch{1}.spm.util.cat.RT = TR;