第7回:総合スクリプトの完成とエラーハンドリング、再利用性の向上
これまで6回にわたり、コマンドライン操作の基本からbashスクリプトでの自動化、NIfTI形式やFSLツールを使った脳画像解析結果の扱い方、そして有意差判定~fill画像生成~fsleyesによる可視化まで、一連のステップを学んできました。
今回はその総仕上げとして、これまでの内容を集約した総合スクリプトを完成させます。エラーハンドリングやコメントの整理を行い、今後の応用にも耐えられる形に整えましょう。
ここまでのおさらい
コマンドライン基本(第1回・第2回):
ls, cd, mkdirなど基本コマンド
#!/bin/bashによるスクリプト化、if文やforループ、grepやcutなどのテキスト操作
NIfTIやFSL基礎(第3回):
fslhdでヘッダ確認、fslstatsで統計値抽出
NIfTIファイルから必要情報をスクリプトで取得
tfce_corrpファイルと有意差判定(第4回):
tfce_corrpファイルから最大値を抽出し、0.95以上で有意差ありと判定
tbss_fillによるfill画像生成(第5回):
有意差ありファイルに対しtbss_fillで*_fill.nii.gz生成
並列処理(&とwait)、mktempとtrapで一時ファイル管理
fsleyesによる可視化(第6回):
fsleyesで標準脳、スケルトン、有意領域、fill画像をまとめて表示
条件をテキストファイルに書き出し、fsleyesに一括適用
総合スクリプトに求めること
有意差判定~fill生成~fsleyes表示までを一度に実行
入力ファイル(tfce_corrp系ファイル、mean_FA.nii.gz、標準脳、スケルトン画像)の存在チェック
エラー発生時は適切なメッセージを表示して終了
コメントを充実させ、他の人や自分が後で見たときにも分かりやすい
閾値や表示条件などを変数で管理し、他の解析にも応用しやすいようにする
完成版スクリプト例:run_analysis.sh
以下に総合スクリプト例を示します。これまでの個別スクリプトを統合・整理したものです。
#!/bin/bash
set -euo pipefail
#######################################
# 総合スクリプト: 有意差判定→fill生成→fsleyes表示
# 前提条件:
# - FSL環境が設定済み (${FSLDIR} 有効)
# - mean_FA.nii.gz, tfce_corrp_tstat*.nii.gz 等が存在する
#######################################
### ユーザ設定パラメータ ###
threshold=0.95
brain_display_range_start=2000
brain_display_range_end=10000
# 表示するtstatの種類(ここではtstat1を例に)
tstat_list=("tstat1" "tstat2")
# 必要に応じてtstat2なども表示したい場合はここに追加
# 入力ファイルチェック
if [[ -z ${FSLDIR:-} ]]; then
echo "FSLDIRが設定されていません。FSL環境をロードしてください。"
exit 1
fi
mean_FA="mean_FA.nii.gz"
if [[ ! -f $mean_FA ]]; then
echo "$mean_FA が見つかりません。TBSS解析ディレクトリで実行してください。"
exit 1
fi
standard_brain="${FSLDIR}/data/standard/MNI152_T1_1mm_brain.nii.gz"
if [[ ! -f $standard_brain ]]; then
echo "標準脳 $standard_brain が見つかりません。FSL環境が正しく設定されているか確認してください。"
exit 1
fi
mean_FA_skeleton="mean_FA_skeleton.nii.gz"
if [[ ! -f $mean_FA_skeleton ]]; then
echo "$mean_FA_skeleton が見つかりません。TBSS処理が完了していない可能性があります。"
exit 1
fi
# 一時ファイル作成とクリーンアップ設定
tmpfile_tfce_corrp=$(mktemp)
tmpfile_fsleyes_conditions=$(mktemp)
trap 'rm -f "$tmpfile_tfce_corrp" "$tmpfile_fsleyes_conditions"' EXIT
# tfce_corrpファイル抽出
ls tfce_corrp*_tstat*.nii.gz 2>/dev/null > "$tmpfile_tfce_corrp" ||
{
echo "tfce_corrpファイルが見つかりません。解析結果が存在しないようです。"
exit 0
}
echo "有意差判定を開始します (閾値: $threshold)..."
# tbss_fillによるfill画像生成(有意差ありファイルのみ)
# 並列処理用バックグラウンド実行
while IFS= read -r file; do
# ファイル名から拡張子を除いたベース名
base=${file%.nii.gz}
# 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
# fillファイル名 (base_fill.nii.gz)
fill_file="${base}_fill.nii.gz"
if [[ -f $fill_file ]]; then
echo "$fill_file は既に存在します。スキップします。"
else
echo "$file: 有意差あり (max=$max_val)。tbss_fillで生成中..."
tbss_fill "$base" $threshold mean_FA "$base"_fill &
fi
else
echo "$file: 有意差なし (max=$max_val)"
fi
done < "$tmpfile_tfce_corrp"
# 全tbss_fillジョブ終了待ち
wait
echo "tbss_fill処理が完了しました。"
# fsleyes表示条件のテキストファイルへの書き出し
# 標準脳・スケルトン
echo "$standard_brain -dr $brain_display_range_start $brain_display_range_end" > "$tmpfile_fsleyes_conditions"
echo "mean_FA_skeleton -dr $brain_display_range_start $brain_display_range_end -cm green" >> "$tmpfile_fsleyes_conditions"
# tstatファイルごとに表示条件を追加
# 有意領域は0.95~1を赤系カラーマップで表示
# fill画像は0~1で同色系表示
for tstat in "${tstat_list[@]}"; do
# オリジナルtfce_corrpファイル表示
corrp_file="tfce_corrp_${tstat}.nii.gz"
if [[ -f $corrp_file ]]; then
echo "${corrp_file%.nii.gz} -dr 0.95 1 -cm red-yellow" >> "$tmpfile_fsleyes_conditions"
fi
# fillファイル表示
fill_file="tfce_corrp_${tstat}_fill.nii.gz"
if [[ -f $fill_file ]]; then
echo "${fill_file%.nii.gz} -dr 0 1 -cm red-yellow" >> "$tmpfile_fsleyes_conditions"
fi
done
echo "fsleyesを起動します。"
fsleyes $(<"$tmpfile_fsleyes_conditions") &
スクリプトのポイント
set -euo pipefailでエラーに強いスクリプト
必要ファイルの存在チェックで、わかりやすいエラーメッセージを出力
閾値、表示範囲、カラーマップなどを変数で管理しやすくし、将来他の値に変更したい時にソースコード中を大量に修正する必要を減らす
trapで一時ファイルを終了時に削除し、クリーンな状態を保つ
複数のtfce_corrpファイルがあっても処理可能(ループ処理+並列化で効率的に処理)
fsleyes用のオプションは別ファイルに書き出して後で一気に読み込む構造で可読性を確保
今後の応用について
パラメータ変更:
thresholdやbrain_display_range_start/endは変数化したので簡単に変更可能です。別の有意閾値や表示範囲を試すことができます。他の解析への展開:
tfce_corrpではなく他の解析結果ファイル(例えばfMRI解析結果)に対しても、最大値取得や閾値判定のロジックを流用できます。
カラーマップや表示範囲を変更すれば、別のコントラストや別パラメトリックマップに対応可能です。追加機能:
ログファイル出力機能を追加して、処理の経過を記録
コマンドライン引数で入力パラメータを変更できるようにして、スクリプトをより柔軟に
関数化することで、コードの再利用性や可読性向上
まとめ
これで、最初のコマンドライン操作から、bashスクリプトによる自動化、FSLツールによる解析結果ファイルの扱い、有意差判定、フィル画像生成、そしてfsleyesによる可視化まで、一連の流れを一つのスクリプトにまとめることができました。
このスクリプトは、脳画像解析パイプラインの最後に配置すれば、解析終了後に自動的に有意領域を抽出し、強調表示した上で可視化環境を立ち上げることができます。研究ワークフローを効率化し、再現性を高める手助けとなるでしょう。
ここまででスクリプト作成は終了です。お疲れさまでした!
今後は、学んだ知識を活かして自分の研究解析パイプラインに応用したり、他の解析ツールやパイプラインとの組み合わせを検討してみてください。