ときどきこの質問を受けるので言及しておきます。
2024年4月にUbuntu 24.04が公開されました。
しかし、Ubuntu 24.04上では現行のFreeSurfer 7.4.1は動きません。
このため、FreeSurferを実行したい場合は、しばらくUbuntu 22.04からアップグレードしないようにしましょう。
ときどきこの質問を受けるので言及しておきます。
2024年4月にUbuntu 24.04が公開されました。
しかし、Ubuntu 24.04上では現行のFreeSurfer 7.4.1は動きません。
このため、FreeSurferを実行したい場合は、しばらくUbuntu 22.04からアップグレードしないようにしましょう。
SPMで位置合わせする方法は2つあります。
ここでは、Coregister について述べます。
Pythonを勉強していると、「この型のメソッドは何だろう?」と思う時があります。
この時、オブジェクトを obj とすると
dir(obj)
とすることで、一覧を得ることができます。
たとえば、リスト型のメソッドを知りたいとします。dir() を使うと以下のようになります。
x = [1, 2] dir(x) [code lang=text] ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] [/code]
ここで、”–” からはじまるメソッドは特殊メソッドと言われ、その型の振る舞いを細かく調整するものとのことです。今回はここには踏み込みません。
今、私は、「通常メソッドだけリストアップしたい」と思いました。どうしたらできるでしょうか?
UNIX系OSで、 df
というコマンドがあります。ファイルシステムのディスク使用量を知るためのコマンドです。
df -h
はファイルサイズをわかりやすく示してくれます。
それぞれの違いを見てみます。
seq -w
は、連続する数字のゼロ埋めをする時に便利です。
たとえば
seq -w 10 とすると
$ seq -w 10 01 02 03 04 05 06 07 08 09 10
となります。ひと桁の数字も最初に0をつけて2桁になるようにしてくれます。
Ubuntu 22.04 から、ターミナルでの変数を使ったディレクトリ移動が厄介になりました。
例を挙げます。
FSLのインストールパス は変数 $FSLDIR に入っています。私はこれまでは、$FSLDIR/standard にアクセスしたい場合
cd $FSLDIR までタイプしたら、その後、タブキーをタイプすると、シェルが自動で cd /usr/local/fsl と変数を展開してくれて、その後のディレクトリをタイプしていました。
しかし、Ubuntu 22.04 から、同じことをすると
cd \$FSLDIR/
と変数がエスケープされてしまい展開されなくなってしまいました。
これは不便です。
調べたところ、shopt というコマンドがあることを知りました。
過去に、Anacondaに頼らない、pipとvenvを用いたPython環境の構築 という記事を書きました。今回、改めて、Pythonの仮想環境について理解が深まったので書きたいと思います。
また、LinuxやmacOSにおいて、Pythonは、システムの重要なところを担っていたりします。Ubuntuであれば、 dpkg -l | grep python3
とすると、どれだけ多くの Python3に関連したパッケージがシステムにインストールされているかを確認することができます。
このような状況において、システムのPythonに追加でパッケージを入れていって、もし不具合が起きた場合、システムそのものが不安定になる可能性があります。
Pythonの仮想環境を使うと、システムの中に、独立したPythonの環境を構築することができます。「独立している」というのは、システムに一切影響を与えないということを意味します。不要になったらばっさり削除しても一切問題ありません。
そこで、以下で、仮想環境の構築の仕方を解説します
macOSでPythonを使おうとする時、様々な選択肢があります。
まず、それぞれのインストール方法とそのPythonのパスを明確にします。バージョンは2024年1月現在のものになります。
2023年11月9日に普通にアップデートしたら以下の問題が発生しました。
環境はUbuntu 22.04です。
$ sudo apt update ---(中略)--- これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。 以下のパッケージには満たせない依存関係があります: nvidia-dkms-535 : 依存: nvidia-kernel-common-535 (= 535.129.03-0ubuntu1) しかし、535.129.03-0ubuntu0.22.04.1 はインストールされています nvidia-driver-535 : 依存: nvidia-compute-utils-535 (= 535.129.03-0ubuntu1) しかし、535.129.03-0ubuntu0.22.04.1 はインストールされています 推奨: libnvidia-gl-535:i386 (= 535.129.03-0ubuntu1) E: 未解決の依存関係です。'apt --fix-broken install' を実行してみてください (または解法を明示してください)。
nvidia-dkms-535 が nvidia-kernel-common-535 に依存しているとあります。
よくみると、
nvidia-kernel-common-535は
535.129.03-0ubuntu1 が必要なようですが、 535.129.03-0ubuntu0.22.04.1がインストールされていると言われています。
バージョンの小さな違いがエラーを引き起こしているようです。
ある施設のrs-fMRIのDICOMデータをNiftiに変換しようとした時に、以下のようになってしまい、4次元データができませんでした。
sub1_+rsfMRI_201.nii sub1_+rsfMRI_201_t10000.nii sub1_+rsfMRI_201_t100000.nii sub1_+rsfMRI_201_t102500.nii sub1_+rsfMRI_201_t105000.nii sub1_+rsfMRI_201_t107500.nii sub1_+rsfMRI_201_t110000.nii sub1_+rsfMRI_201_t112500.nii sub1_+rsfMRI_201_t115000.nii sub1_+rsfMRI_201_t117500.nii sub1_+rsfMRI_201_t120000.nii sub1_+rsfMRI_201_t122500.nii sub1_+rsfMRI_201_t12500.nii ...
ポイントは、ファイル名の後ろに tの後に数字がつくことです。
この原因を探っていたところ、dcm2niixのGitHubページを見つけました。
https://github.com/rordenlab/dcm2niix/issues/428
ここで開発者のChris Rorden教授が以下のように述べています。
your files have a bogus value for cardiac trigger time (0018,1060). This is a limitation of your images, not dcm2niix. You should work with your Philips Research Collaboration manager to fix your scanner. For archival-quality data you could purge the invalid tags from your images, e.g. gdcmanon –dumb –remove 0018,1060 -i … -o …
Cardiac Trigger Timeというタグに値が入ってしまっていることで、dcm2niixはこれを別々のものと認識してひとつにしないようです。過去に撮像したデータの場合、0018,1060を削除するのは一手ではないかとおっしゃっています。実際に確認したところ、そのタグが入っていました。
そこで、このタグを削除する以下のようなPythonスクリプトを書いてみました。pydicomが入っていれば動くはずです。
こちらから手に入れられます。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Script to remove trigger time from Philips fMRI # source: https://github.com/rordenlab/dcm2niix/issues/428 # 14 Oct 2023 K. Nemoto import sys, os, time, argparse import pydicom __version__ = '20231004' __desc__ = ''' Remove Trigger Time (0018,1060) from Philips rsfMRI ''' __epilog__ = ''' examples: dcm_rm_trigger_time.py DICOM_DIR1 DICOM_DIR2 ... ''' def remove_triggertime(src_dir): # modify files for root, dirs, files in os.walk(src_dir): for file in files: try: src_file = os.path.join(root, file) ds = pydicom.dcmread(src_file) pid = src_dir.replace('/','') del ds[0x0018, 0x1060] ds.save_as(src_file) except: pass if __name__ == '__main__': start_time = time.time() parser = argparse.ArgumentParser(description=__desc__, epilog=__epilog__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('dirs', metavar='DICOM_DIR', help='DICOM directories.', nargs='+') err = 0 try: args = parser.parse_args() for dicom_dir in args.dirs: # Loop through all the provided directories print(f'remove dicom tag (0018,1060) from {dicom_dir}') remove_triggertime(dicom_dir) print("execution time: %.2f second." % (time.time() - start_time)) except Exception as e: print("%s: error: %s" % (__file__, str(e))) err = 1 sys.exit(err)
これは、
dcm_rm_triggertime.py DICOMフォルダ
とすることで、そのフォルダ内のtrigger timeタグを削除します。
この処理をした後のDICOMを使って dcm2niix を行ったところ、問題なく変換されました。
困っている人がいると思うので共有しておきます。
Windows 10/11 では、Windows Subsystem for Linux (WSL) を使ってUbuntuなどのLinuxをインストールできます。WSL2 を使うと、GPUも使えるとのことです。
しかし、WSL2は基本、コマンドラインです。LinuxのGUIを起動するためには、工夫が必要です。現在、いくつかのアプリが公開されていますが、FSLの公式ページでは、VcXsrv を勧めていますのでそれを使うのが無難でしょう。
Ubuntu 22.04 も発表されて1年が過ぎて安定してきましたので、ここでは、
をいれたうえで、FSL をインストールしてみます。
なお、このページは、FSLの公式サイトを参考に作成しました。
When using FreeSurfer and FSL 6.0.6 or later, a certain issue may arise:
First, I will explain how to confirm if you are affected by this issue and then provide the solutions along with the reasons.
FreeSurfer と FSL 6.0.6以降を使っていると、ある事象が起きます。
これの影響を受けているかの確認法および対処法を最初に解説した後、その理由を述べます。
ある方から、「CONNで前処理したfMRI画像から、デフォルト・モード・ネットワーク(DMN)の時系列データを取り出すにはどうしたらよいですか?」というご質問をいただきました。
鍵となるプログラムは以下の2つです。
以下に、方法を記載します。
FSL 6.0.6 and later now support CUDA 11 or later.
After various trials and errors, I have found a simple way to use CUDA effectively with FSL, which I will introduce here.
Assuming that FSL 6.0.6 or later is already installed.
FSL 6.0.6 以降で、CUDA 11以降も対応するようになりました。
いろいろ試行錯誤した結果、以下のようなシンプルな方法でFSLでCUDAを上手に使うことができるようになったので紹介します。
なお、Amulet社から販売している Powerstep Tower for Lin4Neuro は、既にこれらの設定が済んでいますので、電源入れたらすぐにEDDY, BEDPOSTX, XTRACTなどがGPUを使って解析できます。
なお、FSL 6.0.6 以降は既にインストールされているとします。
これまで新しいハードディスクを追加する際の tips を書いてきましたが、最初から最後までまとめます。SATA接続のSSDも同様です。
fdisk を使って確認できます。
sudo fdisk -l
詳細はこちらに説明があります。
この後は、 /dev/sda が新たなデバイスであると仮定します。
gdisk を使います。
sudo gdisk /dev/sda
この後、タイプするコマンドは
n #新しいパーティションを追加 設定はすべてデフォルトのままでも可 p #パーティションテーブルを確認 w #パーティションテーブルの書き込み
の3つだけです。
詳細は先ほどと同じく、こちらに説明があります。
mkfs.ext4 を使います。
sudo mkfs.ext4 /dev/sda
blkid で確認できます。
sudo blkid | grep dev\/sda
ここで表示されるUUIDを後ほど使います。
今の場合は /mnt/data1 にマウントするとします。
sudo mkdir /mnt/data1
/etc/fstab に以下の内容を追加します。詳細はここでは説明しませんが、データ用ならば以下の設定でよいのではないかと思われます。
# HDD 2023-04-15 (コメントを記載した方がどのハードディスクかわかります) UUID=上記で調べたUUID /mnt/data1 ext4 defaults 0 0
mount -a でマウントできます。
sudo mount -a
自分だけ使う場合、chown を使ってオーナーを自分にすると使い勝手がいいです。
sudo chown -R $USER:$USER /mnt/data1
これでハードディスクを追加できました。
FSLはデフォルトでは、Linuxの場合は、.profile の下、macOS の場合はお使いのシェルに応じて、.bash_profile もしくは .zprofile の下に 以下のような設定が書き込まれます。(6.0.6以降の設定です)
# FSL Setup FSLDIR=/usr/local/fsl PATH=${FSLDIR}/share/fsl/bin:${PATH} export FSLDIR PATH . ${FSLDIR}/etc/fslconf/fsl.sh
この内容を理解できると、ソフトの設定がわかるようになるので、1行ずつ解説してみます。