第5回:有意差がある領域を可視化する
これまでの連載では、コマンドライン操作から始まり、bashスクリプトでの自動処理、NIfTI形式の脳画像ファイル、fslstatsによる統計値取得、tfce_corrpファイルを用いた有意差判定までを学んできました。
今回はその次のステップとして、有意差がある領域をわかりやすく可視化するためのtbss_fillコマンドを紹介し、それを自動的に実行するスクリプトを作成していきます。
さらに、多くのファイルを扱う際に有用な並列処理や一時ファイルの管理手法も学びます。
tbss_fillコマンドの役割と入力条件
tbss_fillは、TBSS解析後に得られた有意領域を強調表示するためのツールです。
tbss_fill <tfce_corrp_file> <threshold> <mean_FA> <output_fill_file>
という形で実行します。
ここで、
<tfce_corrp_file>:有意差が判定された解析結果ファイル(tfce_corrp_tstatX.nii.gzなど)
<threshold>:有意とみなす補正p値閾値(たとえば0.95)
<mean_FA>:TBSSで生成された平均FA画像(通常 mean_FAと呼ばれるファイル)
<output_fill_file>:強調表示した結果を保存するファイル名(*_fill.nii.gzなど)
tbss_fillは指定した閾値以上のボクセルを抽出し、mean_FA画像をベースに有意部分を強調表示した画像を生成します。
有意差ありと判定されたファイルに対してtbss_fillを自動実行する
前回までで作成した有意差判定スクリプト(check_significance.sh)を応用します。
「有意差あり」と判定された場合、そのファイルに対応するfill画像を自動生成する新しいスクリプトを作ってみましょう。
並列処理(&とwait)による効率化
tbss_fillを多数のファイルに対して実行する場合、1つずつ実行していると時間がかかります。bashでは、コマンドの末尾に&を付けることでバックグラウンドで並行実行が可能です。
各実行コマンドの後ろに&を付けて並列実行
全部の処理が終わるまで待つにはwaitコマンドを使用
こうすると、多数のファイルを並行して処理でき、処理時間を短縮できます。ただし、同時並列数が増えるとCPU使用率が上昇するため、実行環境に合わせた並列度調整が必要です。
一時ファイル(mktemp)やtrapの使い方
スクリプト中で一時的にデータを記録したい場合、mktempコマンドを使うと安全な一時ファイルを作成できます。
tmpfile=$(mktemp)で安全な一時ファイルを生成
スクリプト終了時(正常終了・エラー終了問わず)にtrap 'rm -f $tmpfile' EXIT と書いておくと、スクリプト終了時に自動的に一時ファイルが削除されます。
これにより、一時的な中間データを安全かつ確実に片付けることができます。
スクリプト例:有意差ありtfce_corrpファイルからfill画像生成
ここでは、以下の手順でスクリプトを組み立てます。
カレントディレクトリにtfce_corrpファイルが複数あると仮定(tfce_corrp_tstat1.nii.gz, tfce_corrp_tstat2.nii.gzなど)
fslstatsで最大値を取得し、0.95以上なら有意差ありと判断
有意差ありのファイルに対してtbss_fillコマンドを実行して_fillファイルを生成
並列実行により複数ファイルを効率的に処理
mktempで作成した一時ファイルを利用して、有意差ありのファイルリストを管理
スクリプト例:fill_significant.sh
#!/bin/bash
set -euo pipefail
# mean_FAファイルのチェック(TBSS解析で生成される基本ファイル)
mean_FA="mean_FA"if [[ ! -f $mean_FA.nii.gz ]]; then
echo "$mean_FA.nii.gz が見つかりません。TBSS解析ディレクトリで実行してください。"
exit 1
fi
# 一時ファイル作成
tmpfile=$(mktemp)trap 'rm -f $tmpfile' EXIT
threshold=0.95
# tfce_corrpファイルを探索
# `ls`と`grep`でファイル抽出するが、拡張子やファイル数に応じて修正可能
ls tfce_corrp*_tstat*.nii.gz 2>/dev/null > $tmpfile || { echo "tfce_corrpファイルが見つかりません。" exit 0}
# 一時ファイルからファイル名を1行ずつ読み込んで処理
while IFS= read -r file; do
# fillファイルが既にある場合はスキップ
if [[ -f ${file%.nii.gz}_fill.nii.gz ]]; then
echo "${file%.nii.gz}_fill.nii.gz は既に存在します。スキップします。"
continue
fi
# fslstatsで最大値取得
stats=$(fslstats "$file" -R)
max_val=$(echo $stats | cut -d " " -f 2)
# 有意差判定
is_significant=$(echo "$max_val >= $threshold" | bc)
if [[ $is_significant -eq 1 ]]; then
# 有意差ありならtbss_fill実行(並列化のため&をつける)
tbss_fill "${file%.nii.gz}" $threshold $mean_FA "${file%.nii.gz}_fill" &
echo "$file で有意差あり。_fillファイル生成中..."
else
echo "$file は有意差なし。_fillファイルは生成しません。"
fi
done < $tmpfile
# 全ジョブが終了するまで待機
wait
echo "全ての処理が終了しました。"
スクリプトの解説
set -euo pipefailでエラーハンドリングを強化
mktempとtrapで一時ファイルを安全に取り扱い
ls tfce_corrp*_tstat*.nii.gzで対象となる結果ファイルを収集
fslstatsで最大値取得→bcで比較して閾値以上ならtbss_fill実行
&をつけて並列実行、最後にwaitで全ジョブ完了を待つ
_fill.nii.gzが既にある場合は再生成をスキップして効率化
実行例
chmod +x fill_significant.sh
./fill_significant.sh
有意な差を示すtfce_corrpファイルがあれば、その_fill.nii.gzファイルが自動生成されます。これをfsleyesなどで可視化すれば、解析結果が分かりやすくなります。
まとめ
今回学んだポイント:
tbss_fillコマンドで有意領域を強調表示できる
有意差判定ロジックを組み込み、有意なファイルに対してのみ自動的にfill画像生成
&とwaitで並列処理を行い、多数のファイル処理を効率化
mktempとtrapで一時ファイルを管理し、スクリプト終了時に後片付けを自動化
次回は、いよいよfsleyesによる結果可視化設定をスクリプトに組み込み、完成形に近づけていきます。これで解析結果の表示までフルオート化できるようになり、脳画像解析パイプラインをより洗練された形に整えることができるでしょう。