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

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

【初心者MRI画像解析】DTIFITを用いたDTI解析

f:id:AIProgrammer:20201105223153p:plain

目的

  • 拡散MRIをDTIFITを用いてDTI解析

DTIFITの基本的な使い方

必要なデータは以下。

  • DWI images
  • b-vectors file
  • b-values file

DTIFITを実行するには次のコマンドを実行する。<>の中身を自身の持っているファイル名に適宜置き換える。は任意。ドルマーク$は、入力する必要はない。以下同様。

$ dtifit -k <DWI images> -o <OUTPUT> -m <MASK> -r <b-vectors file> -b <b-values file>

データが一つの時

DTI解析に必要なファイルは次の通り。Sub001のフォルダにDWIや軸情報が格納されているとする。マスクはプログラムで自動的に生成するので必要なし。

Sub001/
├── bvals.bval
├── bvecs.bvec
└── dwi.nii.gz

マウスを使って、上記のファイルのある場所に移動する。解析をしたいフォルダを「右クリック」し、「端末で開く (E)」をクリック。

f:id:AIProgrammer:20201105224155p:plain

すると、端末が立ち上がる。(コマンドプロンプトと言った方がしっくりくる人もいる??)

f:id:AIProgrammer:20201105224210p:plain

立ち上げた端末が、どこで立ち上がっているのかを確認するためには次のコマンドを実行する。ドルマーク$は、入力する必要はない。

$ pwd
/home/neuro/Documents/Yuya_S/temp/dtifit/2_analyze/single/Sub001

端末が今いるディレクトリに存在するファイルを確認するにはlsコマンドを用いる。

$ ls
bvals.bval  bvecs.bvec  dwi.nii.gz

DTIFITを用いたDTI解析をするには、次にコマンドを実行する。

「THRESHOLD=30」は、マスクを生成する際のしきい値であり、前もって自分で背景信号を確認してしきい値を設定する。この場合は、信号値が30以上の領域をマスクとするようになっている。

コピーペーストでOK。ただし、端末に貼り付ける場合には、右クリックをして「貼り付け (P)」を選択、ショートカットキーを使う場合はペースト時に「ctrl + V」ではなく「ctrl + shift + V」を押さないと貼り付けられない。

# 1. Define
DWI='dwi'
OUTPUT='output'

# 2. Compress NIFTI (.nii to .nii.gz)
find . -name "*nii" | xargs -i gzip {}

# 3. Create mask
fslroi $DWI b0 0 1
THRESHOLD=30
fslmaths b0 -thr $THRESHOLD -bin mask

# 4. DTI fit
dtifit -k $DWI -o $OUTPUT -m mask -r *.bvec -b *.bval

処理が終わると、「output」という接頭辞がついたファイルが生成される。これがDTIFITの出力画像。この内、FAはoutput_FA.nii.gz、ADC (MD)はoutput_MD.nii.gzである。

$ tree Sub001/Sub001/
├── b0.nii.gz
├── bvals.bval
├── bvecs.bvec
├── dwi.nii.gz
├── mask.nii.gz
├── output_FA.nii.gz
├── output_L1.nii.gz
├── output_L2.nii.gz
├── output_L3.nii.gz
├── output_MD.nii.gz
├── output_MO.nii.gz
├── output_S0.nii.gz
├── output_V1.nii.gz
├── output_V2.nii.gz
└── output_V3.nii.gz

f:id:AIProgrammer:20201105224227p:plain

画像を確認するには、次のコマンドを実行する。

# 5. Check files
fsleyes $DWI \
        ${OUTPUT}_FA \
        ${OUTPUT}_MD &

データが複数ある場合。

次のように、Sub001, Sub002, Sub003とデータが複数ある場合を考える。

f:id:AIProgrammer:20201105224239p:plain

それぞれのフォルダ内のファイルは次の通り。「run.sh」は、一気にDTI解析するためのスクリプト。

$ tree .
.
├── Sub001
│   ├── bvals.bval
│   ├── bvecs.bvec
│   └── dwi.nii.gz
├── Sub002
│   ├── bvals.bval
│   ├── bvecs.bvec
│   └── dwi.nii.gz
├── Sub003
│   ├── bvals.bval
│   ├── bvecs.bvec
│   └── dwi.nii.gz
└── run.sh

次のコードを「run.sh」として、Sub001, Sub002, Sub003と同じ階層に保存する。「THRESHOLD=30」は、マスクを生成する際のしきい値であり、前もって自分で背景信号を確認してしきい値を設定する。

run.sh

function main() {
    # 1. Define
    DWI='dwi'
    OUTPUT='output'

    # 2. Compress NIFTI (.nii to .nii.gz)
    find . -name "*nii" | xargs -i gzip $SUB/{}

    # 3. Create mask
    fslroi $SUB/$DWI $SUB/b0 0 1
    THRESHOLD=30
    fslmaths $SUB/b0 -thr $THRESHOLD -bin $SUB/mask

    # 4. DTI fit
    dtifit -k $SUB/$DWI -o $SUB/$OUTPUT -m $SUB/mask -r $SUB/*.bvec -b $SUB/*.bval
}

for SUB in $(ls -F | grep / | cut -d / -f1); do
    echo "Processing $SUB ..."
    main
done

run.shの容易ができたら、マウスを使ってSub001, Sub002, Sub003のあるディレクトリまで移動し、端末を立ち上げる。この時、下図のように「白い部分」を右クリックして、「端末で開く(E)」を選択する。こうすることで、Sub001, Sub002, Sub003と同じ階層で端末を開くことができる。

f:id:AIProgrammer:20201105224252p:plain

端末を立ち上げた場所を確認するには、pwdコマンドを用いる。

$ pwd
/home/neuro/Documents/Yuya_S/temp/dtifit/2_analyze/multi

端末が今いるディレクトリのファイルを確認するには、lsコマンドを実行する。

$ ls
Sub001  Sub002  Sub003  run.sh

Sub001, Sub002, Sub003のデータを一気にDTI解析したい場合には、run.shを実行する。実行には、次のコマンドを実行する。

$ bash run.sh