Three-dimensional dosimetry of TomoTherapy by MRI-based polymer gel technique

Yoichi Watanabe, N. Gopishankar

Journal of Applied clinical Medical Physics, Vol. 12, no. 1, Winter 2011

DOI: 10.1120/jacmp.v12i1.3273Citations: 9

(日本語)

放射線治療において,線量計算や治療計画に使用するソフトウェアの検証は,正確な放射線照射を行うために非常に重要である.BANG3ポリマーゲル線量計と3T Magnetic Resonance Imaging(MRI)を用いて,トモセラピー治療計画および放射線照射の精度検証を行なった.前立腺治療1症例を評価し、計算された3次元線量分布は,最大線量(2.5Gy)よりはるかに小さい(25%以下)領域を除いて,測定された3次元線量分布と一致することが分かった。計画標的体積を含む12cm×11cm×9cmのボリュームに対してγIndex(3%/3mm)を用いた解析では,53%のボクセルでγIndexが1より小さいことが示された.この測定プロトコルと解析ツールは、強度変調回転放射線治療のような他の新しい 複雑な放射線照射技術の評価にも,低コストかつ容易に適用することが可能である。

Evaluation of setup and intrafraction motion for surface guided whole-breast cancer radiotherapy

Sandra Helene Hattel, Peter Andreas Andersen, Isak Hannes Wahlstedt,

Sidsel Damkjær, Arpit Saini, and Jakob Borup Thomsen

J Appl Clin Med Phys 2019; 20:6:39–44

DOI: 10.1002/acm2.12599

(日本語)

Surface Guided Radiotherapy (SGRT) は、患者の位置を合わせたり、治療中の患者の動きを監視したりするための比較的新しい技術である。SGRTでは患者体表面の位置を決定するために可視光を用いるため、完全に非侵襲である。SGRTの精度がイメージングと同等であれば、患者位置合わせのための毎回のイメージングを減らすことが可能である。SGRTでは、フラクション内の動きの監視及び、決められた許容値を超えた時に照射を止めることが可能で、より正確な照射をもたらす。この研究の目的は、SGRTとしてAlignRT(OSMS)を搭載し、ゲーティングでない乳房全体の放射線治療の際のセットアップとフラクション内の動きの監視の不確かさを調べることである。最初のセットアップにおいては、SGRTが患者に入れられた3点の刺青を用いる方法と直交X線画像が比較された。フラクション内の動きの調査では、治療中の患者を6軸で監視した。3点セットアップでは、アイソセンタからの二乗平均平方根誤差は5.4mmであった。OSMSを用いた手法では、これが4.2mmまで改善された。並進方向においては、OSMSはlateral方向で改善が見られたが(P=0.0009、Wilcoxonの符号順位和検定)、longitudinal方向と回転では、改善を示すことができなかった(それぞれP=0.96、P=0.46)。vertical方向においては、OSMSより3点セットアップの方がより正確であったと示された(P=0.000004)。フラクション内の動きにおいては、アイソセンタからの平行移動の中央値が1.1mmと非常に制限された。OSMSはレーザーと刺青のセットアップから注目すべき改善はみせたものの、骨構造を使用する直交X線画像に取って代わるほどの正確さは示さなかった。

3D Slicerのビルド (Linux版)

2022.3.29

OS: Ubuntu 20.04

3D Slicer: Preview Release 4.13.0 revision 30742 built 2022-3-27

3D SlicerはOpen Sourceなソフトです. そのためソースコードが公開されています. ソースコードをもとに改変することも可能です. ビルドの情報は以外にたどり着きにくいところに置いてあったりします. もちろん英語で, ある程度プログラミングに慣れていないと理解できない記載も多いです.

はじめに注意事項

今回の記事では, 基本的には3DSlicerのDocumentationにあるDeveloper GuideのBuild Instractionsに書かれている内容を少しわかりやすく情報を追加して記載しています.

この記事の対象はLinux版です. (そのうち別記事でWindows版も載せたいと思います.)

ソースコードの取り寄せやすさから, バージョンは4.13 preview版としています(現在Release版は4.11). Preview版のため, 日々バグフィックスされて更新されていきます. 記事で対象としたソースコードは「3D Slicer: Preview Release 4.13.0 revision 30742 built 2022-3-27」ですが, 更新されるとrevision番号やbuiltの日付が変わって行きます. ビルドがうまく行かない場合は, revisionが上がるのを待つのも手かと思います.

Linux版の要件

まずはLinux版をビルドする場合, OSから注意が必要です. UbuntuなどDebian系のLinuxであれば一番問題が少ないと思います. その他に必要なソフトやライブラリがあったりします. Build instractionsに記載されている内容が下になります.

  • Git and Subversion for fetching the code and version control.
  • GNU Compiler Collection (GCC) for code compilation.
  • CMake
  • GNU Make
  • GNU Patch
  • Qt5 ver. 5.15.2
    • Multimedia
    • UiTools
    • XMLPatterns
    • SVG
    • WebEngine
    • Script
    • X11Extras
    • Private
  • libXt

この中で意識しないといけないのはおそらくGit, CMake, Qt5 くらいかと思います. Ubuntu20.04で他のソフトやライブラリを入れた覚えはありません(デフォルトで入っている)

Qt5ですが, Ubuntuのフレーバーによっては入っていないことがあります. Synapticsなどアプリをインストールするソフトで確認してみてください. その際, バージョンも確認することをお忘れなく. Ubuntu20.04は特に問題にはなりませんでしたが, あまり古いもの, 新しすぎるものもまたエラーになる可能性があります.

CMakeはコンパイルのための昔で言うMakefileを作ってくれるソフトになります. これもバージョンによってうまく行かない場合もあったりしますので, バージョンの確認をしておく必要があると思います. 最新リリース版は現時点3.22.3, RC版が3.23.0-rc5となっています. SynapticsやaptでインストールできるCMakeがあればそれで十分かと思いますが, 気になるもしくは問題がああった場合などから3.22.3を使ってはと思います. またコマンドライン版(cmake)とGUI版(cmake-gui)がありますが好きな方を使えばいいと思います.

Gitは, ここでの使い方はソースコードを取り寄せるソフトとなります. 正確にはバージョン管理ソフトですが, 今はソースコードを取り寄せる以外には使わないのでこう思っていても構いません. Gitはビルドにあまり関わりませんので, バージョンを気にする必要はないかと思います.

その他のソフトに関しても基本的にバージョンは把握しておいたほうが問題があった場合の解決の糸口になったりします.

ソースコードの取り寄せ (Gitの使用)

ソースコードはGithub.comで公開されています. 通常のファイルのようにダウンロードすることも可能ですが, ここは3D SlicerのガイドにそってGitで取り寄せます.

初めてGitを使う人はレポジトリを作成する必要があります.適当なところにディレクトリ(フォルダ)を作り, そこをローカルリポジトリにすればいいと思います. 私の場合はホームディレクトリに「repos」とディレクトリを作りました. そのディレクトリをGitで初期化します. 具体的な作業はターミナル(端末ソフト, WindowsでいうPowerShell)で行います. ターミナルを立ち上げてプロンプト(下では#マーク)に以下のコマンドを入力します. (1行1行実行します. そのため1行入力したらEnterキーを押してください)

# cd
# mkdir repos
# cd ./repos
# git init

1行目のcdは念の為です. ホームディレクトリなどレポジトリとなるディレクトリを作りたいディレクトリにいれば必要ありません. ホームディレクトリの下にreposディレクトリを作る予定でしたので, ホームディレクトリに戻るコマンドになります.

2行目でディレクトリ作成と3行目でそのディレクトリに入って, git initでレポジトリを初期化しています.

次にreposの下に3D Slicerのソースコードを取り寄せます. 上記処理した後, 以下のコマンドを入力してください.

# git clone https://github.com/Slicer/Slicer.git

これで逐次処理工程が表示され終われば, 「Slicer」というディレクトリが出来ており, その中に更に「Slicer」というディレクトリがありそこにソースコードがクローン(ダウンロード)されているはずです.

SlicerのBuild Instractionsではソースコードのクローン後, したのようにSetupForDevelopment.shを実行するようにありますが, 私の場合はこのような記載があることを気がついていなかったため, 無視して以下を実施しましたが, 特に問題はなかったです. 内容をざっとみるかぎり, Githubのユーザー設定等のようですので, 今回の処理にはあまり影響しないかと思います.

# cd Slicer/Slicer
#./Utilities/SetupForDevelopment.sh

ビルド環境の構築と設定(CMake)

ビルドは直接ソースコードをクローンしたディレクトリで行うのではなく, ビルド用のディレクトリを作りそこでビルドしていきます. ここでは, そのディレクトリをslicer413_buildとします. 下のようにディレクトリを作り, その中に入ります.

# mkdir ./Slicer/slicer413_build
# cd ./Slicer/slicer413_build

現状下のようなディレクトリの構造になっていると思います.

[ホーム]— repos–+– Slicer –+– Slicer –+– (ソースコードのディレクトリ群)
|
+– slicer413_build

現在, 空っぽのslicer-bディレクトリにいる(処理対象になっている)と思います. ここでCMakeを使って必要なソースコードの取り寄せや, ビルドの環境確認, 設定を行います.

ここからCMakeを使いますが, わかりやすいようにGUI版を使います. デスクトップのメニュー等からcmakeを選ぶか, ターミナルでcmake-guiを起動してください. ターミナルでは下のように入力します.

# cmake-gui

CMakeとソフト名を書いていますが, 実行ファイルは小文字ですし, Windowsとはことなり大文字小文字は区別されますので間違わず小文字で入力してください.

起動したら下のようなウィンドウが現れると思います. ここでまず指定するのが赤丸で印をつけた2つの項目です. 上がソースコードのあり場所, 下がビルドのためのディレクトリの場所を指定します. それぞれ右の「browse」ボタンから選択すればいいと思います. 下の例では, ともに /home/at/repos/… から始めっていますが, 自身の環境にわせて変更してください. これまでの説明の通りに実施してきたのであれば, repos/ から下は同じになっていると思います.

cmake-gui

ディレクトリ設定できれば, とりあえず左下の「Configure」ボタンを押します. すると下図のようにmakeファイルの形式を聞いてくるのですが, ubuntu(たいがいのlinux)であればそのまま(Unix Makefilkeのまま)「Finish」ボタンを押せば構いません.

「Finish」ボタンを押すと, 「Configure」ボタンの下のメッセージボックスに処理の状況が流れて最終的には下のように真っ赤になって終わると思います.

cmake-guiでは, 自動で設定した設定項目や何らかエラーがある項目が赤くなります. 自動設定された内容は問題ない場合がほとんどですので, 再度「Configure」ボタンを押せば白背景になります.

ここで赤背景の設定項目が残っている, もしくは下のメッセージボックスに赤字でエラーが出ている場合はエラーのある設定項目を修正するもしくは設定項目を追加するなど対処してください. そのような場合の多くが設定項目の名前になっているライブラリが無い(見つけられない)などですので, 手動で入力するか本当に無いのであればインストールするなりすることになります.

下のようにメッセージボックスに「Configuring done」と出ていればOKです. ただし, まだこの段階では環境設定は終わっていません.

ついで, 「Generate」ボタンを押して完了になります. 「Generate」ボタンを押すことで, Makefileが書き出され, ビルドのための環境が保存されます. 見にくいですが「Generate」ボタンを押した後にGenerating doneと出れば終わりです. cmake-guiのウィンドウを閉じても構いません.

これでslicer413_buildの中に多数のディレクトリやファイルが出来ていると思います.

Slicerのビルド

あとはビルドするだけになります. ビルドはmake一発です.

gitでクローンしたターミナルでも, cmake-guiを立ち上げたターミナルでも構いませんので, ビルドのためのディレクトリに移動してmakeを実行します.

# cd ~/repos/Slicer/slicer413_build
# make

makeコマンド後は, だいぶ時間がかかります. 私の環境で5, 6時間かかりますので気長に待ちましょう.

ビルド中にエラーがでたら, 基本的には何らか設定がおかしいことが考えられますので, cmakeから確認することになります.

無事終了したら, slicer413-buildの中のSlicer-buildの中に「Slicer」という実行可能ファイルが出来ていると思います. それを起動してうまく動くか確認してみてください.

リリース版へ

この記事のままビルドしたのなら, ビルドはデバッグバージョンでビルドされています. ビルドが問題なく終了し, 出来上がった3DSlicerも問題なく起動・ 処理を実施できることが確認できたらリリース版で再ビルドする必要があります. デバッグ版でも動きますが, 実行ファイルの容量が大きかったり目盛などリソースを無駄に費やしたりします.

リリース版にするためには一旦cmake-guiでの設定に戻りますのでcmake-guiを再度起動してください.

cmake-guiの設定画面で, 上部にある「Advanced」にチェックを入れてください. そうすると設定項目が増えたと思います. その中から「CMAKE_BUILD_TYPE」という設定項目を探してください (Advancedよこの検索で探しても可). 現在その項目に「Debug」が指定されていると思いますが, そこを「Release」に変更してください.

「CMAKE_BUILD_TYPE」を変更したら, 再度「Configure」ボタン→「Generate」ボタンを押して再度makeしてください.

makeが無事終われば同様に「Slicer」の実行ファイルがリリース版に置き換わっているはずです.

Package化

実際に出来上がった3D Slicerは「Slicer」だけでは実行できません. 必要なライブラリなどがありますが, ビルドしたフォルダ内にどのファイルが実行するためにいるものかよくわからないと思います. パッケージ化してひとまとめにすることで, 好きなところにインストールでき余分なファイルもなく便利になります.

パッケージ化もmakeを使います. ただし, makeを実行するディレクトリが異なりますし, パラメータも指定します.

実行ファイル「Slicer」があるSlicer-buildのディレクトリに移動します. そこでmakeを下のように実行します.

# cd ~/repos/Slicer/Slicer/Slicer-build/
# make package

うまく行くと, Slicer-4.13.0-2022-03-23-linux-amd64.tar.gz など圧縮してひとまとめになったファイルが出来上がります.

インストールするときは, このファイルをインストールしたいディレクトリに解凍すれば終わりです.

3DSlicer によるStructureごとのICE値の統計

OS: Ubuntu 20.04, 3DSlicer Version: 4.11.20210226

JacobianとICEの求め方では全体の平均値や標準偏差などしかわかりませんでした. そのため, 次回にはStructure 毎の値を出す方法を書くように書きましたが, その方法はSegment Statisticsを使う方法で, すでに書いていることを忘れていました. ただ, Segment Statisticsの回では, ICEのデータを使ってという話ではなかったので, ざっくり流れと注意点のみ記載していきます. 具体的な処理は以前の記事を見てください.

Structureごとの値を取るのに, なによりすでにICEが求まっている必要があるので, そのやり方は下の記事を見てください.

またSegment Statistics モジュールの使い方は, 下の記事にあります.

Segment StatisticsでICE値の統計を取る際の注意点

Segment Statisticsで処理するのはScalar Volumeになります. RegistrationQAを用いて計算したデータであればScalar Volumeになっていますが, 他のソフトで計算したデータを3D Slicerに読み込んで統計を取ろうとした場合, Data モジュールでそのデータがvtkMRMLScalarVolumeNodeになっているか確認してください. 下はScalar VolumeになっているICEのデータの例です.

Segment Statisticsで統計データを求める下のように値が計算され表としてまとめられます.

ICEの結果の表

この表で, MinimumやMaximum, Mean, Median, Standard… がそれぞれStructureごとの最小値, 最大値, 平均値, 中央値, 標準偏差になります. 注意は, データ値をもととした平均などの値ですので, その単位はもとのデータに依存します. ICEの場合距離値となるのでScalar Volumeに保存されているのがcm単位なのか, mm単位なのか事前に確認しておく必要があります. Segment StatisticsはあくまでもScalar Volumeの画素値をLabelmap (Structureのデータを変換して作る)ごとに分けて平均などを取ってくれるに過ぎません.

結果の表は保存すると, Tab separate value(.tsv)かComma separate value(.csv)で保存されるのでExcelなどで読み込めます.

3DSlicerによるJacobianとICEの求め方

OS: Ubuntu 20.04, 3DSlicer Version: 4.11.20210226

3D Slicerを用いてJacobian Determinant (jacobian)画像 およびInverse Consistency (ICE) 画像を計算する方法を記載します.

それぞれの画像から値を取る方法はまた別に記載します.

また, DIRの評価ですので, DIRがすでに終えている状態からの処理になります.

前準備

JacobianやICEを計算するために, RegistrationQA Extensionを使用します. 事前にExtension Managerからインストールしておいてください. 画面をキャプチャした時がたまたまなのかわかりませんが, アイコン画像が表示されませんでした(下のような感じです).

RegistrationQA Extension

前準備2つ目は, DIRで得られたDVF (3D SlicerでDIRした場合TransformNodeでも可)データをRegistrationQAの計算に使えるよう, VectorVolumeデータに変換します.

まずはDIR後のデータを一覧します. ReferenceをCT1, MovingをCT2としたDIRが順方向とし, deformedCT2が変更後のCT画像, ???_goとなっているものがDVFデータです. ICEを計算するのに逆方向も必要ですので逆方向で変形したdeformedCT1が変形画像, ???_returnとついているものがDVFデータです.

DIR後のデータ

順方向のDVFデータ, Transform_goと DVF_goどちらでもいいのですが, 今回名前の短く, モジュール名と重ならないDVF_goを使います.逆方向も同様です.

DVF_go, およびDVF_returnをTransformデータからVectorVolumeデータに変換します. 変換はTransformモジュールを使用します.

Transformモジュールに切り替えると, 下のようなパネルになります. その中で「Active Transform:」(図中上部赤丸)に変換したいDVFデータを指定します. 下の例ではDVF_goが選択されています. 逆方向の場合はここはDVF_returnとなります.

次に間の項目は無視して, Convertの見出しまで飛びます. Convertの設定項目で, Reference Volumeとoutput displacement fieldを入力します.

Reference Volumeは先に指定したDVFを得たときの(DIRしたときの)Reference画像を指定します. ここでは順方向のReference画像はCT1ですので, CT1を指定しています.

Output Displacement Fieldは変換後のデータ名となります. ここで注意ですが, 出力できるデータ形式は次の3つがあります.

Transformデータ(もとのDVF_goの形式と同じ), Volumeデータ, VectorVolumeデータ

必ず「Create new VectorVolume」もしくは「Create new VecorVolume as…」を選んでVectorVolumeに変換するようにしてください. 下の例では「Create new VecorVolume as…」を選んでDVF_go_scalarと言う名前になっています.

以上を設定したら, 後はApplyボタンを押すだけです. これも変換にしばらく時間がかかりますので気長に待ってください.

DVFデータの変換

Jacobian, ICEの計算

モジュールをRegistrationQAに切り替えます. モジュールの中の「Registration」の中に「Registration Quality Assurance」があるので, 選択してください. 事前にRegistrationQA Extensionを入れていればあると思います.

下がRegistration Quality Assuranceを選択した際のパネルです. 今回使うのは今まだ非アクティブですが, 下の方の「Jacobian Determinant」と「Inverse Consistency」ボタンです. 必要なデータが登録されるとアクティブになります.

RegistrationQAのパネル

次に, 使用するデータを登録していきます. この方法が直感的でなく, わからなくなるところです.

使用するデータを登録するにはパネル上部にある「Node」の一覧表で右クリックして出てくるメニューで「RegistrationQA」→「Assign node to:」と選んでいき, それぞれ適切なデータを適切な種類にassignしなくてはなりません.

下の画像では, CT1をReference Imageであるとして登録しました. その他Image系では, Moving image, Forward warped Image, Backward warped imageを登録します. 今回順方向ではCT2をmovingにしましたので, 同様な方法でCT2をMoving imageに登録しました.

データのassign

Forward warped imageは順方向での変形後の画像,Backward warped imageは逆方向での変形後の画像を指定すると思われます. Reference, Movingは順方向(もしくは逆方向)でのセットなのに, 変形後の画像は順方向, 逆方向両方を登録できることになります.

さらに 混乱を招くところですが, パネル一番上の項目にParameter Setというのがありますが, その下のプルダウン(下の図では「RegistrationQAParameters」を広げると「RegistrationQAParameters_Backword」というのが選択しにあります. おそらく, ReferenceとMovingを逆にして登録すればいいと思いますが, 再度変形後の画像を登録するのか, 登録知るのならどっちがforwardになるのか, よくわかりません.

Vector FieldへDVFを登録する際ですが, 方法はCTと変わらず登録するデータを一覧表から選んで右クリックし, 「Assign node to」で「Vector Field」を選んで登録します. Vector Fieldには「Forward」と「Backward」があり(!?) それぞれに, 前準備で変換したVectorVolumeのデータを登録します. Transformデータも登録できてしまうのですが, 計算はされません(しかもなんのエラーも出ません).

今回のようにJacobianとICEを求める場合は, Vector Fieldをassignすれば計算できます. CT画像も必要ありません. JacobianはForwardかBackwardのどちらかさえ登録すればアクティブになります.

データ登録がされると, パネル下方のTableの項目にAssignしたデータ名が表示されます. この表の続きには, JacobianやICEを計算したあとにそれぞれの値(平均や最大, 最小など)が入る項目もあります.

必要なデータの登録がすんだら「Jacobian Determinant」「Inverse Consistency」ボタンが有効になっているはずですので, それぞれをクリックして計算させてください. 一つ一つ計算させることになりますが, この計算もまた少し時間がかかります. 計算が終わるとそれぞれ計算された画像が表示されます. (下図はJacobianを表示)

また, Tableの中に「Jacobian (for)」と「Jacobian (Back)」があり, その並びに数値が入っていると思います.

さらに, データ一覧(パネル上部のIOの表) に, Vector FeildにassignしたDVFデータの尾末に 「-jacobian」や「-invConsist」とついたデータが出来ていると思います. これでJacobianやICEのデータが画像データとして作成されたことになります.

ここまでで, JacobianとICEを画像データとして作成できました. ただし, まだストラクチャに対して個別にそれぞれの値をとることが出来ていません. 次の投稿ではSegment statisticモジュールを使って数値を読む方法を記載します.

Plastimatch のExtension(SlicerRT)でDaemonsができるよう改良しました

OS: Ubuntu 20.04(Linux版はExtensionがInstall出来ない不具合が見つかりました), Windows10

3DSlicer Version: 4.13

Extension SlicerRT1.0.0

今回は具体的な話はさておき, 結果のみの記載しています.

以前PlastimatchのRegistrationのためのExtensionで, B-Splineしか出来ないと書きました. せっかくのポテンシャルがもったいないと思い, SlicerRT Extension (現在PlastimatchのExtensionはSlicerRTに統合されています) のソースコードを覗いたのですが, 実際やっていることはPlastimatchのコマンドの文字列(オプション含む)を作ってPlastimatchに送っているだけでした.

そのため, じゃあその文字列をDaemonsでDIRできるよう変更してやればDaemonsでDIRができるだろうとなりました.

ただし, B-Splineで有効なパラメータとDaemonsで有効なパラメータが若干違うのでその判別ができるようにする必要もありました. ただ, 主なパラメータはB-Splineのほうが多く, B-SplineのパラメータをDaemonsでは無効にすることで行けそうでした.

最終的に,

  1. 今のExtensionの画面を最大限利用して, Daemonsへの切り替えができるようにして, Daemonsに指定できないパラメータはB-Splineだけであることを明示する(値は入れれるけど, いれても無効になる)ようにパラメータ画面を変更する.

2. Daemons用のコマンド文字列を作るようソースをいじる.

3. いじったExtensionのソースも一緒にビルドしてSlicerRT Extensionをデフォルトで入っている状態にする.

としました. ソースコードはGITHUBから最新版をダウンロードしたのでSlicerは4.13になっています.

出来上がったのが, 下の画像です. Algorithmという選択項目が増えて, B-SplineかDaemonsを選べます.(あ, つづりが間違っている)

パラメータの設定が下のようになっています. (Only for B-Spline)とある項目がB-Splineの際にのみ有効な設定項目です.

Daemonsで実行してもちゃんと結果が出ます. 本当にDaemonsで処理されている? と疑問もあるかとおもいますが, 基本的に文字列作っているだけなので, そのコマンド文字列で動いているということはちゃんとDaemonsでDIRされているのだと思います. B-SplineとDaemonsの違いがどれだけかはまだ確認していませんが, 今後の予定です.

3D SlicerのSegment Statisticsの使い方

3D Slicerである点の画素値などを得る場合, マウスのある点の値はSlicerのウィンドウ左下にあるパネルで確認できます.

ある領域の画素値の平均などは, Segment Statistics モジュールを使うことで得ることができきます. 放射線治療のデータで言うと, ある輪郭への線量の平均値などを得るときにもこの Segment Statisticsモジュールが使えます. 単純にセグメントごとに対象データの統計的な値を出してくれるので何かと重宝するのではと思います.

今回はSegment Statisticsモジュールの使い方について記載します.

前準備 Labelmapを作る

Segment Statisticsで使用する”Segment”はBinary Labelmap のことになります. Segment Editor で作成したデータは基本的にvtkMRMLSegmentationNodeなので, labelmapではありません. そのため, SegmentをLabelmapに変換しておく必要があります.

まずDataモジュールで, 対象としたいSegment(ここではRTStructure)を選びます. 目玉マークが目が開いている(表示されている)ものがLabelmapに変換されますので, 必要な輪郭を表示, いらないものを非表示にしておいてください.

その後, SegmentationNodeで右クリックすると下図のようにメニューが出ますので,「Export visible segments to binary labelmap」を選択してください. 少し時間がかかる場合がありますが, これだけで変換は終わりになります. Dataモジュールの一覧に選択したvtkMRMLSgmentationNodeの名前(下図では「1:RTSTRUCT:ANON」)に「-label」と末尾についたvtkMRMLLabelmapVolumeNode (1:RTSTRUCT:ANON-label) が出来ていることを確認してください. ただし, もとのsegmentのようにpatientやGTVなどには別れていません.

DataモジュールでSegmentationNOでをLabelmapに変換

Segment Statisticsでのデータのとり方

Segment Statisticsで得られるのは統計的な値です. つまり平均値や最大値, 最小値, 標準偏差などになります.

ここで重要なのは, 出力されるデータの単位は対象とするデータ(vtkMRMLScalarVolumeNode)によることになります.

つまり, 線量分布を保存するScalarVolumeNodeを対象とすれば, 値はGyなど線量を示す値で出されます. 長さを表すScalarVolumeNodeであれば, mmやmなどの単位となります. そのため, 結果には単位が表記されません. 単位については対象データの方でしっかり確認しておく必要があります(とくに, mmなのかcmなのか, など同じものだけど桁が違う場合もありえます).

Segment Statisticsで対象にできるデータは, vtkMRMLScalarVolumeNode, vtkMRMLBinaryLabelmapNode, vtkMRMLClosedSurfaceNodeとなります. それぞれいられる出力は選択できるので,試して確認してみてください.

今回は, 治療計画のデータからSegmentごとの線量値の平均値などを取りたいと思います.

まず, Segment Statisticsモジュールですが, モジュールのプルダウンのなかの「Quantification」の中にあります.

Segment Statisticsモジュールを開くと, 下のような選択項目があります.

Segment Statisticsモジュールのパネル

ここで「Segmentation」に指定するのがLabelmapです (上図では名前の末尾に−lableがついてないですが). Labelmapにした輪郭ごとに統計的データが計算されることになります.

Scalar Volumeがまとめるデータが含まれるデータとなります.ここではRTDOSEを指定しています. つまり, 線量のデータを保存したデータなので, 輪郭ごとの線量値の統計データが出力されることになります.

Output tableは出力結果を表示する表データの指定です. 基本的には「Create new table」で問題ないと思います.

基本的には, これらを指定すれば後は「Apply」ボタンをクリックするだけです.

結果は下のように画像の下の表として出力されます. 下図の結果では, 出力する値を絞って選択してあります.

SegmentStatisticsの結果表示

出力される値の種類を選びたいときは2つ上の画像(Segment Statisticsモジュールのパネル)にある「Advanced」から, 「Enabled segment statistics plugins:」で対象Volumeに合わせてチェックを外したり, その横の「Options」ボタンをクリックすると, 下図のように計算する値を選択できます.

下図はSclar VolumeのOptionsですが, Labelmapやclosed surfaceのOptionもそれぞれに応じた出力の種類が列挙されており選択できる.

Scalar Volume statisticsのOptionsボタンをクリックすることで表示されるウィンドウ.

Labelmap statisticsはSegmentationで指定したLabelmapから, Scalar Volume statisticsはScalar Volumeで指定したデータから, Closed surface statisticsはLabelmapで閉じた領域になっているものから計算されると思います.

結果の表のデータは, Slicer本体のSave機能でテキスト形式やCSV形式で保存できます.

3DSlicerによるDice係数, Hausdorff distanceの求め方

Ubuntu 20.04, 3DSlicer Version: 4.11.20210226 (Extension SlicerRT)

3DSlicerでDice係数, HDを求める方法を説明します. ただし, 計算するには3DSlicerのExtensionのSlicerRTが必要となります. インストールの方法は「3DSlicerによるDIR: Install」をご覧ください.

前提として, 2つの輪郭セットがSceneに読みこまれている, もしくはDIR後であればhardeningされた状態であることが必要です.

Dice係数, Housdorff Distanceを求める

両係数の計算にはSlicerRTの「Segment comparison」を使用します. 下図のよう「Radiotherapy」モジュールから「Segment comparison」を選択してください.

「Segment comparison」モジュールの画面は下のようになります. ここで操作するのは「Input」の項目のみとなります.

「Input」のしたの「Reference segment」が基準となり, 「Compare segment」が比較するsegmentになります. ここでは,propagationの説明で作成した「ct1roi」と「ct2roi Copy」をReference Segment, Compare segmentとしました.

ここで指定したSegment(vtkMRMLSegmentNodeとなるもの)は輪郭のセットを表すので, 治療計画データを開いていれば複数の輪郭が含まれています. そのため, さらにどの輪郭を対象とするか選ぶ必要があります. Reference segment, Compare segmentそれぞれの下にさらに「segment」という選択項目がありますので, そこで対象の輪郭を指定します. 今回データは適当に開いたので, 一番似かよってそうなそれぞれのpatient輪郭を計算対象として選びました.

この計算対象輪郭は何も別なvtkMRMLSegmentNodeである必要もなく, 同じvtkMRMLSegmentNode(例えばct1roi)の中から別な輪郭を選んだり, 同じ輪郭を選んだりすることも出来ます(もちろんその際DICE係数は1となります).

計算対象の輪郭が設定し終えたら, 後は「Compute Housdorff distance」もしくは「Compute Dice metrics」ボタンをクリックするだけです. 計算はしばらくかかります. どちらかを計算すれば, もう片方はすぐに終わります.

結果は, それぞれの表の一番上の値となります. 下の図ではHDは62.1898, Diceは0.893319です.

これらの値の正しさは確認していないので, 使う際には各自で確認してください.

3D Slicer でのPropagation

OS: Ubuntu 20.04, 3DSlicer Version: 4.11.20210226

3D Slicerを用いた輪郭のpropagationのやり方です.

すでにDIRがなされている状態を想定しています. 説明の画像ではPlastimatch によるB-SplineによるDIRを実施し, その結果をB-SplineパラメータとDVFををMRMLで保存した状態からスタートしています. それぞれvtkMRMLBSplineTransformNodeとvtkMRMLGridTransformNodeです. 2つともある必要はなく, どちらかあればpropagationは可能です.

下準備: 変形したい輪郭のコピーを作成

Propagationする際, Transformsモジュールを使用します. そこで輪郭を変形すると上書きになるので予めもとの輪郭をコピーして変形用の輪郭を作っておきます.

まず, Data モジュール(下図の上の赤丸)に切り替えてコピーしたい輪郭を探します. 下図の画像ではct2roiが変形したい輪郭になります.

変形したい輪郭を選び右クリックするとメニューが出ますので, 「Clone」(下図の下の赤丸)を選択してください. それでコピーが出来ます.

右クリックメニューからCloneを選ぶ

確認すると下図で「ct2roi Copy」(下図赤丸)というvtkMRMLSegmentationNodeが出来ています.

下準備は完了ですが, もし上書きしても構わないというのであれば, この下準備は飛ばしても構いません.

「ct2roi Copy」が出来ている

Transformを用いた変形

実際に変形していきます. 輪郭を変形するためにはTransformsモジュールを使用しますのでモジュールをTransformsモジュールに変更してください.

次に, DIRした際に得られたDVFなどを保存したデータ(vtkMRMLTransformNodeの一つ)を「Active Transform」の欄で選択します. DIRした際にMRMLとして変形を保存していればプルダウンメニューに出てくると思います. Affine変換など線形な変換であれば下図の「Edit」のところを展開すれば手入力で作成できます. B-Splineも作れるようですが, ???な感じです.

ここでは, Active TransformにPlastimatchでデフォルトの名前のまま出力したDVF「Output vector field (MRML)」を指定しています.

Informationは変形のサマリー, DisplayはDVFを矢印やグリッドで表示したりできますが, これも関係ないので飛ばします.

輪郭の変形にはTramsformモジュールの「Apply transform」の設定で行います. Transformableのリストは, 現在Sceneにある変形可能なNodeの(データの)一覧です. この中から変形したい輪郭を指定します.

変形対象の指定は「Transformable」のリストで選択し, 右向き矢印で「Transformed」のリストに移します. 今回の場合変形対象がCloneで作成した「ct2roi Copy」ですので, 選択し右のTransformedのリストに移します.

移した時点で輪郭は変形されます. 画像を表示している画面で右矢印と左矢印で対象を行き来せれば変形しているのが解ると思います.

この時点で変形されているのですが, まだ変形後の輪郭は保存されていません. そのおかげで何度もやり直したりできるのですが, 変形後に解析・評価などする場合では見れるだけだと困ります. そこで変形後のデータを保存する方法ですが, 「Harden transform」で変形をFixしてしまいます. つまり, 今変形している輪郭を上書き保存することになります(そのためコピーを作成しました).

Harden transformの方法は, 保存したい対象をTransformedリストでクリックして選択(水色の背景になる)し, TransformableのリストとTransformedの間にある矢印の下, マス目がずれたアイコン(下図 下の赤丸) をクリックするだけです. アイコンをクリックするとTransformedにあるデータを現在の変形された状態に保存します. うまく保存されると選択された変形対象だけがTransformedリストから消え, Transformableのリストに戻ります.

以上が輪郭のpropagationの方法になります. 今回輪郭を対象にしましたが, 変形できるデータであれば(Transformableリストに上がるデータであれば)同様な操作で変形が出来ます.

注意は, hardenしても3DSlicer上で保存されている(データとなっている)だけで, ファイルには保存されていませんので, 途中経過や結果などを保存したい場合は, 3DSlicerでScene全体や変形した輪郭だけでもファイルで保存する必要がありますので忘れずに.

3DSlicerでCTと輪郭の組み合わせは, おそらく他の商用DIRソフトと比べゆるいです. DICOM画像を読み込む際には組み合わせが違うと言われたりする場合もありますが, Sceneに保存されている輪郭はすべてどの画像上にでも表示できます(というか表示されてしまう). それだけCT-輪郭の関係の自由度が高く, やりたいことができる(手間はかかるけど)ことになります.

3D Slicerを用いた画像のDOCIM化

OS: Ubuntu 20.04, 3DSlicer Version: 4.11.20210226

3D Slicerを用いると, (たぶん読み込める画像なら)どのような画像でもDICOM形式に変換できます.

ここでは, DICOM化の方法を記載しておきます.

Fileの読み込み

基本的に何でもいいのですが, JPEGなどであると1スライスの画像とみなされます. 試していませんが, ファイルを開く際にフォルダを指定できるので, フォルダを指定すると3Dデータになるかもしれません.

今回は本当に一般的な画像がDICOM化できることを示すためにJPEGでやってみました.

3DSlicerのメニューの「File」から「Add Data」を選ぶか, メニューの下の一番左のDataアイコンをクリックすると下のウィンドウが出てきます. 今回, JPEGファイル1つなので「Choose File(s) to Add」を選んでファイルを選択しました. 「Choose File(s) to Add」をクリックするとさらにファイル選択のウィンドウが出てきます.

Add Dataのウィンドウ

ファイルを選択し, 開くと下の図のような画面です. ファイルは研究室のロゴマークのファイルにしました. 1枚の2D画像ですので, Sag, Corの画像は線です.

ロゴファイルをオープンしたところ

DICOM化

もう早速DIROM化です. まず下図のように, Modules横のプルダウンを「Data」にしてください. そうすると左パネルに「Subject hierarchy」タブになっていると思います(なっていなければ選択してください).

DICOMーRTなどを開くと輪郭などがツリー状に表示されますが, これまでの手順でファイルを開くと開いたファイルのファイル名が1つだけ表示されていると思います. (しっかりCT画像などと同じvtkMRMLVolumeNodeの1種になっているのがわかります)

次に, ファイル名を選択し右クリックします. 出てきたメニューに「Export to DICOM…」という項目があるので選択します.

そうすると下の警告が出ます.

DICOM化の注意

警告に書いているとおりですが, DICOM(化)には親となる患者情報が必要でOKを選ぶとデフォルトでつくられる. もし自分で作りたければ一度Cancelしてsubject hierarchyのところで, 「Export to DICOM…」を選んだメニューから「Create new subject」を選んで作成してくださいとのことです. Subjectを作った後にsubject hierarchy上でファイル名をドラッグ&ドロップすれば,作成したSubjectの配下に移動できます.

DICOMの情報は次のところで編集ができるのでそのままOKで問題ないと思います.

そのままOKすると下図右のようなウィンドウが出ます. ここでDICOMのヘッダに含めるMeta情報を入力していきます. とりあえずDICOM化したいだけであれば, なにも変更しなくてもDICOM化できます.

ついでに, 下図左のsubject hierarchyのパネルには, 自動にNewPatientとNewStudyが出来てその下にロゴファイルの名前が移動していると思います.

DICOM化したデータをそのまま3DSlicerのDICOMモジュールが管理するようにしたければ(3DSlicerのDICOM画像管理画面で出てくるようにしたければ), 「Export」をクリックしてください. DICOM画像のリストに適当につけられた患者名となってあるのが確認できます.

ファイルとして出力したい場合は, 下図右のウィンドウ下部の「Export to folder」にチェックを入れて, その右に出力先のフォルダを指定してください.

DICOM情報の入力

3DSlicerのDICOM管理に出力した場合, 以降は通常のDICOM画像と同様なので, もしファイルとしてExportしたければDICOMの管理画面で可能となります.

確認

最後にちゃんと出来たか確認ですが, ImageJを使って確認してみました. Exportしたファイルは1枚の画像ですので指定したフォルダには「IMG001.dcm」というファイルが出来ていました. そのファイルをImageJにドラッグ&ドロップすると白黒化されたロゴが表示されました. DICOMですのでグレーレベルの画像になったようです. ちゃんとDICOMかどうか確認するため, Image infoを表示させると, ちゃんとタグとともにタグ情報も表示されました.

さらにちゃんとしているのがUIDがついていること. 正解で一つしかない一意な番号がつけられるUIDをどのように決めているのか少し謎です. とはいえ, ちゃんとDICOM化が出来ました.