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;