【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

【SPM】LinuxのターミナルからSPMを操作

f:id:AIProgrammer:20201118182437p:plain

目的

  • LinuxのターミナルからSPMを操作

リポジトリ

例は、GitHubのリポジトリに保存してある。

github.com

1_Applywarp_MNI2Subj

目的

  • 被験者のDWI空間からMNI空間への変換行列を用いて、MNI空間上にあるROIをDWI空間へ移動させる

必要なファイル

必要なファイルは次の通り。

  • b0.nii.gz: DWIのb=0画像
  • 1mm_ROI[L, R]3_MNI_relabel_group.nii.gz: MNI空間上の黒質ROI
  • diff2MNI_sn.mat: 被験者のDWI空間からMNI空間への変換行列
  • NIfTI_20130306: NIFTIをMATLABで扱うための関数
  • spm8: SPM8
1_Applywarp_MNI2Subj/
├── Data
│   ├── Sub001
│   │   ├── 1mm_ROI_L_3_MNI_relabel_group.nii.gz
│   │   ├── 1mm_ROI_R_3_MNI_relabel_group.nii.gz
│   │   ├── b0.nii.gz
│   │   └── diff2MNI_sn.mat
│   ├── Sub002
│   │   ├── 1mm_ROI_L_3_MNI_relabel_group.nii.gz
│   │   ├── 1mm_ROI_R_3_MNI_relabel_group.nii.gz
│   │   ├── b0.nii.gz
│   │   └── diff2MNI_sn.mat
│   └── Sub003
│       ├── 1mm_ROI_L_3_MNI_relabel_group.nii.gz
│       ├── 1mm_ROI_R_3_MNI_relabel_group.nii.gz
│       ├── b0.nii.gz
│       └── diff2MNI_sn.mat
├── run.sh
└── spm_util_deform_inv.m

ソースコード

MATLABを使ったSPMの処理内容は次の通り。

DWI空間からMNI空間への変換行列の逆変換行列を使って、MNI空間上にあるROIをDWI空間へ移動させる。

spm_util_deform_inv.m
function spm_util_deform_inv(input,output,refimg,mat)
%-----------------------------------------------------------------------
% transform ROIs from MNI space to DTI(b0) space
%-----------------------------------------------------------------------

    % sourcepath = strcat(WD,'/',SUB{i});
    % sourcepath = '.';
    % disp(sourcepath);
    % mat = strcat(sourcepath,'/rT1_',SUB{i},'_sn.mat');
    % refimg = strcat(sourcepath,'/rT1_',SUB{i},'.nii');

    spm('defaults','fmri');
    spm_jobman('initcfg');
    
    matlabbatch{1}.spm.util.defs.comp{1}.inv.comp{1}.sn2def.matname = {mat};
    matlabbatch{1}.spm.util.defs.comp{1}.inv.space = {refimg};
    matlabbatch{1}.spm.util.defs.comp{1}.inv.comp{1}.sn2def.vox = [NaN NaN NaN];
    matlabbatch{1}.spm.util.defs.comp{1}.inv.comp{1}.sn2def.bb = [NaN NaN NaN
                                                                  NaN NaN NaN];
    matlabbatch{1}.spm.util.defs.ofname = '';
    matlabbatch{1}.spm.util.defs.fnames = {input};
    matlabbatch{1}.spm.util.defs.savedir.saveusr = {output};
    matlabbatch{1}.spm.util.defs.interp = 0;

    spm_jobman('run',matlabbatch)

以上のMATLABスクリプトを、Linuxのコマンドで実行する。

run.sh
# Ungzip
find . -name "*.nii.gz" | xargs -i gunzip {}

# Define
COMMAND_MATLAB=$(command -v matlab)
SPM=.'/spm8'
NIFTI='./NIfTI_20130306'

for SUB in $(ls -F Data | grep / | cut -d / -f1); do
    # Define
    INPUT_L="./Data/${SUB}/1mm_ROI_L_3_MNI_relabel_group.nii"
    INPUT_R="./Data/${SUB}/1mm_ROI_R_3_MNI_relabel_group.nii"
    OUTPUT=""./Data/${SUB}""
    REFIMG="./Data/${SUB}/b0.nii"
    MAT="./Data/${SUB}/diff2MNI_sn.mat"

    # Apply Deformation for left ROI
    echo "SUBDIR: ${SUB}"
    echo "INPUT_L: ${INPUT_L}"
    echo "INPUT_R: ${INPUT_R}"
    echo "OUTPUT: ${OUTPUT}"
    echo "REFIMG: ${REFIMG}"
    echo "MAT: ${MAT}"
    ${COMMAND_MATLAB} -nodisplay -nosplash -r \
        "addpath('${PIPELINE}');addpath('${SPM}');addpath('${NIFTI}');\
spm_util_deform_inv('${INPUT_L}','${OUTPUT}','${REFIMG}','${MAT}');\
exit"

    # Apply Deformation for Right ROI
    ${COMMAND_MATLAB} -nodisplay -nosplash -r \
        "addpath('${PIPELINE}');addpath('${SPM}');addpath('${NIFTI}');\
spm_util_deform_inv('${INPUT_R}','${OUTPUT}','${REFIMG}','${MAT}');\
exit"

done



頑張れ!喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓