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

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

FSLを使ったVolumeの一括計測

f:id:AIProgrammer:20200508150301p:plain

目的

FSLをつかったVOI (ROI) Volumeの計測。

Volume計算

Volume計算にはFSLコマンドのfslstatsを用いる。 -Vオプションでvoxel数とvolumeを計測できる。

-V : output (for nonzero voxels)

$ fslstats lt_SN_mask.nii -V
529 293.009949

Volumeのみを取り出したい場合は、cutコマンドを用いる。

  • -d : 区切り文字を指定
  • f : 何個目の要素かを指定

このケースだと、空白(" ")で区切って(-d " ")、2個目の要素(-f2)であるVolumeを抽出。

$ fslstats lt_SN_mask.nii -V | cut -d " " -f2
293.009949

一括で計測する場合

フォルダ構造

3人の被験者がいて、以下のVOIのVolumeを計測する。

  • VTA_mask.nii
  • lt_SN_mask.nii
  • lt_ant_SN_mask.nii
  • lt_mid_SN_mask.nii
  • lt_pos_SN_mask.nii
  • rt_SN_mask.nii
  • rt_ant_SN_mask.nii
  • rt_mid_SN_mask.nii
  • rt_pos_SN_mask.nii
.
├── sub_1
│   ├── 20171007_134045tse3t1Conc1p1Neuromelanins020a1001A.nii
│   ├── MB.nii
│   ├── VTA_mask.nii
│   ├── kiritori.nii
│   ├── lt_SN_mask.nii
│   ├── lt_ant_SN_mask.nii
│   ├── lt_mid_SN_mask.nii
│   ├── lt_pos_SN_mask.nii
│   ├── rt_SN_mask.nii
│   ├── rt_ant_SN_mask.nii
│   ├── rt_mid_SN_mask.nii
│   └── rt_pos_SN_mask.nii
├── sub_2
│   ├── 20171007_134045tse3t1Conc1p1Neuromelanins020a1001A.nii
│   ├── MB.nii
│   ├── VTA_mask.nii
│   ├── kiritori.nii
│   ├── lt_SN_mask.nii
│   ├── lt_ant_SN_mask.nii
│   ├── lt_mid_SN_mask.nii
│   ├── lt_pos_SN_mask.nii
│   ├── rt_SN_mask.nii
│   ├── rt_ant_SN_mask.nii
│   ├── rt_mid_SN_mask.nii
│   └── rt_pos_SN_mask.nii
└── sub_3
├── 20171007_134045tse3t1Conc1p1Neuromelanins020a1001A.nii
├── MB.nii
├── VTA_mask.nii
├── kiritori.nii
├── lt_SN_mask.nii
├── lt_ant_SN_mask.nii
├── lt_mid_SN_mask.nii
├── lt_pos_SN_mask.nii
├── rt_SN_mask.nii
├── rt_ant_SN_mask.nii
├── rt_mid_SN_mask.nii
└── rt_pos_SN_mask.nii

コード

以下のコードを実行すると、各被験者、各ROIごとのVolumeを計測し、まとめてresult_vol.txtとして出力する。

#!/bin/sh

count=0
for sub in *;do
    echo "$sub done..."
    count=$(( ${count}+1 ))
    if [ ${count} = 1 ]; then
        # redirect subject name (folder name)
        echo "ID" >> tmp_ID
    fi
    echo ${sub} >> tmp_ID

    for roi in lt_SN rt_SN lt_ant_SN rt_ant_SN lt_mid_SN rt_mid_SN lt_pos_SN rt_pos_SN VTA;do
        if [ ${count} = 1 ]; then
            # redirect ROI name
            echo "${roi}(mm^3)" > tmp_${roi}
            # calc ROI vol
            fslstats ${sub}/${roi}_mask -V |cut -d " " -f2 >> tmp_${roi}
        else
            # calc ROI vol
            fslstats ${sub}/${roi}_mask -V |cut -d " " -f2 >> tmp_${roi}
        fi
    done
done

# merge calc result
paste tmp* > result_vol.txt
# remove tmp files
rm tmp*

結果

result_vol.txtの中身は以下。 sub1~sub3は、同じデータを複製したものなので値は同じ。

ID VTA(mm3) lt_SN(mm3) lt_ant_SN(mm3) lt_mid_SN(mm3) lt_pos_SN(mm3) rt_SN(mm3) rt_ant_SN(mm3) rt_mid_SN(mm3) rt_pos_SN(mm3)
sub_1 29.910278 293.009949 132.380676 104.685974 55.943298 304.087830 122.410583 106.347656 75.329590
sub_2 29.910278 293.009949 132.380676 104.685974 55.943298 304.087830 122.410583 106.347656 75.329590
sub_3 29.910278 293.009949 132.380676 104.685974 55.943298 304.087830 122.410583 106.347656 75.329590



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