見出し画像

第7回:総合スクリプトの完成とエラーハンドリング、再利用性の向上

これまで6回にわたり、コマンドライン操作の基本からbashスクリプトでの自動化、NIfTI形式やFSLツールを使った脳画像解析結果の扱い方、そして有意差判定~fill画像生成~fsleyesによる可視化まで、一連のステップを学んできました。
今回はその総仕上げとして、これまでの内容を集約した総合スクリプトを完成させます。エラーハンドリングやコメントの整理を行い、今後の応用にも耐えられる形に整えましょう。


ここまでのおさらい

  1. コマンドライン基本(第1回・第2回)

    • ls, cd, mkdirなど基本コマンド

    • #!/bin/bashによるスクリプト化、if文やforループ、grepやcutなどのテキスト操作

  2. NIfTIやFSL基礎(第3回)

    • fslhdでヘッダ確認、fslstatsで統計値抽出

    • NIfTIファイルから必要情報をスクリプトで取得

  3. tfce_corrpファイルと有意差判定(第4回)

    • tfce_corrpファイルから最大値を抽出し、0.95以上で有意差ありと判定

  4. tbss_fillによるfill画像生成(第5回)

    • 有意差ありファイルに対しtbss_fillで*_fill.nii.gz生成

    • 並列処理(&とwait)、mktempとtrapで一時ファイル管理

  5. 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による可視化まで、一連の流れを一つのスクリプトにまとめることができました。
このスクリプトは、脳画像解析パイプラインの最後に配置すれば、解析終了後に自動的に有意領域を抽出し、強調表示した上で可視化環境を立ち上げることができます。研究ワークフローを効率化し、再現性を高める手助けとなるでしょう。
ここまででスクリプト作成は終了です。お疲れさまでした!
今後は、学んだ知識を活かして自分の研究解析パイプラインに応用したり、他の解析ツールやパイプラインとの組み合わせを検討してみてください。


いいなと思ったら応援しよう!