FSLユーザーのためのシェルスクリプトチュートリアル

FSLを開発しているFMRIBグループは、FSL courseのスライドおよびデータセットを公開してくださっています。ここで勉強しているときに、さりげなくシェルスクリプトのチュートリアルもあることが気になっていました。

先日、時間をとってこのチュートリアルを丁寧に見ていったところ、非常に勉強になることが多く、シェルスクリプトの理解が深まりました。FSLユーザーのみならず、脳画像解析でUNIX系のOS(Macも含む)を使う方々にとって有益な情報が多いと思いましたので、日本語にしておきたいと思い、FMRIBのSteve Smith教授の承諾を得て、このチュートリアルを翻訳させていただきました。

オリジナルのサイト自体は、スライド形式になっており、レクチャーと演習部分にわかれています。しかし、翻訳していく段階でこれを完全に模倣するよりは、レクチャーと演習をそれぞれ別の媒体として準備するのも勉強するのには都合がいいかもと考え、それぞれ別のPDFを準備しました。

関心のある方は、以下のリンクからPDFをご覧いただけたらと思います。

FSL course: シェルスクリプト
FSL course: シェルスクリプト演習

FSLユーザーのためのシェルスクリプトチュートリアル” へのコメント

  1. 初めまして。根元先生のブログ日頃から拝見させていただいています。
    初歩的な質問で大変申し訳ないですが、以下の論文「Associations Between Injury of the Parieto-Insular Vestibular Cortex and Changes in Motor Function According to the Recovery Process: Use of Diffusion Tensor Imaging Yeo.2021」で使用されているようなPIVC繊維の解析を行いたいと考えております。
    こちらはTBSSを使用すればよろしいのでしょうか。
    またbvalはありますが,bvecがないのですが、やはりこのような繊維の解析は困難でしょうか。
    ご教授いただけると嬉しいです。

    • 佐藤先生

      bvecがないと、解析は難しいです。拡散MRIの解析には必須と思ってください。
      また、論文を拝見する限り、TBSSだけでなく、Bedpostx, Probtrackxを行っていると思います。

  2. 根本先生  

    初めまして、平素より先生のブログを拝見させていただいております。
    理学療法士をしており、来年度より大学院進学を予定している者です。

    研究にて、FSLを使用し脳卒中患者様の皮質脊髄路および皮質網様体路の損傷程度をFA値(ratio FA)にて評価したいと考えております。

    FSLにて設定したROIのFA値を算出することは可能でしょうか。
    (例)皮質脊髄路:中脳大脳脚にROI設定しFA値(ratio FA)を算出
    また、可能でしたらどのような手順で進めていけばよいでしょうか、ご教授をいただけないでしょうか。

    現在、macにてFSLをインストールし、データをeddyにて前処理が終わっている状況です。

    お忙しい所恐縮ですが、ご返信・アドバイス等をいただけると幸いです。

    • 小山田さん

      FSLでROI中のFA値を算出することは可能です。
      eddyの後、DTIFITというプログラムを通してFA画像を求めます。
      ROIが標準化されているのならば、FLIRT, FNIRTを使ってFA画像を標準化します。

      その後、fslstatsというプログラムを使うと値を抜き出すことができるのですが、
      fslstats -k ROI画像 FA画像 -M

      という形で指定すると、FA画像から、ROI画像におけるFAの平均値を算出することができます。

      このような形でどうでしょうか?

      • 根本先生

        ご多忙の中、ご返信をいただき誠にありがとうございます。
        ご教授いただいた内容を実行できるよう進めて参りたいと思います。

        皮質網様体路に関しては、一度seedを延髄網様体、targetを補足運動野に設定し確率的Tractographyを描出し、皮質網様体路の神経線維を確認した後に、延髄網様体のFA値を算出したいと思っております。
        その際には、BedpostXの後にProbtrackXを実行し確率的Tractographyを描出し、先程ご教授いただいた通り、fslstatsを用いて延髄網様体のFA値を算出するという流れでよろしいのでしょうか。

        追加での質問で大変申し訳ございませんが、お時間のある時にご返事をいただけると幸いです。

        • はい、おそらく大丈夫です。私がProbtrackXの経験が少ないので、ProbtrackXが無事に結果が出たらまた相談いただけたら幸いです。

          • 根本先生

            ご回答をいただき誠にありがとうございます。
            今後解析を進めさせていただきます。
            本当にありがとうございました。

  3. 根本先生

    はじめまして.
    理学療法学専攻の大学院生です.

    いつも参考にさせて頂いております.

    DTTの解析を行う前におけるDTIデータの前処理に関して質問がございます.

    FA画像を構築した後,DSI StudioにFA画像を取り込む際に
    「not a 4D nifti file」 とエラーメッセージが出てしまい取り込むことができません.

    b=0画像をマスキングする際に,
    fslsplitで4D画像を3D画像に分離していることが原因かと思いましたが,
    dtifitで分離した各ファイルを合成しているため,原因が分からず途方に暮れています…

    また,DSI StudioでDTTの解析を行うにあたり,
    先行研究では参照するDTIデータをFA画像としている場合が多いように感じます.
    可能でしたらその理由も教えて頂ければ幸いです.

    お忙しいところ恐縮ですが,どうか宜しくお願い致します.

    • DSI studioですが、FA画像ではなく、前処理をする前の画像をいれるんですね。
      なので、最初の4次元画像を指定してみてはいかがでしょうか?

      • もう少し詳しく説明すると、FA画像というのは、拡散画像を元に、各ボクセルにおけるFAを計算し、それを画像にしたものですので、3次元画像になります。
        そこにベクトル情報はないので、トラクトグラフィを行いたい場合、FAを使うことはできません。
        参照するDTIデータをFA画像としているというのは、あくまでも、トラクトグラフィを表示する際に、その背景に使う画像のことを示しているのではないでしょうか?

        • 根本先生

          ご回答ありがとうございます。

          ベクトル情報は最初の4D画像に含まれることは理解できました。

          最初の4D画像をeddy currentを用いて渦電流歪補正を行った後、
          DSI Studioでの解析を試みることは可能でしょうか?

          • はい、おそらく問題ないと思います。
            eddy_correctは、最初のb0に位置合わせをしているのにすぎないので。
            ただ、「おそらく」と言っている理由は、bvecsをrotationした方がいいのではという話題もあるからで、
            とりあえず試してみるのはなんら悪くないと思います。

          • 根本先生

            ご回答ありがとうございます。

            最初の4D画像をeddy currentを用いて渦電流歪補正を行った後、
            DSI Studioに取り込もうとすると下記のエラーメッセージが出てきてしまいます。

            Cannot find b-table from the header. You may need to load an external b-table

            対応策をご教授して頂けると大変助かります。
            お忙しいところ恐縮ですが宜しくお願い致します。

          • bvecとbvalはどちらにありますか?
            bvecとbvalが同じディレクトリ内にあることが必要です。

  4. 根本先生.
    初めまして放射線専攻の大学院生をしております.N.M.と申します.
    Studyの一貫で脳画像解析を行うので,先生のブログを参考にしFSLのインストールを完了させました.
    OSはMacです.ここで以下の2点についてご質問等ございますのでご教授いただけないでしょうか.

    ①FSLを用いた解析は具体的にどのようなことができるのでしょうか.イメージとしてSPMなどでしょうか.よく聞いた話ですと白質マスクの作成などができると聞いています.画像含む根本先生が作成しているブログ等で参考になるのがございましたらご紹介願います.(一度FSLに関する先生のブログは一通り目を通しています)

    ②初めにFSLview(現FSLeyes)の使用を試みましたが,タブをクリックするとターミナルで以下コード
    sh: /usr/local/fsl/bin/fsleyes: No such file or directory が表示されます.インストールされていないということでしょうか.またターミナルよりPythonの方が操作は簡便でしょうか.

    かなり情弱及び知識不足で申し訳ございませんが,ご確認お願いいたします.

    • N.M.さん

      ご質問ありがとうございます。

      1. FSLは、fMRIの解析(FEAT, MELODIC)、DTIの解析(TBSS)、構造画像の解析(FSL-VBM)などで使うことが多いです。
       どのようなことをしたいということがありますか?

      2. FSLeyesのエラーは、あるあるネタです。
       https://www.nemotos.net/?p=3568
      こちらをご参考に対処されてはいかがでしょうか。

      うまくいかないようでしたら、またご相談ください。

      根本清貴

      • 根本先生

        ご回答ありがとうございます.

        FSLの詳細も多くは知らないのですが,FSLは根本先生が述べてらっしゃるアプリケーションを稼働させるためのツールという解釈で大丈夫でしょうか.
        もしそうでしたら最終的にはVBMを用いたいです.使用ツールとしてMATLABを用いているので基本的にはボリューム単位で解析をしたいと考えております.

        またエラーに関しては添付URLを参考にしてみます.再度質問させていただくと思いますが
        よろしくお願いします.

        • VBMを行いたいんですね。
          Matlabを用いていらっしゃるのであれば、SPMを使っていただくことからはじめられてはいかがでしょうか。
          拙著「すぐできるVBM」に方法を詳しく書いてありますので、そちらを参考にしていただけたらと思います。

          根本清貴

          • 根本先生

            ありがとうございます.
            居室にありますので参考にさせていただきます.
            この度はありがとうございました.

            N.M.

  5. 私は精神科医で脳画像研究をしているものです。
    script、downloadなど日本語で初歩的なところから解説しているものが中々見つからない中、先生のblogは本当に重宝しております、ありがとうございます。

    ところで、shell scriptのpdfについて1つ質問があります。
    ” “(ダブルクオート)で*(ワイルドカード)が囲まれた場合、展開されないと4.7に書いてあるのですが、5.7では、「v=”im*.nii.gz” echo $v」とすると、ワイルドカードが展開された形で表示されます。これは、どのように解釈すればよろしいでしょうか?おそらくかなり初歩的な質問かと思われますが、ご教示いただけると幸いです。

    • ty様

      ご質問ありがとうございます。

      short answerとしては、(ワイルドカードだけなので)

      変数v は im*.nii.gz となるが、

      echo $vとした時点で、echo im*.nii.gzと指定したことと同じことになり、
      シェルにてワイルドカードが展開されるため、結果的にワイルドカードが展開される

      ということになります。

      Long answerとしては、以下をターミナルで試してみてください。

      まず、何もないディレクトリを準備します。たとえば、ホームディレクトリの下にtmpというディレクトリを作成し、そのディレクトリに移動します。

      $ mkdir tmp
      $ cd tmp

      次に、v=”im*.nii.gz”とタイプし、さらにecho $vとタイプしてください。

      $ v="im*.nii.gz"
      $ echo $v

      そうすると、

      im*.nii.gz

      と表示されるかと思います。

      次に、そのディレクトリの中にダミーでim1.nii.gz と im2.nii.gz というファイルを作成してみます。
      Linuxではtouchというコマンドを作ると、ファイルサイズ0のファイルが作成できます。

      $ touch im1.nii.gz im2.nii.gz

      このうえで先程と同じecho $vをしてみましょう。そうすると、違った結果となります。

      $ echo $v
      im1.nii.gz im2.nii.gz

      今、$vはim*.nii.gzです。ここにはダブルクオーテーションは入っていないことに注意が必要です。

      このため、echo $vは、

      echo im*.nii.gz

      と同じ意味を持ちます。従って、このワイルドカードはシェルに「これはワイルドカードだ」と理解されて、展開されることになるのです。

      では、次に以下をタイプしてください。

      $ echo "$v"

      そうすると、 im*.nii.gz と表示されませんか?

      今の場合は、

      $ echo "im*.nii.gz"

      と同じ意味になります。

      このとき、*はダブルクオーテーションで囲まれているため、シェルは、「これはワイルドカードではなく、ただの文字としての*だ」と理解するわけです。従って、展開されません。

      なお、ディレクトリの中にあてはまるファイルがない時も、ワイルドカードは展開されません。なので、最初に試していただいた、ファイルが何もない場合の、echo im*.nii.gzはあてはまるファイルがないのでダブルクオーテーションがなくても展開されずに文字列として出力されるわけです。

      少しまどろっこしい説明になってしまいましたが、こんな感じでいかがでしょうか?

      まとめると、以下のようになります。

      シングルクオーテーション:全ての文字列をそのまま出力。変数もワイルドカードも一切展開されない。
      ダブルクオーテーション:変数は展開するが、ワイルドカードは展開されない。ただ、変数の中にワイルドカードが入っている場合は、変数をダブルクオーテーションでくくらなければ、変数自体は展開されるために、ワイルドカードはシェルによって展開されてしまう。

      今の例で説明するならば、tmpディレクトリにim1.nii.gz, im2.nii.gzが入っているならば、

      v=’im*.nii.gz’
      v=”im*.nii.gz”

      は同じ意味になります。ワイルドカードはダブルクオーテーションでは展開されないために、シングルクオーテーションでくくっても、ダブルクオーテーションでくくっても同じなわけです。
      しかし、echo $vとするときに$vをどのようにくくるかの結果はそれぞれ異なります。

      $ echo $v
      これはecho im*.nii.gzと同じ意味ですので、im1.nii.gz, im2.nii.gzが表示されます。

      $ echo '$v'
      この場合、シングルクオーテーションの中身は全く展開されませんので、$vが表示されます。

      $ echo "$v"
      この場合、ダブルクオーテーションの中がまず展開されます。つまり、echo "im*.nii.gz"と同じ意味になります。
      ワイルドカードはダブルクオーテーションでは展開されませんので、
      im*.nii.gzが出力されます。

      • お忙しい中、私の理解度を考慮していただき、非常に丁寧なご説明ありがとうございました。
        先生の言われた通りに手を動かしていきますと、shell scriptを先生の翻訳で勉強し始めたばかりの私でもよく理解することができました。
        本当に感謝、感謝です。

        • ご丁寧にありがとうございます。
          理解の助けになったようでよかったです。
          シェルスクリプトは慣れてくると、作業を大幅に効率化できます。
          私もまだ学習中ですが、このFSLのシェルスクリプトのドキュメントは非常によくできているので、
          効率良く学ぶことができると思います。
          また何か疑問がありましたら、気軽にお聞きしていただけたらと思います。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください